diff --git a/.gitignore b/.gitignore index e293b16..f4670b8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,8 @@ target yarn.lock build .yarn -dist \ No newline at end of file +dist +.yarnrc.yml +.pnp.js +.env +deploy.json \ No newline at end of file diff --git a/build/flux_aggregator.so b/build/flux_aggregator.so index 6e7d895..c85132a 100755 Binary files a/build/flux_aggregator.so and b/build/flux_aggregator.so differ diff --git a/program/Cargo.lock b/program/Cargo.lock index c6888be..ad94877 100644 --- a/program/Cargo.lock +++ b/program/Cargo.lock @@ -1,5 +1,18 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gimli 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aho-corasick" version = "0.7.15" @@ -13,6 +26,11 @@ name = "arrayref" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "assert_matches" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "atty" version = "0.2.14" @@ -28,6 +46,30 @@ name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "backtrace" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "addr2line 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "object 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bincode" version = "1.3.1" @@ -37,6 +79,11 @@ dependencies = [ "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "block-buffer" version = "0.7.3" @@ -48,6 +95,15 @@ dependencies = [ "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-padding 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "block-padding" version = "0.1.5" @@ -56,11 +112,59 @@ dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "borsh" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "borsh-derive 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "borsh-derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "borsh-derive-internal 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh-schema-derive-internal 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bs58" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bumpalo" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bv" version = "0.11.1" @@ -80,11 +184,118 @@ name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bytes" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cc" +version = "1.0.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "curve25519-dalek" version = "2.1.0" @@ -115,11 +326,49 @@ dependencies = [ "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ed25519" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "signature 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.0-pre.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "curve25519-dalek 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "encoding_rs" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "env_logger" version = "0.7.1" @@ -146,16 +395,110 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "flux-aggregator" version = "0.1.0" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh-derive 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-derive 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "num_enum 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "solana-program 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-sdk 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", "spl-token 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "form_urlencoded" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-channel" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-core" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-io" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-macro" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-hack 0.5.19 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-sink" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-task" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "once_cell 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "futures-util" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-macro 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.19 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-nested 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "generic-array" version = "0.12.3" @@ -184,6 +527,35 @@ dependencies = [ "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gimli" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "h2" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-futures 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "hermit-abi" version = "0.1.17" @@ -197,6 +569,54 @@ name = "hex" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "hmac" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hmac-drbg" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http-body" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "httparse" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "humantime" version = "1.3.0" @@ -205,6 +625,76 @@ dependencies = [ "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hyper" +version = "0.13.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "httpdate 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", + "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hyper-rustls" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.9 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "idna" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "indexmap" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ipnet" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itertools" version = "0.9.0" @@ -213,16 +703,77 @@ dependencies = [ "either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "itoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "jobserver" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "js-sys" +version = "0.3.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "libc" version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "libsecp256k1" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.11" @@ -231,6 +782,16 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memchr" version = "2.3.4" @@ -245,6 +806,86 @@ dependencies = [ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio-uds" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -255,6 +896,15 @@ dependencies = [ "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.2.14" @@ -263,6 +913,15 @@ dependencies = [ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hermit-abi 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num_enum" version = "0.5.1" @@ -283,11 +942,115 @@ dependencies = [ "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "object" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "once_cell" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "opaque-debug" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "parking_lot" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pbkdf2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pin-project" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pin-project-internal 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-project" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pin-project-internal 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pin-project-lite" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ppv-lite86" version = "0.2.10" @@ -301,6 +1064,24 @@ dependencies = [ "toml 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro-nested" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "proc-macro2" version = "1.0.24" @@ -314,6 +1095,14 @@ name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "quote" version = "1.0.7" @@ -359,6 +1148,11 @@ dependencies = [ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "regex" version = "1.4.2" @@ -375,6 +1169,61 @@ name = "regex-syntax" version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "reqwest" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.9 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-rustls 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winreg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ring" +version = "0.16.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rustc_version" version = "0.2.3" @@ -383,11 +1232,42 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.12 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustversion" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "sct" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.16.12 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "0.9.0" @@ -427,6 +1307,27 @@ dependencies = [ "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_json" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "form_urlencoded 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sha2" version = "0.8.2" @@ -438,6 +1339,68 @@ dependencies = [ "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "signature" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "smallvec" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "socket2" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "solana-crate-features" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.4 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "solana-frozen-abi" version = "1.4.14" @@ -508,6 +1471,49 @@ dependencies = [ "thiserror 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "solana-sdk" +version = "1.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "assert_matches 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bs58 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bv 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.4 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-derive 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_bytes 0.11.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-crate-features 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-frozen-abi 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-frozen-abi-macro 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-logger 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-program 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-sdk-macro 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "solana-sdk-macro" version = "1.4.14" @@ -520,6 +1526,11 @@ dependencies = [ "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "spl-token" version = "3.0.0" @@ -533,11 +1544,26 @@ dependencies = [ "thiserror 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "subtle" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syn" version = "1.0.54" @@ -548,6 +1574,17 @@ dependencies = [ "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "synstructure" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "termcolor" version = "1.1.2" @@ -582,6 +1619,239 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.10.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tinyvec" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "tinyvec_macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "tokio" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-uds 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-codec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-fs" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-sync" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-queue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-timer" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-udp" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-uds" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "toml" version = "0.5.7" @@ -590,26 +1860,216 @@ dependencies = [ "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tower-service" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "tracing" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tracing-futures" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pin-project 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "typenum" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "tinyvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-xid" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "url" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "form_urlencoded 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "version_check" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "try-lock 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasm-bindgen" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "web-sys" +version = "0.3.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "js-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.16.12 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.3.9" @@ -619,6 +2079,11 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -637,86 +2102,278 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "zeroize" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [metadata] +"checksum addr2line 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423" +"checksum adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" "checksum aho-corasick 0.7.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" "checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +"checksum assert_matches 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "695579f0f2520f3774bb40461e5adb066459d4e0af4d59d20175484fb8e9edf1" "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +"checksum backtrace 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" +"checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +"checksum base64 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" "checksum bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" +"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +"checksum block-buffer 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +"checksum block-padding 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +"checksum borsh 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "30f3fd65922359a7c6e791bc9b2bba1b977ea0c0b96a528ac48007f535fb4184" +"checksum borsh-derive 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b2d74755d937d261d5e9bdef87e0addfbc1ace0214f7776f21532d6e97325356" +"checksum borsh-derive-internal 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c9f966cb7a42c8ed83546ef481bc1d1dec888fe5f84a4737d5c2094a483e41e" +"checksum borsh-schema-derive-internal 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5df2543b56ebc2b4493e70d024ebde2cbb48d97bf7b1a16318eff30bd02669b8" "checksum bs58 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" +"checksum bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" "checksum bv 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +"checksum bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" +"checksum cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)" = "e450b8da92aa6f274e7c6437692f9f2ce6d701fb73bacfcf87897b3f89a4c20e" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +"checksum cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +"checksum chrono 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +"checksum crossbeam-queue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" +"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +"checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum curve25519-dalek 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" "checksum derivative 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +"checksum digest 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +"checksum ed25519 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "37c66a534cbb46ab4ea03477eae19d5c22c01da8258030280b7bd9d8433fb6ef" +"checksum ed25519-dalek 1.0.0-pre.4 (registry+https://github.com/rust-lang/crates.io-index)" = "21a8a37f4e8b35af971e6db5e3897e7a6344caa3f92f6544f88125a1f5f0035a" "checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +"checksum encoding_rs 0.8.26 (registry+https://github.com/rust-lang/crates.io-index)" = "801bbab217d7f79c0062f4f7205b5d4427c6d1a7bd7aafdd1475f7c59d62b283" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum feature-probe 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" +"checksum fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +"checksum form_urlencoded 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7e4c2612746b0df8fed4ce0c69156021b704c9aefa360311c04e6e9e002eed" +"checksum futures-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64" +"checksum futures-core 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748" +"checksum futures-io 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb" +"checksum futures-macro 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556" +"checksum futures-sink 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d" +"checksum futures-task 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d" +"checksum futures-util 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" "checksum generic-array 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" "checksum getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +"checksum gimli 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +"checksum h2 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +"checksum hashbrown 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" "checksum hermit-abi 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" "checksum hex 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +"checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +"checksum hmac-drbg 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" +"checksum http 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "84129d298a6d57d246960ff8eb831ca4af3f96d29e2e28848dae275408658e26" +"checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" +"checksum httpdate 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +"checksum hyper 0.13.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f6ad767baac13b44d4529fcf58ba2cd0995e36e7b435bc5b039de6f47e880dbf" +"checksum hyper-rustls 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6" +"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +"checksum indexmap 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +"checksum ipnet 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" "checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +"checksum itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" +"checksum jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" +"checksum js-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175" +"checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" "checksum libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)" = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" +"checksum libsecp256k1 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" +"checksum lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" "checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +"checksum memoffset 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +"checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +"checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +"checksum miniz_oxide 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +"checksum mio 0.6.23 (registry+https://github.com/rust-lang/crates.io-index)" = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +"checksum mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +"checksum miow 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +"checksum net2 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)" = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" "checksum num-derive 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +"checksum num-integer 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" "checksum num-traits 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +"checksum num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" "checksum num_enum 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" "checksum num_enum_derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +"checksum object 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" +"checksum once_cell 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +"checksum opaque-debug 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" +"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" +"checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +"checksum pin-project 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" +"checksum pin-project 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7" +"checksum pin-project-internal 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" +"checksum pin-project-internal 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8e8d2bf0b23038a4424865103a4df472855692821aab4e4f5c3312d461d9e5f" +"checksum pin-project-lite 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" +"checksum pin-project-lite 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c" +"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" "checksum ppv-lite86 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" "checksum proc-macro-crate 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +"checksum proc-macro-hack 0.5.19 (registry+https://github.com/rust-lang/crates.io-index)" = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +"checksum proc-macro-nested 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" "checksum proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" "checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +"checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" "checksum regex 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" "checksum regex-syntax 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" +"checksum reqwest 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" +"checksum ring 0.16.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5a8ec64ee89a76c98c549af81ff14813df09c3e6dc4766c3856da48597a0c" +"checksum rustc-demangle 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum rustls 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" "checksum rustversion 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" +"checksum ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +"checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)" = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" "checksum serde_bytes 0.11.5 (registry+https://github.com/rust-lang/crates.io-index)" = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" "checksum serde_derive 1.0.118 (registry+https://github.com/rust-lang/crates.io-index)" = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +"checksum serde_json 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)" = "1500e84d27fe482ed1dc791a56eddc2f230046a040fa908c08bda1d9fb615779" +"checksum serde_urlencoded 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" "checksum sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +"checksum sha3 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +"checksum signature 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" +"checksum socket2 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "97e0e9fd577458a4f61fb91fcb559ea2afecc54c934119421f9f5d3d5b1a1057" +"checksum solana-crate-features 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd154192d2b458d6ebfe2343b26225880daaa771f5c43069c45a2b53369ba4d6" "checksum solana-frozen-abi 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "9e5ab6ad3dda6a3d95d19603eeedc65689d8125eafb3e23c6a1e01ab8a6ba60c" "checksum solana-frozen-abi-macro 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ffaa09aa938a67501479ed8a785071c6993f72c34e43f680db3ea7a2dadad9e7" "checksum solana-logger 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0d949157d0b23eaf5758b427d90741d2a90751c4e3dfee028f5726ab8b36e769" "checksum solana-program 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "8e9c6cb16e8aa986bc0d2af8ec50628f7451bef9dac89924adf48302bd4fc755" +"checksum solana-sdk 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "85c38a02d501422070cd6a4d561b4ab1408e311c5a0b5af3a7bb01246da14f66" "checksum solana-sdk-macro 1.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "475a680cd175f2e256452e007c6f8622d3a1ab97ab36d26303b35576e24f340c" +"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum spl-token 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f77fa0b41cbc82d1d7c8f2d914b49e9a1a7b6e32af952d03383fb989c42bc89" +"checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" +"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" "checksum syn 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44" +"checksum synstructure 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" "checksum termcolor 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" "checksum thiserror 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e" "checksum thiserror-impl 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56" "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +"checksum time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +"checksum tinyvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f" +"checksum tinyvec_macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" +"checksum tokio 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)" = "099837d3464c16a808060bb3f02263b412f6fafcb5d01c533d309985fbeebe48" +"checksum tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" +"checksum tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" +"checksum tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" +"checksum tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" +"checksum tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" +"checksum tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +"checksum tokio-rustls 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" +"checksum tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +"checksum tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" +"checksum tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" +"checksum tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +"checksum tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" +"checksum tokio-uds 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" +"checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" "checksum toml 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645" +"checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" +"checksum tracing 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +"checksum tracing-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +"checksum tracing-futures 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +"checksum try-lock 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" "checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +"checksum untrusted 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +"checksum url 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" "checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +"checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +"checksum wasi 0.10.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +"checksum wasm-bindgen 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e" +"checksum wasm-bindgen-backend 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62" +"checksum wasm-bindgen-futures 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "1fe9756085a84584ee9457a002b7cdfe0bfff169f45d2591d8be1345a6780e35" +"checksum wasm-bindgen-macro 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084" +"checksum wasm-bindgen-macro-support 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549" +"checksum wasm-bindgen-shared 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" +"checksum web-sys 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)" = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3" +"checksum webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" +"checksum webpki-roots 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0f20dea7535251981a9670857150d571846545088359b28e4951d350bdaf179f" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum winreg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum zeroize 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05f33972566adbd2d3588b0491eb94b98b43695c4ef897903470ede4f3f5a28a" +"checksum zeroize_derive 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" diff --git a/program/Cargo.toml b/program/Cargo.toml index 9d74901..9a6d8b0 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -7,15 +7,19 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +borsh = "0.7.1" +borsh-derive = "0.7.1" solana-program = "1.4.8" spl-token = { version = "3.0.0", features = [ "no-entrypoint" ] } byteorder = "1.3" thiserror = "1.0" num-derive = "0.3" num-traits = "0.2" -arrayref = "0.3.6" num_enum = "0.5.1" +[dev-dependencies] +solana-sdk = "1.4.8" + [lib] crate-type = ["cdylib", "lib"] diff --git a/program/src/borsh_utils.rs b/program/src/borsh_utils.rs new file mode 100644 index 0000000..ac7bd88 --- /dev/null +++ b/program/src/borsh_utils.rs @@ -0,0 +1,56 @@ +//! Borsh utils +use borsh::schema::{BorshSchema, Declaration, Definition, Fields}; +use std::collections::HashMap; + +/// Get packed length for the given BorchSchema Declaration +fn get_declaration_packed_len( + declaration: &str, + definitions: &HashMap, +) -> usize { + match definitions.get(declaration) { + Some(Definition::Array { length, elements }) => { + *length as usize * get_declaration_packed_len(elements, definitions) + } + Some(Definition::Enum { variants }) => { + 1 + variants + .iter() + .map(|(_, declaration)| get_declaration_packed_len(declaration, definitions)) + .max() + .unwrap_or(0) + } + Some(Definition::Struct { fields }) => match fields { + Fields::NamedFields(named_fields) => named_fields + .iter() + .map(|(_, declaration)| get_declaration_packed_len(declaration, definitions)) + .sum(), + Fields::UnnamedFields(declarations) => declarations + .iter() + .map(|declaration| get_declaration_packed_len(declaration, definitions)) + .sum(), + Fields::Empty => 0, + }, + Some(Definition::Sequence { + elements: _elements, + }) => panic!("Missing support for Definition::Sequence"), + Some(Definition::Tuple { elements }) => elements + .iter() + .map(|element| get_declaration_packed_len(element, definitions)) + .sum(), + None => match declaration { + "u8" | "i8" => 1, + "u16" | "i16" => 2, + "u32" | "i32" => 4, + "u64" | "i64" => 8, + "u128" | "i128" => 16, + "bool" => 1, + "nil" => 0, + _ => panic!("Missing primitive type: {}", declaration), + }, + } +} + +/// Get the worst-case packed length for the given BorshSchema +pub fn get_packed_len() -> usize { + let schema_container = S::schema_container(); + get_declaration_packed_len(&schema_container.declaration, &schema_container.definitions) +} \ No newline at end of file diff --git a/program/src/instruction.rs b/program/src/instruction.rs index ddf85cb..0b1671b 100644 --- a/program/src/instruction.rs +++ b/program/src/instruction.rs @@ -1,25 +1,35 @@ //! Instruction types -use crate::error::Error; +// use crate::error::Error; +#![allow(dead_code)] use solana_program::{ - program_error::ProgramError, + sysvar, pubkey::Pubkey, - info, + program_error::ProgramError, + program_pack::{Pack, Sealed}, + instruction::{AccountMeta, Instruction as SolInstruction}, }; -use std::convert::TryInto; +// use std::convert::TryInto; +use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; /// Maximum number of oracles -pub const MAX_ORACLES: usize = 21; +pub const MAX_ORACLES: usize = 12; + /// The amount paid of TOKEN paid to each oracle per submission, in lamports (10e-10 SOL) pub const PAYMENT_AMOUNT: u64 = 10; -/// Instructions supported by the program. -#[repr(C)] -#[derive(Clone, Debug, PartialEq)] +/// Instructions supported by the program +#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, BorshSchema, PartialEq)] pub enum Instruction { /// Initializes a new Aggregator + /// + /// Accounts expected by this instruction: + /// + /// 0. `[]` Rent sysvar + /// 1. `[writable]` The aggregator. + /// 2. `[signer]` The aggregator's authority. Initialize { /// The interval(seconds) of an oracle's each submission submit_interval: u32, @@ -32,128 +42,259 @@ pub enum Instruction { }, /// Add an oracle - /// Accounts expected by this instruction: /// - /// 0. `[writable]` The aggregator. - /// 1. `[signer]` The aggregator's authority. + /// Accounts expected by this instruction: + /// 0. `[writable]` The oracle + /// 1. `[]` The oracle owner + /// 2. `[]` Clock sysvar + /// 3. `[writable]` The aggregator + /// 4. `[signer]` The aggregator owner AddOracle { - /// add to index + /// the oracle's index of the aggregator index: u8, - /// Is usually the oracle name + /// Is usually the oracle name description: [u8; 32], }, /// Remove an oracle + /// + /// Accounts expected by this instruction: + /// 0. `[writable]` The aggregator. + /// 1. `[signer]` The aggregator onwer. RemoveOracle { - /// index + /// the oracle's index of the aggregator index: u8, }, /// Called by oracles when they have witnessed a need to update + /// + /// Accounts expected by this instruction: + /// 0. `[writable]` The aggregator(key). + /// 1. `[]` Clock sysvar + /// 2. `[writable]` The oracle key. + /// 3. `[signer]` The oracle owner. Submit { - /// submission is the updated data that the oracle is submitting + /// the updated data that the oracle is submitting submission: u64, }, /// Oracle withdraw token + /// + /// Accounts expected by this instruction: + /// 0. `[writable]` The aggregator (key). + /// 1. `[writable]` The faucet (which token transfer from) + /// 2. `[writable]` The recevier (which token withdraw to) + /// 3. `[]` SPL Token program id + /// 4. `[]` The faucet owner + /// 5. `[signer, writable]` The oracle's authority. Withdraw { /// withdraw amount amount: u64, - /// - seed: Vec, + /// program account nonced seed + seed: [u8; 32], }, } -impl Instruction { - /// Unpacks a byte buffer into a [Instruction](enum.Instruction.html). - pub fn unpack(input: &[u8]) -> Result { - use Error::InvalidInstruction; +impl Sealed for Instruction {} +impl Pack for Instruction { + const LEN: usize = 53; - let (&tag, rest) = input.split_first().ok_or(InvalidInstruction)?; - Ok(match tag { - 0 => { - let (submit_interval, rest) = rest.split_at(4); - - let submit_interval = submit_interval - .try_into() - .ok() - .map(u32::from_le_bytes) - .ok_or(InvalidInstruction)?; - - let (min_submission_value, rest) = rest.split_at(8); - let min_submission_value = min_submission_value - .try_into() - .ok() - .map(u64::from_le_bytes) - .ok_or(InvalidInstruction)?; - - let (max_submission_value, rest) = rest.split_at(8); - let max_submission_value = max_submission_value - .try_into() - .ok() - .map(u64::from_le_bytes) - .ok_or(InvalidInstruction)?; - - let (description, _rest) = rest.split_at(32); - let description = description - .try_into() - .ok() - .ok_or(InvalidInstruction)?; - - Self::Initialize { - submit_interval, - min_submission_value, - max_submission_value, - description, - } - - }, - 1 => { - let (&index, rest) = rest.split_first().ok_or(InvalidInstruction)?; - - let (description, _rest) = rest.split_at(32); - let description = description - .try_into() - .ok() - .ok_or(InvalidInstruction)?; - - Self::AddOracle { - index, description, - } - }, - 2 => { - let (&index, _rest) = rest.split_first().ok_or(InvalidInstruction)?; - Self::RemoveOracle { - index, - } - }, - 3 => { - let (submission, _rest) = rest.split_at(8); - let submission = submission - .try_into() - .ok() - .map(u64::from_le_bytes) - .ok_or(InvalidInstruction)?; - - Self::Submit { - submission, - } - }, - 4 => { - let (amount, rest) = rest.split_at(8); - let amount = amount - .try_into() - .ok() - .map(u64::from_le_bytes) - .ok_or(InvalidInstruction)?; - - - Self::Withdraw { - amount, seed: rest.to_vec(), - } - }, - _ => return Err(Error::InvalidInstruction.into()), - }) + fn pack_into_slice(&self, dst: &mut [u8]) { + let data = self.pack_into_vec(); + dst[..data.len()].copy_from_slice(&data); } -} \ No newline at end of file + fn unpack_from_slice(src: &[u8]) -> Result { + let mut mut_src: &[u8] = src; + Self::deserialize(&mut mut_src).map_err(|_| ProgramError::InvalidInstructionData) + } +} + +impl Instruction { + fn pack_into_vec(&self) -> Vec { + self.try_to_vec().expect("try_to_vec") + } +} + +/// Below is for test + +/// Creates a `intialize` instruction. +pub fn initialize( + program_id: &Pubkey, + aggregator_pubkey: &Pubkey, + aggregator_owner_pubkey: &Pubkey, + submit_interval: u32, + min_submission_value: u64, + max_submission_value: u64, + description: [u8; 32], +) -> Result { + + let data = Instruction::Initialize { + submit_interval, + min_submission_value, + max_submission_value, + description, + } + .try_to_vec().unwrap(); + + let accounts = vec![ + AccountMeta::new_readonly(sysvar::rent::id(), false), + AccountMeta::new(*aggregator_pubkey, false), + AccountMeta::new_readonly(*aggregator_owner_pubkey, true), + ]; + + Ok(SolInstruction { + program_id: *program_id, + accounts, + data, + }) +} + +/// Creates a `add_oralce` instruction +pub fn add_oracle( + program_id: &Pubkey, + oracle_pubkey: &Pubkey, + oracle_owner_pubkey: &Pubkey, + aggregator_pubkey: &Pubkey, + aggregator_owner_pubkey: &Pubkey, + index: u8, + description: [u8; 32] +) -> Result { + let data = Instruction::AddOracle { + index, + description, + } + .try_to_vec().unwrap(); + + let accounts = vec![ + AccountMeta::new(*oracle_pubkey, false), + AccountMeta::new(*oracle_owner_pubkey, false), + AccountMeta::new_readonly(sysvar::clock::id(), false), + AccountMeta::new(*aggregator_pubkey, false), + AccountMeta::new_readonly(*aggregator_owner_pubkey, true), + ]; + + Ok(SolInstruction { + program_id: *program_id, + accounts, + data, + }) +} + +/// Creates a `remove_oralce` instruction +pub fn remove_oracle( + program_id: &Pubkey, + aggregator_pubkey: &Pubkey, + aggregator_owner_pubkey: &Pubkey, + index: u8, +) -> Result { + let data = Instruction::RemoveOracle { + index, + } + .try_to_vec().unwrap(); + + let accounts = vec![ + AccountMeta::new(*aggregator_pubkey, false), + AccountMeta::new_readonly(*aggregator_owner_pubkey, true), + ]; + + Ok(SolInstruction { + program_id: *program_id, + accounts, + data, + }) +} + +/// Creates a `submit` instruction +pub fn submit( + program_id: &Pubkey, + aggregator_pubkey: &Pubkey, + oracle_pubkey: &Pubkey, + oracle_owner_pubkey: &Pubkey, + submission: u64, +) -> Result { + let data = Instruction::Submit { + submission, + } + .try_to_vec().unwrap(); + + let accounts = vec![ + AccountMeta::new(*aggregator_pubkey, false), + AccountMeta::new_readonly(sysvar::clock::id(), false), + AccountMeta::new(*oracle_pubkey, false), + AccountMeta::new_readonly(*oracle_owner_pubkey, true), + ]; + + Ok(SolInstruction { + program_id: *program_id, + accounts, + data, + }) +} + + +#[cfg(test)] +mod tests { + use super::*; + use crate::borsh_utils; + + #[test] + fn test_get_packed_len() { + assert_eq!( + Instruction::get_packed_len(), + borsh_utils::get_packed_len::() + ) + } + + #[test] + fn test_serialize_bytes() { + let test_instruction = Instruction::Initialize { + submit_interval: 6u32, + min_submission_value: 0u64, + max_submission_value: 9999u64, + description: [1u8; 32], + }; + + assert_eq!( + test_instruction.try_to_vec().unwrap(), + vec![ + 0, + 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 15, 39, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ], + ); + } + + #[test] + fn state_deserialize_invalid() { + assert_eq!( + Instruction::unpack_from_slice(&[ + 0, + 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 15, 39, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ]), + Ok(Instruction::Initialize { + submit_interval: 6u32, + min_submission_value: 0u64, + max_submission_value: 9999u64, + description: [1u8; 32], + }), + ); + + assert_eq!( + Instruction::unpack_from_slice(&[ + 4, + 15, 39, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ]), + Ok(Instruction::Withdraw { + amount: 9999u64, + seed: [1u8; 32], + }), + ); + } +} diff --git a/program/src/lib.rs b/program/src/lib.rs index f16d300..2077141 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -13,6 +13,7 @@ pub mod instruction; pub mod processor; pub mod error; pub mod state; +pub mod borsh_utils; #[cfg(not(feature = "no-entrypoint"))] pub mod entrypoint; diff --git a/program/src/processor.rs b/program/src/processor.rs index 216fc36..cc8d1d7 100644 --- a/program/src/processor.rs +++ b/program/src/processor.rs @@ -2,7 +2,7 @@ use crate::{ error::Error, - instruction::{Instruction, PAYMENT_AMOUNT}, + instruction::{Instruction, PAYMENT_AMOUNT, MAX_ORACLES}, state::{Aggregator, Oracle, Submission}, }; @@ -12,7 +12,7 @@ use solana_program::{ clock::{Clock}, decode_error::DecodeError, entrypoint::ProgramResult, - info, + msg, program_pack::{Pack}, program::{invoke_signed}, program_error::{PrintProgramError, ProgramError}, @@ -24,9 +24,10 @@ use solana_program::{ pub struct Processor {} impl Processor { + /// Processes an [Instruction](enum.Instruction.html). pub fn process(program_id: &Pubkey, accounts: &[AccountInfo], input: &[u8]) -> ProgramResult { - let instruction = Instruction::unpack(input)?; + let instruction = Instruction::unpack_from_slice(input)?; match instruction { Instruction::Initialize { @@ -35,7 +36,7 @@ impl Processor { max_submission_value, description, } => { - info!("Instruction: Initialize"); + msg!("Instruction: Initialize"); Self::process_initialize( program_id, accounts, submit_interval, min_submission_value, max_submission_value, description, @@ -45,7 +46,7 @@ impl Processor { index, description, } => { - info!("Instruction: AddOracle"); + msg!("Instruction: AddOracle"); Self::process_add_oracle( accounts, index, description, ) @@ -53,7 +54,7 @@ impl Processor { Instruction::RemoveOracle { index, } => { - info!("Instruction: RemoveOracle"); + msg!("Instruction: RemoveOracle"); Self::process_remove_oracle( accounts, index, ) @@ -61,7 +62,7 @@ impl Processor { Instruction::Submit { submission, } => { - info!("Instruction: Submit"); + msg!("Instruction: Submit"); Self::process_submit( accounts, submission, ) @@ -70,21 +71,15 @@ impl Processor { amount, seed, } => { - info!("Instruction: Withdraw"); + msg!("Instruction: Withdraw"); Self::process_withdraw( - accounts, amount, seed.as_slice(), + accounts, amount, seed, ) }, } } /// Processes an [Initialize](enum.Instruction.html) instruction. - /// - /// Accounts expected by this instruction: - /// - /// 1. `[]` Sysvar rent - /// 2. `[writable]` The aggregator - /// 3. `[signer]` The aggregator owner pub fn process_initialize( _program_id: &Pubkey, accounts: &[AccountInfo], @@ -121,7 +116,7 @@ impl Processor { aggregator.max_submission_value = max_submission_value; aggregator.description = description; aggregator.is_initialized = true; - aggregator.owner = *owner_info.key; + aggregator.owner = owner_info.key.to_bytes(); Aggregator::pack(aggregator, &mut aggregator_info.data.borrow_mut())?; @@ -129,16 +124,6 @@ impl Processor { } /// Processes an [AddOracle](enum.Instruction.html) instruction. - /// - /// @description: the oracle name - /// - /// Accounts expected by this instruction: - /// - /// 0. `[writable]` The oracle - /// 1. `[]` The oracle owner - /// 2. `[]` Clock sysvar - /// 3. `[writable]` The aggregator - /// 4. `[signer]` The aggregator owner pub fn process_add_oracle( accounts: &[AccountInfo], index: u8, @@ -158,14 +143,14 @@ impl Processor { let mut aggregator = Aggregator::unpack_unchecked(&aggregator_info.data.borrow())?; - if &aggregator.owner != aggregator_owner_info.key { - return Err(Error::OwnerMismatch.into()); - } - if !aggregator.is_initialized { return Err(Error::NotFoundAggregator.into()); } + if &Pubkey::new_from_array(aggregator.owner) != aggregator_owner_info.key { + return Err(Error::OwnerMismatch.into()); + } + let mut oracle = Oracle::unpack_unchecked(&oracle_info.data.borrow())?; if oracle.is_initialized { return Err(Error::AlreadyInUse.into()); @@ -176,25 +161,15 @@ impl Processor { let mut submissions = aggregator.submissions; - let submission = &mut submissions[index as usize]; - if submission.oracle == Pubkey::default() { - submission.oracle = *oracle_info.key; + let index = MAX_ORACLES.min(0.max(index as usize)); + + let submission = &mut submissions[index]; + if Pubkey::new_from_array(submission.oracle) == Pubkey::default() { + submission.oracle = oracle_info.key.to_bytes(); } else { return Err(Error::IndexHaveBeenUsed.into()); } - // // default submission - // for s in submissions.iter_mut() { - // if s.oracle == Pubkey::default() { - // *s = Submission { - // time: clock.unix_timestamp, - // value: 0, - // oracle: *oracle_info.key, - // }; - // break; - // } - // } - aggregator.submissions = submissions; Aggregator::pack(aggregator, &mut aggregator_info.data.borrow_mut())?; @@ -203,8 +178,8 @@ impl Processor { oracle.description = description; oracle.is_initialized = true; oracle.withdrawable = 0; - oracle.aggregator = *aggregator_info.key; - oracle.owner = *oracle_owner_info.key; + oracle.aggregator = aggregator_info.key.to_bytes(); + oracle.owner = oracle_owner_info.key.to_bytes(); Oracle::pack(oracle, &mut oracle_info.data.borrow_mut())?; @@ -212,13 +187,6 @@ impl Processor { } /// Processes an [RemoveOracle](enum.Instruction.html) instruction. - /// - /// @seat: the oracle's index of the aggregator - /// - /// Accounts expected by this instruction: - /// - /// 0. `[writable]` The aggregator. - /// 1. `[signer]` The aggregator onwer. pub fn process_remove_oracle( accounts: &[AccountInfo], index: u8, @@ -237,33 +205,21 @@ impl Processor { return Err(Error::NotFoundAggregator.into()); } - if &aggregator.owner != owner_info.key { + if &Pubkey::new_from_array(aggregator.owner) != owner_info.key { return Err(Error::OwnerMismatch.into()); } // remove submission let mut submissions = aggregator.submissions; + let index = MAX_ORACLES.min(0.max(index as usize)); - let submission = &mut submissions[index as usize]; - if submission.oracle != Pubkey::default() { + let submission = &mut submissions[index]; + if Pubkey::new_from_array(submission.oracle) != Pubkey::default() { *submission = Submission::default(); } else { return Err(Error::NotFoundOracle.into()); } - // let mut found = false; - // for s in submissions.iter_mut() { - // if s.oracle == oracle { - // *s = Submission::default(); - // found = true; - // break; - // } - // } - - // if !found { - // return Err(Error::NotFoundOracle.into()); - // } - aggregator.submissions = submissions; Aggregator::pack(aggregator, &mut aggregator_info.data.borrow_mut())?; @@ -271,14 +227,6 @@ impl Processor { } /// Processes an [Submit](enum.Instruction.html) instruction. - /// @submission: the updated data that the oracle is submitting - /// - /// Accounts expected by this instruction: - /// - /// 0. `[writable]` The aggregator(key). - /// 1. `[]` Clock sysvar - /// 2. `[writable]` The oracle key. - /// 3. `[signer]` The oracle owner. pub fn process_submit( accounts: &[AccountInfo], submission: u64, @@ -307,11 +255,11 @@ impl Processor { return Err(Error::NotFoundOracle.into()); } - if &oracle.owner != oracle_owner_info.key { + if &Pubkey::new_from_array(oracle.owner) != oracle_owner_info.key { return Err(Error::OwnerMismatch.into()); } - if &oracle.aggregator != aggregator_info.key { + if &Pubkey::new_from_array(oracle.aggregator) != aggregator_info.key { return Err(Error::AggregatorKeyNotMatch.into()); } @@ -321,7 +269,7 @@ impl Processor { let mut found = false; let mut submissions = aggregator.submissions; for s in submissions.iter_mut() { - if &s.oracle == oracle_info.key { + if &Pubkey::new_from_array(s.oracle) == oracle_info.key { s.value = submission; s.time = clock.unix_timestamp; found = true; @@ -334,7 +282,6 @@ impl Processor { } aggregator.submissions = submissions; - Aggregator::pack(aggregator, &mut aggregator_info.data.borrow_mut())?; if oracle.next_submit_time > clock.unix_timestamp { return Err(Error::SubmissonCooling.into()); @@ -344,29 +291,20 @@ impl Processor { oracle.withdrawable += PAYMENT_AMOUNT; oracle.next_submit_time = clock.unix_timestamp + aggregator.submit_interval as i64; + // update aggregator + Aggregator::pack(aggregator, &mut aggregator_info.data.borrow_mut())?; + + // update oracle Oracle::pack(oracle, &mut oracle_info.data.borrow_mut())?; Ok(()) } /// Processes an [Withdraw](enum.Instruction.html) instruction - /// Can only be called by the oracle admin - /// - /// @to: the address to send the token to - /// @amount: the amount of token to send - /// - /// Accounts expected by this instruction: - /// - /// 0. `[writable]` The aggregator (key). - /// 1. `[writable]` The faucet (which token transfer from) - /// 2. `[writable]` The recevier (which token withdraw to) - /// 3. `[]` SPL Token program id - /// 4. `[]` The faucet owner - /// 5. `[signer, writable]` The oracle's authority. pub fn process_withdraw( accounts: &[AccountInfo], amount: u64, - seed: &[u8], + seed: [u8; 32], ) -> ProgramResult { let account_info_iter = &mut accounts.iter(); let aggregator_info = next_account_info(account_info_iter)?; @@ -396,7 +334,7 @@ impl Processor { return Err(Error::InsufficientWithdrawable.into()); } - info!("Create transfer instruction..."); + msg!("Create transfer instruction..."); let instruction = spl_token::instruction::transfer( token_program_info.key, faucet_info.key, @@ -406,7 +344,7 @@ impl Processor { amount, )?; - info!("Invoke signed..."); + msg!("Invoke signed..."); invoke_signed( &instruction, &[ @@ -415,7 +353,7 @@ impl Processor { receiver_info.clone(), faucet_owner_info.clone(), ], - &[&[seed]] + &[&[seed.as_ref()]] )?; // update oracle @@ -433,18 +371,476 @@ impl PrintProgramError for Error { E: 'static + std::error::Error + DecodeError + PrintProgramError + FromPrimitive, { match self { - Error::InvalidInstruction => info!("Error: Invalid instruction"), - Error::AlreadyInUse => info!("Error: Already in use"), - Error::NotRentExempt => info!("Error: No rent exempt"), - Error::NotFoundAggregator => info!("Error: no found aggregator"), - Error::OracleAdded => info!("Error: Oracle added"), - Error::OwnerMismatch => info!("Error: Owner mismatch"), - Error::NotFoundOracle => info!("Error: Not found oracle"), - Error::SubmissonValueOutOfRange => info!("Error: Submisson value out of range"), - Error::SubmissonCooling => info!("Submission cooling"), - Error::InsufficientWithdrawable => info!("Insufficient withdrawable"), - Error::AggregatorKeyNotMatch => info!("Aggregator key not match"), - Error::IndexHaveBeenUsed => info!("Index have been used"), + Error::InvalidInstruction => msg!("Error: Invalid instruction"), + Error::AlreadyInUse => msg!("Error: Already in use"), + Error::NotRentExempt => msg!("Error: No rent exempt"), + Error::NotFoundAggregator => msg!("Error: no found aggregator"), + Error::OracleAdded => msg!("Error: Oracle added"), + Error::OwnerMismatch => msg!("Error: Owner mismatch"), + Error::NotFoundOracle => msg!("Error: Not found oracle"), + Error::SubmissonValueOutOfRange => msg!("Error: Submisson value out of range"), + Error::SubmissonCooling => msg!("Submission cooling"), + Error::InsufficientWithdrawable => msg!("Insufficient withdrawable"), + Error::AggregatorKeyNotMatch => msg!("Aggregator key not match"), + Error::IndexHaveBeenUsed => msg!("Index have been used"), } } +} + + +#[cfg(test)] +mod tests { + use super::*; + use crate::instruction::*; + use solana_program::{instruction::Instruction}; + use solana_sdk::account::{ + create_account, create_is_signer_account_infos, Account as SolanaAccount, + }; + + fn do_process_instruction( + instruction: Instruction, + accounts: Vec<&mut SolanaAccount>, + ) -> ProgramResult { + let mut meta = instruction + .accounts + .iter() + .zip(accounts) + .map(|(account_meta, account)| (&account_meta.pubkey, account_meta.is_signer, account)) + .collect::>(); + + let account_infos = create_is_signer_account_infos(&mut meta); + Processor::process(&instruction.program_id, &account_infos, &instruction.data) + } + + fn return_error_as_program_error() -> ProgramError { + Error::NotFoundAggregator.into() + } + + fn rent_sysvar() -> SolanaAccount { + create_account(&Rent::default(), 42) + } + + fn clock_sysvar() -> SolanaAccount { + create_account(&Clock::default(), 42) + } + + fn aggregator_minimum_balance() -> u64 { + Rent::default().minimum_balance(Aggregator::get_packed_len()) + } + + fn oracle_minimum_balance() -> u64 { + Rent::default().minimum_balance(Oracle::get_packed_len()) + } + + #[test] + fn test_print_error() { + let error = return_error_as_program_error(); + error.print::(); + } + + #[test] + #[should_panic(expected = "Custom(3)")] + fn test_error_unwrap() { + Err::<(), ProgramError>(return_error_as_program_error()).unwrap(); + } + + #[test] + fn test_pack_unpack() { + let check = Submission { + time: 1, + value: 1, + oracle: [1; 32], + }; + + let mut packed = vec![0; Submission::get_packed_len() + 1]; + + assert_eq!( + Err(ProgramError::InvalidAccountData), + Submission::pack(check, &mut packed) + ); + } + + #[test] + fn test_intialize() { + let program_id = Pubkey::new_unique(); + + let aggregator_key = Pubkey::new_unique(); + let owner_key = Pubkey::new_unique(); + + let mut rent_sysvar = rent_sysvar(); + let mut aggregator_account = SolanaAccount::new(42, Aggregator::get_packed_len(), &program_id); + let mut owner_account = SolanaAccount::default(); + + // aggregator is not rent exempt + assert_eq!( + Err(Error::NotRentExempt.into()), + do_process_instruction( + initialize( + &program_id, + &aggregator_key, + &owner_key, + 6, + 1, + 9999, + [1; 32] + ).unwrap(), + vec![ + &mut rent_sysvar, + &mut aggregator_account, + &mut owner_account, + ] + ) + ); + + aggregator_account.lamports = aggregator_minimum_balance(); + + // initialize will be successful + do_process_instruction( + initialize( + &program_id, + &aggregator_key, + &owner_key, + 6, + 1, + 9999, + [1; 32] + ).unwrap(), + vec![ + &mut rent_sysvar, + &mut aggregator_account, + &mut owner_account, + ] + ).unwrap(); + + // duplicate initialize will get failed + assert_eq!( + Err(Error::AlreadyInUse.into()), + do_process_instruction( + initialize( + &program_id, + &aggregator_key, + &owner_key, + 6, + 1, + 9999, + [1; 32] + ).unwrap(), + vec![ + &mut rent_sysvar, + &mut aggregator_account, + &mut owner_account, + ] + ) + ); + } + + #[test] + fn test_add_oracle() { + let program_id = Pubkey::new_unique(); + + let oracle_key = Pubkey::new_unique(); + let oracle_owner_key = Pubkey::new_unique(); + let aggregator_key = Pubkey::new_unique(); + let aggregator_owner_key = Pubkey::new_unique(); + + let mut rent_sysvar = rent_sysvar(); + let mut clock_sysvar = clock_sysvar(); + + let mut oracle_account = SolanaAccount::new( + oracle_minimum_balance(), + Oracle::get_packed_len(), + &program_id + ); + let mut aggregator_account = SolanaAccount::new( + aggregator_minimum_balance(), + Aggregator::get_packed_len(), + &program_id + ); + + let mut oracle_owner_account = SolanaAccount::default(); + let mut aggregator_owner_account = SolanaAccount::default(); + + // add oracle to unexist aggregator + assert_eq!( + Err(Error::NotFoundAggregator.into()), + do_process_instruction( + add_oracle( + &program_id, + &oracle_key, + &oracle_owner_key, + &aggregator_key, + &aggregator_owner_key, + 0, + [1; 32] + ).unwrap(), + vec![ + &mut oracle_account, + &mut oracle_owner_account, + &mut clock_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ) + ); + + // initialize aggregator + do_process_instruction( + initialize( + &program_id, + &aggregator_key, + &aggregator_owner_key, + 6, + 1, + 9999, + [1; 32] + ).unwrap(), + vec![ + &mut rent_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + + // will be successful + do_process_instruction( + add_oracle( + &program_id, + &oracle_key, + &oracle_owner_key, + &aggregator_key, + &aggregator_owner_key, + 0, + [1; 32] + ).unwrap(), + vec![ + &mut oracle_account, + &mut oracle_owner_account, + &mut clock_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + + // duplicate oracle + assert_eq!( + Err(Error::AlreadyInUse.into()), + do_process_instruction( + add_oracle( + &program_id, + &oracle_key, + &oracle_owner_key, + &aggregator_key, + &aggregator_owner_key, + 0, + [1; 32] + ).unwrap(), + vec![ + &mut oracle_account, + &mut oracle_owner_account, + &mut clock_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ) + ); + + } + + #[test] + fn test_remove_oracle() { + let program_id = Pubkey::new_unique(); + + let oracle_key = Pubkey::new_unique(); + let oracle_owner_key = Pubkey::new_unique(); + let aggregator_key = Pubkey::new_unique(); + let aggregator_owner_key = Pubkey::new_unique(); + + let mut rent_sysvar = rent_sysvar(); + let mut clock_sysvar = clock_sysvar(); + + let mut oracle_account = SolanaAccount::new( + oracle_minimum_balance(), + Oracle::get_packed_len(), + &program_id + ); + let mut aggregator_account = SolanaAccount::new( + aggregator_minimum_balance(), + Aggregator::get_packed_len(), + &program_id + ); + + let mut oracle_owner_account = SolanaAccount::default(); + let mut aggregator_owner_account = SolanaAccount::default(); + + // initialize aggregator + do_process_instruction( + initialize( + &program_id, + &aggregator_key, + &aggregator_owner_key, + 6, + 1, + 9999, + [1; 32] + ).unwrap(), + vec![ + &mut rent_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + + // add oracle (index 0) + do_process_instruction( + add_oracle( + &program_id, + &oracle_key, + &oracle_owner_key, + &aggregator_key, + &aggregator_owner_key, + 0, + [1; 32] + ).unwrap(), + vec![ + &mut oracle_account, + &mut oracle_owner_account, + &mut clock_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + + // remove an unexist oracle (index 1) + assert_eq!( + Err(Error::NotFoundOracle.into()), + do_process_instruction( + remove_oracle( + &program_id, + &aggregator_key, + &aggregator_owner_key, + 1 + ).unwrap(), + vec![ + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ) + ); + + // will be successful + do_process_instruction( + remove_oracle( + &program_id, + &aggregator_key, + &aggregator_owner_key, + 0 + ).unwrap(), + vec![ + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + } + + #[test] + fn test_submit() { + let program_id = Pubkey::new_unique(); + + let oracle_key = Pubkey::new_unique(); + let oracle_owner_key = Pubkey::new_unique(); + let aggregator_key = Pubkey::new_unique(); + let aggregator_owner_key = Pubkey::new_unique(); + + let mut rent_sysvar = rent_sysvar(); + let mut clock_sysvar = clock_sysvar(); + + let mut oracle_account = SolanaAccount::new( + oracle_minimum_balance(), + Oracle::get_packed_len(), + &program_id + ); + let mut aggregator_account = SolanaAccount::new( + aggregator_minimum_balance(), + Aggregator::get_packed_len(), + &program_id + ); + + let mut oracle_owner_account = SolanaAccount::default(); + let mut aggregator_owner_account = SolanaAccount::default(); + + // initialize aggregator + do_process_instruction( + initialize( + &program_id, + &aggregator_key, + &aggregator_owner_key, + 6, + 1, + 9999, + [1; 32] + ).unwrap(), + vec![ + &mut rent_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + + // add oracle (index 0) + do_process_instruction( + add_oracle( + &program_id, + &oracle_key, + &oracle_owner_key, + &aggregator_key, + &aggregator_owner_key, + 0, + [1; 32] + ).unwrap(), + vec![ + &mut oracle_account, + &mut oracle_owner_account, + &mut clock_sysvar, + &mut aggregator_account, + &mut aggregator_owner_account, + ] + ).unwrap(); + + // oracle submit + do_process_instruction( + submit( + &program_id, + &aggregator_key, + &oracle_key, + &oracle_owner_key, + 1 + ).unwrap(), + vec![ + &mut aggregator_account, + &mut clock_sysvar, + &mut oracle_account, + &mut oracle_owner_account, + ] + ).unwrap(); + + // submission cooling + assert_eq!( + Err(Error::SubmissonCooling.into()), + do_process_instruction( + submit( + &program_id, + &aggregator_key, + &oracle_key, + &oracle_owner_key, + 1 + ).unwrap(), + vec![ + &mut aggregator_account, + &mut clock_sysvar, + &mut oracle_account, + &mut oracle_owner_account, + ] + ) + ); + } } \ No newline at end of file diff --git a/program/src/state.rs b/program/src/state.rs index 645cbb3..7ff5345 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -1,18 +1,16 @@ //! State transition types +use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; use crate::instruction::{MAX_ORACLES}; -use arrayref::{array_mut_ref, array_ref, array_refs, mut_array_refs}; use solana_program::{ program_error::ProgramError, program_pack::{IsInitialized, Pack, Sealed}, - pubkey::Pubkey, clock::{UnixTimestamp}, }; /// Aggregator data. -#[repr(C)] -#[derive(Clone, Debug, Copy, Default, PartialEq)] +#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, BorshSchema, Default, PartialEq)] pub struct Aggregator { /// The interval(seconds) of an oracle's each submission pub submit_interval: u32, @@ -25,10 +23,9 @@ pub struct Aggregator { /// is initialized pub is_initialized: bool, /// authority - pub owner: Pubkey, + pub owner: [u8; 32], /// submissions pub submissions: [Submission; MAX_ORACLES], - } impl IsInitialized for Aggregator { @@ -39,73 +36,22 @@ impl IsInitialized for Aggregator { impl Sealed for Aggregator {} impl Pack for Aggregator { - const LEN: usize = 85 + MAX_ORACLES*48; - fn unpack_from_slice(src: &[u8]) -> Result { - let src = array_ref![src, 0, 85 + MAX_ORACLES*48]; - let ( - submit_interval, - min_submission_value, - max_submission_value, - description, - is_initialized, - owner, - submissions, - ) = array_refs![src, 4, 8, 8, 32, 1, 32, MAX_ORACLES*48]; - - let is_initialized = match is_initialized { - [0] => false, - [1] => true, - _ => return Err(ProgramError::InvalidAccountData), - }; - - Ok(Aggregator { - submit_interval: u32::from_le_bytes(*submit_interval), - min_submission_value: u64::from_le_bytes(*min_submission_value), - max_submission_value: u64::from_le_bytes(*max_submission_value), - description: *description, - is_initialized, - owner: Pubkey::new_from_array(*owner), - submissions: unpack_submissions(submissions), - }) - } + // 48 is submission packed length + const LEN: usize = 85 + MAX_ORACLES * 48; fn pack_into_slice(&self, dst: &mut [u8]) { - - let dst = array_mut_ref![dst, 0, 85 + MAX_ORACLES*48]; - let ( - submit_interval_dst, - min_submission_value_dst, - max_submission_value_dst, - description_dst, - is_initialized_dst, - owner_dst, - submissions_dst, - ) = mut_array_refs![dst, 4, 8, 8, 32, 1, 32, MAX_ORACLES*48]; + let data = self.try_to_vec().unwrap(); + dst[..data.len()].copy_from_slice(&data); + } - let &Aggregator { - submit_interval, - min_submission_value, - max_submission_value, - description, - is_initialized, - owner, - ref submissions, - } = self; - - *submit_interval_dst = submit_interval.to_le_bytes(); - *min_submission_value_dst = min_submission_value.to_le_bytes(); - *max_submission_value_dst = max_submission_value.to_le_bytes(); - *description_dst = description; - owner_dst.copy_from_slice(owner.as_ref()); - is_initialized_dst[0] = is_initialized as u8; - - pack_submissions(submissions, submissions_dst); + fn unpack_from_slice(src: &[u8]) -> Result { + let mut mut_src: &[u8] = src; + Self::deserialize(&mut mut_src).map_err(|_| ProgramError::InvalidAccountData) } } /// Oracle data. -#[repr(C)] -#[derive(Clone, Copy, Debug, Default, PartialEq)] +#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, BorshSchema, Default, PartialEq)] pub struct Oracle { /// submission pub submission: u64, @@ -118,9 +64,9 @@ pub struct Oracle { /// withdrawable pub withdrawable: u64, /// aggregator - pub aggregator: Pubkey, + pub aggregator: [u8; 32], /// owner - pub owner: Pubkey, + pub owner: [u8; 32], } impl IsInitialized for Oracle { @@ -132,110 +78,82 @@ impl IsInitialized for Oracle { impl Sealed for Oracle {} impl Pack for Oracle { const LEN: usize = 121; - fn unpack_from_slice(src: &[u8]) -> Result { - - let src = array_ref![src, 0, 121]; - let ( - submission, next_submit_time, description, is_initialized, - withdrawable, aggregator, owner, - ) = array_refs![src, 8, 8, 32, 1, 8, 32, 32]; - - let is_initialized = match is_initialized { - [0] => false, - [1] => true, - _ => return Err(ProgramError::InvalidAccountData), - }; - - Ok(Oracle { - submission: u64::from_le_bytes(*submission), - next_submit_time: i64::from_le_bytes(*next_submit_time), - description: *description, - is_initialized, - withdrawable: u64::from_le_bytes(*withdrawable), - aggregator: Pubkey::new_from_array(*aggregator), - owner: Pubkey::new_from_array(*owner), - }) + + fn pack_into_slice(&self, dst: &mut [u8]) { + let data = self.try_to_vec().unwrap(); + dst[..data.len()].copy_from_slice(&data); } - fn pack_into_slice(&self, dst: &mut [u8]) { - - let dst = array_mut_ref![dst, 0, 121]; - let ( - submission_dst, - next_submit_time_dst, - description_dst, - is_initialized_dst, - withdrawable_dst, - aggregator_dst, - owner_dst, - ) = mut_array_refs![dst, 8, 8, 32, 1, 8, 32, 32]; - - let &Oracle { - submission, - next_submit_time, - description, - is_initialized, - withdrawable, - aggregator, - owner, - } = self; - - *submission_dst = submission.to_le_bytes(); - *next_submit_time_dst = next_submit_time.to_le_bytes(); - *description_dst = description; - is_initialized_dst[0] = is_initialized as u8; - *withdrawable_dst = withdrawable.to_le_bytes(); - aggregator_dst.copy_from_slice(aggregator.as_ref()); - owner_dst.copy_from_slice(owner.as_ref()); + fn unpack_from_slice(src: &[u8]) -> Result { + let mut mut_src: &[u8] = src; + Self::deserialize(&mut mut_src).map_err(|_| ProgramError::InvalidAccountData) } } /// Submission data. -#[repr(C)] -#[derive(Clone, Copy, Debug, Default, PartialEq)] +#[derive(Clone, Copy, Debug, BorshSerialize, BorshDeserialize, BorshSchema, Default, PartialEq)] pub struct Submission { /// submit time pub time: UnixTimestamp, /// value pub value: u64, /// oracle - pub oracle: Pubkey, + pub oracle: [u8; 32], } -// Helpers -fn unpack_submissions(mut dst: &[u8]) -> [Submission; MAX_ORACLES] { - let mut arr = [Submission::default(); MAX_ORACLES]; - for i in 0 .. MAX_ORACLES { - let ( submission, rem ) = array_refs![dst, 48; ..;]; - - let ( time, value, oracle ) = array_refs![submission, 8, 8, 32]; - arr[i] = Submission { - time: i64::from_le_bytes(*time), - value: u64::from_le_bytes(*value), - oracle: Pubkey::new_from_array(*oracle), - }; - - dst = rem; +impl Sealed for Submission {} +impl Pack for Submission { + const LEN: usize = 48; + + fn pack_into_slice(&self, dst: &mut [u8]) { + let data = self.try_to_vec().unwrap(); + dst[..data.len()].copy_from_slice(&data); + } + + fn unpack_from_slice(src: &[u8]) -> Result { + let mut mut_src: &[u8] = src; + Self::deserialize(&mut mut_src).map_err(|_| ProgramError::InvalidAccountData) } - arr } -fn pack_submissions(src: &[Submission; MAX_ORACLES], mut dst: &mut [u8]) { - for i in 0 .. MAX_ORACLES { - let ( submission, rem ) = mut_array_refs![dst, 48; ..;]; - let ( - time_dst, - value_dst, - oracle_dst, - ) = mut_array_refs![&mut *submission, 8, 8, 32]; +#[cfg(test)] +mod tests { + use super::*; + use crate::borsh_utils; - let &Submission { time, value, oracle } = &src[i]; + #[test] + fn test_get_packed_len() { + assert_eq!( + Aggregator::get_packed_len(), + borsh_utils::get_packed_len::() + ); - *time_dst = time.to_le_bytes(); - *value_dst = value.to_le_bytes(); - oracle_dst.copy_from_slice(oracle.as_ref()); + assert_eq!( + Oracle::get_packed_len(), + borsh_utils::get_packed_len::() + ); - dst = rem; + assert_eq!( + Submission::get_packed_len(), + borsh_utils::get_packed_len::() + ); } + + #[test] + fn test_serialize_bytes() { + assert_eq!( + Submission { + time: 0, + value: 1, + oracle: [1; 32] + }.try_to_vec().unwrap(), + vec![ + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + ); + } + } \ No newline at end of file diff --git a/src/feed.ts b/src/feed.ts index b7939d0..8232188 100644 --- a/src/feed.ts +++ b/src/feed.ts @@ -78,8 +78,10 @@ export async function start(params: StartParams) { submission: BigInt(curPriceCent), owner: oracleOwner, }) - } catch(err) {} - + } catch(err) { + console.log(err) + } + console.log("submit success!") payerWallet.conn.getAccountInfo(oracle).then((accountInfo) => {