diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index fb0e6a78..2c03ff1a 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -2,9 +2,9 @@ name: Rust checks on: push: - branches: [ master ] + branches: [ master, next ] pull_request: - branches: [ master ] + branches: [ master, next ] env: CARGO_TERM_COLOR: always diff --git a/.gitignore b/.gitignore index 22f88f8a..b54cd02c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /build-config.sh /build generated/ +node_modules/ +/.cargo diff --git a/Cargo.lock b/Cargo.lock index 54dadce3..6704c569 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -145,9 +145,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arraydeque" @@ -268,12 +268,11 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "aws-lc-rs" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f95446d919226d587817a7d21379e6eb099b97b45110a7f272a444ca5c54070" +checksum = "f409eb70b561706bf8abba8ca9c112729c481595893fd06a2dd9af8ed8441148" dependencies = [ "aws-lc-sys", - "mirai-annotations", "paste", "untrusted 0.7.1", "zeroize", @@ -281,16 +280,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.21.1" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234314bd569802ec87011d653d6815c6d7b9ffb969e9fee5b8b20ef860e8dce9" +checksum = "923ded50f602b3007e5e63e3f094c479d9c8a9b42d7f4034e4afe456aa48bfd2" dependencies = [ - "bindgen 0.69.4", + "bindgen 0.69.5", "cc", "cmake", "dunce", "fs_extra", - "libc", "paste", ] @@ -315,12 +313,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -350,11 +342,11 @@ checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cexpr", "clang-sys", "itertools 0.10.5", @@ -373,11 +365,11 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.70.1" +version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -386,7 +378,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash 2.1.0", "shlex", "syn 2.0.87", ] @@ -399,9 +391,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "bitvec" @@ -439,15 +431,15 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97ccca1260af6a459d75994ad5acc1651bcabcbdbc41467cc9786519ab854c30" dependencies = [ - "base64 0.22.1", + "base64", "bollard-stubs", "bytes", "futures-core", "futures-util", "hex", - "http 1.2.0", + "http", "http-body-util", - "hyper 1.5.1", + "hyper", "hyper-named-pipe", "hyper-util", "hyperlocal", @@ -458,7 +450,7 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror 2.0.4", + "thiserror 2.0.11", "tokio", "tokio-util", "tower-service", @@ -479,9 +471,9 @@ dependencies = [ [[package]] name = "bon" -version = "3.2.0" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9276fe602371cd8a7f70fe68c4db55b2d3e92c570627d6ed0427646edfa5cf47" +checksum = "fe7acc34ff59877422326db7d6f2d845a582b16396b6b08194942bf34c6528ab" dependencies = [ "bon-macros", "rustversion", @@ -489,9 +481,9 @@ dependencies = [ [[package]] name = "bon-macros" -version = "3.2.0" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94828b84b32b4f3ac3865f692fcdbc46c7d0dd87b29658a391d58a244e1ce45a" +checksum = "4159dd617a7fbc9be6a692fe69dc2954f8e6bb6bb5e4d7578467441390d77fd0" dependencies = [ "darling", "ident_case", @@ -545,9 +537,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.2.2" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" dependencies = [ "jobserver", "libc", @@ -569,6 +561,19 @@ dependencies = [ "sha2", ] +[[package]] +name = "cert-client" +version = "0.3.4" +dependencies = [ + "anyhow", + "dstack-types", + "kms-rpc", + "ra-rpc", + "ra-tls", + "serde_json", + "tdx-attest", +] + [[package]] name = "certbot" version = "0.3.4" @@ -582,7 +587,7 @@ dependencies = [ "path-absolutize", "rand 0.8.5", "rcgen", - "reqwest 0.12.9", + "reqwest", "serde", "serde_json", "time", @@ -601,7 +606,7 @@ dependencies = [ "clap", "documented", "fs-err", - "rustls 0.23.19", + "rustls", "serde", "tokio", "toml_edit", @@ -641,9 +646,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -677,9 +682,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.22" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -687,9 +692,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.22" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -699,9 +704,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -711,9 +716,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cmake" @@ -876,7 +881,7 @@ dependencies = [ "hex_fmt", "ra-rpc", "regex", - "reqwest 0.12.9", + "reqwest", "serde", "serde_json", "tokio", @@ -990,13 +995,13 @@ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "dcap-qvl" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e024d399632fb2e97a9501e79779ae9f150118a17ad06333de3bbd42834b84" +checksum = "5830a40687e8d41ae3ab39aa06c41951b1994e2016b0dc2f6a51f344fe3bb83f" dependencies = [ "anyhow", "asn1_der", - "base64 0.21.7", + "base64", "byteorder", "chrono", "const-oid", @@ -1006,12 +1011,12 @@ dependencies = [ "log", "parity-scale-codec", "pem", - "reqwest 0.11.27", + "reqwest", "ring", - "rustls-webpki 0.102.8", + "rustls-webpki", "scale-info", "serde", - "serde_bytes", + "serde-human-bytes", "serde_json", "tracing", "urlencoding", @@ -1083,17 +1088,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "derive_more" version = "1.0.0" @@ -1142,7 +1136,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "proc-macro2", "proc-macro2-diagnostics", "quote", @@ -1163,23 +1157,23 @@ dependencies = [ [[package]] name = "dirs" -version = "5.0.1" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -1230,6 +1224,14 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "dstack-types" +version = "0.3.4" +dependencies = [ + "serde", + "serde-human-bytes", +] + [[package]] name = "dunce" version = "1.0.5" @@ -1246,10 +1248,19 @@ dependencies = [ "digest", "elliptic-curve", "rfc6979", - "signature", + "signature 2.2.0", "spki", ] +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + [[package]] name = "either" version = "1.13.0" @@ -1315,6 +1326,12 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "env_home" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" + [[package]] name = "env_logger" version = "0.10.2" @@ -1665,32 +1682,13 @@ version = "0.3.4" dependencies = [ "anyhow", "http-client", - "prost 0.13.3", + "prost 0.13.4", "prpc", "prpc-build", "serde", "serde_json", ] -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.5.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "h2" version = "0.4.6" @@ -1702,7 +1700,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.2.0", + "http", "indexmap 2.5.0", "slab", "tokio", @@ -1719,7 +1717,7 @@ dependencies = [ "bytes", "fastrand", "futures-util", - "http 1.2.0", + "http", "pin-project-lite", "tokio", ] @@ -1826,9 +1824,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" dependencies = [ "cfg-if", "futures-util", @@ -1878,7 +1876,7 @@ version = "0.3.4" dependencies = [ "anyhow", "http-client", - "prost 0.13.3", + "prost 0.13.4", "prpc", "prpc-build", "serde", @@ -1896,17 +1894,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.2.0" @@ -1918,17 +1905,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -1936,7 +1912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http", ] [[package]] @@ -1947,8 +1923,8 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -1958,7 +1934,7 @@ version = "0.3.4" dependencies = [ "anyhow", "http-body-util", - "hyper 1.5.1", + "hyper", "hyper-util", "hyperlocal", "log", @@ -1999,40 +1975,16 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.6", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -2049,7 +2001,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ "hex", - "hyper 1.5.1", + "hyper", "hyper-util", "pin-project-lite", "tokio", @@ -2057,20 +2009,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.30", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.3" @@ -2078,16 +2016,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.2.0", - "hyper 1.5.1", + "http", + "hyper", "hyper-util", - "rustls 0.23.19", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tower-service", - "webpki-roots 0.26.6", + "webpki-roots", ] [[package]] @@ -2099,9 +2037,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "hyper 1.5.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -2117,7 +2055,7 @@ checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" dependencies = [ "hex", "http-body-util", - "hyper 1.5.1", + "hyper", "hyper-util", "pin-project-lite", "tokio", @@ -2214,11 +2152,11 @@ checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] name = "inotify" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.8.0", "inotify-sys", "libc", ] @@ -2243,25 +2181,16 @@ dependencies = [ [[package]] name = "insta" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" +checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5" dependencies = [ "console", - "lazy_static", "linked-hash-map", + "once_cell", "similar", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "instant-acme" version = "0.7.2" @@ -2269,13 +2198,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37221e690dcc5d0ea7c1f70decda6ae3495e72e8af06bca15e982193ffdf4fc4" dependencies = [ "async-trait", - "base64 0.22.1", + "base64", "bytes", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.5.1", - "hyper-rustls 0.27.3", + "hyper", + "hyper-rustls", "hyper-util", "ring", "rustls-pki-types", @@ -2386,6 +2315,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature 2.2.0", +] + [[package]] name = "keccak" version = "0.1.5" @@ -2395,6 +2338,17 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "key-provider-client" +version = "0.3.4" +dependencies = [ + "anyhow", + "serde", + "serde_json", + "sodiumoxide", + "tokio", +] + [[package]] name = "kms" version = "0.3.4" @@ -2406,15 +2360,28 @@ dependencies = [ "git-version", "hex", "hex_fmt", + "http-client", + "k256", "kms-rpc", "load_config", + "parity-scale-codec", "ra-rpc", "ra-tls", + "rand 0.8.5", + "reqwest", + "ring", "rocket", + "safe-write", "serde", + "serde-human-bytes", + "serde_json", + "sha2", + "sha3", + "tappd-rpc", "tracing", "tracing-subscriber", "x25519-dalek", + "x509-parser", "yasna", ] @@ -2425,7 +2392,7 @@ dependencies = [ "anyhow", "fs-err", "parity-scale-codec", - "prost 0.13.3", + "prost 0.13.4", "prpc", "prpc-build", "serde", @@ -2466,9 +2433,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.167" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -2492,11 +2459,23 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", "redox_syscall", ] +[[package]] +name = "libsodium-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b779387cd56adfbc02ea4a668e704f729be8d6a6abd2c27ca5ee537849a92fd" +dependencies = [ + "cc", + "libc", + "pkg-config", + "walkdir", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2531,9 +2510,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "loom" @@ -2651,12 +2630,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - [[package]] name = "multer" version = "3.1.0" @@ -2666,7 +2639,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.2.0", + "http", "httparse", "log", "memchr", @@ -2746,7 +2719,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "cfg_aliases", "libc", @@ -2765,11 +2738,11 @@ dependencies = [ [[package]] name = "notify" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" +checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "filetime", "fsevent-sys", "inotify", @@ -2779,17 +2752,14 @@ dependencies = [ "mio", "notify-types", "walkdir", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "notify-types" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7393c226621f817964ffb3dc5704f9509e107a8b024b489cc2c1b217378785df" -dependencies = [ - "instant", -] +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" [[package]] name = "ntapi" @@ -2906,9 +2876,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3092,7 +3062,7 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.22.1", + "base64", "serde", ] @@ -3165,18 +3135,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", @@ -3205,6 +3175,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + [[package]] name = "polyval" version = "0.6.2" @@ -3340,12 +3316,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", - "prost-derive 0.13.3", + "prost-derive 0.13.4", ] [[package]] @@ -3382,7 +3358,7 @@ dependencies = [ "once_cell", "petgraph", "prettyplease", - "prost 0.13.3", + "prost 0.13.4", "prost-types 0.13.3", "regex", "syn 2.0.87", @@ -3404,9 +3380,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", "itertools 0.13.0", @@ -3431,22 +3407,22 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" dependencies = [ - "prost 0.13.3", + "prost 0.13.4", ] [[package]] name = "prpc" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36dbacc22fa64d2059cc8df1e929ab9100804ae2011548b6679f923c1172f42" +checksum = "dd65145222d0e76bf84c71bb0e9abcf45779d032fb0933fe1cceeb11be1f06a9" dependencies = [ "anyhow", "async-trait", - "derive_more 1.0.0", + "derive_more", "hex", "hex_fmt", "parity-scale-codec", - "prost 0.13.3", + "prost 0.13.4", "prpc-serde-bytes", "serde", "serde_json", @@ -3455,9 +3431,9 @@ dependencies = [ [[package]] name = "prpc-build" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5034baf630735948c9df3cd637f77c2897413934ba1f201068d168080ab4e510" +checksum = "dcf8a68f9ec5419c398b5a185153a7faad95b1f425fad161da6e8212ef87aa4e" dependencies = [ "either", "fs-err", @@ -3466,7 +3442,7 @@ dependencies = [ "log", "multimap 0.10.0", "proc-macro2", - "prost 0.13.3", + "prost 0.13.4", "prost-build 0.13.3", "prost-build 0.9.0", "prost-types 0.13.3", @@ -3501,8 +3477,8 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", - "rustls 0.23.19", + "rustc-hash 2.1.0", + "rustls", "socket2", "thiserror 1.0.65", "tokio", @@ -3518,8 +3494,8 @@ dependencies = [ "bytes", "rand 0.8.5", "ring", - "rustc-hash 2.0.0", - "rustls 0.23.19", + "rustc-hash 2.1.0", + "rustls", "slab", "thiserror 1.0.65", "tinyvec", @@ -3557,12 +3533,13 @@ dependencies = [ "bon", "prpc", "ra-tls", - "reqwest 0.12.9", + "reqwest", "rocket", "rocket-vsock-listener", "serde", "serde_json", "tracing", + "x509-parser", ] [[package]] @@ -3578,13 +3555,16 @@ dependencies = [ "hex", "hkdf", "p256", + "parity-scale-codec", "rcgen", "ring", "rustls-pki-types", "serde", + "serde-human-bytes", "serde_json", "sha2", "sha3", + "tdx-attest", "tracing", "x509-parser", "yasna", @@ -3689,9 +3669,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" dependencies = [ "pem", "ring", @@ -3707,18 +3687,18 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] name = "redox_users" -version = "0.4.6" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 1.0.65", + "thiserror 2.0.11", ] [[package]] @@ -3793,63 +3773,22 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "hickory-resolver", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "hickory-resolver", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.5.1", - "hyper-rustls 0.27.3", + "hyper", + "hyper-rustls", "hyper-util", "ipnet", "js-sys", @@ -3859,21 +3798,22 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.19", - "rustls-pemfile 2.1.3", + "rustls", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", + "tower", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.6", + "webpki-roots", "windows-registry", ] @@ -3937,7 +3877,7 @@ dependencies = [ "proc-macro2", "quote", "rinja_parser", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde", "syn 2.0.87", ] @@ -3966,8 +3906,8 @@ dependencies = [ "either", "figment", "futures", - "http 1.2.0", - "hyper 1.5.1", + "http", + "hyper", "hyper-util", "indexmap 2.5.0", "libc", @@ -3981,8 +3921,8 @@ dependencies = [ "ref-swap", "rocket_codegen", "rocket_http", - "rustls 0.23.19", - "rustls-pemfile 2.1.3", + "rustls", + "rustls-pemfile", "s2n-quic-h3", "serde", "serde_json", @@ -3992,7 +3932,7 @@ dependencies = [ "time", "tinyvec", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tokio-stream", "tokio-util", "tracing", @@ -4016,11 +3956,11 @@ name = "rocket-vsock-listener" version = "0.3.4" dependencies = [ "anyhow", - "derive_more 1.0.0", + "derive_more", "pin-project", "rocket", "serde", - "thiserror 2.0.4", + "thiserror 2.0.11", "tokio", "tokio-vsock", ] @@ -4075,9 +4015,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_version" @@ -4103,7 +4043,7 @@ version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys", @@ -4112,28 +4052,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.12" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki", "subtle", "zeroize", ] @@ -4145,46 +4073,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.3", + "rustls-pemfile", "rustls-pki-types", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ - "base64 0.22.1", + "base64", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted 0.9.0", -] +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" [[package]] name = "rustls-webpki" @@ -4344,8 +4253,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c973d29e9b6669473f205b47d015480d7e79b103dfbd1c789184d9adc31af05" dependencies = [ "bytes", - "rustls 0.23.19", - "rustls-pemfile 2.1.3", + "rustls", + "rustls-pemfile", "s2n-codec 0.46.0", "s2n-quic-core 0.46.0", "s2n-quic-crypto", @@ -4389,27 +4298,27 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.3" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "bitvec", "cfg-if", - "derive_more 0.99.18", + "derive_more", "parity-scale-codec", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.3" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] @@ -4452,16 +4361,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - [[package]] name = "sd-notify" version = "0.4.3" @@ -4488,7 +4387,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation", "core-foundation-sys", "libc", @@ -4513,9 +4412,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -4541,9 +4440,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -4552,9 +4451,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "indexmap 2.5.0", "itoa", @@ -4612,7 +4511,7 @@ version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" dependencies = [ - "base64 0.22.1", + "base64", "chrono", "hex", "indexmap 1.9.3", @@ -4689,6 +4588,12 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + [[package]] name = "signature" version = "2.2.0" @@ -4742,6 +4647,18 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "sodiumoxide" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e26be3acb6c2d9a7aac28482586a7856436af4cfe7100031d219de2d2ecb0028" +dependencies = [ + "ed25519", + "libc", + "libsodium-sys", + "serde", +] + [[package]] name = "spin" version = "0.9.8" @@ -4778,9 +4695,9 @@ dependencies = [ [[package]] name = "strip-ansi-escapes" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff8ef943b384c414f54aefa961dd2bd853add74ec75e7ac74cf91dba62bcfa" +checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" dependencies = [ "vte", ] @@ -4848,10 +4765,10 @@ dependencies = [ "clap", "fs-err", "futures", - "http 1.2.0", + "http", "http-body-util", "http-client", - "hyper 1.5.1", + "hyper", "hyper-util", "hyperlocal", "log", @@ -4884,12 +4801,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.1" @@ -4912,9 +4823,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.33.0" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "948512566b1895f93b1592c7574baeb2de842f224f2aab158799ecadb8ebbb46" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" dependencies = [ "core-foundation-sys", "libc", @@ -4966,23 +4877,27 @@ name = "tappd" version = "0.3.4" dependencies = [ "anyhow", - "base64 0.22.1", + "base64", "bollard", + "cert-client", "chrono", "clap", "cmd_lib", "default-net", + "dstack-types", "figment", "fs-err", "git-version", "guest-api", "hex", "host-api", + "k256", "load_config", "ra-rpc", "ra-tls", "rcgen", - "reqwest 0.12.9", + "reqwest", + "ring", "rinja", "rocket", "rocket-vsock-listener", @@ -4990,6 +4905,8 @@ dependencies = [ "serde", "serde_json", "sha2", + "sha3", + "strip-ansi-escapes", "sysinfo", "tappd-rpc", "tdx-attest", @@ -5004,7 +4921,7 @@ version = "0.3.4" dependencies = [ "anyhow", "parity-scale-codec", - "prost 0.13.3", + "prost 0.13.4", "prpc", "prpc-build", "serde", @@ -5027,14 +4944,14 @@ dependencies = [ "serde_json", "sha2", "tdx-attest-sys", - "thiserror 2.0.4", + "thiserror 2.0.11", ] [[package]] name = "tdx-attest-sys" version = "0.3.4" dependencies = [ - "bindgen 0.70.1", + "bindgen 0.71.1", "cc", ] @@ -5045,14 +4962,19 @@ dependencies = [ "aes-gcm", "anyhow", "bollard", + "cert-client", "clap", "cmd_lib", "curve25519-dalek", + "dcap-qvl", + "dstack-types", "fs-err", "getrandom 0.2.15", "hex", "hex_fmt", "host-api", + "k256", + "key-provider-client", "kms-rpc", "parity-scale-codec", "ra-rpc", @@ -5065,6 +4987,7 @@ dependencies = [ "serde_json", "serde_yaml2", "sha2", + "sha3", "tdx-attest", "tokio", "toml", @@ -5072,6 +4995,7 @@ dependencies = [ "tracing", "tracing-subscriber", "x25519-dalek", + "x509-parser", ] [[package]] @@ -5082,12 +5006,14 @@ dependencies = [ "bon", "clap", "dirs", + "dstack-types", "fs-err", "git-version", "guest-api", "hex", "host-api", "humantime", + "key-provider-client", "kms-rpc", "load_config", "path-absolutize", @@ -5108,7 +5034,7 @@ dependencies = [ "tracing", "tracing-subscriber", "uuid", - "which 7.0.0", + "which 7.0.1", ] [[package]] @@ -5117,7 +5043,7 @@ version = "0.3.4" dependencies = [ "anyhow", "parity-scale-codec", - "prost 0.13.3", + "prost 0.13.4", "prpc", "prpc-build", "serde", @@ -5126,12 +5052,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.2.15", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5179,11 +5106,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.4" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.4", + "thiserror-impl 2.0.11", ] [[package]] @@ -5199,9 +5126,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.4" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", @@ -5266,9 +5193,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -5284,9 +5211,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -5295,22 +5222,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.21.12", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.19", - "rustls-pki-types", + "rustls", "tokio", ] @@ -5340,8 +5256,9 @@ dependencies = [ [[package]] name = "tokio-vsock" -version = "0.6.0" -source = "git+https://github.com/kvinwang/tokio-vsock?branch=shared-self-accept#dd9778742ceb98ee39d68ad527b8d80f3178c172" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074885a713a0e1e8f2cc6855a004c7c882572d980d4f8262523dc2b094c96da8" dependencies = [ "bytes", "futures", @@ -5384,6 +5301,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -5406,22 +5344,25 @@ dependencies = [ "hickory-resolver", "insta", "ipnet", + "kms-rpc", "load_config", "nix", "parcelona", "pin-project", "ra-rpc", + "ra-tls", "rand 0.8.5", "rinja", "rocket", - "rustls 0.23.19", + "rustls", "safe-write", "serde", "serde_json", "shared_child", "smallvec", + "tappd-rpc", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tproxy-rpc", "tracing", "tracing-subscriber", @@ -5433,7 +5374,7 @@ version = "0.3.4" dependencies = [ "anyhow", "parity-scale-codec", - "prost 0.13.3", + "prost 0.13.4", "prpc", "prpc-build", "serde", @@ -5622,9 +5563,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" dependencies = [ "getrandom 0.2.15", ] @@ -5653,22 +5594,11 @@ dependencies = [ [[package]] name = "vte" -version = "0.11.1" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" +checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" dependencies = [ - "utf8parse", - "vte_generate_state_changes", -] - -[[package]] -name = "vte_generate_state_changes" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" -dependencies = [ - "proc-macro2", - "quote", + "memchr", ] [[package]] @@ -5779,12 +5709,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "webpki-roots" version = "0.26.6" @@ -5808,12 +5732,12 @@ dependencies = [ [[package]] name = "which" -version = "7.0.0" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cad3279ade7346b96e38731a641d7343dd6a53d55083dd54eadfa5a1b38c6b" +checksum = "fb4a9e33648339dc1642b0e36e21b3385e6148e289226f657c809dee59df5028" dependencies = [ "either", - "home", + "env_home", "rustix", "winsafe", ] diff --git a/Cargo.toml b/Cargo.toml index 7125e0c2..43c32d47 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,9 @@ members = [ "host-api", "guest-api", "load_config", + "key-provider-client", + "dstack-types", + "cert-client", ] resolver = "2" @@ -54,19 +57,22 @@ host-api = { path = "host-api", default-features = false } guest-api = { path = "guest-api", default-features = false } http-client = { path = "http-client", default-features = false } load_config = { path = "load_config" } +key-provider-client = { path = "key-provider-client" } +dstack-types = { path = "dstack-types" } +cert-client = { path = "cert-client" } # Core dependencies -anyhow = "1.0.94" -chrono = "0.4.38" -clap = { version = "4.5.22", features = ["derive", "string"] } +anyhow = "1.0.95" +chrono = "0.4.39" +clap = { version = "4.5.26", features = ["derive", "string"] } dashmap = "6.1.0" fs-err = "3.0.0" path-absolutize = "3.1.1" futures = "0.3.31" git-version = "0.3.9" libc = "0.2.167" -log = "0.4.22" -notify = "7.0.0" +log = "0.4.25" +notify = "8.0.0" rand = "0.8.5" tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } @@ -75,15 +81,15 @@ nix = "0.29.0" sd-notify = "0.4.3" # Serialization/Parsing -bon = "3.2.0" +bon = "3.3.2" base64 = "0.22.1" hex = "0.4.3" hex_fmt = "0.3.0" -prost = "0.13.3" +prost = "0.13.4" scale = { version = "3.6.12", package = "parity-scale-codec", features = ["derive"] } -serde = { version = "1.0.210", features = ["derive"] } +serde = { version = "1.0.217", features = ["derive"] } serde-human-bytes = "0.1.0" -serde_json = "1.0" +serde_json = "1.0.135" toml = "0.8.19" toml_edit = { version = "0.22.22", features = ["serde"] } yasna = "0.5.2" @@ -94,73 +100,72 @@ figment = "0.10.19" bollard = "0.18.1" http = "1.2.0" http-body-util = "0.1.2" -hyper = { version = "1.5.1", features = ["client", "http1"] } +hyper = { version = "1.5.2", features = ["client", "http1"] } hyper-util = { version = "0.1.10", features = ["client", "client-legacy", "http1"] } hyperlocal = "0.9.1" ipnet = { version = "2.10.1", features = ["serde"] } -reqwest = { version = "0.12.9", default-features = false, features = ["json", "rustls-tls", "charset", "hickory-dns"] } +reqwest = { version = "0.12.12", default-features = false, features = ["json", "rustls-tls", "charset", "hickory-dns"] } rocket = { git = "https://github.com/rwf2/Rocket", branch = "master", features = ["mtls"] } rocket-apitoken = { git = "https://github.com/kvinwang/rocket-apitoken", branch = "dev" } -tokio = { version = "1.42.0" } -tokio-vsock = "0.6.0" -sysinfo = "0.33.0" +tokio = { version = "1.43.0" } +tokio-vsock = "0.7.0" +sysinfo = "0.33.1" default-net = "0.22.0" # Cryptography/Security aes-gcm = "0.10.3" curve25519-dalek = "4.1.3" -dcap-qvl = "0.1.6" +dcap-qvl = "0.2.1" elliptic-curve = { version = "0.13.8", features = ["pkcs8"] } getrandom = "0.2.15" hkdf = "0.12.4" p256 = "0.13.2" ring = "0.17.8" -rustls = "0.23.19" -rustls-pki-types = "1.8.0" +rustls = "0.23.21" +rustls-pki-types = "1.10.1" schnorrkel = "0.11.4" sha2 = "0.10.8" sha3 = "0.10.8" blake2 = "0.10.6" -tokio-rustls = { version = "0.26.0", features = ["ring"] } +tokio-rustls = { version = "0.26.1", features = ["ring"] } x25519-dalek = { version = "2.0.1", features = ["static_secrets"] } +sodiumoxide = "0.2.7" +k256 = "0.13.4" # Certificate/DNS -hickory-resolver = "0.24.1" +hickory-resolver = "0.24.2" instant-acme = "0.7.2" -rcgen = { version = "0.13.1", features = ["pem"] } +rcgen = { version = "0.13.2", features = ["pem"] } x509-parser = "0.16.0" # RPC/Protocol -prpc = "0.5.0" -prpc-build = "0.5.1" +prpc = "0.6.0" +prpc-build = "0.6.0" # Development/Testing -bindgen = "0.70.1" -cc = "1.2.2" +bindgen = "0.71.1" +cc = "1.2.9" documented = "0.9.1" enum_dispatch = "0.3.13" -insta = "1.41.1" +insta = "1.42.0" num_enum = "0.7.3" -thiserror = "2.0.4" +thiserror = "2.0.11" derive_more = "1.0.0" -tempfile = "3.14.0" +tempfile = "3.15.0" # Utilities -dirs = "5.0.1" +dirs = "6.0.0" humantime = "2.1.0" parcelona = "0.4.3" -pin-project = "1.1.7" +pin-project = "1.1.8" regex = "1.11.1" rinja = "0.3.5" shared_child = "1.0.1" -strip-ansi-escapes = "0.2.0" +strip-ansi-escapes = "0.2.1" tailf = "0.1.2" time = "0.3.37" -uuid = { version = "1.11.0", features = ["v4"] } -which = "7.0.0" +uuid = { version = "1.12.0", features = ["v4"] } +which = "7.0.1" smallvec = "1.13.2" cmd_lib = "1.9.5" serde_yaml2 = "0.1.2" - -[patch.crates-io] -tokio-vsock = { git = "https://github.com/kvinwang/tokio-vsock", branch = "shared-self-accept" } diff --git a/attestation.md b/attestation.md new file mode 100644 index 00000000..81445576 --- /dev/null +++ b/attestation.md @@ -0,0 +1,70 @@ +# TEE Attestation Guide for DStack Applications + +This document outlines the process of verifying the authenticity and integrity of data produced by DStack Applications running within Intel TDX environments. + +## 1. Review code safety + +- Review the Application code to ensure its logic is correct. +- Review the App Compose file to confirm it uses the specified source code or its compiled outputs. +- Review the runtime environment codebase, including virtual firmware, linux kernel, initrd, and rootfs. Verify the correctness of each component. + +## 2. Validate data origin authenticity +### 2.1 Understanding tdx quote measurements + +Applications generate a tdx quote using Dstack's API given the data they want to prove. + +The quote signature can be verified using dcap-qvl to confirm its generation by a legitimate TDX CVM and environment trustworthiness. +Following signature verification, examine MRTD and RTMRs to confirm the CVM is executing the verified code. + +The MR register values indicate the following: + +- MRTD: Contains the virtual firmware measurement, taken by TDX-module in SEAM mode. Virtual firmware (OVMF in Dstack's case) is the first code executed post-CVM startup, serving as the App code's trust anchor. Intel signs and guarantees TDX-module integrity. + +- RTMR: Measurements recorded by code executing within the CVM. In Dstack OS, these measurements are defined as: + + - RTMR0: OVMF records CVM's virtual hardware setup, including CPU count, memory size, and device configuration. While Dstack uses fixed devices, CPU and memory specifications can vary. RTMR0 can be computed from these specifications. + - RTMR1: OVMF records the Linux kernel measurement. + - RTMR2: Linux kernel records kernel cmdline (including rootfs hash) and initrd measurements. + - RTMR3: initrd records Dstack App details, including compose hash, instance id, app id, rootfs hash, and key provider. + +MRTD, RTMR0, RTMR1, and RTMR2 can be pre-calculated from the built image (given CPU+RAM specifications). Compare these with the verified quote's MRs to confirm correct base image code execution. + +RTMR3 differs as it contains runtime information like compose hash and instance id. Verify this by replaying the event log - if the calculated RTMR3 matches the quote's RTMR3, the event log information is valid. Then verify the compose hash, key provider, and other event log details match expectations. + +### 2.2. Determining expected MRs +MRTD, RTMR0, RTMR1, and RTMR2 correspond to the image. Dstack OS builds all related software from source. +Build version v0.4.0 using these commands: +```bash +git clone https://github.com/Dstack-TEE/meta-dstack.git +cd meta-dstack/ +git checkout 15189bcb5397083b5c650a438243ce3f29e705f4 +git submodule update --init --recursive +cd repro-build && ./repro-build.sh -n +``` + +The resulting dstack-v0.4.0.tar.gz contains: + +- ovmf.fd: virtual firmware +- bzImage: kernel image +- initramfs.cpio.gz: initrd +- rootfs.cpio: root filesystem +- metadata.json: image metadata, including kernel boot cmdline + +Calculate image MRs using [dstack-mr](https://github.com/kvinwang/dstack-mr): +```bash +dstack-mr -cpu 4 -ram 4096 -metadata dstack-v0.4.0/metadata.json +``` + +Once these verification steps are completed successfully, the report_data contained in the verified quote can be considered authentic and trustworthy. + +## Conclusion + +To verify Dstack App data trustworthiness: + +- Review source code for correctness and safety. +- Build image from source. +- Calculate MRTD, RTMR0, RTMR1, and RTMR2 values using [dstack-mr](https://github.com/kvinwang/dstack-mr). +- Verify quote measurements: + - Confirm MRTD, RTMR0, RTMR1, and RTMR2 match pre-calculated values. + - Verify RTMR3 matches the event log replay result. + - Confirm event log details (compose hash, instance id, app id, rootfs hash, key provider) match expectations. diff --git a/basefiles/app-compose.service b/basefiles/app-compose.service index 5a14bb2f..2194aa99 100644 --- a/basefiles/app-compose.service +++ b/basefiles/app-compose.service @@ -1,7 +1,7 @@ [Unit] Description=App Compose Service Wants=docker.service -After=docker.service tboot.service +After=docker.service tboot.service tappd.service [Service] Type=oneshot diff --git a/basefiles/tappd.service b/basefiles/tappd.service index 1027992e..8145acc5 100644 --- a/basefiles/tappd.service +++ b/basefiles/tappd.service @@ -4,13 +4,16 @@ After=network.target tboot.service [Service] OOMScoreAdjust=-1000 -ExecStartPre=-/bin/rm -f /var/run/tappd.sock -ExecStart=/bin/tappd --watchdog +ExecStartPre=-/bin/rm -rf /var/run/tappd.sock +ExecStart=/bin/tappd --watchdog -c /tapp/tappd.json Restart=always User=root Group=root Type=notify WatchdogSec=30s +StandardOutput=journal+console +StandardError=journal+console +Environment=RUST_LOG=warn [Install] WantedBy=multi-user.target diff --git a/cert-client/Cargo.toml b/cert-client/Cargo.toml new file mode 100644 index 00000000..d83dab06 --- /dev/null +++ b/cert-client/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "cert-client" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +dstack-types.workspace = true +kms-rpc.workspace = true +ra-rpc = { workspace = true, features = ["client"] } +ra-tls.workspace = true +serde_json.workspace = true +tdx-attest.workspace = true diff --git a/cert-client/src/lib.rs b/cert-client/src/lib.rs new file mode 100644 index 00000000..bbd50507 --- /dev/null +++ b/cert-client/src/lib.rs @@ -0,0 +1,101 @@ +use anyhow::{Context, Result}; +use dstack_types::{AppKeys, KeyProvider}; +use kms_rpc::{kms_client::KmsClient, SignCertRequest}; +use ra_rpc::client::{RaClient, RaClientConfig}; +use ra_tls::{ + attestation::QuoteContentType, + cert::{generate_ra_cert, CaCert, CertConfig, CertSigningRequest}, + rcgen::KeyPair, +}; +use tdx_attest::{eventlog::read_event_logs, get_quote}; + +pub enum CertRequestClient { + Local { ca: CaCert }, + Kms { client: KmsClient }, +} + +impl CertRequestClient { + pub async fn sign_csr( + &self, + csr: &CertSigningRequest, + signature: &[u8], + ) -> Result> { + match self { + CertRequestClient::Local { ca } => { + let cert = ca + .sign_csr(csr, None, "app:custom") + .context("Failed to sign certificate")?; + Ok(vec![cert.pem(), ca.pem_cert.clone()]) + } + CertRequestClient::Kms { client } => { + let response = client + .sign_cert(SignCertRequest { + csr: csr.to_vec(), + signature: signature.to_vec(), + }) + .await?; + Ok(response.certificate_chain) + } + } + } + + pub async fn get_root_ca(&self) -> Result { + match self { + CertRequestClient::Local { ca } => Ok(ca.pem_cert.clone()), + CertRequestClient::Kms { client } => Ok(client.get_meta().await?.ca_cert), + } + } + + pub async fn create(keys: &AppKeys, pccs_url: Option<&str>) -> Result { + match &keys.key_provider { + KeyProvider::Local { key } => { + let ca = CaCert::new(keys.ca_cert.clone(), key.clone()) + .context("Failed to create CA")?; + Ok(CertRequestClient::Local { ca }) + } + KeyProvider::Kms { url } => { + let tmp_client = + RaClient::new(url.into(), true).context("Failed to create RA client")?; + let tmp_client = KmsClient::new(tmp_client); + let tmp_ca = tmp_client + .get_temp_ca_cert() + .await + .context("Failed to get temp CA cert")?; + let client_cert = generate_ra_cert(tmp_ca.temp_ca_cert, tmp_ca.temp_ca_key) + .context("Failed to generate RA cert")?; + let ra_client = RaClientConfig::builder() + .remote_uri(url.clone()) + .tls_client_cert(client_cert.cert_pem) + .tls_client_key(client_cert.key_pem) + .tls_ca_cert(keys.ca_cert.clone()) + .tls_built_in_root_certs(false) + .maybe_pccs_url(pccs_url.map(|s| s.to_string())) + .build() + .into_client() + .context("Failed to create RA client")?; + let client = KmsClient::new(ra_client); + Ok(CertRequestClient::Kms { client }) + } + } + } + + pub async fn request_cert(&self, key: &KeyPair, config: CertConfig) -> Result> { + let pubkey = key.public_key_der(); + let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey); + let (_, quote) = get_quote(&report_data, None).context("Failed to get quote")?; + let event_log = read_event_logs().context("Failed to decode event log")?; + let event_log = serde_json::to_vec(&event_log).context("Failed to serialize event log")?; + + let csr = CertSigningRequest { + confirm: "please sign cert:".to_string(), + pubkey, + config, + quote, + event_log, + }; + let signature = csr.signed_by(key).context("Failed to sign the CSR")?; + self.sign_csr(&csr, &signature) + .await + .context("Failed to sign the CSR") + } +} diff --git a/certgen/src/main.rs b/certgen/src/main.rs index 192b57b3..17aad907 100644 --- a/certgen/src/main.rs +++ b/certgen/src/main.rs @@ -31,19 +31,19 @@ enum Commands { domain: String, /// CA key file - #[arg(short, long)] + #[arg(long)] ca_key: String, /// CA cert file - #[arg(short, long)] + #[arg(long)] ca_cert: String, /// Output cert file - #[arg(short, long)] + #[arg(long)] cert: String, /// Output key file - #[arg(short, long)] + #[arg(long)] key: String, }, } @@ -153,17 +153,19 @@ fn sign_certificate( ) -> anyhow::Result<()> { let ca_key = fs::read_to_string(ca_key_path)?; let ca_cert = fs::read_to_string(ca_cert_path)?; - let ca = CaCert::new(ca_cert, ca_key)?; + let ca = CaCert::new(ca_cert.clone(), ca_key)?; let key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; - let cert = CertRequest::builder() + let alt_names = [domain.to_string()]; + let req = CertRequest::builder() .subject(domain) - .alt_names(&[domain.to_string()]) + .alt_names(&alt_names) .key(&key) - .build() - .signed_by(&ca.cert, &ca.key)?; + .build(); + let cert = ca.sign(req)?; - fs::write(cert_path, cert.pem())?; + let cert_chain = format!("{}\n{}", cert.pem(), ca_cert); + fs::write(cert_path, cert_chain)?; fs::write(key_path, key.serialize_pem())?; Ok(()) } diff --git a/ct_monitor/src/main.rs b/ct_monitor/src/main.rs index 2762c92c..9d646875 100644 --- a/ct_monitor/src/main.rs +++ b/ct_monitor/src/main.rs @@ -47,7 +47,7 @@ impl Monitor { info!("fetching known public keys from {}", self.tproxy_uri); let todo = "Use RA-TLS"; let tls_no_check = true; - let rpc = TproxyClient::new(RaClient::new(self.tproxy_uri.clone(), tls_no_check)); + let rpc = TproxyClient::new(RaClient::new(self.tproxy_uri.clone(), tls_no_check)?); let info = rpc.acme_info().await?; self.known_keys = info.hist_keys.into_iter().collect(); info!("got {} known public keys", self.known_keys.len()); diff --git a/dstack-types/Cargo.toml b/dstack-types/Cargo.toml new file mode 100644 index 00000000..bb1a4aeb --- /dev/null +++ b/dstack-types/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "dstack-types" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +serde = { workspace = true, features = ["derive"] } +serde-human-bytes.workspace = true diff --git a/dstack-types/src/lib.rs b/dstack-types/src/lib.rs new file mode 100644 index 00000000..ac5c7068 --- /dev/null +++ b/dstack-types/src/lib.rs @@ -0,0 +1,123 @@ +use serde::{Deserialize, Serialize}; +use serde_human_bytes as hex_bytes; + +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct AppCompose { + pub manifest_version: u32, + pub name: String, + // Deprecated + #[serde(default)] + pub features: Vec, + pub runner: String, + #[serde(default)] + pub docker_compose_file: Option, + #[serde(default)] + pub docker_config: DockerConfig, + #[serde(default)] + pub public_logs: bool, + #[serde(default)] + pub public_sysinfo: bool, + #[serde(default)] + pub kms_enabled: bool, + #[serde(default)] + pub tproxy_enabled: bool, + #[serde(default)] + pub local_key_provider_enabled: bool, + #[serde(default)] + pub key_provider: Option, +} + +#[derive(Deserialize, Serialize, Debug, Clone, Copy)] +#[serde(rename_all = "snake_case")] +pub enum KeyProviderKind { + None, + Kms, + Local, +} + +impl KeyProviderKind { + pub fn is_none(&self) -> bool { + matches!(self, KeyProviderKind::None) + } +} + +#[derive(Deserialize, Serialize, Debug, Default, Clone)] +pub struct DockerConfig { + /// The URL of the Docker registry. + pub registry: Option, + /// The username of the registry account. + pub username: Option, + /// The key of the encrypted environment variables for registry account token. + pub token_key: Option, +} + +impl AppCompose { + pub fn feature_enabled(&self, feature: &str) -> bool { + self.features.contains(&feature.to_string()) + } + + pub fn tproxy_enabled(&self) -> bool { + self.tproxy_enabled || self.feature_enabled("tproxy-net") + } + + pub fn kms_enabled(&self) -> bool { + self.kms_enabled || self.feature_enabled("kms") + } + + pub fn key_provider(&self) -> KeyProviderKind { + match self.key_provider { + Some(p) => p, + None => { + if self.kms_enabled { + KeyProviderKind::Kms + } else if self.local_key_provider_enabled { + KeyProviderKind::Local + } else { + KeyProviderKind::None + } + } + } + } +} + +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct LocalConfig { + pub kms_url: Option, + pub tproxy_url: Option, + pub pccs_url: Option, + pub docker_registry: Option, + pub host_api_url: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AppKeys { + #[serde(with = "hex_bytes")] + pub disk_crypt_key: Vec, + #[serde(with = "hex_bytes", default)] + pub env_crypt_key: Vec, + #[serde(with = "hex_bytes")] + pub k256_key: Vec, + #[serde(with = "hex_bytes")] + pub k256_signature: Vec, + pub tproxy_app_id: String, + pub ca_cert: String, + pub key_provider: KeyProvider, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum KeyProvider { + Local { key: String }, + Kms { url: String }, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct KeyProviderInfo { + pub name: String, + pub id: String, +} + +impl KeyProviderInfo { + pub fn new(name: String, id: String) -> Self { + Self { name, id } + } +} diff --git a/examples/attestation/.gitignore b/examples/attestation/.gitignore new file mode 100644 index 00000000..187d3623 --- /dev/null +++ b/examples/attestation/.gitignore @@ -0,0 +1 @@ +/images diff --git a/examples/attestation/app-compose.json b/examples/attestation/app-compose.json new file mode 100644 index 00000000..0f96878c --- /dev/null +++ b/examples/attestation/app-compose.json @@ -0,0 +1 @@ +{"manifest_version":2,"name":"kvin-nb1","runner":"docker-compose","docker_compose_file":"services:\n jupyter:\n image: quay.io/jupyter/base-notebook\n user: root\n network_mode: host\n privileged: true\n environment:\n - GRANT_SUDO=yes\n ports:\n - \"80:8888\"\n volumes:\n - /:/host/\n - /var/run/tappd.sock:/var/run/tappd.sock\n\n","docker_config":{},"kms_enabled":true,"tproxy_enabled":true,"public_logs":true,"public_sysinfo":true,"local_key_provider_enabled":false} \ No newline at end of file diff --git a/examples/attestation/report.json b/examples/attestation/report.json new file mode 100644 index 00000000..8a072d9e --- /dev/null +++ b/examples/attestation/report.json @@ -0,0 +1 @@ +{"quote":"040002008100000000000000939a7233f79c4ca9940a0db3957f060783fbfe61525f55581315cd9dc950f44700000000060102000000000000000000000000005b38e33a6487958b72c3c12a938eaa5e3fd4510c51aeeab58c7d5ecee41d7c436489d6c8e4f92f160b7cad34207b00c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000e702060000000000c68518a0ebb42136c12b2275164f8c72f25fa9a34392228687ed6e9caeb9c0f1dbd895e9cf475121c029dc47e70e91fd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274c2344116db7c663470693b5ba62b8621eac28cb41d2f816ddf188f9f423f900a1c44d32386fd3c993dc814e62af9d038b1f762ca65a338236047af820392dfc65bd8a1057e4d3e2acac583da6088c5dba3b1d35acdf0c3682a3abc2cb055a1a25c0dd721d17b31b58d71a172aab4a01bf5c1d43f930dde24a70ef5997beeb15fe650b374de03d7b57d61d4e9c6f1a45c2309ffdc521edbed3f5e651c250dac0e50306d2f93b639f74d60f910b498ca8c489cedae7719c4b052f3e4eadf3a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc100000886cbd0da9511b6bc6500f305ea6577975b40896060d40bab82bfbe3dd64f0b1041384f56391074a2157cd2c57db5ff50a1024bf3925364f4fef0aebf3ee91384996a9e56e40ac6c0b019709537f16d751c03e8c0d905d79f224ff06ddc4102860a8770107748c011cdbfcccc857e418735b699ac89dc2ed4da11d5125cb925e0600461000000202191b03ff0006000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000e700000000000000e5a3a7b5d830c2953b98534c6c59a3a34fdc34e933f7f5898f0a85cf08846bca0000000000000000000000000000000000000000000000000000000000000000dc9e2a7c6f948f17474e34a7fc43ed030f7c1563f1babddf6340c82e0e54a8c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000503bbfe5befa55a13e21747c3859f0b618a050312a0340e980187eea232356d6000000000000000000000000000000000000000000000000000000000000000065ce7bf17e75f59a980fccfa4dfbe7bab98ff0c77a46122a27c048316286ecafb956d0dbd9c9093568c48b37d903eb4efa847e29c771f68ba793e4217b0d41772000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f05005e0e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d49494538444343424a65674177494241674956414c5235544954392b396e73423142545a3173725851346c627752424d416f4743437147534d343942414d430a4d484178496a416742674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d0a45556c756447567349454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155450a4341774351304578437a414a42674e5642415954416c56544d423458445449304d4467774d6a45784d54557a4e316f5844544d784d4467774d6a45784d54557a0a4e316f77634445694d434147413155454177775a535735305a5777675530645949464244537942445a584a3061575a70593246305a5445614d426747413155450a43677752535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d517377435159440a5651514944414a445154454c4d416b474131554542684d4356564d775754415442676371686b6a4f5051494242676771686b6a4f50514d4242774e43414154590a77777155344778504a6a596f6a4d4752686136327970346a425164355744764b776d54366c6c314147786a59363870694a50676950686462387a544766374b620a314f79643153464f4d5a70594c795054427a59646f3449444444434341776777487759445652306a42426777466f41556c5739647a62306234656c4153636e550a3944504f4156634c336c5177617759445652306642475177596a42676f46366758495a616148523063484d364c79396863476b7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253397a5a3367765932567964476c6d61574e6864476c76626939324e4339775932746a636d772f593245390a6347786864475a76636d306d5a57356a62325270626d63395a4756794d423047413155644467515742425146303476507654474b7762416c356f54765664664d0a2b356a6e7554414f42674e56485138424166384542414d434273417744415944565230544151482f4241497741444343416a6b4743537147534962345451454e0a4151534341696f776767496d4d42344743697147534962345451454e41514545454e3564416f7135634b356e383277396f793165346e34776767466a42676f710a686b69472b453042445145434d494942557a415142677371686b69472b4530424451454341514942416a415142677371686b69472b45304244514543416749420a416a415142677371686b69472b4530424451454341774942416a415142677371686b69472b4530424451454342414942416a415142677371686b69472b4530420a4451454342514942417a415142677371686b69472b45304244514543426749424154415142677371686b69472b453042445145434277494241444151426773710a686b69472b4530424451454343414942417a415142677371686b69472b45304244514543435149424144415142677371686b69472b45304244514543436749420a4144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69472b4530420a44514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b453042445145434477494241444151426773710a686b69472b45304244514543454149424144415142677371686b69472b4530424451454345514942437a416642677371686b69472b45304244514543456751510a4167494341674d4241414d4141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b453042445145450a4241617777473841414141774477594b4b6f5a496876684e4151304242516f424154416542676f71686b69472b453042445145474242424a316472685349736d0a682b2f46793074746a6a762f4d45514743697147534962345451454e415163774e6a415142677371686b69472b45304244514548415145422f7a4151426773710a686b69472b45304244514548416745422f7a415142677371686b69472b45304244514548417745422f7a414b42676771686b6a4f5051514441674e48414442450a41694270455738754f726b537469486b4c4b6e6a426855416f637a39545733366a4e2f303765416844503635617749674d2f31474c58745a70446436706150760a535a386d4e7472543830305635346b465944474f7a4f78504374383d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","event_log":"[{\"imr\":0,\"event_type\":2147483659,\"digest\":\"2b630fa1d8fa9b6e8c6507d2256803ed227888f7d1f62ca5cfbddfe495338b1c6a0fc339ea64700f0835c0897a662789\",\"event\":\"\",\"event_payload\":\"095464785461626c65000100000000000000af96bb93f2b9b84e9462e0ba745642360090800000000000\"},{\"imr\":0,\"event_type\":2147483658,\"digest\":\"344bc51c980ba621aaa00da3ed7436f7d6e549197dfe699515dfa2c6583d95e6412af21c097d473155875ffd561d6790\",\"event\":\"\",\"event_payload\":\"2946762858585858585858582d585858582d585858582d585858582d58585858585858585858585829000000c0ff000000000040080000000000\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"9dc3a1f80bcec915391dcda5ffbb15e7419f77eab462bbf72b42166fb70d50325e37b36f93537a863769bcf9bedae6fb\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0a00000000000000000000000000000053006500630075007200650042006f006f007400\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"6f2e3cbc14f9def86980f5f66fd85e99d63e69a73014ed8a5633ce56eca5b64b692108c56110e22acadcef58c3250f1b\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0200000000000000000000000000000050004b00\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"d607c0efb41c0d757d69bca0615c3a9ac0b1db06c557d992e906c6b7dee40e0e031640c7bfd7bcd35844ef9edeadc6f9\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c030000000000000000000000000000004b0045004b00\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"08a74f8963b337acb6c93682f934496373679dd26af1089cb4eaf0c30cf260a12e814856385ab8843e56a9acea19e127\",\"event\":\"\",\"event_payload\":\"cbb219d73a3d9645a3bcdad00e67656f0200000000000000000000000000000064006200\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"18cc6e01f0c6ea99aa23f8a280423e94ad81d96d0aeb5180504fc0f7a40cb3619dd39bd6a95ec1680a86ed6ab0f9828d\",\"event\":\"\",\"event_payload\":\"cbb219d73a3d9645a3bcdad00e67656f03000000000000000000000000000000640062007800\"},{\"imr\":0,\"event_type\":4,\"digest\":\"394341b7182cd227c5c6b07ef8000cdfd86136c4292b8e576573ad7ed9ae41019f5818b4b971c9effc60e1ad9f1289f0\",\"event\":\"\",\"event_payload\":\"00000000\"},{\"imr\":0,\"event_type\":10,\"digest\":\"68cd79315e70aecd4afe7c1b23a5ed7b3b8e51a477e1739f111b3156def86bbc56ebf239dcd4591bc7a9fff90023f481\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":0,\"event_type\":10,\"digest\":\"6bc203b3843388cc4918459c3f5c6d1300a796fb594781b7ecfaa3ae7456975f095bfcc1156c9f2d25e8b8bc1b520f66\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":0,\"event_type\":10,\"digest\":\"444cf35d277a7b6049faf4ff23165e256e716eaad4650aeef6afae8e2dca3359b40c1b2eb997c5568f956616310c9147\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":1,\"event_type\":2147483651,\"digest\":\"1a417d47a3cee3249d13443d99ceb785b1b8b03fcf26a925f5701699779195baccfaf3c92f067f42f1c75aecb0c250b1\",\"event\":\"\",\"event_payload\":\"18a0443b0000000000b4b2000000000000000000000000002a000000000000000403140072f728144ab61e44b8c39ebdd7f893c7040412006b00650072006e0065006c0000007fff0400\"},{\"imr\":0,\"event_type\":2147483650,\"digest\":\"1dd6f7b457ad880d840d41c961283bab688e94e4b59359ea45686581e90feccea3c624b1226113f824f315eb60ae0a7c\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0900000000000000020000000000000042006f006f0074004f0072006400650072000000\"},{\"imr\":0,\"event_type\":2147483650,\"digest\":\"23ada07f5261f12f34a0bd8e46760962d6b4d576a416f1fea1c64bc656b1d28eacf7047ae6e967c58fd2a98bfa74c298\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c08000000000000003e0000000000000042006f006f0074003000300030003000090100002c0055006900410070007000000004071400c9bdb87cebf8344faaea3ee4af6516a10406140021aa2c4614760345836e8ab6f46623317fff0400\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"77a0dab2312b4e1e57a84d865a21e5b2ee8d677a21012ada819d0a98988078d3d740f6346bfe0abaa938ca20439a8d71\",\"event\":\"\",\"event_payload\":\"43616c6c696e6720454649204170706c69636174696f6e2066726f6d20426f6f74204f7074696f6e\"},{\"imr\":1,\"event_type\":4,\"digest\":\"394341b7182cd227c5c6b07ef8000cdfd86136c4292b8e576573ad7ed9ae41019f5818b4b971c9effc60e1ad9f1289f0\",\"event\":\"\",\"event_payload\":\"00000000\"},{\"imr\":2,\"event_type\":6,\"digest\":\"d54d67fde61596a4334222c69d76a20273500c9df4d791a554eac56f899de9c35c59107ded404b86e49c11ac84bd17a8\",\"event\":\"\",\"event_payload\":\"ed223b8f1a0000004c4f414445445f494d4147453a3a4c6f61644f7074696f6e7300\"},{\"imr\":2,\"event_type\":6,\"digest\":\"d4e7efaf52826912904a9f1e7f9946b4e8926a65e0cb92e5d79b1b4bb86428bccccc16331b8e58d7faa3b74e51542b43\",\"event\":\"\",\"event_payload\":\"ec223b8f0d0000004c696e757820696e6974726400\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"214b0bef1379756011344877743fdc2a5382bac6e70362d624ccf3f654407c1b4badf7d8f9295dd3dabdef65b27677e0\",\"event\":\"\",\"event_payload\":\"4578697420426f6f7420536572766963657320496e766f636174696f6e\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"0a2e01c85deae718a530ad8c6d20a84009babe6c8989269e950d8cf440c6e997695e64d455c4174a652cd080f6230b74\",\"event\":\"\",\"event_payload\":\"4578697420426f6f742053657276696365732052657475726e656420776974682053756363657373\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"f9974020ef507068183313d0ca808e0d1ca9b2d1ad0c61f5784e7157c362c06536f5ddacdad4451693f48fcc72fff624\",\"event\":\"system-preparing\",\"event_payload\":\"\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"f1b8958288c8a8f4b15807764e91130d4176068bd19f4cf628cd0f66076489774e39f01f197d47b47ce5e27dabab7226\",\"event\":\"rootfs-hash\",\"event_payload\":\"0d51f07efbbdc35b9f97b65655171e5679df26daa7e247280a91b439f1104035\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"68c649acf8b2a364e8a34e8d47a03bb31c1596182621f50c504fdf075541487c23a9cc194310a913a7637dbbeb9a78aa\",\"event\":\"app-id\",\"event_payload\":\"06768e6df639ce3be65e9e5321f8b2d82dbffb01\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"f50a57024906cde893dcffa6d2f05a9bcf94cb7632f3738c7541888f6c4ef6162990834d8e2a72a57a341a0e1c6fe603\",\"event\":\"compose-hash\",\"event_payload\":\"06768e6df639ce3be65e9e5321f8b2d82dbffb01c74323462d34c2feb9653aff\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"e1179208cc27125fbd2c6aacc98476303ce36e006805e9a98f8bf3919c50021e1e99035e2eb510a78d65a27c3455eb4f\",\"event\":\"instance-id\",\"event_payload\":\"9ba3255b85b26ec04b5ce853056f7651144ff3b5\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"98bd7e6bd3952720b65027fd494834045d06b4a714bf737a06b874638b3ea00ff402f7f583e3e3b05e921c8570433ac6\",\"event\":\"boot-mr-done\",\"event_payload\":\"\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"deac37b945531c095011446abb3fa70b8cbf895bf6fd42ec1e485dc4d1edef4023e1a419977c2212c5b283519dc03cc6\",\"event\":\"key-provider\",\"event_payload\":\"7b226e616d65223a226b6d73222c226964223a223330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030346431366635653338663364386631623364356539346333393935373732376664636363616630656430383363653862353933383136336433393661363831333463626634366637353163663636613064653137643463663364623031346366393337613363333565613935343066386231663836336362396562613631356631227d\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"1a76b2a80a0be71eae59f80945d876351a7a3fb8e9fd1ff1cede5734aa84ea11fd72b4edfbb6f04e5a85edd114c751bd\",\"event\":\"system-ready\",\"event_payload\":\"\"}]","hash_algorithm":"raw","prefix":""} \ No newline at end of file diff --git a/examples/attestation/verify.py b/examples/attestation/verify.py new file mode 100755 index 00000000..e2c112c5 --- /dev/null +++ b/examples/attestation/verify.py @@ -0,0 +1,199 @@ +""" +This is an example script of how to do remote attestation for Dstack Applications. + +Dependencies: +- Dstack OS Image: Can be built from source or downloaded from https://github.com/Dstack-TEE/dstack/releases/tag/dev-v0.4.0.0 for the image used in this demo. +- dcap-qvl: Phala's TDX/SGX Quote Verification tool (install with `cargo install dcap-qvl-cli`) +- dstack-mr: Tool for calculating expected measurement values for Dstack Base Images, install with `go install github.com/kvinwang/dstack-mr@latest` + +Example usage is provided in the __main__ section. +""" + +import hashlib +import json +from typing import Dict, Any +import tempfile +import subprocess +import os + +INIT_MR = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + +def replay_rtmr(history: list[str]): + """ + Replay the RTMR history to calculate the final RTMR value. + """ + if len(history) == 0: + return INIT_MR + mr = bytes.fromhex(INIT_MR) + for content in history: + # mr = sha384(concat(mr, content)) + # if content is shorter than 48 bytes, pad it with zeros + content = bytes.fromhex(content) + if len(content) < 48: + content = content.ljust(48, b'\0') + mr = hashlib.sha384(mr + content).digest() + return mr.hex() + + +class DstackTdxQuote: + quote: str + event_log: str + verified_quote: Dict[str, Any] + parsed_event_log: list[Dict[str, Any]] + app_id: str + compose_hash: str + instance_id: str + key_provider: str + + def __init__(self, quote: str, event_log: str): + """ + Initialize the DstackTdxQuote object. + """ + self.quote = bytes.fromhex(quote) + self.event_log = event_log + self.parsed_event_log = json.loads(self.event_log) + self.extract_info_from_event_log() + + def extract_info_from_event_log(self): + """ + Extract the app ID, compose hash, instance ID, and key provider from the event log. + """ + for event in self.parsed_event_log: + if event.get('event') == 'app-id': + self.app_id = event.get('event_payload', '') + elif event.get('event') == 'compose-hash': + self.compose_hash = event.get('event_payload', '') + elif event.get('event') == 'instance-id': + self.instance_id = event.get('event_payload', '') + elif event.get('event') == 'key-provider': + self.key_provider = bytes.fromhex(event.get('event_payload', '')).decode('utf-8') + + def mrs(self) -> Dict[str, str]: + """ + Get the MRs from the verified quote. + """ + report = self.verified_quote.get('report', {}) + if 'TD10' in report: + return report['TD10'] + elif 'TD15' in report: + return report['TD15'] + else: + raise ValueError("No TD10 or TD15 report found in the quote") + + def verify(self): + """ + Verify the TDX quote using dcap-qvl command. + Returns True if verification succeeds, False otherwise. + """ + + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + temp_file.write(self.quote) + temp_path = temp_file.name + + try: + result = subprocess.run( + ["dcap-qvl", "verify", temp_path], + capture_output=True, + text=True + ) + if result.returncode != 0: + raise ValueError(f"dcap-qvl verify failed with return code {result.returncode}") + self.verified_quote = json.loads(result.stdout) + finally: + os.unlink(temp_path) + + def validate_event(self, event: Dict[str, Any]) -> bool: + """ + Validate an event's digest according to the Rust implementation. + Returns True if the event is valid, False otherwise. + """ + # Skip validation for non-IMR3 events for now + if event.get('imr') != 3: + return True + + # Calculate digest using sha384(type:event:payload) + event_type = event.get('event_type', 0) + event_name = event.get('event', '') + event_payload = bytes.fromhex(event.get('event_payload', '')) + + if isinstance(event_payload, str): + event_payload = event_payload.encode() + + hasher = hashlib.sha384() + hasher.update(event_type.to_bytes(4, byteorder='little')) + hasher.update(b':') + hasher.update(event_name.encode()) + hasher.update(b':') + hasher.update(event_payload) + + calculated_digest = hasher.digest().hex() + return calculated_digest == event.get('digest') + + def replay_rtmrs(self) -> Dict[int, str]: + rtmrs = {} + for idx in range(4): + history = [] + for event in self.parsed_event_log: + if event.get('imr') == idx: + # Only add digest to history if event is valid + if self.validate_event(event): + history.append(event['digest']) + else: + raise ValueError(f"Invalid event digest found in IMR {idx}") + rtmrs[idx] = replay_rtmr(history) + return rtmrs + + +def sha256_hex(data: str) -> str: + """ + Calculate the SHA256 hash of the given data. + """ + return hashlib.sha256(data.encode()).hexdigest() + + +if __name__ == "__main__": + vcpus = '1' + memory = '1G' + + print('Pre-calculated RTMRs') + result = subprocess.run( + ["dstack-mr", "-cpu", vcpus, "-memory", memory, "-json", "-metadata", "images/dstack-dev-0.4.0/metadata.json"], + capture_output=True, + text=True + ) + expected_mrs = json.loads(result.stdout) + print(json.dumps(expected_mrs, indent=2)) + + report = json.load(open('report.json')) + quote = DstackTdxQuote(report['quote'], report['event_log']) + quote.verify() + print("Quote verified") + verified_mrs = quote.mrs() + show_mrs = { + "mrtd": verified_mrs['mr_td'], + "rtmr0": verified_mrs['rt_mr0'], + "rtmr1": verified_mrs['rt_mr1'], + "rtmr2": verified_mrs['rt_mr2'], + "rtmr3": verified_mrs['rt_mr3'], + "report_data": verified_mrs['report_data'], + } + print(json.dumps(show_mrs, indent=2)) + + assert verified_mrs['mr_td'] == expected_mrs['mrtd'], f"MRTD mismatch: {verified_mrs['mr_td']} != {expected_mrs['mrtd']}" + assert verified_mrs['rt_mr0'] == expected_mrs['rtmr0'], f"RTMR0 mismatch: {verified_mrs['rt_mr0']} != {expected_mrs['rtmr0']}" + assert verified_mrs['rt_mr1'] == expected_mrs['rtmr1'], f"RTMR1 mismatch: {verified_mrs['rt_mr1']} != {expected_mrs['rtmr1']}" + assert verified_mrs['rt_mr2'] == expected_mrs['rtmr2'], f"RTMR2 mismatch: {verified_mrs['rt_mr2']} != {expected_mrs['rtmr2']}" + + replayed_mrs = quote.replay_rtmrs() + print("Replay RTMRs") + print(json.dumps(replayed_mrs, indent=2)) + + assert replayed_mrs[3] == verified_mrs['rt_mr3'], f"RTMR3 mismatch: {replayed_mrs[3]} != {verified_mrs['rt_mr3']}" + + expected_compose_hash = sha256_hex(open('app-compose.json').read()) + assert quote.compose_hash == expected_compose_hash, f"Compose hash mismatch: {quote.compose_hash} != {expected_compose_hash}" + + print(f"App ID: {quote.app_id}") + print(f"Compose Hash: {quote.compose_hash}") + print(f"Instance ID: {quote.instance_id}") + print(f"Key Provider: {quote.key_provider}") diff --git a/guest-api/proto/guest_api.proto b/guest-api/proto/guest_api.proto index e698293d..79760ac5 100644 --- a/guest-api/proto/guest_api.proto +++ b/guest-api/proto/guest_api.proto @@ -13,13 +13,15 @@ message GuestInfo { // Guest software version string version = 1; // App ID - string app_id = 2; + bytes app_id = 2; // App Instance ID - string instance_id = 3; + bytes instance_id = 3; // App certificate string app_cert = 4; // TCB info string tcb_info = 5; + // Device ID + bytes device_id = 6; } message IpAddress { diff --git a/host-api/proto/host_api.proto b/host-api/proto/host_api.proto index ca6fdb03..eb11e92a 100644 --- a/host-api/proto/host_api.proto +++ b/host-api/proto/host_api.proto @@ -15,7 +15,17 @@ message Notification { string payload = 2; } +message GetSealingKeyRequest { + bytes quote = 1; +} + +message GetSealingKeyResponse { + bytes encrypted_key = 1; + bytes provider_quote = 2; +} + service HostApi { rpc Info(google.protobuf.Empty) returns (HostInfo); rpc Notify(Notification) returns (google.protobuf.Empty); + rpc GetSealingKey(GetSealingKeyRequest) returns (GetSealingKeyResponse); } diff --git a/http-client/src/prpc.rs b/http-client/src/prpc.rs index 75daa3ab..41bdb7e0 100644 --- a/http-client/src/prpc.rs +++ b/http-client/src/prpc.rs @@ -7,11 +7,25 @@ use serde::{de::DeserializeOwned, Serialize}; pub struct PrpcClient { base_url: String, + path_append: String, } impl PrpcClient { pub fn new(base_url: String) -> Self { - Self { base_url } + Self { + base_url, + path_append: String::new(), + } + } + + pub fn new_unix(socket_path: String, mut path: String) -> Self { + if !path.ends_with('/') { + path.push('/'); + } + Self { + base_url: format!("unix:{socket_path}"), + path_append: path, + } } } @@ -22,10 +36,10 @@ impl RequestClient for PrpcClient { R: Message + DeserializeOwned, { let body = serde_json::to_vec(&body).context("Failed to serialize body")?; - let path = format!("{path}?json"); + let path = format!("{}{path}?json", self.path_append); let (status, body) = super::http_request("POST", &self.base_url, &path, &body).await?; if status != 200 { - return Err(Error::RpcError(format!("Invalid status code: {status}"))); + anyhow::bail!("Invalid status code: {status}, path={path}"); } let response = serde_json::from_slice(&body).context("Failed to deserialize response")?; Ok(response) diff --git a/key-provider-build/Dockerfile b/key-provider-build/Dockerfile new file mode 100644 index 00000000..0186c5d8 --- /dev/null +++ b/key-provider-build/Dockerfile @@ -0,0 +1,61 @@ +FROM gramineproject/gramine:v1.5 + +# Prevent timezone prompt by setting noninteractive frontend and configuring tzdata +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=Etc/UTC \ + TZDATA=Etc/UTC \ + LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 + +# Set timezone +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +# Install required packages +RUN apt update && apt install -y \ + build-essential \ + chrpath \ + diffstat \ + lz4 \ + python3 \ + locales \ + git \ + file \ + gawk \ + wget \ + curl \ + libclang-dev \ + rsyslog \ + xorriso + +# Runtime dependencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + sgx-aesm-service \ + libsgx-aesm-launch-plugin \ + libsgx-aesm-quote-ex-plugin \ + libsgx-aesm-ecdsa-plugin \ + libsgx-dcap-quote-verify \ + libsgx-dcap-default-qpl \ + psmisc + +# Install Rust 1.80 +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain 1.80 -y +ENV PATH="/root/.cargo/bin:${PATH}" + +RUN git clone https://github.com/MoeMahhouk/gramine-sealing-key-provider && \ + cd gramine-sealing-key-provider && \ + git checkout 6b4658d3d2158615b6c78879ad61612885372712 + +WORKDIR /gramine-sealing-key-provider +# Build gramine-sealing-key-provider binary +RUN make target/release/gramine-sealing-key-provider +# Generate private key +RUN gramine-sgx-gen-private-key +# Build gramine manifest +RUN make RUST_LOG=info + +RUN gramine-sgx-sigstruct-view --output-format json gramine-sealing-key-provider.sig + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] diff --git a/key-provider-build/docker-compose.yaml b/key-provider-build/docker-compose.yaml new file mode 100644 index 00000000..32aa5226 --- /dev/null +++ b/key-provider-build/docker-compose.yaml @@ -0,0 +1,34 @@ +x-common: &common-config + restart: always + logging: + driver: "json-file" + options: + max-size: "100m" + max-file: "5" + +services: + gramine-sealing-key-provider: + <<: *common-config + container_name: gramine-sealing-key-provider + build: + context: . + dockerfile: Dockerfile + privileged: true + devices: + - "/dev/sgx_enclave:/dev/sgx_enclave" + - "/dev/sgx_provision:/dev/sgx_provision" + volumes: + - "./sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf" + extra_hosts: + - "host.docker.internal:host-gateway" + ports: + - "127.0.0.1:3443:3443" + + # proxy to access the local pccs for the aesm service + # The local PCCS is supposed to be running on the host machine and listening on 127.0.0.1:8081 + pccs-proxy: + <<: *common-config + image: alpine/socat + container_name: pccs-proxy + network_mode: host + command: TCP-LISTEN:8082,bind=172.17.0.1,fork,reuseaddr TCP:127.0.0.1:8081 diff --git a/key-provider-build/entrypoint.sh b/key-provider-build/entrypoint.sh new file mode 100755 index 00000000..1064ba75 --- /dev/null +++ b/key-provider-build/entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh +rsyslogd +AESM_PATH=/opt/intel/sgx-aesm-service/aesm LD_LIBRARY_PATH=/opt/intel/sgx-aesm-service/aesm /opt/intel/sgx-aesm-service/aesm/aesm_service + +echo "Enclave info:" +gramine-sgx-sigstruct-view --output-format json gramine-sealing-key-provider.sig + +echo "Starting Gramine Sealing Key Provider" +make SGX=1 run-provider diff --git a/key-provider-build/run.sh b/key-provider-build/run.sh new file mode 100755 index 00000000..2f94bad2 --- /dev/null +++ b/key-provider-build/run.sh @@ -0,0 +1,2 @@ +#!/bin/sh +docker compose up --build -d diff --git a/key-provider-build/sgx_default_qcnl.conf b/key-provider-build/sgx_default_qcnl.conf new file mode 100644 index 00000000..722f5517 --- /dev/null +++ b/key-provider-build/sgx_default_qcnl.conf @@ -0,0 +1,9 @@ +{ + "pccs_url": "https://host.docker.internal:8082/sgx/certification/v4/", + "use_secure_cert": false, + "retry_times": 6, + "retry_delay": 10, + "pck_cache_expire_hours": 168, + "verify_collateral_cache_expire_hours": 168, + "local_cache_only": false +} \ No newline at end of file diff --git a/key-provider-client/Cargo.toml b/key-provider-client/Cargo.toml new file mode 100644 index 00000000..5e3f94b9 --- /dev/null +++ b/key-provider-client/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "key-provider-client" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +sodiumoxide.workspace = true +tokio = { workspace = true, features = ["net", "io-util"] } diff --git a/key-provider-client/src/guest.rs b/key-provider-client/src/guest.rs new file mode 100644 index 00000000..48100762 --- /dev/null +++ b/key-provider-client/src/guest.rs @@ -0,0 +1,26 @@ +use sodiumoxide::crypto::box_::{self, PublicKey, SecretKey}; +use sodiumoxide::crypto::sealedbox; +use std::sync::OnceLock; + +pub use box_::PUBLICKEYBYTES; + +#[allow(clippy::result_unit_err)] +fn ensure_sodium_initialized() -> Result<(), ()> { + static SODIUM_INIT: OnceLock> = OnceLock::new(); + *SODIUM_INIT.get_or_init(sodiumoxide::init) +} + +pub fn generate_keypair() -> (PublicKey, SecretKey) { + ensure_sodium_initialized().expect("Failed to initialize sodium"); + box_::gen_keypair() +} + +#[allow(clippy::result_unit_err)] +pub fn open_sealed_box( + sealed_box: &[u8], + public_key: &PublicKey, + secret_key: &SecretKey, +) -> Result, ()> { + ensure_sodium_initialized().expect("Failed to initialize sodium"); + sealedbox::open(sealed_box, public_key, secret_key) +} diff --git a/key-provider-client/src/host.rs b/key-provider-client/src/host.rs new file mode 100644 index 00000000..a4a2f3f1 --- /dev/null +++ b/key-provider-client/src/host.rs @@ -0,0 +1,53 @@ +use anyhow::{bail, Context, Result}; +use serde::{Deserialize, Serialize}; +use std::net::IpAddr; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::TcpStream, +}; + +#[derive(Serialize, Deserialize)] +struct QuoteRequest<'a> { + quote: &'a [u8], +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct QuoteResponse { + pub encrypted_key: Vec, + pub provider_quote: Vec, +} + +pub async fn get_key(quote: Vec, address: IpAddr, port: u16) -> Result { + if quote.len() > 1024 * 1024 { + bail!("Quote is too long"); + } + let mut tcp_stream = TcpStream::connect((address, port)) + .await + .context("Failed to connect to key provider")?; + let payload = QuoteRequest { quote: "e }; + let serialized = serde_json::to_vec(&payload)?; + let length = serialized.len() as u32; + tcp_stream + .write_all(&length.to_be_bytes()) + .await + .context("Failed to write length")?; + tcp_stream + .write_all(&serialized) + .await + .context("Failed to write payload")?; + + let mut response_length = [0; 4]; + tcp_stream + .read_exact(&mut response_length) + .await + .context("Failed to read response length")?; + let response_length = u32::from_be_bytes(response_length); + let mut response = vec![0; response_length as usize]; + tcp_stream + .read_exact(&mut response) + .await + .context("Failed to read response")?; + let response: QuoteResponse = + serde_json::from_slice(&response).context("Failed to deserialize response")?; + Ok(response) +} diff --git a/key-provider-client/src/lib.rs b/key-provider-client/src/lib.rs new file mode 100644 index 00000000..6815c46e --- /dev/null +++ b/key-provider-client/src/lib.rs @@ -0,0 +1,2 @@ +pub mod guest; +pub mod host; diff --git a/kms/Cargo.toml b/kms/Cargo.toml index fe658501..e682ce9c 100644 --- a/kms/Cargo.toml +++ b/kms/Cargo.toml @@ -21,9 +21,22 @@ x25519-dalek.workspace = true yasna.workspace = true kms-rpc.workspace = true -ra-rpc = { workspace = true, features = ["rocket"] } +ra-rpc = { workspace = true, features = ["client", "rocket"] } ra-tls.workspace = true load_config.workspace = true +serde-human-bytes.workspace = true +reqwest = { workspace = true, features = ["json"] } +sha2.workspace = true +sha3.workspace = true +k256.workspace = true +rand.workspace = true +tappd-rpc.workspace = true +http-client = { workspace = true, features = ["prpc"] } +scale.workspace = true +x509-parser = { workspace = true, features = ["verify"] } +ring.workspace = true +safe-write.workspace = true +serde_json.workspace = true [features] default = [] diff --git a/kms/README.md b/kms/README.md new file mode 100644 index 00000000..cf9d181c --- /dev/null +++ b/kms/README.md @@ -0,0 +1,189 @@ +# Dstack - KMS Protocol + +## Overview + +CVMs running in dstack support three boot modes: +- **Non-KMS Mode** (stateless) +- **Local-Key-Provider Mode** (stateful, no upgrades) +- **KMS Mode** (stateful, upgradeable) + +### Boot Mode Details + +#### Non-KMS Mode +- Generates ephemeral app keys on startup +- No persistent disk state +- No external key provider required +- `app-id` must equal `compose-hash` +- `key-provider` in RTMR: `{"type": "none", "id": ""}` + +#### Local-Key-Provider Mode +- Uses `gramine-sealing-key-provider` for app keys +- Maintains persistent disk state +- Validates key provider via SGX quote +- `key-provider` in RTMR: `{"type": "local-sgx", "id": ""}` +- `app-id` must equal `compose-hash` + +#### KMS Mode +- Enables flexible `app-id` validation in KMS +- Supports application upgrades +- Requires control contract configuration +- `key-provider` in RTMR: `{"type": "kms", "id": ""}` +- `app-id` is derived from the deployer's eth address + salt + +## KMS Implementation + +### Components +1. **dstack-kms** + - Main RPC service for app key requests + - Quote verification and boot info validation + - Asks `dstack-kms-auth-eth` for permission + - Builtin Replicator for root keys + +2. **dstack-kms-auth-eth** + - Chain interface for permission checks + - Two-step validation: + 1. KMS control contract check + 2. App control contract check + +3. **Authorization Contracts** + - `KmsAuth.sol` + - Maintains a registry for all Applications + - Maintains the allowed KMS Instance MRs + - Maintains the allowed App Base Image MRs + - Registers KMS root keys + - `AppAuth.sol` + - Apps can have either a dedicated `AppAuth` contract or share one with multiple apps + - Controls permissions for individual apps + - Maintains the allowed compose hashes for each app + +### Deployment +The first two components are deployed as an Tapp on dstack in Local-Key-Provider mode. +The docker compose file would look like [this](tapp/docker-compose.yaml). + +The solidity contracts are deployed on an ethereum compatible chain. + + +## Trustness + +### Local-Key-Provider Mode +A instance of [`gramine-sealing-key-provider`](https://github.com/MoeMahhouk/gramine-sealing-key-provider) is required being deployed on the host machine. Can be deployed by [../key-provider-build](../key-provider-build/run.sh). + +In this mode, the CVM obtains application keys from the `gramine-sealing-key-provider`, which runs within an SGX enclave. The provider derives the application keys using: +- The SGX sealing key +- CVM measurements, including: + - MRTD + RTMR[0-2]: Base image and VM configuration measurements + - RTMR[3]: Runtime application configuration + +The key provisioning process: +1. The CVM validates the SGX quote from `gramine-sealing-key-provider` +2. After obtaining the keys, the CVM records the provider's MR enclave in RTMR3 +3. Applications can verify trust by validating measurements in the TDX quote + +### KMS Mode + +KMS itself runs as a Tapp in Local-Key-Provider mode, +allowing it to persist keys on its local disk but not across machines. + +On startup, the KMS node will either: +- Bootstrap: Set up a new KMS instance +- Onboard: Obtain root keys from an existing KMS instance + +#### Bootstrapping +During bootstrapping, the KMS node generates two root keys: +1. CA root key: Used to issue x509 certificates for Apps, enabling HTTPS traffic +2. K256 root key: Used to derive Ethereum-compatible keys for Apps + +After generating the root keys, their public portions can be obtained along with the corresponding TDX quote and registered in the KmsAuth contract. + +#### KMS Self Replication +When deploying a new KMS instance (`B`) using an existing instance (`A`), the process follows these steps: + +1. **Prerequisites** + - Register allowed MRs of instance `B` in the KmsAuth contract + +2. **Replication Flow** + - Configure instance `B` with the URL of existing instance `A` + - Instance `B` sends replication request to instance `A` via RA-TLS based RPC + - Instance `A` validates instance `B`'s TDX quote + - Instance `A` checks KmsAuth contract for permissions + - If approved, instance `A` transfers root keys to instance `B` + +After the replication is complete, the KMS node becomes a fully functional KMS node. +Both instances now share identical root keys, and either instance can service App key requests. + +#### App Key Provisioning + +Once onboarded, the KMS node begins listening for app key provisioning requests. + +When a KMS node receives a key provisioning request, it: +1. Validates the TDX quote of the requesting App +2. Queries the KmsAuth contract for provisioning allowance +3. If allowed, generates and sends the keys to the App + +### Attestation + +#### Vanilla TDX Quote attestation + +See [Attestation](../attestation.md) for more details. + +#### Validating Apps via the KMS Auth Chain + +The KMS performs TDX quote validation for Apps running in dstack and issues signed app keys to them. + +As a simpler approach, an App can verify the signature chain using the KMS root key as the root trust anchor. + +For example, given a message `M` signed by an App with signature `Sm`, the chain of trust works as follows: + +1. The KMS maintains the root key `sK0`, with its corresponding public key `pK0` registered in the KmsAuth contract +2. The App receives an app-key `sK1` from the KMS, along with signature `S1` (signed by `sK0`) +3. The App derives a purpose-specific key `sK2` from `sK1`, with signature `S2` (signed by `sK1`) +4. The App uses `sK2` to sign message `M`, producing signature `Sm` + +To verify the signature chain, all of `M`, `Sm`, `S1`, and `S2` are required. + +The verification process follows these steps: + +1. Recover `pK2` from `Sm` and `M` +2. Recover `pK1` from `S2` and `pK2` + `` +3. Recover `pK0` from `S1` and `pK1` + `` +4. Compare the recovered `pK0` with the registered `pK0` in the KmsAuth contract + +## The RPC Interface + +The KMS RPC interface is defined in [kms.proto](rpc/proto/kms.proto). + +The core interface serving the dstack app are: +- `GetAppKey`: Requests an app key using the app ID and TDX quote +- `GetAppEnvEncryptPubKey`: Requests the app environment encryption public key using the app ID +- `SignCert`: Signs a certificate + +Let's explain each one: + +### GetAppKey + +The `GetAppKey` RPC is used by the dstack app to request an app key. In this RPC, the KMS node will: + +- Verify the TDX quote and extract the app ID and MRs from it +- Query the smart contract to check if the app is authorized to request the app key +- If authorized, derive the app keys from the root key and app ID +- Sign the app keys with the root key +- Return the app keys to the app + + +Note: +There are multiple keys derived for different usage, see [kms.proto](rpc/proto/kms.proto) for more details. +The root key is generated by a genesis KMS node in TEE and would be stored in the KMS node's encrypted local disk, replicated to other KMS nodes. +The keys are derived with app id which guarantees apps can not get the keys from other apps. + +### GetAppEnvEncryptPubKey + +The `GetAppEnvEncryptPubKey` RPC is used by the frontend web page to request the app environment encryption public key when deploying a new app. This key is used to encrypt the app environment variables, which can only be decrypted by the app in TEE. + +### SignCert + +The `SignCert` RPC is used by the dstack app to sign a TLS certificate. In this RPC, the KMS node will: + +- Verify the TDX quote and extract the Certificate Signing Request (CSR) +- Verify the CSR signature +- Query the smart contract to check if the app is authorized +- If authorized, sign the CSR with the CA root key and return the certificate chain to the app diff --git a/kms/assets/ca.cert b/kms/assets/ca.cert deleted file mode 100644 index 8d42bda0..00000000 --- a/kms/assets/ca.cert +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBljCCAT2gAwIBAgIUGv6/AdOVIGQHcK8ZwBKS+0ZEqyowCgYIKoZIzj0EAwIw -LzEWMBQGA1UECgwNUGhhbGEgTmV0d29yazEVMBMGA1UEAwwMUGhhbGEgS01TIENB -MCAXDTc1MDEwMTAwMDAwMFoYDzQwOTYwMTAxMDAwMDAwWjAvMRYwFAYDVQQKDA1Q -aGFsYSBOZXR3b3JrMRUwEwYDVQQDDAxQaGFsYSBLTVMgQ0EwWTATBgcqhkjOPQIB -BggqhkjOPQMBBwNCAASUyNiol6k9RUS4TbzeH7ANGzSf48TABUK2wx0YlbfVUMrS -ilenXF6LK6b5p+I4urTxqSdMvwLKEpq4Mx80ua6xozUwMzAdBgNVHQ4EFgQURMj7 -U7lrIUBgAx19PbEZhnjFfR8wEgYDVR0TAQH/BAgwBgEB/wIBAzAKBggqhkjOPQQD -AgNHADBEAiBPXN6mKpGk+sE0RtfrcEuhelELVH7bbAZW/keJimiZawIgVGAXqBi4 -b6iaq1eTtIuu2iaqe/mtfXTuTekYQ3JV8kE= ------END CERTIFICATE----- diff --git a/kms/assets/ca.key b/kms/assets/ca.key deleted file mode 100644 index dff980d1..00000000 --- a/kms/assets/ca.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg935NMNdqTn9iv+tV -aAei5qQfQ3kN2GhyQRRMgIMAG5mhRANCAASUyNiol6k9RUS4TbzeH7ANGzSf48TA -BUK2wx0YlbfVUMrSilenXF6LK6b5p+I4urTxqSdMvwLKEpq4Mx80ua6x ------END PRIVATE KEY----- diff --git a/kms/assets/kms-www.cert b/kms/assets/kms-www.cert deleted file mode 100644 index cb44b9d8..00000000 --- a/kms/assets/kms-www.cert +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBRDCB66ADAgECAhRRvknspODLeq9O3UCqq/9HCPznvTAKBggqhkjOPQQDAjAv -MRYwFAYDVQQKDA1QaGFsYSBOZXR3b3JrMRUwEwYDVQQDDAxQaGFsYSBLTVMgQ0Ew -IBcNNzUwMTAxMDAwMDAwWhgPNDA5NjAxMDEwMDAwMDBaMBQxEjAQBgNVBAMMCWxv -Y2FsaG9zdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPY2NoSniweVdRlhEdo+ -WrbB3B87wqsn6L9DbFStSienPJOESPo3w/bMHeI451FFdAzCpRficWlZW3t/6w2f -ZiIwCgYIKoZIzj0EAwIDSAAwRQIgLGGGJEs8I7vW9EU3syG43h6/oC0kY0bKm98F -CPy4Vk8CIQDBIwijpPKCuEKZj+pIWpAHtc32p+IDSTeW1BcubzKQuQ== ------END CERTIFICATE----- diff --git a/kms/assets/kms-www.key b/kms/assets/kms-www.key deleted file mode 100644 index a6d383ee..00000000 --- a/kms/assets/kms-www.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBtwsFGxngYN79+Hr -OKQBekwBwWpOjxkjOqzVWjW/shqhRANCAAT2NjaEp4sHlXUZYRHaPlq2wdwfO8Kr -J+i/Q2xUrUonpzyThEj6N8P2zB3iOOdRRXQMwqUX4nFpWVt7f+sNn2Yi ------END PRIVATE KEY----- diff --git a/kms/assets/tmp-ca.cert b/kms/assets/tmp-ca.cert deleted file mode 100644 index 64773d4c..00000000 --- a/kms/assets/tmp-ca.cert +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBjDCCATGgAwIBAgIUWXh1RpxZtF5Jp5cKhqhTYsRoEckwCgYIKoZIzj0EAwIw -LzEWMBQGA1UECgwNUGhhbGEgTmV0d29yazEVMBMGA1UEAwwMUGhhbGEgS01TIENB -MCAXDTc1MDEwMTAwMDAwMFoYDzQwOTYwMTAxMDAwMDAwWjAjMSEwHwYDVQQDDBhQ -aGFsYSBLTVMgQ2xpZW50IFRlbXAgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC -AASBvSl/4NYZDSE5fw0iH0mYNl23zCOQ5EzkmNM5C/05tMHUhmMFnqH1QNq/JkAi -TkRxWYtpuKF0VayktddtUORhozUwMzAdBgNVHQ4EFgQUWfxxVFm7zz1v/Olvr691 -WhWl7LswEgYDVR0TAQH/BAgwBgEB/wIBATAKBggqhkjOPQQDAgNJADBGAiEA63HF -gJl9PLKhhaGf745E0JklnEVp6oFYdYPEZGLybEoCIQDu5oDNww9pu60GXJ28K3Lf -ihCFs0CQqf9RT9gfS71h8A== ------END CERTIFICATE----- diff --git a/kms/assets/tmp-ca.key b/kms/assets/tmp-ca.key deleted file mode 100644 index 869df600..00000000 --- a/kms/assets/tmp-ca.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgp0RkgbxCg0ytHj+f -Ox8zsDT4tvFCdUGqYLfEnkRFXsehRANCAASBvSl/4NYZDSE5fw0iH0mYNl23zCOQ -5EzkmNM5C/05tMHUhmMFnqH1QNq/JkAiTkRxWYtpuKF0VayktddtUORh ------END PRIVATE KEY----- diff --git a/kms/auth-eth/.gitignore b/kms/auth-eth/.gitignore new file mode 100644 index 00000000..976a59c5 --- /dev/null +++ b/kms/auth-eth/.gitignore @@ -0,0 +1,3 @@ +/artifacts +/cache +/dist diff --git a/kms/auth-eth/contracts/AppAuth.sol b/kms/auth-eth/contracts/AppAuth.sol new file mode 100644 index 00000000..2ef2cbb3 --- /dev/null +++ b/kms/auth-eth/contracts/AppAuth.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import "./IAppAuth.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +contract AppAuth is + Initializable, + OwnableUpgradeable, + UUPSUpgradeable, + IAppAuth +{ + // App ID this contract is managing + address public appId; + + // Mapping of allowed compose hashes for this app + mapping(bytes32 => bool) public allowedComposeHashes; + + // State variable to track if upgrades are disabled + bool private _upgradesDisabled; + + // Events + event ComposeHashAdded(bytes32 composeHash); + event ComposeHashRemoved(bytes32 composeHash); + event UpgradesDisabled(); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + // Initialize the contract + function initialize( + address initialOwner, + address _appId, + bool _disableUpgrades + ) public initializer { + require(initialOwner != address(0), "Invalid owner address"); + require(_appId != address(0), "Invalid app ID"); + appId = _appId; + _upgradesDisabled = _disableUpgrades; + __Ownable_init(initialOwner); + __UUPSUpgradeable_init(); + } + + // Function to authorize upgrades (required by UUPSUpgradeable) + function _authorizeUpgrade(address) internal view override onlyOwner { + require(!_upgradesDisabled, "Upgrades are permanently disabled"); + } + + // Add a compose hash to allowed list + function addComposeHash(bytes32 composeHash) external onlyOwner { + allowedComposeHashes[composeHash] = true; + emit ComposeHashAdded(composeHash); + } + + // Remove a compose hash from allowed list + function removeComposeHash(bytes32 composeHash) external onlyOwner { + allowedComposeHashes[composeHash] = false; + emit ComposeHashRemoved(composeHash); + } + + // Check if an app is allowed to boot + function isAppAllowed( + IAppAuth.AppBootInfo calldata bootInfo + ) external view override returns (bool isAllowed, string memory reason) { + // Check if this controller is responsible for the app + if (bootInfo.appId != appId) { + return (false, "Wrong app controller"); + } + + // Check if compose hash is allowed + if (!allowedComposeHashes[bootInfo.composeHash]) { + return (false, "Compose hash not allowed"); + } + + return (true, ""); + } + + // Function to permanently disable upgrades + function disableUpgrades() external onlyOwner { + _upgradesDisabled = true; + emit UpgradesDisabled(); + } + + // Add storage gap for upgradeable contracts + uint256[50] private __gap; +} diff --git a/kms/auth-eth/contracts/IAppAuth.sol b/kms/auth-eth/contracts/IAppAuth.sol new file mode 100644 index 00000000..85dcc006 --- /dev/null +++ b/kms/auth-eth/contracts/IAppAuth.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IAppAuth { + struct AppBootInfo { + address appId; + bytes32 composeHash; + address instanceId; + bytes32 deviceId; + bytes32 mrAggregated; + bytes32 mrImage; + } + + function isAppAllowed(AppBootInfo calldata bootInfo) external view returns (bool isAllowed, string memory reason); +} diff --git a/kms/auth-eth/contracts/KmsAuth.sol b/kms/auth-eth/contracts/KmsAuth.sol new file mode 100644 index 00000000..9794a52d --- /dev/null +++ b/kms/auth-eth/contracts/KmsAuth.sol @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import "./IAppAuth.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +contract KmsAuth is Initializable, OwnableUpgradeable, UUPSUpgradeable, IAppAuth { + // Struct for KMS information + struct KmsInfo { + bytes k256Pubkey; + bytes caPubkey; + bytes quote; + bytes eventlog; + } + + // KMS information + KmsInfo public kmsInfo; + + // TProxy App ID + string public tproxyAppId; + + // Struct to store App configuration + struct AppConfig { + bool isRegistered; + address controller; + } + + // Mapping of registered apps + mapping(address => AppConfig) public apps; + + // Mapping of allowed aggregated MR measurements + mapping(bytes32 => bool) public allowedAggregatedMrs; + + // Mapping of allowed image measurements + mapping(bytes32 => bool) public allowedImages; + + // Mapping of allowed KMS compose hashes + mapping(bytes32 => bool) public allowedKmsComposeHashes; + + // Mapping of allowed KMS device IDs + mapping(bytes32 => bool) public allowedKmsDeviceIds; + + // Events + event AppRegistered(address appId); + event KmsInfoSet(bytes k256Pubkey); + event AggregatedMrRegistered(bytes32 mrAggregated); + event AggregatedMrDeregistered(bytes32 mrAggregated); + event ImageRegistered(bytes32 mrImage); + event ImageDeregistered(bytes32 mrImage); + event KmsComposeHashRegistered(bytes32 composeHash); + event KmsComposeHashDeregistered(bytes32 composeHash); + event KmsDeviceIdRegistered(bytes32 deviceId); + event KmsDeviceIdDeregistered(bytes32 deviceId); + event TproxyAppIdSet(string tproxyAppId); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + // Initialize the contract with the owner wallet address + function initialize(address initialOwner) public initializer { + __Ownable_init(initialOwner); + __UUPSUpgradeable_init(); + } + + // Function to authorize upgrades (required by UUPSUpgradeable) + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} + + // Function to set KMS information + function setKmsInfo(KmsInfo memory info) external onlyOwner { + kmsInfo = info; + emit KmsInfoSet(info.k256Pubkey); + } + + // Function to set KMS quote + function setKmsQuote(bytes memory quote) external onlyOwner { + kmsInfo.quote = quote; + } + + // Function to set KMS eventlog + function setKmsEventlog(bytes memory eventlog) external onlyOwner { + kmsInfo.eventlog = eventlog; + } + + // Function to set trusted TProxy App ID + function setTproxyAppId(string memory appId) external onlyOwner { + tproxyAppId = appId; + emit TproxyAppIdSet(appId); + } + + // Function to calculate the app ID + function calculateAppId( + address sender, + bytes32 salt + ) public pure returns (address appId) { + bytes32 fullHash = keccak256(abi.encodePacked(sender, salt)); + return address(uint160(uint256(fullHash))); + } + + // Function to register an app + function registerApp(bytes32 salt, address controller) external { + require(controller != address(0), "Invalid controller address"); + address appId = calculateAppId(msg.sender, salt); + require(!apps[appId].isRegistered, "App already registered"); + apps[appId].isRegistered = true; + apps[appId].controller = controller; + emit AppRegistered(appId); + } + + // Function to register an aggregated MR measurement + function registerAggregatedMr(bytes32 mrAggregated) external onlyOwner { + allowedAggregatedMrs[mrAggregated] = true; + emit AggregatedMrRegistered(mrAggregated); + } + + // Function to deregister an aggregated MR measurement + function deregisterAggregatedMr(bytes32 mrAggregated) external onlyOwner { + allowedAggregatedMrs[mrAggregated] = false; + emit AggregatedMrDeregistered(mrAggregated); + } + + // Function to register an image measurement + function registerImage(bytes32 mrImage) external onlyOwner { + allowedImages[mrImage] = true; + emit ImageRegistered(mrImage); + } + + // Function to deregister an image measurement + function deregisterImage(bytes32 mrImage) external onlyOwner { + allowedImages[mrImage] = false; + emit ImageDeregistered(mrImage); + } + + // Function to register a KMS compose hash + function registerKmsComposeHash(bytes32 composeHash) external onlyOwner { + allowedKmsComposeHashes[composeHash] = true; + emit KmsComposeHashRegistered(composeHash); + } + + // Function to deregister a KMS compose hash + function deregisterKmsComposeHash(bytes32 composeHash) external onlyOwner { + allowedKmsComposeHashes[composeHash] = false; + emit KmsComposeHashDeregistered(composeHash); + } + + // Function to register a KMS device ID + function registerKmsDeviceId(bytes32 deviceId) external onlyOwner { + allowedKmsDeviceIds[deviceId] = true; + emit KmsDeviceIdRegistered(deviceId); + } + + // Function to deregister a KMS device ID + function deregisterKmsDeviceId(bytes32 deviceId) external onlyOwner { + allowedKmsDeviceIds[deviceId] = false; + emit KmsDeviceIdDeregistered(deviceId); + } + + // Function to check if KMS is allowed to boot + function isKmsAllowed( + AppBootInfo calldata bootInfo + ) external view returns (bool isAllowed, string memory reason) { + // Check if the aggregated MR is allowed + if (!allowedAggregatedMrs[bootInfo.mrAggregated]) { + return (false, "Aggregated MR not allowed"); + } + + // Check if the KMS compose hash is allowed + if (!allowedKmsComposeHashes[bootInfo.composeHash]) { + return (false, "KMS compose hash not allowed"); + } + + // Check if the KMS device ID is allowed + if (!allowedKmsDeviceIds[bootInfo.deviceId]) { + return (false, "KMS is not allowed to boot on this device"); + } + + return (true, ""); + } + + // Function to check if an app is allowed to boot + function isAppAllowed( + AppBootInfo calldata bootInfo + ) external view override returns (bool isAllowed, string memory reason) { + // Check if app is registered + if (!apps[bootInfo.appId].isRegistered) { + return (false, "App not registered"); + } + + // Check aggregated MR and image measurements + if ( + !allowedAggregatedMrs[bootInfo.mrAggregated] && + !allowedImages[bootInfo.mrImage] + ) { + return (false, "Neither aggregated MR nor image is allowed"); + } + + // Ask the app controller if the app is allowed to boot + address controller = apps[bootInfo.appId].controller; + if (controller == address(0)) { + return (false, "App controller not set"); + } + return IAppAuth(controller).isAppAllowed(bootInfo); + } + + // Add storage gap for upgradeable contracts + uint256[50] private __gap; +} diff --git a/kms/auth-eth/hardhat.config.ts b/kms/auth-eth/hardhat.config.ts new file mode 100644 index 00000000..de1c958a --- /dev/null +++ b/kms/auth-eth/hardhat.config.ts @@ -0,0 +1,363 @@ +import "@openzeppelin/hardhat-upgrades"; +import { HardhatUserConfig, task, types } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@nomicfoundation/hardhat-ethers"; +import fs from 'fs'; +import { deployContract } from "./scripts/deploy"; +import { upgradeContract } from "./scripts/upgrade"; +import { accountBalance } from "./lib/deployment-helpers"; + +const PRIVATE_KEY = process.env.PRIVATE_KEY || "0x0000000000000000000000000000000000000000000000000000000000000000"; + +const config: HardhatUserConfig = { + solidity: { + version: "0.8.22", + settings: { + optimizer: { + enabled: true, + runs: 200 + } + } + }, + defaultNetwork: "hardhat", + networks: { + hardhat: { + chainId: 1337 + }, + phala: { + url: 'https://rpc.phala.network', + accounts: [PRIVATE_KEY], + }, + sepolia: { + url: `https://eth-sepolia.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`, + accounts: [PRIVATE_KEY], + }, + }, + paths: { + sources: "./contracts", + tests: "./test", + cache: "./cache", + artifacts: "./artifacts" + }, + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY + } +}; + +export default config; + +// Contract addresses from environment +const KMS_CONTRACT_ADDRESS = process.env.KMS_CONTRACT_ADDRESS || "0xda1d4bc372fe139d63b85f6160d2f849ffed9c10"; + +async function waitTx(tx: any) { + console.log(`Waiting for transaction ${tx.hash} to be confirmed...`); + return await tx.wait(); +} + +async function getKmsAuth(ethers: any) { + return await ethers.getContractAt("KmsAuth", KMS_CONTRACT_ADDRESS); +} + +async function getAppAuth(ethers: any, appId: string) { + const kmsAuth = await getKmsAuth(ethers); + const controller = (await kmsAuth.apps(appId)).controller; + console.log("AppAuth address:", controller); + return await ethers.getContractAt("AppAuth", controller); +} + +// KMS Contract Tasks +task("kms:deploy", "Deploy the KmsAuth contract") + .setAction(async (_, hre) => { + const { ethers } = hre; + const [deployer] = await ethers.getSigners(); + const deployerAddress = await deployer.getAddress(); + console.log("Deploying with account:", deployerAddress); + console.log("Account balance:", await accountBalance(ethers, deployerAddress)); + await deployContract(hre, "KmsAuth", [deployerAddress]); + }); + +task("kms:upgrade", "Upgrade the KmsAuth contract") + .addParam("address", "The address of the contract to upgrade", undefined, types.string, false) + .addFlag("dryRun", "Simulate the upgrade without executing it") + .setAction(async (taskArgs, hre) => { + await upgradeContract(hre, "KmsAuth", taskArgs.address, taskArgs.dryRun); + }); + +task("kms:set-info", "Set KMS information") + .addParam("k256Pubkey", "K256 public key") + .addParam("caPubkey", "CA public key") + .addParam("quote", "Quote") + .addParam("eventlog", "Event log") + .setAction(async ({ k256Pubkey, caPubkey, quote, eventlog }, { ethers }) => { + const contract = await getKmsAuth(ethers); + const tx = await contract.setKmsInfo({ k256Pubkey, caPubkey, quote, eventlog }); + await waitTx(tx); + console.log("KMS info set successfully"); + }); + +task("kms:set-info-file", "Set KMS information from file") + .addPositionalParam("file", "File path") + .setAction(async ({ file }, { ethers }) => { + const contract = await getKmsAuth(ethers); + const fileContent = fs.readFileSync(file, 'utf8'); + const tx = await contract.setKmsInfo(JSON.parse(fileContent)); + await waitTx(tx); + console.log("KMS info set successfully"); + }); + +task("kms:set-tproxy", "Set the allowed TProxy App ID") + .addPositionalParam("appId", "TProxy App ID") + .setAction(async ({ appId }, { ethers }) => { + const contract = await getKmsAuth(ethers); + const tx = await contract.setTproxyAppId(appId); + await waitTx(tx); + console.log("TProxy App ID set successfully"); + }); + +task("app:add-hash", "Add a compose hash to the AppAuth contract") + .addParam("appId", "App ID") + .addPositionalParam("hash", "Compose hash to add") + .setAction(async ({ appId, hash }, { ethers }) => { + const appAuth = await getAppAuth(ethers, appId); + const tx = await appAuth.addComposeHash(hash); + await waitTx(tx); + console.log("Compose hash added successfully"); + }); + +task("app:remove-hash", "Remove a compose hash from the AppAuth contract") + .addParam("appId", "App ID") + .addPositionalParam("hash", "Compose hash to remove") + .setAction(async ({ appId, hash }, { ethers }) => { + const appAuth = await getAppAuth(ethers, appId); + const tx = await appAuth.removeComposeHash(hash); + await waitTx(tx); + console.log("Compose hash removed successfully"); + }); + +// Mr Management Tasks +task("kms:register-aggregated-mr", "Register an aggregated MR measurement") + .addPositionalParam("mrAggregated", "Aggregated MR measurement") + .setAction(async ({ mrAggregated }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const tx = await kmsAuth.registerAggregatedMr(mrAggregated); + await waitTx(tx); + console.log("Aggregated MR registered successfully"); + }); + +task("kms:deregister-aggregated-mr", "Deregister an aggregated MR measurement") + .addPositionalParam("mrAggregated", "Aggregated MR measurement") + .setAction(async ({ mrAggregated }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const tx = await kmsAuth.deregisterAggregatedMr(mrAggregated); + await waitTx(tx); + console.log("Aggregated MR deregistered successfully"); + }); + +// Image Management Tasks +task("kms:register-image", "Register an image measurement") + .addPositionalParam("mrImage", "Image measurement") + .setAction(async ({ mrImage }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const tx = await kmsAuth.registerImage(mrImage); + await waitTx(tx); + console.log("Image registered successfully"); + }); + +task("kms:deregister-image", "Deregister an image measurement") + .addPositionalParam("mrImage", "Image measurement") + .setAction(async ({ mrImage }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const tx = await kmsAuth.deregisterImage(mrImage); + await waitTx(tx); + console.log("Image deregistered successfully"); + }); + +// Device Management Tasks +task("kms:register-device", "Register a device ID") + .addPositionalParam("deviceId", "Device ID to register") + .setAction(async ({ deviceId }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const hashedId = ethers.keccak256(ethers.toUtf8Bytes(deviceId)); + const tx = await kmsAuth.registerKmsDeviceId(hashedId); + await waitTx(tx); + console.log("Device ID registered successfully"); + }); + +task("kms:deregister-device", "Deregister a device ID") + .addPositionalParam("deviceId", "Device ID to deregister") + .setAction(async ({ deviceId }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const hashedId = ethers.keccak256(ethers.toUtf8Bytes(deviceId)); + const tx = await kmsAuth.deregisterKmsDeviceId(hashedId); + await waitTx(tx); + console.log("Device ID deregistered successfully"); + }); + +task("kms:add-hash", "Add a compose hash of an KMS instance") + .addPositionalParam("hash", "Compose hash to add") + .setAction(async ({ hash }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const tx = await kmsAuth.registerKmsComposeHash(hash); + await waitTx(tx); + console.log("KMS compose hash added successfully"); + }); + +task("kms:add-device", "Add a device ID of an KMS instance") + .addPositionalParam("deviceId", "Device ID") + .setAction(async ({ deviceId }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const tx = await kmsAuth.registerKmsDeviceId(deviceId); + await waitTx(tx); + console.log("Device compose hash added successfully"); + }); + +// Status Check Tasks +task("check:app", "Check if an app is allowed to boot") + .addParam("appId", "App ID to check") + .addParam("mrAggregated", "Aggregated MR measurement") + .addParam("mrImage", "Image measurement") + .addParam("composeHash", "Compose hash") + .setAction(async ({ appId, mrAggregated, mrImage, composeHash }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const [isAllowed, reason] = await kmsAuth.isAppAllowed({ + appId, + mrAggregated, + mrImage, + composeHash, + deviceId: ethers.ZeroHash, + instanceId: ethers.ZeroAddress + }); + console.log("Is allowed:", isAllowed); + console.log("Reason:", reason); + }); + +task("check:kms", "Check if KMS is allowed to boot") + .addParam("mrAggregated", "Aggregated MR measurement") + .addParam("composeHash", "Compose hash") + .addParam("deviceId", "Device ID") + .setAction(async ({ mrAggregated, composeHash, deviceId }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const hashedId = ethers.keccak256(ethers.toUtf8Bytes(deviceId)); + const [isAllowed, reason] = await kmsAuth.isKmsAllowed({ + mrAggregated, + composeHash, + deviceId: hashedId, + mrImage: ethers.ZeroHash, + appId: ethers.ZeroAddress, + instanceId: ethers.ZeroAddress + }); + console.log("Is allowed:", isAllowed); + console.log("Reason:", reason); + }); + +// Additional Status Check Tasks +task("check:app-id") + .addPositionalParam("appId", "App ID to check") + .setAction(async ({ appId }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const isRegistered = (await kmsAuth.apps(appId)).isRegistered; + console.log("App ID is registered:", isRegistered); + }); + +task("check:mr-aggregated") + .addPositionalParam("mrAggregated", "MR Aggregated measurement to check") + .setAction(async ({ mrAggregated }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const isRegistered = await kmsAuth.allowedEnclaves(mrAggregated); + console.log("MR Aggregated measurement is registered:", isRegistered); + }); + +task("check:image") + .addPositionalParam("mrImage", "Image measurement to check") + .setAction(async ({ mrImage }, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const isRegistered = await kmsAuth.allowedImages(mrImage); + console.log("Image measurement is registered:", isRegistered); + }); + +task("check:app-hash") + .addParam("appId", "App ID") + .addPositionalParam("hash", "Compose hash to check") + .setAction(async ({ appId, hash }, { ethers }) => { + const appAuth = await getAppAuth(ethers, appId); + const isAllowed = await appAuth.allowedComposeHashes(hash); + console.log("Compose hash is allowed:", isAllowed); + }); + +// Info Query Tasks +task("info:owner", "Get current contract owner") + .setAction(async (_, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const owner = await kmsAuth.owner(); + console.log("Contract owner:", owner); + }); + +task("info:kms", "Get current KMS information") + .setAction(async (_, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const kmsInfo = await kmsAuth.kmsInfo(); + console.log("KMS Info:", { + k256Pubkey: kmsInfo.k256Pubkey, + caPubkey: kmsInfo.caPubkey, + quote: kmsInfo.quote + }); + }); + +task("info:tproxy", "Get current TProxy App ID") + .setAction(async (_, { ethers }) => { + const kmsAuth = await getKmsAuth(ethers); + const appId = await kmsAuth.tproxyAppId(); + console.log("TProxy App ID:", appId); + }); + +task("app:deploy", "Deploy AppAuth with a UUPS proxy") + .addPositionalParam("salt", "Salt for app deployment") + .setAction(async ({ salt }, hre) => { + const { ethers, upgrades } = hre; + const [deployer] = await ethers.getSigners(); + const deployerAddress = await deployer.getAddress(); + console.log("Deploying with account:", deployerAddress); + console.log("Account balance:", await accountBalance(ethers, deployerAddress)); + + // Calculate app ID + const saltHash = ethers.keccak256(ethers.toUtf8Bytes(salt)); + const fullHash = ethers.keccak256( + ethers.solidityPacked( + ['address', 'bytes32'], + [deployerAddress, saltHash] + ) + ); + const appId = ethers.getAddress('0x' + fullHash.slice(-40)); + console.log("App ID:", appId); + + const appAuth = await deployContract(hre, "AppAuth", [deployerAddress, appId, false]); + if (!appAuth) { + return; + } + + const proxyAddress = await appAuth.getAddress(); + const kmsContract = await getKmsAuth(ethers); + const tx = await kmsContract.registerApp(saltHash, proxyAddress); + const receipt = await waitTx(tx); + // Parse the AppRegistered event from the logs + const appRegisteredEvent = receipt.logs + .filter((log: any) => log.fragment?.name === 'AppRegistered') + .map((log: any) => { + const { appId } = log.args; + return { appId }; + })[0]; + + if (appRegisteredEvent) { + console.log("App registered in KMS successfully"); + console.log("Registered AppId:", appRegisteredEvent.appId); + } else { + console.log("App registered in KMS successfully (event not found)"); + } + }); + +task("app:upgrade", "Upgrade the AppAuth contract") + .addParam("address", "The address of the contract to upgrade", undefined, types.string, false) + .addFlag("dryRun", "Simulate the upgrade without executing it") + .setAction(async (taskArgs, hre) => { + await upgradeContract(hre, "AppAuth", taskArgs.address, taskArgs.dryRun); + }); \ No newline at end of file diff --git a/kms/auth-eth/jest.config.js b/kms/auth-eth/jest.config.js new file mode 100644 index 00000000..0071838d --- /dev/null +++ b/kms/auth-eth/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + roots: ['/src', '/test'], + testMatch: ['**/*.test.ts'], + moduleFileExtensions: ['ts', 'js', 'json', 'node'], + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/**/*.d.ts' + ], + coverageDirectory: 'coverage', + verbose: true, + setupFilesAfterEnv: ['/test/setup.ts'] +}; diff --git a/kms/auth-eth/jest.integration.config.js b/kms/auth-eth/jest.integration.config.js new file mode 100644 index 00000000..430feb1f --- /dev/null +++ b/kms/auth-eth/jest.integration.config.js @@ -0,0 +1,8 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/*.integration.test.ts'], + setupFilesAfterEnv: ['/test/setup.ts'], + testTimeout: 30000, // Increase timeout for blockchain operations +}; diff --git a/kms/auth-eth/lib/deployment-helpers.ts b/kms/auth-eth/lib/deployment-helpers.ts new file mode 100644 index 00000000..d0a447c5 --- /dev/null +++ b/kms/auth-eth/lib/deployment-helpers.ts @@ -0,0 +1,229 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import * as readline from 'readline'; + +/** + * Helper function to prompt for user confirmation + */ +export async function confirmAction(question: string): Promise { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + return new Promise((resolve) => { + rl.question(`${question} (y/N) `, (answer) => { + rl.close(); + resolve(answer.toLowerCase() === 'y'); + }); + }); +} + +/** + * Get and display network information + */ +export async function logNetworkInfo(hre: HardhatRuntimeEnvironment) { + const network = await hre.ethers.provider.getNetwork(); + console.log("Network:", { + name: network.name, + chainId: network.chainId.toString(), + // @ts-ignore - different network configs might have different properties + rpcUrl: hre.network.config.rpcUrls?.[0] || + // @ts-ignore - different network configs might have different properties + hre.network.config.url || + "default hardhat network" + }); + return network; +} + +/** + * Get the signer + */ +export async function getSigner(hre: HardhatRuntimeEnvironment) { + const [deployer] = await hre.ethers.getSigners(); + return deployer; +} + +/** + * Get and display account information + */ +export async function accountBalance(ethers: any, address: string) { + return ethers.formatEther( + await ethers.provider.getBalance(address) + ); +} + +/** + * Estimate and display deployment costs + */ +export async function estimateDeploymentCost( + hre: HardhatRuntimeEnvironment, + contractName: string, + initializerArgs: any[] = [] +) { + console.log("Estimating deployment costs..."); + const factory = await hre.ethers.getContractFactory(contractName); + + // Get the data for initialize function + const initData = factory.interface.encodeFunctionData( + "initialize", + initializerArgs + ); + + // Estimate gas for deployment transaction + const deploymentGas = await hre.ethers.provider.estimateGas({ + data: factory.bytecode + }); + + // Estimate gas for initialization + const initGas = await hre.ethers.provider.estimateGas({ + to: hre.ethers.ZeroAddress, // This is just a placeholder + data: initData + }); + + // Add some buffer for proxy deployment + const totalEstimatedGas = deploymentGas + initGas + BigInt(206053); // Buffer for proxy overhead + + const feeData = await hre.ethers.provider.getFeeData(); + const gasPrice = feeData.gasPrice || BigInt(0); + const estimatedCost = totalEstimatedGas * gasPrice; + + console.log("Deployment details:", { + estimatedGas: deploymentGas.toString(), + gasPrice: gasPrice ? hre.ethers.formatUnits(gasPrice, "gwei") + " gwei" : "unknown", + estimatedCost: hre.ethers.formatEther(estimatedCost) + " ETH" + }); + + // Convert to ETH for better readability + const estimatedEth = hre.ethers.formatEther(estimatedCost); + console.log(`Estimated deployment cost: ${estimatedEth} ETH`); + + return { + estimatedGas: totalEstimatedGas, + gasPrice, + estimatedCost, + estimatedEth + }; +} + +/** + * Verify contract deployment + */ +export async function verifyDeployment( + hre: HardhatRuntimeEnvironment, + contractAddress: string, + quiet: boolean = false +) { + // Verify that contract was deployed successfully + const code = await hre.ethers.provider.getCode(contractAddress); + if (code === '0x') { + throw new Error('Contract deployment failed - no code at address'); + } + + // Get implementation contract address + const implementationAddress = await hre.upgrades.erc1967.getImplementationAddress( + contractAddress + ); + if (!quiet) { + console.log("Implementation deployed to:", implementationAddress); + } + + return { + contractAddress, + implementationAddress + }; +} + +/** + * Prepare an upgrade and get information about the new implementation + */ +export async function prepareContractUpgrade( + hre: HardhatRuntimeEnvironment, + proxyAddress: string, + contractName: string, + kind: 'uups' | 'transparent' | 'beacon' = 'uups' +) { + // Get current implementation address + const currentImplementationAddress = await hre.upgrades.erc1967.getImplementationAddress(proxyAddress); + console.log("Current implementation address:", currentImplementationAddress); + + // Get the new implementation contract factory + const ContractFactory = await hre.ethers.getContractFactory(contractName); + + // Get the new implementation address + const newImplementationAddress = await hre.upgrades.prepareUpgrade( + proxyAddress, + ContractFactory, + { kind } + ); + console.log("New implementation address:", newImplementationAddress); + + // Get the proxy contract instance + const proxyContract = await hre.ethers.getContractAt(contractName, proxyAddress); + + // Create the upgrade transaction data (for UUPS proxies) + const upgradeTx = await proxyContract.interface.encodeFunctionData( + "upgradeToAndCall", + [newImplementationAddress, "0x"] + ); + + return { + currentImplementationAddress, + newImplementationAddress, + proxyContract, + upgradeTx + }; +} + +/** + * Estimate the gas cost for a contract upgrade + */ +export async function estimateUpgradeCost( + hre: HardhatRuntimeEnvironment, + proxyAddress: string, + upgradeTx: string +) { + const provider = hre.ethers.provider; + const feeData = await provider.getFeeData(); + const gasPrice = feeData.gasPrice || BigInt(0); + + // Estimate gas for the upgrade transaction + const gasLimit = await provider.estimateGas({ + to: proxyAddress, + data: upgradeTx + }); + + const gasCost = gasPrice * gasLimit; + const gasCostInEth = hre.ethers.formatEther(gasCost); + console.log("Estimated gas cost for upgrade:", gasCostInEth, "ETH"); + + return { + gasLimit, + gasPrice, + gasCost, + gasCostInEth + }; +} + +/** + * Execute a contract upgrade + */ +export async function executeContractUpgrade( + hre: HardhatRuntimeEnvironment, + proxyAddress: string, + contractName: string, + kind: 'uups' | 'transparent' | 'beacon' = 'uups' +) { + // Get the contract factory + const ContractFactory = await hre.ethers.getContractFactory(contractName); + + // Upgrade the proxy to the new implementation + console.log(`Upgrading ${contractName} at ${proxyAddress}...`); + const upgraded = await hre.upgrades.upgradeProxy(proxyAddress, ContractFactory, { + kind + }); + + await upgraded.waitForDeployment(); + console.log(`${contractName} upgraded at proxy address:`, await upgraded.getAddress()); + + return upgraded; +} \ No newline at end of file diff --git a/kms/auth-eth/package-lock.json b/kms/auth-eth/package-lock.json new file mode 100644 index 00000000..e2e63a24 --- /dev/null +++ b/kms/auth-eth/package-lock.json @@ -0,0 +1,13441 @@ +{ + "name": "auth-eth", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "auth-eth", + "version": "1.0.0", + "dependencies": { + "@fastify/swagger": "^8.12.0", + "@fastify/swagger-ui": "^2.0.1", + "@openzeppelin/contracts-upgradeable": "^5.2.0", + "dotenv": "^16.3.1", + "ethers": "^6.9.0", + "fastify": "^4.24.3", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@openzeppelin/hardhat-upgrades": "^3.9.0", + "@types/jest": "^29.5.14", + "@types/node": "^20.17.12", + "@types/supertest": "^6.0.2", + "hardhat": "^2.22.17", + "jest": "^29.7.0", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.3.3" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.750.0.tgz", + "integrity": "sha512-lSfKdMBXaSQOh48hleRJEKuVO1wQBOgPIonRkCPU5bpagZckWyeD8p8XSgdF6p22lZZUPuasS6+PEJ6knSYNDQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/eventstream-serde-browser": "^4.0.1", + "@smithy/eventstream-serde-config-resolver": "^4.0.1", + "@smithy/eventstream-serde-node": "^4.0.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-stream": "^4.1.1", + "@smithy/util-utf8": "^4.0.0", + "@smithy/util-waiter": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.750.0.tgz", + "integrity": "sha512-y0Rx6pTQXw0E61CaptpZF65qNggjqOgymq/RYZU5vWba5DGQ+iqGt8Yq8s+jfBoBBNXshxq8l8Dl5Uq/JTY1wg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.750.0.tgz", + "integrity": "sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.4", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.750.0.tgz", + "integrity": "sha512-In6bsG0p/P31HcH4DBRKBbcDS/3SHvEPjfXV8ODPWZO/l3/p7IRoYBdQ07C9R+VMZU2D0+/Sc/DWK/TUNDk1+Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.750.0.tgz", + "integrity": "sha512-wFB9qqfa20AB0dElsQz5ZlZT5o+a+XzpEpmg0erylmGYqEOvh8NQWfDUVpRmQuGq9VbvW/8cIbxPoNqEbPtuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.750.0.tgz", + "integrity": "sha512-2YIZmyEr5RUd3uxXpxOLD9G67Bibm4I/65M6vKFP17jVMUT+R1nL7mKqmhEVO2p+BoeV+bwMyJ/jpTYG368PCg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.750.0.tgz", + "integrity": "sha512-THWHHAceLwsOiowPEmKyhWVDlEUxH07GHSw5AQFDvNQtGKOQl0HSIFO1mKObT2Q2Vqzji9Bq8H58SO5BFtNPRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-ini": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.750.0.tgz", + "integrity": "sha512-Q78SCH1n0m7tpu36sJwfrUSxI8l611OyysjQeMiIOliVfZICEoHcLHLcLkiR+tnIpZ3rk7d2EQ6R1jwlXnalMQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.750.0.tgz", + "integrity": "sha512-FGYrDjXN/FOQVi/t8fHSv8zCk+NEvtFnuc4cZUj5OIbM4vrfFc5VaPyn41Uza3iv6Qq9rZg0QOwWnqK8lNrqUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.750.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/token-providers": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.750.0.tgz", + "integrity": "sha512-Nz8zs3YJ+GOTSrq+LyzbbC1Ffpt7pK38gcOyNZv76pP5MswKTUKNYBJehqwa+i7FcFQHsCk3TdhR8MT1ZR23uA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.750.0.tgz", + "integrity": "sha512-YYcslDsP5+2NZoN3UwuhZGkhAHPSli7HlJHBafBrvjGV/I9f8FuOO1d1ebxGdEP4HyRXUGyh+7Ur4q+Psk0ryw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@smithy/core": "^3.1.4", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.750.0.tgz", + "integrity": "sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.750.0.tgz", + "integrity": "sha512-X/KzqZw41iWolwNdc8e3RMcNSMR364viHv78u6AefXOO5eRM40c4/LuST1jDzq35/LpnqRhL7/MuixOetw+sFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.743.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz", + "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", + "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.750.0.tgz", + "integrity": "sha512-84HJj9G9zbrHX2opLk9eHfDceB+UIHVrmflMzWHpsmo9fDuro/flIBqaVDlE021Osj6qIM0SJJcnL6s23j7JEw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.0.tgz", + "integrity": "sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@fastify/accept-negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", + "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@fastify/send": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", + "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", + "license": "MIT", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "escape-html": "~1.0.3", + "fast-decode-uri-component": "^1.0.1", + "http-errors": "2.0.0", + "mime": "^3.0.0" + } + }, + "node_modules/@fastify/static": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-6.12.0.tgz", + "integrity": "sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==", + "license": "MIT", + "dependencies": { + "@fastify/accept-negotiator": "^1.0.0", + "@fastify/send": "^2.0.0", + "content-disposition": "^0.5.3", + "fastify-plugin": "^4.0.0", + "glob": "^8.0.1", + "p-limit": "^3.1.0" + } + }, + "node_modules/@fastify/swagger": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@fastify/swagger/-/swagger-8.15.0.tgz", + "integrity": "sha512-zy+HEEKFqPMS2sFUsQU5X0MHplhKJvWeohBwTCkBAJA/GDYGLGUWQaETEhptiqxK7Hs0fQB9B4MDb3pbwIiCwA==", + "license": "MIT", + "dependencies": { + "fastify-plugin": "^4.0.0", + "json-schema-resolver": "^2.0.0", + "openapi-types": "^12.0.0", + "rfdc": "^1.3.0", + "yaml": "^2.2.2" + } + }, + "node_modules/@fastify/swagger-ui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/swagger-ui/-/swagger-ui-2.1.0.tgz", + "integrity": "sha512-mu0C28kMEQDa3miE8f3LmI/OQSmqaKS3dYhZVFO5y4JdgBIPbzZj6COCoRU/P/9nu7UogzzcCJtg89wwLwKtWg==", + "license": "MIT", + "dependencies": { + "@fastify/static": "^6.0.0", + "fastify-plugin": "^4.0.0", + "openapi-types": "^12.0.2", + "rfdc": "^1.3.0", + "yaml": "^2.2.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/edr": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", + "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.6.5", + "@nomicfoundation/edr-darwin-x64": "0.6.5", + "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", + "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", + "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", + "@nomicfoundation/edr-linux-x64-musl": "0.6.5", + "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", + "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", + "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", + "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", + "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", + "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", + "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", + "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz", + "integrity": "sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "chai": "^4.2.0", + "ethers": "^6.1.0", + "hardhat": "^2.9.4" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz", + "integrity": "sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz", + "integrity": "sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz", + "integrity": "sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=16.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.3.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz", + "integrity": "sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.1.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomicfoundation/slang": { + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/slang/-/slang-0.18.3.tgz", + "integrity": "sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bytecodealliance/preview2-shim": "0.17.0" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@openzeppelin/contracts": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.2.0.tgz", + "integrity": "sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==", + "license": "MIT", + "peer": true + }, + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.2.0.tgz", + "integrity": "sha512-mZIu9oa4tQTlGiOJHk6D3LdJlqFqF6oNOSn6S6UVJtzfs9UsY9/dhMEbAVTwElxUtJnjpf6yA062+oBp+eOyPg==", + "license": "MIT", + "peerDependencies": { + "@openzeppelin/contracts": "5.2.0" + } + }, + "node_modules/@openzeppelin/defender-sdk-base-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-2.2.0.tgz", + "integrity": "sha512-aZm8aP7HCcaczzO54JiOVZ6kmwoog1qmajwDGU+DJGshszYwy2x3TRtnRG1tyfAXmeu8yNSOpP5N+fuTt8X5rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aws-sdk/client-lambda": "^3.563.0", + "amazon-cognito-identity-js": "^6.3.6", + "async-retry": "^1.3.3" + } + }, + "node_modules/@openzeppelin/defender-sdk-deploy-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-2.2.0.tgz", + "integrity": "sha512-7LWY6DwHOjI0VlgvAVbPV4udWm3Q4de58EMLQvm1DG6eAaXIIZtfd3tV4mk6MYVLgBaiRbtSX0L9F9LH4p17OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.2.0", + "axios": "^1.7.4", + "lodash": "^4.17.21" + } + }, + "node_modules/@openzeppelin/defender-sdk-network-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-2.2.0.tgz", + "integrity": "sha512-d8sCjRBTEek+LKog2zVY3rtYVN8BsVGFcEh5g6VLJV3Ljmdf5SppjP6WPFlD7+IRKqmpiZ3R4EdzuhqOKMKKMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.2.0", + "axios": "^1.7.4", + "lodash": "^4.17.21" + } + }, + "node_modules/@openzeppelin/hardhat-upgrades": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.9.0.tgz", + "integrity": "sha512-7YYBSxRnO/X+tsQkVgtz3/YbwZuQPjbjQ3m0A/8+vgQzdPfulR93NaFKgZfMonnrriXb5O/ULjIDPI+8nuqtyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.1.0", + "@openzeppelin/defender-sdk-deploy-client": "^2.1.0", + "@openzeppelin/defender-sdk-network-client": "^2.1.0", + "@openzeppelin/upgrades-core": "^1.41.0", + "chalk": "^4.1.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.1.5", + "proper-lockfile": "^4.1.1", + "undici": "^6.11.1" + }, + "bin": { + "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "ethers": "^6.6.0", + "hardhat": "^2.0.2" + }, + "peerDependenciesMeta": { + "@nomicfoundation/hardhat-verify": { + "optional": true + } + } + }, + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/undici": { + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz", + "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.42.1.tgz", + "integrity": "sha512-8qnz2XfQrco8R8u9NjV+KiSLrVn7DnWFd+3BuhTUjhVy0bzCSu2SMKCVpZLtXbxf4f2dpz8jYPQYRa6s23PhLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/slang": "^0.18.3", + "cbor": "^10.0.0", + "chalk": "^4.1.0", + "compare-versions": "^6.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "minimatch": "^9.0.5", + "minimist": "^1.2.7", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.51" + }, + "bin": { + "openzeppelin-upgrades-core": "dist/cli/cli.js" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.3.tgz", + "integrity": "sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nofilter": "^3.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.5.tgz", + "integrity": "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", + "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", + "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", + "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", + "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", + "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.6.tgz", + "integrity": "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.7.tgz", + "integrity": "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.3.tgz", + "integrity": "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.6.tgz", + "integrity": "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.7.tgz", + "integrity": "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.7.tgz", + "integrity": "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.2.tgz", + "integrity": "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz", + "integrity": "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", + "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@typechain/ethers-v6": "^0.5.1", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.2" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.6.tgz", + "integrity": "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/node": { + "version": "20.17.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.12.tgz", + "integrity": "sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", + "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", + "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/amazon-cognito-identity-js": { + "version": "6.3.12", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz", + "integrity": "sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "1.2.2", + "buffer": "4.9.2", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", + "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^1.2.2", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", + "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "license": "BSD-3-Clause OR MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "license": "MIT", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", + "dev": true, + "license": "WTFPL", + "peer": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "peer": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.78", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.78.tgz", + "integrity": "sha512-UmwIt7HRKN1rsJfddG5UG7rCTCTAKoS9JeOy/R0zSenAyaZ8SU3RuXlwcratxhdxGRNpk03iq8O7BA3W7ibLVw==", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^5.7.2", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^10.2.0", + "req-cwd": "^2.0.0", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } + } + }, + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", + "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "deprecated": "This library has been deprecated and usage is discouraged.", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", + "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "license": "MIT" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastify": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.29.0.tgz", + "integrity": "sha512-MaaUHUGcCgC8fXQDsDtioaCcag1fmPJ9j64vAKunqZF4aSub040ZGi/ag8NGE2714yREPOKZuHCfpPzuUD3UQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.2.tgz", + "integrity": "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hardhat": { + "version": "2.22.17", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", + "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/edr": "^0.6.5", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", + "chokidar": "^4.0.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^5.0.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "json-stream-stringify": "^3.1.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "picocolors": "^1.1.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.8.26", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.6", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz", + "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/hardhat/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-resolver/-/json-schema-resolver-2.0.0.tgz", + "integrity": "sha512-pJ4XLQP4Q9HTxl6RVDLJ8Cyh1uitSs0CzDBAz1uoJ4sRD/Bk7cFSXL1FUXDW3zJ7YnfliJx6eu8Jn283bpZ4Yg==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "rfdc": "^1.1.4", + "uri-js": "^4.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/Eomm/json-schema-resolver?sponsor=1" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-stream-stringify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=7.10.1" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/light-my-request": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.14.0.tgz", + "integrity": "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==", + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^0.7.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true, + "peer": true + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pino": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "peer": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "license": "MIT", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sc-istanbul/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true, + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/secp256k1/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secp256k1/node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/solc": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", + "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solidity-ast": { + "version": "0.4.59", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.59.tgz", + "integrity": "sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/solidity-coverage": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", + "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.19.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.21", + "mocha": "^10.2.0", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", + "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/solidity-coverage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/solidity-coverage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "license": "WTFPL OR MIT", + "peer": true + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.1.tgz", + "integrity": "sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supertest": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.1.2" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", + "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web3-utils": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", + "dev": true, + "license": "LGPL-3.0", + "peer": true, + "dependencies": { + "@ethereumjs/util": "^8.1.0", + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereum-cryptography": "^2.1.2", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/kms/auth-eth/package.json b/kms/auth-eth/package.json new file mode 100644 index 00000000..e2fd79d9 --- /dev/null +++ b/kms/auth-eth/package.json @@ -0,0 +1,38 @@ +{ + "name": "auth-eth", + "version": "1.0.0", + "description": "DStack KMS Ethereum Backend", + "main": "dist/main.js", + "scripts": { + "build": "tsc", + "start": "node dist/main.js", + "dev": "ts-node src/main.ts", + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage", + "test:integration": "jest -c jest.integration.config.js" + }, + "dependencies": { + "@fastify/swagger": "^8.12.0", + "@fastify/swagger-ui": "^2.0.1", + "@openzeppelin/contracts-upgradeable": "^5.2.0", + "dotenv": "^16.3.1", + "ethers": "^6.9.0", + "fastify": "^4.24.3", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@openzeppelin/hardhat-upgrades": "^3.9.0", + "@types/jest": "^29.5.14", + "@types/node": "^20.17.12", + "@types/supertest": "^6.0.2", + "hardhat": "^2.22.17", + "jest": "^29.7.0", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.3.3" + } +} diff --git a/kms/auth-eth/scripts/deploy.ts b/kms/auth-eth/scripts/deploy.ts new file mode 100644 index 00000000..c803577a --- /dev/null +++ b/kms/auth-eth/scripts/deploy.ts @@ -0,0 +1,80 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import * as helpers from "../lib/deployment-helpers"; + +// This function should be called directly by Hardhat tasks +export async function deployContract(hre: HardhatRuntimeEnvironment, contractName: string, initializerArgs: any[] = [], quiet: boolean = false) { + try { + function log(...msgs: any[]) { + if (!quiet) { + console.log(...msgs); + } + } + + log(`Starting ${contractName} deployment process...`); + + if (!quiet) { + // Get network info + await helpers.logNetworkInfo(hre); + } + + log("Getting contract factory..."); + const contractFactory = await hre.ethers.getContractFactory(contractName); + + if (!quiet) { + // Estimate gas for deployment + await helpers.estimateDeploymentCost( + hre, + contractName, + initializerArgs + ); + + // Prompt for confirmation + if (!(await helpers.confirmAction('Do you want to proceed with deployment?'))) { + log('Deployment cancelled'); + return; + } + } + + // Deploy using proxy pattern + log("Deploying proxy..."); + const contract = await hre.upgrades.deployProxy(contractFactory, + initializerArgs, + { kind: 'uups' } + ); + log("Waiting for deployment..."); + await contract.waitForDeployment(); + + const address = await contract.getAddress(); + log(`${contractName} Proxy deployed to:`, address); + + // Verify deployment + await helpers.verifyDeployment(hre, address, quiet); + + const tx = await contract.deploymentTransaction(); + log("Deployment completed successfully"); + log("Transaction hash:", tx?.hash); + + return contract; + } catch (error) { + console.error("Error during deployment:", error); + throw error; + } +} + +// For backward compatibility when running the script directly +async function main() { + const hre = require("hardhat"); + const deployer = await helpers.getSigner(hre); + const address = await deployer.getAddress(); + console.log("Deploying with account:", address); + console.log("Account balance:", await helpers.accountBalance(hre.ethers, address)); + await deployContract(hre, "KmsAuth", [address]); +} + +// Only execute if directly run +if (require.main === module) { + main().catch((error) => { + console.error(error); + process.exitCode = 1; + }); +} \ No newline at end of file diff --git a/kms/auth-eth/scripts/upgrade.ts b/kms/auth-eth/scripts/upgrade.ts new file mode 100644 index 00000000..75e6cbdd --- /dev/null +++ b/kms/auth-eth/scripts/upgrade.ts @@ -0,0 +1,83 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import * as helpers from "../lib/deployment-helpers"; + +// This function can be called directly by Hardhat tasks +export async function upgradeContract( + hre: HardhatRuntimeEnvironment, + contractName: string, + proxyAddress?: string, + dryRun: boolean = false +) { + try { + if (!proxyAddress) { + throw new Error("Proxy address is required but was not provided"); + } + + console.log(`Preparing to upgrade ${contractName} at ${proxyAddress}...`); + console.log(`Mode: ${dryRun ? "Dry Run (simulation only)" : "Live Upgrade"}`); + + // Get network info to confirm we're on the right network + await helpers.logNetworkInfo(hre); + + // Prepare the upgrade + const { + newImplementationAddress, + upgradeTx + } = await helpers.prepareContractUpgrade(hre, proxyAddress, contractName, "uups"); + + if (dryRun) { + console.log("Upgrade transaction data:", upgradeTx); + return { + proxyAddress, + newImplementationAddress, + upgradeTx + }; + } else { + // Estimate the gas cost + await helpers.estimateUpgradeCost(hre, proxyAddress, upgradeTx); + + // Confirm the upgrade + const confirmed = await helpers.confirmAction(`Are you sure you want to upgrade ${contractName}?`); + if (!confirmed) { + console.log("Upgrade cancelled"); + return; + } + + console.log("Executing upgrade..."); + // Execute the upgrade + const upgraded = await helpers.executeContractUpgrade( + hre, + proxyAddress, + contractName, + "uups" + ); + + return upgraded; + } + } catch (error) { + console.error("Error during upgrade:", error); + throw error; + } +} + +// For backward compatibility when running the script directly +async function main() { + const hre = require("hardhat"); + try { + const proxyAddress = process.env.PROXY_ADDRESS; + const dryRun = process.env.DRY_RUN === "true"; + const contractName = process.env.CONTRACT_NAME || "KmsAuth"; + await upgradeContract(hre, contractName, proxyAddress, dryRun); + } catch (error) { + console.error(error); + process.exitCode = 1; + } +} + +// Only execute if directly run +if (require.main === module) { + main().catch((error) => { + console.error(error); + process.exitCode = 1; + }); +} \ No newline at end of file diff --git a/kms/auth-eth/scripts/verify.ts b/kms/auth-eth/scripts/verify.ts new file mode 100644 index 00000000..8e4e8df9 --- /dev/null +++ b/kms/auth-eth/scripts/verify.ts @@ -0,0 +1,26 @@ +import { run } from "hardhat"; + +async function main() { + const PROXY_ADDRESS = "0xda1d4bc372FE139d63b85f6160D2F849fFed9c10"; + + try { + // Verify the proxy contract + console.log("\nVerifying proxy contract..."); + await run("verify:verify", { + address: PROXY_ADDRESS, + constructorArguments: [], + }); + + console.log("\nVerification completed successfully!"); + console.log("You can now view the contracts on Etherscan:"); + console.log(`Proxy: https://etherscan.io/address/${PROXY_ADDRESS}`); + } catch (error) { + console.error("Error during verification:", error); + process.exitCode = 1; + } +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/kms/auth-eth/src/ethereum.ts b/kms/auth-eth/src/ethereum.ts new file mode 100644 index 00000000..85699243 --- /dev/null +++ b/kms/auth-eth/src/ethereum.ts @@ -0,0 +1,54 @@ +import { ethers } from 'ethers'; +import { BootInfo, BootResponse } from './types'; +import { KmsAuth__factory } from '../typechain-types/factories/KmsAuth__factory'; +import { KmsAuth } from '../typechain-types/KmsAuth'; +import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider'; + +export class EthereumBackend { + private provider: ethers.JsonRpcProvider | HardhatEthersProvider; + private kmsAuth: KmsAuth; + + constructor(provider: ethers.JsonRpcProvider | HardhatEthersProvider, kmsAuthAddr: string) { + this.provider = provider; + this.kmsAuth = KmsAuth__factory.connect( + ethers.getAddress(kmsAuthAddr), + this.provider + ); + } + + private decodeHex(hex: string, sz: number = 32): string { + // Remove '0x' prefix if present + hex = hex.startsWith('0x') ? hex.slice(2) : hex; + + // Pad hex string to 64 characters (32 bytes) + hex = hex.padStart(sz * 2, '0'); + + // Add '0x' prefix back + return '0x' + hex; + } + + async checkBoot(bootInfo: BootInfo, isKms: boolean): Promise { + // Create boot info struct for contract call + const bootInfoStruct = { + appId: this.decodeHex(bootInfo.appId, 20), + instanceId: this.decodeHex(bootInfo.instanceId, 20), + composeHash: this.decodeHex(bootInfo.composeHash, 32), + deviceId: this.decodeHex(bootInfo.deviceId, 32), + mrAggregated: this.decodeHex(bootInfo.mrAggregated, 32), + mrImage: this.decodeHex(bootInfo.mrImage, 32) + }; + let response; + if (isKms) { + response = await this.kmsAuth.isKmsAllowed(bootInfoStruct); + } else { + response = await this.kmsAuth.isAppAllowed(bootInfoStruct); + } + const [isAllowed, reason] = response; + const tproxyAppId = await this.kmsAuth.tproxyAppId(); + return { + isAllowed, + reason, + tproxyAppId + } + } +} diff --git a/kms/auth-eth/src/main.ts b/kms/auth-eth/src/main.ts new file mode 100644 index 00000000..78bfb952 --- /dev/null +++ b/kms/auth-eth/src/main.ts @@ -0,0 +1,35 @@ +import { config } from 'dotenv'; +import { build } from './server'; + +// Load environment variables +config(); + +async function main() { + try { + const port = process.env.PORT ? parseInt(process.env.PORT) : 8000; + const host = process.env.HOST || '127.0.0.1'; + + const server = await build(); + await server.listen({ port, host }); + console.log(`Server listening on ${host}:${port}`); + + // Handle graceful shutdown + const signals = ['SIGINT', 'SIGTERM']; + for (const signal of signals) { + process.on(signal, async () => { + try { + await server.close(); + process.exit(0); + } catch (err) { + console.error('Error during shutdown:', err); + process.exit(1); + } + }); + } + } catch (err) { + console.error('Error starting server:', err); + process.exit(1); + } +} + +main(); diff --git a/kms/auth-eth/src/server.ts b/kms/auth-eth/src/server.ts new file mode 100644 index 00000000..41691c01 --- /dev/null +++ b/kms/auth-eth/src/server.ts @@ -0,0 +1,95 @@ +import fastify, { FastifyInstance } from 'fastify'; +import { EthereumBackend } from './ethereum'; +import { BootInfo, BootResponse } from './types'; +import { ethers } from 'ethers'; + +declare module 'fastify' { + interface FastifyInstance { + ethereum: EthereumBackend; + } +} + +export async function build(): Promise { + const server = fastify({ + logger: true + }); + + // Register schema for request/response validation + server.addSchema({ + $id: 'bootInfo', + type: 'object', + required: ['mrAggregated', 'mrImage', 'appId', 'composeHash', 'instanceId', 'deviceId'], + properties: { + mrAggregated: { type: 'string', description: 'Aggregated MR measurement' }, + mrImage: { type: 'string', description: 'MR Image measurement' }, + appId: { type: 'string', description: 'Application ID' }, + composeHash: { type: 'string', description: 'Compose hash' }, + instanceId: { type: 'string', description: 'Instance ID' }, + deviceId: { type: 'string', description: 'Device ID' } + } + }); + + server.addSchema({ + $id: 'bootResponse', + type: 'object', + required: ['isAllowed', 'reason', 'tproxyAppId'], + properties: { + isAllowed: { type: 'boolean' }, + reason: { type: 'string' }, + tproxyAppId: { type: 'string' }, + } + }); + + // Initialize backend + const rpcUrl = process.env.ETH_RPC_URL || 'http://localhost:8545'; + const kmsContractAddr = process.env.KMS_CONTRACT_ADDR || '0x0000000000000000000000000000000000000000'; + const provider = new ethers.JsonRpcProvider(rpcUrl); + server.decorate('ethereum', new EthereumBackend(provider, kmsContractAddr)); + + // Define routes + server.post<{ + Body: BootInfo; + Reply: BootResponse; + }>('/bootAuth/app', { + schema: { + body: { $ref: 'bootInfo#' }, + response: { + 200: { $ref: 'bootResponse#' } + } + } + }, async (request, reply) => { + try { + return await server.ethereum.checkBoot(request.body, false); + } catch (error) { + reply.code(200).send({ + isAllowed: false, + tproxyAppId: '', + reason: `${error instanceof Error ? error.message : String(error)}` + }); + } + }); + + server.post<{ + Body: BootInfo; + Reply: BootResponse; + }>('/bootAuth/kms', { + schema: { + body: { $ref: 'bootInfo#' }, + response: { + 200: { $ref: 'bootResponse#' } + } + } + }, async (request, reply) => { + try { + return await server.ethereum.checkBoot(request.body, true); + } catch (error) { + reply.code(200).send({ + isAllowed: false, + tproxyAppId: '', + reason: `${error instanceof Error ? error.message : String(error)}` + }); + } + }); + + return server; +} diff --git a/kms/auth-eth/src/types.ts b/kms/auth-eth/src/types.ts new file mode 100644 index 00000000..0bcfc4d8 --- /dev/null +++ b/kms/auth-eth/src/types.ts @@ -0,0 +1,16 @@ +export interface BootInfo { + mrAggregated: string; + mrImage: string; + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; +} + +export interface BootResponse { + isAllowed: boolean; + tproxyAppId: string; + reason: string; +} + +// Removed KMS_CONTRACT_ABI and APP_CONTRACT_ABI since we're using typechain types now diff --git a/kms/auth-eth/test/AppAuth.test.ts b/kms/auth-eth/test/AppAuth.test.ts new file mode 100644 index 00000000..efb0eab9 --- /dev/null +++ b/kms/auth-eth/test/AppAuth.test.ts @@ -0,0 +1,131 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { AppAuth } from "../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { deployContract } from "../scripts/deploy"; +import hre from "hardhat"; + +describe("AppAuth", function () { + let appAuth: AppAuth; + let owner: SignerWithAddress; + let user: SignerWithAddress; + let appId: string; + + beforeEach(async function () { + [owner, user] = await ethers.getSigners(); + appId = ethers.Wallet.createRandom().address; + appAuth = await deployContract(hre, "AppAuth", [owner.address, appId, false], true) as AppAuth; + }); + + describe("Basic functionality", function () { + it("Should set the correct owner", async function () { + expect(await appAuth.owner()).to.equal(owner.address); + }); + + it("Should set the correct app ID", async function () { + expect(await appAuth.appId()).to.equal(appId); + }); + }); + + describe("Compose hash management", function () { + const testHash = ethers.randomBytes(32); + + it("Should allow adding compose hash", async function () { + await appAuth.addComposeHash(testHash); + expect(await appAuth.allowedComposeHashes(testHash)).to.be.true; + }); + + it("Should allow removing compose hash", async function () { + await appAuth.addComposeHash(testHash); + await appAuth.removeComposeHash(testHash); + expect(await appAuth.allowedComposeHashes(testHash)).to.be.false; + }); + + it("Should emit event when adding compose hash", async function () { + await expect(appAuth.addComposeHash(testHash)) + .to.emit(appAuth, "ComposeHashAdded") + .withArgs(testHash); + }); + + it("Should emit event when removing compose hash", async function () { + await appAuth.addComposeHash(testHash); + await expect(appAuth.removeComposeHash(testHash)) + .to.emit(appAuth, "ComposeHashRemoved") + .withArgs(testHash); + }); + }); + + describe("isAppAllowed", function () { + const composeHash = ethers.randomBytes(32); + const deviceId = ethers.randomBytes(32); + const mrAggregated = ethers.randomBytes(32); + const mrImage = ethers.randomBytes(32); + const instanceId = ethers.Wallet.createRandom().address; + + beforeEach(async function () { + await appAuth.addComposeHash(composeHash); + }); + + it("Should allow valid boot info", async function () { + const bootInfo = { + appId: appId, + composeHash, + instanceId, + deviceId, + mrAggregated, + mrImage + }; + + const [isAllowed, reason] = await appAuth.isAppAllowed(bootInfo); + expect(reason).to.equal(""); + expect(isAllowed).to.be.true; + }); + + it("Should reject invalid app ID", async function () { + const bootInfo = { + appId: ethers.Wallet.createRandom().address, + composeHash, + instanceId, + deviceId, + mrAggregated, + mrImage + }; + + const [isAllowed, reason] = await appAuth.isAppAllowed(bootInfo); + expect(isAllowed).to.be.false; + expect(reason).to.equal("Wrong app controller"); + }); + + it("Should reject unallowed compose hash", async function () { + const bootInfo = { + appId: appId, + composeHash: ethers.randomBytes(32), + instanceId, + deviceId, + mrAggregated, + mrImage + }; + + const [isAllowed, reason] = await appAuth.isAppAllowed(bootInfo); + expect(isAllowed).to.be.false; + expect(reason).to.equal("Compose hash not allowed"); + }); + }); + + describe("Access control", function () { + const testHash = ethers.randomBytes(32); + + it("Should prevent non-owners from adding compose hash", async function () { + await expect( + appAuth.connect(user).addComposeHash(testHash) + ).to.be.revertedWithCustomError(appAuth, "OwnableUnauthorizedAccount"); + }); + + it("Should prevent non-owners from removing compose hash", async function () { + await appAuth.addComposeHash(testHash); + await expect( + appAuth.connect(user).removeComposeHash(testHash) + ).to.be.revertedWithCustomError(appAuth, "OwnableUnauthorizedAccount"); + }); + }); +}); diff --git a/kms/auth-eth/test/ethereum.integration.test.ts b/kms/auth-eth/test/ethereum.integration.test.ts new file mode 100644 index 00000000..7a970966 --- /dev/null +++ b/kms/auth-eth/test/ethereum.integration.test.ts @@ -0,0 +1,149 @@ +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { ethers } from "hardhat"; +import { EthereumBackend } from '../src/ethereum'; +import { BootInfo } from '../src/types'; +import { KmsAuth } from "../typechain-types/KmsAuth"; +import { IAppAuth } from "../typechain-types/IAppAuth"; +import { expect } from "chai"; + +describe('Integration Tests', () => { + let kmsAuth: KmsAuth; + let owner: SignerWithAddress; + let backend: EthereumBackend; + let appId: string; + + beforeAll(async () => { + owner = global.testContracts.owner; + kmsAuth = global.testContracts.kmsAuth; + appId = global.testContracts.appId; + + // Initialize backend with the same provider + const provider = owner.provider; + if (!provider) { + throw new Error('Provider not found'); + } + const contractAddress = await kmsAuth.getAddress(); + backend = new EthereumBackend(provider, contractAddress); + }); + + describe('KmsAuth Contract', () => { + let mockBootInfo: IAppAuth.AppBootInfoStruct; + + beforeEach(async () => { + mockBootInfo = { + appId, + instanceId: ethers.Wallet.createRandom().address, + deviceId: ethers.encodeBytes32String('123'), + mrAggregated: ethers.encodeBytes32String('11'), + mrImage: ethers.encodeBytes32String('22'), + composeHash: ethers.encodeBytes32String('33'), + }; + }); + + it('should return true when all checks pass', async () => { + const [isAllowed, reason] = await kmsAuth.isAppAllowed(mockBootInfo); + expect(reason).to.equal(''); + expect(isAllowed).to.equal(true); + }); + + it('should return true when enclave is not registered but image is registered', async () => { + const badMrAggregated = ethers.encodeBytes32String('9999'); + const [isAllowed, reason] = await kmsAuth.isAppAllowed({ + ...mockBootInfo, + mrAggregated: badMrAggregated + }); + + expect(isAllowed).to.equal(true); + expect(reason).to.equal(''); + }); + + it('should return true when image is not registered but enclave is registered', async () => { + const badMrImage = ethers.encodeBytes32String('9999'); + const [isAllowed, reason] = await kmsAuth.isAppAllowed({ + ...mockBootInfo, + mrImage: badMrImage + }); + + expect(reason).to.equal(''); + expect(isAllowed).to.equal(true); + }); + + it('should return false when enclave and image are not registered', async () => { + const badMrAggregated = ethers.encodeBytes32String('9999'); + const badMrImage = ethers.encodeBytes32String('9999'); + const [isAllowed, reason] = await kmsAuth.isAppAllowed({ + ...mockBootInfo, + mrAggregated: badMrAggregated, + mrImage: badMrImage + }); + expect(reason).to.equal('Neither aggregated MR nor image is allowed'); + expect(isAllowed).to.equal(false); + }); + }); + + describe('EthereumBackend', () => { + let appId: string; + let mockBootInfo: BootInfo; + + beforeEach(async () => { + appId = global.testContracts.appId; + mockBootInfo = { + appId, + composeHash: ethers.encodeBytes32String("33"), + instanceId: ethers.Wallet.createRandom().address, + deviceId: ethers.encodeBytes32String("123"), + mrAggregated: ethers.encodeBytes32String("11"), + mrImage: ethers.encodeBytes32String("22") + }; + }); + + describe('checkBoot', () => { + it('should return true when all checks pass', async () => { + const result = await backend.checkBoot(mockBootInfo, false); + expect(result.reason).to.equal(''); + expect(result.isAllowed).to.equal(true); + }); + + it('should return true when enclave is not allowed but image is allowed', async () => { + const badBootInfo = { + ...mockBootInfo, + mrAggregated: ethers.encodeBytes32String('9999') + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).to.equal(''); + expect(result.isAllowed).to.equal(true); + }); + + it('should return true when image is not allowed but enclave is allowed', async () => { + const badBootInfo = { + ...mockBootInfo, + mrImage: ethers.encodeBytes32String('9999') + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).to.equal(''); + expect(result.isAllowed).to.equal(true); + }); + + it('should return false when enclave and image are not registered', async () => { + const badBootInfo = { + ...mockBootInfo, + mrAggregated: ethers.encodeBytes32String('9999'), + mrImage: ethers.encodeBytes32String('9999') + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).to.equal('Neither aggregated MR nor image is allowed'); + expect(result.isAllowed).to.equal(false); + }); + + it('should return false when app is not registered', async () => { + const badBootInfo = { + ...mockBootInfo, + appId: ethers.Wallet.createRandom().address + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).to.equal('App not registered'); + expect(result.isAllowed).to.equal(false); + }); + }); + }); +}); diff --git a/kms/auth-eth/test/ethereum.test.ts b/kms/auth-eth/test/ethereum.test.ts new file mode 100644 index 00000000..91ac803c --- /dev/null +++ b/kms/auth-eth/test/ethereum.test.ts @@ -0,0 +1,100 @@ +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { ethers } from "hardhat"; +import { EthereumBackend } from '../src/ethereum'; +import { BootInfo } from '../src/types'; +import { KmsAuth } from "../typechain-types/KmsAuth"; +import { AppAuth } from "../typechain-types/AppAuth"; + +describe('EthereumBackend', () => { + let kmsAuth: KmsAuth; + let owner: SignerWithAddress; + let backend: EthereumBackend; + let mockBootInfo: BootInfo; + let appId: string; + let appAuth: AppAuth; + + beforeEach(async () => { + // Get test contracts from global setup + ({ kmsAuth, owner, appAuth, appId } = global.testContracts); + + // Initialize backend with KmsAuth contract address + backend = new EthereumBackend( + owner.provider, + await kmsAuth.getAddress() + ); + + // Create mock boot info with valid addresses + mockBootInfo = { + appId, + composeHash: ethers.encodeBytes32String('0x1234567890abcdef'), + instanceId: ethers.Wallet.createRandom().address, + deviceId: ethers.encodeBytes32String('0x123'), + mrAggregated: ethers.encodeBytes32String('0x1234'), + mrImage: ethers.encodeBytes32String('0x5678') + }; + + // Set up KMS info + await kmsAuth.setKmsInfo({ + k256Pubkey: "0x" + "1234".padEnd(66, '0'), + caPubkey: "0x" + "5678".padEnd(192, '0'), + quote: "0x" + "9012".padEnd(8192, '0'), + eventlog: "0x" + "9012".padEnd(8192, '0') + }); + + // Register enclave and image + await kmsAuth.registerAggregatedMr(mockBootInfo.mrAggregated); + await kmsAuth.registerImage(mockBootInfo.mrImage); + await appAuth.addComposeHash(mockBootInfo.composeHash); + }); + + describe('checkBoot', () => { + it('should return true when all checks pass', async () => { + const result = await backend.checkBoot(mockBootInfo, false); + expect(result.reason).toBe(''); + expect(result.isAllowed).toBe(true); + }); + + it('should return true when enclave is not allowed but image is allowed', async () => { + const badBootInfo = { + ...mockBootInfo, + mrAggregated: ethers.encodeBytes32String('0x9999'), + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).toBe(''); + expect(result.isAllowed).toBe(true); + }); + + it('should return true when image is not allowed but enclave is allowed', async () => { + const badBootInfo = { + ...mockBootInfo, + mrImage: ethers.encodeBytes32String('0x9999') + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).toBe(''); + expect(result.isAllowed).toBe(true); + }); + + it('should return false when enclave and image are not registered', async () => { + const badMrAggregated = ethers.encodeBytes32String('9999'); + const badMrImage = ethers.encodeBytes32String('9999'); + const badBootInfo = { + ...mockBootInfo, + mrAggregated: badMrAggregated, + mrImage: badMrImage + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).toBe('Neither aggregated MR nor image is allowed'); + expect(result.isAllowed).toBe(false); + }); + + it('should return false when app is not registered', async () => { + const badBootInfo = { + ...mockBootInfo, + appId: ethers.Wallet.createRandom().address + }; + const result = await backend.checkBoot(badBootInfo, false); + expect(result.reason).toBe('App not registered'); + expect(result.isAllowed).toBe(false); + }); + }); +}); diff --git a/kms/auth-eth/test/main.test.ts b/kms/auth-eth/test/main.test.ts new file mode 100644 index 00000000..2707d8f8 --- /dev/null +++ b/kms/auth-eth/test/main.test.ts @@ -0,0 +1,110 @@ +import { FastifyInstance } from 'fastify'; +import { build } from '../src/server'; +import { BootInfo } from '../src/types'; + +// Mock EthereumBackend +jest.mock('../src/ethereum', () => { + return { + EthereumBackend: jest.fn().mockImplementation(() => ({ + checkBoot: jest.fn() + })) + }; +}); + +describe('Server', () => { + let app: FastifyInstance; + const mockBootInfo: BootInfo = { + mrAggregated: '0x1234', + mrImage: '0x5678', + appId: '0x9012345678901234567890123456789012345678', + composeHash: '0xabcd', + instanceId: '0x3456789012345678901234567890123456789012', + deviceId: '0xef12' + }; + + beforeAll(async () => { + app = await build(); + }); + + afterAll(async () => { + await app.close(); + }); + + describe('POST /bootAuth/app', () => { + it('should return 200 when backend check passes', async () => { + // Mock successful response + const mockCheckBoot = jest.fn().mockResolvedValue({ + isAllowed: true, + reason: '', + tproxyAppId: '' + }); + app.ethereum.checkBoot = mockCheckBoot; + + const response = await app.inject({ + method: 'POST', + url: '/bootAuth/app', + payload: mockBootInfo + }); + + expect(response.statusCode).toBe(200); + const result = JSON.parse(response.payload); + expect(result.isAllowed).toBe(true); + expect(result.reason).toBe(''); + expect(mockCheckBoot).toHaveBeenCalledWith(mockBootInfo, false); + }); + + it('should return 400 for invalid boot info', async () => { + const response = await app.inject({ + method: 'POST', + url: '/bootAuth/app', + payload: { + // Missing required fields + mrAggregated: '0x1234' + } + }); + + expect(response.statusCode).toBe(400); + }); + }); + + describe('POST /bootAuth/kms', () => { + it('should return 200 when backend check passes', async () => { + // Mock successful response + const mockCheckBoot = jest.fn().mockResolvedValue({ + isAllowed: true, + reason: '', + tproxyAppId: '0x1234', + }); + app.ethereum.checkBoot = mockCheckBoot; + + const response = await app.inject({ + method: 'POST', + url: '/bootAuth/kms', + payload: mockBootInfo, + }); + + const result = JSON.parse(response.payload); + expect(response.statusCode).toBe(200); + expect(result.isAllowed).toBe(true); + expect(result.reason).toBe(''); + expect(mockCheckBoot).toHaveBeenCalledWith(mockBootInfo, true); + }); + + it('should handle backend errors gracefully', async () => { + // Mock error response + const mockCheckBoot = jest.fn().mockRejectedValue(new Error('Backend error')); + app.ethereum.checkBoot = mockCheckBoot; + + const response = await app.inject({ + method: 'POST', + url: '/bootAuth/kms', + payload: mockBootInfo + }); + + expect(response.statusCode).toBe(200); + const result = JSON.parse(response.payload); + expect(result.isAllowed).toBe(false); + expect(result.reason).toMatch(/Backend error/); + }); + }); +}); diff --git a/kms/auth-eth/test/setup.ts b/kms/auth-eth/test/setup.ts new file mode 100644 index 00000000..0bed03ac --- /dev/null +++ b/kms/auth-eth/test/setup.ts @@ -0,0 +1,53 @@ +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import hre from "hardhat"; +import { ethers } from "hardhat"; +import { KmsAuth } from "../typechain-types"; +import { AppAuth } from "../typechain-types/AppAuth"; +import { deployContract } from "../scripts/deploy"; + +declare global { + var testContracts: { + kmsAuth: KmsAuth; + appAuth: AppAuth; + appId: string; + owner: SignerWithAddress; + }; +} + +beforeAll(async () => { + + // Get signers + const [owner] = await ethers.getSigners(); + + // Deploy contracts + const kmsAuth = await deployContract(hre, "KmsAuth", [owner.address], true) as KmsAuth; + + // Initialize the contract with an app and KMS info + const salt = ethers.randomBytes(32); + const appId = await kmsAuth.calculateAppId(owner.address, salt); + + const appAuth = await deployContract(hre, "AppAuth", [owner.address, appId, false], true) as AppAuth; + + await kmsAuth.registerApp(salt, await appAuth.getAddress()); + + // Set up KMS info with the generated app ID + await kmsAuth.setKmsInfo({ + quote: ethers.encodeBytes32String("1234"), + caPubkey: ethers.encodeBytes32String("test-ca-pubkey"), + k256Pubkey: ethers.encodeBytes32String("test-k256-pubkey"), + eventlog: ethers.encodeBytes32String("test-eventlog") + }); + + // Register some test enclaves and images + await kmsAuth.registerAggregatedMr(ethers.encodeBytes32String("11")); + await kmsAuth.registerImage(ethers.encodeBytes32String("22")); + await appAuth.addComposeHash(ethers.encodeBytes32String("33")); + + // Set up global test contracts + global.testContracts = { + kmsAuth, + appAuth, + appId, + owner + }; +}); diff --git a/kms/auth-eth/tsconfig.json b/kms/auth-eth/tsconfig.json new file mode 100644 index 00000000..ffaf9b42 --- /dev/null +++ b/kms/auth-eth/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["es2020"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": ".", + "resolveJsonModule": true, + "types": ["node", "jest", "hardhat"], + "baseUrl": "." + }, + "include": ["src/**/*", "test/**/*", "hardhat.config.ts", "typechain-types/**/*"], + "exclude": ["node_modules"] +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts new file mode 100644 index 00000000..dde83e2f --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.ts @@ -0,0 +1,186 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../../../common"; + +export interface OwnableUpgradeableInterface extends Interface { + getFunction( + nameOrSignature: "owner" | "renounceOwnership" | "transferOwnership" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: "Initialized" | "OwnershipTransferred" + ): EventFragment; + + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface OwnableUpgradeable extends BaseContract { + connect(runner?: ContractRunner | null): OwnableUpgradeable; + waitForDeployment(): Promise; + + interface: OwnableUpgradeableInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + owner: TypedContractMethod<[], [string], "view">; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + filters: { + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts new file mode 100644 index 00000000..5b7d8440 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/access/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { OwnableUpgradeable } from "./OwnableUpgradeable"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/index.ts new file mode 100644 index 00000000..cb37af6a --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/index.ts @@ -0,0 +1,9 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as access from "./access"; +export type { access }; +import type * as proxy from "./proxy"; +export type { proxy }; +import type * as utils from "./utils"; +export type { utils }; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts new file mode 100644 index 00000000..74cdc5fa --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as utils from "./utils"; +export type { utils }; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts new file mode 100644 index 00000000..b449ea2c --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.ts @@ -0,0 +1,105 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + FunctionFragment, + Interface, + EventFragment, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, +} from "../../../../common"; + +export interface InitializableInterface extends Interface { + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface Initializable extends BaseContract { + connect(runner?: ContractRunner | null): Initializable; + waitForDeployment(): Promise; + + interface: InitializableInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + filters: { + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts new file mode 100644 index 00000000..fd0c2543 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.ts @@ -0,0 +1,196 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../../../../common"; + +export interface UUPSUpgradeableInterface extends Interface { + getFunction( + nameOrSignature: + | "UPGRADE_INTERFACE_VERSION" + | "proxiableUUID" + | "upgradeToAndCall" + ): FunctionFragment; + + getEvent(nameOrSignatureOrTopic: "Initialized" | "Upgraded"): EventFragment; + + encodeFunctionData( + functionFragment: "UPGRADE_INTERFACE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "upgradeToAndCall", + values: [AddressLike, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "UPGRADE_INTERFACE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "upgradeToAndCall", + data: BytesLike + ): Result; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace UpgradedEvent { + export type InputTuple = [implementation: AddressLike]; + export type OutputTuple = [implementation: string]; + export interface OutputObject { + implementation: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface UUPSUpgradeable extends BaseContract { + connect(runner?: ContractRunner | null): UUPSUpgradeable; + waitForDeployment(): Promise; + + interface: UUPSUpgradeableInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; + + proxiableUUID: TypedContractMethod<[], [string], "view">; + + upgradeToAndCall: TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "UPGRADE_INTERFACE_VERSION" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "proxiableUUID" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "upgradeToAndCall" + ): TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + getEvent( + key: "Upgraded" + ): TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + + filters: { + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + "Upgraded(address)": TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + Upgraded: TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts new file mode 100644 index 00000000..f23837ba --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { Initializable } from "./Initializable"; +export type { UUPSUpgradeable } from "./UUPSUpgradeable"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts new file mode 100644 index 00000000..a6af1bed --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.ts @@ -0,0 +1,105 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + FunctionFragment, + Interface, + EventFragment, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, +} from "../../../common"; + +export interface ContextUpgradeableInterface extends Interface { + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface ContextUpgradeable extends BaseContract { + connect(runner?: ContractRunner | null): ContextUpgradeable; + waitForDeployment(): Promise; + + interface: ContextUpgradeableInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + filters: { + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts new file mode 100644 index 00000000..749da396 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts-upgradeable/utils/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { ContextUpgradeable } from "./ContextUpgradeable"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/index.ts new file mode 100644 index 00000000..e49e4d3f --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/index.ts @@ -0,0 +1,9 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as interfaces from "./interfaces"; +export type { interfaces }; +import type * as proxy from "./proxy"; +export type { proxy }; +import type * as utils from "./utils"; +export type { utils }; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.ts new file mode 100644 index 00000000..4a317bdb --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/IERC1967.ts @@ -0,0 +1,168 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, +} from "../../../common"; + +export interface IERC1967Interface extends Interface { + getEvent( + nameOrSignatureOrTopic: "AdminChanged" | "BeaconUpgraded" | "Upgraded" + ): EventFragment; +} + +export namespace AdminChangedEvent { + export type InputTuple = [previousAdmin: AddressLike, newAdmin: AddressLike]; + export type OutputTuple = [previousAdmin: string, newAdmin: string]; + export interface OutputObject { + previousAdmin: string; + newAdmin: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace BeaconUpgradedEvent { + export type InputTuple = [beacon: AddressLike]; + export type OutputTuple = [beacon: string]; + export interface OutputObject { + beacon: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace UpgradedEvent { + export type InputTuple = [implementation: AddressLike]; + export type OutputTuple = [implementation: string]; + export interface OutputObject { + implementation: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface IERC1967 extends BaseContract { + connect(runner?: ContractRunner | null): IERC1967; + waitForDeployment(): Promise; + + interface: IERC1967Interface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + getEvent( + key: "AdminChanged" + ): TypedContractEvent< + AdminChangedEvent.InputTuple, + AdminChangedEvent.OutputTuple, + AdminChangedEvent.OutputObject + >; + getEvent( + key: "BeaconUpgraded" + ): TypedContractEvent< + BeaconUpgradedEvent.InputTuple, + BeaconUpgradedEvent.OutputTuple, + BeaconUpgradedEvent.OutputObject + >; + getEvent( + key: "Upgraded" + ): TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + + filters: { + "AdminChanged(address,address)": TypedContractEvent< + AdminChangedEvent.InputTuple, + AdminChangedEvent.OutputTuple, + AdminChangedEvent.OutputObject + >; + AdminChanged: TypedContractEvent< + AdminChangedEvent.InputTuple, + AdminChangedEvent.OutputTuple, + AdminChangedEvent.OutputObject + >; + + "BeaconUpgraded(address)": TypedContractEvent< + BeaconUpgradedEvent.InputTuple, + BeaconUpgradedEvent.OutputTuple, + BeaconUpgradedEvent.OutputObject + >; + BeaconUpgraded: TypedContractEvent< + BeaconUpgradedEvent.InputTuple, + BeaconUpgradedEvent.OutputTuple, + BeaconUpgradedEvent.OutputObject + >; + + "Upgraded(address)": TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + Upgraded: TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts new file mode 100644 index 00000000..f822039b --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.ts @@ -0,0 +1,90 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../common"; + +export interface IERC1822ProxiableInterface extends Interface { + getFunction(nameOrSignature: "proxiableUUID"): FunctionFragment; + + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; +} + +export interface IERC1822Proxiable extends BaseContract { + connect(runner?: ContractRunner | null): IERC1822Proxiable; + waitForDeployment(): Promise; + + interface: IERC1822ProxiableInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + proxiableUUID: TypedContractMethod<[], [string], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "proxiableUUID" + ): TypedContractMethod<[], [string], "view">; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts new file mode 100644 index 00000000..daec45bb --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { IERC1822Proxiable } from "./IERC1822Proxiable"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/index.ts new file mode 100644 index 00000000..56b77b41 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/interfaces/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as draftIerc1822Sol from "./draft-IERC1822.sol"; +export type { draftIerc1822Sol }; +export type { IERC1967 } from "./IERC1967"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts new file mode 100644 index 00000000..cba1ba06 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../../common"; + +export interface ERC1967UtilsInterface extends Interface {} + +export interface ERC1967Utils extends BaseContract { + connect(runner?: ContractRunner | null): ERC1967Utils; + waitForDeployment(): Promise; + + interface: ERC1967UtilsInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts new file mode 100644 index 00000000..29e34c1f --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/ERC1967/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { ERC1967Utils } from "./ERC1967Utils"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts new file mode 100644 index 00000000..27a21e39 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/beacon/IBeacon.ts @@ -0,0 +1,90 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../../../common"; + +export interface IBeaconInterface extends Interface { + getFunction(nameOrSignature: "implementation"): FunctionFragment; + + encodeFunctionData( + functionFragment: "implementation", + values?: undefined + ): string; + + decodeFunctionResult( + functionFragment: "implementation", + data: BytesLike + ): Result; +} + +export interface IBeacon extends BaseContract { + connect(runner?: ContractRunner | null): IBeacon; + waitForDeployment(): Promise; + + interface: IBeaconInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + implementation: TypedContractMethod<[], [string], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "implementation" + ): TypedContractMethod<[], [string], "view">; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts new file mode 100644 index 00000000..9224b1ea --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/beacon/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { IBeacon } from "./IBeacon"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/index.ts new file mode 100644 index 00000000..34dd3224 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/proxy/index.ts @@ -0,0 +1,7 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as erc1967 from "./ERC1967"; +export type { erc1967 }; +import type * as beacon from "./beacon"; +export type { beacon }; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/Address.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/Address.ts new file mode 100644 index 00000000..eaaadeb4 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/Address.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../common"; + +export interface AddressInterface extends Interface {} + +export interface Address extends BaseContract { + connect(runner?: ContractRunner | null): Address; + waitForDeployment(): Promise; + + interface: AddressInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/Errors.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/Errors.ts new file mode 100644 index 00000000..961498f5 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/Errors.ts @@ -0,0 +1,69 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + FunctionFragment, + Interface, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, +} from "../../../common"; + +export interface ErrorsInterface extends Interface {} + +export interface Errors extends BaseContract { + connect(runner?: ContractRunner | null): Errors; + waitForDeployment(): Promise; + + interface: ErrorsInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + getFunction( + key: string | FunctionFragment + ): T; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/index.ts new file mode 100644 index 00000000..2f233398 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/contracts/utils/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { Address } from "./Address"; +export type { Errors } from "./Errors"; diff --git a/kms/auth-eth/typechain-types/@openzeppelin/index.ts b/kms/auth-eth/typechain-types/@openzeppelin/index.ts new file mode 100644 index 00000000..f34b8770 --- /dev/null +++ b/kms/auth-eth/typechain-types/@openzeppelin/index.ts @@ -0,0 +1,7 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as contracts from "./contracts"; +export type { contracts }; +import type * as contractsUpgradeable from "./contracts-upgradeable"; +export type { contractsUpgradeable }; diff --git a/kms/auth-eth/typechain-types/AppAuth.ts b/kms/auth-eth/typechain-types/AppAuth.ts new file mode 100644 index 00000000..4739dec9 --- /dev/null +++ b/kms/auth-eth/typechain-types/AppAuth.ts @@ -0,0 +1,319 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export declare namespace IAppAuth { + export type AppBootInfoStruct = { + appId: AddressLike; + composeHash: BytesLike; + instanceId: AddressLike; + deviceId: BytesLike; + mrAggregated: BytesLike; + mrImage: BytesLike; + }; + + export type AppBootInfoStructOutput = [ + appId: string, + composeHash: string, + instanceId: string, + deviceId: string, + mrAggregated: string, + mrImage: string + ] & { + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; + mrAggregated: string; + mrImage: string; + }; +} + +export interface AppAuthInterface extends Interface { + getFunction( + nameOrSignature: + | "addComposeHash" + | "allowedComposeHashes" + | "appId" + | "initialize" + | "isAppAllowed" + | "owner" + | "removeComposeHash" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "ComposeHashAdded" + | "ComposeHashRemoved" + | "OwnershipTransferred" + ): EventFragment; + + encodeFunctionData( + functionFragment: "addComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedComposeHashes", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "appId", values?: undefined): string; + encodeFunctionData( + functionFragment: "initialize", + values: [AddressLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "isAppAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "removeComposeHash", + values: [BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "addComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedComposeHashes", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "appId", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isAppAllowed", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeComposeHash", + data: BytesLike + ): Result; +} + +export namespace ComposeHashAddedEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ComposeHashRemovedEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface AppAuth extends BaseContract { + connect(runner?: ContractRunner | null): AppAuth; + waitForDeployment(): Promise; + + interface: AppAuthInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + addComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + allowedComposeHashes: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + appId: TypedContractMethod<[], [string], "view">; + + initialize: TypedContractMethod< + [_owner: AddressLike, _appId: AddressLike], + [void], + "nonpayable" + >; + + isAppAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + owner: TypedContractMethod<[], [string], "view">; + + removeComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "addComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "allowedComposeHashes" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "appId" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "initialize" + ): TypedContractMethod< + [_owner: AddressLike, _appId: AddressLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "isAppAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "removeComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + + getEvent( + key: "ComposeHashAdded" + ): TypedContractEvent< + ComposeHashAddedEvent.InputTuple, + ComposeHashAddedEvent.OutputTuple, + ComposeHashAddedEvent.OutputObject + >; + getEvent( + key: "ComposeHashRemoved" + ): TypedContractEvent< + ComposeHashRemovedEvent.InputTuple, + ComposeHashRemovedEvent.OutputTuple, + ComposeHashRemovedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + filters: { + "ComposeHashAdded(bytes32)": TypedContractEvent< + ComposeHashAddedEvent.InputTuple, + ComposeHashAddedEvent.OutputTuple, + ComposeHashAddedEvent.OutputObject + >; + ComposeHashAdded: TypedContractEvent< + ComposeHashAddedEvent.InputTuple, + ComposeHashAddedEvent.OutputTuple, + ComposeHashAddedEvent.OutputObject + >; + + "ComposeHashRemoved(bytes32)": TypedContractEvent< + ComposeHashRemovedEvent.InputTuple, + ComposeHashRemovedEvent.OutputTuple, + ComposeHashRemovedEvent.OutputObject + >; + ComposeHashRemoved: TypedContractEvent< + ComposeHashRemovedEvent.InputTuple, + ComposeHashRemovedEvent.OutputTuple, + ComposeHashRemovedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/IAppAuth.ts b/kms/auth-eth/typechain-types/IAppAuth.ts new file mode 100644 index 00000000..8991dc88 --- /dev/null +++ b/kms/auth-eth/typechain-types/IAppAuth.ts @@ -0,0 +1,126 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "./common"; + +export declare namespace IAppAuth { + export type AppBootInfoStruct = { + appId: AddressLike; + composeHash: BytesLike; + instanceId: AddressLike; + deviceId: BytesLike; + mrAggregated: BytesLike; + mrImage: BytesLike; + }; + + export type AppBootInfoStructOutput = [ + appId: string, + composeHash: string, + instanceId: string, + deviceId: string, + mrAggregated: string, + mrImage: string + ] & { + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; + mrAggregated: string; + mrImage: string; + }; +} + +export interface IAppAuthInterface extends Interface { + getFunction(nameOrSignature: "isAppAllowed"): FunctionFragment; + + encodeFunctionData( + functionFragment: "isAppAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + + decodeFunctionResult( + functionFragment: "isAppAllowed", + data: BytesLike + ): Result; +} + +export interface IAppAuth extends BaseContract { + connect(runner?: ContractRunner | null): IAppAuth; + waitForDeployment(): Promise; + + interface: IAppAuthInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + isAppAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "isAppAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/KmsAuth.ts b/kms/auth-eth/typechain-types/KmsAuth.ts new file mode 100644 index 00000000..889b8741 --- /dev/null +++ b/kms/auth-eth/typechain-types/KmsAuth.ts @@ -0,0 +1,943 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export declare namespace IAppAuth { + export type AppBootInfoStruct = { + appId: AddressLike; + composeHash: BytesLike; + instanceId: AddressLike; + deviceId: BytesLike; + mrAggregated: BytesLike; + mrImage: BytesLike; + }; + + export type AppBootInfoStructOutput = [ + appId: string, + composeHash: string, + instanceId: string, + deviceId: string, + mrAggregated: string, + mrImage: string + ] & { + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; + mrAggregated: string; + mrImage: string; + }; +} + +export declare namespace KmsAuth { + export type KmsInfoStruct = { + k256Pubkey: BytesLike; + caPubkey: BytesLike; + quote: BytesLike; + eventlog: BytesLike; + }; + + export type KmsInfoStructOutput = [ + k256Pubkey: string, + caPubkey: string, + quote: string, + eventlog: string + ] & { k256Pubkey: string; caPubkey: string; quote: string; eventlog: string }; +} + +export interface KmsAuthInterface extends Interface { + getFunction( + nameOrSignature: + | "allowedAggregatedMrs" + | "allowedImages" + | "allowedKmsComposeHashes" + | "allowedKmsDeviceIds" + | "apps" + | "calculateAppId" + | "deregisterAggregatedMr" + | "deregisterImage" + | "deregisterKmsComposeHash" + | "deregisterKmsDeviceId" + | "initialize" + | "isAppAllowed" + | "isKmsAllowed" + | "kmsInfo" + | "owner" + | "registerAggregatedMr" + | "registerApp" + | "registerImage" + | "registerKmsComposeHash" + | "registerKmsDeviceId" + | "setKmsEventlog" + | "setKmsInfo" + | "setKmsQuote" + | "setTproxyAppId" + | "tproxyAppId" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "AggregatedMrDeregistered" + | "AggregatedMrRegistered" + | "AppRegistered" + | "ImageDeregistered" + | "ImageRegistered" + | "KmsComposeHashDeregistered" + | "KmsComposeHashRegistered" + | "KmsDeviceIdDeregistered" + | "KmsDeviceIdRegistered" + | "KmsInfoSet" + | "OwnershipTransferred" + | "TproxyAppIdSet" + ): EventFragment; + + encodeFunctionData( + functionFragment: "allowedAggregatedMrs", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedImages", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedKmsComposeHashes", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedKmsDeviceIds", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "apps", values: [AddressLike]): string; + encodeFunctionData( + functionFragment: "calculateAppId", + values: [AddressLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterAggregatedMr", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterImage", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterKmsComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterKmsDeviceId", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "isAppAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + encodeFunctionData( + functionFragment: "isKmsAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + encodeFunctionData(functionFragment: "kmsInfo", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "registerAggregatedMr", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "registerApp", + values: [BytesLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "registerImage", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "registerKmsComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "registerKmsDeviceId", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setKmsEventlog", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setKmsInfo", + values: [KmsAuth.KmsInfoStruct] + ): string; + encodeFunctionData( + functionFragment: "setKmsQuote", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setTproxyAppId", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "tproxyAppId", + values?: undefined + ): string; + + decodeFunctionResult( + functionFragment: "allowedAggregatedMrs", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedImages", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedKmsComposeHashes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedKmsDeviceIds", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "apps", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "calculateAppId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterAggregatedMr", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterKmsComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterKmsDeviceId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isAppAllowed", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isKmsAllowed", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "kmsInfo", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "registerAggregatedMr", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerApp", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerKmsComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerKmsDeviceId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setKmsEventlog", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setKmsInfo", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setKmsQuote", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setTproxyAppId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tproxyAppId", + data: BytesLike + ): Result; +} + +export namespace AggregatedMrDeregisteredEvent { + export type InputTuple = [mrAggregated: BytesLike]; + export type OutputTuple = [mrAggregated: string]; + export interface OutputObject { + mrAggregated: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace AggregatedMrRegisteredEvent { + export type InputTuple = [mrAggregated: BytesLike]; + export type OutputTuple = [mrAggregated: string]; + export interface OutputObject { + mrAggregated: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace AppRegisteredEvent { + export type InputTuple = [appId: AddressLike]; + export type OutputTuple = [appId: string]; + export interface OutputObject { + appId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ImageDeregisteredEvent { + export type InputTuple = [mrImage: BytesLike]; + export type OutputTuple = [mrImage: string]; + export interface OutputObject { + mrImage: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ImageRegisteredEvent { + export type InputTuple = [mrImage: BytesLike]; + export type OutputTuple = [mrImage: string]; + export interface OutputObject { + mrImage: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsComposeHashDeregisteredEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsComposeHashRegisteredEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsDeviceIdDeregisteredEvent { + export type InputTuple = [deviceId: BytesLike]; + export type OutputTuple = [deviceId: string]; + export interface OutputObject { + deviceId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsDeviceIdRegisteredEvent { + export type InputTuple = [deviceId: BytesLike]; + export type OutputTuple = [deviceId: string]; + export interface OutputObject { + deviceId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsInfoSetEvent { + export type InputTuple = [k256Pubkey: BytesLike]; + export type OutputTuple = [k256Pubkey: string]; + export interface OutputObject { + k256Pubkey: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TproxyAppIdSetEvent { + export type InputTuple = [tproxyAppId: string]; + export type OutputTuple = [tproxyAppId: string]; + export interface OutputObject { + tproxyAppId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface KmsAuth extends BaseContract { + connect(runner?: ContractRunner | null): KmsAuth; + waitForDeployment(): Promise; + + interface: KmsAuthInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + allowedAggregatedMrs: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + allowedImages: TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + + allowedKmsComposeHashes: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + allowedKmsDeviceIds: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + apps: TypedContractMethod< + [arg0: AddressLike], + [[boolean, string] & { isRegistered: boolean; controller: string }], + "view" + >; + + calculateAppId: TypedContractMethod< + [sender: AddressLike, salt: BytesLike], + [string], + "view" + >; + + deregisterAggregatedMr: TypedContractMethod< + [mrAggregated: BytesLike], + [void], + "nonpayable" + >; + + deregisterImage: TypedContractMethod< + [mrImage: BytesLike], + [void], + "nonpayable" + >; + + deregisterKmsComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + deregisterKmsDeviceId: TypedContractMethod< + [deviceId: BytesLike], + [void], + "nonpayable" + >; + + initialize: TypedContractMethod<[_owner: AddressLike], [void], "nonpayable">; + + isAppAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + isKmsAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + kmsInfo: TypedContractMethod< + [], + [ + [string, string, string, string] & { + k256Pubkey: string; + caPubkey: string; + quote: string; + eventlog: string; + } + ], + "view" + >; + + owner: TypedContractMethod<[], [string], "view">; + + registerAggregatedMr: TypedContractMethod< + [mrAggregated: BytesLike], + [void], + "nonpayable" + >; + + registerApp: TypedContractMethod< + [salt: BytesLike, controller: AddressLike], + [void], + "nonpayable" + >; + + registerImage: TypedContractMethod< + [mrImage: BytesLike], + [void], + "nonpayable" + >; + + registerKmsComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + registerKmsDeviceId: TypedContractMethod< + [deviceId: BytesLike], + [void], + "nonpayable" + >; + + setKmsEventlog: TypedContractMethod< + [eventlog: BytesLike], + [void], + "nonpayable" + >; + + setKmsInfo: TypedContractMethod< + [info: KmsAuth.KmsInfoStruct], + [void], + "nonpayable" + >; + + setKmsQuote: TypedContractMethod<[quote: BytesLike], [void], "nonpayable">; + + setTproxyAppId: TypedContractMethod<[appId: string], [void], "nonpayable">; + + tproxyAppId: TypedContractMethod<[], [string], "view">; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "allowedAggregatedMrs" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "allowedImages" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "allowedKmsComposeHashes" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "allowedKmsDeviceIds" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "apps" + ): TypedContractMethod< + [arg0: AddressLike], + [[boolean, string] & { isRegistered: boolean; controller: string }], + "view" + >; + getFunction( + nameOrSignature: "calculateAppId" + ): TypedContractMethod< + [sender: AddressLike, salt: BytesLike], + [string], + "view" + >; + getFunction( + nameOrSignature: "deregisterAggregatedMr" + ): TypedContractMethod<[mrAggregated: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "deregisterImage" + ): TypedContractMethod<[mrImage: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "deregisterKmsComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "deregisterKmsDeviceId" + ): TypedContractMethod<[deviceId: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "initialize" + ): TypedContractMethod<[_owner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "isAppAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + getFunction( + nameOrSignature: "isKmsAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + getFunction( + nameOrSignature: "kmsInfo" + ): TypedContractMethod< + [], + [ + [string, string, string, string] & { + k256Pubkey: string; + caPubkey: string; + quote: string; + eventlog: string; + } + ], + "view" + >; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "registerAggregatedMr" + ): TypedContractMethod<[mrAggregated: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "registerApp" + ): TypedContractMethod< + [salt: BytesLike, controller: AddressLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "registerImage" + ): TypedContractMethod<[mrImage: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "registerKmsComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "registerKmsDeviceId" + ): TypedContractMethod<[deviceId: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "setKmsEventlog" + ): TypedContractMethod<[eventlog: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "setKmsInfo" + ): TypedContractMethod<[info: KmsAuth.KmsInfoStruct], [void], "nonpayable">; + getFunction( + nameOrSignature: "setKmsQuote" + ): TypedContractMethod<[quote: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "setTproxyAppId" + ): TypedContractMethod<[appId: string], [void], "nonpayable">; + getFunction( + nameOrSignature: "tproxyAppId" + ): TypedContractMethod<[], [string], "view">; + + getEvent( + key: "AggregatedMrDeregistered" + ): TypedContractEvent< + AggregatedMrDeregisteredEvent.InputTuple, + AggregatedMrDeregisteredEvent.OutputTuple, + AggregatedMrDeregisteredEvent.OutputObject + >; + getEvent( + key: "AggregatedMrRegistered" + ): TypedContractEvent< + AggregatedMrRegisteredEvent.InputTuple, + AggregatedMrRegisteredEvent.OutputTuple, + AggregatedMrRegisteredEvent.OutputObject + >; + getEvent( + key: "AppRegistered" + ): TypedContractEvent< + AppRegisteredEvent.InputTuple, + AppRegisteredEvent.OutputTuple, + AppRegisteredEvent.OutputObject + >; + getEvent( + key: "ImageDeregistered" + ): TypedContractEvent< + ImageDeregisteredEvent.InputTuple, + ImageDeregisteredEvent.OutputTuple, + ImageDeregisteredEvent.OutputObject + >; + getEvent( + key: "ImageRegistered" + ): TypedContractEvent< + ImageRegisteredEvent.InputTuple, + ImageRegisteredEvent.OutputTuple, + ImageRegisteredEvent.OutputObject + >; + getEvent( + key: "KmsComposeHashDeregistered" + ): TypedContractEvent< + KmsComposeHashDeregisteredEvent.InputTuple, + KmsComposeHashDeregisteredEvent.OutputTuple, + KmsComposeHashDeregisteredEvent.OutputObject + >; + getEvent( + key: "KmsComposeHashRegistered" + ): TypedContractEvent< + KmsComposeHashRegisteredEvent.InputTuple, + KmsComposeHashRegisteredEvent.OutputTuple, + KmsComposeHashRegisteredEvent.OutputObject + >; + getEvent( + key: "KmsDeviceIdDeregistered" + ): TypedContractEvent< + KmsDeviceIdDeregisteredEvent.InputTuple, + KmsDeviceIdDeregisteredEvent.OutputTuple, + KmsDeviceIdDeregisteredEvent.OutputObject + >; + getEvent( + key: "KmsDeviceIdRegistered" + ): TypedContractEvent< + KmsDeviceIdRegisteredEvent.InputTuple, + KmsDeviceIdRegisteredEvent.OutputTuple, + KmsDeviceIdRegisteredEvent.OutputObject + >; + getEvent( + key: "KmsInfoSet" + ): TypedContractEvent< + KmsInfoSetEvent.InputTuple, + KmsInfoSetEvent.OutputTuple, + KmsInfoSetEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + getEvent( + key: "TproxyAppIdSet" + ): TypedContractEvent< + TproxyAppIdSetEvent.InputTuple, + TproxyAppIdSetEvent.OutputTuple, + TproxyAppIdSetEvent.OutputObject + >; + + filters: { + "AggregatedMrDeregistered(bytes32)": TypedContractEvent< + AggregatedMrDeregisteredEvent.InputTuple, + AggregatedMrDeregisteredEvent.OutputTuple, + AggregatedMrDeregisteredEvent.OutputObject + >; + AggregatedMrDeregistered: TypedContractEvent< + AggregatedMrDeregisteredEvent.InputTuple, + AggregatedMrDeregisteredEvent.OutputTuple, + AggregatedMrDeregisteredEvent.OutputObject + >; + + "AggregatedMrRegistered(bytes32)": TypedContractEvent< + AggregatedMrRegisteredEvent.InputTuple, + AggregatedMrRegisteredEvent.OutputTuple, + AggregatedMrRegisteredEvent.OutputObject + >; + AggregatedMrRegistered: TypedContractEvent< + AggregatedMrRegisteredEvent.InputTuple, + AggregatedMrRegisteredEvent.OutputTuple, + AggregatedMrRegisteredEvent.OutputObject + >; + + "AppRegistered(address)": TypedContractEvent< + AppRegisteredEvent.InputTuple, + AppRegisteredEvent.OutputTuple, + AppRegisteredEvent.OutputObject + >; + AppRegistered: TypedContractEvent< + AppRegisteredEvent.InputTuple, + AppRegisteredEvent.OutputTuple, + AppRegisteredEvent.OutputObject + >; + + "ImageDeregistered(bytes32)": TypedContractEvent< + ImageDeregisteredEvent.InputTuple, + ImageDeregisteredEvent.OutputTuple, + ImageDeregisteredEvent.OutputObject + >; + ImageDeregistered: TypedContractEvent< + ImageDeregisteredEvent.InputTuple, + ImageDeregisteredEvent.OutputTuple, + ImageDeregisteredEvent.OutputObject + >; + + "ImageRegistered(bytes32)": TypedContractEvent< + ImageRegisteredEvent.InputTuple, + ImageRegisteredEvent.OutputTuple, + ImageRegisteredEvent.OutputObject + >; + ImageRegistered: TypedContractEvent< + ImageRegisteredEvent.InputTuple, + ImageRegisteredEvent.OutputTuple, + ImageRegisteredEvent.OutputObject + >; + + "KmsComposeHashDeregistered(bytes32)": TypedContractEvent< + KmsComposeHashDeregisteredEvent.InputTuple, + KmsComposeHashDeregisteredEvent.OutputTuple, + KmsComposeHashDeregisteredEvent.OutputObject + >; + KmsComposeHashDeregistered: TypedContractEvent< + KmsComposeHashDeregisteredEvent.InputTuple, + KmsComposeHashDeregisteredEvent.OutputTuple, + KmsComposeHashDeregisteredEvent.OutputObject + >; + + "KmsComposeHashRegistered(bytes32)": TypedContractEvent< + KmsComposeHashRegisteredEvent.InputTuple, + KmsComposeHashRegisteredEvent.OutputTuple, + KmsComposeHashRegisteredEvent.OutputObject + >; + KmsComposeHashRegistered: TypedContractEvent< + KmsComposeHashRegisteredEvent.InputTuple, + KmsComposeHashRegisteredEvent.OutputTuple, + KmsComposeHashRegisteredEvent.OutputObject + >; + + "KmsDeviceIdDeregistered(bytes32)": TypedContractEvent< + KmsDeviceIdDeregisteredEvent.InputTuple, + KmsDeviceIdDeregisteredEvent.OutputTuple, + KmsDeviceIdDeregisteredEvent.OutputObject + >; + KmsDeviceIdDeregistered: TypedContractEvent< + KmsDeviceIdDeregisteredEvent.InputTuple, + KmsDeviceIdDeregisteredEvent.OutputTuple, + KmsDeviceIdDeregisteredEvent.OutputObject + >; + + "KmsDeviceIdRegistered(bytes32)": TypedContractEvent< + KmsDeviceIdRegisteredEvent.InputTuple, + KmsDeviceIdRegisteredEvent.OutputTuple, + KmsDeviceIdRegisteredEvent.OutputObject + >; + KmsDeviceIdRegistered: TypedContractEvent< + KmsDeviceIdRegisteredEvent.InputTuple, + KmsDeviceIdRegisteredEvent.OutputTuple, + KmsDeviceIdRegisteredEvent.OutputObject + >; + + "KmsInfoSet(bytes)": TypedContractEvent< + KmsInfoSetEvent.InputTuple, + KmsInfoSetEvent.OutputTuple, + KmsInfoSetEvent.OutputObject + >; + KmsInfoSet: TypedContractEvent< + KmsInfoSetEvent.InputTuple, + KmsInfoSetEvent.OutputTuple, + KmsInfoSetEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + "TproxyAppIdSet(string)": TypedContractEvent< + TproxyAppIdSetEvent.InputTuple, + TproxyAppIdSetEvent.OutputTuple, + TproxyAppIdSetEvent.OutputObject + >; + TproxyAppIdSet: TypedContractEvent< + TproxyAppIdSetEvent.InputTuple, + TproxyAppIdSetEvent.OutputTuple, + TproxyAppIdSetEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/common.ts b/kms/auth-eth/typechain-types/common.ts new file mode 100644 index 00000000..56b5f21e --- /dev/null +++ b/kms/auth-eth/typechain-types/common.ts @@ -0,0 +1,131 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + FunctionFragment, + Typed, + EventFragment, + ContractTransaction, + ContractTransactionResponse, + DeferredTopicFilter, + EventLog, + TransactionRequest, + LogDescription, +} from "ethers"; + +export interface TypedDeferredTopicFilter<_TCEvent extends TypedContractEvent> + extends DeferredTopicFilter {} + +export interface TypedContractEvent< + InputTuple extends Array = any, + OutputTuple extends Array = any, + OutputObject = any +> { + (...args: Partial): TypedDeferredTopicFilter< + TypedContractEvent + >; + name: string; + fragment: EventFragment; + getFragment(...args: Partial): EventFragment; +} + +type __TypechainAOutputTuple = T extends TypedContractEvent< + infer _U, + infer W +> + ? W + : never; +type __TypechainOutputObject = T extends TypedContractEvent< + infer _U, + infer _W, + infer V +> + ? V + : never; + +export interface TypedEventLog + extends Omit { + args: __TypechainAOutputTuple & __TypechainOutputObject; +} + +export interface TypedLogDescription + extends Omit { + args: __TypechainAOutputTuple & __TypechainOutputObject; +} + +export type TypedListener = ( + ...listenerArg: [ + ...__TypechainAOutputTuple, + TypedEventLog, + ...undefined[] + ] +) => void; + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; + +export type StateMutability = "nonpayable" | "payable" | "view"; + +export type BaseOverrides = Omit; +export type NonPayableOverrides = Omit< + BaseOverrides, + "value" | "blockTag" | "enableCcipRead" +>; +export type PayableOverrides = Omit< + BaseOverrides, + "blockTag" | "enableCcipRead" +>; +export type ViewOverrides = Omit; +export type Overrides = S extends "nonpayable" + ? NonPayableOverrides + : S extends "payable" + ? PayableOverrides + : ViewOverrides; + +export type PostfixOverrides, S extends StateMutability> = + | A + | [...A, Overrides]; +export type ContractMethodArgs< + A extends Array, + S extends StateMutability +> = PostfixOverrides<{ [I in keyof A]-?: A[I] | Typed }, S>; + +export type DefaultReturnType = R extends Array ? R[0] : R; + +// export interface ContractMethod = Array, R = any, D extends R | ContractTransactionResponse = R | ContractTransactionResponse> { +export interface TypedContractMethod< + A extends Array = Array, + R = any, + S extends StateMutability = "payable" +> { + (...args: ContractMethodArgs): S extends "view" + ? Promise> + : Promise; + + name: string; + + fragment: FunctionFragment; + + getFragment(...args: ContractMethodArgs): FunctionFragment; + + populateTransaction( + ...args: ContractMethodArgs + ): Promise; + staticCall( + ...args: ContractMethodArgs + ): Promise>; + send(...args: ContractMethodArgs): Promise; + estimateGas(...args: ContractMethodArgs): Promise; + staticCallResult(...args: ContractMethodArgs): Promise; +} diff --git a/kms/auth-eth/typechain-types/contracts/AppAuth.ts b/kms/auth-eth/typechain-types/contracts/AppAuth.ts new file mode 100644 index 00000000..6fa65edb --- /dev/null +++ b/kms/auth-eth/typechain-types/contracts/AppAuth.ts @@ -0,0 +1,507 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export declare namespace IAppAuth { + export type AppBootInfoStruct = { + appId: AddressLike; + composeHash: BytesLike; + instanceId: AddressLike; + deviceId: BytesLike; + mrAggregated: BytesLike; + mrImage: BytesLike; + }; + + export type AppBootInfoStructOutput = [ + appId: string, + composeHash: string, + instanceId: string, + deviceId: string, + mrAggregated: string, + mrImage: string + ] & { + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; + mrAggregated: string; + mrImage: string; + }; +} + +export interface AppAuthInterface extends Interface { + getFunction( + nameOrSignature: + | "UPGRADE_INTERFACE_VERSION" + | "addComposeHash" + | "allowedComposeHashes" + | "appId" + | "disableUpgrades" + | "initialize" + | "isAppAllowed" + | "owner" + | "proxiableUUID" + | "removeComposeHash" + | "renounceOwnership" + | "transferOwnership" + | "upgradeToAndCall" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "ComposeHashAdded" + | "ComposeHashRemoved" + | "Initialized" + | "OwnershipTransferred" + | "Upgraded" + | "UpgradesDisabled" + ): EventFragment; + + encodeFunctionData( + functionFragment: "UPGRADE_INTERFACE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "addComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedComposeHashes", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "appId", values?: undefined): string; + encodeFunctionData( + functionFragment: "disableUpgrades", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [AddressLike, AddressLike, boolean] + ): string; + encodeFunctionData( + functionFragment: "isAppAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "removeComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "upgradeToAndCall", + values: [AddressLike, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "UPGRADE_INTERFACE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedComposeHashes", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "appId", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "disableUpgrades", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isAppAllowed", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "upgradeToAndCall", + data: BytesLike + ): Result; +} + +export namespace ComposeHashAddedEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ComposeHashRemovedEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace UpgradedEvent { + export type InputTuple = [implementation: AddressLike]; + export type OutputTuple = [implementation: string]; + export interface OutputObject { + implementation: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace UpgradesDisabledEvent { + export type InputTuple = []; + export type OutputTuple = []; + export interface OutputObject {} + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface AppAuth extends BaseContract { + connect(runner?: ContractRunner | null): AppAuth; + waitForDeployment(): Promise; + + interface: AppAuthInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; + + addComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + allowedComposeHashes: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + appId: TypedContractMethod<[], [string], "view">; + + disableUpgrades: TypedContractMethod<[], [void], "nonpayable">; + + initialize: TypedContractMethod< + [initialOwner: AddressLike, _appId: AddressLike, _disableUpgrades: boolean], + [void], + "nonpayable" + >; + + isAppAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + owner: TypedContractMethod<[], [string], "view">; + + proxiableUUID: TypedContractMethod<[], [string], "view">; + + removeComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + upgradeToAndCall: TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "UPGRADE_INTERFACE_VERSION" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "addComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "allowedComposeHashes" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "appId" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "disableUpgrades" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "initialize" + ): TypedContractMethod< + [initialOwner: AddressLike, _appId: AddressLike, _disableUpgrades: boolean], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "isAppAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "proxiableUUID" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "removeComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "upgradeToAndCall" + ): TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + getEvent( + key: "ComposeHashAdded" + ): TypedContractEvent< + ComposeHashAddedEvent.InputTuple, + ComposeHashAddedEvent.OutputTuple, + ComposeHashAddedEvent.OutputObject + >; + getEvent( + key: "ComposeHashRemoved" + ): TypedContractEvent< + ComposeHashRemovedEvent.InputTuple, + ComposeHashRemovedEvent.OutputTuple, + ComposeHashRemovedEvent.OutputObject + >; + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + getEvent( + key: "Upgraded" + ): TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + getEvent( + key: "UpgradesDisabled" + ): TypedContractEvent< + UpgradesDisabledEvent.InputTuple, + UpgradesDisabledEvent.OutputTuple, + UpgradesDisabledEvent.OutputObject + >; + + filters: { + "ComposeHashAdded(bytes32)": TypedContractEvent< + ComposeHashAddedEvent.InputTuple, + ComposeHashAddedEvent.OutputTuple, + ComposeHashAddedEvent.OutputObject + >; + ComposeHashAdded: TypedContractEvent< + ComposeHashAddedEvent.InputTuple, + ComposeHashAddedEvent.OutputTuple, + ComposeHashAddedEvent.OutputObject + >; + + "ComposeHashRemoved(bytes32)": TypedContractEvent< + ComposeHashRemovedEvent.InputTuple, + ComposeHashRemovedEvent.OutputTuple, + ComposeHashRemovedEvent.OutputObject + >; + ComposeHashRemoved: TypedContractEvent< + ComposeHashRemovedEvent.InputTuple, + ComposeHashRemovedEvent.OutputTuple, + ComposeHashRemovedEvent.OutputObject + >; + + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + "Upgraded(address)": TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + Upgraded: TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + + "UpgradesDisabled()": TypedContractEvent< + UpgradesDisabledEvent.InputTuple, + UpgradesDisabledEvent.OutputTuple, + UpgradesDisabledEvent.OutputObject + >; + UpgradesDisabled: TypedContractEvent< + UpgradesDisabledEvent.InputTuple, + UpgradesDisabledEvent.OutputTuple, + UpgradesDisabledEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/contracts/IAppAuth.ts b/kms/auth-eth/typechain-types/contracts/IAppAuth.ts new file mode 100644 index 00000000..2e50b60e --- /dev/null +++ b/kms/auth-eth/typechain-types/contracts/IAppAuth.ts @@ -0,0 +1,126 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../common"; + +export declare namespace IAppAuth { + export type AppBootInfoStruct = { + appId: AddressLike; + composeHash: BytesLike; + instanceId: AddressLike; + deviceId: BytesLike; + mrAggregated: BytesLike; + mrImage: BytesLike; + }; + + export type AppBootInfoStructOutput = [ + appId: string, + composeHash: string, + instanceId: string, + deviceId: string, + mrAggregated: string, + mrImage: string + ] & { + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; + mrAggregated: string; + mrImage: string; + }; +} + +export interface IAppAuthInterface extends Interface { + getFunction(nameOrSignature: "isAppAllowed"): FunctionFragment; + + encodeFunctionData( + functionFragment: "isAppAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + + decodeFunctionResult( + functionFragment: "isAppAllowed", + data: BytesLike + ): Result; +} + +export interface IAppAuth extends BaseContract { + connect(runner?: ContractRunner | null): IAppAuth; + waitForDeployment(): Promise; + + interface: IAppAuthInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + isAppAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "isAppAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + filters: {}; +} diff --git a/kms/auth-eth/typechain-types/contracts/KmsAuth.ts b/kms/auth-eth/typechain-types/contracts/KmsAuth.ts new file mode 100644 index 00000000..49240b48 --- /dev/null +++ b/kms/auth-eth/typechain-types/contracts/KmsAuth.ts @@ -0,0 +1,1092 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export declare namespace IAppAuth { + export type AppBootInfoStruct = { + appId: AddressLike; + composeHash: BytesLike; + instanceId: AddressLike; + deviceId: BytesLike; + mrAggregated: BytesLike; + mrImage: BytesLike; + }; + + export type AppBootInfoStructOutput = [ + appId: string, + composeHash: string, + instanceId: string, + deviceId: string, + mrAggregated: string, + mrImage: string + ] & { + appId: string; + composeHash: string; + instanceId: string; + deviceId: string; + mrAggregated: string; + mrImage: string; + }; +} + +export declare namespace KmsAuth { + export type KmsInfoStruct = { + k256Pubkey: BytesLike; + caPubkey: BytesLike; + quote: BytesLike; + eventlog: BytesLike; + }; + + export type KmsInfoStructOutput = [ + k256Pubkey: string, + caPubkey: string, + quote: string, + eventlog: string + ] & { k256Pubkey: string; caPubkey: string; quote: string; eventlog: string }; +} + +export interface KmsAuthInterface extends Interface { + getFunction( + nameOrSignature: + | "UPGRADE_INTERFACE_VERSION" + | "allowedAggregatedMrs" + | "allowedImages" + | "allowedKmsComposeHashes" + | "allowedKmsDeviceIds" + | "apps" + | "calculateAppId" + | "deregisterAggregatedMr" + | "deregisterImage" + | "deregisterKmsComposeHash" + | "deregisterKmsDeviceId" + | "initialize" + | "isAppAllowed" + | "isKmsAllowed" + | "kmsInfo" + | "owner" + | "proxiableUUID" + | "registerAggregatedMr" + | "registerApp" + | "registerImage" + | "registerKmsComposeHash" + | "registerKmsDeviceId" + | "renounceOwnership" + | "setKmsEventlog" + | "setKmsInfo" + | "setKmsQuote" + | "setTproxyAppId" + | "tproxyAppId" + | "transferOwnership" + | "upgradeToAndCall" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "AggregatedMrDeregistered" + | "AggregatedMrRegistered" + | "AppRegistered" + | "ImageDeregistered" + | "ImageRegistered" + | "Initialized" + | "KmsComposeHashDeregistered" + | "KmsComposeHashRegistered" + | "KmsDeviceIdDeregistered" + | "KmsDeviceIdRegistered" + | "KmsInfoSet" + | "OwnershipTransferred" + | "TproxyAppIdSet" + | "Upgraded" + ): EventFragment; + + encodeFunctionData( + functionFragment: "UPGRADE_INTERFACE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "allowedAggregatedMrs", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedImages", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedKmsComposeHashes", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "allowedKmsDeviceIds", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "apps", values: [AddressLike]): string; + encodeFunctionData( + functionFragment: "calculateAppId", + values: [AddressLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterAggregatedMr", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterImage", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterKmsComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deregisterKmsDeviceId", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "isAppAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + encodeFunctionData( + functionFragment: "isKmsAllowed", + values: [IAppAuth.AppBootInfoStruct] + ): string; + encodeFunctionData(functionFragment: "kmsInfo", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "registerAggregatedMr", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "registerApp", + values: [BytesLike, AddressLike] + ): string; + encodeFunctionData( + functionFragment: "registerImage", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "registerKmsComposeHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "registerKmsDeviceId", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setKmsEventlog", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setKmsInfo", + values: [KmsAuth.KmsInfoStruct] + ): string; + encodeFunctionData( + functionFragment: "setKmsQuote", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setTproxyAppId", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "tproxyAppId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "upgradeToAndCall", + values: [AddressLike, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "UPGRADE_INTERFACE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedAggregatedMrs", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedImages", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedKmsComposeHashes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allowedKmsDeviceIds", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "apps", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "calculateAppId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterAggregatedMr", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterKmsComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterKmsDeviceId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isAppAllowed", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isKmsAllowed", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "kmsInfo", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerAggregatedMr", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerApp", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerImage", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerKmsComposeHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerKmsDeviceId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setKmsEventlog", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setKmsInfo", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setKmsQuote", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setTproxyAppId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tproxyAppId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "upgradeToAndCall", + data: BytesLike + ): Result; +} + +export namespace AggregatedMrDeregisteredEvent { + export type InputTuple = [mrAggregated: BytesLike]; + export type OutputTuple = [mrAggregated: string]; + export interface OutputObject { + mrAggregated: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace AggregatedMrRegisteredEvent { + export type InputTuple = [mrAggregated: BytesLike]; + export type OutputTuple = [mrAggregated: string]; + export interface OutputObject { + mrAggregated: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace AppRegisteredEvent { + export type InputTuple = [appId: AddressLike]; + export type OutputTuple = [appId: string]; + export interface OutputObject { + appId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ImageDeregisteredEvent { + export type InputTuple = [mrImage: BytesLike]; + export type OutputTuple = [mrImage: string]; + export interface OutputObject { + mrImage: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ImageRegisteredEvent { + export type InputTuple = [mrImage: BytesLike]; + export type OutputTuple = [mrImage: string]; + export interface OutputObject { + mrImage: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsComposeHashDeregisteredEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsComposeHashRegisteredEvent { + export type InputTuple = [composeHash: BytesLike]; + export type OutputTuple = [composeHash: string]; + export interface OutputObject { + composeHash: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsDeviceIdDeregisteredEvent { + export type InputTuple = [deviceId: BytesLike]; + export type OutputTuple = [deviceId: string]; + export interface OutputObject { + deviceId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsDeviceIdRegisteredEvent { + export type InputTuple = [deviceId: BytesLike]; + export type OutputTuple = [deviceId: string]; + export interface OutputObject { + deviceId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace KmsInfoSetEvent { + export type InputTuple = [k256Pubkey: BytesLike]; + export type OutputTuple = [k256Pubkey: string]; + export interface OutputObject { + k256Pubkey: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace TproxyAppIdSetEvent { + export type InputTuple = [tproxyAppId: string]; + export type OutputTuple = [tproxyAppId: string]; + export interface OutputObject { + tproxyAppId: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace UpgradedEvent { + export type InputTuple = [implementation: AddressLike]; + export type OutputTuple = [implementation: string]; + export interface OutputObject { + implementation: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface KmsAuth extends BaseContract { + connect(runner?: ContractRunner | null): KmsAuth; + waitForDeployment(): Promise; + + interface: KmsAuthInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; + + allowedAggregatedMrs: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + allowedImages: TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + + allowedKmsComposeHashes: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + allowedKmsDeviceIds: TypedContractMethod< + [arg0: BytesLike], + [boolean], + "view" + >; + + apps: TypedContractMethod< + [arg0: AddressLike], + [[boolean, string] & { isRegistered: boolean; controller: string }], + "view" + >; + + calculateAppId: TypedContractMethod< + [sender: AddressLike, salt: BytesLike], + [string], + "view" + >; + + deregisterAggregatedMr: TypedContractMethod< + [mrAggregated: BytesLike], + [void], + "nonpayable" + >; + + deregisterImage: TypedContractMethod< + [mrImage: BytesLike], + [void], + "nonpayable" + >; + + deregisterKmsComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + deregisterKmsDeviceId: TypedContractMethod< + [deviceId: BytesLike], + [void], + "nonpayable" + >; + + initialize: TypedContractMethod< + [initialOwner: AddressLike], + [void], + "nonpayable" + >; + + isAppAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + isKmsAllowed: TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + + kmsInfo: TypedContractMethod< + [], + [ + [string, string, string, string] & { + k256Pubkey: string; + caPubkey: string; + quote: string; + eventlog: string; + } + ], + "view" + >; + + owner: TypedContractMethod<[], [string], "view">; + + proxiableUUID: TypedContractMethod<[], [string], "view">; + + registerAggregatedMr: TypedContractMethod< + [mrAggregated: BytesLike], + [void], + "nonpayable" + >; + + registerApp: TypedContractMethod< + [salt: BytesLike, controller: AddressLike], + [void], + "nonpayable" + >; + + registerImage: TypedContractMethod< + [mrImage: BytesLike], + [void], + "nonpayable" + >; + + registerKmsComposeHash: TypedContractMethod< + [composeHash: BytesLike], + [void], + "nonpayable" + >; + + registerKmsDeviceId: TypedContractMethod< + [deviceId: BytesLike], + [void], + "nonpayable" + >; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + setKmsEventlog: TypedContractMethod< + [eventlog: BytesLike], + [void], + "nonpayable" + >; + + setKmsInfo: TypedContractMethod< + [info: KmsAuth.KmsInfoStruct], + [void], + "nonpayable" + >; + + setKmsQuote: TypedContractMethod<[quote: BytesLike], [void], "nonpayable">; + + setTproxyAppId: TypedContractMethod<[appId: string], [void], "nonpayable">; + + tproxyAppId: TypedContractMethod<[], [string], "view">; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + upgradeToAndCall: TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "UPGRADE_INTERFACE_VERSION" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "allowedAggregatedMrs" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "allowedImages" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "allowedKmsComposeHashes" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "allowedKmsDeviceIds" + ): TypedContractMethod<[arg0: BytesLike], [boolean], "view">; + getFunction( + nameOrSignature: "apps" + ): TypedContractMethod< + [arg0: AddressLike], + [[boolean, string] & { isRegistered: boolean; controller: string }], + "view" + >; + getFunction( + nameOrSignature: "calculateAppId" + ): TypedContractMethod< + [sender: AddressLike, salt: BytesLike], + [string], + "view" + >; + getFunction( + nameOrSignature: "deregisterAggregatedMr" + ): TypedContractMethod<[mrAggregated: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "deregisterImage" + ): TypedContractMethod<[mrImage: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "deregisterKmsComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "deregisterKmsDeviceId" + ): TypedContractMethod<[deviceId: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "initialize" + ): TypedContractMethod<[initialOwner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "isAppAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + getFunction( + nameOrSignature: "isKmsAllowed" + ): TypedContractMethod< + [bootInfo: IAppAuth.AppBootInfoStruct], + [[boolean, string] & { isAllowed: boolean; reason: string }], + "view" + >; + getFunction( + nameOrSignature: "kmsInfo" + ): TypedContractMethod< + [], + [ + [string, string, string, string] & { + k256Pubkey: string; + caPubkey: string; + quote: string; + eventlog: string; + } + ], + "view" + >; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "proxiableUUID" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "registerAggregatedMr" + ): TypedContractMethod<[mrAggregated: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "registerApp" + ): TypedContractMethod< + [salt: BytesLike, controller: AddressLike], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "registerImage" + ): TypedContractMethod<[mrImage: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "registerKmsComposeHash" + ): TypedContractMethod<[composeHash: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "registerKmsDeviceId" + ): TypedContractMethod<[deviceId: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "setKmsEventlog" + ): TypedContractMethod<[eventlog: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "setKmsInfo" + ): TypedContractMethod<[info: KmsAuth.KmsInfoStruct], [void], "nonpayable">; + getFunction( + nameOrSignature: "setKmsQuote" + ): TypedContractMethod<[quote: BytesLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "setTproxyAppId" + ): TypedContractMethod<[appId: string], [void], "nonpayable">; + getFunction( + nameOrSignature: "tproxyAppId" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "upgradeToAndCall" + ): TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + getEvent( + key: "AggregatedMrDeregistered" + ): TypedContractEvent< + AggregatedMrDeregisteredEvent.InputTuple, + AggregatedMrDeregisteredEvent.OutputTuple, + AggregatedMrDeregisteredEvent.OutputObject + >; + getEvent( + key: "AggregatedMrRegistered" + ): TypedContractEvent< + AggregatedMrRegisteredEvent.InputTuple, + AggregatedMrRegisteredEvent.OutputTuple, + AggregatedMrRegisteredEvent.OutputObject + >; + getEvent( + key: "AppRegistered" + ): TypedContractEvent< + AppRegisteredEvent.InputTuple, + AppRegisteredEvent.OutputTuple, + AppRegisteredEvent.OutputObject + >; + getEvent( + key: "ImageDeregistered" + ): TypedContractEvent< + ImageDeregisteredEvent.InputTuple, + ImageDeregisteredEvent.OutputTuple, + ImageDeregisteredEvent.OutputObject + >; + getEvent( + key: "ImageRegistered" + ): TypedContractEvent< + ImageRegisteredEvent.InputTuple, + ImageRegisteredEvent.OutputTuple, + ImageRegisteredEvent.OutputObject + >; + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + getEvent( + key: "KmsComposeHashDeregistered" + ): TypedContractEvent< + KmsComposeHashDeregisteredEvent.InputTuple, + KmsComposeHashDeregisteredEvent.OutputTuple, + KmsComposeHashDeregisteredEvent.OutputObject + >; + getEvent( + key: "KmsComposeHashRegistered" + ): TypedContractEvent< + KmsComposeHashRegisteredEvent.InputTuple, + KmsComposeHashRegisteredEvent.OutputTuple, + KmsComposeHashRegisteredEvent.OutputObject + >; + getEvent( + key: "KmsDeviceIdDeregistered" + ): TypedContractEvent< + KmsDeviceIdDeregisteredEvent.InputTuple, + KmsDeviceIdDeregisteredEvent.OutputTuple, + KmsDeviceIdDeregisteredEvent.OutputObject + >; + getEvent( + key: "KmsDeviceIdRegistered" + ): TypedContractEvent< + KmsDeviceIdRegisteredEvent.InputTuple, + KmsDeviceIdRegisteredEvent.OutputTuple, + KmsDeviceIdRegisteredEvent.OutputObject + >; + getEvent( + key: "KmsInfoSet" + ): TypedContractEvent< + KmsInfoSetEvent.InputTuple, + KmsInfoSetEvent.OutputTuple, + KmsInfoSetEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + getEvent( + key: "TproxyAppIdSet" + ): TypedContractEvent< + TproxyAppIdSetEvent.InputTuple, + TproxyAppIdSetEvent.OutputTuple, + TproxyAppIdSetEvent.OutputObject + >; + getEvent( + key: "Upgraded" + ): TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + + filters: { + "AggregatedMrDeregistered(bytes32)": TypedContractEvent< + AggregatedMrDeregisteredEvent.InputTuple, + AggregatedMrDeregisteredEvent.OutputTuple, + AggregatedMrDeregisteredEvent.OutputObject + >; + AggregatedMrDeregistered: TypedContractEvent< + AggregatedMrDeregisteredEvent.InputTuple, + AggregatedMrDeregisteredEvent.OutputTuple, + AggregatedMrDeregisteredEvent.OutputObject + >; + + "AggregatedMrRegistered(bytes32)": TypedContractEvent< + AggregatedMrRegisteredEvent.InputTuple, + AggregatedMrRegisteredEvent.OutputTuple, + AggregatedMrRegisteredEvent.OutputObject + >; + AggregatedMrRegistered: TypedContractEvent< + AggregatedMrRegisteredEvent.InputTuple, + AggregatedMrRegisteredEvent.OutputTuple, + AggregatedMrRegisteredEvent.OutputObject + >; + + "AppRegistered(address)": TypedContractEvent< + AppRegisteredEvent.InputTuple, + AppRegisteredEvent.OutputTuple, + AppRegisteredEvent.OutputObject + >; + AppRegistered: TypedContractEvent< + AppRegisteredEvent.InputTuple, + AppRegisteredEvent.OutputTuple, + AppRegisteredEvent.OutputObject + >; + + "ImageDeregistered(bytes32)": TypedContractEvent< + ImageDeregisteredEvent.InputTuple, + ImageDeregisteredEvent.OutputTuple, + ImageDeregisteredEvent.OutputObject + >; + ImageDeregistered: TypedContractEvent< + ImageDeregisteredEvent.InputTuple, + ImageDeregisteredEvent.OutputTuple, + ImageDeregisteredEvent.OutputObject + >; + + "ImageRegistered(bytes32)": TypedContractEvent< + ImageRegisteredEvent.InputTuple, + ImageRegisteredEvent.OutputTuple, + ImageRegisteredEvent.OutputObject + >; + ImageRegistered: TypedContractEvent< + ImageRegisteredEvent.InputTuple, + ImageRegisteredEvent.OutputTuple, + ImageRegisteredEvent.OutputObject + >; + + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + "KmsComposeHashDeregistered(bytes32)": TypedContractEvent< + KmsComposeHashDeregisteredEvent.InputTuple, + KmsComposeHashDeregisteredEvent.OutputTuple, + KmsComposeHashDeregisteredEvent.OutputObject + >; + KmsComposeHashDeregistered: TypedContractEvent< + KmsComposeHashDeregisteredEvent.InputTuple, + KmsComposeHashDeregisteredEvent.OutputTuple, + KmsComposeHashDeregisteredEvent.OutputObject + >; + + "KmsComposeHashRegistered(bytes32)": TypedContractEvent< + KmsComposeHashRegisteredEvent.InputTuple, + KmsComposeHashRegisteredEvent.OutputTuple, + KmsComposeHashRegisteredEvent.OutputObject + >; + KmsComposeHashRegistered: TypedContractEvent< + KmsComposeHashRegisteredEvent.InputTuple, + KmsComposeHashRegisteredEvent.OutputTuple, + KmsComposeHashRegisteredEvent.OutputObject + >; + + "KmsDeviceIdDeregistered(bytes32)": TypedContractEvent< + KmsDeviceIdDeregisteredEvent.InputTuple, + KmsDeviceIdDeregisteredEvent.OutputTuple, + KmsDeviceIdDeregisteredEvent.OutputObject + >; + KmsDeviceIdDeregistered: TypedContractEvent< + KmsDeviceIdDeregisteredEvent.InputTuple, + KmsDeviceIdDeregisteredEvent.OutputTuple, + KmsDeviceIdDeregisteredEvent.OutputObject + >; + + "KmsDeviceIdRegistered(bytes32)": TypedContractEvent< + KmsDeviceIdRegisteredEvent.InputTuple, + KmsDeviceIdRegisteredEvent.OutputTuple, + KmsDeviceIdRegisteredEvent.OutputObject + >; + KmsDeviceIdRegistered: TypedContractEvent< + KmsDeviceIdRegisteredEvent.InputTuple, + KmsDeviceIdRegisteredEvent.OutputTuple, + KmsDeviceIdRegisteredEvent.OutputObject + >; + + "KmsInfoSet(bytes)": TypedContractEvent< + KmsInfoSetEvent.InputTuple, + KmsInfoSetEvent.OutputTuple, + KmsInfoSetEvent.OutputObject + >; + KmsInfoSet: TypedContractEvent< + KmsInfoSetEvent.InputTuple, + KmsInfoSetEvent.OutputTuple, + KmsInfoSetEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + "TproxyAppIdSet(string)": TypedContractEvent< + TproxyAppIdSetEvent.InputTuple, + TproxyAppIdSetEvent.OutputTuple, + TproxyAppIdSetEvent.OutputObject + >; + TproxyAppIdSet: TypedContractEvent< + TproxyAppIdSetEvent.InputTuple, + TproxyAppIdSetEvent.OutputTuple, + TproxyAppIdSetEvent.OutputObject + >; + + "Upgraded(address)": TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + Upgraded: TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + }; +} diff --git a/kms/auth-eth/typechain-types/contracts/index.ts b/kms/auth-eth/typechain-types/contracts/index.ts new file mode 100644 index 00000000..814acc37 --- /dev/null +++ b/kms/auth-eth/typechain-types/contracts/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { AppAuth } from "./AppAuth"; +export type { IAppAuth } from "./IAppAuth"; +export type { KmsAuth } from "./KmsAuth"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts new file mode 100644 index 00000000..55b539e6 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory.ts @@ -0,0 +1,122 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + OwnableUpgradeable, + OwnableUpgradeableInterface, +} from "../../../../@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable"; + +const _abi = [ + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class OwnableUpgradeable__factory { + static readonly abi = _abi; + static createInterface(): OwnableUpgradeableInterface { + return new Interface(_abi) as OwnableUpgradeableInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): OwnableUpgradeable { + return new Contract(address, _abi, runner) as unknown as OwnableUpgradeable; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts new file mode 100644 index 00000000..bf4b29cc --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/access/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { OwnableUpgradeable__factory } from "./OwnableUpgradeable__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts new file mode 100644 index 00000000..2b4c7e65 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as access from "./access"; +export * as proxy from "./proxy"; +export * as utils from "./utils"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts new file mode 100644 index 00000000..56778f88 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as utils from "./utils"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts new file mode 100644 index 00000000..132c5778 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory.ts @@ -0,0 +1,48 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + Initializable, + InitializableInterface, +} from "../../../../../@openzeppelin/contracts-upgradeable/proxy/utils/Initializable"; + +const _abi = [ + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, +] as const; + +export class Initializable__factory { + static readonly abi = _abi; + static createInterface(): InitializableInterface { + return new Interface(_abi) as InitializableInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): Initializable { + return new Contract(address, _abi, runner) as unknown as Initializable; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts new file mode 100644 index 00000000..a4d857f4 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory.ts @@ -0,0 +1,153 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + UUPSUpgradeable, + UUPSUpgradeableInterface, +} from "../../../../../@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address", + }, + ], + name: "AddressEmptyCode", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "ERC1967InvalidImplementation", + type: "error", + }, + { + inputs: [], + name: "ERC1967NonPayable", + type: "error", + }, + { + inputs: [], + name: "FailedCall", + type: "error", + }, + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + inputs: [], + name: "UUPSUnauthorizedCallContext", + type: "error", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "slot", + type: "bytes32", + }, + ], + name: "UUPSUnsupportedProxiableUUID", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "Upgraded", + type: "event", + }, + { + inputs: [], + name: "UPGRADE_INTERFACE_VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "proxiableUUID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newImplementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "upgradeToAndCall", + outputs: [], + stateMutability: "payable", + type: "function", + }, +] as const; + +export class UUPSUpgradeable__factory { + static readonly abi = _abi; + static createInterface(): UUPSUpgradeableInterface { + return new Interface(_abi) as UUPSUpgradeableInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): UUPSUpgradeable { + return new Contract(address, _abi, runner) as unknown as UUPSUpgradeable; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts new file mode 100644 index 00000000..a192d15d --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/proxy/utils/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Initializable__factory } from "./Initializable__factory"; +export { UUPSUpgradeable__factory } from "./UUPSUpgradeable__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts new file mode 100644 index 00000000..60e8cbba --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory.ts @@ -0,0 +1,48 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + ContextUpgradeable, + ContextUpgradeableInterface, +} from "../../../../@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable"; + +const _abi = [ + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, +] as const; + +export class ContextUpgradeable__factory { + static readonly abi = _abi; + static createInterface(): ContextUpgradeableInterface { + return new Interface(_abi) as ContextUpgradeableInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): ContextUpgradeable { + return new Contract(address, _abi, runner) as unknown as ContextUpgradeable; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts new file mode 100644 index 00000000..3ff42aef --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts-upgradeable/utils/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { ContextUpgradeable__factory } from "./ContextUpgradeable__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/index.ts new file mode 100644 index 00000000..41c1db81 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as interfaces from "./interfaces"; +export * as proxy from "./proxy"; +export * as utils from "./utils"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.ts new file mode 100644 index 00000000..c4821f44 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC1967__factory.ts @@ -0,0 +1,67 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC1967, + IERC1967Interface, +} from "../../../../@openzeppelin/contracts/interfaces/IERC1967"; + +const _abi = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "previousAdmin", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "AdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beacon", + type: "address", + }, + ], + name: "BeaconUpgraded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "Upgraded", + type: "event", + }, +] as const; + +export class IERC1967__factory { + static readonly abi = _abi; + static createInterface(): IERC1967Interface { + return new Interface(_abi) as IERC1967Interface; + } + static connect(address: string, runner?: ContractRunner | null): IERC1967 { + return new Contract(address, _abi, runner) as unknown as IERC1967; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts new file mode 100644 index 00000000..360f9ed4 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory.ts @@ -0,0 +1,38 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC1822Proxiable, + IERC1822ProxiableInterface, +} from "../../../../../@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable"; + +const _abi = [ + { + inputs: [], + name: "proxiableUUID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class IERC1822Proxiable__factory { + static readonly abi = _abi; + static createInterface(): IERC1822ProxiableInterface { + return new Interface(_abi) as IERC1822ProxiableInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IERC1822Proxiable { + return new Contract(address, _abi, runner) as unknown as IERC1822Proxiable; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts new file mode 100644 index 00000000..ecca1339 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { IERC1822Proxiable__factory } from "./IERC1822Proxiable__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts new file mode 100644 index 00000000..09337a96 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as draftIerc1822Sol from "./draft-IERC1822.sol"; +export { IERC1967__factory } from "./IERC1967__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts new file mode 100644 index 00000000..7714447f --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts @@ -0,0 +1,105 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../../common"; +import type { + ERC1967Utils, + ERC1967UtilsInterface, +} from "../../../../../@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "admin", + type: "address", + }, + ], + name: "ERC1967InvalidAdmin", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "beacon", + type: "address", + }, + ], + name: "ERC1967InvalidBeacon", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "ERC1967InvalidImplementation", + type: "error", + }, + { + inputs: [], + name: "ERC1967NonPayable", + type: "error", + }, +] as const; + +const _bytecode = + "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e274eaccba5882a0af048d39959ca6e8cdf4933e54498c57fc57a9f23851c56b64736f6c63430008160033"; + +type ERC1967UtilsConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ERC1967UtilsConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class ERC1967Utils__factory extends ContractFactory { + constructor(...args: ERC1967UtilsConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + ERC1967Utils & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): ERC1967Utils__factory { + return super.connect(runner) as ERC1967Utils__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ERC1967UtilsInterface { + return new Interface(_abi) as ERC1967UtilsInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): ERC1967Utils { + return new Contract(address, _abi, runner) as unknown as ERC1967Utils; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts new file mode 100644 index 00000000..97d6fb36 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { ERC1967Utils__factory } from "./ERC1967Utils__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts new file mode 100644 index 00000000..184893de --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory.ts @@ -0,0 +1,35 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IBeacon, + IBeaconInterface, +} from "../../../../../@openzeppelin/contracts/proxy/beacon/IBeacon"; + +const _abi = [ + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class IBeacon__factory { + static readonly abi = _abi; + static createInterface(): IBeaconInterface { + return new Interface(_abi) as IBeaconInterface; + } + static connect(address: string, runner?: ContractRunner | null): IBeacon { + return new Contract(address, _abi, runner) as unknown as IBeacon; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts new file mode 100644 index 00000000..4a9d6289 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/beacon/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { IBeacon__factory } from "./IBeacon__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts new file mode 100644 index 00000000..ed9d8127 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/proxy/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as erc1967 from "./ERC1967"; +export * as beacon from "./beacon"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts new file mode 100644 index 00000000..6618e886 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts @@ -0,0 +1,75 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../common"; +import type { + Address, + AddressInterface, +} from "../../../../@openzeppelin/contracts/utils/Address"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address", + }, + ], + name: "AddressEmptyCode", + type: "error", + }, +] as const; + +const _bytecode = + "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205965a49a4005a86ed954ab6e57bfedc675ff3c6b372d5d68bd315532662a642c64736f6c63430008160033"; + +type AddressConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: AddressConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Address__factory extends ContractFactory { + constructor(...args: AddressConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + Address & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Address__factory { + return super.connect(runner) as Address__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): AddressInterface { + return new Interface(_abi) as AddressInterface; + } + static connect(address: string, runner?: ContractRunner | null): Address { + return new Contract(address, _abi, runner) as unknown as Address; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.ts new file mode 100644 index 00000000..3dbf98b8 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.ts @@ -0,0 +1,101 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../../../common"; +import type { + Errors, + ErrorsInterface, +} from "../../../../@openzeppelin/contracts/utils/Errors"; + +const _abi = [ + { + inputs: [], + name: "FailedCall", + type: "error", + }, + { + inputs: [], + name: "FailedDeployment", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + { + internalType: "uint256", + name: "needed", + type: "uint256", + }, + ], + name: "InsufficientBalance", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "MissingPrecompile", + type: "error", + }, +] as const; + +const _bytecode = + "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122066d48d2abd48c70ba22ce993ad029194c8ef200202c523b92ffb3b0667c166b564736f6c63430008160033"; + +type ErrorsConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ErrorsConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class Errors__factory extends ContractFactory { + constructor(...args: ErrorsConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + Errors & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): Errors__factory { + return super.connect(runner) as Errors__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ErrorsInterface { + return new Interface(_abi) as ErrorsInterface; + } + static connect(address: string, runner?: ContractRunner | null): Errors { + return new Contract(address, _abi, runner) as unknown as Errors; + } +} diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/index.ts new file mode 100644 index 00000000..3b0ba09d --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/contracts/utils/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Address__factory } from "./Address__factory"; +export { Errors__factory } from "./Errors__factory"; diff --git a/kms/auth-eth/typechain-types/factories/@openzeppelin/index.ts b/kms/auth-eth/typechain-types/factories/@openzeppelin/index.ts new file mode 100644 index 00000000..6923c15a --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/@openzeppelin/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as contracts from "./contracts"; +export * as contractsUpgradeable from "./contracts-upgradeable"; diff --git a/kms/auth-eth/typechain-types/factories/AppAuth__factory.ts b/kms/auth-eth/typechain-types/factories/AppAuth__factory.ts new file mode 100644 index 00000000..67a21680 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/AppAuth__factory.ts @@ -0,0 +1,271 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { + Signer, + AddressLike, + ContractDeployTransaction, + ContractRunner, +} from "ethers"; +import type { NonPayableOverrides } from "../common"; +import type { AppAuth, AppAuthInterface } from "../AppAuth"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_appId", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "ComposeHashAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "ComposeHashRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "addComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedComposeHashes", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "appId", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "address", + name: "_appId", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isAppAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "removeComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b50604051610d1b380380610d1b8339818101604052810190610032919061011c565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610149565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e9826100be565b9050919050565b6100f9816100de565b811461010457600080fd5b50565b600081519050610116816100f0565b92915050565b600060208284031215610132576101316100b9565b5b600061014084828501610107565b91505092915050565b610bc3806101586000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806380afdea81161005b57806380afdea8146100ea5780638da5cb5b14610108578063dfc7722314610126578063e3392a9b146101425761007d565b80632f6622e514610082578063485cc955146100b257806367b3f22c146100ce575b600080fd5b61009c60048036038101906100979190610724565b610173565b6040516100a9919061076c565b60405180910390f35b6100cc60048036038101906100c791906107e5565b610193565b005b6100e860048036038101906100e39190610724565b610385565b005b6100f2610479565b6040516100ff9190610834565b60405180910390f35b61011061049f565b60405161011d9190610834565b60405180910390f35b610140600480360381019061013b9190610724565b6104c3565b005b61015c60048036038101906101579190610873565b6105b7565b60405161016a929190610930565b60405180910390f35b60026020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610219906109ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610a18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790610a84565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040a90610b16565b60405180910390fd5b60006002600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f755b79bd4b0eeab344d032284a99003b2ddc018b646752ac72d681593a6e89478160405161046e9190610b45565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054890610b16565b60405180910390fd5b60016002600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507ffecb34306dd9d8b785b54d65489d06afc8822a0893ddacedff40c50a4942d0af816040516105ac9190610b45565b60405180910390a150565b60006060600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360000160208101906106079190610b60565b73ffffffffffffffffffffffffffffffffffffffff16146106635760006040518060400160405280600e81526020017f496e76616c696420617070204944000000000000000000000000000000000000815250915091506106e4565b600260008460200135815260200190815260200160002060009054906101000a900460ff166106cd5760006040518060400160405280601881526020017f436f6d706f73652068617368206e6f7420616c6c6f7765640000000000000000815250915091506106e4565b600160405180602001604052806000815250915091505b915091565b600080fd5b6000819050919050565b610701816106ee565b811461070c57600080fd5b50565b60008135905061071e816106f8565b92915050565b60006020828403121561073a576107396106e9565b5b60006107488482850161070f565b91505092915050565b60008115159050919050565b61076681610751565b82525050565b6000602082019050610781600083018461075d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006107b282610787565b9050919050565b6107c2816107a7565b81146107cd57600080fd5b50565b6000813590506107df816107b9565b92915050565b600080604083850312156107fc576107fb6106e9565b5b600061080a858286016107d0565b925050602061081b858286016107d0565b9150509250929050565b61082e816107a7565b82525050565b60006020820190506108496000830184610825565b92915050565b600080fd5b600060c0828403121561086a5761086961084f565b5b81905092915050565b600060c08284031215610889576108886106e9565b5b600061089784828501610854565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156108da5780820151818401526020810190506108bf565b60008484015250505050565b6000601f19601f8301169050919050565b6000610902826108a0565b61090c81856108ab565b935061091c8185602086016108bc565b610925816108e6565b840191505092915050565b6000604082019050610945600083018561075d565b818103602083015261095781846108f7565b90509392505050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006109966013836108ab565b91506109a182610960565b602082019050919050565b600060208201905081810360008301526109c581610989565b9050919050565b7f496e76616c6964206f776e657220616464726573730000000000000000000000600082015250565b6000610a026015836108ab565b9150610a0d826109cc565b602082019050919050565b60006020820190508181036000830152610a31816109f5565b9050919050565b7f496e76616c696420617070204944000000000000000000000000000000000000600082015250565b6000610a6e600e836108ab565b9150610a7982610a38565b602082019050919050565b60006020820190508181036000830152610a9d81610a61565b9050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000610b006021836108ab565b9150610b0b82610aa4565b604082019050919050565b60006020820190508181036000830152610b2f81610af3565b9050919050565b610b3f816106ee565b82525050565b6000602082019050610b5a6000830184610b36565b92915050565b600060208284031215610b7657610b756106e9565b5b6000610b84848285016107d0565b9150509291505056fea2646970667358221220d6dc25376d61bc45ee5bf5c87ca6caa66591e2e7e815f67e0734e55362e123d864736f6c63430008130033"; + +type AppAuthConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: AppAuthConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class AppAuth__factory extends ContractFactory { + constructor(...args: AppAuthConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + _appId: AddressLike, + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(_appId, overrides || {}); + } + override deploy( + _appId: AddressLike, + overrides?: NonPayableOverrides & { from?: string } + ) { + return super.deploy(_appId, overrides || {}) as Promise< + AppAuth & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): AppAuth__factory { + return super.connect(runner) as AppAuth__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): AppAuthInterface { + return new Interface(_abi) as AppAuthInterface; + } + static connect(address: string, runner?: ContractRunner | null): AppAuth { + return new Contract(address, _abi, runner) as unknown as AppAuth; + } +} diff --git a/kms/auth-eth/typechain-types/factories/IAppAuth__factory.ts b/kms/auth-eth/typechain-types/factories/IAppAuth__factory.ts new file mode 100644 index 00000000..a1b258db --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/IAppAuth__factory.ts @@ -0,0 +1,75 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { IAppAuth, IAppAuthInterface } from "../IAppAuth"; + +const _abi = [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isAppAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class IAppAuth__factory { + static readonly abi = _abi; + static createInterface(): IAppAuthInterface { + return new Interface(_abi) as IAppAuthInterface; + } + static connect(address: string, runner?: ContractRunner | null): IAppAuth { + return new Contract(address, _abi, runner) as unknown as IAppAuth; + } +} diff --git a/kms/auth-eth/typechain-types/factories/KmsAuth__factory.ts b/kms/auth-eth/typechain-types/factories/KmsAuth__factory.ts new file mode 100644 index 00000000..b663188e --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/KmsAuth__factory.ts @@ -0,0 +1,727 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../common"; +import type { KmsAuth, KmsAuthInterface } from "../KmsAuth"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "AggregatedMrDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "AggregatedMrRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "appId", + type: "address", + }, + ], + name: "AppRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "ImageDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "ImageRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "KmsComposeHashDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "KmsComposeHashRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "KmsDeviceIdDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "KmsDeviceIdRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes", + name: "k256Pubkey", + type: "bytes", + }, + ], + name: "KmsInfoSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "string", + name: "tproxyAppId", + type: "string", + }, + ], + name: "TproxyAppIdSet", + type: "event", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedAggregatedMrs", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedImages", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedKmsComposeHashes", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedKmsDeviceIds", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "apps", + outputs: [ + { + internalType: "bool", + name: "isRegistered", + type: "bool", + }, + { + internalType: "address", + name: "controller", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + ], + name: "calculateAppId", + outputs: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "deregisterAggregatedMr", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "deregisterImage", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "deregisterKmsComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "deregisterKmsDeviceId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isAppAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isKmsAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "kmsInfo", + outputs: [ + { + internalType: "bytes", + name: "k256Pubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "caPubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "quote", + type: "bytes", + }, + { + internalType: "bytes", + name: "eventlog", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "registerAggregatedMr", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "address", + name: "controller", + type: "address", + }, + ], + name: "registerApp", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "registerImage", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "registerKmsComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "registerKmsDeviceId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "eventlog", + type: "bytes", + }, + ], + name: "setKmsEventlog", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes", + name: "k256Pubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "caPubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "quote", + type: "bytes", + }, + { + internalType: "bytes", + name: "eventlog", + type: "bytes", + }, + ], + internalType: "struct KmsAuth.KmsInfo", + name: "info", + type: "tuple", + }, + ], + name: "setKmsInfo", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "quote", + type: "bytes", + }, + ], + name: "setKmsQuote", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "appId", + type: "string", + }, + ], + name: "setTproxyAppId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "tproxyAppId", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +const _bytecode = + "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612b94806100606000396000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c806365dea842116100de5780638f9c049611610097578063c4d66de811610071578063c4d66de814610446578063c5e231b414610462578063e3392a9b1461047e578063ff861a34146104af57610172565b80638f9c0496146103de578063a4844401146103fa578063b5ff9c161461042a57610172565b806365dea84214610334578063736ede7a146103505780637a5a7ad61461036c5780637d0253521461038857806388a89094146103a45780638da5cb5b146103c057610172565b80631bf5b80c116101305780631bf5b80c1461024d57806336b18874146102695780633f633adb146102995780634d79da59146102b55780635e30331f146102e5578063652a29971461031657610172565b8062e83a651461017757806309177063146101935780631217a09d146101b45780631309ec43146101d057806314e155a41461020157806318c1ecb214610231575b600080fd5b610191600480360381019061018c9190611ae8565b6104df565b005b61019b6105d3565b6040516101ab9493929190611ba5565b60405180910390f35b6101ce60048036038101906101c99190611c64565b610811565b005b6101ea60048036038101906101e59190611ca4565b6109c7565b6040516101f8929190611cfb565b60405180910390f35b61021b60048036038101906102169190611ae8565b610a18565b6040516102289190611d24565b60405180910390f35b61024b60048036038101906102469190611e74565b610a38565b005b61026760048036038101906102629190611ae8565b610adc565b005b610283600480360381019061027e9190611ebd565b610bd0565b6040516102909190611efd565b60405180910390f35b6102b360048036038101906102ae9190611ae8565b610c0b565b005b6102cf60048036038101906102ca9190611ae8565b610cff565b6040516102dc9190611d24565b60405180910390f35b6102ff60048036038101906102fa9190611f3c565b610d1f565b60405161030d929190611fbe565b60405180910390f35b61031e610e60565b60405161032b9190611fee565b60405180910390f35b61034e600480360381019061034991906120b1565b610eee565b005b61036a60048036038101906103659190611e74565b610fc6565b005b61038660048036038101906103819190611ae8565b61106a565b005b6103a2600480360381019061039d91906121ec565b61115e565b005b6103be60048036038101906103b99190611ae8565b611288565b005b6103c861137c565b6040516103d59190611efd565b60405180910390f35b6103f860048036038101906103f39190611ae8565b6113a0565b005b610414600480360381019061040f9190611ae8565b611494565b6040516104219190611d24565b60405180910390f35b610444600480360381019061043f9190611ae8565b6114b4565b005b610460600480360381019061045b9190611ca4565b6115a8565b005b61047c60048036038101906104779190611ae8565b6116e9565b005b61049860048036038101906104939190611f3c565b6117dd565b6040516104a6929190611fbe565b60405180910390f35b6104c960048036038101906104c49190611ae8565b611a7e565b6040516104d69190611d24565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610564906122a7565b60405180910390fd5b60006007600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f5ed2cae766a97ae1824da82872566214ec66595770ed66f3cb50d498d8db1df4816040516105c891906122d6565b60405180910390a150565b60018060000180546105e490612320565b80601f016020809104026020016040519081016040528092919081815260200182805461061090612320565b801561065d5780601f106106325761010080835404028352916020019161065d565b820191906000526020600020905b81548152906001019060200180831161064057829003601f168201915b50505050509080600101805461067290612320565b80601f016020809104026020016040519081016040528092919081815260200182805461069e90612320565b80156106eb5780601f106106c0576101008083540402835291602001916106eb565b820191906000526020600020905b8154815290600101906020018083116106ce57829003601f168201915b50505050509080600201805461070090612320565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90612320565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b50505050509080600301805461078e90612320565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba90612320565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905084565b600061081d3384610bd0565b9050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16156108af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a69061239d565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555081600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f0d540ad8f39e07d19909687352b9fa017405d93c91a6760981fbae9cf28bfef7816040516109ba9190611efd565b60405180910390a1505050565b60066020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b60096020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd906122a7565b60405180910390fd5b8060016002019081610ad89190612573565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906122a7565b60405180910390fd5b60016009600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f2a90407c6fcd7c2e2a5e7fd238a1fc6c41ce461f7da1ff6350d0b2243595305481604051610bc591906122d6565b60405180910390a150565b6000808383604051602001610be69291906126ae565b6040516020818303038152906040528051906020012090508060001c91505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c90906122a7565b60405180910390fd5b60016008600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fbb218b24bde6ba405fba71b6e1e123ab350a965dc6ad8fc3e53b3cc00754785881604051610cf491906122d6565b60405180910390a150565b600a6020528060005260406000206000915054906101000a900460ff1681565b60006060600760008460800135815260200190815260200160002060009054906101000a900460ff16610d8d5760006040518060400160405280601981526020017f41676772656761746564204d52206e6f7420616c6c6f7765640000000000000081525091509150610e5b565b600960008460200135815260200190815260200160002060009054906101000a900460ff16610df75760006040518060400160405280601c81526020017f4b4d5320636f6d706f73652068617368206e6f7420616c6c6f7765640000000081525091509150610e5b565b600a60008460600135815260200190815260200160002060009054906101000a900460ff16610e44576000604051806060016040528060298152602001612b366029913991509150610e5b565b600160405180602001604052806000815250915091505b915091565b60058054610e6d90612320565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9990612320565b8015610ee65780601f10610ebb57610100808354040283529160200191610ee6565b820191906000526020600020905b815481529060010190602001808311610ec957829003601f168201915b505050505081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f73906122a7565b60405180910390fd5b8060059081610f8b9190612735565b507ffa71be58a57ccbf2fe4e110bc83aa1620e20ff2a30bed5ccac0f1975087906db81604051610fbb9190611fee565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b906122a7565b60405180910390fd5b80600160030190816110669190612573565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef906122a7565b60405180910390fd5b60006008600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3177541da10e628041923734a3c8841c1702aa4bc6cdacb818eb704f962e754e8160405161115391906122d6565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e3906122a7565b60405180910390fd5b80600160008201518160000190816112049190612573565b50602082015181600101908161121a9190612573565b5060408201518160020190816112309190612573565b5060608201518160030190816112469190612573565b509050507f77cdad119a452bbd96c45635758fc4af8a6bde3deaccf3fada634ddf9a162706816000015160405161127d9190612807565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d906122a7565b60405180910390fd5b6001600a600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6bd4d1a278f7fc5fe63a99cf254e598b6c3c069f51ed67564ca6c033d993fd4a8160405161137191906122d6565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461142e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611425906122a7565b60405180910390fd5b60006009600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fac992076e4ec5fa0a511118a6009763a267afca83446be29e4344393e5de41988160405161148991906122d6565b60405180910390a150565b60076020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611539906122a7565b60405180910390fd5b6000600a600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa54eca6bec89886456df499328bab27fe43544464801ecd8f59fdca31e0268d58160405161159d91906122d6565b60405180910390a150565b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90612875565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d906128e1565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e906122a7565b60405180910390fd5b60016007600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f4d0e5a3df74b9016e63b2b87a88b85371c1fa39b33ab131de176a0240d714d67816040516117d291906122d6565b60405180910390a150565b60006060600660008460000160208101906117f89190611ca4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166118885760006040518060400160405280601281526020017f417070206e6f742072656769737465726564000000000000000000000000000081525091509150611a79565b600760008460800135815260200190815260200160002060009054906101000a900460ff161580156118dc5750600860008460a00135815260200190815260200160002060009054906101000a900460ff16155b156119055760006040518060600160405280602a8152602001612b0c602a913991509150611a79565b60006006600085600001602081019061191e9190611ca4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f45760006040518060400160405280601681526020017f41707020636f6e74726f6c6c6572206e6f7420736574000000000000000000008152509250925050611a79565b8073ffffffffffffffffffffffffffffffffffffffff1663e3392a9b856040518263ffffffff1660e01b8152600401611a2d91906129f8565b600060405180830381865afa158015611a4a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a739190612aaf565b92509250505b915091565b60086020528060005260406000206000915054906101000a900460ff1681565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611ac581611ab2565b8114611ad057600080fd5b50565b600081359050611ae281611abc565b92915050565b600060208284031215611afe57611afd611aa8565b5b6000611b0c84828501611ad3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b4f578082015181840152602081019050611b34565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b7782611b15565b611b818185611b20565b9350611b91818560208601611b31565b611b9a81611b5b565b840191505092915050565b60006080820190508181036000830152611bbf8187611b6c565b90508181036020830152611bd38186611b6c565b90508181036040830152611be78185611b6c565b90508181036060830152611bfb8184611b6c565b905095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c3182611c06565b9050919050565b611c4181611c26565b8114611c4c57600080fd5b50565b600081359050611c5e81611c38565b92915050565b60008060408385031215611c7b57611c7a611aa8565b5b6000611c8985828601611ad3565b9250506020611c9a85828601611c4f565b9150509250929050565b600060208284031215611cba57611cb9611aa8565b5b6000611cc884828501611c4f565b91505092915050565b60008115159050919050565b611ce681611cd1565b82525050565b611cf581611c26565b82525050565b6000604082019050611d106000830185611cdd565b611d1d6020830184611cec565b9392505050565b6000602082019050611d396000830184611cdd565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d8182611b5b565b810181811067ffffffffffffffff82111715611da057611d9f611d49565b5b80604052505050565b6000611db3611a9e565b9050611dbf8282611d78565b919050565b600067ffffffffffffffff821115611ddf57611dde611d49565b5b611de882611b5b565b9050602081019050919050565b82818337600083830152505050565b6000611e17611e1284611dc4565b611da9565b905082815260208101848484011115611e3357611e32611d44565b5b611e3e848285611df5565b509392505050565b600082601f830112611e5b57611e5a611d3f565b5b8135611e6b848260208601611e04565b91505092915050565b600060208284031215611e8a57611e89611aa8565b5b600082013567ffffffffffffffff811115611ea857611ea7611aad565b5b611eb484828501611e46565b91505092915050565b60008060408385031215611ed457611ed3611aa8565b5b6000611ee285828601611c4f565b9250506020611ef385828601611ad3565b9150509250929050565b6000602082019050611f126000830184611cec565b92915050565b600080fd5b600060c08284031215611f3357611f32611f18565b5b81905092915050565b600060c08284031215611f5257611f51611aa8565b5b6000611f6084828501611f1d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000611f9082611f69565b611f9a8185611f74565b9350611faa818560208601611b31565b611fb381611b5b565b840191505092915050565b6000604082019050611fd36000830185611cdd565b8181036020830152611fe58184611f85565b90509392505050565b600060208201905081810360008301526120088184611f85565b905092915050565b600067ffffffffffffffff82111561202b5761202a611d49565b5b61203482611b5b565b9050602081019050919050565b600061205461204f84612010565b611da9565b9050828152602081018484840111156120705761206f611d44565b5b61207b848285611df5565b509392505050565b600082601f83011261209857612097611d3f565b5b81356120a8848260208601612041565b91505092915050565b6000602082840312156120c7576120c6611aa8565b5b600082013567ffffffffffffffff8111156120e5576120e4611aad565b5b6120f184828501612083565b91505092915050565b600080fd5b600080fd5b60006080828403121561211a576121196120fa565b5b6121246080611da9565b9050600082013567ffffffffffffffff811115612144576121436120ff565b5b61215084828501611e46565b600083015250602082013567ffffffffffffffff811115612174576121736120ff565b5b61218084828501611e46565b602083015250604082013567ffffffffffffffff8111156121a4576121a36120ff565b5b6121b084828501611e46565b604083015250606082013567ffffffffffffffff8111156121d4576121d36120ff565b5b6121e084828501611e46565b60608301525092915050565b60006020828403121561220257612201611aa8565b5b600082013567ffffffffffffffff8111156122205761221f611aad565b5b61222c84828501612104565b91505092915050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612291602183611f74565b915061229c82612235565b604082019050919050565b600060208201905081810360008301526122c081612284565b9050919050565b6122d081611ab2565b82525050565b60006020820190506122eb60008301846122c7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061233857607f821691505b60208210810361234b5761234a6122f1565b5b50919050565b7f41707020616c7265616479207265676973746572656400000000000000000000600082015250565b6000612387601683611f74565b915061239282612351565b602082019050919050565b600060208201905081810360008301526123b68161237a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261241f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826123e2565b61242986836123e2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061247061246b61246684612441565b61244b565b612441565b9050919050565b6000819050919050565b61248a83612455565b61249e61249682612477565b8484546123ef565b825550505050565b600090565b6124b36124a6565b6124be818484612481565b505050565b5b818110156124e2576124d76000826124ab565b6001810190506124c4565b5050565b601f821115612527576124f8816123bd565b612501846123d2565b81016020851015612510578190505b61252461251c856123d2565b8301826124c3565b50505b505050565b600082821c905092915050565b600061254a6000198460080261252c565b1980831691505092915050565b60006125638383612539565b9150826002028217905092915050565b61257c82611b15565b67ffffffffffffffff81111561259557612594611d49565b5b61259f8254612320565b6125aa8282856124e6565b600060209050601f8311600181146125dd57600084156125cb578287015190505b6125d58582612557565b86555061263d565b601f1984166125eb866123bd565b60005b82811015612613578489015182556001820191506020850194506020810190506125ee565b86831015612630578489015161262c601f891682612539565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b600061265d82612645565b9050919050565b600061266f82612652565b9050919050565b61268761268282611c26565b612664565b82525050565b6000819050919050565b6126a86126a382611ab2565b61268d565b82525050565b60006126ba8285612676565b6014820191506126ca8284612697565b6020820191508190509392505050565b60008190508160005260206000209050919050565b601f82111561273057612701816126da565b61270a846123d2565b81016020851015612719578190505b61272d612725856123d2565b8301826124c3565b50505b505050565b61273e82611f69565b67ffffffffffffffff81111561275757612756611d49565b5b6127618254612320565b61276c8282856126ef565b600060209050601f83116001811461279f576000841561278d578287015190505b6127978582612557565b8655506127ff565b601f1984166127ad866126da565b60005b828110156127d5578489015182556001820191506020850194506020810190506127b0565b868310156127f257848901516127ee601f891682612539565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526128218184611b6c565b905092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b600061285f601383611f74565b915061286a82612829565b602082019050919050565b6000602082019050818103600083015261288e81612852565b9050919050565b7f496e76616c6964206f776e657220616464726573730000000000000000000000600082015250565b60006128cb601583611f74565b91506128d682612895565b602082019050919050565b600060208201905081810360008301526128fa816128be565b9050919050565b60006129106020840184611c4f565b905092915050565b61292181611c26565b82525050565b60006129366020840184611ad3565b905092915050565b61294781611ab2565b82525050565b60c0820161295e6000830183612901565b61296b6000850182612918565b506129796020830183612927565b612986602085018261293e565b506129946040830183612901565b6129a16040850182612918565b506129af6060830183612927565b6129bc606085018261293e565b506129ca6080830183612927565b6129d7608085018261293e565b506129e560a0830183612927565b6129f260a085018261293e565b50505050565b600060c082019050612a0d600083018461294d565b92915050565b612a1c81611cd1565b8114612a2757600080fd5b50565b600081519050612a3981612a13565b92915050565b6000612a52612a4d84612010565b611da9565b905082815260208101848484011115612a6e57612a6d611d44565b5b612a79848285611b31565b509392505050565b600082601f830112612a9657612a95611d3f565b5b8151612aa6848260208601612a3f565b91505092915050565b60008060408385031215612ac657612ac5611aa8565b5b6000612ad485828601612a2a565b925050602083015167ffffffffffffffff811115612af557612af4611aad565b5b612b0185828601612a81565b915050925092905056fe4e6569746865722061676772656761746564204d52206e6f7220696d61676520697320616c6c6f7765644b4d53206973206e6f7420616c6c6f77656420746f20626f6f74206f6e207468697320646576696365a2646970667358221220974b267f869fcb50282b3abf63fa0b600250ebefd7604645495daf8c1a46717f64736f6c63430008130033"; + +type KmsAuthConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: KmsAuthConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class KmsAuth__factory extends ContractFactory { + constructor(...args: KmsAuthConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + KmsAuth & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): KmsAuth__factory { + return super.connect(runner) as KmsAuth__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): KmsAuthInterface { + return new Interface(_abi) as KmsAuthInterface; + } + static connect(address: string, runner?: ContractRunner | null): KmsAuth { + return new Contract(address, _abi, runner) as unknown as KmsAuth; + } +} diff --git a/kms/auth-eth/typechain-types/factories/contracts/AppAuth__factory.ts b/kms/auth-eth/typechain-types/factories/contracts/AppAuth__factory.ts new file mode 100644 index 00000000..de1eca6a --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/contracts/AppAuth__factory.ts @@ -0,0 +1,444 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { AppAuth, AppAuthInterface } from "../../contracts/AppAuth"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address", + }, + ], + name: "AddressEmptyCode", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "ERC1967InvalidImplementation", + type: "error", + }, + { + inputs: [], + name: "ERC1967NonPayable", + type: "error", + }, + { + inputs: [], + name: "FailedCall", + type: "error", + }, + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + inputs: [], + name: "UUPSUnauthorizedCallContext", + type: "error", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "slot", + type: "bytes32", + }, + ], + name: "UUPSUnsupportedProxiableUUID", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "ComposeHashAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "ComposeHashRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "Upgraded", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "UpgradesDisabled", + type: "event", + }, + { + inputs: [], + name: "UPGRADE_INTERFACE_VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "addComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedComposeHashes", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "appId", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "disableUpgrades", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "initialOwner", + type: "address", + }, + { + internalType: "address", + name: "_appId", + type: "address", + }, + { + internalType: "bool", + name: "_disableUpgrades", + type: "bool", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isAppAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "proxiableUUID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "removeComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newImplementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "upgradeToAndCall", + outputs: [], + stateMutability: "payable", + type: "function", + }, +] as const; + +const _bytecode = + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051610ebb6100fd600039600081816107060152818161072f01526108d20152610ebb6000f3fe6080604052600436106100c25760003560e01c80638da5cb5b1161007f578063e3392a9b11610059578063e3392a9b1461024c578063e4bbb5a81461027a578063ec6690361461029a578063f2fde38b146102af57600080fd5b80638da5cb5b146101b1578063ad3cb1cc146101ee578063dfc772231461022c57600080fd5b80632f6622e5146100c75780634f1ef2861461010c57806352d1902d1461012157806367b3f22c14610144578063715018a61461016457806380afdea814610179575b600080fd5b3480156100d357600080fd5b506100f76100e2366004610c1e565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61011f61011a366004610c69565b6102cf565b005b34801561012d57600080fd5b506101366102ee565b604051908152602001610103565b34801561015057600080fd5b5061011f61015f366004610c1e565b61030b565b34801561017057600080fd5b5061011f610366565b34801561018557600080fd5b50600054610199906001600160a01b031681565b6040516001600160a01b039091168152602001610103565b3480156101bd57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610199565b3480156101fa57600080fd5b5061021f604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101039190610d7b565b34801561023857600080fd5b5061011f610247366004610c1e565b61037a565b34801561025857600080fd5b5061026c610267366004610d8e565b6103cd565b604051610103929190610da6565b34801561028657600080fd5b5061011f610295366004610dc9565b6104a0565b3480156102a657600080fd5b5061011f61067d565b3480156102bb57600080fd5b5061011f6102ca366004610e15565b6106bd565b6102d76106fb565b6102e0826107a0565b6102ea8282610805565b5050565b60006102f86108c7565b50600080516020610e6683398151915290565b610313610910565b60008181526001602052604090819020805460ff19169055517f755b79bd4b0eeab344d032284a99003b2ddc018b646752ac72d681593a6e89479061035b9083815260200190565b60405180910390a150565b61036e610910565b610378600061096b565b565b610382610910565b600081815260016020818152604092839020805460ff191690921790915590518281527ffecb34306dd9d8b785b54d65489d06afc8822a0893ddacedff40c50a4942d0af910161035b565b600080546060906001600160a01b03166103ea6020850185610e15565b6001600160a01b03161461042d5750506040805180820190915260148152732bb937b7339030b8381031b7b73a3937b63632b960611b6020820152600092909150565b60208084013560009081526001909152604090205460ff1661048757505060408051808201909152601881527f436f6d706f73652068617368206e6f7420616c6c6f77656400000000000000006020820152600092909150565b5050604080516020810190915260008152600192909150565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156104e65750825b905060008267ffffffffffffffff1660011480156105035750303b155b905081158015610511575080155b1561052f5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055957845460ff60401b1916600160401b1785555b6001600160a01b0388166105ac5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206f776e6572206164647265737360581b60448201526064015b60405180910390fd5b6001600160a01b0387166105f35760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185c1c08125160921b60448201526064016105a3565b600080546001600160a01b0319166001600160a01b0389161790556002805460ff1916871515179055610625886109dc565b61062d6109ed565b831561067357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610685610910565b6002805460ff191660011790556040517f0e5daa943fcd7e7182d0e893d180695c2ea9f6f1b4a1c5432faf14cf17b774e890600090a1565b6106c5610910565b6001600160a01b0381166106ef57604051631e4fbdf760e01b8152600060048201526024016105a3565b6106f88161096b565b50565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061078257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610776600080516020610e66833981519152546001600160a01b031690565b6001600160a01b031614155b156103785760405163703e46dd60e11b815260040160405180910390fd5b6107a8610910565b60025460ff16156106f85760405162461bcd60e51b815260206004820152602160248201527f557067726164657320617265207065726d616e656e746c792064697361626c656044820152601960fa1b60648201526084016105a3565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561085f575060408051601f3d908101601f1916820190925261085c91810190610e30565b60015b61088757604051634c9c8ce360e01b81526001600160a01b03831660048201526024016105a3565b600080516020610e6683398151915281146108b857604051632a87526960e21b8152600481018290526024016105a3565b6108c283836109f5565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103785760405163703e46dd60e11b815260040160405180910390fd5b336109427f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103785760405163118cdaa760e01b81523360048201526024016105a3565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6109e4610a4b565b6106f881610a94565b610378610a4b565b6109fe82610a9c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115610a43576108c28282610b01565b6102ea610b77565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661037857604051631afcd79f60e31b815260040160405180910390fd5b6106c5610a4b565b806001600160a01b03163b600003610ad257604051634c9c8ce360e01b81526001600160a01b03821660048201526024016105a3565b600080516020610e6683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051610b1e9190610e49565b600060405180830381855af49150503d8060008114610b59576040519150601f19603f3d011682016040523d82523d6000602084013e610b5e565b606091505b5091509150610b6e858383610b96565b95945050505050565b34156103785760405163b398979f60e01b815260040160405180910390fd5b606082610bab57610ba682610bf5565b610bee565b8151158015610bc257506001600160a01b0384163b155b15610beb57604051639996b31560e01b81526001600160a01b03851660048201526024016105a3565b50805b9392505050565b805115610c055780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b600060208284031215610c3057600080fd5b5035919050565b80356001600160a01b0381168114610c4e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610c7c57600080fd5b610c8583610c37565b9150602083013567ffffffffffffffff80821115610ca257600080fd5b818501915085601f830112610cb657600080fd5b813581811115610cc857610cc8610c53565b604051601f8201601f19908116603f01168101908382118183101715610cf057610cf0610c53565b81604052828152886020848701011115610d0957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b83811015610d46578181015183820152602001610d2e565b50506000910152565b60008151808452610d67816020860160208601610d2b565b601f01601f19169290920160200192915050565b602081526000610bee6020830184610d4f565b600060c08284031215610da057600080fd5b50919050565b8215158152604060208201526000610dc16040830184610d4f565b949350505050565b600080600060608486031215610dde57600080fd5b610de784610c37565b9250610df560208501610c37565b915060408401358015158114610e0a57600080fd5b809150509250925092565b600060208284031215610e2757600080fd5b610bee82610c37565b600060208284031215610e4257600080fd5b5051919050565b60008251610e5b818460208701610d2b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212200d798b331e8f4dc51e6d64c029ce68c189ac2a4aa30fe56d4c143e6395d77ada64736f6c63430008160033"; + +type AppAuthConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: AppAuthConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class AppAuth__factory extends ContractFactory { + constructor(...args: AppAuthConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + AppAuth & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): AppAuth__factory { + return super.connect(runner) as AppAuth__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): AppAuthInterface { + return new Interface(_abi) as AppAuthInterface; + } + static connect(address: string, runner?: ContractRunner | null): AppAuth { + return new Contract(address, _abi, runner) as unknown as AppAuth; + } +} diff --git a/kms/auth-eth/typechain-types/factories/contracts/IAppAuth__factory.ts b/kms/auth-eth/typechain-types/factories/contracts/IAppAuth__factory.ts new file mode 100644 index 00000000..62fd21b4 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/contracts/IAppAuth__factory.ts @@ -0,0 +1,75 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { IAppAuth, IAppAuthInterface } from "../../contracts/IAppAuth"; + +const _abi = [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isAppAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class IAppAuth__factory { + static readonly abi = _abi; + static createInterface(): IAppAuthInterface { + return new Interface(_abi) as IAppAuthInterface; + } + static connect(address: string, runner?: ContractRunner | null): IAppAuth { + return new Contract(address, _abi, runner) as unknown as IAppAuth; + } +} diff --git a/kms/auth-eth/typechain-types/factories/contracts/KmsAuth__factory.ts b/kms/auth-eth/typechain-types/factories/contracts/KmsAuth__factory.ts new file mode 100644 index 00000000..326a428c --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/contracts/KmsAuth__factory.ts @@ -0,0 +1,897 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { KmsAuth, KmsAuthInterface } from "../../contracts/KmsAuth"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address", + }, + ], + name: "AddressEmptyCode", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "ERC1967InvalidImplementation", + type: "error", + }, + { + inputs: [], + name: "ERC1967NonPayable", + type: "error", + }, + { + inputs: [], + name: "FailedCall", + type: "error", + }, + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + inputs: [], + name: "UUPSUnauthorizedCallContext", + type: "error", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "slot", + type: "bytes32", + }, + ], + name: "UUPSUnsupportedProxiableUUID", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "AggregatedMrDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "AggregatedMrRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "appId", + type: "address", + }, + ], + name: "AppRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "ImageDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "ImageRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "KmsComposeHashDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "KmsComposeHashRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "KmsDeviceIdDeregistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "KmsDeviceIdRegistered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes", + name: "k256Pubkey", + type: "bytes", + }, + ], + name: "KmsInfoSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "string", + name: "tproxyAppId", + type: "string", + }, + ], + name: "TproxyAppIdSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "Upgraded", + type: "event", + }, + { + inputs: [], + name: "UPGRADE_INTERFACE_VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedAggregatedMrs", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedImages", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedKmsComposeHashes", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedKmsDeviceIds", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "apps", + outputs: [ + { + internalType: "bool", + name: "isRegistered", + type: "bool", + }, + { + internalType: "address", + name: "controller", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + ], + name: "calculateAppId", + outputs: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "deregisterAggregatedMr", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "deregisterImage", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "deregisterKmsComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "deregisterKmsDeviceId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "initialOwner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isAppAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "appId", + type: "address", + }, + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "instanceId", + type: "address", + }, + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + internalType: "struct IAppAuth.AppBootInfo", + name: "bootInfo", + type: "tuple", + }, + ], + name: "isKmsAllowed", + outputs: [ + { + internalType: "bool", + name: "isAllowed", + type: "bool", + }, + { + internalType: "string", + name: "reason", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "kmsInfo", + outputs: [ + { + internalType: "bytes", + name: "k256Pubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "caPubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "quote", + type: "bytes", + }, + { + internalType: "bytes", + name: "eventlog", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "proxiableUUID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrAggregated", + type: "bytes32", + }, + ], + name: "registerAggregatedMr", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "address", + name: "controller", + type: "address", + }, + ], + name: "registerApp", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "mrImage", + type: "bytes32", + }, + ], + name: "registerImage", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "composeHash", + type: "bytes32", + }, + ], + name: "registerKmsComposeHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "deviceId", + type: "bytes32", + }, + ], + name: "registerKmsDeviceId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "eventlog", + type: "bytes", + }, + ], + name: "setKmsEventlog", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes", + name: "k256Pubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "caPubkey", + type: "bytes", + }, + { + internalType: "bytes", + name: "quote", + type: "bytes", + }, + { + internalType: "bytes", + name: "eventlog", + type: "bytes", + }, + ], + internalType: "struct KmsAuth.KmsInfo", + name: "info", + type: "tuple", + }, + ], + name: "setKmsInfo", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "quote", + type: "bytes", + }, + ], + name: "setKmsQuote", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "appId", + type: "string", + }, + ], + name: "setTproxyAppId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "tproxyAppId", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newImplementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "upgradeToAndCall", + outputs: [], + stateMutability: "payable", + type: "function", + }, +] as const; + +const _bytecode = + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611ebe6100fd6000396000818161132001528181611349015261148f0152611ebe6000f3fe6080604052600436106101cc5760003560e01c8063715018a6116100f7578063a484440111610095578063c5e231b411610064578063c5e231b4146105e1578063e3392a9b14610601578063f2fde38b14610621578063ff861a341461064157600080fd5b8063a484440114610540578063ad3cb1cc14610570578063b5ff9c16146105a1578063c4d66de8146105c157600080fd5b80637d025352116100d15780637d025352146104a357806388a89094146104c35780638da5cb5b146104e35780638f9c04961461052057600080fd5b8063715018a61461044e578063736ede7a146104635780637a5a7ad61461048357600080fd5b806336b188741161016f5780634f1ef2861161013e5780634f1ef286146103c857806352d1902d146103db5780635e30331f146103fe578063652a29971461042c57600080fd5b806336b18874146103205780633849d596146103585780633f633adb146103785780634d79da591461039857600080fd5b80631309ec43116101ab5780631309ec431461024157806314e155a4146102a057806318c1ecb2146102e05780631bf5b80c1461030057600080fd5b8062e83a65146101d157806309177063146101f35780631217a09d14610221575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004611780565b610671565b005b3480156101ff57600080fd5b506102086106cc565b60405161021894939291906117e9565b60405180910390f35b34801561022d57600080fd5b506101f161023c36600461185d565b610908565b34801561024d57600080fd5b5061028161025c366004611889565b60056020526000908152604090205460ff81169061010090046001600160a01b031682565b6040805192151583526001600160a01b03909116602083015201610218565b3480156102ac57600080fd5b506102d06102bb366004611780565b60086020526000908152604090205460ff1681565b6040519015158152602001610218565b3480156102ec57600080fd5b506101f16102fb36600461199a565b610a44565b34801561030c57600080fd5b506101f161031b366004611780565b610a5c565b34801561032c57600080fd5b5061034061033b3660046119d7565b610aaf565b6040516001600160a01b039091168152602001610218565b34801561036457600080fd5b506101f1610373366004611a01565b610af3565b34801561038457600080fd5b506101f1610393366004611780565b610b37565b3480156103a457600080fd5b506102d06103b3366004611780565b60096020526000908152604090205460ff1681565b6101f16103d6366004611a4a565b610b8a565b3480156103e757600080fd5b506103f0610ba5565b604051908152602001610218565b34801561040a57600080fd5b5061041e610419366004611a98565b610bc2565b604051610218929190611ab0565b34801561043857600080fd5b50610441610cd0565b6040516102189190611acb565b34801561045a57600080fd5b506101f1610d5e565b34801561046f57600080fd5b506101f161047e36600461199a565b610d72565b34801561048f57600080fd5b506101f161049e366004611780565b610d86565b3480156104af57600080fd5b506101f16104be366004611ade565b610dd6565b3480156104cf57600080fd5b506101f16104de366004611780565b610e64565b3480156104ef57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610340565b34801561052c57600080fd5b506101f161053b366004611780565b610eb7565b34801561054c57600080fd5b506102d061055b366004611780565b60066020526000908152604090205460ff1681565b34801561057c57600080fd5b50610441604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156105ad57600080fd5b506101f16105bc366004611780565b610f07565b3480156105cd57600080fd5b506101f16105dc366004611889565b610f57565b3480156105ed57600080fd5b506101f16105fc366004611780565b61106f565b34801561060d57600080fd5b5061041e61061c366004611a98565b6110c2565b34801561062d57600080fd5b506101f161063c366004611889565b61127c565b34801561064d57600080fd5b506102d061065c366004611780565b60076020526000908152604090205460ff1681565b6106796112ba565b60008181526006602052604090819020805460ff19169055517f5ed2cae766a97ae1824da82872566214ec66595770ed66f3cb50d498d8db1df4906106c19083815260200190565b60405180910390a150565b6000805481906106db90611bb7565b80601f016020809104026020016040519081016040528092919081815260200182805461070790611bb7565b80156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b50505050509080600101805461076990611bb7565b80601f016020809104026020016040519081016040528092919081815260200182805461079590611bb7565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050908060020180546107f790611bb7565b80601f016020809104026020016040519081016040528092919081815260200182805461082390611bb7565b80156108705780601f1061084557610100808354040283529160200191610870565b820191906000526020600020905b81548152906001019060200180831161085357829003601f168201915b50505050509080600301805461088590611bb7565b80601f01602080910402602001604051908101604052809291908181526020018280546108b190611bb7565b80156108fe5780601f106108d3576101008083540402835291602001916108fe565b820191906000526020600020905b8154815290600101906020018083116108e157829003601f168201915b5050505050905084565b6001600160a01b0381166109635760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6e74726f6c6c6572206164647265737300000000000060448201526064015b60405180910390fd5b600061096f3384610aaf565b6001600160a01b03811660009081526005602052604090205490915060ff16156109d45760405162461bcd60e51b8152602060048201526016602482015275105c1c08185b1c9958591e481c9959da5cdd195c995960521b604482015260640161095a565b6001600160a01b038181166000818152600560209081526040918290208054948716610100026001600160a81b031990951694909417600117909355519081527f0d540ad8f39e07d19909687352b9fa017405d93c91a6760981fbae9cf28bfef7910160405180910390a1505050565b610a4c6112ba565b6002610a588282611c33565b5050565b610a646112ba565b60008181526008602052604090819020805460ff19166001179055517f2a90407c6fcd7c2e2a5e7fd238a1fc6c41ce461f7da1ff6350d0b22435953054906106c19083815260200190565b6040805160609390931b6bffffffffffffffffffffffff19166020808501919091526034808501939093528151808503909301835260549093019052805191012090565b610afb6112ba565b6004610b078282611c33565b507fc0e19c6705b5bf966b7e6a010fac4ed9cb79252157815bdccaed45fd3749c964816040516106c19190611acb565b610b3f6112ba565b60008181526007602052604090819020805460ff19166001179055517fbb218b24bde6ba405fba71b6e1e123ab350a965dc6ad8fc3e53b3cc007547858906106c19083815260200190565b610b92611315565b610b9b826113ba565b610a5882826113c2565b6000610baf611484565b50600080516020611e6983398151915290565b608081013560009081526006602052604081205460609060ff16610c1e57505060408051808201909152601981527f41676772656761746564204d52206e6f7420616c6c6f776564000000000000006020820152600092909150565b60208084013560009081526008909152604090205460ff16610c7857505060408051808201909152601c81527f4b4d5320636f6d706f73652068617368206e6f7420616c6c6f776564000000006020820152600092909150565b606083013560009081526009602052604090205460ff16610cb7576000604051806060016040528060298152602001611e406029913991509150915091565b5050604080516020810190915260008152600192909150565b60048054610cdd90611bb7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0990611bb7565b8015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505081565b610d666112ba565b610d7060006114cd565b565b610d7a6112ba565b6003610a588282611c33565b610d8e6112ba565b60008181526007602052604090819020805460ff19169055517f3177541da10e628041923734a3c8841c1702aa4bc6cdacb818eb704f962e754e906106c19083815260200190565b610dde6112ba565b805181906000908190610df19082611c33565b5060208201516001820190610e069082611c33565b5060408201516002820190610e1b9082611c33565b5060608201516003820190610e309082611c33565b505081516040517f77cdad119a452bbd96c45635758fc4af8a6bde3deaccf3fada634ddf9a16270692506106c19190611acb565b610e6c6112ba565b60008181526009602052604090819020805460ff19166001179055517f6bd4d1a278f7fc5fe63a99cf254e598b6c3c069f51ed67564ca6c033d993fd4a906106c19083815260200190565b610ebf6112ba565b60008181526008602052604090819020805460ff19169055517fac992076e4ec5fa0a511118a6009763a267afca83446be29e4344393e5de4198906106c19083815260200190565b610f0f6112ba565b60008181526009602052604090819020805460ff19169055517fa54eca6bec89886456df499328bab27fe43544464801ecd8f59fdca31e0268d5906106c19083815260200190565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610f9d5750825b905060008267ffffffffffffffff166001148015610fba5750303b155b905081158015610fc8575080155b15610fe65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561101057845460ff60401b1916600160401b1785555b6110198661153e565b61102161154f565b831561106757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6110776112ba565b60008181526006602052604090819020805460ff19166001179055517f4d0e5a3df74b9016e63b2b87a88b85371c1fa39b33ab131de176a0240d714d67906106c19083815260200190565b600060606005826110d66020860186611889565b6001600160a01b0316815260208101919091526040016000205460ff1661112a575050604080518082019091526012815271105c1c081b9bdd081c9959da5cdd195c995960721b6020820152600092909150565b608083013560009081526006602052604090205460ff16158015611162575060a083013560009081526007602052604090205460ff16155b1561118b5760006040518060600160405280602a8152602001611e16602a913991509150915091565b600060058161119d6020870187611889565b6001600160a01b03908116825260208201929092526040016000205461010090041690508061120157600060405180604001604052806016815260200175105c1c0818dbdb9d1c9bdb1b195c881b9bdd081cd95d60521b8152509250925050915091565b60405163e3392a9b60e01b81526001600160a01b0382169063e3392a9b9061122d908790600401611cf3565b600060405180830381865afa15801561124a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112729190810190611d4e565b9250925050915091565b6112846112ba565b6001600160a01b0381166112ae57604051631e4fbdf760e01b81526000600482015260240161095a565b6112b7816114cd565b50565b336112ec7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d705760405163118cdaa760e01b815233600482015260240161095a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061139c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611390600080516020611e69833981519152546001600160a01b031690565b6001600160a01b031614155b15610d705760405163703e46dd60e11b815260040160405180910390fd5b6112b76112ba565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561141c575060408051601f3d908101601f1916820190925261141991810190611de0565b60015b61144457604051634c9c8ce360e01b81526001600160a01b038316600482015260240161095a565b600080516020611e69833981519152811461147557604051632a87526960e21b81526004810182905260240161095a565b61147f8383611557565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d705760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6115466115ad565b6112b7816115f6565b610d706115ad565b611560826115fe565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156115a55761147f8282611663565b610a586116d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d7057604051631afcd79f60e31b815260040160405180910390fd5b6112846115ad565b806001600160a01b03163b60000361163457604051634c9c8ce360e01b81526001600160a01b038216600482015260240161095a565b600080516020611e6983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516116809190611df9565b600060405180830381855af49150503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b50915091506116d08583836116f8565b95945050505050565b3415610d705760405163b398979f60e01b815260040160405180910390fd5b60608261170d5761170882611757565b611750565b815115801561172457506001600160a01b0384163b155b1561174d57604051639996b31560e01b81526001600160a01b038516600482015260240161095a565b50805b9392505050565b8051156117675780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60006020828403121561179257600080fd5b5035919050565b60005b838110156117b457818101518382015260200161179c565b50506000910152565b600081518084526117d5816020860160208601611799565b601f01601f19169290920160200192915050565b6080815260006117fc60808301876117bd565b828103602084015261180e81876117bd565b9050828103604084015261182281866117bd565b9050828103606084015261183681856117bd565b979650505050505050565b80356001600160a01b038116811461185857600080fd5b919050565b6000806040838503121561187057600080fd5b8235915061188060208401611841565b90509250929050565b60006020828403121561189b57600080fd5b61175082611841565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156118dd576118dd6118a4565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561190c5761190c6118a4565b604052919050565b600067ffffffffffffffff82111561192e5761192e6118a4565b50601f01601f191660200190565b600061194f61194a84611914565b6118e3565b905082815283838301111561196357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261198b57600080fd5b6117508383356020850161193c565b6000602082840312156119ac57600080fd5b813567ffffffffffffffff8111156119c357600080fd5b6119cf8482850161197a565b949350505050565b600080604083850312156119ea57600080fd5b6119f383611841565b946020939093013593505050565b600060208284031215611a1357600080fd5b813567ffffffffffffffff811115611a2a57600080fd5b8201601f81018413611a3b57600080fd5b6119cf8482356020840161193c565b60008060408385031215611a5d57600080fd5b611a6683611841565b9150602083013567ffffffffffffffff811115611a8257600080fd5b611a8e8582860161197a565b9150509250929050565b600060c08284031215611aaa57600080fd5b50919050565b82151581526040602082015260006119cf60408301846117bd565b60208152600061175060208301846117bd565b600060208284031215611af057600080fd5b813567ffffffffffffffff80821115611b0857600080fd5b9083019060808286031215611b1c57600080fd5b611b246118ba565b823582811115611b3357600080fd5b611b3f8782860161197a565b825250602083013582811115611b5457600080fd5b611b608782860161197a565b602083015250604083013582811115611b7857600080fd5b611b848782860161197a565b604083015250606083013582811115611b9c57600080fd5b611ba88782860161197a565b60608301525095945050505050565b600181811c90821680611bcb57607f821691505b602082108103611aaa57634e487b7160e01b600052602260045260246000fd5b601f82111561147f576000816000526020600020601f850160051c81016020861015611c145750805b601f850160051c820191505b8181101561106757828155600101611c20565b815167ffffffffffffffff811115611c4d57611c4d6118a4565b611c6181611c5b8454611bb7565b84611beb565b602080601f831160018114611c965760008415611c7e5750858301515b600019600386901b1c1916600185901b178555611067565b600085815260208120601f198616915b82811015611cc557888601518255948401946001909101908401611ca6565b5085821015611ce35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60c081016001600160a01b0380611d0985611841565b1683526020840135602084015280611d2360408601611841565b16604084015250606083013560608301526080830135608083015260a083013560a083015292915050565b60008060408385031215611d6157600080fd5b82518015158114611d7157600080fd5b602084015190925067ffffffffffffffff811115611d8e57600080fd5b8301601f81018513611d9f57600080fd5b8051611dad61194a82611914565b818152866020838501011115611dc257600080fd5b611dd3826020830160208601611799565b8093505050509250929050565b600060208284031215611df257600080fd5b5051919050565b60008251611e0b818460208701611799565b919091019291505056fe4e6569746865722061676772656761746564204d52206e6f7220696d61676520697320616c6c6f7765644b4d53206973206e6f7420616c6c6f77656420746f20626f6f74206f6e207468697320646576696365360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122014c5e3202a8b93ab72b0b0bb9d6d499a5f72298f508fd7fd99d664afce96d1d564736f6c63430008160033"; + +type KmsAuthConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: KmsAuthConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class KmsAuth__factory extends ContractFactory { + constructor(...args: KmsAuthConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + KmsAuth & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): KmsAuth__factory { + return super.connect(runner) as KmsAuth__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): KmsAuthInterface { + return new Interface(_abi) as KmsAuthInterface; + } + static connect(address: string, runner?: ContractRunner | null): KmsAuth { + return new Contract(address, _abi, runner) as unknown as KmsAuth; + } +} diff --git a/kms/auth-eth/typechain-types/factories/contracts/index.ts b/kms/auth-eth/typechain-types/factories/contracts/index.ts new file mode 100644 index 00000000..2bb6f6b8 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/contracts/index.ts @@ -0,0 +1,6 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { AppAuth__factory } from "./AppAuth__factory"; +export { IAppAuth__factory } from "./IAppAuth__factory"; +export { KmsAuth__factory } from "./KmsAuth__factory"; diff --git a/kms/auth-eth/typechain-types/factories/index.ts b/kms/auth-eth/typechain-types/factories/index.ts new file mode 100644 index 00000000..6ff9ace7 --- /dev/null +++ b/kms/auth-eth/typechain-types/factories/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export * as openzeppelin from "./@openzeppelin"; +export * as contracts from "./contracts"; diff --git a/kms/auth-eth/typechain-types/hardhat.d.ts b/kms/auth-eth/typechain-types/hardhat.d.ts new file mode 100644 index 00000000..da2881d5 --- /dev/null +++ b/kms/auth-eth/typechain-types/hardhat.d.ts @@ -0,0 +1,279 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { ethers } from "ethers"; +import { + DeployContractOptions, + FactoryOptions, + HardhatEthersHelpers as HardhatEthersHelpersBase, +} from "@nomicfoundation/hardhat-ethers/types"; + +import * as Contracts from "."; + +declare module "hardhat/types/runtime" { + interface HardhatEthersHelpers extends HardhatEthersHelpersBase { + getContractFactory( + name: "OwnableUpgradeable", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Initializable", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "UUPSUpgradeable", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "ContextUpgradeable", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IERC1822Proxiable", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IERC1967", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IBeacon", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "ERC1967Utils", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Address", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "Errors", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "AppAuth", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IAppAuth", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "KmsAuth", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + + getContractAt( + name: "OwnableUpgradeable", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Initializable", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "UUPSUpgradeable", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "ContextUpgradeable", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IERC1822Proxiable", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IERC1967", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IBeacon", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "ERC1967Utils", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Address", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "Errors", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "AppAuth", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IAppAuth", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "KmsAuth", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + + deployContract( + name: "OwnableUpgradeable", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Initializable", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UUPSUpgradeable", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "ContextUpgradeable", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC1822Proxiable", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC1967", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IBeacon", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "ERC1967Utils", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Address", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Errors", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "AppAuth", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IAppAuth", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "KmsAuth", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + + deployContract( + name: "OwnableUpgradeable", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Initializable", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "UUPSUpgradeable", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "ContextUpgradeable", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC1822Proxiable", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IERC1967", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IBeacon", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "ERC1967Utils", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Address", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "Errors", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "AppAuth", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IAppAuth", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "KmsAuth", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + + // default types + getContractFactory( + name: string, + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + abi: any[], + bytecode: ethers.BytesLike, + signer?: ethers.Signer + ): Promise; + getContractAt( + nameOrAbi: string | any[], + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + deployContract( + name: string, + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: string, + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + } +} diff --git a/kms/auth-eth/typechain-types/index.ts b/kms/auth-eth/typechain-types/index.ts new file mode 100644 index 00000000..7331bf3e --- /dev/null +++ b/kms/auth-eth/typechain-types/index.ts @@ -0,0 +1,34 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type * as openzeppelin from "./@openzeppelin"; +export type { openzeppelin }; +import type * as contracts from "./contracts"; +export type { contracts }; +export * as factories from "./factories"; +export type { OwnableUpgradeable } from "./@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable"; +export { OwnableUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable__factory"; +export type { Initializable } from "./@openzeppelin/contracts-upgradeable/proxy/utils/Initializable"; +export { Initializable__factory } from "./factories/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable__factory"; +export type { UUPSUpgradeable } from "./@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable"; +export { UUPSUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable__factory"; +export type { ContextUpgradeable } from "./@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable"; +export { ContextUpgradeable__factory } from "./factories/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable__factory"; +export type { IERC1822Proxiable } from "./@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable"; +export { IERC1822Proxiable__factory } from "./factories/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable__factory"; +export type { IERC1967 } from "./@openzeppelin/contracts/interfaces/IERC1967"; +export { IERC1967__factory } from "./factories/@openzeppelin/contracts/interfaces/IERC1967__factory"; +export type { IBeacon } from "./@openzeppelin/contracts/proxy/beacon/IBeacon"; +export { IBeacon__factory } from "./factories/@openzeppelin/contracts/proxy/beacon/IBeacon__factory"; +export type { ERC1967Utils } from "./@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils"; +export { ERC1967Utils__factory } from "./factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory"; +export type { Address } from "./@openzeppelin/contracts/utils/Address"; +export { Address__factory } from "./factories/@openzeppelin/contracts/utils/Address__factory"; +export type { Errors } from "./@openzeppelin/contracts/utils/Errors"; +export { Errors__factory } from "./factories/@openzeppelin/contracts/utils/Errors__factory"; +export type { AppAuth } from "./contracts/AppAuth"; +export { AppAuth__factory } from "./factories/contracts/AppAuth__factory"; +export type { IAppAuth } from "./contracts/IAppAuth"; +export { IAppAuth__factory } from "./factories/contracts/IAppAuth__factory"; +export type { KmsAuth } from "./contracts/KmsAuth"; +export { KmsAuth__factory } from "./factories/contracts/KmsAuth__factory"; diff --git a/kms/kms.toml b/kms/kms.toml index c2ac9fc9..655f35bb 100644 --- a/kms/kms.toml +++ b/kms/kms.toml @@ -1,32 +1,40 @@ +[default] workers = 8 max_blocking = 64 -ident = "Phala KMS" +ident = "DStack KMS" temp_dir = "/tmp" keep_alive = 10 log_level = "info" + +[rpc] address = "0.0.0.0" -port = 8043 +port = 8000 -[tls] -key = "/etc/kms/certs/key.pem" -certs = "/etc/kms/certs/cert.pem" +[rpc.tls] +key = "/etc/kms/certs/rpc.key" +certs = "/etc/kms/certs/rpc.crt" -[tls.mutual] -ca_certs = "/etc/kms/certs/ca.cert" +[rpc.tls.mutual] +ca_certs = "/etc/kms/certs/tmp-ca.crt" mandatory = false [core] -root_ca_cert = "/etc/kms/certs/ca.cert" -root_ca_key = "/etc/kms/certs/ca.key" -subject_postfix = ".local" -cert_log_dir = "/var/log/kms" -allow_any_upgrade = false -upgrade_registry_dir = "/var/run/kms/upgrade_registry" +cert_dir = "/etc/kms/certs" +subject_postfix = ".dstack" pccs_url = "https://api.trustedservices.intel.com/tdx/certification/v4" -[core.allowed_mr] -allow_all = false -mrtd = [] -rtmr0 = [] -rtmr1 = [] -rtmr2 = [] +[core.auth_api] +type = "webhook" + +[core.auth_api.webhook] +url = "http://auth-api:8000" + +[core.auth_api.dev] +tproxy_app_id = "any" + +[core.onboard] +enabled = true +auto_bootstrap_domain = "" +quote_enabled = true +address = "0.0.0.0" +port = 8000 diff --git a/kms/rpc/proto/kms_rpc.proto b/kms/rpc/proto/kms_rpc.proto index 365acc4f..9f68f84b 100644 --- a/kms/rpc/proto/kms_rpc.proto +++ b/kms/rpc/proto/kms_rpc.proto @@ -5,28 +5,12 @@ import "google/protobuf/empty.proto"; package kms; message GetAppKeyRequest { - // When upgradable is true, the disk encryption key is derived without the rootfs hash - // so that the app can upgrade the base image - bool upgradable = 1; -} - -// The kms public RPC service. -service KMS { - // Request the app key given the app id and tdx quote - rpc GetAppKey(GetAppKeyRequest) returns (AppKeyResponse) { - // Retrieves the app key and certificate given the app id and tdx quote - } - // Request the app environment encryption public key given the app id - rpc GetAppEnvEncryptPubKey(AppId) returns (PublicKeyResponse) { - // Retrieves the app environment encryption public key given the app id - } - // Request the KMS instance metadata for use as a probe and health check. - rpc GetMeta(google.protobuf.Empty) returns (GetMetaResponse) { - } + // The app compose file + string app_compose = 2; } message AppId { - string app_id = 1; + bytes app_id = 1; } message PublicKeyResponse { @@ -34,13 +18,93 @@ message PublicKeyResponse { } message AppKeyResponse { - string app_key = 1; + // TLS CA certificate which is used as the trust anchor for all HTTPS RPCs in the system. + string ca_cert = 1; + // Disk encryption key used as the key phrase for the App's full disk encryption. bytes disk_crypt_key = 2; + // X25519 key for decrypting secret environment variables. bytes env_crypt_key = 3; - repeated string certificate_chain = 4; + // ECDSA key for app's Ethereum-compatible signing operations. + bytes k256_key = 4; + // Signature of the k256 key signed by the root k256 key. + bytes k256_signature = 5; + // Reverse proxy app ID from KmsAuth contract. + string tproxy_app_id = 6; } message GetMetaResponse { string ca_cert = 1; bool allow_any_upgrade = 2; -} \ No newline at end of file + bytes k256_pubkey = 3; + BootstrapResponse bootstrap_info = 4; +} + +message KmsKeys { + string ca_key = 1; + bytes k256_key = 2; +} + +message KmsKeyResponse { + string temp_ca_key = 1; + repeated KmsKeys keys = 2; +} + +message GetTempCaCertResponse { + string temp_ca_cert = 1; + string temp_ca_key = 2; + string ca_cert = 3; +} + +message SignCertRequest { + bytes csr = 1; + bytes signature = 2; +} + +message SignCertResponse { + repeated string certificate_chain = 1; +} + +// The kms public RPC service. +service KMS { + // Request the app key given the app id and tdx quote + rpc GetAppKey(GetAppKeyRequest) returns (AppKeyResponse); + // KMS key handover + rpc GetKmsKey(google.protobuf.Empty) returns (KmsKeyResponse); + // Request the app environment encryption public key given the app id + rpc GetAppEnvEncryptPubKey(AppId) returns (PublicKeyResponse); + // Request the KMS instance metadata for use as a probe and health check. + rpc GetMeta(google.protobuf.Empty) returns (GetMetaResponse); + // Request the temporary CA certificate and key + rpc GetTempCaCert(google.protobuf.Empty) returns (GetTempCaCertResponse); + // Sign a certificate + rpc SignCert(SignCertRequest) returns (SignCertResponse); +} + +message BootstrapRequest { + string domain = 1; +} + +message BootstrapResponse { + bytes ca_pubkey = 1; + bytes k256_pubkey = 2; + bytes quote = 3; + bytes eventlog = 4; +} + +message OnboardRequest { + string source_url = 1; + string domain = 2; +} + +message OnboardResponse { +} + +// The Onboard RPC service. +service Onboard { + // Bootstrap a new KMS + rpc Bootstrap(BootstrapRequest) returns (BootstrapResponse); + // Onboard from existing KMS + rpc Onboard(OnboardRequest) returns (OnboardResponse); + // Finish onboarding + rpc Finish(google.protobuf.Empty) returns (google.protobuf.Empty); +} diff --git a/kms/src/config.rs b/kms/src/config.rs index a8307368..802c3454 100644 --- a/kms/src/config.rs +++ b/kms/src/config.rs @@ -1,75 +1,102 @@ -use anyhow::Result; use load_config::load_config; use rocket::figment::Figment; use serde::Deserialize; - +use std::path::PathBuf; pub const DEFAULT_CONFIG: &str = include_str!("../kms.toml"); pub fn load_config_figment(config_file: Option<&str>) -> Figment { load_config("kms", DEFAULT_CONFIG, config_file, false) } +const TEMP_CA_CERT: &str = "tmp-ca.crt"; +const TEMP_CA_KEY: &str = "tmp-ca.key"; +const ROOT_CA_CERT: &str = "root-ca.crt"; +const ROOT_CA_KEY: &str = "root-ca.key"; +const RPC_CERT: &str = "rpc.crt"; +const RPC_KEY: &str = "rpc.key"; +const K256_KEY: &str = "root-k256.key"; +const BOOTSTRAP_INFO: &str = "bootstrap-info.json"; + #[derive(Debug, Clone, Deserialize)] pub(crate) struct KmsConfig { - pub allowed_mr: AllowedMr, - pub root_ca_cert: String, - pub root_ca_key: String, - pub subject_postfix: String, - pub cert_log_dir: String, - pub allow_any_upgrade: bool, - pub upgrade_registry_dir: String, - pub pccs_url: String, + pub cert_dir: PathBuf, + pub pccs_url: Option, + pub auth_api: AuthApi, + pub onboard: OnboardConfig, } -#[derive(Debug, Clone)] -pub(crate) struct AllowedMr { - pub allow_all: bool, - pub mrtd: Vec<[u8; 48]>, - pub rtmr0: Vec<[u8; 48]>, - pub rtmr1: Vec<[u8; 48]>, - pub rtmr2: Vec<[u8; 48]>, +impl KmsConfig { + pub fn keys_exists(&self) -> bool { + self.tmp_ca_cert().exists() + && self.tmp_ca_key().exists() + && self.root_ca_cert().exists() + && self.root_ca_key().exists() + && self.rpc_cert().exists() + && self.rpc_key().exists() + && self.k256_key().exists() + } + + pub fn tmp_ca_cert(&self) -> PathBuf { + self.cert_dir.join(TEMP_CA_CERT) + } + + pub fn tmp_ca_key(&self) -> PathBuf { + self.cert_dir.join(TEMP_CA_KEY) + } + + pub fn root_ca_cert(&self) -> PathBuf { + self.cert_dir.join(ROOT_CA_CERT) + } + + pub fn root_ca_key(&self) -> PathBuf { + self.cert_dir.join(ROOT_CA_KEY) + } + + pub fn rpc_cert(&self) -> PathBuf { + self.cert_dir.join(RPC_CERT) + } + + pub fn rpc_key(&self) -> PathBuf { + self.cert_dir.join(RPC_KEY) + } + + pub fn k256_key(&self) -> PathBuf { + self.cert_dir.join(K256_KEY) + } + + pub fn bootstrap_info(&self) -> PathBuf { + self.cert_dir.join(BOOTSTRAP_INFO) + } +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(tag = "type")] +pub(crate) enum AuthApi { + #[serde(rename = "dev")] + Dev { dev: Dev }, + #[serde(rename = "webhook")] + Webhook { webhook: Webhook }, } -impl<'de> Deserialize<'de> for AllowedMr { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - #[derive(Deserialize)] - struct RawAllowedMr { - #[serde(default)] - allow_all: bool, - #[serde(default)] - mrtd: Vec, - #[serde(default)] - rtmr0: Vec, - #[serde(default)] - rtmr1: Vec, - #[serde(default)] - rtmr2: Vec, - } - - let raw = RawAllowedMr::deserialize(deserializer)?; - - fn parse_mrlist<'d, D: serde::Deserializer<'d>>( - list: Vec, - ) -> Result, D::Error> { - list.into_iter() - .map(|s| { - let bytes = hex::decode(&s).map_err(serde::de::Error::custom)?; - bytes - .try_into() - .map_err(|_| serde::de::Error::custom("invalid MR config")) - }) - .collect() - } - - Ok(AllowedMr { - allow_all: raw.allow_all, - mrtd: parse_mrlist::(raw.mrtd)?, - rtmr0: parse_mrlist::(raw.rtmr0)?, - rtmr1: parse_mrlist::(raw.rtmr1)?, - rtmr2: parse_mrlist::(raw.rtmr2)?, - }) +impl AuthApi { + pub fn is_dev(&self) -> bool { + matches!(self, AuthApi::Dev { .. }) } } + +#[derive(Debug, Clone, Deserialize)] +pub(crate) struct Webhook { + pub url: String, +} + +#[derive(Debug, Clone, Deserialize)] +pub(crate) struct Dev { + pub tproxy_app_id: String, +} + +#[derive(Debug, Clone, Deserialize)] +pub(crate) struct OnboardConfig { + pub enabled: bool, + pub quote_enabled: bool, + pub auto_bootstrap_domain: String, +} diff --git a/kms/src/crypto.rs b/kms/src/crypto.rs new file mode 100644 index 00000000..f45c6a4d --- /dev/null +++ b/kms/src/crypto.rs @@ -0,0 +1,25 @@ +use anyhow::{Context, Result}; +use k256::ecdsa::{RecoveryId, Signature, SigningKey}; +use sha3::{Digest, Keccak256}; + +use ra_tls::kdf; + +pub(crate) fn derive_k256_key( + parent_key: &SigningKey, + app_id: &[u8], +) -> Result<(SigningKey, Signature, RecoveryId)> { + let context_data = [app_id, b"app-key"]; + let derived_key_bytes: [u8; 32] = + kdf::derive_ecdsa_key(&parent_key.to_bytes(), &context_data, 32)? + .try_into() + .ok() + .context("Invalid derived key len")?; + let derived_signing_key = SigningKey::from_bytes(&derived_key_bytes.into())?; + let pubkey = derived_signing_key.verifying_key(); + let digest = Keccak256::new_with_prefix( + [b"dstack-kms-issued:", app_id, &pubkey.to_sec1_bytes()].concat(), + ); + let (signature, recid) = parent_key.sign_digest_recoverable(digest)?; + + Ok((derived_signing_key, signature, recid)) +} diff --git a/kms/src/main.rs b/kms/src/main.rs index 641872ca..eacaf71f 100644 --- a/kms/src/main.rs +++ b/kms/src/main.rs @@ -1,14 +1,21 @@ -use anyhow::{anyhow, Context, Result}; +use anyhow::{anyhow, bail, Context, Result}; use clap::Parser; use config::KmsConfig; use main_service::{KmsState, RpcHandler}; use ra_rpc::rocket_helper::QuoteVerifier; -use rocket::fairing::AdHoc; +use rocket::{ + fairing::AdHoc, + figment::{providers::Serialized, Figment}, + response::content::RawHtml, + Shutdown, +}; use tracing::info; mod config; -mod ct_log; +// mod ct_log; +mod crypto; mod main_service; +mod onboard_service; fn app_version() -> String { const CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -28,6 +35,41 @@ struct Args { config: Option, } +async fn run_onboard_service(kms_config: KmsConfig, figment: Figment) -> Result<()> { + use onboard_service::{OnboardHandler, OnboardState}; + + #[rocket::get("/")] + async fn index() -> RawHtml<&'static str> { + RawHtml(include_str!("www/onboard.html")) + } + #[rocket::get("/finish")] + fn finish(shutdown: Shutdown) -> &'static str { + shutdown.notify(); + "OK" + } + + if !kms_config.onboard.auto_bootstrap_domain.is_empty() { + onboard_service::bootstrap_keys(&kms_config)?; + return Ok(()); + } + + let state = OnboardState::new(kms_config); + let figment = figment + .clone() + .merge(Serialized::defaults(figment.find_value("core.onboard")?)); + + // Remove section tls + + let _ = rocket::custom(figment) + .mount("/", rocket::routes![index, finish]) + .mount("/prpc", ra_rpc::prpc_routes!(OnboardState, OnboardHandler)) + .manage(state) + .launch() + .await + .map_err(|err| anyhow!(err.to_string()))?; + Ok(()) +} + #[rocket::main] async fn main() -> Result<()> { { @@ -37,16 +79,28 @@ async fn main() -> Result<()> { } let args = Args::parse(); + let figment = config::load_config_figment(args.config.as_deref()); + let config: KmsConfig = figment.focus("core").extract()?; + + if config.onboard.enabled && !config.keys_exists() { + info!("Onboarding"); + run_onboard_service(config.clone(), figment.clone()).await?; + if !config.keys_exists() { + bail!("Failed to onboard"); + } + } + info!("Starting KMS"); info!("Supported methods:"); for method in main_service::rpc_methods() { info!(" /prpc/{method}"); } - let figment = config::load_config_figment(args.config.as_deref()); - let config: KmsConfig = figment.focus("core").extract()?; let pccs_url = config.pccs_url.clone(); let state = main_service::KmsState::new(config).context("Failed to initialize KMS state")?; + let figment = figment + .clone() + .merge(Serialized::defaults(figment.find_value("rpc")?)); let mut rocket = rocket::custom(figment) .attach(AdHoc::on_response("Add app version header", |_req, res| { Box::pin(async move { @@ -56,10 +110,8 @@ async fn main() -> Result<()> { .mount("/prpc", ra_rpc::prpc_routes!(KmsState, RpcHandler)) .manage(state); - if !pccs_url.is_empty() { - let verifier = QuoteVerifier::new(pccs_url); - rocket = rocket.manage(verifier); - } + let verifier = QuoteVerifier::new(pccs_url); + rocket = rocket.manage(verifier); rocket .launch() diff --git a/kms/src/main_service.rs b/kms/src/main_service.rs index c12b26e6..c2af46f4 100644 --- a/kms/src/main_service.rs +++ b/kms/src/main_service.rs @@ -1,47 +1,65 @@ use std::sync::Arc; use anyhow::{bail, Context, Result}; +use fs_err as fs; +use k256::ecdsa::SigningKey; use kms_rpc::{ kms_server::{KmsRpc, KmsServer}, - AppId, AppKeyResponse, GetAppKeyRequest, GetMetaResponse, PublicKeyResponse, + AppId, AppKeyResponse, GetAppKeyRequest, GetMetaResponse, GetTempCaCertResponse, + KmsKeyResponse, KmsKeys, PublicKeyResponse, SignCertRequest, SignCertResponse, }; -use ra_rpc::{CallContext, RpcCall}; +use ra_rpc::{Attestation, CallContext, RpcCall}; use ra_tls::{ - attestation::Attestation, - cert::{CaCert, CertRequest}, - kdf::{derive_dh_secret, derive_ecdsa_key_pair}, - qvl::quote::{Report, TDReport10}, + attestation::VerifiedAttestation, + cert::{CaCert, CertRequest, CertSigningRequest}, + kdf, }; -use tracing::warn; +use scale::Decode; +use upgrade_authority::BootInfo; -use crate::{ - config::{AllowedMr, KmsConfig}, - ct_log::ct_log_write_cert, -}; -use fs_err as fs; +use crate::{config::KmsConfig, crypto::derive_k256_key}; + +mod upgrade_authority; #[derive(Clone)] pub struct KmsState { inner: Arc, } -struct KmsStateInner { +impl std::ops::Deref for KmsState { + type Target = KmsStateInner; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +pub struct KmsStateInner { config: KmsConfig, root_ca: CaCert, + k256_key: SigningKey, + temp_ca_cert: String, + temp_ca_key: String, } impl KmsState { - fn lock(&self) -> &KmsStateInner { - &self.inner - } - pub fn new(config: KmsConfig) -> Result { - let ca_cert = CaCert::load(&config.root_ca_cert, &config.root_ca_key) + let root_ca = CaCert::load(config.root_ca_cert(), config.root_ca_key()) .context("Failed to load root CA certificate")?; + let key_bytes = fs::read(config.k256_key()).context("Failed to read ECDSA root key")?; + let k256_key = + SigningKey::from_slice(&key_bytes).context("Failed to load ECDSA root key")?; + let temp_ca_key = + fs::read_to_string(config.tmp_ca_key()).context("Faeild to read temp ca key")?; + let temp_ca_cert = + fs::read_to_string(config.tmp_ca_cert()).context("Faeild to read temp ca cert")?; Ok(Self { inner: Arc::new(KmsStateInner { config, - root_ca: ca_cert, + root_ca, + k256_key, + temp_ca_cert, + temp_ca_key, }), }) } @@ -49,142 +67,145 @@ impl KmsState { pub struct RpcHandler { state: KmsState, - attestation: Option, + attestation: Option, } -impl AllowedMr { - pub fn is_allowed(&self, report: &TDReport10) -> bool { - if self.allow_all { - return true; - } - self.mrtd.contains(&report.mr_td) - && self.rtmr0.contains(&report.rt_mr0) - && self.rtmr1.contains(&report.rt_mr1) - && self.rtmr2.contains(&report.rt_mr2) - } +struct BootConfig { + boot_info: BootInfo, + tproxy_app_id: String, } impl RpcHandler { - fn ensure_attested(&self) -> Result<&Attestation> { + fn ensure_attested(&self) -> Result<&VerifiedAttestation> { let Some(attestation) = &self.attestation else { bail!("No attestation provided"); }; - // if !attestation.is_verified() { - // bail!("The quote is not verified"); - // } - let quote = attestation.decode_quote()?; - - let report = match quote.report { - Report::SgxEnclave(_) => bail!("SGX enclave is not supported"), - Report::TD10(r) => r, - Report::TD15(r) => r.base, - }; - if !self.state.inner.config.allowed_mr.is_allowed(&report) { - bail!("Forbidden MR"); - } Ok(attestation) } - fn ensure_app_allowed(&self, app_id: &str, compose_hash: &str) -> Result<()> { - fn truncate(s: &str, len: usize) -> &str { - if s.len() > len { - &s[..len] - } else { - s - } - } - let truncated_compose_hash = truncate(compose_hash, 40); - if app_id == truncated_compose_hash { - return Ok(()); - } - if self.state.inner.config.allow_any_upgrade { - return Ok(()); - } - let registry_dir = &self.state.inner.config.upgrade_registry_dir; - let flag_file_path = format!("{registry_dir}/{app_id}/{truncated_compose_hash}"); - if fs::metadata(&flag_file_path).is_ok() { - return Ok(()); + async fn ensure_kms_allowed(&self) -> Result { + let att = self.ensure_attested()?; + self.ensure_app_attestation_allowed(att, true, false) + .await + .map(|c| c.boot_info) + } + + async fn ensure_app_boot_allowed(&self) -> Result { + let att = self.ensure_attested()?; + self.ensure_app_attestation_allowed(att, false, false).await + } + + async fn ensure_app_attestation_allowed( + &self, + att: &VerifiedAttestation, + is_kms: bool, + use_boottime_mr: bool, + ) -> Result { + let report = att + .report + .report + .as_td10() + .context("Failed to decode TD report")?; + let app_info = att.decode_app_info(use_boottime_mr)?; + let boot_info = BootInfo { + mrtd: report.mr_td.to_vec(), + rtmr0: report.rt_mr0.to_vec(), + rtmr1: report.rt_mr1.to_vec(), + rtmr2: report.rt_mr2.to_vec(), + rtmr3: report.rt_mr3.to_vec(), + mr_aggregated: app_info.mr_aggregated.to_vec(), + mr_image: app_info.mr_image.to_vec(), + mr_key_provider: app_info.mr_key_provider.to_vec(), + app_id: app_info.app_id, + compose_hash: app_info.compose_hash, + instance_id: app_info.instance_id, + device_id: app_info.device_id, + key_provider_info: app_info.key_provider_info, + event_log: String::from_utf8(att.raw_event_log.clone()) + .context("Failed to serialize event log")?, + }; + let response = self + .state + .config + .auth_api + .is_app_allowed(&boot_info, is_kms) + .await?; + if !response.is_allowed { + bail!("Boot denied: {}", response.reason); } - warn!("Denied to load {app_id} of hash {compose_hash}"); - bail!("Compose hash denied"); + Ok(BootConfig { + boot_info, + tproxy_app_id: response.tproxy_app_id, + }) + } + + fn derive_app_ca(&self, app_id: &[u8]) -> Result { + let context_data = vec![app_id, b"app-ca"]; + let app_key = kdf::derive_ecdsa_key_pair(&self.state.root_ca.key, &context_data) + .context("Failed to derive app disk key")?; + let req = CertRequest::builder() + .key(&app_key) + .org_name("Dstack") + .subject("Dstack App CA") + .ca_level(0) + .app_id(app_id) + .special_usage("app:ca") + .build(); + let app_ca = self + .state + .root_ca + .sign(req) + .context("Failed to sign App CA")?; + Ok(CaCert::from_parts(app_key, app_ca)) } } impl KmsRpc for RpcHandler { - async fn get_app_key(self, request: GetAppKeyRequest) -> Result { - let attest = self.ensure_attested()?; - let app_id = attest.decode_app_id().context("Failed to decode app ID")?; - let instance_id = attest - .decode_instance_id() - .context("Failed to decode instance ID")?; - let compose_hash = attest - .decode_compose_hash() - .context("Failed to decode compose hash")?; - self.ensure_app_allowed(&app_id, &compose_hash) + async fn get_app_key(self, _request: GetAppKeyRequest) -> Result { + let BootConfig { + boot_info, + tproxy_app_id, + } = self + .ensure_app_boot_allowed() + .await .context("App not allowed")?; - let rootfs_hash = attest - .decode_rootfs_hash() - .context("Failed to decode rootfs hash")?; - - let state = self.state.lock(); + let app_id = boot_info.app_id; + let instance_id = boot_info.instance_id; - let app_key = derive_ecdsa_key_pair( - &state.root_ca.key, - &[app_id.as_bytes(), "app-key".as_bytes()], - ) - .context("Failed to derive app key")?; - let mut context_data = if request.upgradable { - vec![] - } else { - vec![rootfs_hash.as_bytes()] - }; - context_data.extend(vec![ - app_id.as_bytes(), - instance_id.as_bytes(), - "app-disk-crypt-key".as_bytes(), - ]); - let app_disk_key = derive_ecdsa_key_pair(&state.root_ca.key, &context_data) + let context_data = vec![&app_id[..], &instance_id[..], b"app-disk-crypt-key"]; + let app_disk_key = kdf::derive_dh_secret(&self.state.root_ca.key, &context_data) .context("Failed to derive app disk key")?; - let env_crypt_key = { - let secret = derive_dh_secret( - &state.root_ca.key, - &[app_id.as_bytes(), "env-encrypt-key".as_bytes()], - ) - .context("Failed to derive env encrypt key")?; + let secret = + kdf::derive_dh_secret(&self.state.root_ca.key, &[&app_id[..], b"env-encrypt-key"]) + .context("Failed to derive env encrypt key")?; let secret = x25519_dalek::StaticSecret::from(secret); secret.to_bytes() }; - let subject = format!("{app_id}{}", state.config.subject_postfix); - let req = CertRequest::builder() - .subject(&subject) - .ca_level(1) - .quote(&attest.quote) - .event_log(&attest.raw_event_log) - .key(&app_key) - .build(); - let cert = state - .root_ca - .sign(req) - .context("Failed to sign certificate")? - .pem(); + let (k256_key, k256_signature) = { + let (k256_app_key, signature, recid) = derive_k256_key(&self.state.k256_key, &app_id) + .context("Failed to derive app ecdsa key")?; - ct_log_write_cert(&app_id, &cert, &state.config.cert_log_dir) - .context("failed to log certificate")?; + let mut signature = signature.to_vec(); + signature.push(recid.to_byte()); + (k256_app_key.to_bytes().to_vec(), signature) + }; Ok(AppKeyResponse { - app_key: app_key.serialize_pem(), - disk_crypt_key: app_disk_key.serialize_der(), + ca_cert: self.state.root_ca.pem_cert.clone(), + disk_crypt_key: app_disk_key.to_vec(), env_crypt_key: env_crypt_key.to_vec(), - certificate_chain: vec![cert, state.root_ca.cert.pem()], + k256_key, + k256_signature, + tproxy_app_id, }) } async fn get_app_env_encrypt_pub_key(self, request: AppId) -> Result { - let secret = derive_dh_secret( - &self.state.lock().root_ca.key, - &[request.app_id.as_bytes(), "env-encrypt-key".as_bytes()], + let secret = kdf::derive_dh_secret( + &self.state.root_ca.key, + &[&request.app_id[..], "env-encrypt-key".as_bytes()], ) .context("Failed to derive env encrypt key")?; let secret = x25519_dalek::StaticSecret::from(secret); @@ -195,9 +216,61 @@ impl KmsRpc for RpcHandler { } async fn get_meta(self) -> Result { + let bootstrap_info = fs::read_to_string(self.state.config.bootstrap_info()) + .ok() + .and_then(|s| serde_json::from_str(&s).ok()); Ok(GetMetaResponse { - ca_cert: self.state.inner.root_ca.cert.pem(), - allow_any_upgrade: self.state.inner.config.allow_any_upgrade, + ca_cert: self.state.inner.root_ca.pem_cert.clone(), + allow_any_upgrade: self.state.inner.config.auth_api.is_dev(), + k256_pubkey: self.state.inner.k256_key.to_bytes().to_vec(), + bootstrap_info, + }) + } + + async fn get_kms_key(self) -> Result { + if self.state.config.onboard.quote_enabled { + let _info = self.ensure_kms_allowed().await?; + } + Ok(KmsKeyResponse { + temp_ca_key: self.state.inner.temp_ca_key.clone(), + keys: vec![KmsKeys { + ca_key: self.state.inner.root_ca.key.serialize_pem(), + k256_key: self.state.inner.k256_key.to_bytes().to_vec(), + }], + }) + } + + async fn get_temp_ca_cert(self) -> Result { + Ok(GetTempCaCertResponse { + temp_ca_cert: self.state.inner.temp_ca_cert.clone(), + temp_ca_key: self.state.inner.temp_ca_key.clone(), + ca_cert: self.state.inner.root_ca.pem_cert.clone(), + }) + } + + async fn sign_cert(self, request: SignCertRequest) -> Result { + let csr = + CertSigningRequest::decode(&mut &request.csr[..]).context("Failed to parse csr")?; + csr.verify(&request.signature) + .context("Failed to verify csr signature")?; + let attestation = Attestation::new(csr.quote.clone(), csr.event_log.clone()) + .context("Failed to create attestation from quote and event log")? + .verify_with_ra_pubkey(&csr.pubkey, self.state.config.pccs_url.as_deref()) + .await + .context("Quote verification failed")?; + let app_info = self + .ensure_app_attestation_allowed(&attestation, false, true) + .await?; + let app_ca = self.derive_app_ca(&app_info.boot_info.app_id)?; + let cert = app_ca + .sign_csr(&csr, Some(&app_info.boot_info.app_id), "app:custom") + .context("Failed to sign certificate")?; + Ok(SignCertResponse { + certificate_chain: vec![ + cert.pem(), + app_ca.pem_cert.clone(), + self.state.root_ca.pem_cert.clone(), + ], }) } } diff --git a/kms/src/main_service/upgrade_authority.rs b/kms/src/main_service/upgrade_authority.rs new file mode 100644 index 00000000..f6f5de0a --- /dev/null +++ b/kms/src/main_service/upgrade_authority.rs @@ -0,0 +1,79 @@ +use crate::config::AuthApi; +use anyhow::{bail, Result}; +use serde::{Deserialize, Serialize}; +use serde_human_bytes as hex_bytes; + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct BootInfo { + #[serde(with = "hex_bytes")] + pub mrtd: Vec, + #[serde(with = "hex_bytes")] + pub rtmr0: Vec, + #[serde(with = "hex_bytes")] + pub rtmr1: Vec, + #[serde(with = "hex_bytes")] + pub rtmr2: Vec, + #[serde(with = "hex_bytes")] + pub rtmr3: Vec, + #[serde(with = "hex_bytes")] + pub mr_aggregated: Vec, + #[serde(with = "hex_bytes")] + pub mr_image: Vec, + #[serde(with = "hex_bytes")] + pub mr_key_provider: Vec, + #[serde(with = "hex_bytes")] + pub app_id: Vec, + #[serde(with = "hex_bytes")] + pub compose_hash: Vec, + #[serde(with = "hex_bytes")] + pub instance_id: Vec, + #[serde(with = "hex_bytes")] + pub device_id: Vec, + #[serde(with = "hex_bytes")] + pub key_provider_info: Vec, + pub event_log: String, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct BootResponse { + pub is_allowed: bool, + pub tproxy_app_id: String, + pub reason: String, +} + +impl AuthApi { + pub async fn is_app_allowed(&self, boot_info: &BootInfo, is_kms: bool) -> Result { + match self { + AuthApi::Dev { dev } => Ok(BootResponse { + is_allowed: true, + reason: "".to_string(), + tproxy_app_id: dev.tproxy_app_id.clone(), + }), + AuthApi::Webhook { webhook } => { + let client = reqwest::Client::new(); + let path = if is_kms { + "bootAuth/kms" + } else { + "bootAuth/app" + }; + let url = url_join(&webhook.url, path); + let response = client.post(&url).json(&boot_info).send().await?; + if !response.status().is_success() { + bail!("Failed to check boot auth: {}", response.text().await?); + } + Ok(response.json().await?) + } + } + } +} + +fn url_join(url: &str, path: &str) -> String { + let mut url = url.to_string(); + if !url.ends_with('/') { + url.push('/'); + } + url.push_str(path); + url +} diff --git a/kms/src/onboard_service.rs b/kms/src/onboard_service.rs new file mode 100644 index 00000000..3e07903b --- /dev/null +++ b/kms/src/onboard_service.rs @@ -0,0 +1,269 @@ +use anyhow::{Context, Result}; +use http_client::prpc::PrpcClient; +use k256::ecdsa::SigningKey; +use kms_rpc::{ + kms_client::KmsClient, + onboard_server::{OnboardRpc, OnboardServer}, + BootstrapRequest, BootstrapResponse, OnboardRequest, OnboardResponse, +}; +use ra_rpc::{client::RaClient, CallContext, RpcCall}; +use ra_tls::{ + attestation::QuoteContentType, + cert::{CaCert, CertRequest}, + rcgen::{Certificate, KeyPair, PKCS_ECDSA_P256_SHA256}, +}; +use safe_write::safe_write; +use tappd_rpc::{tappd_client::TappdClient, RawQuoteArgs, TdxQuoteResponse}; + +use crate::config::KmsConfig; + +#[derive(Clone)] +pub struct OnboardState { + config: KmsConfig, +} + +impl OnboardState { + pub fn new(config: KmsConfig) -> Self { + Self { config } + } +} + +pub struct OnboardHandler { + state: OnboardState, +} + +impl RpcCall for OnboardHandler { + type PrpcService = OnboardServer; + + fn construct(context: CallContext<'_, OnboardState>) -> Result { + Ok(OnboardHandler { + state: context.state.clone(), + }) + } +} + +impl OnboardRpc for OnboardHandler { + async fn bootstrap(self, request: BootstrapRequest) -> Result { + let keys = Keys::generate(&request.domain).context("Failed to generate keys")?; + + let k256_pubkey = keys.k256_key.verifying_key().to_sec1_bytes().to_vec(); + let ca_pubkey = keys.ca_key.public_key_der(); + let quote; + let eventlog; + if self.state.config.onboard.quote_enabled { + (quote, eventlog) = quote_keys(&ca_pubkey, &k256_pubkey).await?; + } else { + quote = vec![]; + eventlog = vec![]; + }; + + let cfg = &self.state.config; + let response = BootstrapResponse { + ca_pubkey, + k256_pubkey, + quote, + eventlog, + }; + // Store the bootstrap info + safe_write(cfg.bootstrap_info(), serde_json::to_vec(&response)?)?; + keys.store(cfg)?; + Ok(response) + } + + async fn onboard(self, request: OnboardRequest) -> Result { + let keys = Keys::onboard( + &request.source_url, + &request.domain, + self.state.config.onboard.quote_enabled, + ) + .await + .context("Failed to onboard")?; + keys.store(&self.state.config) + .context("Failed to store keys")?; + Ok(OnboardResponse {}) + } + + async fn finish(self) -> anyhow::Result<()> { + std::process::exit(0); + } +} + +struct Keys { + k256_key: SigningKey, + tmp_ca_key: KeyPair, + tmp_ca_cert: Certificate, + ca_key: KeyPair, + ca_cert: Certificate, + rpc_key: KeyPair, + rpc_cert: Certificate, +} + +impl Keys { + fn generate(domain: &str) -> Result { + let tmp_ca_key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; + let ca_key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; + let rpc_key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; + let k256_key = SigningKey::random(&mut rand::rngs::OsRng); + Self::from_keys(tmp_ca_key, ca_key, rpc_key, k256_key, domain) + } + + fn from_keys( + tmp_ca_key: KeyPair, + ca_key: KeyPair, + rpc_key: KeyPair, + k256_key: SigningKey, + domain: &str, + ) -> Result { + let tmp_ca_cert = CertRequest::builder() + .org_name("Dstack") + .subject("Dstack Client Temp CA") + .ca_level(0) + .key(&tmp_ca_key) + .build() + .self_signed()?; + + // Create self-signed KMS cert + let ca_cert = CertRequest::builder() + .org_name("Dstack") + .subject("Dstack KMS CA") + .ca_level(1) + .key(&ca_key) + .build() + .self_signed()?; + + // Sign WWW server cert with KMS cert + let rpc_cert = CertRequest::builder() + .subject(domain) + .alt_names(&[domain.to_string()]) + .special_usage("kms:rpc") + .key(&rpc_key) + .build() + .signed_by(&ca_cert, &ca_key)?; + Ok(Keys { + k256_key, + tmp_ca_key, + tmp_ca_cert, + ca_key, + ca_cert, + rpc_key, + rpc_cert, + }) + } + + async fn onboard(other_kms_url: &str, domain: &str, quote_enabled: bool) -> Result { + let kms_client = RaClient::new(other_kms_url.into(), true)?; + let mut kms_client = KmsClient::new(kms_client); + + if quote_enabled { + let tmp_ca = kms_client.get_temp_ca_cert().await?; + let (ra_cert, ra_key) = gen_ra_cert(tmp_ca.temp_ca_cert, tmp_ca.temp_ca_key).await?; + let ra_client = RaClient::new_mtls(other_kms_url.into(), ra_cert, ra_key) + .context("Failed to create client")?; + kms_client = KmsClient::new(ra_client); + } + + let keys_res = kms_client.get_kms_key().await?; + if keys_res.keys.len() != 1 { + return Err(anyhow::anyhow!("Invalid keys")); + } + let keys = keys_res.keys[0].clone(); + let tmp_ca_key_pem = keys_res.temp_ca_key; + let root_ca_key_pem = keys.ca_key; + let root_k256_key = keys.k256_key; + + let rpc_key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; + let ca_key = KeyPair::from_pem(&root_ca_key_pem).context("Failed to parse CA key")?; + let tmp_ca_key = + KeyPair::from_pem(&tmp_ca_key_pem).context("Failed to parse tmp CA key")?; + let ecdsa_key = + SigningKey::from_slice(&root_k256_key).context("Failed to parse ECDSA key")?; + Self::from_keys(tmp_ca_key, ca_key, rpc_key, ecdsa_key, domain) + } + + fn store(&self, cfg: &KmsConfig) -> Result<()> { + // Store the temporary CA cert and key + safe_write(cfg.tmp_ca_cert(), self.tmp_ca_cert.pem())?; + safe_write(cfg.tmp_ca_key(), self.tmp_ca_key.serialize_pem())?; + + // Store the root CA cert and key + safe_write(cfg.root_ca_cert(), self.ca_cert.pem())?; + safe_write(cfg.root_ca_key(), self.ca_key.serialize_pem())?; + + // Store the RPC cert and key + safe_write(cfg.rpc_cert(), self.rpc_cert.pem())?; + safe_write(cfg.rpc_key(), self.rpc_key.serialize_pem())?; + + // Store the ECDSA root key + safe_write(cfg.k256_key(), self.k256_key.to_bytes())?; + + Ok(()) + } +} + +pub(crate) fn bootstrap_keys(cfg: &KmsConfig) -> Result<()> { + let keys = + Keys::generate(&cfg.onboard.auto_bootstrap_domain).context("Failed to generate keys")?; + keys.store(cfg)?; + Ok(()) +} + +fn tappd_client() -> Result> { + let http_client = PrpcClient::new_unix("/var/run/tappd.sock".into(), "/prpc".into()); + let tappd_client = TappdClient::new(http_client); + Ok(tappd_client) +} + +async fn tapp_quote(report_data: Vec) -> Result { + let quote = tappd_client()? + .raw_quote(RawQuoteArgs { report_data }) + .await?; + Ok(quote) +} + +async fn quote_keys(p256_pubkey: &[u8], k256_pubkey: &[u8]) -> Result<(Vec, Vec)> { + let p256_hex = hex::encode(p256_pubkey); + let k256_hex = hex::encode(k256_pubkey); + let content_to_quote = format!("dstack-kms-genereted-keys-v1:{p256_hex};{k256_hex};"); + let hash = keccak256(content_to_quote.as_bytes()); + let report_data = pad64(hash); + let res = tapp_quote(report_data).await?; + Ok((res.quote, res.event_log.into())) +} + +fn keccak256(msg: &[u8]) -> [u8; 32] { + use sha3::{Digest, Keccak256}; + let mut hasher = Keccak256::new(); + hasher.update(msg); + hasher.finalize().into() +} + +fn pad64(hash: [u8; 32]) -> Vec { + let mut padded = Vec::with_capacity(64); + padded.extend_from_slice(&hash); + padded.resize(64, 0); + padded +} + +async fn gen_ra_cert(ca_cert_pem: String, ca_key_pem: String) -> Result<(String, String)> { + use ra_tls::cert::CertRequest; + use ra_tls::rcgen::{KeyPair, PKCS_ECDSA_P256_SHA256}; + + let ca = CaCert::new(ca_cert_pem, ca_key_pem)?; + + let key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; + let pubkey = key.public_key_der(); + let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey); + let quote_res = tapp_quote(report_data.to_vec()) + .await + .context("Failed to get quote")?; + let quote = quote_res.quote; + let event_log: Vec = quote_res.event_log.into(); + let req = CertRequest::builder() + .subject("RA-TLS TEMP Cert") + .quote("e) + .event_log(&event_log) + .key(&key) + .build(); + let cert = ca.sign(req).context("Failed to sign certificate")?; + Ok((cert.pem(), key.serialize_pem())) +} diff --git a/kms/src/www/onboard.html b/kms/src/www/onboard.html new file mode 100644 index 00000000..305f67ec --- /dev/null +++ b/kms/src/www/onboard.html @@ -0,0 +1,256 @@ + + + + + DStack KMS Setup + + + + + +
+

DStack KMS Setup

+ +
+
+ + +
+ + +
+
+

Bootstrap A New KMS Instance

+
+
+ + +
+ +
+ +
+ +
+

Onboard from an Existing KMS Instance

+
+
+ + +
+
+ + +
+ +
+ +
+
+
+
+ +
{{ error }}
+
+ {{ success }} + +
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/kms/tapp/compose-dev.yaml b/kms/tapp/compose-dev.yaml new file mode 100644 index 00000000..2fa216c0 --- /dev/null +++ b/kms/tapp/compose-dev.yaml @@ -0,0 +1,57 @@ +services: + auth-api: + build: + context: . + dockerfile_inline: | + FROM node:18-alpine@sha256:06f7bbbcec00dd10c21a3a0962609600159601b5004d84aff142977b449168e9 + WORKDIR /app + + RUN apk add --no-cache git + RUN git clone https://github.com/Dstack-TEE/dstack.git && \ + cd dstack && \ + git checkout c70a6ed18858ed6ba42ed92f5dce1e120c4cf7c7 + WORKDIR /app/dstack/kms/auth-eth + RUN npm install && \ + npx hardhat typechain && \ + npx tsc --project tsconfig.json + CMD node dist/src/main.js + environment: + - HOST=0.0.0.0 + - PORT=8000 + - ETH_RPC_URL=https://rpc.phala.network + - KMS_CONTRACT_ADDR=0xEf33Ad0701a0c57C871F583681AE869ecfaedce4 + restart: unless-stopped + + kms: + build: + context: . + dockerfile_inline: | + FROM rust:1.84@sha256:e6e40c05cfe7dd55ad13794333d31b6d0818f0c6086876e7dc65871e6c8c0b21 + WORKDIR /app + RUN apt-get update && apt-get install -y \ + git \ + build-essential \ + libssl-dev \ + protobuf-compiler \ + libprotobuf-dev \ + clang \ + libclang-dev \ + --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* + RUN git clone https://github.com/Dstack-TEE/dstack.git && \ + cd dstack && \ + git checkout c70a6ed18858ed6ba42ed92f5dce1e120c4cf7c7 + WORKDIR /app/dstack + RUN cargo build --release -p kms + CMD ["./target/release/kms"] + volumes: + - kms-volume:/etc/kms + - /var/run/tappd.sock:/var/run/tappd.sock + ports: + - 8000:8000 + depends_on: + - auth-api + restart: unless-stopped + +volumes: + kms-volume: diff --git a/kms/tapp/docker-compose.yaml b/kms/tapp/docker-compose.yaml new file mode 100644 index 00000000..5bf0ab41 --- /dev/null +++ b/kms/tapp/docker-compose.yaml @@ -0,0 +1,83 @@ +services: + # Helios is a Ethereum light client + helios: + build: + context: . + dockerfile_inline: | + FROM rust:1.80-alpine@sha256:1f5aff501e02c1384ec61bb47f89e3eebf60e287e6ed5d1c598077afc82e83d5 + WORKDIR /app + RUN apk add --no-cache git build-base openssl-dev protobuf protobuf-dev perl + RUN git clone https://github.com/a16z/helios && \ + cd helios && \ + git checkout 5c61864a167c16141a9a12b976c0e9398b332f07 + WORKDIR /app/helios + RUN cargo build --release + command: [ + "./target/release/helios", + "ethereum", + "--network", "mainnet", + "--checkpoint", "0xbee4f32f91e62060d2aa41c652f6c69431829cfb09b02ea3cad92f65bd15dcce", + "--rpc-bind-ip", "0.0.0.0", + "--rpc-port", "8545", + "--consensus-rpc", "https://ethereum.operationsolarstorm.org", + "--execution-rpc", "https://ethereum-rpc.publicnode.com" + ] + + # Auth API is a webhook server that authenticates KMS instances and Apps launches + auth-api: + build: + context: . + dockerfile_inline: | + FROM node:18-alpine@sha256:06f7bbbcec00dd10c21a3a0962609600159601b5004d84aff142977b449168e9 + WORKDIR /app + + RUN apk add --no-cache git + RUN git clone https://github.com/Dstack-TEE/dstack.git && \ + cd dstack && \ + git checkout 78057c975fe4b9e21f557fb888d72eeecfb21178 + WORKDIR /app/dstack/kms/auth-eth + RUN npm install && \ + npx hardhat typechain && \ + npx tsc --project tsconfig.json + CMD node dist/src/main.js + environment: + - HOST=0.0.0.0 + - PORT=8000 + - ETH_RPC_URL=http://helios:8545 + - KMS_CONTRACT_ADDR=0x515cd0dd984Adc75EE8625131FcC3d2D91f7F140 + depends_on: + - helios + + # KMS handles the TEE Remote Attestation + kms: + build: + context: . + dockerfile_inline: | + FROM rust:1.80@sha256:d22d8938f0403ee31c118b5bf2162b883313dd7f387f859d9f2accd7c884c385 + WORKDIR /app + RUN apt-get update && apt-get install -y \ + git \ + build-essential \ + libssl-dev \ + protobuf-compiler \ + libprotobuf-dev \ + clang \ + libclang-dev \ + --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* + RUN git clone https://github.com/Dstack-TEE/dstack.git && \ + cd dstack && \ + git checkout 78057c975fe4b9e21f557fb888d72eeecfb21178 + WORKDIR /app/dstack + RUN cargo build --release -p kms + CMD ["./target/release/kms"] + volumes: + - kms-volume:/etc/kms + - /var/run/tappd.sock:/var/run/tappd.sock + ports: + - 8000:8000 + depends_on: + - auth-api + +volumes: + kms-volume: diff --git a/ra-rpc/Cargo.toml b/ra-rpc/Cargo.toml index 9e7aaf07..563f90b4 100644 --- a/ra-rpc/Cargo.toml +++ b/ra-rpc/Cargo.toml @@ -17,6 +17,7 @@ ra-tls.workspace = true bon.workspace = true rocket-vsock-listener = { workspace = true, optional = true } serde.workspace = true +x509-parser.workspace = true [features] default = ["rocket", "client"] diff --git a/ra-rpc/src/client.rs b/ra-rpc/src/client.rs index e4105c33..98057aeb 100644 --- a/ra-rpc/src/client.rs +++ b/ra-rpc/src/client.rs @@ -1,50 +1,138 @@ use std::time::Duration; -use anyhow::{Context, Result}; +use anyhow::{bail, Context, Result}; use prpc::{ client::{Error, RequestClient}, - server::ProtoError, Message, }; -use reqwest::{Certificate, Client, Identity}; +use ra_tls::{ + attestation::{Attestation, VerifiedAttestation}, + traits::CertExt, +}; +use reqwest::{tls::TlsInfo, Certificate, Client, Identity, Response}; use serde::{de::DeserializeOwned, Serialize}; +use bon::Builder; + +pub struct CertInfo { + pub cert_der: Vec, + pub attestation: Option, + pub special_usage: Option, +} + +type CertValidator = Box) -> Result<()> + Send + Sync + 'static>; + +#[derive(Builder)] +pub struct RaClientConfig { + remote_uri: String, + #[builder(default = false)] + tls_no_check: bool, + #[builder(default = false)] + tls_no_check_hostname: bool, + tls_client_cert: Option, + tls_client_key: Option, + tls_ca_cert: Option, + #[builder(default = true)] + tls_built_in_root_certs: bool, + pccs_url: Option, + cert_validator: Option, +} + +impl RaClientConfig { + pub fn into_client(self) -> Result { + let mut builder = Client::builder() + .tls_sni(true) + .danger_accept_invalid_certs(self.tls_no_check) + .danger_accept_invalid_hostnames(self.tls_no_check_hostname) + .tls_built_in_root_certs(self.tls_built_in_root_certs) + .connect_timeout(Duration::from_secs(5)) + .timeout(Duration::from_secs(60)); + if self.cert_validator.is_some() { + builder = builder.tls_info(true); + } + if let (Some(cert_pem), Some(key_pem)) = (self.tls_client_cert, self.tls_client_key) { + let identity_pem = format!("{cert_pem}\n{key_pem}"); + let identity = + Identity::from_pem(identity_pem.as_bytes()).context("Failed to parse identity")?; + builder = builder.identity(identity); + } + if let Some(ca) = self.tls_ca_cert { + let ca = Certificate::from_pem(ca.as_bytes()).context("Failed to parse CA")?; + builder = builder.add_root_certificate(ca); + } + let client = builder.build().context("failed to create client")?; + Ok(RaClient { + remote_uri: self.remote_uri, + pccs_url: self.pccs_url, + client, + attestation_validator: self.cert_validator, + }) + } +} + pub struct RaClient { remote_uri: String, + pccs_url: Option, client: Client, + attestation_validator: Option, } impl RaClient { - pub fn new(remote_uri: String, tls_no_check: bool) -> Self { - let client = Client::builder() - .tls_sni(true) - .danger_accept_invalid_certs(tls_no_check) - .connect_timeout(Duration::from_secs(5)) - .timeout(Duration::from_secs(60)) + pub fn new(remote_uri: String, tls_no_check: bool) -> Result { + RaClientConfig::builder() + .tls_no_check(tls_no_check) + .remote_uri(remote_uri) .build() - .expect("failed to create client"); - Self { remote_uri, client } + .into_client() + .context("failed to create client") } - pub fn new_mtls( - remote_uri: String, - ca_cert: String, - cert_pem: String, - key_pem: String, - ) -> Result { - let root_ca = - Certificate::from_pem(ca_cert.as_bytes()).context("Failed to parse CA cert")?; - let identity_pem = format!("{cert_pem}\n{key_pem}"); - let identity = - Identity::from_pem(identity_pem.as_bytes()).context("Failed to parse identity")?; - let client = Client::builder() - .tls_sni(true) - .add_root_certificate(root_ca) - .identity(identity) - .connect_timeout(Duration::from_secs(5)) - .timeout(Duration::from_secs(60)) + + pub fn new_mtls(remote_uri: String, cert_pem: String, key_pem: String) -> Result { + RaClientConfig::builder() + .tls_no_check(true) + .tls_built_in_root_certs(false) + .remote_uri(remote_uri) + .tls_client_cert(cert_pem) + .tls_client_key(key_pem) .build() - .context("failed to create client")?; - Ok(Self { remote_uri, client }) + .into_client() + .context("failed to create client") + } + + async fn try_validate_attestation(&self, response: &Response) -> Result<()> { + let Some(validator) = &self.attestation_validator else { + return Ok(()); + }; + + let Some(tls_info) = response.extensions().get::() else { + bail!("No TLS info in response"); + }; + let Some(cert) = tls_info.peer_certificate() else { + return validator(None); + }; + let cert_der = cert.to_vec(); + let (_, cert) = + x509_parser::parse_x509_certificate(cert).context("Failed to parse certificate")?; + let special_usage = cert + .get_special_usage() + .context("Failed to get special usage")?; + let attestation = + match Attestation::from_cert(&cert).context("Failed to parse attestation")? { + Some(attestation) => { + let verified_attestation = attestation + .verify_with_ra_pubkey(cert.public_key().raw, self.pccs_url.as_deref()) + .await + .context("Failed to verify the attestation report")?; + Some(verified_attestation) + } + None => None, + }; + let cert_info = CertInfo { + cert_der, + attestation, + special_usage, + }; + validator(Some(cert_info)) } } @@ -62,21 +150,21 @@ impl RequestClient for RaClient { .body(body) .send() .await - .map_err(|err| Error::RpcError(format!("failed to send request: {:?}", err)))?; + .context("Failed to send request")?; + + self.try_validate_attestation(&response) + .await + .context("Failed to validate attestation")?; + let status = response.status(); if !status.is_success() { - let body = response.bytes().await.unwrap_or_default(); - let error = ProtoError::decode(body.as_ref()) - .unwrap_or_default() - .message; - return Err(Error::RpcError(format!( - "request failed with status={status}, error={error}", - ))); + let body = response.text().await.unwrap_or_default(); + bail!("Request failed with status={status}, error={body}"); } let body = response .bytes() .await - .map_err(|err| Error::RpcError(format!("failed to read response: {:?}", err)))? + .context("Failed to read response")? .to_vec(); let response = serde_json::from_slice(&body).context("Failed to deserialize response")?; Ok(response) diff --git a/ra-rpc/src/lib.rs b/ra-rpc/src/lib.rs index b602dc40..b4f25f91 100644 --- a/ra-rpc/src/lib.rs +++ b/ra-rpc/src/lib.rs @@ -3,13 +3,10 @@ use std::{net::SocketAddr, path::PathBuf}; use anyhow::Result; -use prpc::{ - codec::encode_message_to_vec, - server::{ProtoError, Service as PrpcService}, -}; +use prpc::{codec::encode_message_to_vec, server::Service as PrpcService}; use tracing::{error, info}; -pub use ra_tls::attestation::Attestation; +pub use ra_tls::attestation::{Attestation, VerifiedAttestation}; #[cfg(feature = "rocket")] pub mod rocket_helper; @@ -29,7 +26,7 @@ pub enum RemoteEndpoint { #[derive(Clone, bon::Builder)] pub struct CallContext<'a, State> { pub state: &'a State, - pub attestation: Option, + pub attestation: Option, pub remote_endpoint: Option, } @@ -63,20 +60,13 @@ async fn dispatch_prpc( query: bool, server: impl PrpcService + Send + 'static, ) -> (u16, Vec) { - use prpc::server::Error; - info!("dispatching request: {}", path); let result = server.dispatch_request(&path, data, json, query).await; let (code, data) = match result { Ok(data) => (200, data), Err(err) => { error!("rpc error: {:?}", err); - let (code, error) = match err { - Error::NotFound => (404, "method Not Found".to_string()), - Error::DecodeError(err) => (400, format!("DecodeError({err:?})")), - Error::BadRequest(msg) => (400, msg), - }; - (code, encode_error(json, error)) + (400, encode_error(json, format!("{err:?}"))) } }; (code, data) @@ -88,6 +78,6 @@ pub fn encode_error(json: bool, error: impl Into) -> Vec { .unwrap_or_else(|_| r#"{"error": "failed to encode the error"}"#.to_string()) .into_bytes() } else { - encode_message_to_vec(&ProtoError::new(error.into())) + encode_message_to_vec(&::prpc::server::ProtoError::new(error.into())) } } diff --git a/ra-rpc/src/rocket_helper.rs b/ra-rpc/src/rocket_helper.rs index 223d6045..a22854f8 100644 --- a/ra-rpc/src/rocket_helper.rs +++ b/ra-rpc/src/rocket_helper.rs @@ -1,31 +1,24 @@ -use std::{ - convert::Infallible, - time::{Duration, SystemTime, UNIX_EPOCH}, -}; +use std::convert::Infallible; use anyhow::{Context, Result}; -use ra_tls::{ - attestation::Attestation, - qvl::{self, verify::VerifiedReport}, -}; +use ra_tls::attestation::Attestation; use rocket::{ data::{ByteUnit, Data, Limits, ToByteUnit}, http::{uri::Origin, ContentType, Method, Status}, listener::Endpoint, - mtls::{oid::Oid, Certificate}, + mtls::Certificate, request::{FromRequest, Outcome}, response::status::Custom, Request, }; use rocket_vsock_listener::VsockEndpoint; -use tracing::{info, warn}; +use tracing::warn; use crate::{encode_error, CallContext, RemoteEndpoint, RpcCall}; #[derive(Debug, Clone)] pub struct QuoteVerifier { - pccs_url: String, - timeout: Duration, + pccs_url: Option, } pub mod deps { @@ -36,7 +29,6 @@ pub mod deps { fn query_field_get_raw<'r>(req: &'r Request<'_>, field_name: &str) -> Option<&'r str> { for field in req.query_fields() { - let raw = (field.name.source().as_str(), field.value); let key = field.name.key_lossy().as_str(); if key == field_name { return Some(field.value); @@ -138,41 +130,16 @@ impl<'r> FromRequest<'r> for &'r QuoteVerifier { type Error = (); async fn from_request(request: &'r Request<'_>) -> Outcome { - let state: &rocket::State = from_request!(request); + let Some(state) = rocket::State::::get(request.rocket()) else { + return Outcome::Error((Status::InternalServerError, ())); + }; Outcome::Success(state) } } impl QuoteVerifier { - pub fn new(pccs_url: String) -> Self { - Self { - pccs_url, - timeout: Duration::from_secs(60), - } - } - - pub async fn verify_quote(&self, attestation: &Attestation) -> Result { - let quote = &attestation.quote; - let collateral = qvl::collateral::get_collateral(&self.pccs_url, quote, self.timeout) - .await - .context("failed to get collateral")?; - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .context("failed to get current time")? - .as_secs(); - let report = qvl::verify::verify(quote, &collateral, now) - .ok() - .context("quote verification failed")?; - if let Some(report) = report.report.as_td10() { - // Replay the event logs - let rtmrs = attestation - .replay_event_logs() - .context("failed to replay event logs")?; - if rtmrs != [report.rt_mr0, report.rt_mr1, report.rt_mr2, report.rt_mr3] { - anyhow::bail!("rtmr mismatch"); - } - } - Ok(report) + pub fn new(pccs_url: Option) -> Self { + Self { pccs_url } } } @@ -227,7 +194,7 @@ impl<'r> FromRequest<'r> for RpcRequest<'r> { } } -impl<'s, 'r, S> PrpcHandler<'s, 'r, S> { +impl PrpcHandler<'_, '_, S> { pub async fn handle>(self) -> Custom> { let json = self.request.json; let result = handle_prpc_impl::(self).await; @@ -272,26 +239,32 @@ pub async fn handle_prpc_impl>( method, data, } = args; - let mut attestation = request + let attestation = request .certificate - .map(extract_attestation) + .as_ref() + .map(|cert| Attestation::from_der(cert.as_bytes())) .transpose()? .flatten(); - let todo = "verified attestation needs to be a distinct type"; - if let (Some(quote_verifier), Some(attestation)) = (request.quote_verifier, &mut attestation) { - let verified_report = quote_verifier - .verify_quote(attestation) - .await - .context("invalid quote")?; - attestation.verified_report = Some(verified_report); - } else if attestation.is_some() { - info!("the ra quote is not verified"); - } + let attestation = match (request.quote_verifier, attestation) { + (Some(quote_verifier), Some(attestation)) => { + let pubkey = request + .certificate + .expect("certificate is missing") + .public_key() + .raw + .to_vec(); + let verified = attestation + .verify_with_ra_pubkey(&pubkey, quote_verifier.pccs_url.as_deref()) + .await + .context("invalid quote")?; + Some(verified) + } + _ => None, + }; let is_get = data.is_none(); let payload = match data { Some(data) => { let limit = limit_for_method(method, request.limits); - let todo = "confirm this would not truncate the data"; read_data(data, limit) .await .context("failed to read data")? @@ -311,25 +284,3 @@ pub async fn handle_prpc_impl>( let (status_code, output) = call.call(method.to_string(), payload, json, is_get).await; Ok(Custom(Status::new(status_code), output)) } - -pub fn extract_attestation(cert: Certificate<'_>) -> Result> { - let attestation = Attestation::from_ext_getter(|oid| { - let oid = Oid::from(oid).ok().context("Invalid OID")?; - let Some(ext) = cert - .get_extension_unique(&oid) - .context("Extension not found")? - else { - return Ok(None); - }; - Ok(Some(ext.value.to_vec())) - })?; - let todo = "verify the attestation"; - let Some(attestation) = attestation else { - return Ok(None); - }; - let pubkey = cert.public_key().raw; - attestation - .ensure_quote_for_ra_tls_pubkey(pubkey) - .context("ratls quote verification failed")?; - Ok(Some(attestation)) -} diff --git a/ra-tls/Cargo.toml b/ra-tls/Cargo.toml index 0a7abcd5..c264c6a0 100644 --- a/ra-tls/Cargo.toml +++ b/ra-tls/Cargo.toml @@ -24,5 +24,8 @@ x509-parser.workspace = true yasna.workspace = true tracing.workspace = true sha3.workspace = true +tdx-attest.workspace = true +scale.workspace = true cc-eventlog.workspace = true +serde-human-bytes.workspace = true diff --git a/ra-tls/src/attestation.rs b/ra-tls/src/attestation.rs index 50f3b48c..027cf1c8 100644 --- a/ra-tls/src/attestation.rs +++ b/ra-tls/src/attestation.rs @@ -3,10 +3,13 @@ use anyhow::{anyhow, Context, Result}; use dcap_qvl::quote::Quote; use qvl::{quote::Report, verify::VerifiedReport}; +use serde::Serialize; use sha2::{Digest as _, Sha384}; +use x509_parser::parse_x509_certificate; use crate::{oids, traits::CertExt}; use cc_eventlog::TdxEventLog as EventLog; +use serde_human_bytes as hex_bytes; /// The content type of a quote. A CVM should only generate quotes for these types. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -80,9 +83,12 @@ impl QuoteContentType<'_> { } } +/// Represents a verified attestation +pub type VerifiedAttestation = Attestation; + /// Attestation data #[derive(Debug, Clone)] -pub struct Attestation { +pub struct Attestation { /// Quote pub quote: Vec, /// Raw event log @@ -90,50 +96,10 @@ pub struct Attestation { /// Event log pub event_log: Vec, /// Verified report - pub verified_report: Option, + pub report: R, } -impl Attestation { - /// Create a new attestation - pub fn new(quote: Vec, raw_event_log: Vec) -> Result { - let event_log: Vec = if !raw_event_log.is_empty() { - serde_json::from_slice(&raw_event_log).context("invalid event log")? - } else { - vec![] - }; - Ok(Self { - quote, - raw_event_log, - event_log, - verified_report: None, - }) - } - - /// Extract attestation data from a certificate - pub fn from_cert(cert: &impl CertExt) -> Result> { - Self::from_ext_getter(|oid| cert.get_extension(oid)) - } - - /// From an extension getter - pub fn from_ext_getter( - get_ext: impl Fn(&[u64]) -> Result>>, - ) -> Result> { - macro_rules! read_ext_bytes { - ($oid:expr) => { - get_ext($oid)? - .map(|v| yasna::parse_der(&v, |reader| reader.read_bytes())) - .transpose()? - }; - } - - let quote = match read_ext_bytes!(oids::PHALA_RATLS_QUOTE) { - Some(v) => v, - None => return Ok(None), - }; - let raw_event_log = read_ext_bytes!(oids::PHALA_RATLS_EVENT_LOG).unwrap_or_default(); - Self::new(quote, raw_event_log).map(Some) - } - +impl Attestation { /// Decode the quote pub fn decode_quote(&self) -> Result { Quote::parse(&self.quote) @@ -149,13 +115,12 @@ impl Attestation { } /// Replay event logs - pub fn replay_event_logs(&self) -> Result<[[u8; 48]; 4]> { - replay_event_logs(&self.event_log) + pub fn replay_event_logs(&self, to_event: Option<&str>) -> Result<[[u8; 48]; 4]> { + replay_event_logs(&self.event_log, to_event) } - /// Return true if the quote is verified - pub fn is_verified(&self) -> bool { - self.verified_report.is_some() + fn find_event_payload(&self, event: &str) -> Result> { + self.find_event(3, event).map(|event| event.event_payload) } /// Decode the app-id from the event log @@ -179,6 +144,50 @@ impl Attestation { Ok(hex::encode(&event.event_payload)) } + /// Decode the app info from the event log + pub fn decode_app_info(&self, boottime_mr: bool) -> Result { + let rtmrs = self + .replay_event_logs(boottime_mr.then_some("boot-mr-done")) + .context("Failed to replay event logs")?; + let quote = self.decode_quote()?; + let device_id = sha256(&["e.header.user_data]).to_vec(); + let td_report = quote.report.as_td10().context("TDX report not found")?; + let key_provider_info = if boottime_mr { + vec![] + } else { + self.find_event_payload("key-provider").unwrap_or_default() + }; + let mr_key_provider = if key_provider_info.is_empty() { + [0u8; 32] + } else { + sha256(&[&key_provider_info]) + }; + let mr_aggregated = sha256(&[ + &td_report.mr_td, + &rtmrs[0], + &rtmrs[1], + &rtmrs[2], + &mr_key_provider, + ]); + let mr_image = sha256(&[&td_report.mr_td, &rtmrs[1], &rtmrs[2]]); + Ok(AppInfo { + app_id: self.find_event_payload("app-id")?, + compose_hash: self.find_event_payload("compose-hash")?, + instance_id: self.find_event_payload("instance-id")?, + device_id, + rootfs_hash: self.find_event_payload("rootfs-hash")?, + mrtd: td_report.mr_td, + rtmr0: rtmrs[0], + rtmr1: rtmrs[1], + rtmr2: rtmrs[2], + rtmr3: rtmrs[3], + mr_aggregated, + mr_image, + mr_key_provider, + key_provider_info, + }) + } + /// Decode the rootfs hash from the event log pub fn decode_rootfs_hash(&self) -> Result { self.find_event(3, "rootfs-hash") @@ -193,39 +202,198 @@ impl Attestation { Report::TD15(report) => Ok(report.base.report_data), } } +} - /// Ensure the quote is for the RA-TLS public key - pub fn ensure_quote_for_ra_tls_pubkey(&self, pubkey: &[u8]) -> Result<()> { - let report_data = self.decode_report_data()?; - let expected_report_data = QuoteContentType::RaTlsCert.to_report_data(pubkey); - if report_data != expected_report_data { - return Err(anyhow!("report data mismatch")); +impl Attestation { + /// Create an attestation for local machine + pub fn local() -> Result { + let (_, quote) = tdx_attest::get_quote(&[0u8; 64], None)?; + let event_log = tdx_attest::eventlog::read_event_logs()?; + let raw_event_log = serde_json::to_vec(&event_log)?; + Ok(Self { + quote, + raw_event_log, + event_log, + report: (), + }) + } + + /// Create a new attestation + pub fn new(quote: Vec, raw_event_log: Vec) -> Result { + let event_log: Vec = if !raw_event_log.is_empty() { + serde_json::from_slice(&raw_event_log).context("invalid event log")? + } else { + vec![] + }; + Ok(Self { + quote, + raw_event_log, + event_log, + report: (), + }) + } + + /// Extract attestation data from a certificate + pub fn from_cert(cert: &impl CertExt) -> Result> { + Self::from_ext_getter(|oid| cert.get_extension_bytes(oid)) + } + + /// From an extension getter + pub fn from_ext_getter( + get_ext: impl Fn(&[u64]) -> Result>>, + ) -> Result> { + let quote = match get_ext(oids::PHALA_RATLS_QUOTE)? { + Some(v) => v, + None => return Ok(None), + }; + let raw_event_log = get_ext(oids::PHALA_RATLS_EVENT_LOG)?.unwrap_or_default(); + Self::new(quote, raw_event_log).map(Some) + } + + /// Extract attestation from x509 certificate + pub fn from_der(cert: &[u8]) -> Result> { + let (_, cert) = parse_x509_certificate(cert).context("Failed to parse certificate")?; + Self::from_cert(&cert) + } + + /// Extract attestation from x509 certificate in PEM format + pub fn from_pem(cert: &[u8]) -> Result> { + let (_, pem) = + x509_parser::pem::parse_x509_pem(cert).context("Failed to parse certificate")?; + let cert = pem.parse_x509().context("Failed to parse certificate")?; + Self::from_cert(&cert) + } + + /// Verify the quote + pub async fn verify_with_ra_pubkey( + self, + ra_pubkey_der: &[u8], + pccs_url: Option<&str>, + ) -> Result { + self.verify( + &QuoteContentType::RaTlsCert.to_report_data(ra_pubkey_der), + pccs_url, + ) + .await + } + + /// Verify the quote + pub async fn verify( + self, + report_data: &[u8; 64], + pccs_url: Option<&str>, + ) -> Result { + let quote = &self.quote; + if &self.decode_report_data()? != report_data { + anyhow::bail!("report data mismatch"); + } + let report = qvl::collateral::get_collateral_and_verify(quote, pccs_url) + .await + .context("Failed to get collateral")?; + if let Some(report) = report.report.as_td10() { + // Replay the event logs + let rtmrs = self + .replay_event_logs(None) + .context("Failed to replay event logs")?; + if rtmrs != [report.rt_mr0, report.rt_mr1, report.rt_mr2, report.rt_mr3] { + anyhow::bail!("RTMR mismatch"); + } } - Ok(()) + Ok(VerifiedAttestation { + quote: self.quote, + raw_event_log: self.raw_event_log, + event_log: self.event_log, + report, + }) } } +impl Attestation {} + +/// Information about the app extracted from event log +#[derive(Debug, Clone, Serialize)] +pub struct AppInfo { + /// App ID + #[serde(with = "hex_bytes")] + pub app_id: Vec, + /// SHA256 of the app compose file + #[serde(with = "hex_bytes")] + pub compose_hash: Vec, + /// ID of the CVM instance + #[serde(with = "hex_bytes")] + pub instance_id: Vec, + /// ID of the device + #[serde(with = "hex_bytes")] + pub device_id: Vec, + /// Rootfs hash + #[serde(with = "hex_bytes")] + pub rootfs_hash: Vec, + /// TCB info + #[serde(with = "hex_bytes")] + pub mrtd: [u8; 48], + /// Runtime MR0 + #[serde(with = "hex_bytes")] + pub rtmr0: [u8; 48], + /// Runtime MR1 + #[serde(with = "hex_bytes")] + pub rtmr1: [u8; 48], + /// Runtime MR2 + #[serde(with = "hex_bytes")] + pub rtmr2: [u8; 48], + /// Runtime MR3 + #[serde(with = "hex_bytes")] + pub rtmr3: [u8; 48], + /// Measurement of the entire vm execution environment + #[serde(with = "hex_bytes")] + pub mr_aggregated: [u8; 32], + /// Measurement of the app image + #[serde(with = "hex_bytes")] + pub mr_image: [u8; 32], + /// Measurement of the key provider + #[serde(with = "hex_bytes")] + pub mr_key_provider: [u8; 32], + /// Key provider info + #[serde(with = "hex_bytes")] + pub key_provider_info: Vec, +} + /// Replay event logs -pub fn replay_event_logs(eventlog: &[EventLog]) -> Result<[[u8; 48]; 4]> { +pub fn replay_event_logs(eventlog: &[EventLog], to_event: Option<&str>) -> Result<[[u8; 48]; 4]> { let mut rtmrs = [[0u8; 48]; 4]; for idx in 0..4 { let mut mr = [0u8; 48]; for event in eventlog.iter() { + event + .validate() + .context("Failed to validate event digest")?; if event.imr == idx { let mut hasher = Sha384::new(); hasher.update(mr); hasher.update(event.digest); mr = hasher.finalize().into(); } + if let Some(to_event) = to_event { + if event.event == to_event { + break; + } + } } - rtmrs[idx as usize] = mr; } Ok(rtmrs) } +fn sha256(data: &[&[u8]]) -> [u8; 32] { + use sha2::{Digest as _, Sha256}; + let mut hasher = Sha256::new(); + for d in data { + hasher.update(d); + } + hasher.finalize().into() +} + #[cfg(test)] mod tests { use super::*; diff --git a/ra-tls/src/cert.rs b/ra-tls/src/cert.rs index d0537619..66ae1574 100644 --- a/ra-tls/src/cert.rs +++ b/ra-tls/src/cert.rs @@ -3,26 +3,37 @@ use std::time::SystemTime; use std::{path::Path, time::Duration}; -use anyhow::{anyhow, Context, Result}; +use anyhow::{anyhow, bail, Context, Result}; use fs_err as fs; use rcgen::{ BasicConstraints, Certificate, CertificateParams, CustomExtension, DistinguishedName, DnType, - IsCa, KeyPair, SanType, + ExtendedKeyUsagePurpose, IsCa, KeyPair, KeyUsagePurpose, PublicKeyData, SanType, }; +use ring::rand::SystemRandom; +use tdx_attest::eventlog::read_event_logs; +use tdx_attest::get_quote; use x509_parser::der_parser::Oid; +use x509_parser::prelude::{FromDer as _, X509Certificate}; +use x509_parser::public_key::PublicKey; +use x509_parser::x509::SubjectPublicKeyInfo; +use crate::attestation::QuoteContentType; +use crate::oids::{PHALA_RATLS_APP_ID, PHALA_RATLS_CERT_USAGE}; use crate::{ - attestation::Attestation, oids::{PHALA_RATLS_EVENT_LOG, PHALA_RATLS_QUOTE}, traits::CertExt, }; +use ring::signature::{ + EcdsaKeyPair, UnparsedPublicKey, ECDSA_P256_SHA256_ASN1, ECDSA_P256_SHA256_ASN1_SIGNING, +}; +use scale::{Decode, Encode}; /// A CA certificate and private key. pub struct CaCert { /// The original PEM certificate. pub pem_cert: String, /// CA certificate - pub cert: Certificate, + cert: Certificate, /// CA private key pub key: KeyPair, } @@ -42,6 +53,15 @@ impl CaCert { }) } + /// Instantiate a new CA certificate with a given private key and pem cert. + pub fn from_parts(key: KeyPair, cert: Certificate) -> Self { + Self { + pem_cert: cert.pem(), + cert, + key, + } + } + /// Load a CA certificate and private key from files. pub fn load(cert_path: impl AsRef, key_path: impl AsRef) -> Result { let pem_key = fs::read_to_string(key_path).context("Failed to read key file")?; @@ -50,51 +70,134 @@ impl CaCert { } /// Sign a certificate request. - pub fn sign(&self, req: CertRequest) -> Result { - let key = req.key; - let params = req.into_cert_params()?; - let cert = params.signed_by(key, &self.cert, &self.key)?; - Ok(cert) + pub fn sign(&self, req: CertRequest) -> Result { + req.signed_by(&self.cert, &self.key) } - /// Decode the attestation extension if present. - pub fn decode_attestation(&self) -> Result> { - use x509_parser::pem::Pem; - let Some(pem) = Pem::iter_from_buffer(self.pem_cert.as_bytes()) - .next() - .transpose() - .context("Invalid pem")? - else { - return Ok(None); - }; - let cert = pem.parse_x509().context("Invalid x509 certificate")?; - let externsions = cert.tbs_certificate.extensions(); - let attestation = Attestation::from_ext_getter(|oid| { - let oid = Oid::from(oid).or(Err(anyhow!("Invalid oid")))?; - let Some(ext) = externsions.iter().find(|ext| ext.oid == oid) else { - return Ok(None); - }; - Ok(Some(ext.value.to_vec())) - })?; - Ok(attestation) + /// Sign a remote certificate signing request. + pub fn sign_csr( + &self, + csr: &CertSigningRequest, + app_id: Option<&[u8]>, + usage: &str, + ) -> Result { + let pki = rcgen::SubjectPublicKeyInfo::from_der(&csr.pubkey) + .context("Failed to parse signature")?; + let cfg = &csr.config; + let req = CertRequest::builder() + .key(&pki) + .subject(&cfg.subject) + .maybe_org_name(cfg.org_name.as_deref()) + .alt_names(&cfg.subject_alt_names) + .usage_server_auth(cfg.usage_server_auth) + .usage_client_auth(cfg.usage_client_auth) + .maybe_quote(cfg.ext_quote.then_some(&csr.quote)) + .maybe_event_log(cfg.ext_quote.then_some(&csr.event_log)) + .maybe_app_id(app_id) + .special_usage(usage) + .build(); + self.sign(req).context("Failed to sign certificate") + } +} + +/// The configuration of the certificate. +#[derive(Encode, Decode, Clone, PartialEq)] +pub struct CertConfig { + /// The organization name of the certificate. + pub org_name: Option, + /// The subject of the certificate. + pub subject: String, + /// The subject alternative names of the certificate. + pub subject_alt_names: Vec, + /// The purpose of the certificate. + pub usage_server_auth: bool, + /// The purpose of the certificate. + pub usage_client_auth: bool, + /// Whether the certificate is quoted. + pub ext_quote: bool, +} + +/// A certificate signing request. +#[derive(Encode, Decode, Clone, PartialEq)] +pub struct CertSigningRequest { + /// The confirm word, need to be "please sign cert:" + pub confirm: String, + /// The public key of the certificate. + pub pubkey: Vec, + /// The certificate configuration. + pub config: CertConfig, + /// The quote of the certificate. + pub quote: Vec, + /// The event log of the certificate. + pub event_log: Vec, +} + +impl CertSigningRequest { + /// Sign the certificate signing request. + pub fn signed_by(&self, key: &KeyPair) -> Result> { + let encoded = self.encode(); + let rng = SystemRandom::new(); + // Extract the DER-encoded private key and create an ECDSA key pair + let key_pair = + EcdsaKeyPair::from_pkcs8(&ECDSA_P256_SHA256_ASN1_SIGNING, &key.serialize_der(), &rng) + .context("Failed to create key pair from DER")?; + + // Sign the encoded CSR + let signature = key_pair + .sign(&rng, &encoded) + .expect("Failed to sign CSR") + .as_ref() + .to_vec(); + Ok(signature) + } + + /// Verify the signature of the certificate signing request. + pub fn verify(&self, signature: &[u8]) -> Result<()> { + let encoded = self.encode(); + let (_rem, pki) = + SubjectPublicKeyInfo::from_der(&self.pubkey).context("Failed to parse pubkey")?; + let parsed_pki = pki.parsed().context("Failed to parse pki")?; + if !matches!(parsed_pki, PublicKey::EC(_)) { + bail!("Unsupported algorithm"); + } + let key = UnparsedPublicKey::new(&ECDSA_P256_SHA256_ASN1, &pki.subject_public_key.data); + // verify signature + key.verify(&encoded, signature) + .ok() + .context("Invalid signature")?; + if self.confirm != "please sign cert:" { + bail!("Invalid confirm word"); + } + Ok(()) + } + + /// Encode the certificate signing request to a vector. + pub fn to_vec(&self) -> Vec { + self.encode() } } /// Information required to create a certificate. #[derive(bon::Builder)] -pub struct CertRequest<'a> { - key: &'a KeyPair, +pub struct CertRequest<'a, Key> { + key: &'a Key, org_name: Option<&'a str>, subject: &'a str, alt_names: Option<&'a [String]>, ca_level: Option, + app_id: Option<&'a [u8]>, + special_usage: Option<&'a str>, quote: Option<&'a [u8]>, event_log: Option<&'a [u8]>, not_before: Option, not_after: Option, + #[builder(default = false)] + usage_server_auth: bool, + #[builder(default = false)] + usage_client_auth: bool, } -impl CertRequest<'_> { +impl CertRequest<'_, Key> { fn into_cert_params(self) -> Result { let mut params = CertificateParams::new(vec![])?; let mut dn = DistinguishedName::new(); @@ -103,6 +206,17 @@ impl CertRequest<'_> { } dn.push(DnType::CommonName, self.subject); params.distinguished_name = dn; + params.key_usages = vec![KeyUsagePurpose::DigitalSignature]; + if self.usage_server_auth { + params + .extended_key_usages + .push(ExtendedKeyUsagePurpose::ServerAuth); + } + if self.usage_client_auth { + params + .extended_key_usages + .push(ExtendedKeyUsagePurpose::ClientAuth); + } if let Some(alt_names) = self.alt_names { for alt_name in alt_names { params @@ -124,10 +238,22 @@ impl CertRequest<'_> { let ext = CustomExtension::from_oid_content(PHALA_RATLS_EVENT_LOG, content); params.custom_extensions.push(ext); } + if let Some(app_id) = self.app_id { + let content = yasna::construct_der(|writer| { + writer.write_bytes(app_id); + }); + let ext = CustomExtension::from_oid_content(PHALA_RATLS_APP_ID, content); + params.custom_extensions.push(ext); + } + if let Some(special_usage) = self.special_usage { + let content = yasna::construct_der(|writer| { + writer.write_bytes(special_usage.as_bytes()); + }); + let ext = CustomExtension::from_oid_content(PHALA_RATLS_CERT_USAGE, content); + params.custom_extensions.push(ext); + } if let Some(ca_level) = self.ca_level { - if ca_level > 0 { - params.is_ca = IsCa::Ca(BasicConstraints::Constrained(ca_level)); - } + params.is_ca = IsCa::Ca(BasicConstraints::Constrained(ca_level)); } if let Some(not_before) = self.not_before { params.not_before = not_before.into(); @@ -137,19 +263,23 @@ impl CertRequest<'_> { .unwrap_or_else(|| { let now = SystemTime::now(); let day = Duration::from_secs(86400); - now + day * 365 + now + day * 365 * 10 }) .into(); Ok(params) } +} +impl CertRequest<'_, KeyPair> { /// Create a self-signed certificate. pub fn self_signed(self) -> Result { let key = self.key; let cert = self.into_cert_params()?.self_signed(key)?; Ok(cert) } +} +impl CertRequest<'_, Key> { /// Create a certificate signed by a given issuer. pub fn signed_by(self, issuer: &Certificate, issuer_key: &KeyPair) -> Result { let key = self.key; @@ -161,7 +291,7 @@ impl CertRequest<'_> { } impl CertExt for Certificate { - fn get_extension(&self, oid: &[u64]) -> Result>> { + fn get_extension_der(&self, oid: &[u64]) -> Result>> { let found = self .params() .custom_extensions @@ -171,3 +301,105 @@ impl CertExt for Certificate { Ok(found) } } + +impl CertExt for X509Certificate<'_> { + fn get_extension_der(&self, oid: &[u64]) -> Result>> { + let oid = Oid::from(oid).or(Err(anyhow!("Invalid oid")))?; + let found = self + .get_extension_unique(&oid) + .context("failt to decode der")? + .map(|ext| ext.value.to_vec()); + Ok(found) + } +} + +/// A key and certificate pair. +pub struct CertPair { + /// The certificate in PEM format. + pub cert_pem: String, + /// The key in PEM format. + pub key_pem: String, +} + +/// Generate a certificate with RA-TLS quote and event log. +pub fn generate_ra_cert(ca_cert_pem: String, ca_key_pem: String) -> Result { + use rcgen::{KeyPair, PKCS_ECDSA_P256_SHA256}; + + let ca = CaCert::new(ca_cert_pem, ca_key_pem)?; + + let key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; + let pubkey = key.public_key_der(); + let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey); + let (_, quote) = get_quote(&report_data, None).context("Failed to get quote")?; + let event_logs = read_event_logs().context("Failed to read event logs")?; + let event_log = serde_json::to_vec(&event_logs).context("Failed to serialize event logs")?; + let req = CertRequest::builder() + .subject("RA-TLS TEMP Cert") + .quote("e) + .event_log(&event_log) + .key(&key) + .build(); + let cert = ca.sign(req).context("Failed to sign certificate")?; + Ok(CertPair { + cert_pem: cert.pem(), + key_pem: key.serialize_pem(), + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use rcgen::PKCS_ECDSA_P256_SHA256; + + #[test] + fn test_csr_signing_and_verification() { + let key_pair = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256).unwrap(); + let pubkey = key_pair.public_key_der(); + + let csr = CertSigningRequest { + confirm: "please sign cert:".to_string(), + pubkey: pubkey.clone(), + config: CertConfig { + org_name: Some("Test Org".to_string()), + subject: "test.example.com".to_string(), + subject_alt_names: vec!["alt.example.com".to_string()], + usage_server_auth: true, + usage_client_auth: false, + ext_quote: false, + }, + quote: Vec::new(), + event_log: Vec::new(), + }; + + let signature = csr.signed_by(&key_pair).unwrap(); + assert!(csr.verify(&signature).is_ok()); + + let mut invalid_signature = signature.clone(); + invalid_signature[0] ^= 0xff; + assert!(csr.verify(&invalid_signature).is_err()); + } + + #[test] + fn test_invalid_confirm_word() { + let key_pair = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256).unwrap(); + let pubkey = key_pair.public_key_der(); + + let csr = CertSigningRequest { + confirm: "wrong confirm word".to_string(), + pubkey: pubkey.clone(), + config: CertConfig { + org_name: Some("Test Org".to_string()), + subject: "test.example.com".to_string(), + subject_alt_names: vec![], + usage_server_auth: true, + usage_client_auth: false, + ext_quote: false, + }, + quote: Vec::new(), + event_log: Vec::new(), + }; + + let signature = csr.signed_by(&key_pair).unwrap(); + assert!(csr.verify(&signature).is_err()); + } +} diff --git a/ra-tls/src/kdf.rs b/ra-tls/src/kdf.rs index 311c5717..7e333b86 100644 --- a/ra-tls/src/kdf.rs +++ b/ra-tls/src/kdf.rs @@ -35,8 +35,16 @@ pub fn derive_ecdsa_key_pair(from: &KeyPair, context_data: &[&[u8]]) -> Result Result { let derived_sk_bytes = - derive_ecdsa_key(&sk_bytes, context_data, 32).or(Err(anyhow!("failed to derive key")))?; + derive_ecdsa_key(sk_bytes, context_data, 32).or(Err(anyhow!("failed to derive key")))?; let derived_sk = p256::SecretKey::from_slice(&derived_sk_bytes) .context("failed to decode derived secret key")?; let derived_sk_der = derived_sk diff --git a/ra-tls/src/oids.rs b/ra-tls/src/oids.rs index f6ea023d..e1558a81 100644 --- a/ra-tls/src/oids.rs +++ b/ra-tls/src/oids.rs @@ -4,3 +4,7 @@ pub const PHALA_RATLS_QUOTE: &[u64] = &[1, 3, 6, 1, 4, 1, 62397, 1, 1]; /// OID for the TDX event log extension. pub const PHALA_RATLS_EVENT_LOG: &[u64] = &[1, 3, 6, 1, 4, 1, 62397, 1, 2]; +/// OID for the TDX app ID extension. +pub const PHALA_RATLS_APP_ID: &[u64] = &[1, 3, 6, 1, 4, 1, 62397, 1, 3]; +/// OID for Special Certificate Usage. +pub const PHALA_RATLS_CERT_USAGE: &[u64] = &[1, 3, 6, 1, 4, 1, 62397, 1, 4]; diff --git a/ra-tls/src/traits.rs b/ra-tls/src/traits.rs index 0c8b0a11..0164afd6 100644 --- a/ra-tls/src/traits.rs +++ b/ra-tls/src/traits.rs @@ -1,9 +1,31 @@ //! Traits for the crate -use anyhow::Result; +use anyhow::{Context, Result}; + +use crate::oids::PHALA_RATLS_CERT_USAGE; /// Types that can get custom cert extensions from. pub trait CertExt { /// Get a cert extension from the type. - fn get_extension(&self, oid: &[u64]) -> Result>>; + fn get_extension_der(&self, oid: &[u64]) -> Result>>; + /// Get externtion bytes + fn get_extension_bytes(&self, oid: &[u64]) -> Result>> { + let Some(der) = self.get_extension_der(oid)? else { + return Ok(None); + }; + let ext = yasna::parse_der(&der, |reader| reader.read_bytes())?; + Ok(Some(ext)) + } + + /// Get Certificate Special Usage from the type. + fn get_special_usage(&self) -> Result> { + let Some(found) = self + .get_extension_bytes(PHALA_RATLS_CERT_USAGE) + .context("Failed to get extension")? + else { + return Ok(None); + }; + let found = String::from_utf8(found).context("Failed to decode special usage as utf8")?; + Ok(Some(found)) + } } diff --git a/supervisor/src/supervisor.rs b/supervisor/src/supervisor.rs index 1507cbe7..f4ac6387 100644 --- a/supervisor/src/supervisor.rs +++ b/supervisor/src/supervisor.rs @@ -57,7 +57,7 @@ impl Supervisor { } if self .info(&id) - .map_or(false, |info| info.state.status.is_running()) + .is_some_and(|info| info.state.status.is_running()) { bail!("Process is already running"); } diff --git a/tappd/Cargo.toml b/tappd/Cargo.toml index 9220bdab..e5bacbda 100644 --- a/tappd/Cargo.toml +++ b/tappd/Cargo.toml @@ -23,8 +23,7 @@ chrono.workspace = true base64.workspace = true rinja.workspace = true git-version.workspace = true - -ra-rpc = { workspace = true, features = ["rocket"] } +ra-rpc = { workspace = true, features = ["client", "rocket"] } tappd-rpc.workspace = true ra-tls.workspace = true tdx-attest.workspace = true @@ -38,3 +37,9 @@ reqwest.workspace = true cmd_lib.workspace = true figment = { workspace = true, features = ["json", "toml"] } load_config.workspace = true +k256 = { workspace = true, features = ["ecdsa"] } +dstack-types.workspace = true +sha3.workspace = true +strip-ansi-escapes.workspace = true +cert-client.workspace = true +ring.workspace = true diff --git a/tappd/rpc/proto/tappd_rpc.proto b/tappd/rpc/proto/tappd_rpc.proto index 1bfc4af7..490e302d 100644 --- a/tappd/rpc/proto/tappd_rpc.proto +++ b/tappd/rpc/proto/tappd_rpc.proto @@ -9,6 +9,9 @@ service Tappd { // Returns the derived key along with its certificate chain. rpc DeriveKey(DeriveKeyArgs) returns (DeriveKeyResponse) {} + // Derives a new ECDSA key with k256 EC curve. + rpc DeriveK256Key(DeriveK256KeyArgs) returns (DeriveK256KeyResponse) {} + // Generates a TDX quote rpc TdxQuote(TdxQuoteArgs) returns (TdxQuoteResponse) {} @@ -25,12 +28,21 @@ service Tappd { // The request to derive a key message DeriveKeyArgs { - // Path to the key to derive + // Path used to derive the private key string path = 1; + // Bellow fields are used to generate the certificate // Subject of the certificate to request string subject = 2; // DNS alternative names for the certificate repeated string alt_names = 3; + // Includes quote in the certificate + bool usage_ra_tls = 4; + // Key usage server auth + bool usage_server_auth = 5; + // Key usage client auth + bool usage_client_auth = 6; + // Derive from random seed + bool random_seed = 7; } // The response to a DeriveKey request @@ -41,6 +53,22 @@ message DeriveKeyResponse { repeated string certificate_chain = 2; } +// The request to derive a new ECDSA key with k256 EC curve +message DeriveK256KeyArgs { + // Path to the key to derive + string path = 1; + // Purpose of the key + string purpose = 2; +} + +// The response to a DeriveK256Key request +message DeriveK256KeyResponse { + // Derived k256 key + bytes k256_key = 1; + // Derived k256 signature chain + repeated bytes k256_signature_chain = 2; +} + // The request to get a TDX quote // The report data is prefixed with `app-data:` before hashing unless the algorithm is `raw`. // Final report data is hash(`app-data:` + report_data) if the algorithm is not `raw`. @@ -88,9 +116,9 @@ message TdxQuoteResponse { // The request to derive a key message WorkerInfo { // App ID - string app_id = 1; + bytes app_id = 1; // App Instance ID - string instance_id = 2; + bytes instance_id = 2; // App certificate string app_cert = 3; // TCB info @@ -101,6 +129,18 @@ message WorkerInfo { bool public_logs = 6; // Whether the app sysinfo is public bool public_sysinfo = 7; + // Device ID + bytes device_id = 8; + // MR Aggregated + bytes mr_aggregated = 9; + // MR Image + bytes mr_image = 10; + // MR Key Provider + bytes mr_key_provider = 11; + // Key provider info + string key_provider_info = 12; + // Compose hash + bytes compose_hash = 13; } // The response to a WorkerInfo request diff --git a/tappd/src/config.rs b/tappd/src/config.rs index e6fcc70d..7f47fe03 100644 --- a/tappd/src/config.rs +++ b/tappd/src/config.rs @@ -16,9 +16,10 @@ pub struct BindAddr { #[derive(Debug, Clone, Deserialize)] pub struct Config { pub app_name: String, - pub cert_file: String, - pub key_file: String, + pub keys_file: String, pub public_logs: bool, pub public_sysinfo: bool, pub compose_file: String, + #[serde(default)] + pub pccs_url: Option, } diff --git a/tappd/src/guest_api_service.rs b/tappd/src/guest_api_service.rs index 4f790e7f..5f3e014d 100644 --- a/tappd/src/guest_api_service.rs +++ b/tappd/src/guest_api_service.rs @@ -44,6 +44,7 @@ impl GuestApiRpc for GuestApiHandler { version: env!("CARGO_PKG_VERSION").to_string(), app_id: info.app_id, instance_id: info.instance_id, + device_id: info.device_id, app_cert: info.app_cert, tcb_info: info.tcb_info, }) @@ -60,10 +61,6 @@ impl GuestApiRpc for GuestApiHandler { } async fn network_info(self) -> Result { - let networks = sysinfo::Networks::new_with_refreshed_list(); - for (interface_name, network) in &networks { - println!("[{interface_name}]: {network:?}"); - } Ok(NetworkInformation { dns_servers: get_dns_servers(), gateways: get_gateways(), diff --git a/tappd/src/http_routes.rs b/tappd/src/http_routes.rs index 09e9a7a1..34631585 100644 --- a/tappd/src/http_routes.rs +++ b/tappd/src/http_routes.rs @@ -1,3 +1,5 @@ +use std::time::Duration; + use crate::config::Config; use crate::guest_api_service::{list_containers, GuestApiHandler}; use crate::rpc_service::{AppState, ExternalRpcHandler}; @@ -28,6 +30,12 @@ async fn index(state: &State) -> Result, String> { app_name, app_id, instance_id, + device_id, + mr_aggregated: _, + mr_image: _, + mr_key_provider: _, + key_provider_info, + compose_hash: _, tcb_info, app_cert, public_logs, @@ -46,6 +54,8 @@ async fn index(state: &State) -> Result, String> { app_name, app_id, instance_id, + device_id, + key_provider_info, app_cert, tcb_info, containers, @@ -59,7 +69,7 @@ async fn index(state: &State) -> Result, String> { } } -#[get("/logs/?&&&&&&")] +#[get("/logs/?&&&&&&&")] #[allow(clippy::too_many_arguments)] fn get_logs( container_name: String, @@ -70,6 +80,7 @@ fn get_logs( bare: bool, timestamps: bool, tail: Option, + ansi: bool, ) -> TextStream![String] { // default to 1 hour ago let since = since.map_or(Ok(0), parse_duration); @@ -92,6 +103,7 @@ fn get_logs( bare, timestamps, tail, + ansi, }; let mut stream = match docker_logs::get_logs(&container_name, config) { Ok(stream) => stream, @@ -100,9 +112,18 @@ fn get_logs( return; } }; - while let Some(log) = stream.next().await { + loop { + let log = match tokio::time::timeout(Duration::from_secs(600), stream.next()).await { + Ok(Some(log)) => log, + Ok(None) => break, + Err(_) => { + break; + } + }; match log { - Ok(log) => yield log, + Ok(log) => { + yield log; + } Err(e) => yield serde_json::json!({ "error": e.to_string() }).to_string(), } } @@ -126,6 +147,7 @@ mod docker_logs { pub bare: bool, pub timestamps: bool, pub tail: String, + pub ansi: bool, } pub fn parse_duration(duration: &str) -> Result { @@ -175,6 +197,7 @@ mod docker_logs { bare, timestamps, tail, + ansi, } = config; let docker = Docker::connect_with_local_defaults()?; let options = LogsOptions { @@ -189,10 +212,10 @@ mod docker_logs { Ok(docker .logs(container_name, Some(options)) - .map(move |result| result.map(|m| log_to_json(m, text, bare)))) + .map(move |result| result.map(|m| log_to_json(m, text, bare, ansi)))) } - fn log_to_json(log: LogOutput, text: bool, bare: bool) -> String { + fn log_to_json(log: LogOutput, text: bool, bare: bool, ansi: bool) -> String { let channel = match &log { LogOutput::StdErr { .. } => "stderr", LogOutput::StdOut { .. } => "stdout", @@ -207,7 +230,11 @@ mod docker_logs { base64::engine::general_purpose::STANDARD.encode(message) }; if bare { - return message; + if ansi || !text { + return message; + } else { + return strip_ansi_escapes::strip_str(&message); + } } let log_line = serde_json::json!({ "channel": channel, diff --git a/tappd/src/main.rs b/tappd/src/main.rs index 2926ce49..a555c06c 100644 --- a/tappd/src/main.rs +++ b/tappd/src/main.rs @@ -155,19 +155,18 @@ async fn main() -> Result<()> { } let args = Args::parse(); let figment = config::load_config_figment(args.config.as_deref()); - let state = - AppState::new(figment.focus("core").extract()?).context("Failed to create app state")?; + let state = AppState::new(figment.focus("core").extract()?) + .await + .context("Failed to create app state")?; let internal_figment = figment.clone().select("internal"); let external_figment = figment.clone().select("external"); let bind_addr: BindAddr = external_figment .extract() .context("Failed to extract bind address")?; - let external_https_figment = figment.clone().select("external-https"); let guest_api_figment = figment.select("guest-api"); tokio::select!( res = run_internal(state.clone(), internal_figment) => res?, res = run_external(state.clone(), external_figment) => res?, - res = run_external(state.clone(), external_https_figment) => res?, res = run_guest_api(state.clone(), guest_api_figment) => res?, _ = async { if args.watchdog { diff --git a/tappd/src/models.rs b/tappd/src/models.rs index 6004ab9d..50dab3e0 100644 --- a/tappd/src/models.rs +++ b/tappd/src/models.rs @@ -24,14 +24,20 @@ mod filters { units.get(unit_index).unwrap_or(&"?") )) } + + pub fn hex(s: &[u8]) -> Result { + Ok(hex::encode(s)) + } } #[derive(Template)] #[template(path = "dashboard.html")] pub struct Dashboard { pub app_name: String, - pub app_id: String, - pub instance_id: String, + pub app_id: Vec, + pub instance_id: Vec, + pub device_id: Vec, + pub key_provider_info: String, pub app_cert: String, pub tcb_info: String, pub containers: Vec, diff --git a/tappd/src/rpc_service.rs b/tappd/src/rpc_service.rs index e8d0f121..0d01737b 100644 --- a/tappd/src/rpc_service.rs +++ b/tappd/src/rpc_service.rs @@ -1,20 +1,25 @@ use std::sync::Arc; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result}; +use cert_client::CertRequestClient; +use dstack_types::AppKeys; use fs_err as fs; -use ra_rpc::{CallContext, RpcCall}; +use k256::ecdsa::SigningKey; +use ra_rpc::{Attestation, CallContext, RpcCall}; use ra_tls::{ attestation::{QuoteContentType, DEFAULT_HASH_ALGORITHM}, - cert::{CaCert, CertRequest}, - kdf::derive_ecdsa_key_pair, - qvl::quote::Report, + cert::CertConfig, + kdf::{derive_ecdsa_key, derive_ecdsa_key_pair_from_bytes}, }; +use rcgen::KeyPair; +use ring::rand::{SecureRandom, SystemRandom}; use serde_json::json; +use sha3::{Digest, Keccak256}; use tappd_rpc::{ tappd_server::{TappdRpc, TappdServer}, worker_server::{WorkerRpc, WorkerServer}, - DeriveKeyArgs, DeriveKeyResponse, RawQuoteArgs, TdxQuoteArgs, TdxQuoteResponse, WorkerInfo, - WorkerVersion, + DeriveK256KeyArgs, DeriveK256KeyResponse, DeriveKeyArgs, DeriveKeyResponse, RawQuoteArgs, + TdxQuoteArgs, TdxQuoteResponse, WorkerInfo, WorkerVersion, }; use tdx_attest::eventlog::read_event_logs; @@ -27,15 +32,41 @@ pub struct AppState { struct AppStateInner { config: Config, - ca: CaCert, + keys: AppKeys, + cert_client: CertRequestClient, + demo_cert: String, } impl AppState { - pub fn new(config: Config) -> Result { - let ca = CaCert::load(&config.cert_file, &config.key_file) - .context("Failed to load CA certificate")?; + pub async fn new(config: Config) -> Result { + let keys: AppKeys = serde_json::from_str(&fs::read_to_string(&config.keys_file)?) + .context("Failed to parse app keys")?; + let cert_client = CertRequestClient::create(&keys, config.pccs_url.as_deref()) + .await + .context("Failed to create cert signer")?; + let key = KeyPair::generate().context("Failed to generate demo key")?; + let demo_cert = cert_client + .request_cert( + &key, + CertConfig { + org_name: None, + subject: "demo-cert".to_string(), + subject_alt_names: vec![], + usage_server_auth: false, + usage_client_auth: true, + ext_quote: true, + }, + ) + .await + .context("Failed to get app cert")? + .join("\n"); Ok(Self { - inner: Arc::new(AppStateInner { config, ca }), + inner: Arc::new(AppStateInner { + config, + keys, + cert_client, + demo_cert, + }), }) } @@ -48,25 +79,62 @@ pub struct InternalRpcHandler { state: AppState, } +impl InternalRpcHandler {} + impl TappdRpc for InternalRpcHandler { - async fn derive_key(self, request: DeriveKeyArgs) -> Result { - let derived_key = - derive_ecdsa_key_pair(&self.state.inner.ca.key, &[request.path.as_bytes()]) - .context("Failed to derive key")?; - let req = CertRequest::builder() - .subject(&request.subject) - .alt_names(&request.alt_names) - .key(&derived_key) - .build(); - let cert = self + async fn derive_key(self, request: DeriveKeyArgs) -> anyhow::Result { + let mut mbuf = [0u8; 32]; + let seed = if request.random_seed { + SystemRandom::new() + .fill(&mut mbuf) + .context("Failed to generate secure seed")?; + &mbuf[..] + } else { + &self.state.inner.keys.k256_key + }; + let derived_key = derive_ecdsa_key_pair_from_bytes(seed, &[request.path.as_bytes()]) + .context("Failed to derive key")?; + let config = CertConfig { + org_name: None, + subject: request.subject, + subject_alt_names: request.alt_names, + usage_server_auth: request.usage_server_auth, + usage_client_auth: request.usage_client_auth, + ext_quote: request.usage_ra_tls, + }; + let certificate_chain = self .state .inner - .ca - .sign(req) - .context("Failed to sign certificate")?; + .cert_client + .request_cert(&derived_key, config) + .await + .context("Failed to sign the CSR")?; Ok(DeriveKeyResponse { key: derived_key.serialize_pem(), - certificate_chain: vec![cert.pem(), self.state.inner.ca.cert.pem()], + certificate_chain, + }) + } + + async fn derive_k256_key(self, request: DeriveK256KeyArgs) -> Result { + let k256_app_key = &self.state.inner.keys.k256_key; + let derived_k256_key = derive_ecdsa_key(k256_app_key, &[request.path.as_bytes()], 32) + .context("Failed to derive k256 key")?; + let derived_k256_key = + SigningKey::from_slice(&derived_k256_key).context("Failed to parse k256 key")?; + let derived_k256_pubkey = derived_k256_key.verifying_key(); + let msg_to_sign = format!( + "{}:{}", + request.purpose, + hex::encode(derived_k256_pubkey.to_sec1_bytes()) + ); + let digest = Keccak256::new_with_prefix(msg_to_sign); + let (signature, recid) = derived_k256_key.sign_digest_recoverable(digest)?; + let mut signature = signature.to_vec(); + signature.push(recid.to_byte()); + + Ok(DeriveK256KeyResponse { + k256_key: derived_k256_key.to_bytes().to_vec(), + k256_signature_chain: vec![signature, self.state.inner.keys.k256_signature.clone()], }) } @@ -137,50 +205,50 @@ impl ExternalRpcHandler { impl WorkerRpc for ExternalRpcHandler { async fn info(self) -> Result { - let ca = &self.state.inner.ca; - let Some(attestation) = ca.decode_attestation().ok().flatten() else { + let response = InternalRpcHandler { + state: self.state.clone(), + } + .raw_quote(RawQuoteArgs { + report_data: [0; 64].to_vec(), + }) + .await; + let Ok(response) = response else { return Ok(WorkerInfo::default()); }; - let app_id = attestation - .decode_app_id() - .context("Failed to decode app id")?; - let instance_id = attestation - .decode_instance_id() - .context("Failed to decode instance_id")?; - let quote = attestation - .decode_quote() - .context("Failed to decode quote")?; - let rootfs_hash = attestation - .decode_rootfs_hash() - .context("Failed to decode rootfs hash")?; - let report = match "e.report { - Report::SgxEnclave(_) => bail!("SGX reports are not supported"), - Report::TD10(tdreport10) => tdreport10, - Report::TD15(tdreport15) => &tdreport15.base, + let Ok(attestation) = Attestation::new(response.quote, response.event_log.into()) else { + return Ok(WorkerInfo::default()); }; + let app_info = attestation + .decode_app_info(false) + .context("Failed to decode app info")?; let event_log = &attestation.event_log; - let mrtd = hex::encode(report.mr_td); - let rtmr0 = hex::encode(report.rt_mr0); - let rtmr1 = hex::encode(report.rt_mr1); - let rtmr2 = hex::encode(report.rt_mr2); - let rtmr3 = hex::encode(report.rt_mr3); let app_compose = fs::read_to_string(&self.state.config().compose_file).unwrap_or_default(); let tcb_info = serde_json::to_string_pretty(&json!({ - "rootfs_hash": rootfs_hash, - "mrtd": mrtd, - "rtmr0": rtmr0, - "rtmr1": rtmr1, - "rtmr2": rtmr2, - "rtmr3": rtmr3, + "mrtd": hex::encode(app_info.mrtd), + "rtmr0": hex::encode(app_info.rtmr0), + "rtmr1": hex::encode(app_info.rtmr1), + "rtmr2": hex::encode(app_info.rtmr2), + "rtmr3": hex::encode(app_info.rtmr3), + "mr_aggregated": hex::encode(app_info.mr_aggregated), + "mr_image": hex::encode(app_info.mr_image), + "mr_key_provider": hex::encode(app_info.mr_key_provider), + "compose_hash": hex::encode(&app_info.compose_hash), + "device_id": hex::encode(&app_info.device_id), "event_log": event_log, "app_compose": app_compose, })) .unwrap_or_default(); Ok(WorkerInfo { app_name: self.state.config().app_name.clone(), - app_id, - instance_id, - app_cert: ca.pem_cert.clone(), + app_id: app_info.app_id, + instance_id: app_info.instance_id, + device_id: app_info.device_id, + mr_aggregated: app_info.mr_aggregated.to_vec(), + mr_image: app_info.mr_image.to_vec(), + mr_key_provider: app_info.mr_key_provider.to_vec(), + key_provider_info: String::from_utf8(app_info.key_provider_info).unwrap_or_default(), + compose_hash: app_info.compose_hash.clone(), + app_cert: self.state.inner.demo_cert.clone(), tcb_info, public_logs: self.state.config().public_logs, public_sysinfo: self.state.config().public_sysinfo, diff --git a/tappd/tappd.toml b/tappd/tappd.toml index e85aec01..546edbd3 100644 --- a/tappd/tappd.toml +++ b/tappd/tappd.toml @@ -8,28 +8,19 @@ log_level = "debug" [default.core] app_name = "" -cert_file = "/etc/tappd/app-ca.cert" -key_file = "/etc/tappd/app-ca.key" +keys_file = "/tapp/appkeys.json" public_logs = true public_sysinfo = true compose_file = "/tapp/app-compose.json" [internal] address = "unix:/var/run/tappd.sock" -reuse = false +reuse = true [external] address = "0.0.0.0" port = 8090 -[external-https] -address = "0.0.0.0" -port = 8043 - -[external-https.tls] -key = "/etc/tappd/tls.key" -certs = "/etc/tappd/tls.cert" - [guest-api] address = "vsock:0xffffffff" port = 8000 diff --git a/tappd/templates/dashboard.html b/tappd/templates/dashboard.html index 68e8103c..492f6323 100644 --- a/tappd/templates/dashboard.html +++ b/tappd/templates/dashboard.html @@ -146,11 +146,19 @@

Node Information

App ID
-
{{app_id}}
+
{{app_id|hex}}
Instance ID
-
{{instance_id}}
+
{{instance_id|hex}}
+
+
+
Device ID
+
{{device_id|hex}}
+
+
+
Key Provider Info
+
{{key_provider_info}}
{% if public_sysinfo %}
diff --git a/tdxctl/Cargo.toml b/tdxctl/Cargo.toml index f3a29289..9fc3f670 100644 --- a/tdxctl/Cargo.toml +++ b/tdxctl/Cargo.toml @@ -34,6 +34,14 @@ tdx-attest.workspace = true host-api = { workspace = true, features = ["client"] } cmd_lib.workspace = true toml.workspace = true +key-provider-client.workspace = true +dcap-qvl.workspace = true +k256 = { workspace = true, features = ["ecdsa"] } +dstack-types.workspace = true +rand.workspace = true +sha3.workspace = true +cert-client.workspace = true +x509-parser.workspace = true serde_yaml2.workspace = true bollard.workspace = true diff --git a/tdxctl/src/fde_setup.rs b/tdxctl/src/fde_setup.rs index 8849f3fc..3b8a0d2b 100644 --- a/tdxctl/src/fde_setup.rs +++ b/tdxctl/src/fde_setup.rs @@ -6,27 +6,34 @@ use std::{ }; use anyhow::{anyhow, bail, Context, Result}; +use dstack_types::{KeyProvider, KeyProviderInfo}; use fs_err as fs; use kms_rpc::GetAppKeyRequest; -use ra_rpc::client::RaClient; +use ra_rpc::client::{RaClient, RaClientConfig}; +use ra_tls::cert::generate_ra_cert; use serde::{Deserialize, Serialize}; use tracing::{info, warn}; use crate::{ - cmd_gen_app_keys, cmd_gen_ra_cert, cmd_show, + cmd_gen_app_keys, cmd_show, crypto::dh_decrypt, - notify_client::NotifyClient, + gen_app_keys_from_seed, + host_api::HostApi, utils::{ deserialize_json_file, extend_rtmr3, sha256, sha256_file, AppCompose, AppKeys, HashingFile, - LocalConfig, + KeyProviderKind, LocalConfig, }, - GenAppKeysArgs, GenRaCertArgs, + GenAppKeysArgs, }; use cmd_lib::run_cmd as cmd; use serde_human_bytes as hex_bytes; mod env_process; +// Workaround for clap mis-infer the arg type according the type name +type Bool = bool; +type Bytes = Vec; + #[derive(clap::Parser)] /// Prepare full disk encryption pub struct SetupFdeArgs { @@ -56,7 +63,15 @@ pub struct SetupFdeArgs { rootfs_integrity: bool, /// Enabled rootfs encryption #[arg(long, default_value_t = true)] - rootfs_encryption: std::primitive::bool, + rootfs_encryption: Bool, + /// Rootfs hash + #[arg(long, value_parser = parse_hex_bytes)] + rootfs_hash: Bytes, +} + +fn parse_hex_bytes(s: &str) -> Result> { + let bytes = hex::decode(s).context("Failed to decode hex string")?; + Ok(bytes) } #[derive(Deserialize, Serialize, Clone, Default)] @@ -108,18 +123,6 @@ impl HostShareDir { fn instance_info_file(&self) -> PathBuf { self.base_dir.join(".instance_info") } - - fn kms_ca_cert_file(&self) -> PathBuf { - self.base_dir.join("certs").join("ca.cert") - } - - fn tmp_ca_cert_file(&self) -> PathBuf { - self.base_dir.join("certs").join("tmp-ca.cert") - } - - fn tmp_ca_key_file(&self) -> PathBuf { - self.base_dir.join("certs").join("tmp-ca.key") - } } struct HostShared { @@ -181,44 +184,111 @@ impl SetupFdeArgs { HostShared::load(host_shared_copy_dir.as_path()) } - async fn request_app_keys(&self, host_shared: &HostShared) -> Result { - let kms_url = &host_shared.vm_config.kms_url; - let kms_enabled = host_shared.app_compose.kms_enabled(); - if kms_enabled { - let Some(kms_url) = kms_url else { - bail!("KMS URL is not set"); - }; - info!("KMS is enabled, generating RA-TLS cert"); - let gen_certs_dir = self.work_dir.join("certs"); - fs::create_dir_all(&gen_certs_dir).context("Failed to create certs dir")?; - cmd_gen_ra_cert(GenRaCertArgs { - ca_cert: host_shared.dir.tmp_ca_cert_file(), - ca_key: host_shared.dir.tmp_ca_key_file(), - cert_path: gen_certs_dir.join("cert.pem"), - key_path: gen_certs_dir.join("key.pem"), - })?; - info!("Requesting app keys from KMS: {kms_url}"); - let ra_client = RaClient::new_mtls( - format!("{kms_url}/prpc"), - fs::read_to_string(host_shared.dir.kms_ca_cert_file())?, - fs::read_to_string(gen_certs_dir.join("cert.pem"))?, - fs::read_to_string(gen_certs_dir.join("key.pem"))?, - )?; - let kms_client = kms_rpc::kms_client::KmsClient::new(ra_client); - let response = kms_client - .get_app_key(GetAppKeyRequest { upgradable: true }) + async fn request_app_keys_from_kms(&self, host_shared: &HostShared) -> Result<()> { + let Some(kms_url) = &host_shared.vm_config.kms_url else { + bail!("KMS URL is not set"); + }; + info!("Requesting app keys from KMS: {kms_url}"); + let gen_certs_dir = self.work_dir.join("certs"); + fs::create_dir_all(&gen_certs_dir).context("Failed to create certs dir")?; + let kms_url = format!("{kms_url}/prpc"); + + let tmp_ca = { + info!("Getting temp ca cert"); + let client = RaClient::new(kms_url.clone(), true)?; + let kms_client = kms_rpc::kms_client::KmsClient::new(client); + kms_client + .get_temp_ca_cert() .await - .context("Failed to get app key")?; - let keys_json = - serde_json::to_string(&response).context("Failed to serialize app keys")?; - fs::write(self.app_keys_file(), keys_json).context("Failed to write app keys")?; - } else { - info!("KMS is not enabled, generating local app keys"); - cmd_gen_app_keys(GenAppKeysArgs { - ca_level: 1, - output: self.app_keys_file(), - })?; + .context("Failed to get temp ca cert")? + }; + let cert_pair = generate_ra_cert(tmp_ca.temp_ca_cert, tmp_ca.temp_ca_key)?; + let ra_client = RaClientConfig::builder() + .tls_no_check(false) + .tls_built_in_root_certs(false) + .remote_uri(kms_url.clone()) + .tls_client_cert(cert_pair.cert_pem) + .tls_client_key(cert_pair.key_pem) + .tls_ca_cert(tmp_ca.ca_cert.clone()) + .cert_validator(Box::new(|cert| { + let Some(cert) = cert else { + bail!("Missing server cert"); + }; + let Some(usage) = cert.special_usage else { + bail!("Missing server cert usage"); + }; + if usage != "kms:rpc" { + bail!("Invalid server cert usage: {usage}"); + } + Ok(()) + })) + .build() + .into_client() + .context("Failed to create client")?; + let kms_client = kms_rpc::kms_client::KmsClient::new(ra_client); + let response = kms_client + .get_app_key(GetAppKeyRequest { + app_compose: fs::read_to_string(host_shared.dir.app_compose_file()) + .context("Failed to read app compose file")?, + }) + .await + .context("Failed to get app key")?; + { + let (_, ca_pem) = x509_parser::pem::parse_x509_pem(tmp_ca.ca_cert.as_bytes()) + .context("Failed to parse ca cert")?; + let x509 = ca_pem.parse_x509().context("Failed to parse ca cert")?; + let id = hex::encode(x509.public_key().raw); + let provider_info = KeyProviderInfo::new("kms".into(), id); + emit_key_provider_info(&provider_info)?; + }; + let keys = AppKeys { + ca_cert: response.ca_cert, + disk_crypt_key: response.disk_crypt_key, + env_crypt_key: response.env_crypt_key, + k256_key: response.k256_key, + k256_signature: response.k256_signature, + tproxy_app_id: response.tproxy_app_id, + key_provider: KeyProvider::Kms { url: kms_url }, + }; + let keys_json = serde_json::to_string(&keys).context("Failed to serialize app keys")?; + fs::write(self.app_keys_file(), keys_json).context("Failed to write app keys")?; + Ok(()) + } + + async fn get_keys_from_local_key_provider(&self, host: &HostApi) -> Result<()> { + info!("Getting keys from local key provider"); + let provision = host + .get_sealing_key() + .await + .context("Failed to get sealing key")?; + // write to fs + let app_keys = + gen_app_keys_from_seed(&provision.sk).context("Failed to generate app keys")?; + let keys_json = serde_json::to_string(&app_keys).context("Failed to serialize app keys")?; + fs::write(self.app_keys_file(), keys_json).context("Failed to write app keys")?; + + // write to RTMR + let provider_info = KeyProviderInfo::new("local-sgx".into(), hex::encode(provision.mr)); + emit_key_provider_info(&provider_info)?; + Ok(()) + } + + async fn request_app_keys(&self, host_shared: &HostShared, host: &HostApi) -> Result { + let key_provider = host_shared.app_compose.key_provider(); + match key_provider { + KeyProviderKind::Kms => self.request_app_keys_from_kms(host_shared).await?, + KeyProviderKind::Local => self.get_keys_from_local_key_provider(host).await?, + KeyProviderKind::None => { + info!("No key provider is enabled, generating temporary app keys"); + let provider_info = KeyProviderInfo::new("none".into(), "".into()); + emit_key_provider_info(&provider_info)?; + cmd_gen_app_keys(GenAppKeysArgs { + ca_level: 1, + output: self.app_keys_file(), + })?; + } } + deserialize_json_file(self.app_keys_file()).context("Failed to decode app keys") } @@ -251,12 +321,7 @@ impl SetupFdeArgs { Ok(()) } - async fn mount_rootfs( - &self, - host_shared: &HostShared, - disk_crypt_key: &str, - nc: &NotifyClient, - ) -> Result<()> { + async fn mount_rootfs(&self, disk_crypt_key: &str, host: &HostApi) -> Result<()> { let rootfs_mountpoint = &self.rootfs_dir; let rootfs_dev = if self.rootfs_encryption { info!("Mounting encrypted rootfs"); @@ -273,14 +338,13 @@ impl SetupFdeArgs { let hash_file = self.rootfs_dir.join(".rootfs_hash"); let existing_rootfs_hash = fs::read(&hash_file).unwrap_or_default(); - if existing_rootfs_hash != host_shared.vm_config.rootfs_hash { + if existing_rootfs_hash != self.rootfs_hash { info!("Rootfs hash changed, upgrading the rootfs"); if hash_file.exists() { fs::remove_file(&hash_file).context("Failed to remove old rootfs hash file")?; } - nc.notify_q("boot.progress", "upgrading rootfs").await; - self.extract_rootfs(&host_shared.vm_config.rootfs_hash) - .await?; + host.notify_q("boot.progress", "upgrading rootfs").await; + self.extract_rootfs(&self.rootfs_hash).await?; } Ok(()) } @@ -306,10 +370,9 @@ impl SetupFdeArgs { async fn bootstrap_rootfs( &self, - host_shared: &HostShared, disk_crypt_key: &str, instance_info: &InstanceInfo, - nc: &NotifyClient, + host: &HostApi, ) -> Result<()> { info!("Setting up disk encryption"); info!("Formatting rootfs"); @@ -324,9 +387,8 @@ impl SetupFdeArgs { cmd!(mkfs.ext4 -L dstack-rootfs $rootfs_dev)?; cmd!(mount $rootfs_dev $rootfs_dir)?; - self.extract_rootfs(&host_shared.vm_config.rootfs_hash) - .await?; - nc.notify_q("instance.info", &serde_json::to_string(instance_info)?) + self.extract_rootfs(&self.rootfs_hash).await?; + host.notify_q("instance.info", &serde_json::to_string(instance_info)?) .await; Ok(()) } @@ -376,7 +438,9 @@ impl SetupFdeArgs { } let rootfs_hash = hashing_rootfs_cpio.finalize(); if &rootfs_hash[..] != expected_rootfs_hash { - bail!("Rootfs hash mismatch"); + let expected = hex::encode(expected_rootfs_hash); + let got = hex::encode(rootfs_hash); + bail!("Rootfs hash mismatch, expected {expected}, got {got}"); } info!("Rootfs hash is valid"); fs::write(self.rootfs_dir.join(".rootfs_hash"), rootfs_hash) @@ -400,18 +464,12 @@ impl SetupFdeArgs { Ok(()) } - async fn setup_rootfs(&self, nc: &NotifyClient, host_shared: &HostShared) -> Result<()> { - nc.notify_q("boot.progress", "loading host-shared").await; - let rootfs_hash = &host_shared.vm_config.rootfs_hash; + async fn setup_rootfs(&self, host_shared: &HostShared, host: &HostApi) -> Result<()> { + host.notify_q("boot.progress", "loading host-shared").await; let compose_hash = sha256_file(host_shared.dir.app_compose_file())?; let truncated_compose_hash = truncate(&compose_hash, 20); let kms_enabled = host_shared.app_compose.kms_enabled(); - let ca_cert_hash = if kms_enabled { - sha256_file(host_shared.dir.kms_ca_cert_file())? - } else { - sha256(b"") - }; - + let key_provider = host_shared.app_compose.key_provider(); let mut instance_info = host_shared.instance_info.clone(); let is_bootstrapped = instance_info.is_bootstrapped(); @@ -419,7 +477,7 @@ impl SetupFdeArgs { instance_info.app_id = truncated_compose_hash.to_vec(); } - let disk_reusable = kms_enabled || !self.rootfs_encryption; + let disk_reusable = (!key_provider.is_none()) || !self.rootfs_encryption; if (!disk_reusable) || instance_info.instance_id.is_empty() { instance_info.instance_id = { let mut rand_id = vec![0u8; 20]; @@ -432,49 +490,60 @@ impl SetupFdeArgs { bail!("App upgrade is not supported without KMS"); } - nc.notify_q("boot.progress", "extending RTMRs").await; + host.notify_q("boot.progress", "extending RTMRs").await; - extend_rtmr3("rootfs-hash", rootfs_hash)?; + extend_rtmr3("system-preparing", &[])?; + extend_rtmr3("rootfs-hash", &self.rootfs_hash)?; extend_rtmr3("app-id", &instance_info.app_id)?; extend_rtmr3("compose-hash", &compose_hash)?; - extend_rtmr3("ca-cert-hash", &ca_cert_hash)?; extend_rtmr3("instance-id", &instance_info.instance_id)?; - + extend_rtmr3("boot-mr-done", &[])?; // Show the RTMR cmd_show()?; - nc.notify_q("boot.progress", "requesting app keys").await; + host.notify_q("boot.progress", "requesting app keys").await; - let app_keys = self.request_app_keys(host_shared).await?; + let app_keys = self.request_app_keys(host_shared, host).await?; if app_keys.disk_crypt_key.is_empty() { bail!("Failed to get valid key phrase from KMS"); } - nc.notify_q("boot.progress", "decrypting env").await; + host.notify_q("boot.progress", "decrypting env").await; // Decrypt env file let decrypted_env = self.decrypt_env_vars(&app_keys.env_crypt_key, &host_shared.encrypted_env)?; + let disk_key = hex::encode(&app_keys.disk_crypt_key); if is_bootstrapped { - nc.notify_q("boot.progress", "mounting rootfs").await; - self.mount_rootfs(host_shared, &app_keys.disk_crypt_key, nc) - .await?; + host.notify_q("boot.progress", "mounting rootfs").await; + self.mount_rootfs(&disk_key, host).await?; } else { - nc.notify_q("boot.progress", "initializing rootfs").await; - self.bootstrap_rootfs(host_shared, &app_keys.disk_crypt_key, &instance_info, nc) + host.notify_q("boot.progress", "initializing rootfs").await; + self.bootstrap_rootfs(&disk_key, &instance_info, host) .await?; } self.write_decrypted_env(&decrypted_env)?; - nc.notify_q("boot.progress", "rootfs ready").await; + extend_rtmr3("system-ready", &[])?; + host.notify_q("boot.progress", "rootfs ready").await; Ok(()) } } +fn emit_key_provider_info(provider_info: &KeyProviderInfo) -> Result<()> { + info!("Key provider info: {provider_info:?}"); + let provider_info_json = serde_json::to_vec(&provider_info)?; + extend_rtmr3("key-provider", &provider_info_json)?; + Ok(()) +} + pub async fn cmd_setup_fde(args: SetupFdeArgs) -> Result<()> { let host_shared = args.copy_host_shared()?; - let nc = NotifyClient::new(host_shared.vm_config.host_api_url.clone()); - match args.setup_rootfs(&nc, &host_shared).await { + let host = HostApi::new( + host_shared.vm_config.host_api_url.clone(), + host_shared.vm_config.pccs_url.clone(), + ); + match args.setup_rootfs(&host_shared, &host).await { Ok(_) => Ok(()), Err(err) => { - nc.notify_q("boot.error", &format!("{err:?}")).await; + host.notify_q("boot.error", &format!("{err:?}")).await; Err(err) } } diff --git a/tdxctl/src/host_api.rs b/tdxctl/src/host_api.rs new file mode 100644 index 00000000..2be05bb4 --- /dev/null +++ b/tdxctl/src/host_api.rs @@ -0,0 +1,124 @@ +use std::time::{Duration, SystemTime}; + +use crate::utils::{deserialize_json_file, sha256, LocalConfig}; +use anyhow::{anyhow, bail, Context, Result}; +use host_api::{ + client::{new_client, DefaultClient}, + Notification, +}; +use key_provider_client::guest::{generate_keypair, open_sealed_box, PUBLICKEYBYTES}; +use tracing::warn; + +pub(crate) struct KeyProvision { + pub sk: [u8; 32], + pub mr: [u8; 32], +} + +pub(crate) struct HostApi { + client: DefaultClient, + pccs_url: Option, +} + +impl Default for HostApi { + fn default() -> Self { + Self::new("".into(), None) + } +} + +impl HostApi { + pub fn new(base_url: String, pccs_url: Option) -> Self { + Self { + client: new_client(base_url), + pccs_url, + } + } + + pub fn load_or_default(url: Option) -> Result { + let api = match url { + Some(url) => Self::new(url, None), + None => { + let local_config: LocalConfig = deserialize_json_file("/tapp/config.json")?; + Self::new( + local_config.host_api_url.clone(), + local_config.pccs_url.clone(), + ) + } + }; + Ok(api) + } + + pub async fn notify(&self, event: &str, payload: &str) -> Result<()> { + self.client + .notify(Notification { + event: event.to_string(), + payload: payload.to_string(), + }) + .await?; + Ok(()) + } + + pub async fn notify_q(&self, event: &str, payload: &str) { + if let Err(err) = self.notify(event, payload).await { + warn!("Failed to notify event {event} to host: {:?}", err); + } + } + + pub async fn get_sealing_key(&self) -> Result { + let (pk, sk) = generate_keypair(); + let mut report_data = [0u8; 64]; + report_data[..PUBLICKEYBYTES].copy_from_slice(&pk.0); + let (_, quote) = + tdx_attest::get_quote(&report_data, None).context("Failed to get quote")?; + + let provision = self + .client + .get_sealing_key(host_api::GetSealingKeyRequest { + quote: quote.to_vec(), + }) + .await + .map_err(|err| anyhow!("Failed to get sealing key: {err:?}"))?; + + // verify the key provider quote + let now = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .context("Invalid system time")? + .as_secs(); + + let pccs_url = self.pccs_url.as_deref().unwrap_or_default(); + let pccs_url = if pccs_url.is_empty() { + "https://api.trustedservices.intel.com/sgx/certification/v4" + } else { + pccs_url + }; + let quote_collateral = dcap_qvl::collateral::get_collateral( + pccs_url, + &provision.provider_quote, + Duration::from_secs(10), + ) + .await + .context("Failed to get quote collateral")?; + let verified_report = + dcap_qvl::verify::verify(&provision.provider_quote, "e_collateral, now) + .ok() + .context("Failed to verify key provider quote")?; + let sgx_report = verified_report + .report + .as_sgx() + .context("Invalid sgx report")?; + let key_hash = sha256(&provision.encrypted_key); + if sgx_report.report_data[..32] != key_hash { + bail!("Invalid key hash"); + } + let mr = sgx_report.mr_enclave; + + // write to fs + let sealing_key = open_sealed_box(&provision.encrypted_key, &pk, &sk) + .ok() + .context("Failed to open sealing key")?; + let sk = sealing_key + .try_into() + .ok() + .context("Invalid sealing key length")?; + Ok(KeyProvision { sk, mr }) + } +} diff --git a/tdxctl/src/main.rs b/tdxctl/src/main.rs index ff5e3029..2ea9d015 100644 --- a/tdxctl/src/main.rs +++ b/tdxctl/src/main.rs @@ -3,11 +3,18 @@ use bollard::container::{ListContainersOptions, RemoveContainerOptions}; use bollard::Docker; use clap::{Parser, Subcommand}; use cmd_lib::run_cmd as cmd; +use dstack_types::KeyProvider; use fde_setup::{cmd_setup_fde, SetupFdeArgs}; use fs_err as fs; use getrandom::getrandom; -use notify_client::NotifyClient; -use ra_tls::{attestation::QuoteContentType, cert::CaCert}; +use host_api::HostApi; +use k256::schnorr::SigningKey; +use ra_tls::{ + attestation::QuoteContentType, + cert::generate_ra_cert, + kdf::{derive_ecdsa_key, derive_ecdsa_key_pair_from_bytes}, + rcgen::KeyPair, +}; use scale::Decode; use serde::Deserialize; use std::{collections::HashMap, path::Path}; @@ -18,11 +25,11 @@ use std::{ use tboot::TbootArgs; use tdx_attest as att; use tracing::error; -use utils::extend_rtmr; +use utils::{extend_rtmr, AppKeys}; mod crypto; mod fde_setup; -mod notify_client; +mod host_api; mod tboot; mod utils; @@ -278,12 +285,11 @@ impl core::fmt::Debug for ParsedReport { } fn cmd_show() -> Result<()> { - let report_data = [0; 64]; - let report = att::get_report(&report_data).context("Failed to get report")?; - let parsed_report = - ParsedReport::decode(&mut report.0.get(512..).context("Failed to get report")?) - .context("Failed to decode report")?; - println!("{:#?}", parsed_report); + let attestation = ra_tls::attestation::Attestation::local()?; + let app_info = attestation.decode_app_info(false)?; + println!("========== App Info =========="); + serde_json::to_writer_pretty(io::stdout(), &app_info)?; + println!(); Ok(()) } @@ -310,27 +316,11 @@ fn cmd_hex(hex_args: HexCommand) -> Result<()> { } fn cmd_gen_ra_cert(args: GenRaCertArgs) -> Result<()> { - use ra_tls::cert::CertRequest; - use ra_tls::rcgen::{KeyPair, PKCS_ECDSA_P256_SHA256}; - - let ca = CaCert::load(&args.ca_cert, &args.ca_key).context("Failed to read CA certificate")?; - - let key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; - let pubkey = key.public_key_der(); - let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey); - let (_, quote) = att::get_quote(&report_data, None).context("Failed to get quote")?; - let event_logs = att::eventlog::read_event_logs().context("Failed to read event logs")?; - let event_log = serde_json::to_vec(&event_logs).context("Failed to serialize event logs")?; - let req = CertRequest::builder() - .subject("RA-TLS TEMP Cert") - .quote("e) - .event_log(&event_log) - .key(&key) - .build(); - let cert = ca.sign(req).context("Failed to sign certificate")?; - - fs::write(&args.cert_path, cert.pem()).context("Failed to write certificate")?; - fs::write(&args.key_path, key.serialize_pem()).context("Failed to write private key")?; + let ca_cert = fs::read_to_string(args.ca_cert)?; + let ca_key = fs::read_to_string(args.ca_key)?; + let cert_pair = generate_ra_cert(ca_cert, ca_key)?; + fs::write(&args.cert_path, cert_pair.cert_pem).context("Failed to write certificate")?; + fs::write(&args.key_path, cert_pair.key_pem).context("Failed to write private key")?; Ok(()) } @@ -362,12 +352,33 @@ fn cmd_gen_ca_cert(args: GenCaCertArgs) -> Result<()> { } fn cmd_gen_app_keys(args: GenAppKeysArgs) -> Result<()> { - use ra_tls::cert::CertRequest; use ra_tls::rcgen::{KeyPair, PKCS_ECDSA_P256_SHA256}; let key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; let disk_key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?; - let pubkey = key.public_key_der(); + let k256_key = SigningKey::random(&mut rand::thread_rng()); + let app_keys = make_app_keys(key, disk_key, k256_key, args.ca_level)?; + let app_keys = serde_json::to_string(&app_keys).context("Failed to serialize app keys")?; + fs::write(&args.output, app_keys).context("Failed to write app keys")?; + Ok(()) +} + +fn gen_app_keys_from_seed(seed: &[u8]) -> Result { + let key = derive_ecdsa_key_pair_from_bytes(seed, &["app-key".as_bytes()])?; + let disk_key = derive_ecdsa_key_pair_from_bytes(seed, &["app-disk-key".as_bytes()])?; + let k256_key = derive_ecdsa_key(seed, &["app-k256-key".as_bytes()], 32)?; + let k256_key = SigningKey::from_bytes(&k256_key).context("Failed to parse k256 key")?; + make_app_keys(key, disk_key, k256_key, 1) +} + +fn make_app_keys( + app_key: KeyPair, + disk_key: KeyPair, + k256_key: SigningKey, + ca_level: u8, +) -> Result { + use ra_tls::cert::CertRequest; + let pubkey = app_key.public_key_der(); let report_data = QuoteContentType::RaTlsCert.to_report_data(&pubkey); let (_, quote) = att::get_quote(&report_data, None).context("Failed to get quote")?; let event_logs = att::eventlog::read_event_logs().context("Failed to read event logs")?; @@ -376,34 +387,37 @@ fn cmd_gen_app_keys(args: GenAppKeysArgs) -> Result<()> { .subject("App Root Cert") .quote("e) .event_log(&event_log) - .key(&key) - .ca_level(args.ca_level) + .key(&app_key) + .ca_level(ca_level) .build(); let cert = req .self_signed() .context("Failed to self-sign certificate")?; - let app_keys = serde_json::json!({ - "app_key": key.serialize_pem(), - "disk_crypt_key": sha256(&disk_key.serialize_der()), - "certificate_chain": vec![cert.pem()], - }); - let app_keys = serde_json::to_string(&app_keys).context("Failed to serialize app keys")?; - fs::write(&args.output, app_keys).context("Failed to write app keys")?; - Ok(()) + Ok(AppKeys { + disk_crypt_key: sha256(&disk_key.serialize_der()).to_vec(), + env_crypt_key: vec![], + k256_key: k256_key.to_bytes().to_vec(), + k256_signature: vec![], + tproxy_app_id: "".to_string(), + ca_cert: cert.pem(), + key_provider: KeyProvider::Local { + key: app_key.serialize_pem(), + }, + }) } async fn cmd_notify_host(args: HostNotifyArgs) -> Result<()> { - let client = NotifyClient::load_or_default(args.url)?; + let client = HostApi::load_or_default(args.url)?; client.notify(&args.event, &args.payload).await?; Ok(()) } -fn sha256(data: &[u8]) -> String { +fn sha256(data: &[u8]) -> [u8; 32] { use sha2::Digest; let mut sha256 = sha2::Sha256::new(); sha256.update(data); - hex::encode(sha256.finalize()) + sha256.finalize().into() } fn get_project_name(compose_file: impl AsRef) -> Result { diff --git a/tdxctl/src/notify_client.rs b/tdxctl/src/notify_client.rs deleted file mode 100644 index ae2d227d..00000000 --- a/tdxctl/src/notify_client.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::utils::{deserialize_json_file, LocalConfig}; -use anyhow::Result; -use host_api::{ - client::{new_client, DefaultClient}, - Notification, -}; -use tracing::warn; - -pub(crate) struct NotifyClient { - client: DefaultClient, -} - -impl Default for NotifyClient { - fn default() -> Self { - Self::new("".into()) - } -} - -impl NotifyClient { - pub fn new(base_url: String) -> Self { - Self { - client: new_client(base_url), - } - } - - pub fn load_or_default(url: Option) -> Result { - let url = match url { - Some(url) => url, - None => { - let local_config: LocalConfig = deserialize_json_file("/tapp/config.json")?; - local_config.host_api_url.clone() - } - }; - Ok(Self::new(url)) - } - - pub async fn notify(&self, event: &str, payload: &str) -> Result<()> { - self.client - .notify(Notification { - event: event.to_string(), - payload: payload.to_string(), - }) - .await?; - Ok(()) - } - - pub async fn notify_q(&self, event: &str, payload: &str) { - if let Err(err) = self.notify(event, payload).await { - warn!("Failed to notify event {event} to host: {:?}", err); - } - } -} diff --git a/tdxctl/src/tboot.rs b/tdxctl/src/tboot.rs index 4b494992..92089090 100644 --- a/tdxctl/src/tboot.rs +++ b/tdxctl/src/tboot.rs @@ -1,18 +1,21 @@ use anyhow::{anyhow, bail, Context, Result}; +use cert_client::CertRequestClient; use clap::Parser; use cmd_lib::run_fun as cmd; use fs_err as fs; -use ra_rpc::client::RaClient; +use ra_rpc::client::{CertInfo, RaClientConfig}; +use ra_tls::{ + cert::CertConfig, + rcgen::{KeyPair, PKCS_ECDSA_P256_SHA256}, +}; use serde_json::Value; -use std::{collections::BTreeMap, io::Write}; +use std::collections::BTreeMap; use tproxy_rpc::{tproxy_client::TproxyClient, RegisterCvmRequest}; use tracing::info; use crate::{ - cmd_gen_ra_cert, - notify_client::NotifyClient, + host_api::HostApi, utils::{deserialize_json_file, AppCompose, AppKeys, LocalConfig}, - GenRaCertArgs, }; #[derive(Parser)] @@ -32,6 +35,31 @@ impl TbootArgs { } } +struct RaValidator { + remote_app_id: String, +} + +impl RaValidator { + fn validate(&self, cert: Option) -> Result<()> { + if self.remote_app_id == "any" { + return Ok(()); + } + let Some(cert) = cert else { + bail!("Missing cert"); + }; + let Some(attestation) = cert.attestation else { + bail!("Missing attestation"); + }; + let app_id = attestation + .decode_app_id() + .context("Failed to decode app id")?; + if app_id != self.remote_app_id { + bail!("Invalid app id: {}", app_id); + } + Ok(()) + } +} + struct Setup<'a> { args: &'a TbootArgs, local_config: LocalConfig, @@ -59,8 +87,7 @@ impl<'a> Setup<'a> { self.args.resolve(path) } - async fn setup(&self, nc: &NotifyClient) -> Result<()> { - self.prepare_certs()?; + async fn setup(&self, nc: &HostApi) -> Result<()> { nc.notify_q("boot.progress", "setting up tproxy net").await; self.setup_tappd_config()?; self.setup_tproxy_net().await?; @@ -75,6 +102,10 @@ impl<'a> Setup<'a> { info!("tproxy is not enabled"); return Ok(()); } + if self.app_keys.tproxy_app_id.is_empty() { + bail!("Missing allowed tproxy app id"); + } + info!("Setting up tproxy network"); // Generate WireGuard keys let sk = cmd!(wg genkey)?; @@ -88,12 +119,41 @@ impl<'a> Setup<'a> { .context("Missing tproxy_url")?; let url = format!("{}/prpc", tproxy_url); - let client = RaClient::new_mtls( - url, - fs::read_to_string(self.resolve("/etc/tappd/ca.cert"))?, - fs::read_to_string(self.resolve("/etc/tappd/tls.cert"))?, - fs::read_to_string(self.resolve("/etc/tappd/tls.key"))?, - )?; + let ra_validator = RaValidator { + remote_app_id: self.app_keys.tproxy_app_id.clone(), + }; + let cert_client = + CertRequestClient::create(&self.app_keys, self.local_config.pccs_url.as_deref()) + .await + .context("Failed to create cert client")?; + let client_key = + KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256).context("Failed to generate key")?; + let config = CertConfig { + org_name: None, + subject: "tappd".to_string(), + subject_alt_names: vec![], + usage_server_auth: false, + usage_client_auth: true, + ext_quote: true, + }; + let client_certs = cert_client + .request_cert(&client_key, config) + .await + .context("Failed to request cert")?; + let client_cert = client_certs.join("\n"); + let ca_cert = self.app_keys.ca_cert.clone(); + let client = RaClientConfig::builder() + .remote_uri(url) + .maybe_pccs_url(self.local_config.pccs_url.clone()) + .tls_client_cert(client_cert) + .tls_client_key(client_key.serialize_pem()) + .tls_ca_cert(ca_cert) + .tls_built_in_root_certs(false) + .tls_no_check(self.app_keys.tproxy_app_id == "any") + .cert_validator(Box::new(move |cert| ra_validator.validate(cert))) + .build() + .into_client() + .context("Failed to create RA client")?; let tproxy_client = TproxyClient::new(client); let response = tproxy_client .register_cvm(RegisterCvmRequest { @@ -136,50 +196,6 @@ impl<'a> Setup<'a> { Ok(()) } - fn prepare_certs(&self) -> Result<()> { - info!("Preparing certs"); - if fs::metadata(self.resolve("/etc/tappd")).is_ok() { - fs::remove_dir_all(self.resolve("/etc/tappd"))?; - } - fs::create_dir_all(self.resolve("/etc/tappd"))?; - - if self.app_keys.app_key.is_empty() { - bail!("Invalid app_key"); - } - fs::write( - self.resolve("/etc/tappd/app-ca.key"), - &self.app_keys.app_key, - )?; - - let kms_ca_cert = self.resolve("/tapp/certs/ca.cert"); - if fs::metadata(&kms_ca_cert).is_ok() { - fs::copy(kms_ca_cert, self.resolve("/etc/tappd/ca.cert"))?; - } else { - // symbolic link the app-ca.cert to ca.cert - fs::os::unix::fs::symlink( - self.resolve("/etc/tappd/app-ca.cert"), - self.resolve("/etc/tappd/ca.cert"), - )?; - } - - let cert_chain_str = self.app_keys.certificate_chain.join("\n"); - fs::write(self.resolve("/etc/tappd/app-ca.cert"), cert_chain_str)?; - - cmd_gen_ra_cert(GenRaCertArgs { - ca_key: self.resolve("/etc/tappd/app-ca.key").into(), - ca_cert: self.resolve("/etc/tappd/app-ca.cert").into(), - cert_path: self.resolve("/etc/tappd/tls.cert").into(), - key_path: self.resolve("/etc/tappd/tls.key").into(), - }) - .context("Failed to generate RA cert")?; - - let mut tls_cert = fs::OpenOptions::new() - .append(true) - .open(self.resolve("/etc/tappd/tls.cert"))?; - tls_cert.write_all(&fs::read(self.resolve("/etc/tappd/app-ca.cert"))?)?; - Ok(()) - } - fn setup_tappd_config(&self) -> Result<()> { info!("Setting up tappd config"); let config = serde_json::json!({ @@ -188,10 +204,11 @@ impl<'a> Setup<'a> { "app_name": self.app_compose.name, "public_logs": self.app_compose.public_logs, "public_sysinfo": self.app_compose.public_sysinfo, + "pccs_url": self.local_config.pccs_url, } } }); - let tappd_config = self.resolve("/etc/tappd/tappd.json"); + let tappd_config = self.resolve("/tapp/tappd.json"); fs::write(tappd_config, serde_json::to_string_pretty(&config)?)?; Ok(()) } @@ -265,7 +282,7 @@ impl<'a> Setup<'a> { } pub async fn tboot(args: &TbootArgs) -> Result<()> { - let nc = NotifyClient::load_or_default(None).unwrap_or_default(); + let nc = HostApi::load_or_default(None).unwrap_or_default(); if let Err(err) = tboot_inner(args, &nc).await { nc.notify_q("boot.error", &format!("{err:?}")).await; return Err(err); @@ -273,7 +290,7 @@ pub async fn tboot(args: &TbootArgs) -> Result<()> { Ok(()) } -pub async fn tboot_inner(args: &TbootArgs, nc: &NotifyClient) -> Result<()> { +pub async fn tboot_inner(args: &TbootArgs, nc: &HostApi) -> Result<()> { nc.notify_q("boot.progress", "enter system").await; Setup::load(args)?.setup(nc).await?; Ok(()) diff --git a/tdxctl/src/utils.rs b/tdxctl/src/utils.rs index 5d1f5583..dda7c185 100644 --- a/tdxctl/src/utils.rs +++ b/tdxctl/src/utils.rs @@ -5,11 +5,12 @@ use std::{ use anyhow::{Context, Result}; use fs_err as fs; -use serde::{de::DeserializeOwned, Deserialize}; -use serde_human_bytes as hex_bytes; +use serde::de::DeserializeOwned; use sha2::{digest::Output, Digest}; use tdx_attest as att; +pub use dstack_types::{AppCompose, AppKeys, KeyProviderKind, LocalConfig}; + /// This code is not defined in the TCG specification. /// See https://trustedcomputinggroup.org/wp-content/uploads/PC-ClientSpecific_Platform_Profile_for_TPM_2p0_Systems_v51.pdf const DSTACK_EVENT_TAG: u32 = 0x08000001; @@ -71,68 +72,3 @@ pub fn extend_rtmr(index: u32, event_type: u32, event: &str, payload: &[u8]) -> att::log_rtmr_event(&log).context("Failed to log RTMR extending event")?; Ok(()) } - -#[derive(Deserialize)] -#[allow(unused)] -pub struct AppCompose { - pub manifest_version: u32, - pub name: String, - // Deprecated - #[serde(default)] - pub features: Vec, - pub runner: String, - pub docker_compose_file: Option, - #[serde(default)] - pub docker_config: DockerConfig, - #[serde(default)] - pub public_logs: bool, - #[serde(default)] - pub public_sysinfo: bool, - #[serde(default)] - pub kms_enabled: bool, - #[serde(default)] - pub tproxy_enabled: bool, -} - -#[derive(Deserialize, Debug, Default)] -pub struct DockerConfig { - /// The URL of the Docker registry. - pub registry: Option, - /// The username of the registry account. - pub username: Option, - /// The key of the encrypted environment variables for registry account token. - pub token_key: Option, -} - -impl AppCompose { - fn feature_enabled(&self, feature: &str) -> bool { - self.features.contains(&feature.to_string()) - } - - pub fn tproxy_enabled(&self) -> bool { - self.tproxy_enabled || self.feature_enabled("tproxy-net") - } - - pub fn kms_enabled(&self) -> bool { - self.kms_enabled || self.feature_enabled("kms") - } -} - -#[derive(Deserialize)] -pub struct LocalConfig { - #[serde(with = "hex_bytes")] - pub rootfs_hash: Vec, - pub kms_url: Option, - pub tproxy_url: Option, - pub docker_registry: Option, - pub host_api_url: String, -} - -#[derive(Deserialize)] -pub struct AppKeys { - pub app_key: String, - pub disk_crypt_key: String, - #[serde(with = "hex_bytes", default)] - pub env_crypt_key: Vec, - pub certificate_chain: Vec, -} diff --git a/teepod/Cargo.toml b/teepod/Cargo.toml index 23193e10..3fb93ce2 100644 --- a/teepod/Cargo.toml +++ b/teepod/Cargo.toml @@ -38,3 +38,5 @@ host-api.workspace = true safe-write.workspace = true guest-api = { workspace = true, features = ["client"] } load_config.workspace = true +key-provider-client.workspace = true +dstack-types.workspace = true diff --git a/teepod/rpc/proto/teepod_rpc.proto b/teepod/rpc/proto/teepod_rpc.proto index ad9423f5..7ca8d116 100644 --- a/teepod/rpc/proto/teepod_rpc.proto +++ b/teepod/rpc/proto/teepod_rpc.proto @@ -103,7 +103,7 @@ message ImageInfo { } message AppId { - string app_id = 1; + bytes app_id = 1; } message PublicKeyResponse { diff --git a/teepod/src/app.rs b/teepod/src/app.rs index 9f315ffd..ffae1133 100644 --- a/teepod/src/app.rs +++ b/teepod/src/app.rs @@ -85,7 +85,15 @@ impl App { ) -> Result<()> { let vm_work_dir = VmWorkDir::new(work_dir.as_ref()); let manifest = vm_work_dir.manifest().context("Failed to read manifest")?; - let todo = "sanitize the image name"; + if manifest.image.len() > 64 + || manifest.image.contains("..") + || !manifest + .image + .chars() + .all(|c| c.is_alphanumeric() || c == '_' || c == '-' || c == '.') + { + bail!("Invalid image name"); + } let image_path = self.config.image_path.join(&manifest.image); let image = Image::load(&image_path).context("Failed to load image")?; let vm_id = manifest.id.clone(); @@ -126,7 +134,7 @@ impl App { .supervisor .info(id) .await? - .map_or(false, |info| info.state.status.is_running()); + .is_some_and(|info| info.state.status.is_running()); self.set_started(id, true)?; let vm_config = { let mut state = self.lock(); @@ -170,7 +178,7 @@ impl App { pub async fn remove_vm(&self, id: &str) -> Result<()> { let info = self.supervisor.info(id).await?; - let is_running = info.as_ref().map_or(false, |i| i.state.status.is_running()); + let is_running = info.as_ref().is_some_and(|i| i.state.status.is_running()); if is_running { bail!("VM is running, stop it first"); } @@ -320,7 +328,12 @@ impl App { self.config.run_path.join(id).join("shared") } - pub(crate) fn prepare_work_dir(&self, id: &str, req: &VmConfiguration) -> Result { + pub(crate) fn prepare_work_dir( + &self, + id: &str, + req: &VmConfiguration, + app_id: &str, + ) -> Result { let work_dir = self.work_dir(id); let shared_dir = work_dir.join("shared"); fs::create_dir_all(&shared_dir).context("Failed to create shared directory")?; @@ -330,7 +343,6 @@ impl App { fs::write(shared_dir.join("encrypted-env"), &req.encrypted_env) .context("Failed to write encrypted env")?; } - let app_id = req.app_id.clone().unwrap_or_default(); if !app_id.is_empty() { let instance_info = serde_json::json!({ "app_id": app_id, @@ -348,8 +360,6 @@ impl App { let work_dir = self.work_dir(id); let shared_dir = self.shared_dir(id); let manifest = work_dir.manifest().context("Failed to read manifest")?; - let certs_dir = shared_dir.join("certs"); - fs::create_dir_all(&certs_dir).context("Failed to create certs directory")?; let cfg = &self.config; let image_path = cfg.image_path.join(&manifest.image); let image_info = ImageInfo::load(image_path.join("metadata.json")) @@ -361,6 +371,7 @@ impl App { "rootfs_hash": rootfs_hash, "kms_url": cfg.cvm.kms_url, "tproxy_url": cfg.cvm.tproxy_url, + "pccs_url": cfg.cvm.pccs_url, "docker_registry": cfg.cvm.docker_registry, "host_api_url": format!("vsock://2:{}/api", cfg.host_api.port), }); @@ -368,11 +379,6 @@ impl App { serde_json::to_string(&vm_config).context("Failed to serialize vm config")?; fs::write(shared_dir.join("config.json"), vm_config_str) .context("Failed to write vm config")?; - fs::copy(&cfg.cvm.ca_cert, certs_dir.join("ca.cert")).context("Failed to copy ca cert")?; - fs::copy(&cfg.cvm.tmp_ca_cert, certs_dir.join("tmp-ca.cert")) - .context("Failed to copy tmp ca cert")?; - fs::copy(&cfg.cvm.tmp_ca_key, certs_dir.join("tmp-ca.key")) - .context("Failed to copy tmp ca key")?; Ok(()) } @@ -381,7 +387,7 @@ impl App { bail!("KMS is not configured"); } let url = format!("{}/prpc", self.config.kms_url); - let prpc_client = RaClient::new(url, true); + let prpc_client = RaClient::new(url, true)?; Ok(KmsClient::new(prpc_client)) } diff --git a/teepod/src/app/qemu.rs b/teepod/src/app/qemu.rs index eb6c76ae..b8f872d4 100644 --- a/teepod/src/app/qemu.rs +++ b/teepod/src/app/qemu.rs @@ -131,7 +131,6 @@ impl VmState { Some(info) => info.state.status.is_running(), None => false, }; - let todo = "more light way to get started"; let started = workdir.started().unwrap_or(false); let status = match (started, is_running) { (true, true) => "running", diff --git a/teepod/src/config.rs b/teepod/src/config.rs index b5227032..1c24e6a2 100644 --- a/teepod/src/config.rs +++ b/teepod/src/config.rs @@ -72,13 +72,13 @@ impl PortMappingConfig { pub struct CvmConfig { #[serde(default)] pub qemu_path: PathBuf, - pub ca_cert: PathBuf, - pub tmp_ca_cert: PathBuf, - pub tmp_ca_key: PathBuf, /// The URL of the KMS server pub kms_url: String, /// The URL of the TProxy server pub tproxy_url: String, + /// The URL of the PCCS server + #[serde(default)] + pub pccs_url: String, /// The URL of the Docker registry pub docker_registry: String, /// The maximum disk size in GB @@ -144,6 +144,9 @@ pub struct Config { /// Host API configuration pub host_api: HostApiConfig, + + /// Key provider configuration + pub key_provider: KeyProviderConfig, } impl Config { @@ -181,6 +184,13 @@ pub struct HostApiConfig { pub port: u32, } +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct KeyProviderConfig { + pub enabled: bool, + pub address: IpAddr, + pub port: u16, +} + impl Config { pub fn extract_or_default(figment: &Figment) -> Result { let mut me: Self = figment.extract()?; diff --git a/teepod/src/console.html b/teepod/src/console.html index c7d5ef46..378d88b8 100644 --- a/teepod/src/console.html +++ b/teepod/src/console.html @@ -519,6 +519,12 @@

Deploy a new instance

+
+ + +
+