[
  {
    "path": ".github/workflows/lint-pr.yml",
    "content": "name: PR\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - edited\n      - synchronize\n\npermissions:\n  contents: read\n\njobs:\n  main:\n    name: Lint\n    permissions:\n      pull-requests: read  # for amannn/action-semantic-pull-request to analyze PRs\n      statuses: write  # for amannn/action-semantic-pull-request to mark status of analyzed PR\n    runs-on: ubuntu-latest\n    steps:\n      - uses: amannn/action-semantic-pull-request@v5.0.2\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Build Binary\n\non:\n  push:\n    tags:\n      # Regex for a version number such as 0.2.1\n      - \"[0-9]+.[0-9]+.[0-9]+\"\n\npermissions:\n  contents: write\n\njobs:\n  build-and-upload:\n    name: Build and upload\n    runs-on: ${{ matrix.os }}\n\n    strategy:\n      matrix:\n        # You can add more, for any target you'd like!\n        include:\n          - build: linux\n            os: ubuntu-latest\n            target: x86_64-unknown-linux-musl\n\n          - build: macos\n            os: macos-latest\n            target: x86_64-apple-darwin\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Get the release version from the tag\n        shell: bash\n        run: echo \"VERSION=${GITHUB_REF#refs/tags/}\" >> $GITHUB_ENV\n\n      - name: Install Rust\n        # Or @nightly if you want\n        uses: dtolnay/rust-toolchain@stable\n        # Arguments to pass in\n        with:\n          # Make Rust compile to our target (defined in the matrix)\n          targets: ${{ matrix.target }}\n\n      - name: Build\n        uses: actions-rs/cargo@v1\n        with:\n          use-cross: true\n          command: build\n          args: --verbose --release --target ${{ matrix.target }}\n\n      - name: Build archive\n        shell: bash\n        run: |\n          # Replace with the name of your binary\n          binary_name=\"anychain-bitcoin-cli\"\n\n          dirname=\"$binary_name-${{ env.VERSION }}-${{ matrix.target }}\"\n          mkdir \"$dirname\"\n          if [ \"${{ matrix.os }}\" = \"windows-latest\" ]; then\n            mv \"target/${{ matrix.target }}/release/$binary_name.exe\" \"$dirname\"\n          else\n            mv \"target/${{ matrix.target }}/release/$binary_name\" \"$dirname\"\n          fi\n\n          if [ \"${{ matrix.os }}\" = \"windows-latest\" ]; then\n            7z a \"$dirname.zip\" \"$dirname\"\n            echo \"ASSET=$dirname.zip\" >> $GITHUB_ENV\n          else\n            tar -czf \"$dirname.tar.gz\" \"$dirname\"\n            echo \"ASSET=$dirname.tar.gz\" >> $GITHUB_ENV\n          fi\n\n      - name: Release\n        uses: softprops/action-gh-release@v1\n        with:\n          files: |\n            ${{ env.ASSET }}"
  },
  {
    "path": ".github/workflows/rust.yml",
    "content": "name: Rust CI\n\non:\n  push:\n    branches: [ \"main\" ]\n  pull_request:\n    branches: [ \"main\" ]\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        rust-version: [ 1.95.0 ]\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n      - name: Cache Cargo dependencies\n        uses: actions/cache@v5\n        with:\n          path: |\n            ~/.cargo/bin/\n            ~/.cargo/registry/index/\n            ~/.cargo/registry/cache/\n            ~/.cargo/git/db/\n            target/\n          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-cargo-\n      - name: Install Protoc\n        uses: arduino/setup-protoc@v3\n      - name: Install Rust\n        uses: dtolnay/rust-toolchain@stable\n        with:\n          toolchain: ${{ matrix.rust-version }}\n      - name: Check formatting\n        run: cargo fmt -- --check\n      - name: cargo clippy\n        run: cargo clippy --workspace --all-targets --tests -- -D warnings\n      - name: Build and test\n        run: cargo test --all-features\n"
  },
  {
    "path": ".gitignore",
    "content": "# Generated by Cargo\n# will have compiled files and executables\ndebug/\ntarget/\n\n# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries\n# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html\n# Cargo.lock\n\n# These are backup files generated by rustfmt\n**/*.rs.bk\n\n# MSVC Windows builds of rustc generate these, which store debugging information\n*.pdb\n\n# intellij files\n.idea/\n.vscode/\n\n# MaxOS files\n.DS_Store\n*.swp\n\nbak/*\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[workspace]\nresolver = \"2\"\nmembers = [\n    \"crates/anychain-core\",\n    \"crates/anychain-bitcoin\",\n    \"crates/anychain-ethereum\",\n    \"crates/anychain-tron\",\n    \"crates/anychain-filecoin\",\n    \"crates/anychain-polkadot\",\n    \"crates/anychain-ripple\",\n    #\"crates/anychain-neo\",\n    \"crates/anychain-cardano\",\n    \"crates/anychain-kms\",\n    \"examples/*\",\n]\n\n[workspace.package]\nauthors = [\"Shawndslee\", \"cregis.com\"]\nedition = \"2021\"\nhomepage = \"https://www.cregis.com\"\nlicense = \"MIT/Apache-2.0\"\nrepository = \"https://github.com/0xcregis/anychain\"\n\n[workspace.dependencies]\nsha3 = \"0.10.1\"\nthiserror = \"1.0\"\nripemd = \"0.1.1\"\nblake2b_simd = \"1.0.0\"\nbech32 = \"0.9.0\"\nhex = \"0.4.2\"\nlibsecp256k1 = \"0.7.1\"\ned25519-dalek = { version = \"2\", features = [\"hazmat\"] }\n#ed25519-dalek = \"1.0.1\"\ncurve25519-dalek = { version = \"4.1.3\", features = [\"group\"] }\nbase58 = { version = \"0.2\" }\nrand = { version = \"0.8.6\" }\nrand_core = { version = \"0.6.3\", default-features = false }\nserde_json = { version = \"1.0\", default-features = false, features = [\"alloc\"] }\nsha2 = { version = \"0.10.8\", default-features = false }\nserde = { version = \"1.0\", default-features = false, features = [\"alloc\", \"derive\"] }\nlazy_static = \"1.4.0\"\nnum-bigint = \"0.4.3\"\nanyhow = \"1.0.75\"\nbase64 = \"0.21.5\"\n# bytes = \"1.0\"\nprotobuf = { version = \"=3.7.2\" }\nchrono = \"0.4\"\nclap = { version = \"4.4.7\", features = [\"derive\"] }\nrustc-hash = \"1.1.0\"\nhmac = \"0.12.1\"\npbkdf2 = { version = \"0.12.1\", default-features = false }\nunicode-normalization = \"0.1.22\"\nzeroize = { version = \"1.8.1\", default-features = false }\nonce_cell = { version = \"1.18.0\" }\nsubtle = { version = \"2\", default-features = false }\np256 = \"0.13.2\"\nbs58 = { version = \"0.4\", default-features = false, features = [\"check\", \"alloc\"] }\n# Ethereum\nethereum-types = \"0.13.1\"\nrlp = { version = \"0.5.2\", features = [\"derive\"] }\nethabi = \"17.2.0\"\nregex = { version = \"1.3\" }\nprimitive-types = { version = \"0.11.1\", features = [\"rlp\"] }\n# Cardano\ncml-chain = \"6.2.0\"\ncml-crypto = \"6.2.0\"\ncml-core = \"6.2.0\"\n# Filecoin\narbitrary = { version = \"1.4.1\", features = [\"derive\"] }\nbls-signatures = { version = \"0.15.0\" }\ncid = { version = \"0.11.2\" }\ndata-encoding = \"2.8.0\"\ndata-encoding-macro = \"0.1.17\"\nfvm_shared = { version = \"~4.8.2\" }\nfvm_ipld_encoding = \"0.5.4\"\nforest_encoding = \"0.2.2\"\nnum-derive = \"0.4.2\"\nnum-traits = { version = \"0.2.19\" }\nunsigned-varint = \"0.8.0\"\n\n[profile.release]\nstrip = true       # Automatically strip symbols from the binary\nopt-level = \"s\"    # Optimize for size\nlto = true         # Enable link time optimization\ncodegen-units = 1  # Maximize size reduction optimizations\n\n[workspace.lints.clippy]\nuninlined_format_args = \"allow\"\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) [2013] [taiyi-research-institute]\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "Makefile",
    "content": ".PHONY: all check clean\n\nall: build\n\ncheck: fmt test clippy\n\ntest:\n\t(command -v cargo-nextest && cargo nextest run --all-features --workspace) || cargo test --all-features --workspace\n\nfmt:\n\tcargo fmt --all -- --check\n\nclippy:\n\tcargo clippy --workspace --all-targets --tests -- -D warnings\n\nclean:\n\tcargo clean\n\nbuild:\n\tcargo build --release\n\nbuild-linux-server:\n\trustup target add x86_64-unknown-linux-musl\n\tcargo build --release --target x86_64-unknown-linux-musl\t\n\trustup target add aarch64-unknown-linux-musl\n\tcargo build --release --target aarch64-unknown-linux-musl\n\nbuild-ios:\n\trustup target add aarch64-apple-ios\n\tcargo build --release --target aarch64-apple-ios"
  },
  {
    "path": "README.md",
    "content": "## Anychain\n\n[![Rust CI](https://github.com/uduncloud/anychain/actions/workflows/rust.yml/badge.svg)](https://github.com/uduncloud/anychain/actions/workflows/rust.yml)\n\n### What is Anychain?\n\nAnychain is a multi-chain supported blockchain development framework designed to simplify interactions with various blockchains such as Ethereum, Bitcoin, Tron, and more. It provides a suite of tools and libraries that enable developers to easily create, manage, and operate blockchain addresses, transactions, and smart contracts.\n\n### What Can Anychain Do?\n\n- **Multi-Chain Support**: Interact with multiple blockchain platforms, allowing developers to use different blockchains within the same project.\n- **Address Management**: Easily create and verify blockchain addresses.\n- **Transaction Generation**: Generate and sign transactions, supporting various cryptocurrencies.\n- **Smart Contract Interaction**: Interact with smart contracts, call contract methods, and handle return values.\n- **Bandwidth Estimation**: Estimate the bandwidth required for transactions, helping developers optimize transaction costs.\n\n### Who Needs Anychain?\n\n- **Blockchain Developers**: Developers looking to quickly build applications that interact with multiple blockchains.\n- **Fintech Companies**: Companies that need to integrate various cryptocurrency payment and transaction functionalities.\n- **Blockchain Researchers**: Academics and researchers who want to experiment and study different blockchains.\n- **Startups**: Startups aiming to leverage blockchain technology to build innovative products.\n\n### Why Choose Anychain?\n\n- **Ease of Use**: Anychain offers a simple and intuitive API, allowing developers to get started quickly and reducing the learning curve.\n- **Flexibility**: Supports multiple blockchains, enabling developers to choose the most suitable chain based on their needs.\n- **Active Community**: Anychain has an active developer community that provides support and shares best practices.\n- **High Performance**: An optimized codebase ensures efficient transaction processing and low latency.\n\n### Features\n\n#### Common Traits when it comes to building transactions for different blockchains, they are\n* PublicKey\n* Address\n* Amount\n* Transaction\n* Network\n* Format\n\n#### Common crates used in building transactions for different blockchains, they are\n* base58\n* secp256k1\n* hex\n* rand\n\n### Functions\n\n* Build raw unsigned transactions for different blockchains according to parameters taken from the user of this library\n\n* Build signed transactions for different blockchains by merging the raw transaction and the corresponding signature \n  taken from the user of this library\n\n### Architecture & Design Doc\n\n\n```mermaid\nflowchart LR\n    A[iOS/Android App] --> |Link library| B[anychain-ffi-rust];\n    B --> |Wrap| C[anychain-bitcoin C library];\n    C --> |Implement| D[anychain-core];\n```\n\n[Design Principles for AnyChain Wallet SDK](docs/design-en.md)\n\n### Build the source\n\t\n    cargo build --release\n\n## Crates\n\n| Name                  | Description            | Crates.io                                                                            | Documentation                                                                           |\n|-----------------------|------------------------|--------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|\n| [`anychain-core`]     | Core types and traits. | [![Crates.io](https://img.shields.io/crates/v/anychain-core)][anychain-core]         | [![Documentation](https://shields.io/docsrs/anychain-core)][anychain-core-docs]         |\n| [`anychain-kms`]      | BIP32、BIP39.           | [![Crates.io](https://img.shields.io/crates/v/anychain-kms)][anychain-kms]           | [![Documentation](https://shields.io/docsrs/anychain-kms)][anychain-kms-docs]           |\n| [`anychain-bitcoin`]  | Bitcoin impl.          | [![Crates.io](https://img.shields.io/crates/v/anychain-bitcoin)][anychain-bitcoin]   | [![Documentation](https://shields.io/docsrs/anychain-bitcoin)][anychain-bitcoin-docs]   |\n| [`anychain-ethereum`] | Ethereum impl.         | [![Crates.io](https://img.shields.io/crates/v/anychain-ethereum)][anychain-ethereum] | [![Documentation](https://shields.io/docsrs/anychain-ethereum)][anychain-ethereum-docs] |\n| [`anychain-filecoin`] | Filecoin impl.         | [![Crates.io](https://img.shields.io/crates/v/anychain-filecoin)][anychain-filecoin] | [![Documentation](https://shields.io/docsrs/anychain-filecoin)][anychain-filecoin-docs] |\n| [`anychain-tron`]     | Tron impl.             | [![Crates.io](https://img.shields.io/crates/v/anychain-tron)][anychain-tron]         | [![Documentation](https://shields.io/docsrs/anychain-tron)][anychain-tron-docs]         |\n| [`anychain-ripple`]   | Ripple impl.           | [![Crates.io](https://img.shields.io/crates/v/anychain-ripple)][anychain-ripple]     | [![Documentation](https://shields.io/docsrs/anychain-ripple)][anychain-ripple-docs]     |\n| [`anychain-polkadot`] | Polkadot impl.         | [![Crates.io](https://img.shields.io/crates/v/anychain-polkadot)][anychain-polkadot] | [![Documentation](https://shields.io/docsrs/anychain-polkadot)][anychain-polkadot-docs] |\n| [`anychain-solana`]   | Solana impl.           | [![Crates.io](https://img.shields.io/crates/v/anychain-solana)][anychain-solana]     | [![Documentation](https://shields.io/docsrs/anychain-solana)][anychain-solana-docs]     |\n| [`anychain-ton`]      | Ton impl.              | [![Crates.io](https://img.shields.io/crates/v/anychain-ton)][anychain-ton]           | [![Documentation](https://shields.io/docsrs/anychain-solana)][anychain-solana-docs]     |\n\n## Supported Chains\n- Bitcoin\n- BitcoinCash\n- Dogecoin\n- Litecoin\n- Ethereum\n- Filecoin\n- Tron\n- Ripple\n- Arbitrum, Optimism, and Avalanche\n- Polkadot\n- Neo\n- Solana\n- Sui\n- Aptos\n- Sei\n- Ton\n \n## License\n\nThis project is licensed under the [MIT license][license].\n\n## Contact\n\nFeel free to join anychain sdk [Telegram](https://t.me/anychain_sdk) for discussions on code and research.\n\n[`anychain-core`]: https://github.com/0xcregis/anychain/tree/main/anychain-core\n[`anychain-kms`]: https://github.com/0xcregis/anychain/tree/main/anychain-kms\n[`anychain-bitcoin`]: https://github.com/0xcregis/anychain/tree/main/anychain-bitcoin\n[`anychain-ethereum`]: https://github.com/0xcregis/anychain/tree/main/anychain-ethereum\n[`anychain-filecoin`]: https://github.com/0xcregis/anychain/tree/main/anychain-filecoin\n[`anychain-tron`]: https://github.com/0xcregis/anychain/tree/main/anychain-tron\n[`anychain-ripple`]: https://github.com/0xcregis/anychain/tree/main/anychain-ripple\n[`anychain-polkadot`]: https://github.com/0xcregis/anychain/tree/main/anychain-polkadot\n[`anychain-solana`]: https://github.com/0xcregis/anychain-solana\n[`anychain-ton`]: https://github.com/0xcregis/anychain-ton\n[anychain-core]: https://crates.io/crates/anychain-core\n[anychain-kms]: https://crates.io/crates/anychain-kms\n[anychain-bitcoin]: https://crates.io/crates/anychain-bitcoin\n[anychain-ethereum]: https://crates.io/crates/anychain-ethereum\n[anychain-filecoin]: https://crates.io/crates/anychain-filecoin\n[anychain-tron]: https://crates.io/crates/anychain-tron\n[anychain-ripple]: https://crates.io/crates/anychain-ripple\n[anychain-polkadot]: https://crates.io/crates/anychain-polkadot\n[anychain-solana]: https://crates.io/crates/anychain-solana\n[anychain-ton]: https://crates.io/crates/anychain-ton\n[anychain-core-docs]: https://docs.rs/anychain-core\n[anychain-kms-docs]: https://docs.rs/anychain-kms\n[anychain-bitcoin-docs]: https://docs.rs/anychain-bitcoin\n[anychain-ethereum-docs]: https://docs.rs/anychain-ethereum\n[anychain-filecoin-docs]: https://docs.rs/anychain-filecoin\n[anychain-tron-docs]: https://docs.rs/anychain-tron\n[anychain-ripple-docs]: https://docs.rs/anychain-ripple\n[anychain-polkadot-docs]: https://docs.rs/anychain-polkadot\n[anychain-solana-docs]: https://docs.rs/anychain-solana\n[anychain-ton-docs]: https://docs.rs/anychain-ton\n[license]: https://github.com/0xcregis/anychain/blob/main/LICENSE\n"
  },
  {
    "path": "crates/anychain-bitcoin/Cargo.toml",
    "content": "[package]\nname = \"anychain-bitcoin\"\ndescription = \"A Rust library for Bitcoin-focused cryptocurrency wallets, enabling seamless transactions on the Bitcoin blockchain\"\nversion = \"0.1.15\"\nkeywords = [\"bitcoin\", \"blockchain\", \"wallet\", \"transactions\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\nbase58 = { workspace = true }\nbech32 = { workspace = true }\nserde = { workspace = true }\nsha2 = { workspace = true }\nhex = { workspace = true }\nthiserror = { workspace = true }\nlibsecp256k1 = { workspace = true }\nrand = { workspace = true }\n\n[features]\ndefault = [\"std\"]\nstd = [\"anychain-core/std\"]\n\n[lints]\nworkspace = true"
  },
  {
    "path": "crates/anychain-bitcoin/README.md",
    "content": "# anychain-bitcoin\n\nanychain-bitcoin is a Rust crate that provides a simple and efficient way to interact with the Bitcoin blockchain. This library aims to make it easy for developers to build applications that require Bitcoin data and functionality without having to deal with the complexities of the underlying protocol.\n\n## Features\n\n- Easy-to-use API for querying and interacting with the Bitcoin blockchain\n- Support for mainnet, testnet, and regtest networks\n- Efficient and optimized for performance\n- Comprehensive documentation and examples\n\n## Installation\n\nTo use anychain-bitcoin in your Rust project, add the following to your Cargo.toml file:\n```toml\n[dependencies]\nanychain-bitcoin = \"0.1.8\"\n```\n\nThen, import the crate in your code:\n```rust\nextern crate anychain_bitcoin;\n```\n\n## Usage\n\nHere's a simple example of how to use anychain-bitcoin to get the balance of a Bitcoin address:\nAddr\n\n```rust\nuse anychain_bitcoin::{Bitcoin, Address};\n\nfn main() {\n    let bitcoin = Bitcoin::new();\n    let address = Address::from_str(\"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\").unwrap();\n\n    let balance = bitcoin.get_balance(&address).unwrap();\n    println!(\"Balance: {} satoshis\", balance);\n}\n```\nFor more examples and detailed usage instructions, please refer to the [documentation](https://docs.rs/anychain-bitcoin).\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute to anychain-bitcoin, please follow these steps:\n\n1. Fork the repository\n2. Create a new branch for your changes\n3. Make your changes and commit them to your branch\n4. Submit a pull request to the main repository\n\nPlease make sure to write tests for your changes and follow the Rust coding style.\n\n## License\n\nanychain-bitcoin is licensed under the MIT License. See [LICENSE](LICENSE) for more information "
  },
  {
    "path": "crates/anychain-bitcoin/src/address.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, BitcoinPublicKey, Opcode, Prefix, WitnessProgram};\nuse anychain_core::{\n    crypto::{checksum, hash160},\n    Address, AddressError,\n};\nuse anychain_core::{no_std::*, PublicKey};\n\nuse base58::{FromBase58, ToBase58};\nuse bech32::{self, u5, FromBase32, ToBase32, Variant};\nuse core::hash::Hash;\nuse core::{fmt, marker::PhantomData, str::FromStr};\nuse sha2::{Digest, Sha256};\n\n/// Represents a Bitcoin address\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct BitcoinAddress<N: BitcoinNetwork> {\n    /// The Bitcoin address\n    address: String,\n    /// The format of the address\n    format: BitcoinFormat,\n    /// PhantomData\n    _network: PhantomData<N>,\n}\n\npub static BASE32_ENCODE_TABLE: [u8; 32] = [\n    b'q', b'p', b'z', b'r', b'y', b'9', b'x', b'8', b'g', b'f', b'2', b't', b'v', b'd', b'w', b'0',\n    b's', b'3', b'j', b'n', b'5', b'4', b'k', b'h', b'c', b'e', b'6', b'm', b'u', b'a', b'7', b'l',\n];\n\npub static BASE32_DECODE_TABLE: [i8; 128] = [\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    15, -1, 10, 17, 21, 20, 26, 30, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, 29, -1, 24, 13, 25, 9, 8, 23, -1, 18, 22, 31, 27, 19, -1, 1, 0, 3, 16, 11, 28, 12, 14, 6,\n    4, 2, -1, -1, -1, -1, -1,\n];\n\nfn checksum_bch(feed: Vec<u8>) -> [u8; 5] {\n    let mut c = 1u64;\n\n    for d in feed.iter() {\n        let c0 = (c >> 35) as u8;\n        c = ((c & 0x07ffffffff) << 5) ^ (*d as u64);\n\n        if c0 & 0x01 != 0 {\n            c ^= 0x98f2bc8e61;\n        }\n        if c0 & 0x02 != 0 {\n            c ^= 0x79b76d99e2;\n        }\n        if c0 & 0x04 != 0 {\n            c ^= 0xf33e5fb3c4;\n        }\n        if c0 & 0x08 != 0 {\n            c ^= 0xae2eabe2a8;\n        }\n        if c0 & 0x10 != 0 {\n            c ^= 0x1e4f43e470;\n        }\n    }\n\n    c ^= 1;\n\n    let mut ret = [0u8; 5];\n\n    for (i, byte) in ret.iter_mut().enumerate() {\n        *byte = (c >> (8 * i)) as u8;\n    }\n\n    ret\n}\n\nfn compute_checksum_bch(payload: &str, prefix: &str) -> Result<String, AddressError> {\n    let mut payload = payload.as_bytes().to_vec();\n    for byte in payload.clone() {\n        match BASE32_DECODE_TABLE.get(byte as usize) {\n            Some(val) if *val != -1 => {}\n            _ => {\n                return Err(AddressError::Message(format!(\n                    \"Invalid base32 character '{}' for Bitcoin cash\",\n                    byte as char\n                )))\n            }\n        }\n    }\n\n    payload\n        .iter_mut()\n        .for_each(|byte| *byte = BASE32_DECODE_TABLE[*byte as usize] as u8);\n\n    let prefix = prefix.as_bytes().to_vec();\n    let prefix: Vec<u8> = prefix.iter().map(|byte| byte & 0x1f).collect();\n    let template = vec![0u8; 8];\n\n    let mut feed = prefix;\n\n    feed.push(0);\n    feed.extend(&payload);\n    feed.extend(&template);\n\n    let mut chechsum = checksum_bch(feed).to_vec();\n    chechsum.reverse();\n\n    let chechsum: Vec<u8> = chechsum\n        .to_base32()\n        .iter()\n        .map(|byte| BASE32_ENCODE_TABLE[byte.to_u8() as usize])\n        .collect();\n\n    Ok(String::from_utf8(chechsum)?)\n}\n\nimpl<N: BitcoinNetwork> Address for BitcoinAddress<N> {\n    type SecretKey = libsecp256k1::SecretKey;\n    type Format = BitcoinFormat;\n    type PublicKey = BitcoinPublicKey<N>;\n\n    /// Returns the address corresponding to the given Bitcoin private key.\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        Self::PublicKey::from_secret_key(secret_key).to_address(format)\n    }\n\n    /// Returns the address corresponding to the given Bitcoin public key.\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Self::p2pkh(public_key),\n            BitcoinFormat::P2WSH => Err(AddressError::IncompatibleFormats(\n                String::from(\"non-script\"),\n                String::from(\"p2wsh address\"),\n            )),\n            BitcoinFormat::P2SH_P2WPKH => Self::p2sh_p2wpkh(public_key),\n            BitcoinFormat::Bech32 => Self::bech32(public_key),\n            BitcoinFormat::CashAddr => Self::cash_addr(public_key),\n        }\n    }\n}\n\nimpl<N: BitcoinNetwork> BitcoinAddress<N> {\n    /// Generate a P2PKH address from a hash160.\n    pub fn p2pkh_from_hash(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 20 {\n            return Err(AddressError::Message(\"Illegal hash160 length\".to_string()));\n        }\n\n        let mut data = [0u8; 25];\n        data[0] = N::to_address_prefix(BitcoinFormat::P2PKH)?.version();\n        data[1..21].copy_from_slice(hash);\n\n        let checksum = &checksum(&data[..21])[..4];\n        data[21..].copy_from_slice(checksum);\n\n        Ok(Self {\n            address: data.to_base58(),\n            format: BitcoinFormat::P2PKH,\n            _network: PhantomData,\n        })\n    }\n\n    /// Generate a P2SH_P2WPKH address from a hash160\n    pub fn p2sh_p2wpkh_from_hash(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 20 {\n            return Err(AddressError::Message(\"Illegal hash160 length\".to_string()));\n        }\n\n        let mut data = [0u8; 25];\n        data[0] = N::to_address_prefix(BitcoinFormat::P2SH_P2WPKH)?.version();\n        data[1..21].copy_from_slice(hash);\n\n        let checksum = &checksum(&data[..21])[..4];\n        data[21..].copy_from_slice(checksum);\n\n        Ok(Self {\n            address: data.to_base58(),\n            format: BitcoinFormat::P2SH_P2WPKH,\n            _network: PhantomData,\n        })\n    }\n\n    // Generate a P2WSH address in Bech32 format from a sha256 script hash\n    pub fn p2wsh_from_hash(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 32 {\n            return Err(AddressError::Message(\"Illegal sha256 length\".to_string()));\n        }\n\n        let v = N::to_address_prefix(BitcoinFormat::P2WSH)?.version();\n        let version = u5::try_from_u8(v)?;\n\n        let mut data = vec![version];\n\n        data.extend_from_slice(&hash.to_vec().to_base32());\n\n        let prefix = N::to_address_prefix(BitcoinFormat::Bech32)?.prefix();\n        let bech32 = bech32::encode(&prefix, data, Variant::Bech32)?;\n\n        Ok(Self {\n            address: bech32,\n            format: BitcoinFormat::P2WSH,\n            _network: PhantomData,\n        })\n    }\n\n    /// Generate a Bech32 address from a hash160\n    pub fn bech32_from_hash(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 20 {\n            return Err(AddressError::Message(\"Illegal hash160 length\".to_string()));\n        }\n\n        let data = [\n            vec![u5::try_from_u8(0)?], // version byte: 0\n            hash.to_base32(),\n        ]\n        .concat();\n\n        let prefix = N::to_address_prefix(BitcoinFormat::Bech32)?.prefix();\n        let bech32 = bech32::encode(&prefix, data, Variant::Bech32)?;\n\n        Ok(Self {\n            address: bech32,\n            format: BitcoinFormat::Bech32,\n            _network: PhantomData,\n        })\n    }\n\n    /// Generate a CashAddr address from a hash160\n    pub fn cash_addr_from_hash(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 20 {\n            return Err(AddressError::Message(\"Illegal hash160 length\".to_string()));\n        }\n\n        let mut payload = vec![0u8]; // payload starts with version byte: 0\n        payload.extend(hash);\n\n        let payload: Vec<u8> = payload\n            .to_base32()\n            .iter()\n            .map(|byte| BASE32_ENCODE_TABLE[byte.to_u8() as usize])\n            .collect();\n\n        let payload = String::from_utf8(payload)?;\n        let prefix = N::to_address_prefix(BitcoinFormat::CashAddr)?.prefix();\n        let checksum = compute_checksum_bch(&payload, &prefix)?;\n\n        Ok(Self {\n            address: format!(\"{}:{}{}\", prefix, payload, checksum),\n            format: BitcoinFormat::CashAddr,\n            _network: PhantomData,\n        })\n    }\n\n    // Generate a P2TR address in Bech32 format from a sha256 script hash\n    pub fn p2tr_from_hash(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 32 {\n            return Err(AddressError::Message(\"Illegal sha256 length\".to_string()));\n        }\n\n        let v = 1;\n        let version = u5::try_from_u8(v)?;\n\n        let mut data = vec![version];\n\n        data.extend_from_slice(&hash.to_vec().to_base32());\n\n        let prefix = N::to_address_prefix(BitcoinFormat::Bech32)?.prefix();\n        let bech32 = bech32::encode(&prefix, data, Variant::Bech32m)?;\n\n        Ok(Self {\n            address: bech32,\n            format: BitcoinFormat::Bech32,\n            _network: PhantomData,\n        })\n    }\n\n    /// Generate a P2PKH address from a given Bitcoin public key.\n    pub fn p2pkh(public_key: &<Self as Address>::PublicKey) -> Result<Self, AddressError> {\n        let hash = hash160(&public_key.serialize());\n        Self::p2pkh_from_hash(&hash)\n    }\n\n    // Generate a P2WSH address in Bech32 format from a given Bitcoin script\n    pub fn p2wsh(original_script: &[u8]) -> Result<Self, AddressError> {\n        let hash = Sha256::digest(original_script).to_vec();\n        Self::p2wsh_from_hash(&hash)\n    }\n\n    /// Generate a P2SH_P2WPKH address from a given Bitcoin public key.\n    pub fn p2sh_p2wpkh(public_key: &<Self as Address>::PublicKey) -> Result<Self, AddressError> {\n        let hash = hash160(&Self::create_redeem_script(public_key));\n        Self::p2sh_p2wpkh_from_hash(&hash)\n    }\n\n    /// Generate a Bech32 address from a given Bitcoin public key.\n    pub fn bech32(public_key: &<Self as Address>::PublicKey) -> Result<Self, AddressError> {\n        let hash = hash160(&public_key.serialize());\n        Self::bech32_from_hash(&hash)\n    }\n\n    /// Generate a CashAddr address from a given Bitcoin public key.\n    pub fn cash_addr(public_key: &<Self as Address>::PublicKey) -> Result<Self, AddressError> {\n        let hash = hash160(&public_key.serialize());\n        Self::cash_addr_from_hash(&hash)\n    }\n\n    /// Return the format of the Bitcoin address.\n    pub fn format(&self) -> BitcoinFormat {\n        self.format.clone()\n    }\n\n    /// Generate a redeem script from a given Bitcoin public key.\n    pub fn create_redeem_script(public_key: &<Self as Address>::PublicKey) -> [u8; 22] {\n        let mut redeem = [0u8; 22];\n        redeem[1] = Opcode::OP_PUSHBYTES_20 as u8;\n        redeem[2..].copy_from_slice(&hash160(&public_key.serialize()));\n        redeem\n    }\n\n    /// Decode the 'script_pub_key' to a bitcoin address\n    pub fn from_script_pub_key(script_pub_key: &[u8]) -> Result<Self, AddressError> {\n        if script_pub_key.len() == 25\n            && script_pub_key[0] == Opcode::OP_DUP as u8\n            && script_pub_key[1] == Opcode::OP_HASH160 as u8\n            && script_pub_key[2] == 20\n            && script_pub_key[23] == Opcode::OP_EQUALVERIFY as u8\n            && script_pub_key[24] == Opcode::OP_CHECKSIG as u8\n        {\n            // we are handling a p2pkh script\n            if N::NAME.starts_with(\"bitcoin cash\") {\n                BitcoinAddress::<N>::cash_addr_from_hash(&script_pub_key[3..23])\n            } else {\n                BitcoinAddress::<N>::p2pkh_from_hash(&script_pub_key[3..23])\n            }\n        } else if script_pub_key.len() == 23\n            && script_pub_key[0] == Opcode::OP_HASH160 as u8\n            && script_pub_key[1] == 20\n            && script_pub_key[22] == Opcode::OP_EQUAL as u8\n        {\n            // we are handling a p2sh_p2wpkh script\n            BitcoinAddress::<N>::p2sh_p2wpkh_from_hash(&script_pub_key[2..22])\n        } else if script_pub_key.len() == 34 && script_pub_key[0] == 0 && script_pub_key[1] == 32 {\n            // we are handling a p2wsh script\n            BitcoinAddress::<N>::p2wsh_from_hash(&script_pub_key[2..])\n        } else if script_pub_key.len() == 34 && script_pub_key[0] == 81 && script_pub_key[1] == 32 {\n            // we are handling a p2tr script\n            BitcoinAddress::<N>::p2tr_from_hash(&script_pub_key[2..])\n        } else if script_pub_key.len() == 22 && script_pub_key[0] == 0 && script_pub_key[1] == 20 {\n            // we are handling a bech32 script\n            BitcoinAddress::<N>::bech32_from_hash(&script_pub_key[2..])\n        } else {\n            Err(AddressError::Message(\n                \"Illegal utxo script public key\".to_string(),\n            ))\n        }\n    }\n}\n\nimpl<N: BitcoinNetwork> FromStr for BitcoinAddress<N> {\n    type Err = AddressError;\n\n    fn from_str(address: &str) -> Result<Self, Self::Err> {\n        if address.starts_with(\"bitcoincash\") || address.starts_with(\"bchtest\") {\n            // we are processing a bitcoin cash address in CashAddr format\n            let prefix = address.split(':').collect::<Vec<&str>>()[0];\n\n            // check if the address prefix corresponds to the correct network.\n            let _ = N::from_address_prefix(Prefix::from_prefix(prefix))?;\n\n            if address.len() != prefix.len() + 1 + 34 + 8 {\n                return Err(AddressError::InvalidCharacterLength(\n                    address.len() - prefix.len() - 1,\n                ));\n            }\n            let payload = &address[prefix.len() + 1..prefix.len() + 1 + 34];\n            let checksum_provided = &address[address.len() - 8..address.len()];\n\n            // check if the payload produces the provided checksum\n            let checksum_gen = compute_checksum_bch(payload, prefix)?;\n            if checksum_provided != checksum_gen {\n                return Err(AddressError::InvalidChecksum(\n                    checksum_provided.to_string(),\n                    checksum_gen,\n                ));\n            }\n\n            Ok(BitcoinAddress {\n                address: address.to_string(),\n                format: BitcoinFormat::CashAddr,\n                _network: PhantomData,\n            })\n        } else if address.starts_with(\"bc1\")\n            || address.starts_with(\"tb1\")\n            || address.starts_with(\"ltc1\")\n            || address.starts_with(\"tltc1\")\n        {\n            // we are processing an address in Bech32 format\n            let (hrp, data, _) = bech32::decode(address)?;\n\n            if data.is_empty() {\n                return Err(AddressError::InvalidAddress(address.to_owned()));\n            }\n\n            // check if the address prefix corresponds to the correct network.\n            let _ = N::from_address_prefix(Prefix::from_prefix(&hrp))?;\n\n            let version = data[0].to_u8();\n            let mut program = Vec::from_base32(&data[1..])?;\n\n            let mut data = vec![version, program.len() as u8];\n            data.append(&mut program);\n\n            // check if the witness program is valid.\n            let _ = WitnessProgram::new(data.as_slice())?;\n\n            Ok(Self {\n                address: address.to_string(),\n                format: BitcoinFormat::Bech32,\n                _network: PhantomData,\n            })\n        } else {\n            let has_uppercase = |s: &str| {\n                for c in s.chars() {\n                    if c.is_ascii_uppercase() {\n                        return true;\n                    }\n                }\n                false\n            };\n\n            if has_uppercase(address) {\n                // we are processing an address in p2pkh or p2sh_p2wpkh format\n                let data = address.from_base58()?;\n\n                if data.len() != 25 {\n                    return Err(AddressError::InvalidByteLength(data.len()));\n                }\n\n                let version = Prefix::from_version(data[0]);\n\n                // check if the address prefix corresponds to the correct network\n                let _ = N::from_address_prefix(version.clone())?;\n\n                let format = BitcoinFormat::from_address_prefix(version)?;\n\n                // check if the payload produces the provided checksum\n                match format {\n                    BitcoinFormat::P2PKH | BitcoinFormat::P2SH_P2WPKH => {\n                        let checksum_gen = &checksum(&data[..21])[..4];\n                        let checksum_provided = &data[21..];\n                        if *checksum_gen != *checksum_provided {\n                            return Err(AddressError::InvalidChecksum(\n                                [data[..21].to_vec(), checksum_gen.to_vec()]\n                                    .concat()\n                                    .to_base58(),\n                                address.to_string(),\n                            ));\n                        }\n                    }\n                    _ => {\n                        return Err(AddressError::Message(format!(\n                            \"Unrecognized version byte {}\",\n                            data[0],\n                        )))\n                    }\n                }\n\n                Ok(Self {\n                    address: address.to_string(),\n                    format,\n                    _network: PhantomData,\n                })\n            } else {\n                // we are processing a bitcoin cash address in CashAddr format without an explicit prefix\n                let prefix = N::to_address_prefix(BitcoinFormat::CashAddr)?.prefix();\n\n                if address.len() != 42 {\n                    return Err(AddressError::InvalidCharacterLength(address.len()));\n                }\n\n                let payload = &address[..34];\n                let checksum_provided = &address[34..];\n\n                // check if the payload produces the provided checksum\n                let checksum_gen = compute_checksum_bch(payload, &prefix)?;\n                if checksum_provided != checksum_gen {\n                    return Err(AddressError::InvalidChecksum(\n                        checksum_provided.to_string(),\n                        checksum_gen,\n                    ));\n                }\n\n                Ok(Self {\n                    address: address.to_string(),\n                    format: BitcoinFormat::CashAddr,\n                    _network: PhantomData,\n                })\n            }\n        }\n    }\n}\n\nimpl<N: BitcoinNetwork> fmt::Display for BitcoinAddress<N> {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", self.address)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{create_script_pub_key, network::*};\n    use anychain_core::{hex, Network};\n    use rand::thread_rng;\n\n    fn test_from_str<N: BitcoinNetwork>(expected_address: &str, expected_format: &BitcoinFormat) {\n        let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n        assert_eq!(expected_address, address.to_string());\n        assert_eq!(*expected_format, address.format);\n    }\n\n    fn test_to_str<N: BitcoinNetwork>(expected_address: &str, address: &BitcoinAddress<N>) {\n        assert_eq!(expected_address, address.to_string());\n    }\n\n    mod p2pkh_mainnet_compressed {\n        use super::*;\n\n        type N = Bitcoin;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"L2o7RUmise9WoxNzmnVZeK83Mmt5Nn1NBpeftbthG5nsLWCzSKVg\",\n                \"1GUwicFwsZbdE3XyJYjmPryiiuTiK7mZgS\",\n            ),\n            (\n                \"KzjKw25tuQoiDyQjUG38ZRNBdnfr5eMBnTsU4JahrVDwFCpRZP1J\",\n                \"1J2shZV5b53GRVmTqmr3tJhkVbBML29C1z\",\n            ),\n            (\n                \"L2N8YRtxNMAVFAtxBt9PFSADtdvbmzFFHLSU61CtLdhYhrCGPfWh\",\n                \"13TdfCiGPagApSJZu1o1Y3mpfqpp6oK2GB\",\n            ),\n            (\n                \"KwXH1Mu4FBtGN9nRn2VkBpienaVGZKvCAkZAdE96kK71dHR1oDRs\",\n                \"1HaeDGHf3A2Uxeh3sKjVLYTn1hnEyuzLjF\",\n            ),\n            (\n                \"KwN7qiBnU4GNhboBhuPaPaFingTDKU4r27pGggwQYz865TvBT74V\",\n                \"12WMrNLRosydPNNYM96dwk9jDv8rDRom3J\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::P2PKH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod p2pkh_mainnet_uncompressed {\n        use super::*;\n\n        type N = Bitcoin;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"5K9VY2kaJ264Pj4ygobGLk7JJMgZ2i6wQ9FFKEBxoFtKeAXPHYm\",\n                \"18Bap2Lh5HJckiZcg8SYXoF5iPxkUoCN8u\",\n            ),\n            (\n                \"5KiudZRwr9wH5auJaW66WK3CGR1UzL7ZXiicvZEEaFScbbEt9Qs\",\n                \"192JSK8wNP867JGxHNHay3obNSXqEyyhtx\",\n            ),\n            (\n                \"5KCxYELatMGyVZfZFcSAw1Hz4ngiURKS22x7ydNRxcXfUzhgWMH\",\n                \"1NoZQSmjYHUZMbqLerwmT4xfe8A6mAo8TT\",\n            ),\n            (\n                \"5KT9CMP2Kgh2Afi8GbmFAHJXsH5DhcpH9KY3aH4Hkv5W6dASy7F\",\n                \"1NyGFd49x4nqoau8RJvjf9tGZkoUNjwd5a\",\n            ),\n            (\n                \"5J4cXobHh2cF2MHpLvTFjEHZCtrNHzyDzKGE8LuST2VWP129pAE\",\n                \"17nsg1F155BR6ie2miiLrSnMhF8GWcGq6V\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::P2PKH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod p2pkh_testnet_compressed {\n        use super::*;\n\n        type N = BitcoinTestnet;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"cSCkpm1oSHTUtX5CHdQ4FzTv9qxLQWKx2SXMg22hbGSTNVcsUcCX\",\n                \"mwCDgjeRgGpfTMY1waYAJF2dGz4Q5XAx6w\",\n            ),\n            (\n                \"cNp5uMWdh68Nk3pwShjxsSwhGPoCYgFvE1ANuPsk6qhcT4Jvp57n\",\n                \"myH91eNrQKuuM7TeQYYddzL4URn6HiYbxW\",\n            ),\n            (\n                \"cN9aUHNMMLT9yqBJ3S5qnEPtP11nhT7ivkFK1FqNYQMozZPgMTjJ\",\n                \"mho8tsQtF7fx2bPKudMcXvGpUVYRHHiH4m\",\n            ),\n            (\n                \"cSRpda6Bhog5SUyot96HSwSzn7FZNWzudKzoCzkgZrf9hUaL3Ass\",\n                \"n3DgWHuAkg7eiPGH5gP8jeg3SbHBhuPJWS\",\n            ),\n            (\n                \"cTqLNf3iCaW61ofgmyf4ZxChUL8DZoCEPmNTCKRsexLSdNuGWQT1\",\n                \"mjhMXrTdq4X1dcqTaNDjwGdVaJEGBKpCRj\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::P2PKH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod p2pkh_testnet_uncompressed {\n        use super::*;\n\n        type N = BitcoinTestnet;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"934pVYUzZ7Sm4ZSP7MtXaQXAcMhZHpFHFBvzfW3epFgk5cWeYih\",\n                \"my55YLK4BmM8AyUW5px2HSSKL4yzUE5Pho\",\n            ),\n            (\n                \"91dTfyLPPneZA6RsAXqNuT6qTQdAuuGVCUjmBtzgd1Tnd4RQT5K\",\n                \"mw4afqNgGjn34okVmv9qH2WkvhfyTyNbde\",\n            ),\n            (\n                \"92GweXA6j4RCF3zHXGGy2ShJq6T7u9rrjmuYd9ktLHgNrWznzUC\",\n                \"moYi3FQZKtcc66edT3uMwVQCcswenpNscU\",\n            ),\n            (\n                \"92QAQdzrEDkMExM9hHV5faWqKTdXcTgXguRBcyAyYqFCjVzhDLE\",\n                \"mpRYQJ64ofurTCA3KKkaCjjUNqjYkUvB4w\",\n            ),\n            (\n                \"92H9Kf4ikaqNAJLc5tbwvbmiBWJzNDGtYmnvrigZeDVD3aqJ85Q\",\n                \"mvqRXtgQKqumMosPY3dLvhdYsQJV2AswkA\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::P2PKH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod p2sh_p2wpkh_mainnet {\n        use super::*;\n\n        type N = Bitcoin;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"L3YPi4msjWdkqiH3ojfg3nwDmNYBrDScAtcugYBJSgsc3HTcqqjP\",\n                \"38EMCierP738rgYVHjj1qJANHKgx1166TN\",\n            ),\n            (\n                \"KxxFoGgBdqqyGznT6he2wKYcFKm5urSANec7qjLeu3caEadSo5pv\",\n                \"3Kc9Vqzi4eUn42g1KWewVPvtTpWpUwjNFv\",\n            ),\n            (\n                \"KziUnVFNBniwmvei7JvNJNcQZ27TDZe5VNn7ieRNK7QgMEVfKdo9\",\n                \"3C2niRgmFP2kz47AAWASqq5nWobDke1AfJ\",\n            ),\n            (\n                \"Kx5veRe18jnV1rZiJA7Xerh5qLpwnbjV38r83sKcF1W9d1K2TGSp\",\n                \"3Pai7Ly86pddxxwZ7rUhXjRJwog4oKqNYK\",\n            ),\n            (\n                \"L4RrcBy6hZMw3xD4eAFXDTWPhasd9N3rYrYgfiR9pnGuLdv7UsWZ\",\n                \"3LW5tQGWBCiRLfCgk1FEUpwKoymFF8Lk7P\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::P2SH_P2WPKH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod p2sh_p2wpkh_testnet {\n        use super::*;\n\n        type N = BitcoinTestnet;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"cSoLwgnCNXck57BGxdGRV4SQ42EUExV6ykdMK1RKwcEaB9MDZWki\",\n                \"2N9e892o8DNZs25xHBwRPZLsrZK3dBsrH3d\",\n            ),\n            (\n                \"cQEUStvLToCNEQ6QGPyTmGFCTiMWWzQDkkj2tUPEiAzafybgUyu4\",\n                \"2MwX52EZPfK1sq12H3ikgTybrUvKG62b9rV\",\n            ),\n            (\n                \"cRv6jkNhTNEL7563ezNuwWP9W7gEcjh19YbmHtTbrDUQsXF5PjoG\",\n                \"2N2XaYpYxX6C6attRQ1NXJUgZdm861CPHJ7\",\n            ),\n            (\n                \"cNyZJwad53Y38RthGrmYyoHAtsT7cPisjW92HJ4RcAP1mC6xBpSm\",\n                \"2N3HzUQ4DzfEbxYp3XtpEKBBSdBS1uc2DLk\",\n            ),\n            (\n                \"cUqEZZwzvdWv6pmnWV5eb68hNeWt3jDZgtCGf66rqk3bnbsXArVE\",\n                \"2N5isk4qJHAKfLV987ePAqjLobJkrWVCuhj\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::P2SH_P2WPKH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod bech32_mainnet {\n        use super::*;\n\n        type N = Bitcoin;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"KyQ2StwnZ644hRLXdMrRUBGKT9WJcVVhnuzz2u528VHeAr5kFimR\",\n                \"bc1qztqceddvavsxdgju4cz6z42tawu444m8uttmxg\",\n            ),\n            (\n                \"L3aeYHnEBqNt6tKTgUyweY9HvZ3mcLMsq7KQZkSu9Mj8Z1JN9oC2\",\n                \"bc1q0s92yg9m0zqjjc07z5lhhlu3k6ue93fgzku2wy\",\n            ),\n            (\n                \"L3w7zoPzip7o6oXz3zVLNHbT2UyLBWuVG7uaEZDqneRjgjw9vmCE\",\n                \"bc1q7rzq3xup0hdklkg6p8harn97zszuqwuaqc9l8t\",\n            ),\n            (\n                \"L2C75eEmRTU8yWeSwtQ6xeumoNVmCb2uEMfzuo5dkdMwpUWwYtRU\",\n                \"bc1qgw90ly6jkpprh6g8atk5cxnwcavh4e0p2k3h65\",\n            ),\n            (\n                \"L2CJfT3w1VPDDLQfJKTmSb6gtSGyE1HxWYsitaq5Y1XLXTMC5Qmx\",\n                \"bc1qgfzgf6pzuk7y88zk54nxluzg6dv9jett9suzuf\",\n            ),\n        ];\n\n        const INVALID: [&str; 7] = [\n            \"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5\", // invalid checksum\n            \"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2\", // invalid witness version\n            \"bc1rw5uspcuh\",                               // invalid program length\n            \"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90\", // invalid program length\n            \"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P\", // invalid program length for witness version 0 (per BIP141)\n            \"bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du\", // invalid padding\n            \"bc1gmk9yu\",                            // empty data section\n        ];\n\n        #[test]\n        fn from_invalid_address() {\n            INVALID.iter().for_each(|invalid_bech32| {\n                assert!(BitcoinAddress::<N>::from_str(invalid_bech32).is_err());\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::Bech32);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod bech32_testnet {\n        use super::*;\n\n        type N = BitcoinTestnet;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"cVQmTtLoCjDJAXVj778xyww1ZbpJQt7Vq9sDt8Mdmw97Rg7TaNes\",\n                \"tb1qmkvfprg8pkr3apv9gyykmhe26fexyla076ss0g\",\n            ),\n            (\n                \"cTxHRG8MgrnSQstuMs5VnQcFBjrs67NmiJGo1kevnJDS7QFGLUAi\",\n                \"tb1qfe0dnfpxp4c9lfdjzvmf5q72jg83emgknmcxxd\",\n            ),\n            (\n                \"cSN1N2Vmhg9jPSUpXyQj8WbNUgeLHbC3Yj8SFX2N834YMepMwNZH\",\n                \"tb1qx4jm2s3ks5vadh2ja3flsn4ckjzhdxmxmmrrzx\",\n            ),\n            (\n                \"cMvmoqYYzr4dgzNZ22PvaqSnNx98evXc1b7m8FfK9SdCqhiWdP2c\",\n                \"tb1ql0g42pusevlgd0jh9gyr32s0h0pe96wpnrqg3m\",\n            ),\n            (\n                \"cVodD5ifcBjYVUs19GLwz6YzU2hUhdNagBx9QQcZp7TgjLuuFYn3\",\n                \"tb1qwnh7hu5qfrjsk9pyn3vvmzr48v4l8kp4ug0txn\",\n            ),\n        ];\n\n        const INVALID: [&str; 3] = [\n            \"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty\", // invalid hrp\n            \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7\", // Mixed case\n            \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv\",\n        ];\n\n        #[test]\n        fn from_invalid_address() {\n            INVALID.iter().for_each(|invalid_bech32| {\n                assert!(BitcoinAddress::<N>::from_str(invalid_bech32).is_err());\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str::<N>(address, &BitcoinFormat::Bech32);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    mod p2wsh_mainnet {\n        use super::*;\n\n        type N = Bitcoin;\n\n        #[test]\n        fn test_addr() {\n            let script = \"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\";\n            let script_hex = hex::decode(script).unwrap();\n            let new_address = BitcoinAddress::<N>::p2wsh(&script_hex).unwrap();\n            println!(\"address:{}\", new_address);\n        }\n    }\n\n    mod p2wsh_testnet {\n        use super::*;\n\n        type N = BitcoinTestnet;\n\n        const SCRIPTPAIRS: [(&str, &str); 2] = [\n            (\n                \"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\",\n                \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7\",\n            ),\n            (\n                \"210253be79afe84fd9342c1f52024379b6da6299ea98844aee23838e8e678a765f7cac\",\n                \"tb1qhmdep02f0jpjxs36ckyzjtfesknu8a8xmhnva7f3vw95t9g6q4ksaqhl9x\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            SCRIPTPAIRS.iter().for_each(|(script, address)| {\n                let script_hex = hex::decode(script).unwrap();\n                let new_address = BitcoinAddress::<N>::p2wsh(&script_hex).unwrap();\n                assert_eq!(new_address.to_string(), address.to_string());\n                assert_eq!(new_address.format, BitcoinFormat::P2WSH);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            SCRIPTPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = BitcoinAddress::<N>::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    #[test]\n    fn f() {\n        let secret_key = [\n            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,\n            1, 1, 1,\n        ];\n\n        let secret_key = libsecp256k1::SecretKey::parse(&secret_key).unwrap();\n\n        let formats = [\n            BitcoinFormat::P2PKH,\n            BitcoinFormat::P2SH_P2WPKH,\n            // BitcoinFormat::Bech32,\n            // BitcoinFormat::CashAddr\n        ];\n\n        for format in formats {\n            let address = BitcoinAddress::<Bitcoin>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\"{} {} address = \\n{}\\n\", Bitcoin::NAME, format, address);\n\n            let address =\n                BitcoinAddress::<BitcoinTestnet>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\n                \"{} {} address = \\n{}\\n\",\n                BitcoinTestnet::NAME,\n                format,\n                address\n            );\n\n            let address =\n                BitcoinAddress::<BitcoinCash>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\"{} {} address = \\n{}\\n\", BitcoinCash::NAME, format, address);\n\n            let address =\n                BitcoinAddress::<BitcoinCashTestnet>::from_secret_key(&secret_key, &format)\n                    .unwrap();\n            println!(\n                \"{} {} address = \\n{}\\n\",\n                BitcoinCashTestnet::NAME,\n                format,\n                address\n            );\n\n            let address =\n                BitcoinAddress::<Litecoin>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\"{} {} address = \\n{}\\n\", Litecoin::NAME, format, address);\n\n            let address =\n                BitcoinAddress::<LitecoinTestnet>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\n                \"{} {} address = \\n{}\\n\",\n                LitecoinTestnet::NAME,\n                format,\n                address\n            );\n\n            let address =\n                BitcoinAddress::<Dogecoin>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\"{} {} address = \\n{}\\n\", Dogecoin::NAME, format, address);\n\n            let address =\n                BitcoinAddress::<DogecoinTestnet>::from_secret_key(&secret_key, &format).unwrap();\n            println!(\n                \"{} {} address = \\n{}\\n\",\n                DogecoinTestnet::NAME,\n                format,\n                address\n            );\n        }\n    }\n\n    #[test]\n    fn ff() {\n        let addr1 = \"qzuu4gwvj0xjy4p7xj7n5gn4ewk4m3ujeqx3crgj59\";\n        let addr2 = \"qpkxa3xypl6rfp4nzewh9xrqnv90n2yxrcr0pmwas4\";\n        let addr3 = \"bchtest:qzuu4gwvj0xjy4p7xj7n5gn4ewk4m3ujeqx3crgj59\";\n        let addr4 = \"bitcoincash:qpkxa3xypl6rfp4nzewh9xrqnv90n2yxrcr0pmwas4\";\n        let addr5 = \"2MvtZ4txAvbaWRW2gXRmmrcUpQfsqNgpfUm\";\n\n        let addr1 = BitcoinAddress::<BitcoinCashTestnet>::from_str(addr1).unwrap();\n        let addr2 = BitcoinAddress::<BitcoinCash>::from_str(addr2).unwrap();\n        let addr3 = BitcoinAddress::<BitcoinCashTestnet>::from_str(addr3).unwrap();\n        let addr4 = BitcoinAddress::<BitcoinCash>::from_str(addr4).unwrap();\n        let addr5 = BitcoinAddress::<BitcoinTestnet>::from_str(addr5).unwrap();\n\n        println!(\n            \"address1 = {}\\naddress2 = {}\\naddress3 = {}\\naddress4 = {}\\naddress5 = {}\",\n            addr1, addr2, addr3, addr4, addr5,\n        );\n    }\n\n    #[test]\n    fn test_decode_script() {\n        let mut rng = thread_rng();\n\n        let sk = libsecp256k1::SecretKey::random(&mut rng);\n        let addr = BitcoinAddress::<Bitcoin>::from_secret_key(&sk, &BitcoinFormat::P2PKH).unwrap();\n        println!(\"{}\", addr);\n        let script = create_script_pub_key(&addr).unwrap();\n        let addr = BitcoinAddress::<Bitcoin>::from_script_pub_key(&script).unwrap();\n        println!(\"{}\", addr);\n\n        let sk = libsecp256k1::SecretKey::random(&mut rng);\n        let addr =\n            BitcoinAddress::<Bitcoin>::from_secret_key(&sk, &BitcoinFormat::P2SH_P2WPKH).unwrap();\n        println!(\"{}\", addr);\n        let script = create_script_pub_key(&addr).unwrap();\n        let addr = BitcoinAddress::<Bitcoin>::from_script_pub_key(&script).unwrap();\n        println!(\"{}\", addr);\n\n        let sk = libsecp256k1::SecretKey::random(&mut rng);\n        let addr = BitcoinAddress::<Bitcoin>::from_secret_key(&sk, &BitcoinFormat::Bech32).unwrap();\n        println!(\"{}\", addr);\n        let script = create_script_pub_key(&addr).unwrap();\n        let addr = BitcoinAddress::<Bitcoin>::from_script_pub_key(&script).unwrap();\n        println!(\"{}\", addr);\n\n        let sk = libsecp256k1::SecretKey::random(&mut rng);\n        let addr =\n            BitcoinAddress::<Bitcoin>::p2wsh_from_hash(&Sha256::digest(sk.serialize())).unwrap();\n        println!(\"{}\", addr);\n        let script = create_script_pub_key(&addr).unwrap();\n        let addr = BitcoinAddress::<Bitcoin>::from_script_pub_key(&script).unwrap();\n        println!(\"{}\", addr);\n\n        let sk = libsecp256k1::SecretKey::random(&mut rng);\n        let addr =\n            BitcoinAddress::<BitcoinCash>::from_secret_key(&sk, &BitcoinFormat::CashAddr).unwrap();\n        println!(\"{}\", addr);\n        let script = create_script_pub_key(&addr).unwrap();\n        let addr = BitcoinAddress::<BitcoinCash>::from_script_pub_key(&script).unwrap();\n        println!(\"{}\", addr);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/amount.rs",
    "content": "use anychain_core::{Amount, AmountError};\n\nuse core::fmt;\nuse serde::Serialize;\nuse std::ops::{Add, Sub};\n\n// Number of satoshis (base unit) per BTC\nconst COIN: i64 = 1_0000_0000;\n\n/// Represents the amount of Bitcoin in satoshis\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct BitcoinAmount(pub i64);\n\npub enum Denomination {\n    // sat\n    Satoshi,\n    // uBTC (bit)\n    MicroBit,\n    // mBTC\n    MilliBit,\n    // cBTC\n    CentiBit,\n    // dBTC\n    DeciBit,\n    // BTC\n    Bitcoin,\n}\n\nimpl Denomination {\n    /// The number of decimal places more than a satoshi.\n    fn precision(self) -> u32 {\n        match self {\n            Denomination::Satoshi => 0,\n            Denomination::MicroBit => 2,\n            Denomination::MilliBit => 5,\n            Denomination::CentiBit => 6,\n            Denomination::DeciBit => 7,\n            Denomination::Bitcoin => 8,\n        }\n    }\n}\n\nimpl fmt::Display for Denomination {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            match self {\n                Denomination::Satoshi => \"satoshi\",\n                Denomination::MicroBit => \"uBTC\",\n                Denomination::MilliBit => \"mBTC\",\n                Denomination::CentiBit => \"cBTC\",\n                Denomination::DeciBit => \"dBTC\",\n                Denomination::Bitcoin => \"BTC\",\n            }\n        )\n    }\n}\n\nimpl Amount for BitcoinAmount {}\n\nimpl BitcoinAmount {\n    /// The zero amount.\n    pub const ZERO: BitcoinAmount = BitcoinAmount(0);\n    /// Exactly one satoshi.\n    pub const ONE_SAT: BitcoinAmount = BitcoinAmount(1);\n    /// Exactly one bitcoin.\n    pub const ONE_BTC: BitcoinAmount = BitcoinAmount(COIN);\n\n    pub fn from_satoshi(satoshis: i64) -> Result<Self, AmountError> {\n        Ok(Self(satoshis))\n    }\n\n    pub fn from_ubtc(ubtc_value: i64) -> Result<Self, AmountError> {\n        let satoshis = ubtc_value * 10_i64.pow(Denomination::MicroBit.precision());\n\n        Self::from_satoshi(satoshis)\n    }\n\n    pub fn from_mbtc(mbtc_value: i64) -> Result<Self, AmountError> {\n        let satoshis = mbtc_value * 10_i64.pow(Denomination::MilliBit.precision());\n\n        Self::from_satoshi(satoshis)\n    }\n\n    pub fn from_cbtc(cbtc_value: i64) -> Result<Self, AmountError> {\n        let satoshis = cbtc_value * 10_i64.pow(Denomination::CentiBit.precision());\n\n        Self::from_satoshi(satoshis)\n    }\n\n    pub fn from_dbtc(dbtc_value: i64) -> Result<Self, AmountError> {\n        let satoshis = dbtc_value * 10_i64.pow(Denomination::DeciBit.precision());\n\n        Self::from_satoshi(satoshis)\n    }\n\n    pub fn from_btc(btc_value: i64) -> Result<Self, AmountError> {\n        let satoshis = btc_value * 10_i64.pow(Denomination::Bitcoin.precision());\n\n        Self::from_satoshi(satoshis)\n    }\n}\n\nimpl Add for BitcoinAmount {\n    type Output = Result<Self, AmountError>;\n    fn add(self, rhs: Self) -> Self::Output {\n        Self::from_satoshi(self.0 + rhs.0)\n    }\n}\n\nimpl Sub for BitcoinAmount {\n    type Output = Result<Self, AmountError>;\n    fn sub(self, rhs: Self) -> Self::Output {\n        Self::from_satoshi(self.0 - rhs.0)\n    }\n}\n\nimpl fmt::Display for BitcoinAmount {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn test_from_satoshi(sat_value: i64, expected_amount: BitcoinAmount) {\n        let amount = BitcoinAmount::from_satoshi(sat_value).unwrap();\n        assert_eq!(expected_amount, amount)\n    }\n\n    fn test_from_ubtc(ubtc_value: i64, expected_amount: BitcoinAmount) {\n        let amount = BitcoinAmount::from_ubtc(ubtc_value).unwrap();\n        assert_eq!(expected_amount, amount)\n    }\n\n    fn test_from_mbtc(mbtc_value: i64, expected_amount: BitcoinAmount) {\n        let amount = BitcoinAmount::from_mbtc(mbtc_value).unwrap();\n        assert_eq!(expected_amount, amount)\n    }\n\n    fn test_from_cbtc(cbtc_value: i64, expected_amount: BitcoinAmount) {\n        let amount = BitcoinAmount::from_cbtc(cbtc_value).unwrap();\n        assert_eq!(expected_amount, amount)\n    }\n\n    fn test_from_dbtc(dbtc_value: i64, expected_amount: BitcoinAmount) {\n        let amount = BitcoinAmount::from_dbtc(dbtc_value).unwrap();\n        assert_eq!(expected_amount, amount)\n    }\n\n    fn test_from_btc(btc_value: i64, expected_amount: BitcoinAmount) {\n        let amount = BitcoinAmount::from_btc(btc_value).unwrap();\n        assert_eq!(expected_amount, amount)\n    }\n\n    fn test_addition(a: &i64, b: &i64, result: &i64) {\n        let a = BitcoinAmount::from_satoshi(*a).unwrap();\n        let b = BitcoinAmount::from_satoshi(*b).unwrap();\n        let result = BitcoinAmount::from_satoshi(*result).unwrap();\n\n        assert_eq!(result, a.add(b).unwrap());\n    }\n\n    fn test_subtraction(a: &i64, b: &i64, result: &i64) {\n        let a = BitcoinAmount::from_satoshi(*a).unwrap();\n        let b = BitcoinAmount::from_satoshi(*b).unwrap();\n        let result = BitcoinAmount::from_satoshi(*result).unwrap();\n\n        assert_eq!(result, a.sub(b).unwrap());\n    }\n\n    pub struct AmountDenominationTestCase {\n        satoshi: i64,\n        micro_bit: i64,\n        milli_bit: i64,\n        centi_bit: i64,\n        deci_bit: i64,\n        bitcoin: i64,\n    }\n\n    mod valid_conversions {\n        use super::*;\n\n        const TEST_AMOUNTS: [AmountDenominationTestCase; 5] = [\n            AmountDenominationTestCase {\n                satoshi: 0,\n                micro_bit: 0,\n                milli_bit: 0,\n                centi_bit: 0,\n                deci_bit: 0,\n                bitcoin: 0,\n            },\n            AmountDenominationTestCase {\n                satoshi: 100000000,\n                micro_bit: 1000000,\n                milli_bit: 1000,\n                centi_bit: 100,\n                deci_bit: 10,\n                bitcoin: 1,\n            },\n            AmountDenominationTestCase {\n                satoshi: 100000000000,\n                micro_bit: 1000000000,\n                milli_bit: 1000000,\n                centi_bit: 100000,\n                deci_bit: 10000,\n                bitcoin: 1000,\n            },\n            AmountDenominationTestCase {\n                satoshi: 123456700000000,\n                micro_bit: 1234567000000,\n                milli_bit: 1234567000,\n                centi_bit: 123456700,\n                deci_bit: 12345670,\n                bitcoin: 1234567,\n            },\n            AmountDenominationTestCase {\n                satoshi: 2100000000000000,\n                micro_bit: 21000000000000,\n                milli_bit: 21000000000,\n                centi_bit: 2100000000,\n                deci_bit: 210000000,\n                bitcoin: 21000000,\n            },\n        ];\n\n        #[test]\n        fn test_satoshi_conversion() {\n            TEST_AMOUNTS.iter().for_each(|amounts| {\n                test_from_satoshi(amounts.satoshi, BitcoinAmount(amounts.satoshi))\n            });\n        }\n\n        #[test]\n        fn test_ubtc_conversion() {\n            TEST_AMOUNTS.iter().for_each(|amounts| {\n                test_from_ubtc(amounts.micro_bit, BitcoinAmount(amounts.satoshi))\n            });\n        }\n\n        #[test]\n        fn test_mbtc_conversion() {\n            TEST_AMOUNTS.iter().for_each(|amounts| {\n                test_from_mbtc(amounts.milli_bit, BitcoinAmount(amounts.satoshi))\n            });\n        }\n\n        #[test]\n        fn test_cbtc_conversion() {\n            TEST_AMOUNTS.iter().for_each(|amounts| {\n                test_from_cbtc(amounts.centi_bit, BitcoinAmount(amounts.satoshi))\n            });\n        }\n\n        #[test]\n        fn test_dbtc_conversion() {\n            TEST_AMOUNTS.iter().for_each(|amounts| {\n                test_from_dbtc(amounts.deci_bit, BitcoinAmount(amounts.satoshi))\n            });\n        }\n\n        #[test]\n        fn test_btc_conversion() {\n            TEST_AMOUNTS\n                .iter()\n                .for_each(|amounts| test_from_btc(amounts.bitcoin, BitcoinAmount(amounts.satoshi)));\n        }\n    }\n\n    mod valid_arithmetic {\n        use super::*;\n\n        const TEST_VALUES: [(i64, i64, i64); 7] = [\n            (0, 0, 0),\n            (1, 2, 3),\n            (100000, 0, 100000),\n            (123456789, 987654321, 1111111110),\n            (100000000000000, 2000000000000000, 2100000000000000),\n            (-100000000000000, -2000000000000000, -2100000000000000),\n            (1000000, -1000000, 0),\n        ];\n\n        #[test]\n        fn test_valid_addition() {\n            TEST_VALUES\n                .iter()\n                .for_each(|(a, b, c)| test_addition(a, b, c));\n        }\n\n        #[test]\n        fn test_valid_subtraction() {\n            TEST_VALUES\n                .iter()\n                .for_each(|(a, b, c)| test_subtraction(c, b, a));\n        }\n    }\n\n    mod test_invalid {\n        use super::*;\n\n        mod test_invalid_conversion {\n            use super::*;\n\n            const INVALID_TEST_AMOUNTS: [AmountDenominationTestCase; 4] = [\n                AmountDenominationTestCase {\n                    satoshi: 1,\n                    micro_bit: 1,\n                    milli_bit: 1,\n                    centi_bit: 1,\n                    deci_bit: 1,\n                    bitcoin: 1,\n                },\n                AmountDenominationTestCase {\n                    satoshi: 1,\n                    micro_bit: 10,\n                    milli_bit: 100,\n                    centi_bit: 1000,\n                    deci_bit: 1000000,\n                    bitcoin: 100000000,\n                },\n                AmountDenominationTestCase {\n                    satoshi: 123456789,\n                    micro_bit: 1234567,\n                    milli_bit: 1234,\n                    centi_bit: 123,\n                    deci_bit: 12,\n                    bitcoin: 1,\n                },\n                AmountDenominationTestCase {\n                    satoshi: 2100000000000000,\n                    micro_bit: 21000000000000,\n                    milli_bit: 21000000000,\n                    centi_bit: 2100000000,\n                    deci_bit: 210000000,\n                    bitcoin: 20999999,\n                },\n            ];\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_ubtc_conversion() {\n                INVALID_TEST_AMOUNTS.iter().for_each(|amounts| {\n                    test_from_ubtc(amounts.micro_bit, BitcoinAmount(amounts.satoshi))\n                });\n            }\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_mbtc_conversion() {\n                INVALID_TEST_AMOUNTS.iter().for_each(|amounts| {\n                    test_from_mbtc(amounts.milli_bit, BitcoinAmount(amounts.satoshi))\n                });\n            }\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_cbtc_conversion() {\n                INVALID_TEST_AMOUNTS.iter().for_each(|amounts| {\n                    test_from_cbtc(amounts.centi_bit, BitcoinAmount(amounts.satoshi))\n                });\n            }\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_dbtc_conversion() {\n                INVALID_TEST_AMOUNTS.iter().for_each(|amounts| {\n                    test_from_dbtc(amounts.deci_bit, BitcoinAmount(amounts.satoshi))\n                });\n            }\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_btc_conversion() {\n                INVALID_TEST_AMOUNTS.iter().for_each(|amounts| {\n                    test_from_btc(amounts.bitcoin, BitcoinAmount(amounts.satoshi))\n                });\n            }\n        }\n\n        mod invalid_arithmetic {\n            use super::*;\n\n            const TEST_VALUES: [(i64, i64, i64); 8] = [\n                (0, 0, 1),\n                (1, 2, 5),\n                (100000, 1, 100000),\n                (123456789, 123456789, 123456789),\n                (-1000, -1000, 2000),\n                (2100000000000000, 1, 2100000000000001),\n                (2100000000000000, 2100000000000000, 4200000000000000),\n                (-2100000000000000, -2100000000000000, -4200000000000000),\n            ];\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_addition() {\n                TEST_VALUES\n                    .iter()\n                    .for_each(|(a, b, c)| test_addition(a, b, c));\n            }\n\n            #[should_panic]\n            #[test]\n            fn test_invalid_subtraction() {\n                TEST_VALUES\n                    .iter()\n                    .for_each(|(a, b, c)| test_subtraction(a, b, c));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/format.rs",
    "content": "use crate::Prefix;\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Format};\n\nuse core::fmt;\nuse core::str::FromStr;\nuse serde::Serialize;\n\n/// Represents the format of a Bitcoin address\n#[derive(Serialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\n#[allow(non_camel_case_types)]\npub enum BitcoinFormat {\n    /// Pay-to-Pubkey Hash, e.g. 1NoZQSmjYHUZMbqLerwmT4xfe8A6mAo8TT\n    P2PKH,\n    /// Pay-to-Script Hash, e.g. 34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53\n    //P2SH,\n    /// Pay-to-Witness-Script Hash, e.g. bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3\n    P2WSH,\n    /// SegWit Pay-to-Witness-Public-Key Hash, e.g. 34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53\n    P2SH_P2WPKH,\n    /// Bech32, e.g. bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx\n    Bech32,\n    /// CashAddr, e.g. bitcoincash:qpkxa3xypl6rfp4nzewh9xrqnv90n2yxrcr0pmwas4\n    CashAddr,\n}\n\nimpl Format for BitcoinFormat {}\n\nimpl BitcoinFormat {\n    /// Returns the format of the given address prefix.\n    pub fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"bc\" | \"tb\" | \"ltc\" | \"tltc\" => Ok(Self::Bech32),\n                \"bitcoincash\" | \"bchtest\" => Ok(Self::CashAddr),\n                _ => Err(AddressError::Message(format!(\n                    \"Unrecognized address prefix {}\",\n                    prefix,\n                ))),\n            },\n            Prefix::Version(version) => match version {\n                0x00 | 0x6f | 0x1e | 0x71 | 0x30 => Ok(Self::P2PKH),\n                0x05 | 0xc4 | 0x16 | 0x32 | 0x3a => Ok(Self::P2SH_P2WPKH),\n                _ => Err(AddressError::Message(format!(\n                    \"Unrecognized version byte {}\",\n                    version,\n                ))),\n            },\n        }\n    }\n}\n\nimpl fmt::Display for BitcoinFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        match self {\n            BitcoinFormat::P2PKH => write!(f, \"p2pkh\"),\n            BitcoinFormat::P2WSH => write!(f, \"p2wsh\"),\n            BitcoinFormat::P2SH_P2WPKH => write!(f, \"p2sh_p2wpkh\"),\n            BitcoinFormat::Bech32 => write!(f, \"bech32\"),\n            BitcoinFormat::CashAddr => write!(f, \"cash_addr\"),\n        }\n    }\n}\n\nimpl FromStr for BitcoinFormat {\n    type Err = AddressError;\n\n    fn from_str(format: &str) -> Result<Self, AddressError> {\n        match format {\n            \"p2pkh\" => Ok(BitcoinFormat::P2PKH),\n            \"p2sh_p2wpkh\" => Ok(BitcoinFormat::P2SH_P2WPKH),\n            \"p2wsh\" => Ok(BitcoinFormat::P2WSH),\n            \"bech32\" => Ok(BitcoinFormat::Bech32),\n            \"cash_addr\" => Ok(BitcoinFormat::CashAddr),\n            _ => Err(AddressError::Message(format!(\n                \"Unrecognized bitcoin address format {}\",\n                format,\n            ))),\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/lib.rs",
    "content": "#![cfg_attr(not(feature = \"std\"), no_std)]\n#![warn(unused_extern_crates)]\n// #![forbid(unsafe_code)]\n\n#[macro_use]\nextern crate thiserror;\n\npub mod address;\npub use self::address::*;\n\npub mod format;\npub use self::format::*;\n\npub mod network;\npub use self::network::*;\n\npub mod public_key;\npub use self::public_key::*;\n\npub mod witness_program;\npub use self::witness_program::*;\n\npub mod transaction;\npub use self::transaction::*;\n\npub mod amount;\npub use self::amount::*;\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/bitcoin.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct Bitcoin;\n\nimpl Network for Bitcoin {\n    const NAME: &'static str = \"bitcoin\";\n}\n\nimpl BitcoinNetwork for Bitcoin {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0x05)),\n            BitcoinFormat::Bech32 => Ok(Prefix::AddressPrefix(\"bc\".to_string())),\n            f => Err(AddressError::Message(format!(\n                \"{} does not support address format {}\",\n                Self::NAME,\n                f,\n            ))),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x00 | 0x05 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"bc\" => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid Bech32 prefix for {} network\",\n                    Self::NAME,\n                ))),\n            },\n        }\n    }\n}\n\nimpl FromStr for Bitcoin {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for Bitcoin {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/bitcoin_testnet.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct BitcoinTestnet;\n\nimpl Network for BitcoinTestnet {\n    const NAME: &'static str = \"bitcoin testnet\";\n}\n\nimpl BitcoinNetwork for BitcoinTestnet {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x6f)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0xc4)),\n            BitcoinFormat::Bech32 => Ok(Prefix::AddressPrefix(\"tb\".to_string())),\n            f => Err(AddressError::Message(format!(\n                \"{} does not support address format {}\",\n                Self::NAME,\n                f,\n            ))),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x6f | 0xc4 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"tb\" => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid Bech32 prefix for {} network\",\n                    Self::NAME,\n                ))),\n            },\n        }\n    }\n}\n\nimpl FromStr for BitcoinTestnet {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for BitcoinTestnet {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/bitcoincash.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct BitcoinCash;\n\nimpl Network for BitcoinCash {\n    const NAME: &'static str = \"bitcoin cash\";\n}\n\nimpl BitcoinNetwork for BitcoinCash {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0x05)),\n            BitcoinFormat::Bech32 => Ok(Prefix::AddressPrefix(\"bc\".to_string())),\n            BitcoinFormat::CashAddr => Ok(Prefix::AddressPrefix(\"bitcoincash\".to_string())),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x00 | 0x05 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"bc\" | \"bitcoincash\" => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid Bech32 or CashAddr prefix for {} network\",\n                    Self::NAME,\n                ))),\n            },\n        }\n    }\n}\n\nimpl FromStr for BitcoinCash {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for BitcoinCash {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/bitcoincash_testnet.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct BitcoinCashTestnet;\n\nimpl Network for BitcoinCashTestnet {\n    const NAME: &'static str = \"bitcoin cash testnet\";\n}\n\nimpl BitcoinNetwork for BitcoinCashTestnet {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x6f)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0xc4)),\n            BitcoinFormat::Bech32 => Ok(Prefix::AddressPrefix(\"tb\".to_string())),\n            BitcoinFormat::CashAddr => Ok(Prefix::AddressPrefix(\"bchtest\".to_string())),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x6f | 0xc4 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"tb\" | \"bchtest\" => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid Bech32 or CashAddr prefix for {} network\",\n                    Self::NAME,\n                ))),\n            },\n        }\n    }\n}\n\nimpl FromStr for BitcoinCashTestnet {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for BitcoinCashTestnet {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/dogecoin.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct Dogecoin;\n\nimpl Network for Dogecoin {\n    const NAME: &'static str = \"dogecoin\";\n}\n\nimpl BitcoinNetwork for Dogecoin {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x1e)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0x16)),\n            f => Err(AddressError::Message(format!(\n                \"{} does not support address format {}\",\n                Self::NAME,\n                f,\n            ))),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x1e | 0x16 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            _ => Err(AddressError::Message(format!(\n                \"{} does not support address format Bech32 or CashAddr\",\n                Self::NAME,\n            ))),\n        }\n    }\n}\n\nimpl FromStr for Dogecoin {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for Dogecoin {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/dogecoin_testnet.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct DogecoinTestnet;\n\nimpl Network for DogecoinTestnet {\n    const NAME: &'static str = \"dogecoin testnet\";\n}\n\npub static mut LOOP: u8 = 0;\n\nimpl BitcoinNetwork for DogecoinTestnet {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x71)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0xc4)),\n            f => Err(AddressError::Message(format!(\n                \"{} does not support address format {}\",\n                Self::NAME,\n                f,\n            ))),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x71 | 0xc4 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            _ => Err(AddressError::Message(format!(\n                \"{} does not support address format Bech32 or CashAddr\",\n                Self::NAME,\n            ))),\n        }\n    }\n}\n\nimpl FromStr for DogecoinTestnet {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for DogecoinTestnet {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/litecoin.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct Litecoin;\n\nimpl Network for Litecoin {\n    const NAME: &'static str = \"litecoin\";\n}\n\nimpl BitcoinNetwork for Litecoin {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x30)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0x32)),\n            BitcoinFormat::Bech32 => Ok(Prefix::AddressPrefix(\"ltc\".to_string())),\n            f => Err(AddressError::Message(format!(\n                \"{} does not support address format {}\",\n                Self::NAME,\n                f,\n            ))),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x30 | 0x32 => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"ltc\" => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid Bech32 prefix for {} network\",\n                    Self::NAME,\n                ))),\n            },\n        }\n    }\n}\n\nimpl FromStr for Litecoin {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for Litecoin {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/litecoin_testnet.rs",
    "content": "use crate::{BitcoinFormat, BitcoinNetwork, Prefix};\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network, NetworkError};\n\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\npub struct LitecoinTestnet;\n\nimpl Network for LitecoinTestnet {\n    const NAME: &'static str = \"litecoin testnet\";\n}\n\nimpl BitcoinNetwork for LitecoinTestnet {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError> {\n        match format {\n            BitcoinFormat::P2PKH => Ok(Prefix::Version(0x6f)),\n            BitcoinFormat::P2WSH => Ok(Prefix::Version(0x00)),\n            BitcoinFormat::P2SH_P2WPKH => Ok(Prefix::Version(0x3a)),\n            BitcoinFormat::Bech32 => Ok(Prefix::AddressPrefix(\"tltc\".to_string())),\n            f => Err(AddressError::Message(format!(\n                \"{} does not support address format {}\",\n                Self::NAME,\n                f,\n            ))),\n        }\n    }\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError> {\n        match prefix {\n            Prefix::Version(version) => match version {\n                0x6f | 0x3a => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid version byte {:#0x} for {} network\",\n                    version,\n                    Self::NAME,\n                ))),\n            },\n            Prefix::AddressPrefix(prefix) => match prefix.as_str() {\n                \"tltc\" => Ok(Self),\n                _ => Err(AddressError::Message(format!(\n                    \"Invalid Bech32 prefix for {} network\",\n                    Self::NAME,\n                ))),\n            },\n        }\n    }\n}\n\nimpl FromStr for LitecoinTestnet {\n    type Err = NetworkError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            Self::NAME => Ok(Self),\n            _ => Err(NetworkError::InvalidNetwork(s.into())),\n        }\n    }\n}\n\nimpl fmt::Display for LitecoinTestnet {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", Self::NAME)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/network/mod.rs",
    "content": "use crate::format::BitcoinFormat;\nuse anychain_core::no_std::*;\nuse anychain_core::{AddressError, Network};\n\npub mod bitcoin;\npub use self::bitcoin::*;\n\npub mod bitcoin_testnet;\npub use self::bitcoin_testnet::*;\n\npub mod bitcoincash;\npub use self::bitcoincash::*;\n\npub mod bitcoincash_testnet;\npub use self::bitcoincash_testnet::*;\n\npub mod litecoin;\npub use self::litecoin::*;\n\npub mod litecoin_testnet;\npub use self::litecoin_testnet::*;\n\npub mod dogecoin;\npub use self::dogecoin::*;\n\npub mod dogecoin_testnet;\npub use self::dogecoin_testnet::*;\n\n/// The interface for a Bitcoin network.\npub trait BitcoinNetwork: Network {\n    /// Returns the address prefix of the given network.\n    fn to_address_prefix(format: BitcoinFormat) -> Result<Prefix, AddressError>;\n\n    /// Returns the network of the given address prefix.\n    fn from_address_prefix(prefix: Prefix) -> Result<Self, AddressError>;\n}\n\n#[derive(Clone)]\npub enum Prefix {\n    // address prefix of utxo compatible blockchains\n    AddressPrefix(String),\n    // version byte prepended to the hash160\n    Version(u8),\n}\n\nimpl Prefix {\n    pub fn version(self) -> u8 {\n        if let Self::Version(version) = self {\n            version\n        } else {\n            panic!(\"Attempt to get version byte from an AddressPrefix\");\n        }\n    }\n\n    pub fn prefix(self) -> String {\n        if let Self::AddressPrefix(prefix) = self {\n            prefix\n        } else {\n            panic!(\"Attempt to get prefix from a version\");\n        }\n    }\n\n    pub fn from_version(version: u8) -> Self {\n        Self::Version(version)\n    }\n\n    pub fn from_prefix(prefix: &str) -> Self {\n        Self::AddressPrefix(prefix.to_string())\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/public_key.rs",
    "content": "use crate::{BitcoinAddress, BitcoinFormat, BitcoinNetwork};\nuse anychain_core::{hex, Address, AddressError, PublicKey, PublicKeyError};\nuse core::{fmt, marker::PhantomData, str::FromStr};\n\n/// Represents a Bitcoin public key\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct BitcoinPublicKey<N: BitcoinNetwork> {\n    /// The ECDSA public key\n    public_key: libsecp256k1::PublicKey,\n    /// If true, the public key is serialized in compressed form\n    compressed: bool,\n    /// PhantomData\n    _network: PhantomData<N>,\n}\n\nimpl<N: BitcoinNetwork> PublicKey for BitcoinPublicKey<N> {\n    type SecretKey = libsecp256k1::SecretKey;\n    type Address = BitcoinAddress<N>;\n    type Format = BitcoinFormat;\n\n    /// Returns the address corresponding to the given public key.\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        Self {\n            public_key: libsecp256k1::PublicKey::from_secret_key(secret_key),\n            compressed: true,\n            _network: PhantomData,\n        }\n    }\n\n    /// Returns the address of the corresponding private key.\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError> {\n        Self::Address::from_public_key(self, format)\n    }\n}\n\nimpl<N: BitcoinNetwork> BitcoinPublicKey<N> {\n    /// Returns a public key given a secp256k1 public key.\n    pub fn from_secp256k1_public_key(\n        public_key: libsecp256k1::PublicKey,\n        compressed: bool,\n    ) -> Self {\n        Self {\n            public_key,\n            compressed,\n            _network: PhantomData,\n        }\n    }\n\n    /// Returns the secp256k1 public key of the public key.\n    pub fn to_secp256k1_public_key(&self) -> libsecp256k1::PublicKey {\n        self.public_key\n    }\n\n    /// Serialize the Bitcoin public key as a vector of u8\n    pub fn serialize(&self) -> Vec<u8> {\n        match self.compressed {\n            true => self.public_key.serialize_compressed().to_vec(),\n            false => self.public_key.serialize().to_vec(),\n        }\n    }\n\n    /// Returns `true` if the public key is in compressed form.\n    pub fn is_compressed(&self) -> bool {\n        self.compressed\n    }\n}\n\nimpl<N: BitcoinNetwork> FromStr for BitcoinPublicKey<N> {\n    type Err = PublicKeyError;\n\n    fn from_str(public_key: &str) -> Result<Self, Self::Err> {\n        let compressed = public_key.len() == 66;\n        let p = hex::decode(public_key)\n            .map_err(|error| PublicKeyError::Crate(\"hex\", format!(\"{:?}\", error)))?;\n        let public_key = libsecp256k1::PublicKey::parse_slice(&p, None)\n            .map_err(|error| PublicKeyError::Crate(\"libsecp256k1\", format!(\"{:?}\", error)))?;\n        Ok(Self {\n            public_key,\n            compressed,\n            _network: PhantomData,\n        })\n    }\n}\n\nimpl<N: BitcoinNetwork> fmt::Display for BitcoinPublicKey<N> {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        if self.compressed {\n            for s in &self.public_key.serialize_compressed()[..] {\n                write!(f, \"{:02x}\", s)?;\n            }\n        } else {\n            for s in &self.public_key.serialize()[..] {\n                write!(f, \"{:02x}\", s)?;\n            }\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::network::*;\n\n    fn test_to_address<N: BitcoinNetwork>(\n        expected_address: &BitcoinAddress<N>,\n        expected_format: &BitcoinFormat,\n        public_key: &BitcoinPublicKey<N>,\n    ) {\n        let address = public_key.to_address(expected_format).unwrap();\n        assert_eq!(*expected_address, address);\n    }\n\n    fn test_from_str<N: BitcoinNetwork>(\n        expected_public_key: &str,\n        expected_address: &str,\n        expected_compressed: bool,\n        expected_format: &BitcoinFormat,\n    ) {\n        let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n        let address = public_key.to_address(expected_format).unwrap();\n        assert_eq!(expected_public_key, public_key.to_string());\n        assert_eq!(expected_compressed, public_key.compressed);\n        assert_eq!(expected_address, address.to_string());\n        assert_eq!(*expected_format, address.format());\n    }\n\n    fn test_to_str<N: BitcoinNetwork>(expected_public_key: &str, public_key: &BitcoinPublicKey<N>) {\n        assert_eq!(expected_public_key, public_key.to_string());\n    }\n\n    mod p2pkh_mainnet_compressed {\n        use super::*;\n\n        type N = Bitcoin;\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"L5hax5dZaByC3kJ4aLrZgnMXGSQReqRDYNqM1VAeXpqDRkRjX42H\",\n                \"039ed714bf521e96e3f3609b74da898e44d0fb64ba68c62c57852470ffc28e3db5\",\n                \"1uNM6oivjCJU2RcsNbfooVwcPjDRhjW7U\",\n            ),\n            (\n                \"L4uNhZS86VLiKKGZZGNxwP7s67EfYfQ7S9bNnVfVbU9GBVVo2xoD\",\n                \"03a385ac59a31841764d55e7c8a243482a89073785524f0c45335afcf425d567b1\",\n                \"16sz5SMFeRfwaqY6wKzkiufwPmF1J7RhAx\",\n            ),\n            (\n                \"KyH2BrThuUnzSXxDrDxQbpK277HxZfwPxVaCs5cwbzDEVNno2nts\",\n                \"028fa046ccfbb4ff134a5e0e8969d8085c6e2a1a52d793d351d4ddf02cd43d64b2\",\n                \"17QAwDwsLpehmCqSQXdHZb8vpsYVDnX7ic\",\n            ),\n            (\n                \"KxEqpgCMencSHwiCG6xix9teUrB7JQNy2c7LKU56fZKZtP46nEca\",\n                \"02f7fb7e7d5dc97a5e1cd36b1ea3218234649f98f32cf08f45f8cd742860f676bf\",\n                \"1ESGcxbb96gQmJuEQsSapdk1jH6JaEnbU9\",\n            ),\n            (\n                \"L2gCQPMpS5PqGvcBFMtYRT5S5jAo6WaNL1aPLvY2JkykkKSkqtm5\",\n                \"02aad3c8ee3dc6753a5284c97124f0047b2af0b91ba256b6262e07fcc2630f6b7f\",\n                \"1MRCogND3SKqa4xRZNpSC6iQxtwCpvmzfE\",\n            ),\n        ];\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = BitcoinAddress::<N>::from_str(address).unwrap();\n                let public_key = BitcoinPublicKey::<N>::from_str(public_key).unwrap();\n                test_to_address(&address, &BitcoinFormat::P2PKH, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str::<N>(\n                        expected_public_key,\n                        expected_address,\n                        true,\n                        &BitcoinFormat::P2PKH,\n                    );\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n    }\n\n    mod p2pkh_mainnet_uncompressed {\n        use super::*;\n\n        type N = Bitcoin;\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"5KV26gjX4sYAkXvDnqZZuEyFUh1DKjgZ8wTKL7Fpm4ppJ8kpZQu\",\n                \"0489efe59c51e542f4cc7e2464ba3835d0a1a3daf351e70db57053c4712aca58796a933d1331078c364b94dd53aba2357a01f446c22efedcea8ebce2167a9e1df8\",\n                \"1KGHasyEpQZSHLea2GV3taTFZcw3uP7AAJ\"\n            ),\n            (\n                \"5JUfnMYvM4g94psa1p2MUfQptbiouXYbb5oskjY7mZ151rXDFTi\",\n                \"04cf0ead0ea5df0700a4f063edf40397b377147d99f8f9404606e80dd931c819d2b571ab64754d27e69de5226f316e2dcab9f8b3b706d08104bcfe06f0e6dc7ff3\",\n                \"1Ja8ReiHyPwNdWHZdJZVN9ZV6cNzC8DbTy\"\n            ),\n            (\n                \"5K2enrnWqJcQuHLeijT76YEqDagWo3cQLnPYk2CezrJ7A61QG5y\",\n                \"04a215f5764beef937296f6797407e51b8823eb418c3d65f48c0950ee775504c3539ca06ef419c7c70cbdf30930c25b5abb8040a89e089b786363c2bd78a07f464\",\n                \"1PvWPvCZV4mQACqXp3AsFvQHtyfq2eZG9c\"\n            ),\n            (\n                \"5JnV7DtVZvwbVeRLvXQSzyg5WxMYJMEQbJk8VoYhzDTz4tawudY\",\n                \"04005e271fa3305bac32c5951fb84b35303b1231817e538aa5af6b145faae409a01f9e8c0330f4901577aacd43682fe2af39e69dcfaa7cff7390c006b3b66e90ad\",\n                \"1FCHrsTrzxJy3sq1pQKLBQojuvYyMBzs4g\"\n            ),\n            (\n                \"5KVeWqioENjhaYZqXZX4nEfwEysJjXEvYfaeQx4pM2HK51ZW7Ur\",\n                \"04b6c8c8a6e9ad27366d8e6a0fa6c11f15ad7a8f15ac0c1d38c714df1f6b00b102773c7ebb0d718fc93808fdaf6c6b4ff6213909d50a94d5d6c8b472a9d1f30d99\",\n                \"1Hb6umXZs26hUZMt59nbkTAAfMpsmTkCBs\"\n            )\n        ];\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = BitcoinAddress::<N>::from_str(address).unwrap();\n                let public_key = BitcoinPublicKey::<N>::from_str(public_key).unwrap();\n                test_to_address(&address, &BitcoinFormat::P2PKH, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str::<N>(\n                        expected_public_key,\n                        expected_address,\n                        false,\n                        &BitcoinFormat::P2PKH,\n                    );\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n    }\n\n    mod p2pkh_testnet_compressed {\n        use super::*;\n\n        type N = BitcoinTestnet;\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"cNB6GpygWSZNRG5hotKjdAaNfgrzx984QYb2uj9rHpaCDkyy2aAz\",\n                \"02bc25a326a8fa59edd1a2adff51956ea3c61f404cff6e926225b3fe3b303561ac\",\n                \"mkerhifaLqJgAgrAjLomUStznPgVewNkka\",\n            ),\n            (\n                \"cW4GQXEykwWJHVfRH8u25MzpzaU5XQDekdpdQbj9f9V7PLm25m4n\",\n                \"02e21263a700b22c16088dc45fb10d38cc8c4ebb4cdcb612e6551d972b60aa2446\",\n                \"n3NUsMjN3D6EWZ5nKZLvHnVwaAxfybQDq9\",\n            ),\n            (\n                \"cSA6Mo1PYYK2uaDH22KoreQZdkSLobcrxZwnLcotDiYocCSjCVXy\",\n                \"0355210590fbe6dcb663c6166cd5cb169169e0d4bac76ce78d4ac29ddf683b2541\",\n                \"mzt1DhTJMzXarvJukPUxnfA1syVhDuZapf\",\n            ),\n            (\n                \"cUVDoLpgXFYZGmjoyMusNEZJ174wk8ggjyH2Uo7L5nB1w5werAjX\",\n                \"0259b863ba239379d6ebee4074b6f9c9f7f23a581ff529aa8d1431d94cb2f3cd99\",\n                \"mxe1oRLS21dEqt6H77GPGUx59Zj4ucUBbc\",\n            ),\n            (\n                \"cRhBWs3Bg9oXERSEY8GLaZjN7eb1FmkCnRdmwjCG2pVXVPUqXNiT\",\n                \"02826afccd44e32a9542f72a3a7753b99dbaf4a800bb70b6155510b1ce7a4bf607\",\n                \"mpvYGW4UNjYRaQ1adpE8ThYNXCVkWjhAPb\",\n            ),\n        ];\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = BitcoinAddress::<N>::from_str(address).unwrap();\n                let public_key = BitcoinPublicKey::<N>::from_str(public_key).unwrap();\n                test_to_address(&address, &BitcoinFormat::P2PKH, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str::<N>(\n                        expected_public_key,\n                        expected_address,\n                        true,\n                        &BitcoinFormat::P2PKH,\n                    );\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n    }\n\n    mod p2pkh_testnet_uncompressed {\n        use super::*;\n\n        type N = BitcoinTestnet;\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"93W1kMkD1kAfevtDQ3LWortt8zjKqSSqonLxPvWFqg57arcwUru\",\n                \"048bb370869871417660abdacebf25f786e69c6e861b1c11346071cc9ad69690c2dc19fd3965455afc9a662feef3432b88cc99e31fa30ba93993ca21322e43e894\",\n                \"n4jx6NanXkXu7XSZrXBMKsFccxcp35UtJv\"\n            ),\n            (\n                \"92FshhFbVnbtpbvpdzGmKEnNkToJnvm6L45LhDQqn1Kxjp8d4oR\",\n                \"04092301037dc083952053ccd320b5e12b30839fa0380d8a2c27547de4a527806962c5d1efc9e748cf6003fcc7ff0784caee9fa36d9b7ea330a613e4b71f8df0f9\",\n                \"n47WkmoSwebNXyvbkRdubZmFbGm5SbKh1A\"\n            ),\n            (\n                \"92PbnSrnyLzS2HBNy4Vh2zg9hkVrztdxxDFihz92rBDyX25xF8N\",\n                \"043e8f6512364e73a695f2b14b284a1c58ca9cbac2d8dd7dcf15f135260e87f1d0f89270f5a8d76b4e611861d68c955dc1524df4c20bb080bf0c0f536383379f91\",\n                \"n3TWdpM742F8mxkcWQw8h2cifxyy82V2ov\"\n            ),\n            (\n                \"92SbtaaCwUuHmzYGdi9xp5GbfUivbLHTAkqxeWaX88E1Q9HZJfs\",\n                \"0402acd5144558b5e779dead4c9e9b733e00b6e0554a243433bfccc730923a0beacd93f2b73c75f67d65fb830bde1cf101a8daea12ee3b659ef31fa274f52435d0\",\n                \"muFcYctkUkfWW55n2GMUafkw71kbZuduNv\"\n            ),\n            (\n                \"91sSacE166SmPMoysEfZrQmM9aHgSfZbEfjmMf6nY8qBgvQMB1i\",\n                \"04c8d1e7d88969b4345c874f50af41b8d310dd666c0a3df52c46c238a345fbda73165fccdedffb67390e87e81040bff8415b8d7c5a6bbc441c89841cb74012501d\",\n                \"mwSgCKvDt3SoBxa3RZB1kXbxzX3oMvXxvT\"\n            )\n        ];\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = BitcoinAddress::<N>::from_str(address).unwrap();\n                let public_key = BitcoinPublicKey::<N>::from_str(public_key).unwrap();\n                test_to_address(&address, &BitcoinFormat::P2PKH, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str::<N>(\n                        expected_public_key,\n                        expected_address,\n                        false,\n                        &BitcoinFormat::P2PKH,\n                    );\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n    }\n\n    mod p2sh_p2wpkh_mainnet {\n        use super::*;\n\n        type N = Bitcoin;\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"KyTx39W9vjeGRRjvZna5bbFGEpuih9pG5KBnxUJN7bChpGHHZuJN\",\n                \"02468791fee1444df3a6e786e2f9da79198f8902387e1fa5a2c051950c4df51ab4\",\n                \"3QKTruktKRSmY3QfhoijwT1BU1npSGMQPG\",\n            ),\n            (\n                \"L4EYurAwjsXiQrZ9XWdWdf5LDVAGAwGW58LtgZhGtR1cXUjS8oWD\",\n                \"024a185e896e5cf4cb0b441a18b5eac1a682e1848731449a5bb4c4a55c6d0fac3f\",\n                \"3JU5wvE4YrpZ5CgwpALBJB1C4YJjuZjXhj\",\n            ),\n            (\n                \"KyMSREGeHw2fnaRhTn1Cq9HYot9QR9AyUX6z8RbRF5Zr98qdmTjJ\",\n                \"0337893947d9738d6d026bd5fa86d3c563ebc5840916d0ea50b143a83db7ef9de7\",\n                \"3NzBJJPE3gaq5T9bmLJR4iHhmSHTgJdus4\",\n            ),\n            (\n                \"L5DtYc8LkDBQWWUAsWcgQZZqpVfUYCLyHZveGXKGT2hCS4pnnmqp\",\n                \"03eb86647457f2dfda66e7574d26cc4a6ecca472bc2ff331f333eb21614a0c58ee\",\n                \"3JUHwBJu1Figs4FesZPCgfBQKJC4GHjwPa\",\n            ),\n            (\n                \"L4GoufTyWZoy1WDzRDacywokD28C7amVH9Jyfsyr8XZpR8Pog7gK\",\n                \"025195d4c21c7001103649f0bfb37f61a0da1e345e5847b005dbd10f0b7b7f9e6f\",\n                \"3L6rBuHhf3MzY1qEXMxeyY18bo8H8uKb4D\",\n            ),\n        ];\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = BitcoinAddress::<N>::from_str(address).unwrap();\n                let public_key = BitcoinPublicKey::<N>::from_str(public_key).unwrap();\n                test_to_address(&address, &BitcoinFormat::P2SH_P2WPKH, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str::<N>(\n                        expected_public_key,\n                        expected_address,\n                        true,\n                        &BitcoinFormat::P2SH_P2WPKH,\n                    );\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n    }\n\n    mod p2sh_p2wpkh_testnet {\n        use super::*;\n\n        type N = BitcoinTestnet;\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"cPYtDeoeHg3wXp7hzcZ8Bu51HtN74yNdSDtdRuXamKCyzvU2oQM2\",\n                \"025718c5ebfbbb3566bf4757ca57822377eca9be9ace4d038052156dfe73f4c439\",\n                \"2Mt46mJZ8i7x2eiN77MekrD4UJg6GFt9mUh\",\n            ),\n            (\n                \"cMyPKTkYyhZS9cvrxkJZKFLEtqML6suBuDyZfFKXqGeHvnEPaD3x\",\n                \"0236cd9b36cc3e08bf457ff6663b66d049ad942253d52bd5d939ea654d872bd5f3\",\n                \"2MvRwrFLhxfwP96t6z6Th28No4Va19fogj3\",\n            ),\n            (\n                \"cTWWzheif86K9fouCo5gg1G4pEdGbLRrnHbY3uRr6AmhjKwNUrGh\",\n                \"021779b92c6a29c0bb554af8a059d51e08c900ca652fac13c1dab62da34016b722\",\n                \"2N1STUKnC6atTS2JttzdbP1891sCrD5i6xu\",\n            ),\n            (\n                \"cV2L63nMM3WZwrU9EKFFP218XAQBhsDmEQ9uTw3vhMAz25Gna9nF\",\n                \"032a1af62e21831cc0951daf4f2e8f457bc59a4dc716e86f066b4de40020c9c8f1\",\n                \"2N8mGnLgSL8GUyDELStD4YVGawdai52ax9q\",\n            ),\n            (\n                \"cTB6EeZgiGCziMQycbUCbn25AkipGACtY1Lyd1rAhGnTPEwHSHQT\",\n                \"027ebe9c4c3d976c490d34aad11d66558b052e6359925f8b33e51428dfdf59ad79\",\n                \"2N2JVpNUWsnV4MZMF11ewG2BVjhHoVNkv6K\",\n            ),\n        ];\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = BitcoinAddress::<N>::from_str(address).unwrap();\n                let public_key = BitcoinPublicKey::<N>::from_str(public_key).unwrap();\n                test_to_address(&address, &BitcoinFormat::P2SH_P2WPKH, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str::<N>(\n                        expected_public_key,\n                        expected_address,\n                        true,\n                        &BitcoinFormat::P2SH_P2WPKH,\n                    );\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = BitcoinPublicKey::<N>::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n    }\n\n    #[test]\n    fn test_p2pkh_invalid() {\n        type N = Bitcoin;\n\n        // Invalid public key length\n\n        let public_key = \"0\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key = \"039ed714bf521e96e3f3609b74da898e44\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key = \"039ed714bf521e96e3f3609b74da898e44d0fb64ba68c62c57852470ffc28e3db\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key =\n            \"039ed714bf521e96e3f3609b74da898e44d0fb64ba68c62c57852470ffc28e3db5039ed714bf521e96e3f3609b74da898e44\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key = \"039ed714bf521e96e3f3609b74da898e44d0fb64ba68c62c57852470ffc28e3db5039ed714bf521e96e3f3609b74da898e44d0fb64ba68c62c57852470ffc28e3db5\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n    }\n\n    #[test]\n    fn test_p2sh_p2wpkh_invalid() {\n        type N = Bitcoin;\n\n        // Invalid public key length\n\n        let public_key = \"0\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key = \"02468791fee1444df3a6e786e2f9da79198\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key = \"02468791fee1444df3a6e786e2f9da79198f8902387e1fa5a2c051950c4df51ab\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key =\n            \"02468791fee1444df3a6e786e2f9da79198f8902387e1fa5a2c051950c4df51ab402468791fee1444df3a6e786e2f9da79198\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n\n        let public_key = \"02468791fee1444df3a6e786e2f9da79198f8902387e1fa5a2c051950c4df51ab402468791fee1444df3a6e786e2f9da79198f8902387e1fa5a2c051950c4df51ab4\";\n        assert!(BitcoinPublicKey::<N>::from_str(public_key).is_err());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/transaction.rs",
    "content": "use crate::{\n    BitcoinAddress, BitcoinAmount, BitcoinFormat, BitcoinNetwork, BitcoinPublicKey, WitnessProgram,\n    BASE32_DECODE_TABLE,\n};\nuse anychain_core::{\n    crypto::checksum as double_sha2, Transaction, TransactionError, TransactionId,\n};\nuse anychain_core::{\n    hex,\n    no_std::{io::Read, *},\n    PublicKey,\n};\nuse libsecp256k1::Signature;\n\nuse base58::FromBase58;\nuse bech32::{u5, FromBase32};\nuse core::{fmt, str::FromStr};\nuse serde::Serialize;\npub use sha2::{Digest, Sha256};\n\n/// Returns the variable length integer of the given value.\n/// `<https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer>`\npub fn variable_length_integer(value: u64) -> Result<Vec<u8>, TransactionError> {\n    match value {\n        // bounded by u8::max_value()\n        0..=252 => Ok(vec![value as u8]),\n        // bounded by u16::max_value()\n        253..=65535 => Ok([vec![0xfd], (value as u16).to_le_bytes().to_vec()].concat()),\n        // bounded by u32::max_value()\n        65536..=4294967295 => Ok([vec![0xfe], (value as u32).to_le_bytes().to_vec()].concat()),\n        // bounded by u64::max_value()\n        _ => Ok([vec![0xff], value.to_le_bytes().to_vec()].concat()),\n    }\n}\n\n/// Decode the value of a variable length integer.\n/// `<https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer>`\npub fn read_variable_length_integer<R: Read>(mut reader: R) -> Result<usize, TransactionError> {\n    let mut flag = [0u8; 1];\n    let _ = reader.read(&mut flag)?;\n\n    match flag[0] {\n        0..=252 => Ok(flag[0] as usize),\n        0xfd => {\n            let mut size = [0u8; 2];\n            let _ = reader.read(&mut size)?;\n            match u16::from_le_bytes(size) {\n                s if s < 253 => Err(TransactionError::InvalidVariableSizeInteger(s as usize)),\n                s => Ok(s as usize),\n            }\n        }\n        0xfe => {\n            let mut size = [0u8; 4];\n            let _ = reader.read(&mut size)?;\n            match u32::from_le_bytes(size) {\n                s if s < 65536 => Err(TransactionError::InvalidVariableSizeInteger(s as usize)),\n                s => Ok(s as usize),\n            }\n        }\n        _ => {\n            let mut size = [0u8; 8];\n            let _ = reader.read(&mut size)?;\n            match u64::from_le_bytes(size) {\n                s if s < 4294967296 => {\n                    Err(TransactionError::InvalidVariableSizeInteger(s as usize))\n                }\n                s => Ok(s as usize),\n            }\n        }\n    }\n}\n\npub struct BitcoinVector;\n\nimpl BitcoinVector {\n    /// Read and output a vector with a variable length integer\n    pub fn read<R: Read, E, F>(mut reader: R, func: F) -> Result<Vec<E>, TransactionError>\n    where\n        F: Fn(&mut R) -> Result<E, TransactionError>,\n    {\n        let count = read_variable_length_integer(&mut reader)?;\n        (0..count).map(|_| func(&mut reader)).collect()\n    }\n\n    /// Read and output a vector with a variable length integer and the integer itself\n    pub fn read_witness<R: Read, E, F>(\n        mut reader: R,\n        func: F,\n    ) -> Result<(usize, Result<Vec<E>, TransactionError>), TransactionError>\n    where\n        F: Fn(&mut R) -> Result<E, TransactionError>,\n    {\n        let count = read_variable_length_integer(&mut reader)?;\n        Ok((count, Self::read(reader, func)))\n    }\n}\n\n/// Generate the script_pub_key of a corresponding address\npub fn create_script_pub_key<N: BitcoinNetwork>(\n    address: &BitcoinAddress<N>,\n) -> Result<Vec<u8>, TransactionError> {\n    match address.format() {\n        BitcoinFormat::P2PKH => {\n            let bytes = &address.to_string().from_base58()?;\n\n            // Trim the prefix (1st byte) and the checksum (last 4 bytes)\n            let pub_key_hash = bytes[1..(bytes.len() - 4)].to_vec();\n\n            let mut script = vec![];\n            script.push(Opcode::OP_DUP as u8);\n            script.push(Opcode::OP_HASH160 as u8);\n            script.extend(variable_length_integer(pub_key_hash.len() as u64)?);\n            script.extend(pub_key_hash);\n            script.push(Opcode::OP_EQUALVERIFY as u8);\n            script.push(Opcode::OP_CHECKSIG as u8);\n            Ok(script)\n        }\n        BitcoinFormat::P2SH_P2WPKH => {\n            let script_bytes = &address.to_string().from_base58()?;\n            let script_hash = script_bytes[1..(script_bytes.len() - 4)].to_vec();\n\n            let mut script = vec![];\n            script.push(Opcode::OP_HASH160 as u8);\n            script.extend(variable_length_integer(script_hash.len() as u64)?);\n            script.extend(script_hash);\n            script.push(Opcode::OP_EQUAL as u8);\n            Ok(script)\n        }\n        BitcoinFormat::P2WSH => {\n            let (_, data, _) = bech32::decode(&address.to_string())?;\n            let (v, script) = data.split_at(1);\n            let script = Vec::from_base32(script)?;\n            let mut script_bytes = vec![v[0].to_u8(), script.len() as u8];\n            script_bytes.extend(script);\n            Ok(script_bytes)\n        }\n        BitcoinFormat::Bech32 => {\n            let (_, data, _) = bech32::decode(&address.to_string())?;\n            let (v, program) = data.split_at(1);\n            let program = Vec::from_base32(program)?;\n            let mut program_bytes = vec![v[0].to_u8(), program.len() as u8];\n            program_bytes.extend(program);\n            Ok(WitnessProgram::new(&program_bytes)?.to_scriptpubkey())\n        }\n        BitcoinFormat::CashAddr => {\n            let address = address.to_string();\n            let prefix = N::to_address_prefix(BitcoinFormat::CashAddr)?.prefix();\n\n            let start = if address.starts_with(&prefix) {\n                prefix.len() + 1\n            } else {\n                0\n            };\n\n            // trim the prefix and the checksum\n            let bytes_u8 = address.as_bytes()[start..address.len() - 8].to_vec();\n\n            let bytes_u5: Vec<u5> = bytes_u8\n                .iter()\n                .map(|byte| u5::try_from_u8(BASE32_DECODE_TABLE[*byte as usize] as u8).unwrap())\n                .collect();\n            let payload = Vec::<u8>::from_base32(&bytes_u5)?;\n            // trim the version byte, left the public key hash\n            let hash = payload[1..].to_vec();\n\n            let mut script = vec![];\n            script.push(Opcode::OP_DUP as u8);\n            script.push(Opcode::OP_HASH160 as u8);\n            script.extend(variable_length_integer(hash.len() as u64)?);\n            script.extend(hash);\n            script.push(Opcode::OP_EQUALVERIFY as u8);\n            script.push(Opcode::OP_CHECKSIG as u8);\n\n            Ok(script)\n        }\n    }\n}\n\n/// Construct and return the OP_RETURN script for the data\n/// output of a tx that spends 'amount' basic units of omni\n/// layer asset as indicated by 'property_id'.\npub fn create_script_op_return(property_id: u32, amount: i64) -> Result<Vec<u8>, TransactionError> {\n    let mut script = vec![];\n\n    let msg_type: u16 = 0;\n    let msg_version: u16 = 0;\n\n    script.push(Opcode::OP_RETURN as u8);\n    script.push(Opcode::OP_PUSHBYTES_20 as u8);\n    script.push(b'o');\n    script.push(b'm');\n    script.push(b'n');\n    script.push(b'i');\n    script.append(&mut msg_version.to_be_bytes().to_vec());\n    script.append(&mut msg_type.to_be_bytes().to_vec());\n    script.append(&mut property_id.to_be_bytes().to_vec());\n    script.append(&mut amount.to_be_bytes().to_vec());\n\n    Ok(script)\n}\n\n/// Represents a Bitcoin signature hash\n/// `<https://en.bitcoin.it/wiki/OP_CHECKSIG>`\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\n#[allow(non_camel_case_types)]\npub enum SignatureHash {\n    /// Signs all inputs and outputs.\n    SIGHASH_ALL = 0x01,\n\n    /// Signs all inputs and none of the outputs.\n    /// (e.g. \"blank check\" transaction, where any address can redeem the output)\n    SIGHASH_NONE = 0x02,\n\n    /// Signs all inputs and one corresponding output per input.\n    /// (e.g. signing vin 0 will result in signing vout 0)\n    SIGHASH_SINGLE = 0x03,\n\n    SIGHASH_ALL_SIGHASH_FORKID = 0x41,\n    SIGHASH_NONE_SIGHASH_FORKID = 0x42,\n    SIGHASH_SINGLE_SIGHASH_FORKID = 0x43,\n\n    /// Signs only one input and all outputs.\n    /// Allows anyone to add or remove other inputs, forbids changing any outputs.\n    /// (e.g. \"crowdfunding\" transaction, where the output is the \"goal\" address)\n    SIGHASH_ALL_SIGHASH_ANYONECANPAY = 0x81,\n\n    /// Signs only one input and none of the outputs.\n    /// Allows anyone to add or remove other inputs or any outputs.\n    /// (e.g. \"dust collector\" transaction, where \"dust\" can be aggregated and spent together)\n    SIGHASH_NONE_SIGHASH_ANYONECANPAY = 0x82,\n\n    /// Signs only one input and one corresponding output per input.\n    /// Allows anyone to add or remove other inputs.\n    SIGHASH_SINGLE_SIGHASH_ANYONECANPAY = 0x83,\n\n    SIGHASH_ALL_SIGHASH_FORKID_SIGHASH_ANYONECANPAY = 0xc1,\n    SIGHASH_NONE_SIGHASH_FORKID_SIGHASH_ANYONECANPAY = 0xc2,\n    SIGHASH_SINGLE_SIGHASH_FORKID_SIGHASH_ANYONECANPAY = 0xc3,\n}\n\nimpl fmt::Display for SignatureHash {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        match self {\n            SignatureHash::SIGHASH_ALL => write!(f, \"SIGHASH_ALL\"),\n            SignatureHash::SIGHASH_NONE => write!(f, \"SIGHASH_NONE\"),\n            SignatureHash::SIGHASH_SINGLE => write!(f, \"SIGHASH_SINGLE\"),\n            SignatureHash::SIGHASH_ALL_SIGHASH_FORKID => {\n                write!(f, \"SIGHASH_ALL | SIGHASH_FORKID\")\n            }\n            SignatureHash::SIGHASH_NONE_SIGHASH_FORKID => {\n                write!(f, \"SIGHASH_NONE | SIGHASH_FORKID\")\n            }\n            SignatureHash::SIGHASH_SINGLE_SIGHASH_FORKID => {\n                write!(f, \"SIGHASH_SINGLE | SIGHASH_FORKID\")\n            }\n            SignatureHash::SIGHASH_ALL_SIGHASH_ANYONECANPAY => {\n                write!(f, \"SIGHASH_ALL | SIGHASH_ANYONECANPAY\")\n            }\n            SignatureHash::SIGHASH_NONE_SIGHASH_ANYONECANPAY => {\n                write!(f, \"SIGHASH_NONE | SIGHASH_ANYONECANPAY\")\n            }\n            SignatureHash::SIGHASH_SINGLE_SIGHASH_ANYONECANPAY => {\n                write!(f, \"SIGHASH_SINGLE | SIGHASH_ANYONECANPAY\")\n            }\n            SignatureHash::SIGHASH_ALL_SIGHASH_FORKID_SIGHASH_ANYONECANPAY => {\n                write!(f, \"SIGHASH_ALL | SIGHASH_FORKID | SIGHASH_ANYONECANPAY\")\n            }\n            SignatureHash::SIGHASH_NONE_SIGHASH_FORKID_SIGHASH_ANYONECANPAY => {\n                write!(f, \"SIGHASH_NONE | SIGHASH_FORKID | SIGHASH_ANYONECANPAY\")\n            }\n            SignatureHash::SIGHASH_SINGLE_SIGHASH_FORKID_SIGHASH_ANYONECANPAY => {\n                write!(f, \"SIGHASH_SINGLE | SIGHASH_FORKID | SIGHASH_ANYONECANPAY\")\n            }\n        }\n    }\n}\n\nimpl SignatureHash {\n    pub fn from_byte(byte: &u8) -> Self {\n        match byte {\n            0x02 => SignatureHash::SIGHASH_NONE,\n            0x03 => SignatureHash::SIGHASH_SINGLE,\n            0x41 => SignatureHash::SIGHASH_ALL_SIGHASH_FORKID,\n            0x42 => SignatureHash::SIGHASH_NONE_SIGHASH_FORKID,\n            0x43 => SignatureHash::SIGHASH_SINGLE_SIGHASH_FORKID,\n            0x81 => SignatureHash::SIGHASH_ALL_SIGHASH_ANYONECANPAY,\n            0x82 => SignatureHash::SIGHASH_NONE_SIGHASH_ANYONECANPAY,\n            0x83 => SignatureHash::SIGHASH_SINGLE_SIGHASH_ANYONECANPAY,\n            0xc1 => SignatureHash::SIGHASH_ALL_SIGHASH_FORKID_SIGHASH_ANYONECANPAY,\n            0xc2 => SignatureHash::SIGHASH_NONE_SIGHASH_FORKID_SIGHASH_ANYONECANPAY,\n            0xc3 => SignatureHash::SIGHASH_SINGLE_SIGHASH_FORKID_SIGHASH_ANYONECANPAY,\n            _ => SignatureHash::SIGHASH_ALL,\n        }\n    }\n}\n\n/// Represents the commonly used script opcodes\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]\n#[allow(non_camel_case_types)]\npub enum Opcode {\n    OP_DUP = 0x76,\n    OP_HASH160 = 0xa9,\n    OP_CHECKSIG = 0xac,\n    OP_EQUAL = 0x87,\n    OP_EQUALVERIFY = 0x88,\n    OP_RETURN = 0x6a,\n    OP_PUSHBYTES_20 = 0x14,\n}\n\nimpl fmt::Display for Opcode {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        match self {\n            Opcode::OP_DUP => write!(f, \"OP_DUP\"),\n            Opcode::OP_HASH160 => write!(f, \"OP_HASH160\"),\n            Opcode::OP_CHECKSIG => write!(f, \"OP_CHECKSIG\"),\n            Opcode::OP_EQUAL => write!(f, \"OP_EQUAL\"),\n            Opcode::OP_EQUALVERIFY => write!(f, \"OP_EQUALVERIFY\"),\n            Opcode::OP_RETURN => write!(f, \"OP_RETURN\"),\n            Opcode::OP_PUSHBYTES_20 => write!(f, \"OP_PUSHBYTES_20\"),\n        }\n    }\n}\n\n/// Represents a Bitcoin transaction outpoint\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct Outpoint {\n    /// Hash of the previous transaction (32 bytes) (uses reversed hash order from Bitcoin RPC)\n    pub reverse_transaction_id: Vec<u8>,\n    /// The index of certain utxo in the previous transaction (4 bytes)\n    pub index: u32,\n}\n\nimpl Outpoint {\n    /// Returns a new Bitcoin transaction outpoint\n    pub fn new(reverse_transaction_id: Vec<u8>, index: u32) -> Self {\n        Self {\n            reverse_transaction_id,\n            index,\n        }\n    }\n}\n\n/// Represents a Bitcoin transaction input\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct BitcoinTransactionInput<N: BitcoinNetwork> {\n    /// The outpoint (36 bytes)\n    pub outpoint: Outpoint,\n    /// The balance of the utxo pointed by this input (used for SegWit transaction signatures)\n    pub balance: Option<BitcoinAmount>,\n    /// The address of the utxo pointed by this input\n    pub address: Option<BitcoinAddress<N>>,\n    /// The address format of the utxo pointed by this input\n    pub format: Option<BitcoinFormat>,\n    /// The 'scriptPubkey' of the utxo pointed by this input\n    pub script_pub_key: Option<Vec<u8>>,\n    /// An optional redeem script in case of an SegWit utxo\n    pub redeem_script: Option<Vec<u8>>,\n    /// The transaction input script (variable size)\n    pub script_sig: Vec<u8>,\n    /// The sequence number (4 bytes) (0xFFFFFFFF unless lock > 0)\n    /// Also used in replace-by-fee (BIP 125)\n    pub sequence: Vec<u8>,\n    /// The signature hash (4 bytes) (used in signing raw transaction only)\n    pub sighash_code: SignatureHash,\n    /// The witnesses in a SegWit transaction\n    pub witnesses: Vec<Vec<u8>>,\n    /// If true, the input has been signed\n    pub is_signed: bool,\n    /// Provide more flexibility for multiple signatures (for P2WSH)\n    pub additional_witness: Option<(Vec<u8>, bool)>,\n    /// Option for additional witness stack script args\n    pub witness_script_data: Option<Vec<u8>>,\n}\n\nimpl<N: BitcoinNetwork> BitcoinTransactionInput<N> {\n    const DEFAULT_SEQUENCE: [u8; 4] = [0xf2, 0xff, 0xff, 0xff];\n\n    /// Returns a new Bitcoin transaction input.\n    pub fn new(\n        transaction_id: Vec<u8>,\n        index: u32,\n        public_key: Option<BitcoinPublicKey<N>>,\n        format: Option<BitcoinFormat>,\n        address: Option<BitcoinAddress<N>>,\n        balance: Option<BitcoinAmount>,\n        sighash: SignatureHash,\n    ) -> Result<Self, TransactionError> {\n        if transaction_id.len() != 32 {\n            return Err(TransactionError::InvalidTransactionId(transaction_id.len()));\n        }\n\n        // Byte-wise reverse of computed SHA-256 hash values\n        // https://bitcoin.org/en/developer-reference#hash-byte-order\n        let mut reverse_transaction_id = transaction_id;\n        reverse_transaction_id.reverse();\n\n        let format = match format {\n            Some(f) => Some(f),\n            None => Some(BitcoinFormat::P2PKH),\n        };\n\n        let (address, script_pub_key, redeem_script) = match public_key {\n            Some(pk) => {\n                let addr = pk.to_address(&format.clone().unwrap())?;\n                if let Some(v) = address {\n                    if v != addr {\n                        return Err(TransactionError::Message(format!(\n                            \"Provided address {} does not match the provided public key {}\",\n                            addr, pk,\n                        )));\n                    }\n                }\n                let script_pub_key = create_script_pub_key(&addr)?;\n                let redeem_script = match format {\n                    Some(BitcoinFormat::P2SH_P2WPKH) => {\n                        Some(BitcoinAddress::<N>::create_redeem_script(&pk).to_vec())\n                    }\n                    _ => None,\n                };\n                (Some(addr), Some(script_pub_key), redeem_script)\n            }\n            None => match address {\n                Some(addr) => {\n                    let script_pub_key = create_script_pub_key(&addr)?;\n                    (Some(addr), Some(script_pub_key), None)\n                }\n                None => (None, None, None),\n            },\n        };\n\n        Ok(Self {\n            outpoint: Outpoint::new(reverse_transaction_id, index),\n            balance,\n            address,\n            format,\n            script_pub_key,\n            redeem_script,\n            script_sig: vec![],\n            sequence: BitcoinTransactionInput::<N>::DEFAULT_SEQUENCE.to_vec(),\n            sighash_code: sighash,\n            witnesses: vec![],\n            is_signed: false,\n            additional_witness: None,\n            witness_script_data: None,\n        })\n    }\n\n    pub fn set_public_key(\n        &mut self,\n        public_key: BitcoinPublicKey<N>,\n        format: BitcoinFormat,\n    ) -> Result<(), TransactionError> {\n        let address = public_key.to_address(&format)?;\n        self.format = Some(format.clone());\n        self.script_pub_key = Some(create_script_pub_key(&address)?);\n        self.address = Some(address);\n        self.redeem_script = match format {\n            BitcoinFormat::P2SH_P2WPKH => {\n                Some(BitcoinAddress::<N>::create_redeem_script(&public_key).to_vec())\n            }\n            _ => None,\n        };\n        Ok(())\n    }\n\n    pub fn set_redeem_script(&mut self, redeem_script: Vec<u8>) -> Result<(), TransactionError> {\n        self.redeem_script = Some(redeem_script);\n        Ok(())\n    }\n\n    pub fn set_format(&mut self, format: BitcoinFormat) -> Result<(), TransactionError> {\n        self.format = Some(format);\n        Ok(())\n    }\n\n    pub fn set_balance(&mut self, balance: i64) -> Result<(), TransactionError> {\n        self.balance = Some(BitcoinAmount(balance));\n        Ok(())\n    }\n\n    pub fn set_sequence(&mut self, sequence: u32) -> Result<(), TransactionError> {\n        self.sequence = u32::to_le_bytes(sequence).to_vec();\n        Ok(())\n    }\n\n    pub fn set_sighash(&mut self, sighash: SignatureHash) -> Result<(), TransactionError> {\n        self.sighash_code = sighash;\n        Ok(())\n    }\n\n    pub fn get_address(&self) -> Option<BitcoinAddress<N>> {\n        self.address.clone()\n    }\n\n    pub fn get_format(&self) -> Option<BitcoinFormat> {\n        self.format.clone()\n    }\n\n    pub fn get_balance(&self) -> Option<BitcoinAmount> {\n        self.balance\n    }\n\n    pub fn get_sequence(&self) -> u32 {\n        let sequence: [u8; 4] = self.sequence.clone().try_into().unwrap();\n        u32::from_le_bytes(sequence)\n    }\n\n    pub fn get_sighash(&self) -> SignatureHash {\n        self.sighash_code\n    }\n\n    /// Read and output a Bitcoin transaction input\n    pub fn read<R: Read>(mut reader: &mut R) -> Result<Self, TransactionError> {\n        let mut transaction_hash = [0u8; 32];\n        let mut vin = [0u8; 4];\n        let mut sequence = [0u8; 4];\n\n        let _ = reader.read(&mut transaction_hash)?;\n        let _ = reader.read(&mut vin)?;\n\n        let outpoint = Outpoint::new(transaction_hash.to_vec(), u32::from_le_bytes(vin));\n\n        let script_sig: Vec<u8> = BitcoinVector::read(&mut reader, |s| {\n            let mut byte = [0u8; 1];\n            let _ = s.read(&mut byte)?;\n            Ok(byte[0])\n        })?;\n\n        let _ = reader.read(&mut sequence)?;\n\n        let script_sig_len = read_variable_length_integer(&script_sig[..])?;\n\n        let sighash_code = SignatureHash::from_byte(&match script_sig_len {\n            0 => 0x01,\n            length => script_sig[length],\n        });\n\n        Ok(Self {\n            outpoint,\n            balance: None,\n            address: None,\n            format: None,\n            script_pub_key: None,\n            redeem_script: None,\n            script_sig: script_sig.to_vec(),\n            sequence: sequence.to_vec(),\n            sighash_code,\n            witnesses: vec![],\n            is_signed: !script_sig.is_empty(),\n            additional_witness: None,\n            witness_script_data: None,\n        })\n    }\n\n    /// Returns the serialized transaction input.\n    pub fn serialize(&self, raw: bool) -> Result<Vec<u8>, TransactionError> {\n        let mut input = vec![];\n        input.extend(&self.outpoint.reverse_transaction_id);\n        input.extend(&self.outpoint.index.to_le_bytes());\n        match raw {\n            true => input.extend(vec![0x00]),\n            false => match self.script_sig.len() {\n                0 => match &self.address {\n                    Some(address) => match address.format() {\n                        BitcoinFormat::P2PKH => {\n                            let script_pub_key = match &self.script_pub_key {\n                                Some(script) => script,\n                                None => {\n                                    return Err(TransactionError::MissingOutpointScriptPublicKey)\n                                }\n                            };\n                            input.extend(variable_length_integer(script_pub_key.len() as u64)?);\n                            input.extend(script_pub_key);\n                        }\n                        _ => input.extend(vec![0x00]),\n                    },\n                    None => input.extend(vec![0x00]),\n                },\n                _ => {\n                    input.extend(variable_length_integer(self.script_sig.len() as u64)?);\n                    input.extend(&self.script_sig);\n                }\n            },\n        };\n\n        input.extend(&self.sequence);\n\n        Ok(input)\n    }\n\n    /// Insert 'signature' and 'public_key' into this input to make it signed\n    pub fn sign(\n        &mut self,\n        signature: Vec<u8>,\n        public_key: Vec<u8>,\n    ) -> Result<(), TransactionError> {\n        let mut signature = Signature::parse_standard_slice(&signature)\n            .map_err(|error| TransactionError::Crate(\"libsecp256k1\", format!(\"{:?}\", error)))?\n            .serialize_der()\n            .as_ref()\n            .to_vec();\n        signature.push(self.sighash_code as u8);\n\n        let signature = [variable_length_integer(signature.len() as u64)?, signature].concat();\n        let public_key = [\n            variable_length_integer(public_key.len() as u64)?,\n            public_key,\n        ]\n        .concat();\n\n        match self.get_format().unwrap() {\n            BitcoinFormat::P2PKH | BitcoinFormat::CashAddr => {\n                self.script_sig = [signature, public_key].concat()\n            }\n            BitcoinFormat::P2SH_P2WPKH => {\n                let input_script = match &self.redeem_script {\n                    Some(script) => script.clone(),\n                    None => {\n                        return Err(TransactionError::Message(\n                            \"Missing redeem script\".to_string(),\n                        ))\n                    }\n                };\n                self.script_sig = [\n                    variable_length_integer(input_script.len() as u64)?,\n                    input_script,\n                ]\n                .concat();\n                self.witnesses.append(&mut vec![signature, public_key]);\n            }\n            BitcoinFormat::Bech32 => self.witnesses.append(&mut vec![signature, public_key]),\n            BitcoinFormat::P2WSH => {\n                return Err(TransactionError::Message(\n                    \"P2WSH signing not supported\".to_string(),\n                ))\n            }\n        }\n\n        self.is_signed = true;\n\n        Ok(())\n    }\n}\n\n/// Represents a Bitcoin transaction output\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct BitcoinTransactionOutput {\n    /// The amount (in Satoshi)\n    pub amount: BitcoinAmount,\n    /// The public key script\n    pub script_pub_key: Vec<u8>,\n}\n\nimpl BitcoinTransactionOutput {\n    /// Returns a Bitcoin transaction output.\n    pub fn new<N: BitcoinNetwork>(\n        address: BitcoinAddress<N>,\n        amount: BitcoinAmount,\n    ) -> Result<Self, TransactionError> {\n        Ok(Self {\n            amount,\n            script_pub_key: create_script_pub_key::<N>(&address)?,\n        })\n    }\n\n    /// Returns the data output for a tx that spends 'amount' basic\n    /// units of omni-layer asset as indicated by 'property_id'.\n    pub fn omni_data_output(\n        property_id: u32,\n        amount: BitcoinAmount,\n    ) -> Result<Self, TransactionError> {\n        let data_output = BitcoinTransactionOutput {\n            amount: BitcoinAmount(0),\n            script_pub_key: create_script_op_return(property_id, amount.0)?,\n        };\n\n        Ok(data_output)\n    }\n\n    /// Read and output a Bitcoin transaction output\n    pub fn read<R: Read>(mut reader: &mut R) -> Result<Self, TransactionError> {\n        let mut amount = [0u8; 8];\n        let _ = reader.read(&mut amount)?;\n\n        let script_pub_key: Vec<u8> = BitcoinVector::read(&mut reader, |s| {\n            let mut byte = [0u8; 1];\n            let _ = s.read(&mut byte)?;\n            Ok(byte[0])\n        })?;\n\n        Ok(Self {\n            amount: BitcoinAmount::from_satoshi(u64::from_le_bytes(amount) as i64)?,\n            script_pub_key,\n        })\n    }\n\n    /// Returns the serialized transaction output.\n    pub fn serialize(&self) -> Result<Vec<u8>, TransactionError> {\n        let mut output = vec![];\n        output.extend(&self.amount.0.to_le_bytes());\n        output.extend(variable_length_integer(self.script_pub_key.len() as u64)?);\n        output.extend(&self.script_pub_key);\n        Ok(output)\n    }\n}\n\n/// Represents an Bitcoin transaction id and witness transaction id\n/// `<https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#transaction-id>`\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct BitcoinTransactionId {\n    pub txid: Vec<u8>,\n    pub wtxid: Vec<u8>,\n}\n\nimpl TransactionId for BitcoinTransactionId {}\n\nimpl fmt::Display for BitcoinTransactionId {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", &hex::encode(&self.txid))\n    }\n}\n\n/// Represents the Bitcoin transaction parameters\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct BitcoinTransactionParameters<N: BitcoinNetwork> {\n    /// The version number (4 bytes)\n    pub version: u32,\n    /// The transaction inputs\n    pub inputs: Vec<BitcoinTransactionInput<N>>,\n    /// The transaction outputs\n    pub outputs: Vec<BitcoinTransactionOutput>,\n    /// The lock time (4 bytes)\n    pub lock_time: u32,\n    /// An optional 2 bytes to indicate SegWit transactions\n    pub segwit_flag: bool,\n}\n\nimpl<N: BitcoinNetwork> BitcoinTransactionParameters<N> {\n    /// Returns a BitcoinTransactionParameters given the inputs and outputs\n    pub fn new(\n        inputs: Vec<BitcoinTransactionInput<N>>,\n        outputs: Vec<BitcoinTransactionOutput>,\n    ) -> Result<Self, TransactionError> {\n        Ok(Self {\n            version: 2,\n            inputs,\n            outputs,\n            lock_time: 0,\n            segwit_flag: false,\n        })\n    }\n\n    /// Read and output the Bitcoin transaction parameters\n    pub fn read<R: Read>(mut reader: R) -> Result<Self, TransactionError> {\n        let mut version = [0u8; 4];\n        let _ = reader.read(&mut version)?;\n\n        let mut inputs = BitcoinVector::read(&mut reader, BitcoinTransactionInput::<N>::read)?;\n\n        let segwit_flag = match inputs.is_empty() {\n            true => {\n                let mut flag = [0u8; 1];\n                let _ = reader.read(&mut flag)?;\n                match flag[0] {\n                    1 => {\n                        inputs =\n                            BitcoinVector::read(&mut reader, BitcoinTransactionInput::<N>::read)?;\n                        true\n                    }\n                    _ => return Err(TransactionError::InvalidSegwitFlag(flag[0] as usize)),\n                }\n            }\n            false => false,\n        };\n\n        let outputs = BitcoinVector::read(&mut reader, BitcoinTransactionOutput::read)?;\n\n        // if segwit_flag {\n        //     for input in &mut inputs {\n        //         let witnesses: Vec<Vec<u8>> = BitcoinVector::read(&mut reader, |s| {\n        //             let (size, witness) = BitcoinVector::read_witness(s, |sr| {\n        //                 let mut byte = [0u8; 1];\n        //                 let _ = sr.read(&mut byte)?;\n        //                 Ok(byte[0])\n        //             })?;\n        //             Ok([variable_length_integer(size as u64)?, witness?].concat())\n        //         })?;\n\n        //         if !witnesses.is_empty() {\n        //             input.sighash_code =\n        //                 SignatureHash::from_byte(&witnesses[0][&witnesses[0].len() - 1]);\n        //             input.is_signed = true;\n        //         }\n\n        //         input.witnesses = witnesses;\n        //     }\n        // }\n\n        let params = BitcoinTransactionParameters::<N> {\n            version: u32::from_le_bytes(version),\n            inputs,\n            outputs,\n            lock_time: 0,\n            segwit_flag,\n        };\n\n        Ok(params)\n    }\n}\n\n/// Represents a Bitcoin transaction\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct BitcoinTransaction<N: BitcoinNetwork> {\n    /// The transaction parameters (version, inputs, outputs, lock_time, segwit_flag)\n    pub parameters: BitcoinTransactionParameters<N>,\n}\n\nimpl<N: BitcoinNetwork> fmt::Display for BitcoinTransaction<N> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", hex::encode(self.to_bytes().unwrap()))\n    }\n}\n\nimpl<N: BitcoinNetwork> Transaction for BitcoinTransaction<N> {\n    type Address = BitcoinAddress<N>;\n    type Format = BitcoinFormat;\n    type PublicKey = BitcoinPublicKey<N>;\n    type TransactionId = BitcoinTransactionId;\n    type TransactionParameters = BitcoinTransactionParameters<N>;\n\n    /// Returns an unsigned transaction given the transaction parameters.\n    fn new(parameters: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            parameters: parameters.clone(),\n        })\n    }\n\n    /// Returns a transaction given the transaction bytes.\n    /// Note:: Raw transaction hex does not include enough\n    fn from_bytes(transaction: &[u8]) -> Result<Self, TransactionError> {\n        Ok(Self {\n            parameters: Self::TransactionParameters::read(transaction)?,\n        })\n    }\n\n    /// Returns the transaction in bytes.\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        let mut transaction = self.parameters.version.to_le_bytes().to_vec();\n\n        if self.parameters.segwit_flag {\n            transaction.extend(vec![0x00, 0x01]);\n        }\n\n        transaction.extend(variable_length_integer(self.parameters.inputs.len() as u64)?);\n        let mut has_witness = false;\n        for input in &self.parameters.inputs {\n            if !has_witness {\n                has_witness = !input.witnesses.is_empty();\n            }\n            transaction.extend(input.serialize(!input.is_signed)?);\n        }\n\n        transaction.extend(variable_length_integer(\n            self.parameters.outputs.len() as u64\n        )?);\n        for output in &self.parameters.outputs {\n            transaction.extend(output.serialize()?);\n        }\n\n        if has_witness {\n            for input in &self.parameters.inputs {\n                match input.witnesses.len() {\n                    0 => transaction.extend(vec![0x00]),\n                    _ => {\n                        transaction.extend(variable_length_integer(input.witnesses.len() as u64)?);\n                        for witness in &input.witnesses {\n                            transaction.extend(witness);\n                        }\n                    }\n                };\n            }\n        }\n\n        transaction.extend(&self.parameters.lock_time.to_le_bytes());\n\n        Ok(transaction)\n    }\n\n    /// Returns the transaction id.\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        let mut txid = double_sha2(&self.to_transaction_bytes_without_witness()?).to_vec();\n        let mut wtxid = double_sha2(&self.to_bytes()?).to_vec();\n\n        txid.reverse();\n        wtxid.reverse();\n\n        Ok(Self::TransactionId { txid, wtxid })\n    }\n\n    fn sign(&mut self, _signature: Vec<u8>, _recid: u8) -> Result<Vec<u8>, TransactionError> {\n        panic!(\n            \"trait method sign() deprecated for bitcoin, use custom methods for signature\\\n             insertion in its own impl block instead.\"\n        );\n    }\n}\n\nimpl<N: BitcoinNetwork> BitcoinTransaction<N> {\n    /// Return the P2PKH hash preimage of the raw transaction.\n    pub fn p2pkh_hash_preimage(\n        &self,\n        vin: usize,\n        sighash: SignatureHash,\n    ) -> Result<Vec<u8>, TransactionError> {\n        let mut preimage = self.parameters.version.to_le_bytes().to_vec();\n        preimage.extend(variable_length_integer(self.parameters.inputs.len() as u64)?);\n        for (index, input) in self.parameters.inputs.iter().enumerate() {\n            preimage.extend(input.serialize(index != vin)?);\n        }\n        preimage.extend(variable_length_integer(\n            self.parameters.outputs.len() as u64\n        )?);\n        for output in &self.parameters.outputs {\n            preimage.extend(output.serialize()?);\n        }\n        preimage.extend(&self.parameters.lock_time.to_le_bytes());\n        preimage.extend(&(sighash as u32).to_le_bytes());\n        Ok(preimage)\n    }\n\n    /// Return the SegWit hash preimage of the raw transaction\n    /// `<https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#specification>`\n    pub fn segwit_hash_preimage(\n        &self,\n        vin: usize,\n        sighash: SignatureHash,\n    ) -> Result<Vec<u8>, TransactionError> {\n        let mut prev_outputs = vec![];\n        let mut prev_sequences = vec![];\n        let mut outputs = vec![];\n\n        for input in &self.parameters.inputs {\n            prev_outputs.extend(&input.outpoint.reverse_transaction_id);\n            prev_outputs.extend(&input.outpoint.index.to_le_bytes());\n            prev_sequences.extend(&input.sequence);\n        }\n\n        for output in &self.parameters.outputs {\n            outputs.extend(&output.serialize()?);\n        }\n\n        let input = &self.parameters.inputs[vin];\n        let format = match &input.address {\n            Some(address) => address.format(),\n            None => return Err(TransactionError::MissingOutpointAddress),\n        };\n\n        let script = match format {\n            BitcoinFormat::Bech32 => match &input.script_pub_key {\n                Some(script) => script[1..].to_vec(),\n                None => return Err(TransactionError::MissingOutpointScriptPublicKey),\n            },\n            BitcoinFormat::CashAddr => match &input.script_pub_key {\n                Some(script) => script.to_vec(),\n                None => return Err(TransactionError::MissingOutpointScriptPublicKey),\n            },\n            BitcoinFormat::P2WSH => match &input.redeem_script {\n                Some(redeem_script) => redeem_script.to_vec(),\n                None => return Err(TransactionError::InvalidInputs(\"P2WSH\".into())),\n            },\n            BitcoinFormat::P2SH_P2WPKH => match &input.redeem_script {\n                Some(redeem_script) => redeem_script[1..].to_vec(),\n                None => return Err(TransactionError::InvalidInputs(\"P2SH_P2WPKH\".into())),\n            },\n            _ => return Err(TransactionError::UnsupportedPreimage(\"P2PKH\".into())),\n        };\n\n        let mut script_code = vec![];\n        if format == BitcoinFormat::P2WSH || format == BitcoinFormat::CashAddr {\n            script_code.extend(script);\n        } else {\n            script_code.push(Opcode::OP_DUP as u8);\n            script_code.push(Opcode::OP_HASH160 as u8);\n            script_code.extend(script);\n            script_code.push(Opcode::OP_EQUALVERIFY as u8);\n            script_code.push(Opcode::OP_CHECKSIG as u8);\n        }\n        let script_code = [\n            variable_length_integer(script_code.len() as u64)?,\n            script_code,\n        ]\n        .concat();\n        let hash_prev_outputs = double_sha2(&prev_outputs);\n        let hash_sequence = double_sha2(&prev_sequences);\n        let hash_outputs = double_sha2(&outputs);\n        let balance = match &input.balance {\n            Some(balance) => balance.0.to_le_bytes(),\n            None => return Err(TransactionError::MissingOutpointAmount),\n        };\n\n        let mut preimage = vec![];\n        preimage.extend(&self.parameters.version.to_le_bytes());\n        preimage.extend(hash_prev_outputs);\n        preimage.extend(hash_sequence);\n        preimage.extend(&input.outpoint.reverse_transaction_id);\n        preimage.extend(&input.outpoint.index.to_le_bytes());\n        preimage.extend(&script_code);\n        preimage.extend(&balance);\n        preimage.extend(&input.sequence);\n        preimage.extend(hash_outputs);\n        preimage.extend(&self.parameters.lock_time.to_le_bytes());\n        preimage.extend(&(sighash as u32).to_le_bytes());\n\n        Ok(preimage)\n    }\n\n    /// Returns the transaction with the traditional serialization (no witness).\n    pub fn to_transaction_bytes_without_witness(&self) -> Result<Vec<u8>, TransactionError> {\n        let mut transaction = self.parameters.version.to_le_bytes().to_vec();\n\n        transaction.extend(variable_length_integer(self.parameters.inputs.len() as u64)?);\n        for input in &self.parameters.inputs {\n            transaction.extend(input.serialize(false)?);\n        }\n\n        transaction.extend(variable_length_integer(\n            self.parameters.outputs.len() as u64\n        )?);\n        for output in &self.parameters.outputs {\n            transaction.extend(output.serialize()?);\n        }\n\n        transaction.extend(&self.parameters.lock_time.to_le_bytes());\n\n        Ok(transaction)\n    }\n\n    pub fn input(\n        &mut self,\n        index: u32,\n    ) -> Result<&mut BitcoinTransactionInput<N>, TransactionError> {\n        if index as usize >= self.parameters.inputs.len() {\n            return Err(TransactionError::Message(format!(\n                \"you are referring to input {}, which is out of bound\",\n                index\n            )));\n        }\n        Ok(&mut self.parameters.inputs[index as usize])\n    }\n\n    pub fn digest(&mut self, index: u32) -> Result<Vec<u8>, TransactionError> {\n        let input = self.input(index)?;\n        let sighash = input.sighash_code;\n        match input.get_address() {\n            Some(addr) => {\n                let preimage = match addr.format() {\n                    BitcoinFormat::P2PKH => self.p2pkh_hash_preimage(index as usize, sighash)?,\n                    _ => self.segwit_hash_preimage(index as usize, sighash)?,\n                };\n                Ok(double_sha2(&preimage).to_vec())\n            }\n            None => Err(TransactionError::MissingOutpointAddress),\n        }\n    }\n\n    pub fn set_segwit(&mut self) -> Result<(), TransactionError> {\n        for input in self.parameters.inputs.clone() {\n            if self.parameters.segwit_flag {\n                break;\n            }\n            if input.is_signed {\n                match input.get_format() {\n                    Some(BitcoinFormat::P2SH_P2WPKH) | Some(BitcoinFormat::Bech32) => {\n                        self.parameters.segwit_flag = true\n                    }\n                    _ => {}\n                }\n            }\n        }\n\n        Ok(())\n    }\n}\n\nimpl<N: BitcoinNetwork> FromStr for BitcoinTransaction<N> {\n    type Err = TransactionError;\n\n    fn from_str(transaction: &str) -> Result<Self, Self::Err> {\n        Self::from_bytes(&hex::decode(transaction)?)\n    }\n}\n"
  },
  {
    "path": "crates/anychain-bitcoin/src/witness_program.rs",
    "content": "//!\n//! WitnessProgram\n//!\n//! This module contains the representation of a Bitcoin witness program and utility functions\n//! related to the representation of such programs.\n//!\n//! If the version byte is 0, and the witness program is 20 bytes:\n//! - It is interpreted as a pay-to-witness-public-key-hash (P2WPKH) program.\n//! - The witness must consist of exactly 2 items (≤ 520 bytes each). The first one a signature, and the second one a public key.\n//! - The HASH160 of the public key must match the 20-byte witness program.\n//! - After normal script evaluation, the signature is verified against the public key with CHECKSIG operation. The verification must result in a single TRUE on the stack.\n//!\n//! If the version byte is 0, and the witness program is 32 bytes:\n//! - It is interpreted as a pay-to-witness-script-hash (P2WSH) program.\n//! - The witness must consist of an input stack to feed to the script, followed by a serialized script (witnessScript).\n//! - The witnessScript (≤ 10,000 bytes) is popped off the initial witness stack. SHA256 of the witnessScript must match the 32-byte witness program.\n//! - The witnessScript is deserialized, and executed after normal script evaluation with the remaining witness stack (≤ 520 bytes for each stack item).\n//! - The script must not fail, and result in exactly a single TRUE on the stack.\n//!\n//! If the version byte is 0, but the witness program is neither 20 nor 32 bytes, the script must fail.\n//!\n\nuse anychain_core::no_std::*;\nuse anychain_core::{hex, AddressError, TransactionError};\n\nuse core::str::FromStr;\n\n#[derive(Debug, Error, PartialEq, Eq)]\npub enum WitnessProgramError {\n    #[error(\"invalid program length {0}\")]\n    InvalidProgramLength(usize),\n\n    #[error(\"invalid program length {0} for script version {1}\")]\n    InvalidProgramLengthForVersion(usize, u8),\n\n    #[error(\"invalid version {0}\")]\n    InvalidVersion(u8),\n\n    #[error(\"invalid program length: {{ expected: {0:?}, found: {1:?} }}\")]\n    MismatchedProgramLength(usize, usize),\n\n    #[error(\"error decoding program from hex string\")]\n    ProgramDecodingError,\n}\n\nimpl From<WitnessProgramError> for AddressError {\n    fn from(error: WitnessProgramError) -> Self {\n        AddressError::Crate(\"WitnessProgram\", format!(\"{:?}\", error))\n    }\n}\n\nimpl From<WitnessProgramError> for TransactionError {\n    fn from(error: WitnessProgramError) -> Self {\n        TransactionError::Crate(\"WitnessProgram\", format!(\"{:?}\", error))\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct WitnessProgram {\n    /// The version byte\n    pub version: u8,\n    /// The witness program bytes\n    pub program: Vec<u8>,\n}\n\nimpl WitnessProgram {\n    /// Returns a new witness program given a program with a version, data size, and data.\n    pub fn new(program: &[u8]) -> Result<Self, WitnessProgramError> {\n        if program.len() < 2 {\n            return Err(WitnessProgramError::InvalidProgramLength(program.len()));\n        }\n\n        // https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#Decoding\n        let data_size = program[1] as usize;\n        let data = program[2..].to_vec();\n        if data_size != data.len() {\n            return Err(WitnessProgramError::MismatchedProgramLength(\n                data.len(),\n                data_size,\n            ));\n        }\n\n        let program = Self {\n            version: program[0],\n            program: data,\n        };\n        match program.validate() {\n            Ok(()) => Ok(program),\n            Err(e) => Err(e),\n        }\n    }\n\n    pub fn validate(&self) -> Result<(), WitnessProgramError> {\n        if self.program.len() < 2 || self.program.len() > 40 {\n            return Err(WitnessProgramError::InvalidProgramLength(\n                self.program.len(),\n            ));\n        }\n\n        if self.version > 16 {\n            return Err(WitnessProgramError::InvalidVersion(self.version));\n        }\n\n        // P2SH_P2WPKH start with 0x0014\n        // P2SH_P2WSH starts with 0x0020\n        // https://bitcoincore.org/en/segwit_wallet_dev/#creation-of-p2sh-p2wpkh-address\n        if self.version == 0 && !(self.program.len() == 20 || self.program.len() == 32) {\n            return Err(WitnessProgramError::InvalidProgramLengthForVersion(\n                self.program.len(),\n                self.version,\n            ));\n        }\n\n        Ok(())\n    }\n\n    /// Returns the witness program's scriptpubkey as a byte vector.\n    pub fn to_scriptpubkey(&self) -> Vec<u8> {\n        let mut output = Vec::with_capacity(self.program.len() + 2);\n        let encoded_version = if self.version > 0 {\n            self.version + 0x50\n        } else {\n            self.version\n        };\n        output.push(encoded_version);\n        output.push(self.program.len() as u8);\n        output.extend_from_slice(&self.program);\n        output\n    }\n}\n\nimpl FromStr for WitnessProgram {\n    type Err = WitnessProgramError;\n\n    /// Returns a witness program given its hex representation.\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        WitnessProgram::new(&match hex::decode(s) {\n            Ok(bytes) => bytes,\n            Err(_) => return Err(WitnessProgramError::ProgramDecodingError),\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn test_from_str(program_str: &str, expected_version: u8, expected_program: &[u8]) {\n        let witness_program = WitnessProgram::from_str(program_str).unwrap();\n        assert_eq!(expected_version, witness_program.version);\n        assert_eq!(expected_program.to_vec(), witness_program.program);\n    }\n\n    fn test_to_scriptpubkey(version: u8, program: &[u8], expected_scriptpubkey: &[u8]) {\n        let witness_program = WitnessProgram {\n            version,\n            program: program.to_vec(),\n        };\n        assert_eq!(\n            expected_scriptpubkey.to_vec(),\n            witness_program.to_scriptpubkey()\n        );\n    }\n\n    mod p2sh_p2wpkh {\n        use super::*;\n\n        const VALID_P2SH_P2WPKH_PROGRAMS: [(&str, u8, &[u8], &[u8]); 1] = [(\n            \"0014751e76e8199196d454941c45d1b3a323f1433bd6\",\n            0x00,\n            &[\n                0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45, 0xd1, 0xb3,\n                0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,\n            ],\n            &[\n                0x00, 0x14, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45,\n                0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,\n            ],\n        )];\n\n        #[test]\n        fn from_str() {\n            VALID_P2SH_P2WPKH_PROGRAMS.iter().for_each(\n                |&(program_str, expected_version, expected_program, _)| {\n                    test_from_str(program_str, expected_version, expected_program);\n                },\n            );\n        }\n\n        #[test]\n        fn to_scriptpubkey() {\n            VALID_P2SH_P2WPKH_PROGRAMS.iter().for_each(\n                |&(_, version, program, expected_scriptpubkey)| {\n                    test_to_scriptpubkey(version, program, expected_scriptpubkey);\n                },\n            );\n        }\n    }\n\n    mod p2sh_p2wsh {\n        use super::*;\n\n        const VALID_P2SH_P2WSH_PROGRAMS: [(&str, u8, &[u8], &[u8]); 1] = [(\n            \"00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262\",\n            0x00,\n            &[\n                0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04, 0xbd, 0x19, 0x20, 0x33, 0x56,\n                0xda, 0x13, 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1, 0xb8, 0xc6, 0x32, 0x96,\n                0x04, 0x90, 0x32, 0x62,\n            ],\n            &[\n                0x00, 0x20, 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04, 0xbd, 0x19, 0x20,\n                0x33, 0x56, 0xda, 0x13, 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1, 0xb8, 0xc6,\n                0x32, 0x96, 0x04, 0x90, 0x32, 0x62,\n            ],\n        )];\n\n        #[test]\n        fn from_str() {\n            VALID_P2SH_P2WSH_PROGRAMS.iter().for_each(\n                |&(program_str, expected_version, expected_program, _)| {\n                    test_from_str(program_str, expected_version, expected_program);\n                },\n            );\n        }\n\n        #[test]\n        fn to_scriptpubkey() {\n            VALID_P2SH_P2WSH_PROGRAMS.iter().for_each(\n                |&(_, version, program, expected_scriptpubkey)| {\n                    test_to_scriptpubkey(version, program, expected_scriptpubkey);\n                },\n            );\n        }\n    }\n\n    mod version_1 {\n        use super::*;\n\n        const VALID_OP_1_PROGRAMS: [(&str, u8, &[u8], &[u8]); 1] = [(\n            \"0128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6\",\n            0x01,\n            &[\n                0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45, 0xd1, 0xb3,\n                0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4,\n                0x54, 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,\n            ],\n            &[\n                0x51, 0x28, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45,\n                0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91,\n                0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,\n            ],\n        )];\n\n        #[test]\n        fn from_str() {\n            VALID_OP_1_PROGRAMS.iter().for_each(\n                |&(program_str, expected_version, expected_program, _)| {\n                    test_from_str(program_str, expected_version, expected_program);\n                },\n            );\n        }\n\n        #[test]\n        fn to_scriptpubkey() {\n            VALID_OP_1_PROGRAMS\n                .iter()\n                .for_each(|&(_, version, program, expected_scriptpubkey)| {\n                    test_to_scriptpubkey(version, program, expected_scriptpubkey);\n                });\n        }\n    }\n\n    mod test_invalid {\n        use super::*;\n\n        mod new {\n            use super::*;\n\n            const INVALID_VERSION_PROGRAM: &[u8] = &[0x19, 0x03, 0x00, 0x00, 0x00];\n            const INVALID_LENGTH_FOR_VERSION: &[u8] = &[\n                0x00, 0x0f, // Version 0, data length is incorrect\n                0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45, 0xd1, 0xb3,\n                0xa3,\n            ];\n            const INVALID_LENGTH_PROGRAM: &[u8] = &[0x19];\n            const INVALID_LENGTH_PROGRAM_TOO_LONG: &[u8] = &[\n                0x00, 0x29, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45,\n                0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91,\n                0x96, 0xd4, 0x54, 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,\n                0x00,\n            ];\n\n            #[test]\n            fn new_invalid_version() {\n                let witness_program_error =\n                    WitnessProgram::new(INVALID_VERSION_PROGRAM).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::InvalidVersion(0x19),\n                    witness_program_error\n                );\n            }\n\n            #[test]\n            fn new_invalid_length() {\n                let witness_program_error =\n                    WitnessProgram::new(INVALID_LENGTH_PROGRAM).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::InvalidProgramLength(1),\n                    witness_program_error\n                );\n            }\n\n            #[test]\n            fn new_invalid_program_length_for_version() {\n                let witness_program_error =\n                    WitnessProgram::new(INVALID_LENGTH_FOR_VERSION).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::InvalidProgramLengthForVersion(15, 0x00),\n                    witness_program_error\n                );\n            }\n\n            #[test]\n            fn new_invalid_program_length_too_long() {\n                let witness_program_error =\n                    WitnessProgram::new(INVALID_LENGTH_PROGRAM_TOO_LONG).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::InvalidProgramLength(41),\n                    witness_program_error\n                );\n            }\n        }\n\n        mod from_str {\n            use super::*;\n\n            const INVALID_P2SH_P2WPKH_PROGRAM_LENGTH: &str =\n                \"0014751e76e8199196d454941c45d1b3a323f143\";\n            const INVALID_P2SH_P2WSH_PROGRAM_LENGTH: &str =\n                \"00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c632960490\";\n            const INVALID_OP_1_PROGRAM_LENGTH: &str =\n                \"0128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f143\";\n            const INVALID_HEX_STR: &str = \"001122zzxxyy\";\n\n            #[test]\n            fn from_str_invalid_p2sh_p2wpkh_program_len() {\n                let witness_program_error =\n                    WitnessProgram::from_str(INVALID_P2SH_P2WPKH_PROGRAM_LENGTH).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::MismatchedProgramLength(18, 20),\n                    witness_program_error\n                );\n            }\n\n            #[test]\n            fn from_str_invalid_p2sh_p2wsh_program_len() {\n                let witness_program_error =\n                    WitnessProgram::from_str(INVALID_P2SH_P2WSH_PROGRAM_LENGTH).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::MismatchedProgramLength(30, 32),\n                    witness_program_error\n                );\n            }\n\n            #[test]\n            fn from_str_invalid_op_1_program_len() {\n                let witness_program_error =\n                    WitnessProgram::from_str(INVALID_OP_1_PROGRAM_LENGTH).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::MismatchedProgramLength(38, 40),\n                    witness_program_error\n                );\n            }\n\n            #[test]\n            fn from_str_invalid_hex_str() {\n                let witness_program_error = WitnessProgram::from_str(INVALID_HEX_STR).unwrap_err();\n                assert_eq!(\n                    WitnessProgramError::ProgramDecodingError,\n                    witness_program_error\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-cardano/Cargo.toml",
    "content": "[package]\nname = \"anychain-cardano\"\ndescription = \"A Rust library for Cardano-focused cryptocurrency wallets, enabling seamless transactions on the Solana blockchain\"\nversion = \"0.1.5\"\nkeywords = [\"cardano\", \"ada\", \"blockchain\", \"wallet\", \"transactions\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n[[example]]\nname = \"transfer-ada\"\npath = \"examples/transfer-ada.rs\"\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\n#anychain-kms = { path = \"../anychain-kms\", version = \"0.1.17\" }\nserde = { workspace = true }\ned25519-dalek = { workspace = true }\ncurve25519-dalek = { workspace = true }\ngroup = \"0.13.0\"\n# Cardano specific depends\ncml-chain = { workspace = true }\ncml-crypto = { workspace = true }\ncml-core = { workspace = true }\n#rand_core.workspace = true\n\n[dev-dependencies]\nhex = \"0.4.3\"\nbip39 = \"2.1.0\"\nblockfrost = \"1.0.5\"\ntokio = { version = \"1.0\", features = [\"full\"] }\n\n[features]\ndefault = [\"std\"]\nstd = [\"anychain-core/std\"]\n\n[lints]\nworkspace = true"
  },
  {
    "path": "crates/anychain-cardano/README.md",
    "content": "# anychain-cardano\n\nanychain-cardano is a Rust library that provides a simple and unified interface for interacting with the Cardano \nblockchain.\n\n## License\n\nanychain-cardano released under the MIT License. See the [LICENSE](LICENSE) file for more information. \n"
  },
  {
    "path": "crates/anychain-cardano/examples/transfer-ada.rs",
    "content": "use blockfrost::{BlockFrostSettings, BlockfrostAPI, BlockfrostResult, Pagination};\n// use cml_chain::builders::tx_builder::TransactionUnspentOutput;\nuse cml_chain::transaction::TransactionInput;\nuse cml_crypto::TransactionHash;\n\n//  const MNEMONIC_ALICE: &str = \"oak anchor meadow nerve limb true banner lock arena brisk width lottery frame walnut barrel innocent enhance feature one gate parade small alert hollow\";\nconst MNEMONIC_ALICE: &str = \"toe deal rival umbrella oak inch water hover option lawn essence panda wealth morning summer change soon casino spot decline rural unknown quarter disagree\";\n//  const MNEMONIC_BOB: &str = \"oak anchor meadow nerve limb true banner lock arena brisk width lottery frame walnut barrel innocent enhance feature one gate parade small alert hollow\";\nconst MNEMONIC_BOB: &str = \"rifle suffer defense test system measure dismiss ketchup enemy all iron clean assist tail rule razor cup source divert field that spatial food drop\";\n\nstruct CardanoTransactionParameters {\n    send_address: cml_chain::address::Address, // Sender's address\n    recv_address: cml_chain::address::Address, // Receiver's address\n    sender_private_key: String,                // Sender's private key\n    amount: u64,                               // Amount to transfer in lovelace\n    ttl: u64,                                  // Time-to-live (slot number)\n    transaction_input: TransactionInput,       // Transaction hash\n    transaction_output_amount: u64,\n}\n\nmod generating_keys {\n    use bip39::Mnemonic;\n    use cml_chain::address::{Address, BaseAddress};\n    use cml_chain::certs::StakeCredential;\n    use cml_chain::genesis::network_info::NetworkInfo;\n    use cml_crypto::{Bip32PrivateKey, Bip32PublicKey};\n\n    fn derive_key(\n        private_key: &Bip32PrivateKey,\n        account: u32,\n        chain: u32,\n        index: u32,\n    ) -> Bip32PublicKey {\n        private_key\n            .derive(harden(1852))\n            .derive(harden(1815))\n            .derive(harden(account))\n            .derive(chain)\n            .derive(index)\n            .to_public()\n    }\n\n    pub fn create_account(mnemonic_str: &str) -> Address {\n        // Parse the mnemonic\n        let mnemonic = Mnemonic::parse_normalized(mnemonic_str)\n            .unwrap_or_else(|e| panic!(\"Failed to parse mnemonic: {:?}\", e));\n\n        // Derive entropy and private key\n        let entropy = mnemonic.to_entropy();\n        let bip32_private_key = Bip32PrivateKey::from_bip39_entropy(&entropy, &[]);\n\n        // Derive spend and stake keys\n        let spend = derive_key(&bip32_private_key, 0, 0, 0);\n        let stake = derive_key(&bip32_private_key, 0, 2, 0);\n\n        // Create base address\n        let spend_cred = StakeCredential::new_pub_key(spend.to_raw_key().hash());\n        let stake_cred = StakeCredential::new_pub_key(stake.to_raw_key().hash());\n        BaseAddress::new(\n            NetworkInfo::testnet().network_id(),\n            spend_cred.clone(),\n            stake_cred.clone(),\n        )\n        .to_address()\n    }\n    pub fn create_signing_key(mnemonic_str: &str) -> String {\n        let mnemonic = Mnemonic::parse_normalized(mnemonic_str)\n            .unwrap_or_else(|e| panic!(\"Failed to parse mnemonic: {:?}\", e));\n        let entropy = mnemonic.to_entropy();\n        let bip32_private_key = Bip32PrivateKey::from_bip39_entropy(&entropy, &[]);\n        bip32_private_key\n            .derive(harden(1852))\n            .derive(harden(1815))\n            .derive(harden(0))\n            .derive(0)\n            .derive(0)\n            .to_raw_key()\n            .to_bech32()\n    }\n\n    fn harden(index: u32) -> u32 {\n        index | 0x80_00_00_00\n    }\n}\nmod tx_builder {\n    use super::CardanoTransactionParameters;\n    use cml_chain::builders::input_builder::SingleInputBuilder;\n    use cml_chain::builders::output_builder::TransactionOutputBuilder;\n    use cml_chain::builders::tx_builder::{\n        choose_change_selection_algo, ChangeSelectionAlgo, TransactionBuilder,\n        TransactionBuilderConfigBuilder,\n    };\n    use cml_chain::crypto::hash::hash_transaction;\n    use cml_chain::crypto::utils::make_vkey_witness;\n    use cml_chain::fees::LinearFee;\n    use cml_chain::genesis::network_info::plutus_alonzo_cost_models;\n    use cml_chain::plutus::ExUnitPrices;\n    use cml_chain::transaction::{TransactionOutput, TransactionWitnessSet};\n    use cml_chain::utils::NetworkId;\n    use cml_chain::{SubCoin, Value};\n    use cml_core::serialization::Serialize;\n\n    const MAX_VALUE_SIZE: u32 = 4000;\n    const MAX_TX_SIZE: u32 = 8000;\n\n    fn create_linear_fee(coefficient: u64, constant: u64) -> LinearFee {\n        LinearFee::new(coefficient, constant, 0)\n    }\n    fn create_default_linear_fee() -> LinearFee {\n        // create_linear_fee(500, 2)\n        create_linear_fee(1000, 2)\n    }\n\n    fn create_tx_builder_full(\n        linear_fee: LinearFee,\n        pool_deposit: u64,\n        key_deposit: u64,\n        max_val_size: u32,\n        coins_per_utxo_byte: u64,\n    ) -> TransactionBuilder {\n        let cfg = TransactionBuilderConfigBuilder::default()\n            .fee_algo(linear_fee)\n            .pool_deposit(pool_deposit)\n            .key_deposit(key_deposit)\n            .max_value_size(max_val_size)\n            .max_tx_size(MAX_TX_SIZE)\n            .coins_per_utxo_byte(coins_per_utxo_byte)\n            .ex_unit_prices(ExUnitPrices::new(\n                SubCoin::new(577, 10000),\n                SubCoin::new(721, 10000000),\n            ))\n            .collateral_percentage(150)\n            .max_collateral_inputs(3)\n            .cost_models(plutus_alonzo_cost_models())\n            .build()\n            .unwrap();\n        TransactionBuilder::new(cfg)\n    }\n\n    fn create_tx_builder(\n        linear_fee: LinearFee,\n        coins_per_utxo_byte: u64,\n        pool_deposit: u64,\n        key_deposit: u64,\n    ) -> TransactionBuilder {\n        create_tx_builder_full(\n            linear_fee,\n            pool_deposit,\n            key_deposit,\n            MAX_VALUE_SIZE,\n            coins_per_utxo_byte,\n        )\n    }\n\n    fn create_tx_builder_with_fee(linear_fee: LinearFee) -> TransactionBuilder {\n        create_tx_builder(linear_fee, 1, 1, 1)\n    }\n\n    fn create_default_tx_builder() -> TransactionBuilder {\n        create_tx_builder_with_fee(create_default_linear_fee())\n    }\n\n    pub fn build_tx_with_change(params: &CardanoTransactionParameters) -> Vec<u8> {\n        let mut tx_builder = create_default_tx_builder();\n\n        let input = {\n            SingleInputBuilder::new(\n                params.transaction_input.clone(),\n                TransactionOutput::new(\n                    params.send_address.clone(),\n                    Value::from(params.transaction_output_amount),\n                    None,\n                    None,\n                ),\n            )\n            .payment_key()\n            .unwrap()\n        };\n\n        tx_builder.add_input(input).unwrap();\n\n        tx_builder\n            .add_output(\n                TransactionOutputBuilder::new()\n                    .with_address(params.recv_address.clone())\n                    .next()\n                    .unwrap()\n                    .with_value(params.amount)\n                    .build()\n                    .unwrap(),\n            )\n            .unwrap();\n        // TODO: set fee\n        tx_builder.set_ttl(params.ttl + 200);\n\n        let change_addr = params.send_address.clone();\n\n        let added_change = choose_change_selection_algo(ChangeSelectionAlgo::Default)(\n            &mut tx_builder,\n            &change_addr,\n            false,\n        );\n\n        assert!(added_change.is_ok());\n        assert!(added_change.unwrap());\n\n        assert_eq!(\n            tx_builder\n                .get_explicit_input()\n                .unwrap()\n                .checked_add(&tx_builder.get_implicit_input().unwrap())\n                .unwrap(),\n            tx_builder\n                .get_explicit_output()\n                .unwrap()\n                .checked_add(&Value::from(tx_builder.get_fee_if_set().unwrap()))\n                .unwrap()\n        );\n\n        // assert_eq!(tx_builder.full_size().unwrap(), 294);\n        // assert_eq!(tx_builder.output_sizes(), vec![65, 65]);\n\n        // TODO: set network id\n        tx_builder.set_network_id(NetworkId::testnet());\n\n        let final_tx = tx_builder.build(ChangeSelectionAlgo::Default, &change_addr);\n\n        assert!(final_tx.is_ok());\n\n        let final_tx_builder = final_tx.unwrap();\n        let body = final_tx_builder.body();\n\n        let mut witness_set = TransactionWitnessSet::new();\n\n        let alice_private_key =\n            cml_crypto::PrivateKey::from_bech32(&params.sender_private_key).unwrap();\n\n        witness_set.vkeywitnesses = Some(\n            vec![make_vkey_witness(\n                &hash_transaction(&body),\n                &alice_private_key,\n            )]\n            .into(),\n        );\n\n        let final_tx = cml_chain::transaction::Transaction::new(body, witness_set, true, None);\n        let hex_encoded = hex::encode(final_tx.to_cbor_bytes());\n        dbg!(\"Hex Encoded Transaction: {}\", hex_encoded);\n\n        final_tx.to_cbor_bytes()\n    }\n}\n\n#[tokio::main]\nasync fn main() -> BlockfrostResult<()> {\n    let address_alice = generating_keys::create_account(MNEMONIC_ALICE);\n    let address_bob = generating_keys::create_account(MNEMONIC_BOB);\n\n    let api = BlockfrostAPI::new(\n        \"preprodwYU86nDDxOQKRAkTvp660AQu2pxLfh9l\",\n        BlockFrostSettings::new(),\n    );\n\n    assert_eq!(\n        address_alice.to_bech32(None).unwrap(),\n        \"addr_test1qztenh2rujsa47xgz0u53rjm4ape6urd4yua4f8u6h3rz2lg3cfqlr49zru49t7ejlwjxsdhy9rdafs3fs2yc2egzjeqfqgg4z\"\n    );\n    assert_eq!(\n        address_bob.to_bech32(None).unwrap(),\n        \"addr_test1qravems9gq7fqnnsx4u2eqpmx6v7d0h65slk0lsfpwhwew83s0t8du45gf8w86q27kadzqjwszck4hvf4avhjqu3l2esuqsd00\"\n    );\n\n    /*\n    let address = \"addr_test1qp5tjpeph2su74qrg60se276u6zvd90umxmctufxr0jf8gr7dsy677qxztemp72yqgu3xv35w2fts5c5k2c9szlrn5fqttkd5z\";\n    let addresses = api.addresses(address).await;\n    let addresses_total = api.addresses_total(address).await;\n    let addresses_utxos = api.addresses_utxos(address, Pagination::default()).await;\n    dbg!(&addresses);\n    dbg!(&addresses_total);\n    dbg!(&addresses_utxos);\n     */\n\n    let alice_address_content = api\n        .addresses(&address_alice.to_bech32(None).unwrap())\n        .await?;\n\n    //print alice and bob address content in mutiple lines\n    println!(\"Alice Address Content:\");\n    for amount in alice_address_content.amount {\n        println!(\"{:?}\", amount);\n    }\n\n    if let Ok(bob_address_content) = api.addresses(&address_bob.to_bech32(None).unwrap()).await {\n        println!(\"Bob Address Content:\");\n        for amount in bob_address_content.amount {\n            println!(\"{:?}\", amount);\n        }\n    } else {\n        println!(\"Bob address not found\");\n    }\n\n    let slot = api.blocks_latest().await;\n    let slot = slot?.slot.unwrap() as u64;\n\n    let alice_utxos = api\n        .addresses_utxos(&address_alice.to_bech32(None).unwrap(), Pagination::all())\n        .await?;\n\n    let alice_utxo = alice_utxos[0].clone();\n    println!(\n        \"Alice UTXOs: {}:{}, {:?}\",\n        alice_utxo.tx_hash, alice_utxo.output_index, alice_utxo\n    );\n\n    let params = CardanoTransactionParameters {\n        send_address: address_alice,\n        recv_address: address_bob,\n        sender_private_key: generating_keys::create_signing_key(MNEMONIC_ALICE),\n        amount: 10_000_000,\n        ttl: slot,\n        transaction_input: TransactionInput::new(\n            TransactionHash::from_hex(&alice_utxo.tx_hash).unwrap(),\n            alice_utxo.output_index as u64,\n        ),\n        transaction_output_amount: alice_utxo\n            .amount\n            .iter()\n            .find(|u| u.unit == \"lovelace\")\n            .unwrap()\n            .quantity\n            .parse()\n            .unwrap(),\n    };\n\n    // Should contain the correct cbor contents\n    let transaction_data = tx_builder::build_tx_with_change(&params);\n    let transaction_hash = api.transactions_submit(transaction_data).await?;\n    dbg!(&transaction_hash);\n    // println!(\"{}\", transaction_hash);\n\n    Ok(())\n}\n"
  },
  {
    "path": "crates/anychain-cardano/src/address.rs",
    "content": "use {\n    crate::{format::CardanoFormat, public_key::CardanoPublicKey},\n    anychain_core::{Address, AddressError, PublicKey},\n    core::{\n        fmt::{Display, Formatter, Result as FmtResult},\n        str::FromStr,\n    },\n    curve25519_dalek::Scalar,\n    std::hash::Hash,\n};\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct CardanoAddress(pub cml_chain::address::Address);\n\nimpl Address for CardanoAddress {\n    type SecretKey = Scalar;\n    type Format = CardanoFormat;\n    type PublicKey = CardanoPublicKey;\n\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        Self::PublicKey::from_secret_key(secret_key).to_address(format)\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        public_key.to_address(format)\n    }\n}\n\nimpl FromStr for CardanoAddress {\n    type Err = AddressError;\n\n    fn from_str(addr: &str) -> Result<Self, Self::Err> {\n        let address = cml_chain::address::Address::from_bech32(addr)\n            .map_err(|error| AddressError::InvalidAddress(format!(\"{:?}\", error)))?;\n        Ok(Self(address))\n    }\n}\n\nimpl Display for CardanoAddress {\n    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {\n        write!(f, \"{}\", self.0.to_bech32(None).unwrap())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::CardanoAddress;\n    use crate::{format::CardanoFormat, network::CardanoNetwork};\n    use anychain_core::Address;\n    use curve25519_dalek::Scalar;\n\n    #[test]\n    fn test() {\n        let sk = [\n            104u8, 78, 102, 228, 174, 250, 35, 99, 180, 223, 45, 40, 124, 22, 12, 130, 70, 82, 183,\n            48, 195, 95, 207, 80, 47, 5, 201, 222, 157, 148, 168, 13,\n        ];\n        let sk = Scalar::from_bytes_mod_order(sk);\n\n        let sk_to = [\n            189, 149, 70, 173, 231, 111, 65, 210, 164, 15, 24, 21, 180, 45, 148, 78, 252, 149, 36,\n            168, 70, 107, 84, 229, 47, 5, 213, 243, 253, 249, 19, 11u8,\n        ];\n        let sk_to = Scalar::from_bytes_mod_order(sk_to);\n\n        let format = CardanoNetwork::Preprod;\n        let format = CardanoFormat::Enterprise(format);\n\n        let from = CardanoAddress::from_secret_key(&sk, &format).unwrap();\n        let to = CardanoAddress::from_secret_key(&sk_to, &format).unwrap();\n\n        println!(\"from: {}\\nto: {}\\n\", from, to);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-cardano/src/amount.rs",
    "content": "//! Definitions for the native Cardano token and its fractional LOVELACE.\n\nuse {\n    anychain_core::{to_basic_unit_u64, Amount, AmountError},\n    core::fmt,\n    serde::{Deserialize, Serialize},\n    std::ops::{Add, Sub},\n};\n\n/// Represents the amount of SOL in lamports\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]\npub struct CardanoAmount(pub u64);\n\npub enum Denomination {\n    LOVELACE,\n    ADA,\n}\n\nimpl Denomination {\n    /// The number of decimal places more than one LOVELACE.\n    /// There are 10^6 LOVELACE in one ADA\n    fn precision(self) -> u64 {\n        match self {\n            Denomination::LOVELACE => 0,\n\n            Denomination::ADA => 6,\n        }\n    }\n}\n\nimpl fmt::Display for Denomination {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            match self {\n                Denomination::LOVELACE => \"lovelace\",\n                Denomination::ADA => \"ADA\",\n            }\n        )\n    }\n}\n\nimpl Amount for CardanoAmount {}\n\nimpl CardanoAmount {\n    pub fn from_u64(lovelace: u64) -> Self {\n        Self(lovelace)\n    }\n\n    pub fn from_u64_str(value: &str) -> Result<u64, AmountError> {\n        match value.parse::<u64>() {\n            Ok(lovelace) => Ok(lovelace),\n            Err(error) => Err(AmountError::Crate(\"uint\", format!(\"{:?}\", error))),\n        }\n    }\n    pub fn from_lovelace(lovelace_value: &str) -> Result<Self, AmountError> {\n        let lovelace = Self::from_u64_str(lovelace_value)?;\n        Ok(Self::from_u64(lovelace))\n    }\n\n    pub fn from_ada(sol_value: &str) -> Result<Self, AmountError> {\n        let lovelace_value = to_basic_unit_u64(sol_value, Denomination::ADA.precision());\n        let lovelace = Self::from_u64_str(&lovelace_value)?;\n        Ok(Self::from_u64(lovelace))\n    }\n}\n\nimpl Add for CardanoAmount {\n    type Output = Self;\n    fn add(self, rhs: Self) -> Self {\n        Self(self.0 + rhs.0)\n    }\n}\n\nimpl Sub for CardanoAmount {\n    type Output = Self;\n    fn sub(self, rhs: Self) -> Self::Output {\n        Self(self.0 - rhs.0)\n    }\n}\n\nimpl fmt::Display for CardanoAmount {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n#[cfg(test)]\n#[allow(dead_code)]\nmod tests {\n    use super::*;\n\n    fn test_from_lovelace(lovelace_value: &str, expected_amount: &str) {\n        let amount = CardanoAmount::from_lovelace(lovelace_value).unwrap();\n        assert_eq!(expected_amount, amount.to_string())\n    }\n\n    fn test_from_ada(ada_value: &str, expected_amount: &str) {\n        let amount = CardanoAmount::from_ada(ada_value).unwrap();\n        assert_eq!(expected_amount, amount.to_string())\n    }\n\n    pub struct AmountDenominationTestCase {\n        lovelace: &'static str,\n        ada: &'static str,\n    }\n\n    const TEST_AMOUNTS: [AmountDenominationTestCase; 2] = [\n        AmountDenominationTestCase {\n            lovelace: \"0\",\n            ada: \"0\",\n        },\n        AmountDenominationTestCase {\n            lovelace: \"1000000\",\n            ada: \"1\",\n        },\n    ];\n\n    #[test]\n    fn test_lovelace_conversion() {\n        TEST_AMOUNTS\n            .iter()\n            .for_each(|amounts| test_from_lovelace(amounts.lovelace, amounts.lovelace));\n    }\n\n    #[test]\n    fn test_sol_conversion() {\n        TEST_AMOUNTS\n            .iter()\n            .for_each(|amounts| test_from_ada(amounts.ada, amounts.lovelace));\n    }\n\n    fn test_addition(a: &str, b: &str, result: &str) {\n        let a = CardanoAmount::from_lovelace(a).unwrap();\n        let b = CardanoAmount::from_lovelace(b).unwrap();\n        let result = CardanoAmount::from_lovelace(result).unwrap();\n\n        assert_eq!(result, a.add(b));\n    }\n\n    fn test_subtraction(a: &str, b: &str, result: &str) {\n        let a = CardanoAmount::from_lovelace(a).unwrap();\n        let b = CardanoAmount::from_lovelace(b).unwrap();\n        let result = CardanoAmount::from_lovelace(result).unwrap();\n\n        assert_eq!(result, a.sub(b));\n    }\n    mod valid_arithmetic {\n        use super::*;\n\n        const TEST_VALUES: [(&str, &str, &str); 5] = [\n            (\"0\", \"0\", \"0\"),\n            (\"1\", \"2\", \"3\"),\n            (\"100000\", \"0\", \"100000\"),\n            (\"123456789\", \"987654321\", \"1111111110\"),\n            (\"1000000000000000\", \"2000000000000000\", \"3000000000000000\"),\n        ];\n\n        #[test]\n        fn test_valid_addition() {\n            TEST_VALUES\n                .iter()\n                .for_each(|(a, b, c)| test_addition(a, b, c));\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-cardano/src/format.rs",
    "content": "use crate::network::CardanoNetwork;\nuse {\n    anychain_core::Format,\n    core::{default::Default, fmt},\n};\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum CardanoFormat {\n    Base(CardanoNetwork),\n    Enterprise(CardanoNetwork),\n    Reward(CardanoNetwork),\n    Byron(CardanoNetwork),\n}\nimpl CardanoFormat {}\n\nimpl Default for CardanoFormat {\n    fn default() -> Self {\n        Self::Base(CardanoNetwork::default())\n    }\n}\n\nimpl Format for CardanoFormat {}\n\nimpl fmt::Display for CardanoFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        match self {\n            CardanoFormat::Base(_) => write!(f, \"base\"),\n            CardanoFormat::Enterprise(_) => write!(f, \"enterprise\"),\n            CardanoFormat::Reward(_) => write!(f, \"reward\"),\n            CardanoFormat::Byron(_) => write!(f, \"byron\"),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_display() {\n        assert_eq!(\n            CardanoFormat::Base(CardanoNetwork::Mainnet).to_string(),\n            \"base\"\n        );\n        assert_eq!(\n            CardanoFormat::Enterprise(CardanoNetwork::Mainnet).to_string(),\n            \"enterprise\"\n        );\n        assert_eq!(\n            CardanoFormat::Reward(CardanoNetwork::Mainnet).to_string(),\n            \"reward\"\n        );\n        assert_eq!(\n            CardanoFormat::Byron(CardanoNetwork::Mainnet).to_string(),\n            \"byron\"\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-cardano/src/lib.rs",
    "content": "pub mod address;\npub mod amount;\npub mod format;\npub mod network;\npub mod public_key;\npub mod transaction;\nmod util;\n\npub use self::address::*;\npub use self::amount::*;\npub use self::format::*;\npub use self::network::*;\npub use self::public_key::*;\npub use self::transaction::*;\n"
  },
  {
    "path": "crates/anychain-cardano/src/network.rs",
    "content": "/// Mainnet: This is the primary network where actual transactions occur and real ADA is used.\n/// It is the live network used by end-users and applications.\n///\n/// Preview: This is a testing environment that mimics the mainnet but uses test ADA.\n/// It is used for testing new features and updates before they are deployed to the mainnet.\n///\n/// Preprod: This is another testing environment similar to TestnetPreview, but it may be used for pre-production testing.\n/// It allows developers to test their applications in an environment that closely resembles the mainnet before final deployment.\n\n#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum CardanoNetwork {\n    #[default]\n    Mainnet,\n    Preprod,\n    Preview,\n}\n\nimpl CardanoNetwork {\n    pub fn info(&self) -> CardanoNetworkInfo {\n        match self {\n            CardanoNetwork::Mainnet => CardanoNetworkInfo::mainnet(),\n            CardanoNetwork::Preprod => CardanoNetworkInfo::preprod(),\n            CardanoNetwork::Preview => CardanoNetworkInfo::preview(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]\npub struct CardanoNetworkInfo {\n    network_id: u8,\n    protocol_magic: u32,\n}\nimpl CardanoNetworkInfo {\n    pub fn new(network_id: u8, protocol_magic: u32) -> Self {\n        Self {\n            network_id,\n            protocol_magic,\n        }\n    }\n    pub fn network_id(&self) -> u8 {\n        self.network_id\n    }\n    pub fn protocol_magic(&self) -> u32 {\n        self.protocol_magic\n    }\n    pub fn mainnet() -> CardanoNetworkInfo {\n        CardanoNetworkInfo {\n            network_id: 0b0001,\n            protocol_magic: 764824073,\n        }\n    }\n    pub fn preprod() -> CardanoNetworkInfo {\n        CardanoNetworkInfo {\n            network_id: 0b0000,\n            protocol_magic: 1,\n        }\n    }\n    pub fn preview() -> CardanoNetworkInfo {\n        CardanoNetworkInfo {\n            network_id: 0b0000,\n            protocol_magic: 2,\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-cardano/src/public_key.rs",
    "content": "use {\n    crate::{address::CardanoAddress, format::CardanoFormat},\n    anychain_core::{AddressError, PublicKey, PublicKeyError},\n    cml_chain::{\n        address::{EnterpriseAddress, RewardAddress},\n        certs::StakeCredential,\n    },\n    cml_crypto::{blake2b224, Ed25519KeyHash},\n    core::{fmt, str::FromStr},\n    curve25519_dalek::{constants::ED25519_BASEPOINT_TABLE as G, Scalar},\n    group::GroupEncoding,\n};\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct CardanoPublicKey(pub ed25519_dalek::VerifyingKey);\n\nimpl PublicKey for CardanoPublicKey {\n    type SecretKey = Scalar;\n    type Address = CardanoAddress;\n    type Format = CardanoFormat;\n\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        let pk = secret_key * G;\n        let pk = pk.to_bytes();\n        let pk = ed25519_dalek::VerifyingKey::from_bytes(&pk).unwrap();\n        Self(pk)\n    }\n\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError> {\n        let bytes = self.0.as_bytes();\n        let hash = blake2b224(bytes);\n        let hash = Ed25519KeyHash::from(hash);\n        let cred = StakeCredential::new_pub_key(hash);\n\n        match format {\n            CardanoFormat::Enterprise(network) => {\n                let address =\n                    EnterpriseAddress::new(network.info().network_id(), cred).to_address();\n                Ok(CardanoAddress(address))\n            }\n            CardanoFormat::Reward(network) => {\n                let address = RewardAddress::new(network.info().network_id(), cred).to_address();\n                Ok(CardanoAddress(address))\n            }\n            _ => Err(AddressError::Message(\"unsupported format\".to_string())),\n        }\n    }\n}\n\nimpl FromStr for CardanoPublicKey {\n    type Err = PublicKeyError;\n\n    fn from_str(_: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\nimpl fmt::Display for CardanoPublicKey {\n    fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-cardano/src/transaction.rs",
    "content": "use crate::util::create_default_tx_builder;\nuse crate::{CardanoAddress, CardanoFormat, CardanoPublicKey};\nuse anychain_core::{Transaction, TransactionError, TransactionId};\nuse cml_chain::Deserialize;\nuse cml_chain::{\n    assets::Value,\n    builders::{\n        input_builder::SingleInputBuilder, output_builder::TransactionOutputBuilder,\n        tx_builder::ChangeSelectionAlgo,\n    },\n    crypto::{Vkey, Vkeywitness},\n    transaction::{\n        Transaction as SignedTransaction, TransactionInput, TransactionOutput,\n        TransactionWitnessSet,\n    },\n    utils::NetworkId,\n};\nuse cml_core::serialization::{RawBytesEncoding, Serialize};\nuse cml_crypto::{blake2b256, Ed25519Signature, TransactionHash};\nuse std::{fmt, str::FromStr};\n\n#[derive(Debug, Clone)]\npub struct Input {\n    pub txid: String,\n    pub index: u64,\n    pub address: Option<CardanoAddress>,\n    pub amount: Option<u64>,\n}\n\n#[derive(Debug, Clone)]\npub struct Output {\n    pub address: CardanoAddress,\n    pub amount: u64,\n}\n\n#[derive(Debug, Clone)]\npub struct CardanoTransactionParameters {\n    pub inputs: Vec<Input>,\n    pub outputs: Vec<Output>,\n    pub slot: u64,\n    pub network: u8,\n}\n\n#[derive(Debug, Clone)]\npub struct CardanoSignature {\n    pub public_key: Vec<u8>,\n    pub rs: Vec<u8>,\n}\n\n#[derive(Debug, Clone)]\npub struct CardanoTransaction {\n    pub params: CardanoTransactionParameters,\n    pub signatures: Option<Vec<CardanoSignature>>,\n}\n\nimpl FromStr for CardanoTransaction {\n    type Err = TransactionError;\n    fn from_str(_: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct CardanoTransactionId(pub [u8; 32]);\n\nimpl fmt::Display for CardanoTransactionId {\n    fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result {\n        todo!()\n    }\n}\n\nimpl TransactionId for CardanoTransactionId {}\n\nimpl CardanoTransaction {\n    pub fn sign(&mut self, sigs: Vec<CardanoSignature>) -> Result<Vec<u8>, TransactionError> {\n        self.signatures = Some(sigs);\n        self.to_bytes()\n    }\n}\n\nimpl Transaction for CardanoTransaction {\n    type Address = CardanoAddress;\n    type Format = CardanoFormat;\n    type PublicKey = CardanoPublicKey;\n    type TransactionId = CardanoTransactionId;\n    type TransactionParameters = CardanoTransactionParameters;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(CardanoTransaction {\n            params: params.clone(),\n            signatures: None,\n        })\n    }\n\n    fn sign(&mut self, _: Vec<u8>, _: u8) -> Result<Vec<u8>, TransactionError> {\n        todo!()\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        let mut builder = create_default_tx_builder();\n        let change_address = self.params.inputs[0].address.clone();\n        let change_address = &change_address.unwrap().0;\n\n        for input in &self.params.inputs {\n            let txid = TransactionHash::from_hex(&input.txid)\n                .map_err(|e| TransactionError::Message(e.to_string()))?;\n            let address = input.address.clone().unwrap().0.clone();\n            let amount = Value::from(input.amount.unwrap());\n\n            let input = TransactionInput::new(txid, input.index);\n\n            let output = TransactionOutput::new(address, amount, None, None);\n\n            let input = SingleInputBuilder::new(input, output)\n                .payment_key()\n                .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n            builder\n                .add_input(input)\n                .map_err(|e| TransactionError::Message(e.to_string()))?;\n        }\n\n        for output in &self.params.outputs {\n            let output = TransactionOutputBuilder::new()\n                .with_address(output.address.0.clone())\n                .next()\n                .map_err(|e| TransactionError::Message(e.to_string()))?\n                .with_value(output.amount)\n                .build()\n                .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n            builder\n                .add_output(output)\n                .map_err(|e| TransactionError::Message(e.to_string()))?;\n        }\n\n        let input_amount = builder\n            .get_explicit_input()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n        let output_amount = builder\n            .get_explicit_output()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n        let fee = input_amount.coin - output_amount.coin;\n        builder.set_fee(fee);\n\n        let network = NetworkId::from(self.params.network as u64);\n        builder.set_network_id(network);\n\n        builder.set_ttl(self.params.slot + 200);\n\n        let tx = builder\n            .build(ChangeSelectionAlgo::Default, change_address)\n            .map_err(|e| TransactionError::Message(e.to_string()))?\n            .body();\n\n        match &self.signatures {\n            Some(sigs) => {\n                let mut witnesses = vec![];\n\n                for sig in sigs {\n                    let pk = sig.public_key.as_slice();\n                    let rs = sig.rs.as_slice();\n\n                    let pk = Vkey::from_raw_bytes(pk)\n                        .map_err(|e| TransactionError::Message(e.to_string()))?;\n                    let rs = Ed25519Signature::from_raw_bytes(rs)\n                        .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n                    let witness = Vkeywitness::new(pk, rs);\n\n                    witnesses.push(witness);\n                }\n\n                let mut witness_set = TransactionWitnessSet::new();\n                witness_set.vkeywitnesses = Some(witnesses.into());\n\n                let signed_tx = SignedTransaction::new(tx, witness_set, true, None);\n\n                Ok(signed_tx.to_cbor_bytes())\n            }\n            None => Ok(tx.to_cbor_bytes()),\n        }\n    }\n\n    fn from_bytes(stream: &[u8]) -> Result<Self, TransactionError> {\n        let signed_tx = SignedTransaction::from_cbor_bytes(stream)\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let tx = signed_tx.body;\n\n        let mut inputs = vec![];\n        let mut outputs = vec![];\n\n        for input in tx.inputs {\n            let txid = input.transaction_id.to_hex();\n            let index = input.index;\n\n            inputs.push(Input {\n                txid,\n                index,\n                address: None,\n                amount: None,\n            });\n        }\n\n        for output in tx.outputs {\n            let address = CardanoAddress(output.address().clone());\n            let amount = output.amount().coin;\n\n            outputs.push(Output { address, amount });\n        }\n\n        let network_id = tx.network_id.unwrap().network as u8;\n\n        Self::new(&CardanoTransactionParameters {\n            inputs,\n            outputs,\n            slot: 0,\n            network: network_id,\n        })\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        let hash = blake2b256(&self.to_bytes()?);\n        Ok(CardanoTransactionId(hash))\n    }\n}\n\n// #[cfg(test)]\n// mod tests {\n//     use super::{CardanoTransaction, CardanoTransactionParameters, Input, Output};\n//     use crate::{CardanoAddress, CardanoPublicKey, CardanoSignature};\n//     use anychain_core::{PublicKey, Transaction};\n//     use anychain_kms::ed25519_sign;\n//     use blockfrost::{BlockFrostSettings, BlockfrostAPI, Pagination};\n//     use curve25519_dalek::Scalar;\n//     use std::str::FromStr;\n//     use tokio::runtime::Runtime;\n\n//     #[test]\n//     fn test() {\n//         let api = BlockfrostAPI::new(\n//             \"preprodwYU86nDDxOQKRAkTvp660AQu2pxLfh9l\",\n//             BlockFrostSettings::new(),\n//         );\n\n//         let sk1 = [\n//             104u8, 78, 102, 228, 174, 250, 35, 99, 180, 223, 45, 40, 124, 22, 12, 130, 70, 82, 183,\n//             48, 195, 95, 207, 80, 47, 5, 201, 222, 157, 148, 168, 13,\n//         ];\n\n//         let sk2 = [\n//             105u8, 78, 102, 228, 174, 250, 35, 98, 181, 23, 45, 40, 124, 22, 127, 130, 70, 82, 183,\n//             48, 5, 95, 207, 180, 47, 15, 201, 12, 157, 148, 168, 13,\n//         ];\n\n//         let sk1 = Scalar::from_bytes_mod_order(sk1);\n//         let pk1 = CardanoPublicKey::from_secret_key(&sk1).0;\n//         let pk1 = pk1.to_bytes().to_vec();\n\n//         let sk2 = Scalar::from_bytes_mod_order(sk2);\n//         let pk2 = CardanoPublicKey::from_secret_key(&sk2).0;\n//         let pk2 = pk2.to_bytes().to_vec();\n\n//         let from1 = \"addr_test1vrxhpfe4dxarnwpdhckjqu2ncc9q90ne8ewszgaree9secczx006l\";\n//         let from2 = \"addr_test1vrlum7eyq5t0s8z96fyr83v6q0vust6ygexax29z4xtahcc4egk9j\";\n\n//         let mut inputs = vec![];\n\n//         let utxos = Runtime::new()\n//             .unwrap()\n//             .block_on(async { api.addresses_utxos(from1, Pagination::all()).await.unwrap() });\n\n//         for utxo in utxos {\n//             let txid = utxo.tx_hash;\n//             let index = utxo.output_index as u64;\n//             let address = CardanoAddress::from_str(&utxo.address).unwrap();\n//             let amount: u64 = utxo\n//                 .amount\n//                 .iter()\n//                 .find(|u| u.unit == \"lovelace\")\n//                 .unwrap()\n//                 .quantity\n//                 .parse()\n//                 .unwrap();\n\n//             inputs.push(Input {\n//                 txid,\n//                 index,\n//                 address: Some(address),\n//                 amount: Some(amount),\n//             });\n//         }\n\n//         let utxos = Runtime::new()\n//             .unwrap()\n//             .block_on(async { api.addresses_utxos(from2, Pagination::all()).await.unwrap() });\n\n//         for utxo in utxos {\n//             let txid = utxo.tx_hash;\n//             let index = utxo.output_index as u64;\n//             let address = CardanoAddress::from_str(&utxo.address).unwrap();\n//             let amount: u64 = utxo\n//                 .amount\n//                 .iter()\n//                 .find(|u| u.unit == \"lovelace\")\n//                 .unwrap()\n//                 .quantity\n//                 .parse()\n//                 .unwrap();\n\n//             inputs.push(Input {\n//                 txid,\n//                 index,\n//                 address: Some(address),\n//                 amount: Some(amount),\n//             });\n//         }\n\n//         let to = \"addr_test1vz9v4d75kzw7t8nnfnn7ua9c85khelnq2y7fp3p6646szucc5xk6n\";\n//         let to = CardanoAddress::from_str(to).unwrap();\n//         let amount = 100000000u64;\n\n//         let to1 = Output {\n//             address: to,\n//             amount,\n//         };\n\n//         let to = \"addr_test1vrxhpfe4dxarnwpdhckjqu2ncc9q90ne8ewszgaree9secczx006l\";\n//         let to = CardanoAddress::from_str(to).unwrap();\n//         let amount = 9800000000u64;\n\n//         let to2 = Output {\n//             address: to,\n//             amount,\n//         };\n\n//         let outputs = vec![to1, to2];\n\n//         let slot = Runtime::new()\n//             .unwrap()\n//             .block_on(async { api.blocks_latest().await.unwrap().slot.unwrap() as u64 });\n\n//         let network = 0u8; // 0 indicates testnet, 1 indicates mainnet\n\n//         let params = CardanoTransactionParameters {\n//             inputs,\n//             outputs,\n//             slot,\n//             network,\n//         };\n\n//         let mut tx = CardanoTransaction::new(&params).unwrap();\n//         let msg = tx.to_transaction_id().unwrap().0.to_vec();\n\n//         let rs1 = ed25519_sign(&sk1, &msg).unwrap();\n//         let rs2 = ed25519_sign(&sk2, &msg).unwrap();\n\n//         let sig1 = CardanoSignature {\n//             public_key: pk1,\n//             rs: rs1,\n//         };\n\n//         let sig2 = CardanoSignature {\n//             public_key: pk2,\n//             rs: rs2,\n//         };\n\n//         let tx = tx.sign(vec![sig1, sig2]).unwrap();\n\n//         let tx = CardanoTransaction::from_bytes(&tx).unwrap();\n\n//         println!(\"{:?}\", tx);\n\n//         // let res = Runtime::new()\n//         //     .unwrap()\n//         //     .block_on(async { api.transactions_submit(tx).await.unwrap() });\n\n//         // println!(\"res: {}\", res);\n//     }\n// }\n"
  },
  {
    "path": "crates/anychain-cardano/src/util.rs",
    "content": "use cml_chain::builders::tx_builder::{TransactionBuilder, TransactionBuilderConfigBuilder};\nuse cml_chain::fees::LinearFee;\nuse cml_chain::genesis::network_info::plutus_alonzo_cost_models;\nuse cml_chain::plutus::ExUnitPrices;\nuse cml_chain::SubCoin;\n\nconst MAX_VALUE_SIZE: u32 = 4000;\nconst MAX_TX_SIZE: u32 = 8000;\n\nfn create_linear_fee(coefficient: u64, constant: u64) -> LinearFee {\n    LinearFee::new(coefficient, constant, 0)\n}\n\nfn create_default_linear_fee() -> LinearFee {\n    // create_linear_fee(500, 2)\n    create_linear_fee(1000, 2)\n}\n\nfn create_tx_builder_full(\n    linear_fee: LinearFee,\n    pool_deposit: u64,\n    key_deposit: u64,\n    max_val_size: u32,\n    coins_per_utxo_byte: u64,\n) -> TransactionBuilder {\n    let cfg = TransactionBuilderConfigBuilder::default()\n        .fee_algo(linear_fee)\n        .pool_deposit(pool_deposit)\n        .key_deposit(key_deposit)\n        .max_value_size(max_val_size)\n        .max_tx_size(MAX_TX_SIZE)\n        .coins_per_utxo_byte(coins_per_utxo_byte)\n        .ex_unit_prices(ExUnitPrices::new(\n            SubCoin::new(577, 10000),\n            SubCoin::new(721, 10000000),\n        ))\n        .collateral_percentage(150)\n        .max_collateral_inputs(3)\n        .cost_models(plutus_alonzo_cost_models())\n        .build()\n        .unwrap();\n    TransactionBuilder::new(cfg)\n}\n\nfn create_tx_builder(\n    linear_fee: LinearFee,\n    coins_per_utxo_byte: u64,\n    pool_deposit: u64,\n    key_deposit: u64,\n) -> TransactionBuilder {\n    create_tx_builder_full(\n        linear_fee,\n        pool_deposit,\n        key_deposit,\n        MAX_VALUE_SIZE,\n        coins_per_utxo_byte,\n    )\n}\n\nfn create_tx_builder_with_fee(linear_fee: LinearFee) -> TransactionBuilder {\n    create_tx_builder(linear_fee, 1, 1, 1)\n}\n\npub fn create_default_tx_builder() -> TransactionBuilder {\n    create_tx_builder_with_fee(create_default_linear_fee())\n}\n"
  },
  {
    "path": "crates/anychain-cardano/tests/test_derive.rs",
    "content": "use bip39::Mnemonic;\nuse cml_chain::{\n    address::{Address, AddressKind, BaseAddress},\n    certs::StakeCredential,\n    genesis::network_info::NetworkInfo,\n};\nuse cml_crypto::{Bip32PrivateKey, Bip32PublicKey};\n\nfn harden(index: u32) -> u32 {\n    index | 0x80_00_00_00\n}\n\nstatic BASE_ADDR_ALICE: &str = \"addr_test1qp5tjpeph2su74qrg60se276u6zvd90umxmctufxr0jf8gr7dsy677qxztemp72yqgu3xv35w2fts5c5k2c9szlrn5fqttkd5z\";\nstatic BASE_ADDR_BOB: &str = \"addr_test1qz68r5889sfly48tvr3kmlcf2uc8dxvyk598mkt8qd200z8r8yuyp7vaas4ezh9pdn5vu3wzlntj0h6qdnt4mrmqu0pqt62yar\";\n\n/// Helper function to derive keys\nfn derive_key(\n    private_key: &Bip32PrivateKey,\n    account: u32,\n    chain: u32,\n    index: u32,\n) -> Bip32PublicKey {\n    private_key\n        .derive(harden(1852))\n        .derive(harden(1815))\n        .derive(harden(account))\n        .derive(chain)\n        .derive(index)\n        .to_public()\n}\n\n#[test]\nfn test_derive_alice() {\n    // Parse the mnemonic\n    let mnemonic_str = \"lazy habit orient public finger other absorb shine cause mind general spend exit innocent drama\";\n    let mnemonic = Mnemonic::parse_normalized(mnemonic_str)\n        .unwrap_or_else(|e| panic!(\"Failed to parse mnemonic: {:?}\", e));\n\n    // Derive entropy and private key\n    let entropy = mnemonic.to_entropy();\n    let bip32_private_key = Bip32PrivateKey::from_bip39_entropy(&entropy, &[]);\n    // dbg!(&bip32_private_key.to_bech32());\n    let bip32_public_key = bip32_private_key.to_public();\n\n    // Verify the public key\n    assert_eq!(\n        bip32_public_key.to_bech32(),\n        \"xpub1gyuwtxy45wmzjsetlrx82mhg86c98zvnwvl7yvaxwt5g5f7aau9usq4e9gwraq2qh5j2ywml0smhflslxfsj0hjqnmzspclprkp5tkcmfgu4v\"\n    );\n\n    // Derive spend and stake keys\n    let spend = derive_key(&bip32_private_key, 0, 0, 0);\n    let stake = derive_key(&bip32_private_key, 0, 2, 0);\n\n    // Create base address\n    let spend_cred = StakeCredential::new_pub_key(spend.to_raw_key().hash());\n    let stake_cred = StakeCredential::new_pub_key(stake.to_raw_key().hash());\n    let address =\n        BaseAddress::new(NetworkInfo::testnet().network_id(), spend_cred, stake_cred).to_address();\n\n    // Verify the base address\n    let address_bech32 = address.to_bech32(None).unwrap();\n    assert_eq!(address_bech32, BASE_ADDR_ALICE);\n}\n\n#[test]\nfn test_derive_bob() {\n    // Parse the mnemonic\n    let mnemonic_str = \"oak anchor meadow nerve limb true banner lock arena brisk width lottery frame walnut barrel innocent enhance feature one gate parade small alert hollow\";\n    let mnemonic = Mnemonic::parse_normalized(mnemonic_str)\n        .unwrap_or_else(|e| panic!(\"Failed to parse mnemonic: {:?}\", e));\n\n    // Derive entropy and private key\n    let entropy = mnemonic.to_entropy();\n    let bip32_private_key = Bip32PrivateKey::from_bip39_entropy(&entropy, &[]);\n\n    // Derive spend and stake keys\n    let spend = derive_key(&bip32_private_key, 0, 0, 0);\n    let stake = derive_key(&bip32_private_key, 0, 2, 0);\n\n    // Create base address\n    let spend_cred = StakeCredential::new_pub_key(spend.to_raw_key().hash());\n    let stake_cred = StakeCredential::new_pub_key(stake.to_raw_key().hash());\n    let address =\n        BaseAddress::new(NetworkInfo::testnet().network_id(), spend_cred, stake_cred).to_address();\n\n    // Verify the base address\n    let address_bech32 = address.to_bech32(None).unwrap();\n    assert_eq!(address_bech32, BASE_ADDR_BOB);\n}\n#[test]\nfn test_from_address() {\n    // Parse the base address\n    let base_address = Address::from_bech32(BASE_ADDR_ALICE)\n        .unwrap_or_else(|e| panic!(\"Failed to parse address: {:?}\", e));\n\n    // Verify address properties\n    assert_eq!(AddressKind::Base, base_address.kind());\n    assert_eq!(\n        base_address.network_id().unwrap(),\n        NetworkInfo::testnet().network_id()\n    );\n}\n"
  },
  {
    "path": "crates/anychain-core/Cargo.toml",
    "content": "[package]\nname = \"anychain-core\"\nversion = \"0.1.8\"\ndescription = \"A core support for cryptocurrency wallets\"\ncategories = [\"command-line-utilities\", \"cryptography::cryptocurrencies\"]\nkeywords = [\"bitcoin\", \"blockchain\", \"ethereum\", \"no_std\"]\nreadme = \"README.md\"\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n[dependencies]\nsha3 = { workspace = true }\nthiserror = { workspace = true }\nripemd = { workspace = true }\nbech32 = { workspace = true }\nhex = { workspace = true }\nbase58 = { workspace = true , optional = true }\nrand_core = { workspace = true }\nserde_json = { workspace = true }\nsha2 = { workspace = true }\n\n[features]\ndefault = [\"std\"]\nstd = [\"base58\"]\n"
  },
  {
    "path": "crates/anychain-core/README.md",
    "content": "# anychain-core\n\nanychain-core is a Rust crate that provides core functionality for working with various blockchain implementations. This crate aims to simplify the process of integrating different blockchain technologies into your projects by providing a unified interface and a set of common utilities.\n\n## Features\n\n- Unified interface for interacting with multiple blockchain implementations\n- Support for popular blockchain platforms (e.g., Ethereum, Bitcoin, etc.)\n- Extensible design for adding custom blockchain implementations\n- Utility functions for common tasks (e.g., address validation, transaction signing, etc.)\n\n## Getting Started\n\nTo start using anychain-core, add it as a dependency in your Cargo.toml file:\n```toml\n[dependencies]\nanychain-core = \"0.1.7\"\n```\n\nThen, import the crate in your Rust code:\n```rust\nextern crate anychain_core;\n```\n\n## Usage\n\nHere's a basic example of how to use anychain-core to interact with an Ethereum blockchain:\n```rust\nuse anychain_core::{Blockchain, Ethereum};\n\nfn main() {\n    let eth = Ethereum::new(\"https://mainnet.infura.io/v3/YOUR-API-KEY\");\n\n    let balance = eth.get_balance(\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\").unwrap();\n    println!(\"Balance: {}\", balance);\n}\n```\n\nFor more examples and usage details, please refer to the [documentation](https://docs.rs/anychain-core).\n\n## Contributing\n\nWe welcome contributions to anychain-core! If you'd like to contribute, please follow these steps:\n\n1. Fork the repository on GitHub\n2. Create a new branch for your changes\n3. Make your changes and commit them to your branch\n4. Submit a pull request to merge your changes into the main repository\n\nPlease make sure to write tests for your changes and follow the existing coding style.\n\n## License\n\nanychain-core is licensed under the MIT License. See the [LICENSE](LICENSE) file for more information "
  },
  {
    "path": "crates/anychain-core/src/address.rs",
    "content": "use crate::{\n    format::Format,\n    no_std::{\n        fmt::{Debug, Display},\n        hash::Hash,\n        FromStr, String,\n    },\n    public_key::{PublicKey, PublicKeyError},\n};\n\n/// The interface for a generic address.\npub trait Address:\n    'static + Clone + Debug + Display + FromStr + Hash + PartialEq + Eq + Send + Sized + Sync\n{\n    type SecretKey;\n    type Format: Format;\n    type PublicKey: PublicKey;\n\n    /// Returns the address corresponding to the given private key.\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError>;\n\n    /// Returns the address corresponding to the given public key.\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError>;\n\n    fn is_valid(address: &str) -> bool {\n        Self::from_str(address).is_ok()\n    }\n}\n\n#[derive(Debug, Error)]\npub enum AddressError {\n    #[error(\"{0:}: {1:}\")]\n    Crate(&'static str, String),\n\n    #[error(\"invalid format conversion from {0:} to {1:}\")]\n    IncompatibleFormats(String, String),\n\n    #[error(\"invalid address: {0:}\")]\n    InvalidAddress(String),\n\n    #[error(\"invalid byte length: {0:}\")]\n    InvalidByteLength(usize),\n\n    #[error(\"invalid character length: {0:}\")]\n    InvalidCharacterLength(usize),\n\n    #[error(\"invalid address checksum: {{ expected: {0:}, found: {1:} }}\")]\n    InvalidChecksum(String, String),\n\n    #[error(\"invalid network: {{ expected: {0}, found: {1} }}\")]\n    InvalidNetwork(String, String),\n\n    #[error(\"invalid address prefix: {0:}\")]\n    InvalidPrefix(String),\n\n    #[error(\"invalid address prefix length: {0:?}\")]\n    InvalidPrefixLength(usize),\n\n    #[error(\"{0}\")]\n    Message(String),\n\n    #[error(\"missing public spend key and/or public view key\")]\n    MissingPublicKey,\n\n    #[error(\"{0}\")]\n    PublicKeyError(PublicKeyError),\n}\n\nimpl From<crate::no_std::io::Error> for AddressError {\n    fn from(error: crate::no_std::io::Error) -> Self {\n        AddressError::Crate(\"crate::no_std::io\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<crate::no_std::FromUtf8Error> for AddressError {\n    fn from(error: crate::no_std::FromUtf8Error) -> Self {\n        AddressError::Crate(\"crate::no_std\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<&'static str> for AddressError {\n    fn from(msg: &'static str) -> Self {\n        AddressError::Message(msg.into())\n    }\n}\n\nimpl From<PublicKeyError> for AddressError {\n    fn from(error: PublicKeyError) -> Self {\n        AddressError::PublicKeyError(error)\n    }\n}\n\nimpl From<base58::FromBase58Error> for AddressError {\n    fn from(error: base58::FromBase58Error) -> Self {\n        AddressError::Crate(\"base58\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<bech32::Error> for AddressError {\n    fn from(error: bech32::Error) -> Self {\n        AddressError::Crate(\"bech32\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<core::str::Utf8Error> for AddressError {\n    fn from(error: core::str::Utf8Error) -> Self {\n        AddressError::Crate(\"core::str\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<hex::FromHexError> for AddressError {\n    fn from(error: hex::FromHexError) -> Self {\n        AddressError::Crate(\"hex\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<rand_core::Error> for AddressError {\n    fn from(error: rand_core::Error) -> Self {\n        AddressError::Crate(\"rand\", format!(\"{error:?}\"))\n    }\n}\n"
  },
  {
    "path": "crates/anychain-core/src/amount.rs",
    "content": "use {\n    crate::no_std::{\n        fmt::{Debug, Display},\n        hash::Hash,\n        String,\n    },\n    thiserror::Error,\n};\n\n/// The interface for a generic amount.\npub trait Amount:\n    Copy + Clone + Debug + Display + Send + Sync + 'static + Eq + Ord + Sized + Hash\n{\n}\n\n#[derive(Debug, Error)]\npub enum AmountError {\n    #[error(\"{0}: {1}\")]\n    Crate(&'static str, String),\n\n    #[error(\"the amount: {0:} exceeds the supply bounds of {1:}\")]\n    AmountOutOfBounds(String, String),\n\n    #[error(\"invalid amount: {0:}\")]\n    InvalidAmount(String),\n}\n\n/// Converts any available denomination to the minimum denomination\npub fn to_basic_unit(value: &str, mut denomination: u32) -> String {\n    if denomination > 18 {\n        println!(\"illegal denomination\");\n        return \"\".to_string();\n    }\n\n    let mut has_point: bool = false;\n    let mut point: usize = 0;\n    let mut cnt: usize = 0;\n\n    for c in value.chars() {\n        if c.is_ascii_digit() || c == '.' {\n            if c == '.' {\n                if has_point {\n                    println!(\"duplicate decimal point\");\n                    return \"\".to_string();\n                }\n                if cnt == 0 {\n                    // the decimal point is at the front, indicating the value is 0\n                    return \"0\".to_string();\n                }\n                has_point = true;\n                point = cnt;\n            }\n            cnt += 1;\n        } else {\n            println!(\"illegal decimal string\");\n            return \"\".to_string();\n        }\n    }\n\n    let mut value = value.to_string();\n\n    // the decimal string does not contain a decimal point,\n    // so we add one to the end.\n    if !has_point {\n        value.insert(value.len(), '.');\n        point = value.len() - 1;\n    }\n\n    let mut v = value.as_bytes().to_vec();\n\n    // now we right-shift the decimal point for 'denomination' times\n    while denomination > 0 {\n        // the decimal point is at the end of the vec, so push '0'\n        // to the end and swap it with the decimal point\n        if point == v.len() - 1 {\n            v.push(b'0');\n        }\n\n        // swap the decimal point with its next digit\n        v.swap(point, point + 1);\n\n        point += 1;\n        denomination -= 1;\n    }\n\n    // round up or down to the nearest integer\n    if point < v.len() - 1 && v[point + 1] > b'5' {\n        v[point - 1] += 1;\n    }\n\n    v.truncate(point);\n    String::from_utf8(v).unwrap()\n}\n\n/// Converts any available denomination to the minimum denomination\npub fn to_basic_unit_u64(value: &str, mut denomination: u64) -> String {\n    if denomination > 18 {\n        println!(\"illegal denomination\");\n        return \"\".to_string();\n    }\n\n    let mut has_point: bool = false;\n    let mut point: usize = 0;\n    let mut cnt: usize = 0;\n\n    for c in value.chars() {\n        if c.is_ascii_digit() || c == '.' {\n            if c == '.' {\n                if has_point {\n                    println!(\"duplicate decimal point\");\n                    return \"\".to_string();\n                }\n                if cnt == 0 {\n                    // the decimal point is at the front, indicating the value is 0\n                    return \"0\".to_string();\n                }\n                has_point = true;\n                point = cnt;\n            }\n            cnt += 1;\n        } else {\n            println!(\"illegal decimal string\");\n            return \"\".to_string();\n        }\n    }\n\n    let mut value = value.to_string();\n\n    // the decimal string does not contain a decimal point,\n    // so we add one to the end.\n    if !has_point {\n        value.insert(value.len(), '.');\n        point = value.len() - 1;\n    }\n\n    let mut v = value.as_bytes().to_vec();\n\n    // now we right-shift the decimal point for 'denomination' times\n    while denomination > 0 {\n        // the decimal point is at the end of the vec, so push '0'\n        // to the end and swap it with the decimal point\n        if point == v.len() - 1 {\n            v.push(b'0');\n        }\n\n        // swap the decimal point with its next digit\n        v.swap(point, point + 1);\n\n        point += 1;\n        denomination -= 1;\n    }\n\n    // round up or down to the nearest integer\n    if point < v.len() - 1 && v[point + 1] > b'5' {\n        v[point - 1] += 1;\n    }\n\n    v.truncate(point);\n    String::from_utf8(v).unwrap()\n}\n\n#[test]\nfn test() {\n    let s = to_basic_unit(\"0.0001037910\", 7);\n    println!(\"s = {s}\");\n}\n"
  },
  {
    "path": "crates/anychain-core/src/error.rs",
    "content": "use crate::{\n    no_std::{\n        fmt::Error as FmtError, io::Error as IoError, num::ParseIntError as NumParseIntError,\n        String,\n    },\n    AddressError, AmountError, FormatError, PublicKeyError, TransactionError,\n};\n\n#[derive(Debug, Error)]\npub enum Error {\n    #[error(\"Runtime Error:{0}\")]\n    RuntimeError(String),\n\n    #[error(\"Invalid Address: {0}\")]\n    InvalidAddress(#[from] AddressError),\n\n    #[error(\"Invalid Transaction: {0:}\")]\n    InvalidTransaction(#[from] TransactionError),\n\n    #[error(\"Invalid Amount: {0:}\")]\n    InvalidAmount(#[from] AmountError),\n\n    #[error(\"Invalid PublickKey: {0:}\")]\n    InvalidPublickKey(#[from] PublicKeyError),\n\n    #[error(\"Invalid Format: {0:}\")]\n    InvalidFormat(#[from] FormatError),\n\n    #[error(\"io error: {0:}\")]\n    Io(#[from] IoError),\n\n    #[error(\"fmt error: {0:}\")]\n    Fmt(#[from] FmtError),\n\n    #[error(\"fromHex error: {0:}\")]\n    FromHex(#[from] ::hex::FromHexError),\n\n    #[error(\"parsing error: {0:}\")]\n    ParseInt(#[from] NumParseIntError),\n}\n"
  },
  {
    "path": "crates/anychain-core/src/format.rs",
    "content": "use {\n    crate::no_std::{\n        fmt::{Debug, Display},\n        hash::Hash,\n        String, Vec,\n    },\n    thiserror::Error,\n};\n\n/// The interface for a generic format.\npub trait Format:\n    Clone + Debug + Display + Send + Sync + 'static + Eq + Ord + Sized + Hash\n{\n}\n\n#[derive(Debug, Error)]\npub enum FormatError {\n    #[error(\"{0}: {1}\")]\n    Crate(&'static str, String),\n\n    #[error(\"invalid address prefix: {0:?}\")]\n    InvalidPrefix(Vec<u8>),\n\n    #[error(\"invalid version bytes: {0:?}\")]\n    InvalidVersionBytes(Vec<u8>),\n\n    #[error(\"unsupported derivation path for the format: {0}\")]\n    UnsupportedDerivationPath(String),\n}\n"
  },
  {
    "path": "crates/anychain-core/src/lib.rs",
    "content": "//! # Model\n//!\n//! A model for cryptocurrency wallets.\n\n#![cfg_attr(not(feature = \"std\"), no_std)]\n#![warn(unused_extern_crates, dead_code)]\n#![forbid(unsafe_code)]\n\n#[cfg(not(feature = \"std\"))]\n#[allow(unused_imports)]\n#[doc(hidden)]\n#[macro_use]\nextern crate alloc;\n\n#[macro_use]\nextern crate thiserror;\n\npub mod no_std;\n\npub mod address;\npub use self::address::*;\n\npub mod amount;\npub use self::amount::*;\n\npub mod format;\npub use self::format::*;\n\npub mod network;\npub use self::network::*;\n\npub mod public_key;\npub use self::public_key::*;\n\npub mod transaction;\npub use self::transaction::*;\n\npub mod utilities;\npub use self::utilities::*;\n\npub mod error;\npub use error::*;\n\n// export common crate\npub use hex;\n\n// pub use bls_signatures;\n// pub use ethereum_types;\n"
  },
  {
    "path": "crates/anychain-core/src/network.rs",
    "content": "use {\n    crate::no_std::{\n        fmt::{Debug, Display},\n        hash::Hash,\n        FromStr, String,\n    },\n    thiserror::Error,\n};\n\n/// The interface for a generic network.\npub trait Network:\n    Copy + Clone + Debug + Display + FromStr + Send + Sync + 'static + Eq + Ord + Sized + Hash\n{\n    const NAME: &'static str;\n}\n\n#[derive(Debug, Error)]\npub enum NetworkError {\n    #[error(\"invalid extended private key prefix: {0}\")]\n    InvalidExtendedPrivateKeyPrefix(String),\n\n    #[error(\"invalid extended public key prefix: {0}\")]\n    InvalidExtendedPublicKeyPrefix(String),\n\n    #[error(\"invalid network: {0}\")]\n    InvalidNetwork(String),\n}\n"
  },
  {
    "path": "crates/anychain-core/src/no_std/io.rs",
    "content": "//! no-std io replacement\nuse crate::no_std::Vec;\nuse core::{cmp, fmt, mem};\n\npub trait Read {\n    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>;\n    fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>;\n}\n\nimpl<R: Read + ?Sized> Read for &mut R {\n    #[inline]\n    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {\n        (**self).read(buf)\n    }\n\n    #[inline]\n    fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error> {\n        (**self).read_exact(buf)\n    }\n}\n\nimpl Read for &[u8] {\n    #[inline]\n    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {\n        let amt = cmp::min(buf.len(), self.len());\n        let (a, b) = self.split_at(amt);\n\n        // First check if the amount of bytes we want to read is small:\n        // `copy_from_slice` will generally expand to a call to `memcpy`, and\n        // for a single byte the overhead is significant.\n        if amt == 1 {\n            buf[0] = a[0];\n        } else {\n            buf[..amt].copy_from_slice(a);\n        }\n\n        *self = b;\n        Ok(amt)\n    }\n\n    #[inline]\n    fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error> {\n        if buf.len() > self.len() {\n            return Err(Error);\n        }\n        let (a, b) = self.split_at(buf.len());\n\n        // First check if the amount of bytes we want to read is small:\n        // `copy_from_slice` will generally expand to a call to `memcpy`, and\n        // for a single byte the overhead is significant.\n        if buf.len() == 1 {\n            buf[0] = a[0];\n        } else {\n            buf.copy_from_slice(a);\n        }\n\n        *self = b;\n        Ok(())\n    }\n}\n\npub trait Write {\n    fn write(&mut self, buf: &[u8]) -> Result<usize, Error>;\n    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>;\n}\n\nimpl<W: Write + ?Sized> Write for &mut W {\n    #[inline]\n    fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {\n        (**self).write(buf)\n    }\n\n    #[inline]\n    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error> {\n        (**self).write_all(buf)\n    }\n}\n\nimpl Write for &mut [u8] {\n    #[inline]\n    fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {\n        let amt = cmp::min(buf.len(), self.len());\n        let (a, b) = mem::replace(self, &mut []).split_at_mut(amt);\n        a.copy_from_slice(&buf[..amt]);\n        *self = b;\n        Ok(amt)\n    }\n\n    #[inline]\n    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error> {\n        let amt = cmp::min(buf.len(), self.len());\n        let (a, b) = mem::replace(self, &mut []).split_at_mut(amt);\n        a.copy_from_slice(&buf[..amt]);\n        *self = b;\n\n        if amt == buf.len() {\n            Ok(())\n        } else {\n            Err(Error)\n        }\n    }\n}\n\nimpl Write for Vec<u8> {\n    #[inline]\n    fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {\n        self.extend_from_slice(buf);\n        Ok(buf.len())\n    }\n\n    #[inline]\n    fn write_all(&mut self, buf: &[u8]) -> Result<(), Error> {\n        self.extend_from_slice(buf);\n        Ok(())\n    }\n}\n\n#[derive(Debug)]\npub struct Error;\n\nimpl fmt::Display for Error {\n    #[inline]\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        writeln!(f, \"Error in no_std::io operation\")\n    }\n}\n"
  },
  {
    "path": "crates/anychain-core/src/no_std/mod.rs",
    "content": "#[cfg(not(feature = \"std\"))]\n#[doc(hidden)]\npub use alloc::{\n    borrow::ToOwned, format, string::FromUtf8Error, string::String, string::ToString, vec, vec::Vec,\n};\n\n#[cfg(not(feature = \"std\"))]\n#[doc(hidden)]\npub use core::{\n    hash, num,\n    {fmt, str::FromStr},\n};\n\n#[cfg(feature = \"std\")]\n#[doc(hidden)]\npub use std::{\n    borrow::ToOwned, fmt, format, hash, num, str::FromStr, string::FromUtf8Error, string::String,\n    string::ToString, vec, vec::Vec,\n};\n\n#[cfg(not(feature = \"std\"))]\n#[doc(hidden)]\npub mod io;\n\n#[cfg(feature = \"std\")]\npub use std::io;\n"
  },
  {
    "path": "crates/anychain-core/src/public_key.rs",
    "content": "use {\n    crate::{\n        address::{Address, AddressError},\n        format::Format,\n        no_std::{\n            fmt::{Debug, Display},\n            FromStr, String,\n        },\n    },\n    thiserror::Error,\n};\n\n/// Generic public key.\npub trait PublicKey: Clone + Debug + Display + FromStr + Send + Sync + 'static + Sized {\n    type SecretKey;\n    type Address: Address;\n    type Format: Format;\n\n    /// Returns a public key given an secp256k1 secret key.\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self;\n\n    /// Returns an address corresponding to this public key.\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError>;\n}\n\n#[derive(Debug, Error)]\npub enum PublicKeyError {\n    #[error(\"{0}: {1}\")]\n    Crate(&'static str, String),\n\n    #[error(\"invalid byte length: {0}\")]\n    InvalidByteLength(usize),\n\n    #[error(\"invalid character length: {0}\")]\n    InvalidCharacterLength(usize),\n\n    #[error(\"invalid public key prefix: {0}\")]\n    InvalidPrefix(String),\n\n    #[error(\"no public spending key found\")]\n    NoSpendingKey,\n\n    #[error(\"no public viewing key found\")]\n    NoViewingKey,\n}\n\nimpl From<crate::no_std::io::Error> for PublicKeyError {\n    fn from(error: crate::no_std::io::Error) -> Self {\n        PublicKeyError::Crate(\"crate::no_std::io\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<base58::FromBase58Error> for PublicKeyError {\n    fn from(error: base58::FromBase58Error) -> Self {\n        PublicKeyError::Crate(\"base58\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<bech32::Error> for PublicKeyError {\n    fn from(error: bech32::Error) -> Self {\n        PublicKeyError::Crate(\"bech32\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<hex::FromHexError> for PublicKeyError {\n    fn from(error: hex::FromHexError) -> Self {\n        PublicKeyError::Crate(\"hex\", format!(\"{error:?}\"))\n    }\n}\n\n// impl From<libsecp256k1::Error> for PublicKeyError {\n//     fn from(error: libsecp256k1::Error) -> Self {\n//         PublicKeyError::Crate(\"libsecp256k1\", format!(\"{:?}\", error))\n//     }\n// }\n"
  },
  {
    "path": "crates/anychain-core/src/transaction.rs",
    "content": "use {\n    crate::{\n        address::{Address, AddressError},\n        amount::AmountError,\n        format::Format,\n        no_std::{\n            fmt::{Debug, Display},\n            hash::Hash,\n            String, Vec,\n        },\n        public_key::PublicKey,\n        utilities::crypto::keccak256,\n    },\n    thiserror::Error,\n};\n\n/**\n * 返回合约函数签名，取keccak256 hash值的前4个Bytes\n */\npub fn func_selector(func_signature: &str) -> [u8; 4] {\n    let mut func_id = [0u8; 4];\n    func_id.clone_from_slice(&keccak256(func_signature.as_bytes())[..4]);\n    func_id\n}\n\n/// The interface for a generic transaction id.\npub trait TransactionId:\n    Clone + Debug + Display + Send + Sync + 'static + Eq + Sized + Hash\n{\n}\n\n/// The interface for a generic transactions.\npub trait Transaction: Clone + Send + Sync + 'static {\n    type Address: Address;\n    type Format: Format;\n    type PublicKey: PublicKey;\n    type TransactionId: TransactionId;\n    type TransactionParameters;\n\n    /// Returns an unsigned transaction given the transaction parameters.\n    fn new(parameters: &Self::TransactionParameters) -> Result<Self, TransactionError>;\n\n    /// Returns a signed transaction bytes given the (signature,recovery_id)\n    fn sign(&mut self, signature: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError>;\n\n    /// Returns a transaction given the transaction bytes.\n    fn from_bytes(transaction: &[u8]) -> Result<Self, TransactionError>;\n\n    /// Returns the transaction in bytes.\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError>;\n\n    /// Returns the transaction id.\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError>;\n}\n\n#[derive(Debug, Error)]\npub enum TransactionError {\n    #[error(\"{0}\")]\n    AddressError(#[from] AddressError),\n\n    #[error(\"{0}\")]\n    AmountError(#[from] AmountError),\n\n    #[error(\"witnesses have a conflicting anchor\")]\n    ConflictingWitnessAnchors(),\n\n    #[error(\"{0}: {1}\")]\n    Crate(&'static str, String),\n\n    #[error(\"Failed note decryption for enc_cyphertext: {0}\")]\n    FailedNoteDecryption(String),\n\n    #[error(\"invalid binding signature for the transaction\")]\n    InvalidBindingSig(),\n\n    #[error(\"invalid chain id {0}\")]\n    InvalidChainId(u8),\n\n    #[error(\"invalid ephemeral key {0}\")]\n    InvalidEphemeralKey(String),\n\n    #[error(\"insufficient information to craft transaction. missing: {0}\")]\n    InvalidInputs(String),\n\n    #[error(\"invalid output address: {0}\")]\n    InvalidOutputAddress(String),\n\n    #[error(\"invalid ouptut description for address: {0}\")]\n    InvalidOutputDescription(String),\n\n    #[error(\"invalid transaction RLP length: expected - 9, found - {0}\")]\n    InvalidRlpLength(usize),\n\n    #[error(\"invalid script pub key for format: {0}\")]\n    InvalidScriptPubKey(String),\n\n    #[error(\"invalid segwit flag: {0}\")]\n    InvalidSegwitFlag(usize),\n\n    #[error(\"invalid spend description for address\")]\n    InvalidSpendDescription,\n\n    #[error(\"invalid transaction id {0}\")]\n    InvalidTransactionId(usize),\n\n    #[error(\n        \"invalid transaction - either both sender and signature should be present, or neither\"\n    )]\n    InvalidTransactionState,\n\n    #[error(\"invalid variable size integer: {0}\")]\n    InvalidVariableSizeInteger(usize),\n\n    #[error(\"{0}\")]\n    Message(String),\n\n    #[error(\"missing diversifier, check that the address is a Sapling address\")]\n    MissingDiversifier,\n\n    #[error(\"missing outpoint address\")]\n    MissingOutpointAddress,\n\n    #[error(\"missing outpoint amount\")]\n    MissingOutpointAmount,\n\n    #[error(\"missing outpoint script public key\")]\n    MissingOutpointScriptPublicKey,\n\n    #[error(\"missing output parameters\")]\n    MissingOutputParameters,\n\n    #[error(\"missing spend description\")]\n    MissingSpendDescription,\n\n    #[error(\"missing spend parameters\")]\n    MissingSpendParameters,\n\n    #[error(\"missing signature\")]\n    MissingSignature,\n\n    #[error(\"Null Error\")]\n    NullError(()),\n\n    #[error(\"Joinsplits are not supported\")]\n    UnsupportedJoinsplits,\n\n    #[error(\"unsupported preimage operation on address format of {0}\")]\n    UnsupportedPreimage(String),\n\n    #[error(\"Reaching end of Ripple SerializedType 'Object'\")]\n    EndOfObject,\n\n    #[error(\"Reaching end of Ripple SerializedType 'Array'\")]\n    EndOfArray,\n}\n\nimpl From<crate::no_std::io::Error> for TransactionError {\n    fn from(error: crate::no_std::io::Error) -> Self {\n        TransactionError::Crate(\"crate::no_std::io\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<&'static str> for TransactionError {\n    fn from(msg: &'static str) -> Self {\n        TransactionError::Message(msg.into())\n    }\n}\n\nimpl From<()> for TransactionError {\n    fn from(error: ()) -> Self {\n        TransactionError::NullError(error)\n    }\n}\n\nimpl From<base58::FromBase58Error> for TransactionError {\n    fn from(error: base58::FromBase58Error) -> Self {\n        TransactionError::Crate(\"base58\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<bech32::Error> for TransactionError {\n    fn from(error: bech32::Error) -> Self {\n        TransactionError::Crate(\"bech32\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<core::num::ParseIntError> for TransactionError {\n    fn from(error: core::num::ParseIntError) -> Self {\n        TransactionError::Crate(\"core::num\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<core::str::ParseBoolError> for TransactionError {\n    fn from(error: core::str::ParseBoolError) -> Self {\n        TransactionError::Crate(\"core::str\", format!(\"{error:?}\"))\n    }\n}\n\nimpl From<hex::FromHexError> for TransactionError {\n    fn from(error: hex::FromHexError) -> Self {\n        TransactionError::Crate(\"hex\", format!(\"{error:?}\"))\n    }\n}\n\n// impl From<rlp::DecoderError> for TransactionError {\n//     fn from(error: rlp::DecoderError) -> Self {\n//         TransactionError::Crate(\"rlp\", format!(\"{:?}\", error))\n//     }\n// }\n\n// impl From<libsecp256k1::Error> for TransactionError {\n//     fn from(error: libsecp256k1::Error) -> Self {\n//         TransactionError::Crate(\"libsecp256k1\", format!(\"{:?}\", error))\n//     }\n// }\n\nimpl From<serde_json::error::Error> for TransactionError {\n    fn from(error: serde_json::error::Error) -> Self {\n        TransactionError::Crate(\"serde_json\", format!(\"{error:?}\"))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::func_selector;\n\n    #[test]\n    fn test_func_selector() {\n        let selector = func_selector(\"transfer(address,uint256)\");\n        assert_eq!(\"a9059cbb\", hex::encode(selector));\n    }\n}\n"
  },
  {
    "path": "crates/anychain-core/src/utilities/crypto.rs",
    "content": "use ripemd::Ripemd160;\nuse sha2::{Digest, Sha256, Sha512};\nuse sha3::Keccak256;\n\n#[inline]\npub fn sha256(input: &[u8]) -> [u8; 32] {\n    let mut hasher = Sha256::new();\n    hasher.update(input);\n    hasher.finalize().into()\n}\n\n#[inline]\npub fn sha512(input: &[u8]) -> [u8; 64] {\n    let mut hasher = Sha512::new();\n    hasher.update(input);\n    hasher.finalize().into()\n}\n\n#[inline]\npub fn keccak256(input: &[u8]) -> [u8; 32] {\n    let mut hasher = Keccak256::new();\n    hasher.update(input);\n    hasher.finalize().into()\n}\n\npub fn checksum(data: &[u8]) -> Vec<u8> {\n    Sha256::digest(Sha256::digest(data)).to_vec()\n}\n\npub fn hash160(bytes: &[u8]) -> Vec<u8> {\n    Ripemd160::digest(Sha256::digest(bytes)).to_vec()\n}\n"
  },
  {
    "path": "crates/anychain-core/src/utilities/mod.rs",
    "content": "use crate::no_std::*;\n\n//#[cfg_attr(test, macro_use)]\npub mod crypto;\n\npub fn to_hex_string(bytes: &[u8]) -> String {\n    bytes\n        .iter()\n        .map(|b| format!(\"{b:02X}\"))\n        .collect::<Vec<String>>()\n        .join(\"\")\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/Cargo.toml",
    "content": "[package]\nname = \"anychain-ethereum\"\ndescription = \"A Rust library for Ethereum-focused cryptocurrency wallets, enabling seamless transactions on the Ethereum blockchain\"\nversion = \"0.1.38\"\nkeywords = [\"blockchain\", \"crypto\", \"ethereum\", \"wallet\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\nanychain-kms = { path = \"../anychain-kms\", version = \"0.1.18\" }\nregex = { workspace = true }\nrlp = { workspace = true }\nserde = { workspace = true }\nserde_json = { workspace = true }\nethabi = { workspace = true }\nlibsecp256k1 = { workspace = true }\nethereum-types = { workspace = true }\nrand.workspace = true\n\n[features]\ndefault = [\"std\"]\nstd = [\"anychain-core/std\"]\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "crates/anychain-ethereum/README.md",
    "content": "# AnyChain Ethereum Crate\n\n`anychain-ethereum` is a Rust crate that provides a simple and efficient way to interact with the Ethereum blockchain. This library aims to make it easy for developers to build applications that require Ethereum data and functionality without having to deal with the complexities of the underlying protocol.\n\nThis is the README for the anychain-ethereum crate, a Rust library that provides a simple and efficient way to interact with the Ethereum blockchain.\n\n## Features\n\n- Easy interaction with Ethereum nodes\n- Support for multiple Ethereum networks (Mainnet, Ropsten, Rinkeby, etc.)\n- Sending and receiving transactions\n- Querying contract data\n- Deploying and interacting with smart contracts\n- Support for popular Ethereum wallets (e.g., MetaMask, Ledger, Trezor)\n\n## Installation\n\nTo use the anychain-ethereum crate in your Rust project, add the following to your Cargo.toml file:\n```toml\n[dependencies]\nanychain-ethereum = \"0.1.19\"\n```\n\n## Usage\n\nHere's a simple example of how to use the anychain-ethereum crate to interact with the Ethereum blockchain:\n```rust\nuse anychain_ethereum::{Ethereum, Network};\n\nfn main() {\n    // Create an Ethereum instance for the desired network\n    let eth = Ethereum::new(Network::Mainnet);\n\n    // Get the balance of an Ethereum address\n    let address = \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\".parse().unwrap();\n    let balance = eth.get_balance(&address).unwrap();\n    println!(\"Balance: {} ETH\", balance);\n}\n```\n\nFor more examples and detailed usage instructions, please refer to the [documentation](https://docs.rs/anychain-ethereum).\n\n## Contributing\n\nWe welcome contributions to the anychain-ethereum crate! If you'd like to contribute, please follow these steps:\n\n1. Fork the repository\n2. Create a new branch with your changes\n3. Submit a pull request to the main repository\n\nBefore submitting your pull request, please ensure that your code adheres to the project's coding standards and that all tests pass.\n\n## License\n\nThe anychain-ethereum crate is licensed under the [MIT License](LICENSE) "
  },
  {
    "path": "crates/anychain-ethereum/src/address.rs",
    "content": "use crate::format::EthereumFormat;\nuse crate::public_key::EthereumPublicKey;\nuse anychain_core::{to_hex_string, Address, AddressError, Error, PublicKey};\n\nuse anychain_core::hex;\nuse anychain_core::utilities::crypto::keccak256;\nuse core::{convert::TryFrom, fmt, str::FromStr};\nuse libsecp256k1::SecretKey;\nuse regex::Regex;\nuse serde::{Deserialize, Serialize};\n\n/// Represents an Ethereum address\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash, Default)]\npub struct EthereumAddress(String);\n\nimpl Address for EthereumAddress {\n    type SecretKey = SecretKey;\n    type Format = EthereumFormat;\n    type PublicKey = EthereumPublicKey;\n\n    /// Returns the address corresponding to the given private key.\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        _format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        Self::from_public_key(&EthereumPublicKey::from_secret_key(secret_key), _format)\n    }\n\n    /// Returns the address corresponding to the given public key.\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        _: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        // public_key.from_private_key();\n        Ok(Self::checksum_address(public_key))\n    }\n}\n\nimpl EthereumAddress {\n    /// Returns the checksum address given a public key.\n    /// Adheres to EIP-55 <https://eips.ethereum.org/EIPS/eip-55>.\n    pub fn checksum_address(public_key: &EthereumPublicKey) -> Self {\n        let hash = keccak256(&public_key.to_secp256k1_public_key().serialize()[1..]);\n        let address = to_hex_string(&hash[12..]).to_lowercase();\n\n        let hash = to_hex_string(&keccak256(address.as_bytes()));\n        let mut checksum_address = \"0x\".to_string();\n        for c in 0..40 {\n            let ch = match &hash[c..=c] {\n                \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" => address[c..=c].to_lowercase(),\n                _ => address[c..=c].to_uppercase(),\n            };\n            checksum_address.push_str(&ch);\n        }\n\n        EthereumAddress(checksum_address)\n    }\n\n    pub fn to_bytes(&self) -> Result<Vec<u8>, Error> {\n        let regex = Regex::new(r\"^0x\").unwrap();\n        let address = self.0.clone();\n        let address = address.to_lowercase();\n        let address = regex.replace_all(&address, \"\").to_string();\n        Ok(hex::decode(address)?)\n    }\n\n    pub fn len(&self) -> usize {\n        self.0.len()\n    }\n\n    pub fn is_empty(&self) -> bool {\n        self.len() == 0\n    }\n}\n\nimpl<'a> TryFrom<&'a str> for EthereumAddress {\n    type Error = AddressError;\n\n    fn try_from(address: &'a str) -> Result<Self, Self::Error> {\n        Self::from_str(address)\n    }\n}\n\nimpl FromStr for EthereumAddress {\n    type Err = AddressError;\n\n    fn from_str(address: &str) -> Result<Self, Self::Err> {\n        let addr = match address.starts_with(\"0x\") {\n            true => &address[2..],\n            false => address,\n        };\n        if addr.len() != 40 {\n            return Err(AddressError::InvalidCharacterLength(addr.len()));\n        }\n        let addr = addr.to_lowercase();\n        let _ = hex::decode(addr)?;\n        match address.starts_with(\"0x\") {\n            true => Ok(EthereumAddress(address.to_string())),\n            false => Ok(EthereumAddress(format!(\"0x{}\", address))),\n        }\n    }\n}\n\nimpl fmt::Display for EthereumAddress {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use anychain_core::public_key::PublicKey;\n\n    fn test_from_str(expected_address: &str) {\n        let address = EthereumAddress::from_str(expected_address).unwrap();\n        assert_eq!(expected_address, address.to_string());\n    }\n\n    fn test_to_str(expected_address: &str, address: &EthereumAddress) {\n        assert_eq!(expected_address, address.to_string());\n    }\n\n    #[test]\n    fn test_public_key_bytes_to_address() {\n        let public_key = &[\n            48, 197, 53, 33, 226, 92, 169, 86, 37, 63, 188, 254, 37, 235, 20, 135, 106, 56, 177,\n            59, 236, 29, 192, 201, 164, 68, 243, 209, 167, 158, 75, 249, 32, 161, 71, 27, 58, 76,\n            240, 10, 117, 87, 201, 40, 236, 137, 172, 167, 140, 5, 65, 94, 239, 146, 230, 155, 0,\n            250, 200, 93, 219, 69, 123, 168,\n        ];\n\n        let public_key = libsecp256k1::PublicKey::parse_slice(public_key, None).unwrap();\n        let public_key = EthereumPublicKey::from_secp256k1_public_key(public_key);\n        let address = public_key.to_address(&EthereumFormat::Standard).unwrap();\n\n        assert_eq!(\n            \"0x0Df2f15895AB69A7eF06519F6c4732e648719f04\",\n            address.to_string()\n        );\n    }\n\n    mod checksum_address {\n        use super::*;\n\n        const KEYPAIRS: [(&str, &str); 5] = [\n            (\n                \"f89f23eaeac18252fedf81bb8318d3c111d48c19b0680dcf6e0a8d5136caf287\",\n                \"0x9141B7539E7902872095C408BfA294435e2b8c8a\",\n            ),\n            (\n                \"a93701ea343247db13466f6448ffbca658726e2b4a77530db3eca3c9250b4f0d\",\n                \"0xa0967B1F698DC497A694FE955666D1dDd398145C\",\n            ),\n            (\n                \"de61e35e2e5eb9504d52f5042126591d80144d49f74b8ced68f4959a3e8edffd\",\n                \"0xD5d13d1dD277BB9041e560A63ee29c086D370b0A\",\n            ),\n            (\n                \"56f01d5e01b6fd1cc123d8d1eae0d148e00c025b5be2ef624775f7a1b802e9c1\",\n                \"0xc4488ebbE882fa2aF1D466CB2C8ecafE316c067a\",\n            ),\n            (\n                \"363af8b4d3ff22bb0e4ffc2ff198b4b5be0316f8a507ad5fe32f021c3d1ae8ad\",\n                \"0xF9001e6AEE6EA439D713fBbF960EbA76f4770E2B\",\n            ),\n        ];\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS.iter().for_each(|(_, address)| {\n                test_from_str(address);\n            });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_address)| {\n                let address = EthereumAddress::from_str(expected_address).unwrap();\n                test_to_str(expected_address, &address);\n            });\n        }\n    }\n\n    #[test]\n    fn test_address() {\n        let pubkey = EthereumPublicKey::from_str(\n            \"040b4fed878e6b0ff6847e2ac9c13b556d161e1344cd270ed6cafac21f0144399d9ef31f2\\\n             67722fdeccba59ffd57ff84a020a2d3b416344c68e840bc7d97e77570\",\n        )\n        .unwrap();\n        let address = EthereumAddress::from_public_key(&pubkey, &EthereumFormat::Standard).unwrap();\n        assert_eq!(\n            \"0x5a2a8410875E882aEe87bF8e5F2e1eDE8810617b\",\n            address.to_string()\n        )\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/format.rs",
    "content": "use anychain_core::Format;\n\nuse core::fmt;\n\n/// Represents the format of a Ethereum address\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum EthereumFormat {\n    Standard,\n}\n\nimpl Format for EthereumFormat {}\n\nimpl fmt::Display for EthereumFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"Standard\")\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/lib.rs",
    "content": "#![cfg_attr(not(feature = \"std\"), no_std)]\n\npub mod address;\npub mod format;\npub mod network;\npub mod public_key;\npub mod transaction;\nmod util;\n\npub use self::address::*;\npub use self::format::*;\npub use self::network::*;\npub use self::public_key::*;\npub use self::transaction::*;\n"
  },
  {
    "path": "crates/anychain-ethereum/src/network/mainnet.rs",
    "content": "use super::EthereumNetwork;\n\n#[derive(Copy, Clone, Debug)]\npub struct Ethereum;\n\nimpl EthereumNetwork for Ethereum {\n    const CHAIN_ID: u32 = 1;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct EthereumClassic;\n\nimpl EthereumNetwork for EthereumClassic {\n    const CHAIN_ID: u32 = 61;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Polygon;\n\nimpl EthereumNetwork for Polygon {\n    const CHAIN_ID: u32 = 137;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Arbitrum;\n\nimpl EthereumNetwork for Arbitrum {\n    const CHAIN_ID: u32 = 42161;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Avalanche;\n\nimpl EthereumNetwork for Avalanche {\n    const CHAIN_ID: u32 = 43114;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Base;\n\nimpl EthereumNetwork for Base {\n    const CHAIN_ID: u32 = 8453;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct BinanceSmartChain;\n\nimpl EthereumNetwork for BinanceSmartChain {\n    const CHAIN_ID: u32 = 56;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct HuobiEco;\n\nimpl EthereumNetwork for HuobiEco {\n    const CHAIN_ID: u32 = 128;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Okex;\n\nimpl EthereumNetwork for Okex {\n    const CHAIN_ID: u32 = 66;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct OpBnb;\n\nimpl EthereumNetwork for OpBnb {\n    const CHAIN_ID: u32 = 204;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Optimism;\n\nimpl EthereumNetwork for Optimism {\n    const CHAIN_ID: u32 = 10;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Linea;\n\nimpl EthereumNetwork for Linea {\n    const CHAIN_ID: u32 = 59144;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Xlayer;\n\nimpl EthereumNetwork for Xlayer {\n    const CHAIN_ID: u32 = 196;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Sei;\n\nimpl EthereumNetwork for Sei {\n    const CHAIN_ID: u32 = 1329;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Cro;\n\nimpl EthereumNetwork for Cro {\n    const CHAIN_ID: u32 = 25;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Mova;\n\nimpl EthereumNetwork for Mova {\n    const CHAIN_ID: u32 = 61900;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Ink;\n\nimpl EthereumNetwork for Ink {\n    const CHAIN_ID: u32 = 57073;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Morph;\n\nimpl EthereumNetwork for Morph {\n    const CHAIN_ID: u32 = 2818;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Maca;\n\nimpl EthereumNetwork for Maca {\n    const CHAIN_ID: u32 = 777178;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Uni;\n\nimpl EthereumNetwork for Uni {\n    const CHAIN_ID: u32 = 130;\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/network/mod.rs",
    "content": "pub trait EthereumNetwork: Copy + Clone + Send + Sync + 'static {\n    const CHAIN_ID: u32;\n}\n\npub mod mainnet;\npub mod testnet;\n\npub use mainnet::*;\npub use testnet::*;\n"
  },
  {
    "path": "crates/anychain-ethereum/src/network/testnet.rs",
    "content": "use super::EthereumNetwork;\n\n#[derive(Copy, Clone, Debug)]\npub struct Sepolia; // ETH testnet\n\n// ETH testnet\nimpl EthereumNetwork for Sepolia {\n    const CHAIN_ID: u32 = 11155111;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Goerli; // ETH testnet\n\n// ETH testnet\nimpl EthereumNetwork for Goerli {\n    const CHAIN_ID: u32 = 5;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Kotti; // ETC testnet\n\n// ETC testnet\nimpl EthereumNetwork for Kotti {\n    const CHAIN_ID: u32 = 6;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Mumbai; // Polygon testnet\n\n// Polygon testnet\nimpl EthereumNetwork for Mumbai {\n    const CHAIN_ID: u32 = 80001;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Amoy; // Polygon testnet\n\n// Polygon testnet\nimpl EthereumNetwork for Amoy {\n    const CHAIN_ID: u32 = 80002;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct ArbitrumGoerli; // Arbitrum testnet\n\n// Arbitrum testnet\nimpl EthereumNetwork for ArbitrumGoerli {\n    const CHAIN_ID: u32 = 421613;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct AvalancheTestnet; // Avalanche testnet\n\n// Avalanche testnet\nimpl EthereumNetwork for AvalancheTestnet {\n    const CHAIN_ID: u32 = 43113;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct BaseGoerli; // Base testnet\n\n// Base testnet\nimpl EthereumNetwork for BaseGoerli {\n    const CHAIN_ID: u32 = 84531;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct BinanceSmartChainTestnet; // BinanceSmartChain testnet\n\n// BinanceSmartChain testnet\nimpl EthereumNetwork for BinanceSmartChainTestnet {\n    const CHAIN_ID: u32 = 97;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct HuobiEcoTestnet; // HuobiEco testnet\n\n// HuobiEco testnet\nimpl EthereumNetwork for HuobiEcoTestnet {\n    const CHAIN_ID: u32 = 256;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct OkexTestnet; // Okex testnet\n\n// Okex testnet\nimpl EthereumNetwork for OkexTestnet {\n    const CHAIN_ID: u32 = 65;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct OpBnbTestnet; // OpBnb testnet\n\n// OpBnb testnet\nimpl EthereumNetwork for OpBnbTestnet {\n    const CHAIN_ID: u32 = 5611;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct OptimismGoerli; // Optimism testnet\n\n// Optimism testnet\nimpl EthereumNetwork for OptimismGoerli {\n    const CHAIN_ID: u32 = 420;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct LineaSepolia; // Linea testnet\n\n// Linea testnet\nimpl EthereumNetwork for LineaSepolia {\n    const CHAIN_ID: u32 = 59141;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct XlayerTestnet; // Xlayer testnet\n\n// Xlayer testnet\nimpl EthereumNetwork for XlayerTestnet {\n    const CHAIN_ID: u32 = 195;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct SeiTestnet; // Sei testnet\n\n// Sei testnet\nimpl EthereumNetwork for SeiTestnet {\n    const CHAIN_ID: u32 = 1328;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct CroTestnet; // Cro testnet\n\n// Cro testnet\nimpl EthereumNetwork for CroTestnet {\n    const CHAIN_ID: u32 = 338;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct MovaTestnet; // Mova testnet\n\n// Mova testnet\nimpl EthereumNetwork for MovaTestnet {\n    const CHAIN_ID: u32 = 10323;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct InkTestnet; // Ink testnet\n\n// Ink testnet\nimpl EthereumNetwork for InkTestnet {\n    const CHAIN_ID: u32 = 763373;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct MorphTestnet; // Morph testnet\n\n// Morph testnet\nimpl EthereumNetwork for MorphTestnet {\n    const CHAIN_ID: u32 = 2710;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct MacaTestnet;\n\nimpl EthereumNetwork for MacaTestnet {\n    const CHAIN_ID: u32 = 777177;\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct UniSepolia;\n\nimpl EthereumNetwork for UniSepolia {\n    const CHAIN_ID: u32 = 1301;\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/public_key.rs",
    "content": "use crate::address::EthereumAddress;\nuse crate::format::EthereumFormat;\nuse anychain_core::{hex, Address, AddressError, PublicKey, PublicKeyError};\nuse core::{fmt, fmt::Display, str::FromStr};\n\n/// Represents an Ethereum public key\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct EthereumPublicKey(libsecp256k1::PublicKey);\n\nimpl PublicKey for EthereumPublicKey {\n    type SecretKey = libsecp256k1::SecretKey;\n    type Address = EthereumAddress;\n    type Format = EthereumFormat;\n\n    /// Returns the public key corresponding to the given private key.\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        Self(libsecp256k1::PublicKey::from_secret_key(secret_key))\n    }\n\n    /// Returns the address of this public key.\n    fn to_address(&self, _format: &Self::Format) -> Result<Self::Address, AddressError> {\n        Self::Address::from_public_key(self, _format)\n    }\n}\n\nimpl EthereumPublicKey {\n    /// Returns a public key given a secp256k1 public key.\n    pub fn from_secp256k1_public_key(public_key: libsecp256k1::PublicKey) -> Self {\n        Self(public_key)\n    }\n\n    pub fn from_slice(sl: &[u8]) -> Result<Self, PublicKeyError> {\n        libsecp256k1::PublicKey::parse_slice(sl, None)\n            .map(Self)\n            .map_err(|e| PublicKeyError::Crate(\"from splice\", format!(\"{:?}\", e)))\n    }\n\n    /// Returns the secp256k1 public key of the public key\n    pub fn to_secp256k1_public_key(&self) -> libsecp256k1::PublicKey {\n        self.0\n    }\n}\n\nimpl FromStr for EthereumPublicKey {\n    type Err = PublicKeyError;\n\n    fn from_str(public_key: &str) -> Result<Self, Self::Err> {\n        let p = hex::decode(public_key)\n            .map_err(|error| PublicKeyError::Crate(\"hex\", format!(\"{:?}\", error)))?;\n        let public_key = libsecp256k1::PublicKey::parse_slice(p.as_slice(), None)\n            .map_err(|error| PublicKeyError::Crate(\"libsecp256k1\", format!(\"{:?}\", error)))?;\n\n        Ok(Self(public_key))\n    }\n}\n\nimpl Display for EthereumPublicKey {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        for s in &self.0.serialize()[1..] {\n            write!(f, \"{:02x}\", s)?;\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use libsecp256k1::SecretKey;\n\n    fn test_from_secret_key(expected_public_key: &EthereumPublicKey, secret_key: &SecretKey) {\n        let public_key = EthereumPublicKey::from_secret_key(secret_key);\n        assert_eq!(*expected_public_key, public_key);\n    }\n\n    fn test_to_address(expected_address: &EthereumAddress, public_key: &EthereumPublicKey) {\n        let address = public_key.to_address(&EthereumFormat::Standard).unwrap();\n        assert_eq!(*expected_address, address);\n    }\n\n    fn test_from_str(expected_public_key: &str, expected_address: &str) {\n        let public_key = EthereumPublicKey::from_str(expected_public_key).unwrap();\n        let address = public_key.to_address(&EthereumFormat::Standard).unwrap();\n        assert_eq!(expected_public_key, public_key.to_string());\n        assert_eq!(expected_address, address.to_string());\n    }\n\n    fn test_to_str(expected_public_key: &str, public_key: &EthereumPublicKey) {\n        assert_eq!(expected_public_key, public_key.to_string());\n    }\n\n    mod checksum_address {\n        use super::*;\n\n        const KEYPAIRS: [(&str, &str, &str); 5] = [\n            (\n                \"2f46188bd601ece2a4446fa31de9419ee9baabf5305d65a5a7aea8badee27a5a\",\n                \"06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b0142409760451d982c0f35931f33e57adfc4f11bdf1946be2d75d6ecc925e8d22f319c71a721c\",\n                \"0x9Ed0C5817aE96Cb886BF74EB02B238De682e9B07\"\n            ),\n            (\n                \"d96c4c30bbabde58653e4fb4f4d97d064c70e300a37ab8780a8ecc15220423fb\",\n                \"bfe0746c85802c3ca1c2d5e4f4d23fb8321b8b1009af67855cc9a4aed8285567d7045bb700e27d5e33572ae5d84a8d1e11bb134f6f14f37ffcb2fa73f7c6b0ac\",\n                \"0xBc90633A78dA594ace8e25AAA3517F924C76099d\"\n            ),\n            (\n                \"c677a1215eebd35d20337d8896ee6579c78f41f93946b17c8d4ccb772c25cde4\",\n                \"ff3e50efb509efd0d18ff9074bc8b253419d2437e0c1e81661c1ba419f877162eed685d80bdd3b33adde4ff2a0946dd97460f126992064059a129e2a7172d566\",\n                \"0xA99E404A60ab8561F7c844529F735A88D7A61C5A\"\n            ),\n            (\n                \"b681e5bd4ddffefe1a691fe7c6375775c11992b9a25e4f9e3f235eb054d49343\",\n                \"d9ed72afa68a9732df005df2dbbfb2abcad050579bd8dfeb32389d0f1e492d130ca33f9e71345d558da5859026fee86c03be685f95a4c8ddc55e048c5ff8b398\",\n                \"0x28826C9f713c96ee63e59Ed9220c77b021FAfC3e\"\n            ),\n            (\n                \"da5d359af6827e76e0a1b71c75c375f0d33f63bae4fd551d81ee10faa34e33e9\",\n                \"0b752d5e89126b62a99edfe40a4cbd9122cfb04257a28d225858d38bc92a0e1517e797e9029e810b329afa32a1d46268e84eb10c700314b0059f506130d1e9e6\",\n                \"0x9eC59170674DbEfeF40efE2ED03175b39fCA921a\"\n            )\n        ];\n\n        #[test]\n        fn from_private_key() {\n            KEYPAIRS.iter().for_each(|(secret_key, public_key, _)| {\n                let public_key = EthereumPublicKey::from_str(public_key).unwrap();\n                let secret_key = hex::decode(*secret_key).unwrap();\n                let secret_key = SecretKey::parse_slice(&secret_key).unwrap();\n                test_from_secret_key(&public_key, &secret_key);\n            });\n        }\n\n        #[test]\n        fn to_address() {\n            KEYPAIRS.iter().for_each(|(_, public_key, address)| {\n                let address = EthereumAddress::from_str(address).unwrap();\n                let public_key = EthereumPublicKey::from_str(public_key).unwrap();\n                test_to_address(&address, &public_key);\n            });\n        }\n\n        #[test]\n        fn from_str() {\n            KEYPAIRS\n                .iter()\n                .for_each(|(_, expected_public_key, expected_address)| {\n                    test_from_str(expected_public_key, expected_address);\n                });\n        }\n\n        #[test]\n        fn to_str() {\n            KEYPAIRS.iter().for_each(|(_, expected_public_key, _)| {\n                let public_key = EthereumPublicKey::from_str(expected_public_key).unwrap();\n                test_to_str(expected_public_key, &public_key);\n            });\n        }\n\n        #[test]\n        fn test_pubkey() {\n            let str = \"b9b77d6ac1380a581d3efc136a21a939f5a6ce59afeb3eddf6a52b342b33f5be455b3610100ee1129d1638e99272879be60519835e2b3b7703eb4791af3daa7f\";\n            let public_key = EthereumPublicKey::from_str(str).unwrap();\n            let address = EthereumAddress::checksum_address(&public_key);\n            assert_eq!(\n                \"0xDF3e1897f4b01f6b17870b98B4548BaBE14A007C\",\n                address.to_string()\n            );\n        }\n    }\n\n    #[test]\n    fn test_checksum_address_invalid() {\n        // Invalid public key length\n\n        let public_key = \"0\";\n        assert!(EthereumPublicKey::from_str(public_key).is_err());\n\n        let public_key = \"06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b014\";\n        assert!(EthereumPublicKey::from_str(public_key).is_err());\n\n        let public_key = \"06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b0142409760451d982c0f35931f33e57adfc4f11bdf1946be2d75d6ecc925e8d22f319c71a721\";\n        assert!(EthereumPublicKey::from_str(public_key).is_err());\n\n        let public_key = \"06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b0142409760451d982c0f35931f33e57adfc4f11bdf1946be2d75d6ecc925e8d22f319c71a721c06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b0142409760451d982c0f3593\";\n        assert!(EthereumPublicKey::from_str(public_key).is_err());\n\n        let public_key = \"06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b0142409760451d982c0f35931f33e57adfc4f11bdf1946be2d75d6ecc925e8d22f319c71a721c06d68e391c6961fceb5d8c5ad8ee5c6346db24df9dae61c9c0b0142409760451d982c0f35931f33e57adfc4f11bdf1946be2d75d6ecc925e8d22f319c71a721c\";\n        assert!(EthereumPublicKey::from_str(public_key).is_err());\n    }\n\n    #[test]\n    fn address_gen() {\n        let raw_pk = [\n            68, 157, 12, 4, 213, 228, 35, 105, 155, 249, 86, 130, 216, 186, 113, 85, 31, 137, 113,\n            153, 70, 239, 218, 142, 132, 65, 222, 134, 52, 145, 148, 88, 63, 245, 105, 222, 219,\n            39, 56, 192, 195, 4, 38, 29, 9, 78, 172, 238, 179, 168, 66, 80, 132, 123, 45, 104, 145,\n            132, 159, 243, 144, 62, 194, 164,\n        ];\n        let raw_pk1 = [\n            117, 243, 73, 0, 152, 143, 226, 83, 116, 252, 10, 247, 191, 14, 206, 13, 110, 192, 140,\n            32, 250, 238, 177, 101, 109, 113, 26, 254, 67, 191, 47, 11, 155, 57, 117, 158, 227,\n            111, 235, 20, 65, 167, 102, 64, 98, 103, 106, 226, 241, 213, 193, 36, 72, 57, 163, 202,\n            72, 21, 35, 233, 194, 163, 225, 28,\n        ];\n\n        let pk = EthereumPublicKey::from_slice(&raw_pk);\n        assert!(pk.is_ok());\n        let pk1 = EthereumPublicKey::from_slice(&raw_pk1);\n        assert!(pk1.is_ok());\n\n        let addr = pk.unwrap().to_address(&EthereumFormat::Standard).unwrap();\n        let addr1 = pk1.unwrap().to_address(&EthereumFormat::Standard).unwrap();\n\n        assert_eq!(\n            \"0xE28D6881aC932066611A259a8C343E545b0b55B7\",\n            addr.to_string()\n        );\n        assert_eq!(\n            \"0xCd28AF3e09527D2a756F1e7c7aD7A8A9BdEB080d\",\n            addr1.to_string()\n        );\n    }\n\n    #[test]\n    fn test_public_key_from_invalid_slice() {\n        let invalid_slice = [1u8; 31]; // A 31-byte slice, invalid as a public key\n        let public_key = EthereumPublicKey::from_slice(&invalid_slice);\n        assert!(public_key.is_err());\n\n        let invalid_slice = [0u8; 65]; // A 31-byte slice, invalid as a public key\n        let public_key = EthereumPublicKey::from_slice(&invalid_slice);\n        assert!(public_key.is_err());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/transaction/contract.rs",
    "content": "use core::str::FromStr;\n\nuse crate::{EthereumAddress, Transfer};\nuse anychain_core::{hex, TransactionError};\nuse ethabi::{ethereum_types::H160, Function, Param, ParamType, StateMutability, Token};\nuse ethereum_types::U256;\nuse serde_json::{json, Value};\n\npub fn erc20_transfer_func() -> Function {\n    let param_to = Param {\n        name: \"to\".to_string(),\n        kind: ParamType::Address,\n        internal_type: None,\n    };\n    let param_amount = Param {\n        name: \"amount\".to_string(),\n        kind: ParamType::Uint(256),\n        internal_type: None,\n    };\n\n    #[allow(deprecated)]\n    Function {\n        name: \"transfer\".to_string(),\n        inputs: vec![param_to, param_amount],\n        outputs: vec![],\n        constant: None,\n        state_mutability: StateMutability::Payable,\n    }\n}\n\npub fn eip3009_transfer_func() -> Function {\n    let param_from = Param {\n        name: \"from\".to_string(),\n        kind: ParamType::Address,\n        internal_type: None,\n    };\n    let param_to = Param {\n        name: \"to\".to_string(),\n        kind: ParamType::Address,\n        internal_type: None,\n    };\n    let param_value = Param {\n        name: \"value\".to_string(),\n        kind: ParamType::Uint(256),\n        internal_type: None,\n    };\n    let param_valid_after = Param {\n        name: \"validAfter\".to_string(),\n        kind: ParamType::Uint(256),\n        internal_type: None,\n    };\n    let param_valid_before = Param {\n        name: \"validBefore\".to_string(),\n        kind: ParamType::Uint(256),\n        internal_type: None,\n    };\n    let param_nonce = Param {\n        name: \"nonce\".to_string(),\n        kind: ParamType::FixedBytes(32),\n        internal_type: None,\n    };\n    let param_v = Param {\n        name: \"v\".to_string(),\n        kind: ParamType::Uint(8),\n        internal_type: None,\n    };\n    let param_r = Param {\n        name: \"r\".to_string(),\n        kind: ParamType::FixedBytes(32),\n        internal_type: None,\n    };\n    let param_s = Param {\n        name: \"s\".to_string(),\n        kind: ParamType::FixedBytes(32),\n        internal_type: None,\n    };\n\n    #[allow(deprecated)]\n    Function {\n        name: \"transferWithAuthorization\".to_string(),\n        inputs: vec![\n            param_from,\n            param_to,\n            param_value,\n            param_valid_after,\n            param_valid_before,\n            param_nonce,\n            param_v,\n            param_r,\n            param_s,\n        ],\n        outputs: vec![],\n        constant: None,\n        state_mutability: StateMutability::NonPayable,\n    }\n}\n\npub fn schedule_func() -> Function {\n    let param_calls = Param {\n        name: \"calls\".to_string(),\n        kind: ParamType::Array(Box::new(ParamType::Tuple(vec![\n            ParamType::Address,\n            ParamType::Uint(256),\n            ParamType::Bytes,\n        ]))),\n        internal_type: None,\n    };\n\n    #[allow(deprecated)]\n    Function {\n        name: \"schedule\".to_string(),\n        inputs: vec![param_calls],\n        outputs: vec![],\n        constant: None,\n        state_mutability: StateMutability::Payable,\n    }\n}\n\npub fn execute_batch_transfer_func() -> Function {\n    let param_calls = Param {\n        name: \"calls\".to_string(),\n        kind: ParamType::Array(Box::new(ParamType::Tuple(vec![\n            ParamType::Address,\n            ParamType::Uint(256),\n            ParamType::Bytes,\n        ]))),\n        internal_type: None,\n    };\n    let param_v = Param {\n        name: \"v\".to_string(),\n        kind: ParamType::Uint(8),\n        internal_type: None,\n    };\n    let param_r = Param {\n        name: \"r\".to_string(),\n        kind: ParamType::FixedBytes(32),\n        internal_type: None,\n    };\n    let param_s = Param {\n        name: \"s\".to_string(),\n        kind: ParamType::FixedBytes(32),\n        internal_type: None,\n    };\n\n    #[allow(deprecated)]\n    Function {\n        name: \"execute_batch_transfer\".to_string(),\n        inputs: vec![param_calls, param_v, param_r, param_s],\n        outputs: vec![],\n        constant: None,\n        state_mutability: StateMutability::NonPayable,\n    }\n}\n\npub fn erc20_transfer(address: &EthereumAddress, amount: U256) -> Vec<u8> {\n    let func = erc20_transfer_func();\n    let tokens = vec![\n        Token::Address(H160::from_slice(&address.to_bytes().unwrap())),\n        Token::Uint(amount),\n    ];\n\n    func.encode_input(&tokens).unwrap()\n}\n\npub fn decode(data: Vec<u8>) -> Result<Value, TransactionError> {\n    if data.len() < 4 {\n        return Err(TransactionError::Message(\"Illegal data\".to_string()));\n    }\n\n    let selector = hex::encode(&data[..4]);\n\n    match selector.as_str() {\n        // we're dealing with an erc20 transfer\n        \"a9059cbb\" => {\n            let func = erc20_transfer_func();\n            match func.decode_input(&data[4..]) {\n                Ok(tokens) => {\n                    let to = tokens[0].clone();\n                    let amount = tokens[1].clone();\n\n                    let to = hex::encode(to.into_address().unwrap().as_bytes());\n                    let amount = amount.into_uint().unwrap().to_string();\n\n                    Ok(json!({\n                        \"type\": \"erc20_transfer\",\n                        \"params\": {\n                            \"to\": to,\n                            \"amount\": amount,\n                        }\n                    }))\n                }\n                Err(e) => Err(TransactionError::Message(e.to_string())),\n            }\n        }\n        // we're dealing with an eip3009 transfer\n        \"e3ee160e\" => {\n            let func = eip3009_transfer_func();\n\n            match func.decode_input(&data[4..]) {\n                Ok(tokens) => {\n                    let from = tokens[0].clone();\n                    let to = tokens[1].clone();\n                    let value = tokens[2].clone();\n                    let valid_after = tokens[3].clone();\n                    let valid_before = tokens[4].clone();\n                    let nonce = tokens[5].clone();\n\n                    Ok(json!({\n                        \"type\": \"eip3009_transfer\",\n                        \"params\": {\n                            \"from\": hex::encode(from.into_address().unwrap().as_bytes()),\n                            \"to\": hex::encode(to.into_address().unwrap().as_bytes()),\n                            \"value\": value.into_uint().unwrap().to_string(),\n                            \"validAfter\": valid_after.into_uint().unwrap().to_string(),\n                            \"validBefore\": valid_before.into_uint().unwrap().to_string(),\n                            \"nonce\": hex::encode(nonce.into_fixed_bytes().unwrap()),\n                        }\n                    }))\n                }\n                Err(e) => Err(TransactionError::Message(e.to_string())),\n            }\n        }\n        // we're dealing with a batch transfer\n        \"5a67d813\" => {\n            let func = schedule_func();\n\n            match func.decode_input(&data[4..]) {\n                Ok(tokens) => {\n                    let mut batch_transfers = json!([]);\n                    let calls = tokens[0].clone();\n                    let calls = calls.into_array().unwrap();\n\n                    for call in calls {\n                        let mut batch_transfer = json!({});\n                        let call = call.into_tuple().unwrap();\n\n                        let from = call[0].clone();\n                        let from = hex::encode(from.into_address().unwrap().as_bytes());\n                        let from = EthereumAddress::from_str(&from).unwrap();\n\n                        batch_transfer\n                            .as_object_mut()\n                            .unwrap()\n                            .insert(\"from\".to_string(), json!(from.to_string()));\n\n                        let data = call[2].clone();\n                        let data = data.into_bytes().unwrap();\n\n                        if data.len() < 4 {\n                            return Err(TransactionError::Message(\"Illegal data\".to_string()));\n                        }\n\n                        let func = execute_batch_transfer_func();\n\n                        let mut transfers = json!([]);\n\n                        match func.decode_input(&data[4..]) {\n                            Ok(tokens) => {\n                                let calls = tokens[0].clone();\n                                let calls = calls.into_array().unwrap();\n\n                                for call in calls {\n                                    let transfer = Transfer::from_token(call)?;\n                                    transfers.as_array_mut().unwrap().push(transfer.to_json());\n                                }\n                            }\n                            Err(e) => return Err(TransactionError::Message(e.to_string())),\n                        }\n                        batch_transfer\n                            .as_object_mut()\n                            .unwrap()\n                            .insert(\"transfers\".to_string(), transfers);\n                        batch_transfers.as_array_mut().unwrap().push(batch_transfer);\n                    }\n\n                    Ok(json!({\n                        \"type\": \"batch_transfer\",\n                        \"batchTransfers\": batch_transfers,\n                    }))\n                }\n                Err(e) => Err(TransactionError::Message(e.to_string())),\n            }\n        }\n        _ => Err(TransactionError::Message(\n            \"Unsupported contract function\".to_string(),\n        )),\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/transaction/eip1559.rs",
    "content": "use crate::util::{adapt2, pad_zeros, restore_sender, trim_leading_zeros};\nuse crate::{EthereumAddress, EthereumFormat, EthereumNetwork, EthereumPublicKey};\nuse anychain_core::{hex, utilities::crypto::keccak256, Transaction, TransactionError};\nuse core::{fmt, marker::PhantomData, str::FromStr};\nuse ethereum_types::U256;\nuse rlp::{Decodable, DecoderError, Encodable, Rlp, RlpStream};\n\nuse super::EthereumTransactionId;\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct Eip1559TransactionParameters {\n    pub chain_id: u32,\n    pub nonce: U256,\n    pub max_priority_fee_per_gas: U256,\n    pub max_fee_per_gas: U256,\n    pub gas_limit: U256,\n    pub to: EthereumAddress,\n    pub amount: U256,\n    pub data: Vec<u8>,\n    pub access_list: Vec<AccessItem>,\n}\n\nimpl Eip1559TransactionParameters {\n    pub fn to_rlp(&self, array_len: usize) -> Result<RlpStream, TransactionError> {\n        let to = self\n            .to\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(format!(\"{}\", e)))?;\n\n        let mut rlp = RlpStream::new();\n        rlp.begin_list(array_len);\n\n        rlp.append(&self.chain_id);\n        rlp.append(&self.nonce);\n        rlp.append(&self.max_priority_fee_per_gas);\n        rlp.append(&self.max_fee_per_gas);\n        rlp.append(&self.gas_limit);\n        rlp.append(&to);\n        rlp.append(&self.amount);\n        rlp.append(&self.data);\n        rlp.append_list(&self.access_list);\n\n        Ok(rlp)\n    }\n\n    pub fn get_data(&self) -> Vec<u8> {\n        self.data.clone()\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct Eip1559TransactionSignature {\n    pub y_parity: bool,\n    pub r: Vec<u8>,\n    pub s: Vec<u8>,\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct AccessItem {\n    pub address: EthereumAddress,\n    pub storage_keys: Vec<Vec<u8>>,\n}\n\nimpl Encodable for AccessItem {\n    fn rlp_append(&self, s: &mut RlpStream) {\n        s.begin_list(2);\n        s.append(&self.address.to_bytes().unwrap());\n        s.append_list::<Vec<u8>, Vec<u8>>(&self.storage_keys);\n    }\n}\n\nimpl Decodable for AccessItem {\n    fn decode(rlp: &rlp::Rlp) -> Result<Self, DecoderError> {\n        let address = hex::encode(rlp.val_at::<Vec<u8>>(0)?);\n        let address = EthereumAddress::from_str(&address).unwrap();\n        let storage_keys = rlp.list_at::<Vec<u8>>(1)?;\n        Ok(Self {\n            address,\n            storage_keys,\n        })\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct Eip1559Transaction<N: EthereumNetwork> {\n    pub sender: Option<EthereumAddress>,\n    pub params: Eip1559TransactionParameters,\n    pub signature: Option<Eip1559TransactionSignature>,\n    _network: PhantomData<N>,\n}\n\nimpl<N: EthereumNetwork> Eip1559Transaction<N> {\n    pub fn restore_sender(&mut self) -> Result<(), TransactionError> {\n        if self.signature.is_none() {\n            return Err(TransactionError::Message(\n                \"Signature is missing\".to_string(),\n            ));\n        }\n\n        let sig = self.signature.clone().unwrap();\n        self.signature = None;\n\n        let recid = match sig.y_parity {\n            true => 1,\n            false => 0,\n        } as u8;\n\n        let _sig = [sig.r.clone(), sig.s.clone()].concat();\n        let msg = self.to_transaction_id()?.txid;\n\n        let sender = restore_sender(msg, _sig, recid)?;\n\n        self.sender = Some(sender);\n        self.signature = Some(sig);\n\n        Ok(())\n    }\n}\n\nimpl<N: EthereumNetwork> Transaction for Eip1559Transaction<N> {\n    type Address = EthereumAddress;\n    type Format = EthereumFormat;\n    type PublicKey = EthereumPublicKey;\n    type TransactionId = EthereumTransactionId;\n    type TransactionParameters = Eip1559TransactionParameters;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            sender: None,\n            params: params.clone(),\n            signature: None,\n            _network: PhantomData,\n        })\n    }\n\n    fn sign(&mut self, rs: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError> {\n        if rs.len() != 64 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signature length: {}\",\n                rs.len()\n            )));\n        }\n        let y_parity = recid == 1;\n        let r = rs[..32].to_vec();\n        let s = rs[32..].to_vec();\n        self.signature = Some(Eip1559TransactionSignature { y_parity, r, s });\n        self.to_bytes()\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        let rlp = match &self.signature {\n            Some(sig) => {\n                let mut rlp = self.params.to_rlp(12)?;\n                let r = trim_leading_zeros(&sig.r);\n                let s = trim_leading_zeros(&sig.s);\n                rlp.append(&sig.y_parity);\n                rlp.append(&r);\n                rlp.append(&s);\n                rlp.out().to_vec()\n            }\n            None => self.params.to_rlp(9)?.out().to_vec(),\n        };\n        Ok([vec![2u8], rlp].concat())\n    }\n\n    fn from_bytes(tx: &[u8]) -> Result<Self, TransactionError> {\n        let rlp = Rlp::new(&tx[1..]);\n\n        let to = adapt2(rlp.val_at::<Vec<u8>>(5))?;\n        let to = hex::encode(to);\n\n        let chain_id = adapt2(rlp.val_at::<u32>(0))?;\n        let nonce = adapt2(rlp.val_at::<U256>(1))?;\n        let max_priority_fee_per_gas = adapt2(rlp.val_at::<U256>(2))?;\n        let max_fee_per_gas = adapt2(rlp.val_at::<U256>(3))?;\n        let gas_limit = adapt2(rlp.val_at::<U256>(4))?;\n        let to = EthereumAddress::from_str(&to)?;\n        let amount = adapt2(rlp.val_at::<U256>(6))?;\n        let data = adapt2(rlp.val_at::<Vec<u8>>(7))?;\n        let access_list = adapt2(rlp.list_at::<AccessItem>(8))?;\n\n        let y_parity = adapt2(rlp.val_at::<bool>(9))?;\n        let mut r = adapt2(rlp.val_at::<Vec<u8>>(10))?;\n        let mut s = adapt2(rlp.val_at::<Vec<u8>>(11))?;\n\n        let params = Eip1559TransactionParameters {\n            chain_id,\n            nonce,\n            max_priority_fee_per_gas,\n            max_fee_per_gas,\n            gas_limit,\n            to,\n            amount,\n            data,\n            access_list,\n        };\n\n        let mut tx = Eip1559Transaction::<N>::new(&params)?;\n\n        if !r.is_empty() && !s.is_empty() {\n            pad_zeros(&mut r, 32);\n            pad_zeros(&mut s, 32);\n            let sig = Eip1559TransactionSignature { y_parity, r, s };\n            tx.signature = Some(sig);\n            tx.restore_sender()?;\n        }\n\n        Ok(tx)\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        Ok(Self::TransactionId {\n            txid: keccak256(&self.to_bytes()?).to_vec(),\n        })\n    }\n}\n\nimpl<N: EthereumNetwork> FromStr for Eip1559Transaction<N> {\n    type Err = TransactionError;\n\n    fn from_str(tx: &str) -> Result<Self, Self::Err> {\n        let tx = match &tx[..2] {\n            \"0x\" => &tx[2..],\n            _ => tx,\n        };\n        Self::from_bytes(&hex::decode(tx)?)\n    }\n}\n\nimpl<N: EthereumNetwork> fmt::Display for Eip1559Transaction<N> {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"0x{}\",\n            &hex::encode(match self.to_bytes() {\n                Ok(transaction) => transaction,\n                _ => return Err(fmt::Error),\n            })\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{\n        Eip1559Transaction, Eip1559TransactionParameters, EthereumAddress, EthereumNetwork,\n        Sepolia, TransferWithAuthorizationParameters,\n    };\n    use anychain_core::{hex, Transaction};\n    use anychain_kms::secp256k1_sign;\n    use core::str::FromStr;\n    use ethereum_types::U256;\n    use std::time::SystemTime;\n\n    #[test]\n    fn test_eip1559_tx() {\n        let params = Eip1559TransactionParameters {\n            chain_id: Sepolia::CHAIN_ID,\n            nonce: U256::from_dec_str(\"4\").unwrap(),\n            max_priority_fee_per_gas: U256::from_dec_str(\"100000000000\").unwrap(),\n            max_fee_per_gas: U256::from_dec_str(\"200000000000\").unwrap(),\n            gas_limit: U256::from_dec_str(\"21000\").unwrap(),\n            to: EthereumAddress::from_str(\"0xf7a63003b8ef116939804b4c2dd49290a39c4d97\").unwrap(),\n            amount: U256::from_dec_str(\"10000000000000000\").unwrap(),\n            data: vec![],\n            access_list: vec![],\n        };\n        let mut tx = Eip1559Transaction::<Sepolia>::new(&params).unwrap();\n        let msg = tx.to_transaction_id().unwrap().txid;\n        let msg = libsecp256k1::Message::parse_slice(&msg).unwrap();\n\n        let sk = \"08d586ed207046d6476f92fd4852be3830a9d651fc148d6fa5a6f15b77ba5df0\";\n        let sk = hex::decode(sk).unwrap();\n        let sk = libsecp256k1::SecretKey::parse_slice(&sk).unwrap();\n\n        let (sig, recid) = libsecp256k1::sign(&msg, &sk);\n        let sig = sig.serialize().to_vec();\n        let recid = recid.serialize();\n\n        let _ = tx.sign(sig, recid);\n\n        println!(\"{}\", tx);\n    }\n\n    #[test]\n    fn test_eip3009_tx() {\n        let sk = \"3d98c2d5a7f737693b470114816000645419af49bd21258cc99142f6ef5fd60a\".to_string();\n        let sk = hex::decode(sk).unwrap();\n\n        let from = \"0x7eE4c635d204eBE65fc8987CE6570CFA1651E8Af\".to_string();\n        let to = \"0xf7a63003b8ef116939804b4c2dd49290a39c4d97\".to_string();\n        let usdc = \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\".to_string();\n        let amount = \"100000\".to_string();\n\n        let now = SystemTime::now()\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs();\n\n        let mut transfer = TransferWithAuthorizationParameters::<Sepolia>::new(\n            \"USDC\".to_string(),\n            \"2\".to_string(),\n            usdc.clone(),\n            from,\n            to,\n            amount,\n            now.to_string(),\n            (now + 100).to_string(),\n            \"0xc16e8459b9c3ecfbbc20c34444c72ce016cdb109fa5a982b0dd223e15e8f96de\".to_string(),\n        )\n        .unwrap();\n\n        let digest = transfer.digest().unwrap();\n        let (rs, recid) = secp256k1_sign(&sk, &digest).unwrap();\n        let data = transfer\n            .sign(recid, rs[..32].to_vec(), rs[32..].to_vec())\n            .unwrap();\n\n        let nonce = U256::from(22);\n        let max_priority_fee_per_gas = U256::from_dec_str(\"50000000000\").unwrap();\n        let max_fee_per_gas = U256::from_dec_str(\"50000000000\").unwrap();\n        let gas_limit = U256::from(210000);\n        let to = EthereumAddress::from_str(&usdc).unwrap();\n        let amount = U256::from(0);\n\n        let params = Eip1559TransactionParameters {\n            chain_id: Sepolia::CHAIN_ID,\n            nonce,\n            max_priority_fee_per_gas,\n            max_fee_per_gas,\n            gas_limit,\n            to,\n            amount,\n            data,\n            access_list: vec![],\n        };\n\n        let mut tx = Eip1559Transaction::<Sepolia>::new(&params).unwrap();\n        let txid = tx.to_transaction_id().unwrap().txid;\n        let (rs, recid) = secp256k1_sign(&sk, &txid).unwrap();\n        let tx = tx.sign(rs, recid).unwrap();\n        let tx = hex::encode(tx);\n\n        println!(\"Tx: {}\", tx);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/transaction/eip3009.rs",
    "content": "use core::marker::PhantomData;\nuse core::str::FromStr;\n\nuse crate::contract::eip3009_transfer_func;\nuse crate::{EthereumAddress, EthereumNetwork};\nuse anychain_core::{crypto::keccak256, hex, TransactionError};\nuse ethabi::{encode, Token};\nuse ethereum_types::{H160, U256};\n\ntrait EIP712TypedData {\n    fn type_hash(&self) -> Result<Vec<u8>, TransactionError>;\n    fn encode(&self) -> Result<Vec<u8>, TransactionError>;\n    fn hash_struct(&self) -> Result<Vec<u8>, TransactionError> {\n        Ok(keccak256(&self.encode()?).to_vec())\n    }\n}\n\nstruct EIP712Domain<N: EthereumNetwork> {\n    name: String,\n    version: String,\n    verifying_contract: EthereumAddress,\n    _network: PhantomData<N>,\n}\n\nimpl<N: EthereumNetwork> EIP712TypedData for EIP712Domain<N> {\n    fn type_hash(&self) -> Result<Vec<u8>, TransactionError> {\n        let stream =\n            \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n                .as_bytes();\n        Ok(keccak256(stream).to_vec())\n    }\n\n    fn encode(&self) -> Result<Vec<u8>, TransactionError> {\n        let type_hash = self.type_hash()?;\n        let name = keccak256(self.name.as_bytes()).to_vec();\n        let version = keccak256(self.version.as_bytes()).to_vec();\n        let chain_id = U256::from(N::CHAIN_ID);\n        let contract = self\n            .verifying_contract\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let contract = H160::from_slice(&contract);\n\n        let type_hash = Token::FixedBytes(type_hash);\n        let name = Token::FixedBytes(name);\n        let version = Token::FixedBytes(version);\n        let chain_id = Token::Uint(chain_id);\n        let contract = Token::Address(contract);\n\n        Ok(encode(&[type_hash, name, version, chain_id, contract]))\n    }\n}\n\nimpl<N: EthereumNetwork> EIP712Domain<N> {\n    fn new(name: String, version: String, contract: String) -> Result<Self, TransactionError> {\n        let verifying_contract = EthereumAddress::from_str(&contract)?;\n\n        Ok(Self {\n            name,\n            version,\n            verifying_contract,\n            _network: PhantomData,\n        })\n    }\n}\n\npub struct TransferWithAuthorizationParameters<N: EthereumNetwork> {\n    domain: Option<EIP712Domain<N>>,\n    from: EthereumAddress,\n    to: EthereumAddress,\n    amount: U256,\n    valid_after: U256,\n    valid_before: U256,\n    nonce: Vec<u8>, // 32-byte hash\n    v: u8,\n    r: Vec<u8>,\n    s: Vec<u8>,\n}\n\nimpl<N: EthereumNetwork> EIP712TypedData for TransferWithAuthorizationParameters<N> {\n    fn type_hash(&self) -> Result<Vec<u8>, TransactionError> {\n        let stream = \"TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)\".as_bytes();\n        Ok(keccak256(stream).to_vec())\n    }\n\n    fn encode(&self) -> Result<Vec<u8>, TransactionError> {\n        let type_hash = self.type_hash()?;\n\n        let from = self\n            .from\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let to = self\n            .to\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n        let from = H160::from_slice(&from);\n        let to = H160::from_slice(&to);\n\n        let type_hash = Token::FixedBytes(type_hash);\n\n        let from = Token::Address(from);\n        let to = Token::Address(to);\n        let amount = Token::Uint(self.amount);\n\n        let valid_after = Token::Uint(self.valid_after);\n        let valid_before = Token::Uint(self.valid_before);\n        let nonce = Token::FixedBytes(self.nonce.clone());\n\n        Ok(encode(&[\n            type_hash,\n            from,\n            to,\n            amount,\n            valid_after,\n            valid_before,\n            nonce,\n        ]))\n    }\n}\n\nimpl<N: EthereumNetwork> TransferWithAuthorizationParameters<N> {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        name: String,\n        version: String,\n        contract: String,\n        from: String,\n        to: String,\n        amount: String,\n        valid_after: String,\n        valid_before: String,\n        nonce: String,\n    ) -> Result<Self, TransactionError> {\n        let domain = Some(EIP712Domain::<N>::new(name, version, contract)?);\n        let from = EthereumAddress::from_str(&from)\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let to =\n            EthereumAddress::from_str(&to).map_err(|e| TransactionError::Message(e.to_string()))?;\n        let amount =\n            U256::from_dec_str(&amount).map_err(|e| TransactionError::Message(e.to_string()))?;\n        let valid_after = U256::from_dec_str(&valid_after)\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let valid_before = U256::from_dec_str(&valid_before)\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n\n        let nonce = match nonce.strip_prefix(\"0x\") {\n            Some(nonce) => nonce,\n            None => &nonce,\n        };\n\n        let nonce = hex::decode(nonce)?;\n\n        Ok(Self {\n            domain,\n            from,\n            to,\n            amount,\n            valid_after,\n            valid_before,\n            nonce,\n            v: 0,\n            r: vec![],\n            s: vec![],\n        })\n    }\n\n    pub fn sign(&mut self, recid: u8, r: Vec<u8>, s: Vec<u8>) -> Result<Vec<u8>, TransactionError> {\n        self.v = recid + 27;\n        self.r = r;\n        self.s = s;\n        self.to_data()\n    }\n\n    pub fn digest(&self) -> Result<Vec<u8>, TransactionError> {\n        if let Some(domain) = &self.domain {\n            let domain_separator = domain.hash_struct()?;\n            let hash_params = self.hash_struct()?;\n            let stream = [\n                vec![25], /* 0x19 */\n                vec![1],  /* 0x01 */\n                domain_separator,\n                hash_params,\n            ]\n            .concat();\n            Ok(keccak256(stream.as_ref()).to_vec())\n        } else {\n            Err(TransactionError::Message(\"domain not provided\".to_string()))\n        }\n    }\n\n    fn to_data(&self) -> Result<Vec<u8>, TransactionError> {\n        let func = eip3009_transfer_func();\n        let from = self\n            .from\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let to = self\n            .to\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(e.to_string()))?;\n        let amount = self.amount;\n        let valid_after = self.valid_after;\n        let valid_before = self.valid_before;\n        let nonce = self.nonce.clone();\n        let v = U256::from(self.v);\n        let r = self.r.clone();\n        let s = self.s.clone();\n\n        let tokens = vec![\n            Token::Address(H160::from_slice(&from)),\n            Token::Address(H160::from_slice(&to)),\n            Token::Uint(amount),\n            Token::Uint(valid_after),\n            Token::Uint(valid_before),\n            Token::FixedBytes(nonce),\n            Token::Uint(v),\n            Token::FixedBytes(r),\n            Token::FixedBytes(s),\n        ];\n\n        func.encode_input(&tokens)\n            .map_err(|e| TransactionError::Message(e.to_string()))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{\n        eip3009::TransferWithAuthorizationParameters, Eip1559Transaction,\n        Eip1559TransactionParameters, Sepolia,\n    };\n    use anychain_core::Transaction;\n    use anychain_kms::secp256k1_sign;\n    use std::time::SystemTime;\n\n    #[test]\n    fn test_eip3009_tx() {\n        let sk = \"3d98c2d5a7f737693b470114816000645419af49bd21258cc99142f6ef5fd60a\".to_string();\n        let sk = hex::decode(sk).unwrap();\n\n        let from = \"0x7eE4c635d204eBE65fc8987CE6570CFA1651E8Af\".to_string();\n        let to = \"0xf7a63003b8ef116939804b4c2dd49290a39c4d97\".to_string();\n        let usdc = \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\".to_string();\n        let amount = \"100000\".to_string();\n\n        let now = SystemTime::now()\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs();\n\n        use rand::RngCore;\n\n        let mut nonce = [0u8; 32];\n        rand::rngs::OsRng.fill_bytes(&mut nonce);\n        let nonce = hex::encode(nonce);\n\n        let mut transfer = TransferWithAuthorizationParameters::<Sepolia>::new(\n            \"USDC\".to_string(),\n            \"2\".to_string(),\n            usdc.clone(),\n            from,\n            to,\n            amount,\n            now.to_string(),\n            (now + 100).to_string(),\n            nonce,\n        )\n        .unwrap();\n\n        let digest = transfer.digest().unwrap();\n        let (rs, recid) = secp256k1_sign(&sk, &digest).unwrap();\n        let data = transfer\n            .sign(recid, rs[..32].to_vec(), rs[32..].to_vec())\n            .unwrap();\n\n        println!(\"Data: 0x{}\", hex::encode(&data));\n\n        let nonce = U256::from(67);\n        let max_priority_fee_per_gas = U256::from_dec_str(\"1000000000\").unwrap();\n        let max_fee_per_gas = U256::from_dec_str(\"1000000000\").unwrap();\n        let gas_limit = U256::from(210000);\n        let to = EthereumAddress::from_str(&usdc).unwrap();\n        let amount = U256::from(0);\n\n        let params = Eip1559TransactionParameters {\n            chain_id: Sepolia::CHAIN_ID,\n            nonce,\n            max_priority_fee_per_gas,\n            max_fee_per_gas,\n            gas_limit,\n            to,\n            amount,\n            data,\n            access_list: vec![],\n        };\n\n        let mut tx = Eip1559Transaction::<Sepolia>::new(&params).unwrap();\n        let txid = tx.to_transaction_id().unwrap().txid;\n        let (rs, recid) = secp256k1_sign(&sk, &txid).unwrap();\n        let tx = tx.sign(rs, recid).unwrap();\n        let tx = hex::encode(tx);\n\n        println!(\"Tx: {}\", tx);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/transaction/eip7702.rs",
    "content": "use crate::contract::{erc20_transfer_func, execute_batch_transfer_func, schedule_func};\nuse crate::util::{adapt2, pad_zeros, restore_sender, trim_leading_zeros};\nuse crate::{erc20_transfer, AccessItem, EthereumTransactionId};\nuse crate::{EthereumAddress, EthereumFormat, EthereumNetwork, EthereumPublicKey};\n\nuse anychain_core::{hex, utilities::crypto::keccak256, Transaction, TransactionError};\nuse core::{fmt, marker::PhantomData, str::FromStr};\nuse ethabi::{encode, ethereum_types::H160, Token};\nuse ethereum_types::U256;\nuse rlp::{Decodable, DecoderError, Encodable, Rlp, RlpStream};\nuse serde_json::{json, Value};\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct Authorization {\n    pub chain_id: u32,\n    pub contract: EthereumAddress,\n    pub nonce: U256,\n    pub y_parity: bool,\n    pub r: Vec<u8>,\n    pub s: Vec<u8>,\n}\n\nimpl Authorization {\n    pub fn digest(&self) -> Vec<u8> {\n        let mut rlp = RlpStream::new();\n        rlp.begin_list(3);\n        rlp.append(&self.chain_id);\n        rlp.append(&self.contract.to_bytes().unwrap());\n        rlp.append(&self.nonce);\n\n        let stream = [vec![5u8], rlp.out().as_ref().to_vec()].concat();\n        keccak256(&stream).to_vec()\n    }\n\n    pub fn sign(&mut self, rs: Vec<u8>, recid: u8) {\n        self.y_parity = recid == 1;\n        self.r = rs[..32].to_vec();\n        self.s = rs[32..].to_vec();\n    }\n\n    pub fn restore_sender(&self) -> Result<EthereumAddress, TransactionError> {\n        let recid = match self.y_parity {\n            true => 1,\n            false => 0,\n        } as u8;\n\n        let sig = [self.r.clone(), self.s.clone()].concat();\n        let msg = self.digest();\n\n        restore_sender(msg, sig, recid)\n    }\n}\n\nimpl Encodable for Authorization {\n    fn rlp_append(&self, s: &mut RlpStream) {\n        s.begin_list(6);\n        s.append(&self.chain_id);\n        s.append(&self.contract.to_bytes().unwrap());\n        s.append(&self.nonce);\n        s.append(&self.y_parity);\n        s.append(&trim_leading_zeros(&self.r));\n        s.append(&trim_leading_zeros(&self.s));\n    }\n}\n\nimpl Decodable for Authorization {\n    fn decode(rlp: &rlp::Rlp) -> Result<Self, DecoderError> {\n        let chain_id = rlp.val_at::<u32>(0)?;\n        let contract = rlp.val_at::<Vec<u8>>(1)?;\n        let contract = hex::encode(contract);\n        let contract = EthereumAddress::from_str(&contract).unwrap();\n        let nonce = rlp.val_at::<U256>(2)?;\n        let y_parity = rlp.val_at(3)?;\n        let mut r = rlp.val_at(4)?;\n        let mut s = rlp.val_at(5)?;\n        pad_zeros(&mut r, 32);\n        pad_zeros(&mut s, 32);\n        Ok(Self {\n            chain_id,\n            contract,\n            nonce,\n            y_parity,\n            r,\n            s,\n        })\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct Eip7702TransactionParameters {\n    pub chain_id: u32,\n    pub nonce: U256,\n    pub max_priority_fee_per_gas: U256,\n    pub max_fee_per_gas: U256,\n    pub gas_limit: U256,\n    pub to: EthereumAddress,\n    pub amount: U256,\n    pub data: Vec<u8>,\n    pub access_list: Vec<AccessItem>,\n    pub authorizations: Vec<Authorization>,\n}\n\nimpl Eip7702TransactionParameters {\n    pub fn to_rlp(&self, array_len: usize) -> Result<RlpStream, TransactionError> {\n        let to = self\n            .to\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(format!(\"{}\", e)))?;\n\n        let mut rlp = RlpStream::new();\n        rlp.begin_list(array_len);\n\n        rlp.append(&self.chain_id);\n        rlp.append(&self.nonce);\n        rlp.append(&self.max_priority_fee_per_gas);\n        rlp.append(&self.max_fee_per_gas);\n        rlp.append(&self.gas_limit);\n        rlp.append(&to);\n        rlp.append(&self.amount);\n        rlp.append(&self.data);\n        rlp.append_list(&self.access_list);\n        rlp.append_list(&self.authorizations);\n\n        Ok(rlp)\n    }\n\n    pub fn get_data(&self) -> Vec<u8> {\n        self.data.clone()\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct Eip7702TransactionSignature {\n    pub y_parity: bool,\n    pub r: Vec<u8>,\n    pub s: Vec<u8>,\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct Eip7702Transaction<N: EthereumNetwork> {\n    pub sender: Option<EthereumAddress>,\n    pub params: Eip7702TransactionParameters,\n    pub signature: Option<Eip7702TransactionSignature>,\n    _network: PhantomData<N>,\n}\n\nimpl<N: EthereumNetwork> Eip7702Transaction<N> {\n    pub fn restore_sender(&mut self) -> Result<(), TransactionError> {\n        if self.signature.is_none() {\n            return Err(TransactionError::Message(\n                \"Signature is missing\".to_string(),\n            ));\n        }\n\n        let sig = self.signature.clone().unwrap();\n        self.signature = None;\n\n        let recid = match sig.y_parity {\n            true => 1,\n            false => 0,\n        } as u8;\n\n        let _sig = [sig.r.clone(), sig.s.clone()].concat();\n        let msg = self.to_transaction_id()?.txid;\n\n        let sender = restore_sender(msg, _sig, recid)?;\n\n        self.sender = Some(sender);\n        self.signature = Some(sig);\n\n        Ok(())\n    }\n}\n\nimpl<N: EthereumNetwork> Transaction for Eip7702Transaction<N> {\n    type Address = EthereumAddress;\n    type Format = EthereumFormat;\n    type PublicKey = EthereumPublicKey;\n    type TransactionId = EthereumTransactionId;\n    type TransactionParameters = Eip7702TransactionParameters;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            sender: None,\n            params: params.clone(),\n            signature: None,\n            _network: PhantomData,\n        })\n    }\n\n    fn sign(&mut self, rs: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError> {\n        if rs.len() != 64 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signature length: {}\",\n                rs.len()\n            )));\n        }\n        let y_parity = recid == 1;\n        let r = rs[..32].to_vec();\n        let s = rs[32..].to_vec();\n        self.signature = Some(Eip7702TransactionSignature { y_parity, r, s });\n        self.to_bytes()\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        let rlp = match &self.signature {\n            Some(sig) => {\n                let mut rlp = self.params.to_rlp(13)?;\n                let r = trim_leading_zeros(&sig.r);\n                let s = trim_leading_zeros(&sig.s);\n                rlp.append(&sig.y_parity);\n                rlp.append(&r);\n                rlp.append(&s);\n                rlp.out().to_vec()\n            }\n            None => self.params.to_rlp(10)?.out().to_vec(),\n        };\n        Ok([vec![4u8], rlp].concat())\n    }\n\n    fn from_bytes(tx: &[u8]) -> Result<Self, TransactionError> {\n        if tx.is_empty() || tx[0] != 4u8 {\n            return Err(TransactionError::Message(\n                \"Invalid transaction type for EIP-7702\".to_string(),\n            ));\n        }\n        let rlp = Rlp::new(&tx[1..]);\n\n        let item_count = adapt2(rlp.item_count())?;\n        if item_count != 10 && item_count != 13 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid RLP item count for EIP-7702: {}\",\n                item_count\n            )));\n        }\n\n        let to = adapt2(rlp.val_at::<Vec<u8>>(5))?;\n        let to = hex::encode(to);\n\n        let chain_id = adapt2(rlp.val_at::<u32>(0))?;\n        let nonce = adapt2(rlp.val_at::<U256>(1))?;\n        let max_priority_fee_per_gas = adapt2(rlp.val_at::<U256>(2))?;\n        let max_fee_per_gas = adapt2(rlp.val_at::<U256>(3))?;\n        let gas_limit = adapt2(rlp.val_at::<U256>(4))?;\n        let to = EthereumAddress::from_str(&to)?;\n        let amount = adapt2(rlp.val_at::<U256>(6))?;\n        let data = adapt2(rlp.val_at::<Vec<u8>>(7))?;\n        let access_list = adapt2(rlp.list_at::<AccessItem>(8))?;\n        let authorizations = adapt2(rlp.list_at::<Authorization>(9))?;\n\n        let params = Eip7702TransactionParameters {\n            chain_id,\n            nonce,\n            max_priority_fee_per_gas,\n            max_fee_per_gas,\n            gas_limit,\n            to,\n            amount,\n            data,\n            access_list,\n            authorizations,\n        };\n\n        let mut tx = Eip7702Transaction::<N>::new(&params)?;\n\n        if item_count == 13 {\n            let y_parity = adapt2(rlp.val_at::<bool>(10))?;\n            let mut r = adapt2(rlp.val_at::<Vec<u8>>(11))?;\n            let mut s = adapt2(rlp.val_at::<Vec<u8>>(12))?;\n\n            pad_zeros(&mut r, 32);\n            pad_zeros(&mut s, 32);\n            let sig = Eip7702TransactionSignature { y_parity, r, s };\n            tx.signature = Some(sig);\n            tx.restore_sender()?;\n        }\n\n        Ok(tx)\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        Ok(Self::TransactionId {\n            txid: keccak256(&self.to_bytes()?).to_vec(),\n        })\n    }\n}\n\nimpl<N: EthereumNetwork> FromStr for Eip7702Transaction<N> {\n    type Err = TransactionError;\n\n    fn from_str(tx: &str) -> Result<Self, Self::Err> {\n        let tx = match &tx[..2] {\n            \"0x\" => &tx[2..],\n            _ => tx,\n        };\n        Self::from_bytes(&hex::decode(tx)?)\n    }\n}\n\nimpl<N: EthereumNetwork> fmt::Display for Eip7702Transaction<N> {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"0x{}\",\n            &hex::encode(match self.to_bytes() {\n                Ok(transaction) => transaction,\n                _ => return Err(fmt::Error),\n            })\n        )\n    }\n}\n\npub struct Many2ManyTransfer<N: EthereumNetwork> {\n    pub transfers: Vec<One2ManyTransfer<N>>,\n}\n\nimpl<N: EthereumNetwork> Many2ManyTransfer<N> {\n    pub fn new(transfers: Vec<One2ManyTransfer<N>>) -> Self {\n        Self { transfers }\n    }\n\n    pub fn authorizations(&self) -> Result<Vec<Authorization>, TransactionError> {\n        self.transfers\n            .iter()\n            .map(|transfer| transfer.authorization())\n            .collect::<Result<Vec<Authorization>, TransactionError>>()\n            .map_err(|e| TransactionError::Message(format!(\"{}\", e)))\n    }\n\n    pub fn data(&self) -> Result<Vec<u8>, TransactionError> {\n        let func = schedule_func();\n        let calls = Token::Array(\n            self.transfers\n                .iter()\n                .map(|t| t.to_token())\n                .collect::<Vec<Token>>(),\n        );\n\n        let tokens = vec![calls];\n\n        func.encode_input(&tokens)\n            .map_err(|e| TransactionError::Message(format!(\"Failed to encode transfers: {}\", e)))\n    }\n}\n\npub struct One2ManyTransfer<N: EthereumNetwork> {\n    // address which initiates transfers\n    pub from: String,\n\n    // nonce of from address\n    pub nonce: u64,\n\n    // nonce of the transfer contract (for replay protection)\n    pub nonce_contract: u64,\n\n    // contract authorized to from by 7702\n    pub contract: String,\n\n    // transfer batch\n    pub transfers: Vec<Transfer>,\n\n    // from's signature for contract authorization\n    pub sig_auth: Option<Vec<u8>>,\n\n    // froms's signature for transfers\n    pub sig_transfer: Option<Vec<u8>>,\n\n    _network: PhantomData<N>,\n}\n\nimpl<N: EthereumNetwork> One2ManyTransfer<N> {\n    pub fn new(\n        from: String,\n        nonce: u64,\n        nonce_contract: u64,\n        contract: String,\n        transfers: Vec<Transfer>,\n    ) -> Self {\n        Self {\n            from,\n            nonce,\n            nonce_contract,\n            contract,\n            transfers,\n            sig_auth: None,\n            sig_transfer: None,\n            _network: PhantomData,\n        }\n    }\n\n    pub fn digest(&self, typ: u8) -> Result<Vec<u8>, TransactionError> {\n        match typ {\n            // returns the auth digest\n            0 => {\n                let auth = self.authorization()?;\n                Ok(auth.digest())\n            }\n            // returns the transfer digest\n            1 => {\n                let chain_id = U256::from(N::CHAIN_ID);\n                let chain_id = Token::Uint(chain_id);\n                let nonce = Token::Uint(U256::from(self.nonce_contract));\n                let calls = Token::Array(\n                    self.transfers\n                        .iter()\n                        .map(|t| t.to_token())\n                        .collect::<Vec<Token>>(),\n                );\n\n                let stream = encode(&[chain_id, nonce, calls]);\n                Ok(keccak256(&stream).to_vec())\n            }\n            _ => Err(TransactionError::Message(\"invalid digest type\".to_string())),\n        }\n    }\n\n    pub fn sign(&mut self, rs: Vec<u8>, recid: u8, typ: u8) -> Result<(), TransactionError> {\n        let sig = [rs, vec![recid]].concat();\n        match typ {\n            // insert the auth signature\n            0 => {\n                self.sig_auth = Some(sig);\n                Ok(())\n            }\n            // insert the transfer signature\n            1 => {\n                self.sig_transfer = Some(sig);\n                Ok(())\n            }\n            _ => Err(TransactionError::Message(\n                \"invalid signature type\".to_string(),\n            )),\n        }\n    }\n\n    pub fn authorization(&self) -> Result<Authorization, TransactionError> {\n        let chain_id = N::CHAIN_ID;\n        let contract = EthereumAddress::from_str(&self.contract)?;\n        let nonce = U256::from(self.nonce);\n\n        let mut auth = Authorization {\n            chain_id,\n            contract,\n            nonce,\n            y_parity: false,\n            r: vec![],\n            s: vec![],\n        };\n\n        match &self.sig_auth {\n            Some(sig_auth) => {\n                auth.sign(sig_auth[..64].to_vec(), sig_auth[64]);\n                Ok(auth)\n            }\n            None => Ok(auth),\n        }\n    }\n\n    pub fn data(&self) -> Result<Vec<u8>, TransactionError> {\n        if self.sig_transfer.is_none() {\n            return Err(TransactionError::Message(\n                \"transfers not signed yet\".to_string(),\n            ));\n        }\n\n        let func = execute_batch_transfer_func();\n\n        let calls = Token::Array(\n            self.transfers\n                .iter()\n                .map(|t| t.to_token())\n                .collect::<Vec<Token>>(),\n        );\n\n        let sig = self.sig_transfer.clone().unwrap();\n\n        let v = sig[64] + 27;\n        let r = sig[..32].to_vec();\n        let s = sig[32..64].to_vec();\n\n        let v = Token::Uint(U256::from(v));\n        let r = Token::FixedBytes(r);\n        let s = Token::FixedBytes(s);\n\n        let tokens = vec![calls, v, r, s];\n\n        func.encode_input(&tokens)\n            .map_err(|e| TransactionError::Message(format!(\"Failed to encode transfers: {}\", e)))\n    }\n\n    pub fn to_token(&self) -> Token {\n        let from = EthereumAddress::from_str(&self.from).unwrap();\n        let to = Token::Address(H160::from_slice(&from.to_bytes().unwrap()));\n        let amount = Token::Uint(U256::zero());\n        let data = Token::Bytes(self.data().unwrap());\n        Token::Tuple(vec![to, amount, data])\n    }\n}\n\npub struct Transfer {\n    pub token: Option<EthereumAddress>,\n    pub to: EthereumAddress,\n    pub amount: U256,\n}\n\nimpl Transfer {\n    pub fn new(token: Option<String>, to: String, amount: String) -> Self {\n        Self {\n            token: token.map(|t| EthereumAddress::from_str(&t).unwrap()),\n            to: EthereumAddress::from_str(&to).unwrap(),\n            amount: U256::from_dec_str(&amount).unwrap(),\n        }\n    }\n\n    pub fn to_token(&self) -> Token {\n        match &self.token {\n            Some(token) => {\n                let to = Token::Address(H160::from_slice(&token.to_bytes().unwrap()));\n                let amount = Token::Uint(U256::from(0));\n                let data = Token::Bytes(erc20_transfer(&self.to, self.amount));\n                Token::Tuple(vec![to, amount, data])\n            }\n            None => {\n                let to = Token::Address(H160::from_slice(&self.to.to_bytes().unwrap()));\n                let amount = Token::Uint(self.amount);\n                let data = Token::Bytes(vec![]);\n                Token::Tuple(vec![to, amount, data])\n            }\n        }\n    }\n\n    pub fn from_token(token: Token) -> Result<Self, TransactionError> {\n        let call = token.into_tuple().unwrap();\n        let to = call[0].clone().into_address().unwrap();\n        let to = EthereumAddress::from_str(&hex::encode(to)).unwrap();\n        let amount = call[1].clone().clone().into_uint().unwrap();\n        let data = call[2].clone().into_bytes().unwrap();\n\n        if data.is_empty() {\n            Ok(Self {\n                token: None,\n                to,\n                amount,\n            })\n        } else {\n            let func = erc20_transfer_func();\n            let transfer = func\n                .decode_input(&data[4..])\n                .map_err(|e| TransactionError::Message(format!(\"Failed to decode data: {}\", e)))?;\n            if transfer.len() != 2 {\n                return Err(TransactionError::Message(\n                    \"Invalid ERC20 transfer data length\".to_string(),\n                ));\n            }\n            let token = Some(to);\n            let to = transfer[0].clone().into_address().unwrap();\n            let to = EthereumAddress::from_str(&hex::encode(to)).unwrap();\n            let amount = transfer[1].clone().into_uint().unwrap();\n\n            Ok(Self { token, to, amount })\n        }\n    }\n\n    pub fn to_json(&self) -> Value {\n        let to = self.to.to_string();\n        let amount = self.amount.to_string();\n\n        match &self.token {\n            Some(token) => {\n                let token = token.to_string();\n                json!({\n                    \"token\": token,\n                    \"to\": to,\n                    \"amount\": amount,\n                })\n            }\n            None => json!({\n                \"to\": to,\n                \"amount\": amount,\n            }),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use anychain_core::{hex, PublicKey, Transaction};\n    use anychain_kms::{\n        bip32::{DerivationPath, Prefix, XprvSecp256k1},\n        bip39::{Language, Mnemonic, Seed},\n        secp256k1_sign,\n    };\n    use core::str::FromStr;\n    use ethereum_types::U256;\n    use serde_json::{json, Value};\n\n    use crate::{\n        Authorization, Eip1559Transaction, Eip1559TransactionParameters, Eip7702Transaction,\n        Eip7702TransactionParameters, EthereumAddress, EthereumFormat, EthereumNetwork,\n        EthereumPublicKey, Sepolia,\n    };\n\n    pub fn _parse_mnemonic(phrase: String) -> Value {\n        if let Some(lang) = Language::from_phrase(&phrase) {\n            Mnemonic::validate(&phrase, lang).unwrap();\n            let phrase = Mnemonic::from_phrase(&phrase, lang).unwrap();\n            let seed = Seed::new(&phrase, \"\");\n            let seed = seed.as_bytes();\n            let xprv = XprvSecp256k1::new(seed).unwrap();\n            let xpub = xprv.public_key().to_string(Prefix::XPUB);\n            let xprv = xprv.to_string(Prefix::XPRV).to_string();\n            let data = json!({\n                \"xprv\": xprv,\n                \"xpub\": xpub,\n            });\n            data\n        } else {\n            Value::Null\n        }\n    }\n\n    pub fn create_sk(xprv: String, path: String) -> libsecp256k1::SecretKey {\n        let xprv = XprvSecp256k1::from_str(&xprv).unwrap();\n        let derive_path = DerivationPath::from_str(&path).unwrap();\n        let xprv = xprv.derive_from_path(&derive_path).unwrap();\n        let sk = xprv.private_key();\n        *sk\n    }\n\n    pub fn _create_address(xprv: String, path: String) -> EthereumAddress {\n        let xprv = XprvSecp256k1::from_str(&xprv).unwrap();\n        let derive_path = DerivationPath::from_str(&path).unwrap();\n        let xprv = xprv.derive_from_path(&derive_path).unwrap();\n        let xpub = xprv.public_key();\n        let pk = *xpub.public_key();\n\n        EthereumPublicKey::from_secp256k1_public_key(pk)\n            .to_address(&EthereumFormat::Standard)\n            .unwrap()\n    }\n\n    #[test]\n    fn test_tx() {\n        let xprv = \"xprv9s21ZrQH143K4AQzoQF6p3riRHUPG7VMQpYdCkcc548CYYT76Ay2nTFDXAfrMq7MT6NMePhuYP2uTGhTXjZZ1AZrGPZ4MyysX8ffTx9VwXU\".to_string();\n\n        let delegate = \"m/44/60/0/3\".to_string();\n        let sk_delegate = create_sk(xprv.clone(), delegate.clone());\n        let sk_delegate = sk_delegate.serialize().to_vec();\n\n        let chain_id = Sepolia::CHAIN_ID;\n        let nonce = U256::from(61);\n        let max_priority_fee_per_gas = U256::from(\"200000000\");\n        let max_fee_per_gas = U256::from(\"200000000\");\n        let gas_limit = U256::from(\"21000\");\n        let to = EthereumAddress::from_str(\"0x424Ef693c6F2648983aEc92f35a1143ba9Dd076C\").unwrap();\n        let amount = U256::from_dec_str(\"100000000000000000\").unwrap();\n\n        let params = Eip1559TransactionParameters {\n            chain_id,\n            nonce,\n            max_priority_fee_per_gas,\n            max_fee_per_gas,\n            gas_limit,\n            to,\n            amount,\n            data: vec![],\n            access_list: vec![],\n        };\n\n        let mut tx = Eip1559Transaction::<Sepolia>::new(&params).unwrap();\n        let msg = tx.to_transaction_id().unwrap().txid;\n        let (rs, recid) = secp256k1_sign(&sk_delegate, &msg).unwrap();\n        let tx = tx.sign(rs, recid).unwrap();\n        let tx = hex::encode(tx);\n\n        println!(\"Tx: {}\", tx);\n    }\n\n    #[test]\n    fn test_decouple() {\n        let sk = \"3d98c2d5a7f737693b470114816000645419af49bd21258cc99142f6ef5fd60a\".to_string();\n        let sk = hex::decode(sk).unwrap();\n\n        let batch = \"0x0000000000000000000000000000000000000000\";\n        let batch = EthereumAddress::from_str(batch).unwrap();\n\n        let mut auth = Authorization {\n            chain_id: Sepolia::CHAIN_ID,\n            contract: batch,\n            nonce: U256::from(66),\n            y_parity: false,\n            r: vec![],\n            s: vec![],\n        };\n\n        let digest = auth.digest();\n        let (rs, recid) = secp256k1_sign(&sk, &digest).unwrap();\n        auth.sign(rs, recid);\n\n        let params = Eip7702TransactionParameters {\n            chain_id: Sepolia::CHAIN_ID,\n            nonce: U256::from(65),\n            max_priority_fee_per_gas: U256::from_dec_str(\"1000000000\").unwrap(),\n            max_fee_per_gas: U256::from_dec_str(\"1000000000\").unwrap(),\n            gas_limit: U256::from(2100000),\n            to: EthereumAddress::from_str(\"0x7eE4c635d204eBE65fc8987CE6570CFA1651E8Af\").unwrap(),\n            amount: U256::zero(),\n            data: vec![],\n            access_list: vec![],\n            authorizations: vec![auth],\n        };\n\n        let mut tx = Eip7702Transaction::<Sepolia>::new(&params).unwrap();\n        let txid = tx.to_transaction_id().unwrap().txid;\n        let (rs, recid) = secp256k1_sign(&sk, &txid).unwrap();\n        let tx = tx.sign(rs, recid).unwrap();\n\n        let tx = hex::encode(tx);\n\n        println!(\"Tx: {}\", tx);\n    }\n}\n\n// Delegate: 0x7eE4c635d204eBE65fc8987CE6570CFA1651E8Af\n// From1: 0x424Ef693c6F2648983aEc92f35a1143ba9Dd076C\n// From2: 0x6f5ce2e6F2C8D2a6f91FbDeAc835074363c24a6E\n// To1: 0xBed74Ed65aE59eEa3339Daa215ea1d3B162F4E8B\n// To2: 0xf04e36C86e94093C2cb79FaD024962382568EFec\n// To3: 0x4a4763eFA2e89b88B3Aeef1282d150aC84188F06\n// To4: 0xE87C78EA9Faa78A6924E228eAe24b59AB53e1c9e\n"
  },
  {
    "path": "crates/anychain-ethereum/src/transaction/legacy.rs",
    "content": "use super::EthereumTransactionId;\nuse crate::util::{adapt2, pad_zeros, restore_sender, trim_leading_zeros};\nuse crate::{EthereumAddress, EthereumFormat, EthereumNetwork, EthereumPublicKey};\nuse anychain_core::{hex, utilities::crypto::keccak256, Transaction, TransactionError};\nuse core::{fmt, marker::PhantomData, str::FromStr};\nuse ethereum_types::U256;\nuse rlp::{Rlp, RlpStream};\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct EthereumTransactionParameters {\n    pub nonce: U256,\n    pub gas_price: U256,\n    pub gas_limit: U256,\n    pub to: EthereumAddress,\n    pub amount: U256,\n    pub data: Vec<u8>,\n}\n\nimpl EthereumTransactionParameters {\n    pub fn to_rlp(&self) -> Result<RlpStream, TransactionError> {\n        let to = self\n            .to\n            .to_bytes()\n            .map_err(|e| TransactionError::Message(format!(\"{}\", e)))?;\n\n        let mut rlp = RlpStream::new();\n        rlp.begin_list(9);\n\n        rlp.append(&self.nonce);\n        rlp.append(&self.gas_price);\n        rlp.append(&self.gas_limit);\n        rlp.append(&to);\n        rlp.append(&self.amount);\n        rlp.append(&self.data);\n\n        Ok(rlp)\n    }\n\n    pub fn get_data(&self) -> Vec<u8> {\n        self.data.clone()\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct EthereumTransactionSignature {\n    pub v: u32,\n    pub r: Vec<u8>,\n    pub s: Vec<u8>,\n}\n\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct EthereumTransaction<N: EthereumNetwork> {\n    /// The address of the sender\n    pub sender: Option<EthereumAddress>,\n    /// The transaction parameters (gas, gas_price, nonce, data)\n    pub params: EthereumTransactionParameters,\n    /// The transaction signature\n    pub signature: Option<EthereumTransactionSignature>,\n    _network: PhantomData<N>,\n}\n\nimpl<N: EthereumNetwork> EthereumTransaction<N> {\n    pub fn restore_sender(&mut self) -> Result<(), TransactionError> {\n        if self.signature.is_none() {\n            return Err(TransactionError::Message(\n                \"Signature is missing\".to_string(),\n            ));\n        }\n\n        let sig = self.signature.clone().unwrap();\n        self.signature = None;\n\n        let r = sig.r.clone();\n        let s = sig.s.clone();\n\n        let recid = (sig.v - 2 * N::CHAIN_ID - 35) as u8;\n\n        let _sig = [r, s].concat();\n        let msg = self.to_transaction_id()?.txid;\n\n        let sender = restore_sender(msg, _sig, recid)?;\n\n        self.sender = Some(sender);\n        self.signature = Some(sig);\n\n        Ok(())\n    }\n}\n\nimpl<N: EthereumNetwork> Transaction for EthereumTransaction<N> {\n    type Address = EthereumAddress;\n    type Format = EthereumFormat;\n    type PublicKey = EthereumPublicKey;\n    type TransactionId = EthereumTransactionId;\n    type TransactionParameters = EthereumTransactionParameters;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            sender: None,\n            params: params.clone(),\n            signature: None,\n            _network: PhantomData,\n        })\n    }\n\n    fn sign(&mut self, rs: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError> {\n        if rs.len() != 64 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signature length: {}\",\n                rs.len()\n            )));\n        }\n        let v = 2 * N::CHAIN_ID + 35 + (recid as u32);\n        let r = rs[..32].to_vec();\n        let s = rs[32..].to_vec();\n        self.signature = Some(EthereumTransactionSignature { v, r, s });\n        self.to_bytes()\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        match &self.signature {\n            Some(sig) => {\n                let mut rlp = self.params.to_rlp()?;\n                let r = trim_leading_zeros(&sig.r);\n                let s = trim_leading_zeros(&sig.s);\n                rlp.append(&sig.v);\n                rlp.append(&r);\n                rlp.append(&s);\n                Ok(rlp.out().to_vec())\n            }\n            None => {\n                let mut rlp = self.params.to_rlp()?;\n                rlp.append(&N::CHAIN_ID);\n                rlp.append(&0u8);\n                rlp.append(&0u8);\n                Ok(rlp.out().to_vec())\n            }\n        }\n    }\n\n    fn from_bytes(tx: &[u8]) -> Result<Self, TransactionError> {\n        let rlp = Rlp::new(tx);\n\n        let to = adapt2(rlp.val_at::<Vec<u8>>(3))?;\n        let to = hex::encode(to);\n\n        let nonce = adapt2(rlp.val_at::<U256>(0))?;\n        let gas_price = adapt2(rlp.val_at::<U256>(1))?;\n        let gas_limit = adapt2(rlp.val_at::<U256>(2))?;\n        let to = EthereumAddress::from_str(&to)?;\n        let amount = adapt2(rlp.val_at::<U256>(4))?;\n        let data = adapt2(rlp.val_at::<Vec<u8>>(5))?;\n\n        let v = adapt2(rlp.val_at::<u32>(6))?;\n        let mut r = adapt2(rlp.val_at::<Vec<u8>>(7))?;\n        let mut s = adapt2(rlp.val_at::<Vec<u8>>(8))?;\n\n        let params = EthereumTransactionParameters {\n            nonce,\n            gas_price,\n            gas_limit,\n            to,\n            amount,\n            data,\n        };\n\n        let mut tx = EthereumTransaction::<N>::new(&params)?;\n\n        if !r.is_empty() && !s.is_empty() {\n            pad_zeros(&mut r, 32);\n            pad_zeros(&mut s, 32);\n            let sig = EthereumTransactionSignature { v, r, s };\n            tx.signature = Some(sig);\n            tx.restore_sender()?;\n        }\n\n        Ok(tx)\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        Ok(Self::TransactionId {\n            txid: keccak256(&self.to_bytes()?).to_vec(),\n        })\n    }\n}\n\nimpl<N: EthereumNetwork> FromStr for EthereumTransaction<N> {\n    type Err = TransactionError;\n\n    fn from_str(tx: &str) -> Result<Self, Self::Err> {\n        let tx = match &tx[..2] {\n            \"0x\" => &tx[2..],\n            _ => tx,\n        };\n        Self::from_bytes(&hex::decode(tx)?)\n    }\n}\n\nimpl<N: EthereumNetwork> fmt::Display for EthereumTransaction<N> {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"0x{}\",\n            &hex::encode(match self.to_bytes() {\n                Ok(transaction) => transaction,\n                _ => return Err(fmt::Error),\n            })\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{EthereumAddress, EthereumTransaction, EthereumTransactionParameters, Sepolia};\n    use anychain_core::{hex, Transaction};\n    use core::str::FromStr;\n    use ethereum_types::U256;\n\n    #[test]\n    fn test_legacy_tx() {\n        let params = EthereumTransactionParameters {\n            nonce: U256::from_dec_str(\"6\").unwrap(),\n            gas_price: U256::from_dec_str(\"20000000000\").unwrap(),\n            gas_limit: U256::from_dec_str(\"21000\").unwrap(),\n            to: EthereumAddress::from_str(\"0xf7a63003b8ef116939804b4c2dd49290a39c4d97\").unwrap(),\n            amount: U256::from_dec_str(\"10000000000000000\").unwrap(),\n            data: vec![],\n        };\n\n        let mut tx = EthereumTransaction::<Sepolia>::new(&params).unwrap();\n        let msg = tx.to_transaction_id().unwrap().txid;\n        let msg = libsecp256k1::Message::parse_slice(&msg).unwrap();\n\n        let sk = \"08d586ed207046d6476f92fd4852be3830a9d651fc148d6fa5a6f15b77ba5df0\";\n        let sk = hex::decode(sk).unwrap();\n        let sk = libsecp256k1::SecretKey::parse_slice(&sk).unwrap();\n\n        let (sig, recid) = libsecp256k1::sign(&msg, &sk);\n\n        let sig = sig.serialize().to_vec();\n        let recid = recid.serialize();\n\n        let _ = tx.sign(sig, recid);\n\n        println!(\"{}\", tx);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/transaction/mod.rs",
    "content": "pub mod contract;\npub mod eip1559;\npub mod eip3009;\npub mod eip7702;\npub mod legacy;\n\npub use contract::*;\npub use eip1559::*;\npub use eip3009::*;\npub use eip7702::*;\npub use legacy::*;\n\nuse anychain_core::{hex, TransactionId};\nuse core::fmt;\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct EthereumTransactionId {\n    pub txid: Vec<u8>,\n}\n\nimpl TransactionId for EthereumTransactionId {}\n\nimpl fmt::Display for EthereumTransactionId {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"0x{}\", hex::encode(&self.txid))\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ethereum/src/util.rs",
    "content": "use crate::{EthereumAddress, EthereumFormat, EthereumPublicKey};\nuse anychain_core::{PublicKey, TransactionError};\nuse libsecp256k1::{recover, Error, Message, RecoveryId, Signature};\n\n/// Trim the leading zeros of a byte stream and return it\npub(crate) fn trim_leading_zeros(v: &Vec<u8>) -> &[u8] {\n    let mut cnt: usize = 0;\n    for byte in v {\n        if *byte != 0 {\n            break;\n        } else {\n            cnt += 1;\n        }\n    }\n    &v[cnt..]\n}\n\n/// Prepend a number of zeros to 'v' to make it 'to_len' bytes long\npub(crate) fn pad_zeros(v: &mut Vec<u8>, to_len: usize) {\n    if v.len() < to_len {\n        let mut temp = v.clone();\n        let len = v.len();\n        v.clear();\n        v.resize(to_len - len, 0);\n        v.append(&mut temp);\n    }\n}\n\npub(crate) fn adapt1<T>(v: Result<T, Error>) -> Result<T, TransactionError> {\n    match v {\n        Ok(t) => Ok(t),\n        Err(e) => Err(TransactionError::Message(format!(\n            \"libsecp256k1 error: {}\",\n            e\n        ))),\n    }\n}\n\npub(crate) fn adapt2<T>(v: Result<T, rlp::DecoderError>) -> Result<T, TransactionError> {\n    match v {\n        Ok(t) => Ok(t),\n        Err(e) => Err(TransactionError::Message(format!(\"rlp error:{}\", e))),\n    }\n}\n\npub(crate) fn restore_sender(\n    msg: Vec<u8>,\n    sig: Vec<u8>,\n    recid: u8,\n) -> Result<EthereumAddress, TransactionError> {\n    let recid = adapt1(RecoveryId::parse(recid))?;\n    let sig = adapt1(Signature::parse_standard_slice(&sig))?;\n    let msg = adapt1(Message::parse_slice(&msg))?;\n    let pk = adapt1(recover(&msg, &sig, &recid))?;\n    let pk = EthereumPublicKey::from_secp256k1_public_key(pk);\n    Ok(pk.to_address(&EthereumFormat::Standard)?)\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/Cargo.toml",
    "content": "[package]\nname = \"anychain-filecoin\"\ndescription = \"A Rust library for Filecoin-focused cryptocurrency wallets, enabling seamless transactions on the Filecoin blockchain\"\nversion = \"0.1.11\"\nkeywords = [\"filecoin\", \"blockchain\", \"wallet\", \"transactions\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\nserde = { workspace = true }\nserde_json = { workspace = true }\nfvm_shared = { workspace = true }\ndata-encoding = { workspace = true }\ndata-encoding-macro = { workspace = true }\nfvm_ipld_encoding = { workspace = true }\nnum-derive = { workspace = true }\nnum-traits = { workspace = true }\nthiserror = { workspace = true }\nlazy_static = { workspace = true }\nunsigned-varint = { workspace = true }\nblake2b_simd = { workspace = true }\nnum-bigint = { workspace = true }\nanyhow = { workspace = true }\nforest_encoding = { workspace = true }\ncid = { workspace = true }\nbase64 = { workspace = true }\nlibsecp256k1 = { workspace = true }\nbls-signatures = { workspace = true }\narbitrary = { workspace = true, optional = true }\n\n[features]\ndefault = [\"std\"]\nstd = [\"anychain-core/std\"]\narb = [\"dep:arbitrary\"]\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "crates/anychain-filecoin/README.md",
    "content": "# anychain-filecoin\n\nanychain-filecoin is a Rust library that provides a simple and unified interface for interacting with the Filecoin blockchain. It is designed to be easy to use, efficient, and extensible. This library is inspired by the anychain-filecoin project and follows a similar structure and design principles.\n\n## Features\n\n- Unified API for Filecoin blockchain interaction\n- Support for mainnet and testnet networks\n- Wallet management (create, import, and export)\n- Address genera[README.md](README.md)tion and validation\n- Transaction building, signing, and broadcasting\n- Querying blockchain data (blocks, transactions, balances, etc.)\n- Extensible design for future improvements and additional features\n\n## Installation\n\nAdd the following to your Cargo.toml file:\n```toml\n[dependencies]\nanychain-filecoin = \"0.1.9\"\n```\n\nThen run cargo build to download and compile the library.\n\n## Usage\n\nHere's a simple example of how to use the library:\n```rust\n```\n\nFor more examples and detailed usage instructions, please refer to the [documentation](https://docs.rs/anychain-filecoin).\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute, please follow these steps:\n\n1. Fork the repository\n2. Create a new branch for your changes\n3. Make your changes and commit them to your branch\n4. Create a pull request and describe your changes\n\nPlease make sure to follow the Rust coding guidelines and add tests for any new features or bug fixes.\n\n## License\n\nanychain-filecoin is released under the MIT License. See the [LICENSE](LICENSE) file for more information. "
  },
  {
    "path": "crates/anychain-filecoin/src/address.rs",
    "content": "#![allow(non_local_definitions)]\nuse crate::format::FilecoinFormat;\nuse crate::public_key::FilecoinPublicKey;\n\nuse std::borrow::Cow;\nuse std::default::Default;\nuse std::fmt;\nuse std::hash::Hash;\nuse std::str::FromStr;\n\nuse crate::utilities::crypto::{blake2b_160, blake2b_checksum};\nuse anychain_core::PublicKey;\nuse anychain_core::{Address, AddressError};\nuse bls_signatures::Serialize as BlsSerialize;\n\nuse data_encoding::DecodeError;\nuse data_encoding::Encoding;\nuse data_encoding_macro::new_encoding;\nuse fvm_ipld_encoding::serde_bytes;\nuse num_derive::FromPrimitive;\nuse num_traits::FromPrimitive;\nuse serde::{de, Deserialize, Deserializer, Serialize, Serializer};\nuse thiserror::Error;\n\n/// Represents a filecoin address\n#[derive(PartialEq, Eq, Clone, Debug, Hash, Copy, Default)]\n#[cfg_attr(feature = \"arb\", derive(arbitrary::Arbitrary))]\npub struct FilecoinAddress {\n    network: Network,\n    payload: Payload,\n}\n\nimpl Address for FilecoinAddress {\n    type SecretKey = super::public_key::FilecoinSecretKey;\n    type Format = FilecoinFormat;\n    type PublicKey = FilecoinPublicKey;\n\n    /// Returns the address corresponding to the given private key.\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        _format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        Self::from_public_key(&FilecoinPublicKey::from_secret_key(secret_key), _format)\n    }\n\n    /// Returns the address corresponding to the given public key.\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        _: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        match public_key {\n            FilecoinPublicKey::Secp256k1(key) => {\n                Ok(FilecoinAddress::new_secp256k1(&key.serialize()).unwrap())\n            }\n            FilecoinPublicKey::Bls(key) => Ok(FilecoinAddress::new_bls(&key.as_bytes()).unwrap()),\n        }\n    }\n}\n\n// impl Cbor for FilecoinAddress {}\n\nimpl FilecoinAddress {\n    /// Address constructor\n    fn new(network: Network, protocol: Protocol, bz: &[u8]) -> Result<Self, Error> {\n        Ok(Self {\n            network,\n            payload: Payload::new(protocol, bz)?,\n        })\n    }\n\n    /// Creates address from encoded bytes\n    pub fn from_bytes(bz: &[u8]) -> Result<Self, Error> {\n        if bz.len() < 2 {\n            Err(Error::InvalidLength)\n        } else {\n            let protocol = Protocol::from_byte(bz[0]).ok_or(Error::UnknownProtocol)?;\n            Self::new(NETWORK_DEFAULT, protocol, &bz[1..])\n        }\n    }\n\n    /// Generates new address using ID protocol\n    pub const fn new_id(id: u64) -> Self {\n        Self {\n            network: NETWORK_DEFAULT,\n            payload: Payload::ID(id),\n        }\n    }\n\n    /// Generates new address using Secp256k1 pubkey\n    pub fn new_secp256k1(pubkey: &[u8]) -> Result<Self, Error> {\n        if pubkey.len() != 65 {\n            return Err(Error::InvalidSECPLength(pubkey.len()));\n        }\n        Ok(Self {\n            network: NETWORK_DEFAULT,\n            payload: Payload::Secp256k1(blake2b_160(pubkey)),\n        })\n    }\n\n    pub fn new_secp256k1_v2(\n        network: Network,\n        pubkey: libsecp256k1::PublicKey,\n    ) -> Result<Self, Error> {\n        Ok(Self {\n            network,\n            payload: Payload::Secp256k1(blake2b_160(&pubkey.serialize())),\n        })\n    }\n\n    /// Generates new address using the Actor protocol\n    pub fn new_actor(data: &[u8]) -> Self {\n        Self {\n            network: NETWORK_DEFAULT,\n            payload: Payload::Actor(blake2b_160(data)),\n        }\n    }\n\n    /// Generates new address using BLS pubkey\n    pub fn new_bls(pubkey: &[u8]) -> Result<Self, Error> {\n        if pubkey.len() != BLS_PUB_LEN {\n            return Err(Error::InvalidBLSLength(pubkey.len()));\n        }\n        let mut key = [0u8; BLS_PUB_LEN];\n        key.copy_from_slice(pubkey);\n        Ok(Self {\n            network: NETWORK_DEFAULT,\n            payload: Payload::BLS(key),\n        })\n    }\n\n    pub fn is_bls_zero_address(&self) -> bool {\n        match self.payload {\n            Payload::BLS(payload_bytes) => payload_bytes == *BLS_ZERO_ADDR_BYTES,\n            _ => false,\n        }\n    }\n\n    /// Returns protocol for Address\n    pub fn protocol(&self) -> Protocol {\n        Protocol::from(self.payload)\n    }\n\n    /// Returns the `Payload` object from the address, where the respective protocol data is kept\n    /// in an enum separated by protocol\n    pub fn payload(&self) -> &Payload {\n        &self.payload\n    }\n\n    /// Converts Address into `Payload` object, where the respective protocol data is kept\n    /// in an enum separated by protocol\n    pub fn into_payload(self) -> Payload {\n        self.payload\n    }\n\n    /// Returns the raw bytes data payload of the Address\n    pub fn payload_bytes(&self) -> Vec<u8> {\n        self.payload.to_raw_bytes()\n    }\n\n    /// Returns network configuration of Address\n    pub fn network(&self) -> Network {\n        self.network\n    }\n\n    /// Sets the network for the address and returns a mutable reference to it\n    pub fn set_network(&mut self, network: Network) -> &mut Self {\n        self.network = network;\n        self\n    }\n\n    /// Returns encoded bytes of Address\n    pub fn to_bytes(self) -> Vec<u8> {\n        self.payload.to_bytes()\n    }\n\n    /// Get ID of the address. ID protocol only.\n    pub fn id(&self) -> Result<u64, Error> {\n        match self.payload {\n            Payload::ID(id) => Ok(id),\n            _ => Err(Error::NonIDAddress),\n        }\n    }\n}\n\nimpl fmt::Display for FilecoinAddress {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", encode(self))\n    }\n}\n\nimpl FromStr for FilecoinAddress {\n    type Err = Error;\n    fn from_str(addr: &str) -> Result<Self, Error> {\n        if addr.len() > MAX_ADDRESS_LEN || addr.len() < 3 {\n            return Err(Error::InvalidLength);\n        }\n        // ensure the network character is valid before converting\n        let network: Network = match addr.get(0..1).ok_or(Error::UnknownNetwork)? {\n            TESTNET_PREFIX => Network::Testnet,\n            MAINNET_PREFIX => Network::Mainnet,\n            _ => {\n                return Err(Error::UnknownNetwork);\n            }\n        };\n\n        // get protocol from second character\n        let protocol: Protocol = match addr.get(1..2).ok_or(Error::UnknownProtocol)? {\n            \"0\" => Protocol::ID,\n            \"1\" => Protocol::Secp256k1,\n            \"2\" => Protocol::Actor,\n            \"3\" => Protocol::BLS,\n            _ => {\n                return Err(Error::UnknownProtocol);\n            }\n        };\n\n        // bytes after the protocol character is the data payload of the address\n        let raw = addr.get(2..).ok_or(Error::InvalidPayload)?;\n        if protocol == Protocol::ID {\n            if raw.len() > 20 {\n                // 20 is max u64 as string\n                return Err(Error::InvalidLength);\n            }\n            let id = raw.parse::<u64>().unwrap();\n            return Ok(FilecoinAddress {\n                network,\n                payload: Payload::ID(id),\n            });\n        }\n\n        // decode using byte32 encoding\n        let mut payload = ADDRESS_ENCODER.decode(raw.as_bytes())?;\n        // payload includes checksum at end, so split after decoding\n        let cksm = payload.split_off(payload.len() - CHECKSUM_HASH_LEN);\n\n        // sanity check to make sure address hash values are correct length\n        if (protocol == Protocol::Secp256k1 || protocol == Protocol::Actor)\n            && payload.len() != PAYLOAD_HASH_LEN\n        {\n            return Err(Error::InvalidPayload);\n        }\n\n        // sanity check to make sure bls pub key is correct length\n        if protocol == Protocol::BLS && payload.len() != BLS_PUB_LEN {\n            return Err(Error::InvalidPayload);\n        }\n\n        // validate checksum\n        let mut ingest = payload.clone();\n        ingest.insert(0, protocol as u8);\n        if !validate_checksum(&ingest, cksm) {\n            return Err(Error::InvalidChecksum);\n        }\n\n        FilecoinAddress::new(network, protocol, &payload)\n    }\n}\n\nimpl Serialize for FilecoinAddress {\n    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let address_bytes = self.to_bytes();\n        serde_bytes::Serialize::serialize(&address_bytes, s)\n    }\n}\n\nimpl<'de> Deserialize<'de> for FilecoinAddress {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let bz: Cow<'de, [u8]> = serde_bytes::Deserialize::deserialize(deserializer)?;\n\n        // Create and return created address of unmarshalled bytes\n        FilecoinAddress::from_bytes(&bz).map_err(de::Error::custom)\n    }\n}\n\n/// encode converts the address into a string\nfn encode(addr: &FilecoinAddress) -> String {\n    match addr.protocol() {\n        Protocol::Secp256k1 | Protocol::Actor | Protocol::BLS => {\n            let ingest = addr.to_bytes();\n            let mut bz = addr.payload_bytes();\n\n            // payload bytes followed by calculated checksum\n            bz.extend(blake2b_checksum(&ingest));\n            format!(\n                \"{}{}{}\",\n                addr.network.to_prefix(),\n                addr.protocol(),\n                ADDRESS_ENCODER.encode(bz.as_mut()),\n            )\n        }\n        Protocol::ID => format!(\n            \"{}{}{}\",\n            addr.network.to_prefix(),\n            addr.protocol(),\n            from_leb_bytes(&addr.payload_bytes()).expect(\"should read encoded bytes\"),\n        ),\n    }\n}\n\npub(crate) fn to_leb_bytes(id: u64) -> Result<Vec<u8>, Error> {\n    // write id to buffer in leb128 format\n    Ok(unsigned_varint::encode::u64(id, &mut unsigned_varint::encode::u64_buffer()).into())\n}\n\npub(crate) fn from_leb_bytes(bz: &[u8]) -> Result<u64, Error> {\n    // write id to buffer in leb128 format\n    let (id, remaining) = unsigned_varint::decode::u64(bz).unwrap();\n    if !remaining.is_empty() {\n        return Err(Error::InvalidPayload);\n    }\n    Ok(id)\n}\n\n/// Validates the checksum against the ingest data\npub fn validate_checksum(ingest: &[u8], expect: Vec<u8>) -> bool {\n    let digest = blake2b_checksum(ingest);\n    digest == expect\n}\n\n/// Protocol defines the addressing protocol used to derive data to an address\n#[derive(PartialEq, Eq, Copy, Clone, FromPrimitive, Debug, Hash)]\n#[repr(u8)]\npub enum Protocol {\n    /// ID protocol addressing\n    ID = 0,\n    /// SECP256K1 key addressing\n    Secp256k1 = 1,\n    /// Actor protocol addressing\n    Actor = 2,\n    /// BLS key addressing\n    BLS = 3,\n}\n\nimpl Protocol {\n    /// from_byte allows referencing back to Protocol from encoded byte\n    pub(super) fn from_byte(b: u8) -> Option<Protocol> {\n        FromPrimitive::from_u8(b)\n    }\n}\n\n/// allows conversion of Protocol value to string\nimpl fmt::Display for Protocol {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        let i = *self as u8;\n        write!(f, \"{}\", i)\n    }\n}\n\n/// Payload is the data of the Address. Variants are the supported Address protocols.\n#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]\n#[cfg_attr(feature = \"arb\", derive(arbitrary::Arbitrary))]\npub enum Payload {\n    /// ID protocol address.\n    ID(u64),\n    /// SECP256K1 key address, 20 byte hash of PublicKey\n    Secp256k1([u8; PAYLOAD_HASH_LEN]),\n    /// Actor protocol address, 20 byte hash of actor data\n    Actor([u8; PAYLOAD_HASH_LEN]),\n    /// BLS key address, full 48 byte public key\n    BLS([u8; BLS_PUB_LEN]),\n}\n\nimpl Default for Payload {\n    fn default() -> Self {\n        Payload::Secp256k1([0; PAYLOAD_HASH_LEN])\n    }\n}\n\nimpl Payload {\n    /// Returns encoded bytes of Address without the protocol byte.\n    pub fn to_raw_bytes(self) -> Vec<u8> {\n        use Payload::*;\n        match self {\n            ID(i) => to_leb_bytes(i).unwrap(),\n            Secp256k1(arr) => arr.to_vec(),\n            Actor(arr) => arr.to_vec(),\n            BLS(arr) => arr.to_vec(),\n        }\n    }\n\n    /// Returns encoded bytes of Address including the protocol byte.\n    pub fn to_bytes(self) -> Vec<u8> {\n        use Payload::*;\n        let mut bz = match self {\n            ID(i) => to_leb_bytes(i).unwrap(),\n            Secp256k1(arr) => arr.to_vec(),\n            Actor(arr) => arr.to_vec(),\n            BLS(arr) => arr.to_vec(),\n        };\n\n        bz.insert(0, Protocol::from(self) as u8);\n        bz\n    }\n\n    /// Generates payload from raw bytes and protocol.\n    pub fn new(protocol: Protocol, payload: &[u8]) -> Result<Self, Error> {\n        let payload = match protocol {\n            Protocol::ID => Self::ID(from_leb_bytes(payload)?),\n            Protocol::Secp256k1 => Self::Secp256k1(\n                payload\n                    .try_into()\n                    .map_err(|_| Error::InvalidPayloadLength(payload.len()))?,\n            ),\n            Protocol::Actor => Self::Actor(\n                payload\n                    .try_into()\n                    .map_err(|_| Error::InvalidPayloadLength(payload.len()))?,\n            ),\n            Protocol::BLS => Self::BLS(\n                payload\n                    .try_into()\n                    .map_err(|_| Error::InvalidPayloadLength(payload.len()))?,\n            ),\n        };\n        Ok(payload)\n    }\n}\n\nimpl From<Payload> for Protocol {\n    fn from(pl: Payload) -> Self {\n        match pl {\n            Payload::ID(_) => Self::ID,\n            Payload::Secp256k1(_) => Self::Secp256k1,\n            Payload::Actor(_) => Self::Actor,\n            Payload::BLS(_) => Self::BLS,\n        }\n    }\n}\n\nimpl From<&Payload> for Protocol {\n    fn from(pl: &Payload) -> Self {\n        match pl {\n            Payload::ID(_) => Self::ID,\n            Payload::Secp256k1(_) => Self::Secp256k1,\n            Payload::Actor(_) => Self::Actor,\n            Payload::BLS(_) => Self::BLS,\n        }\n    }\n}\n\n/// Address error\n#[derive(Debug, PartialEq, Error)]\npub enum Error {\n    #[error(\"Unknown address network\")]\n    UnknownNetwork,\n    #[error(\"Unknown address protocol\")]\n    UnknownProtocol,\n    #[error(\"Invalid address payload\")]\n    InvalidPayload,\n    #[error(\"Invalid address length\")]\n    InvalidLength,\n    #[error(\"Invalid payload length, wanted: {} got: {0}\", PAYLOAD_HASH_LEN)]\n    InvalidPayloadLength(usize),\n    #[error(\"Invalid BLS pub key length, wanted: {} got: {0}\", BLS_PUB_LEN)]\n    InvalidBLSLength(usize),\n    #[error(\"Invalid SECP pub key length, wanted: {} got: {0}\", SECP_PUB_LEN)]\n    InvalidSECPLength(usize),\n    #[error(\"Invalid address checksum\")]\n    InvalidChecksum,\n    #[error(\"Decoding for address failed: {0}\")]\n    Base32Decoding(#[from] DecodeError),\n    #[error(\"Cannot get id from non id address\")]\n    NonIDAddress,\n}\n\n/// Network defines the preconfigured networks to use with address encoding\n#[derive(PartialEq, Eq, Copy, Clone, Debug, Default, Hash)]\n#[cfg_attr(feature = \"arb\", derive(arbitrary::Arbitrary))]\npub enum Network {\n    #[default]\n    Mainnet = 0,\n    Testnet = 1,\n}\n\nimpl Network {\n    /// to_prefix is used to convert the network into a string\n    /// used when converting address to string\n    pub(super) fn to_prefix(self) -> &'static str {\n        match self {\n            Network::Mainnet => MAINNET_PREFIX,\n            Network::Testnet => TESTNET_PREFIX,\n        }\n    }\n}\n\n/// defines the encoder for base32 encoding with the provided string with no padding\npub const ADDRESS_ENCODER: Encoding = new_encoding! {\n    symbols: \"abcdefghijklmnopqrstuvwxyz234567\",\n    padding: None,\n};\n\n/// Hash length of payload for Secp and Actor addresses.\npub const PAYLOAD_HASH_LEN: usize = 20;\n\n/// Uncompressed secp public key used for validation of Secp addresses.\npub const SECP_PUB_LEN: usize = 65;\n\n/// BLS public key length used for validation of BLS addresses.\npub const BLS_PUB_LEN: usize = 48;\n\nlazy_static::lazy_static! {\n    static ref BLS_ZERO_ADDR_BYTES: [u8; BLS_PUB_LEN] = {\n        let bz_addr = FilecoinAddress::from_str(\"f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a\");\n        if let Ok(FilecoinAddress {payload: Payload::BLS(pubkey), ..}) = bz_addr {\n            pubkey\n        } else {\n            panic!(\"failed to parse BLS address from provided BLS_ZERO_ADDR string\")\n        }\n    };\n}\n\n/// Length of the checksum hash for string encodings.\npub const CHECKSUM_HASH_LEN: usize = 4;\n\nconst MAX_ADDRESS_LEN: usize = 84 + 2;\nconst MAINNET_PREFIX: &str = \"f\";\nconst TESTNET_PREFIX: &str = \"t\";\n\n// TODO pull network from config (probably)\n// TODO: can we do this using build flags?\npub const NETWORK_DEFAULT: Network = Network::Testnet;\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[test]\n    fn base32_to_internal_address() {\n        let addr = FilecoinAddress::from_str(\"f2qexjxohk7c7j6r2tud6kgab6yd62fhdszjukcra\").unwrap();\n        assert_eq!(\n            \"f2qexjxohk7c7j6r2tud6kgab6yd62fhdszjukcra\",\n            addr.to_string()\n        );\n    }\n\n    #[test]\n    fn test_mainnet_address() {\n        let secret_bytes = [1u8; 32];\n        let secret_key = libsecp256k1::SecretKey::parse_slice(&secret_bytes).unwrap();\n        let public_key = libsecp256k1::PublicKey::from_secret_key(&secret_key);\n\n        let addr = FilecoinAddress::new_secp256k1_v2(Network::Mainnet, public_key).unwrap();\n        let addr_str = addr.to_string();\n\n        assert!(addr_str.starts_with(MAINNET_PREFIX));\n        assert!(addr_str.starts_with(\"f1\"));\n        assert_eq!(addr.network(), Network::Mainnet);\n        assert_eq!(\"f1ksu3ktw4xhyaoltwr546b3epfs5wxxqfyyxipwi\", addr_str);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/src/amount.rs",
    "content": "use anychain_core::to_basic_unit as to_atto_fil;\n\nuse core::fmt;\nuse num_bigint::BigInt;\n\n/// Represents the amount of filecoin in attoFIL\npub type FilecoinAmount = BigInt;\n\npub enum Denomination {\n    AttoFIL,\n    FemtoFIL,\n    PicoFIL,\n    NanoFIL,\n    MicroFIL,\n    MilliFIL,\n    FIL,\n}\n\nimpl Denomination {\n    fn precision(self) -> u32 {\n        match self {\n            Denomination::AttoFIL => 0,\n            Denomination::FemtoFIL => 3,\n            Denomination::PicoFIL => 6,\n            Denomination::NanoFIL => 9,\n            Denomination::MicroFIL => 12,\n            Denomination::MilliFIL => 15,\n            Denomination::FIL => 18,\n        }\n    }\n}\n\nimpl fmt::Display for Denomination {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            match self {\n                Denomination::AttoFIL => \"attoFIL\",\n                Denomination::FemtoFIL => \"femtoFIL\",\n                Denomination::PicoFIL => \"picoFIL\",\n                Denomination::NanoFIL => \"nanoFIL\",\n                Denomination::MicroFIL => \"microFIL\",\n                Denomination::MilliFIL => \"milliFIL\",\n                Denomination::FIL => \"FIL\",\n            }\n        )\n    }\n}\n\npub trait FilecoinAmountConverter {\n    fn from_decimal_str(val: &str) -> Self;\n\n    fn from_atto_fil(atto_fil_value: &str) -> Self;\n\n    fn from_femto_fil(femto_fil_value: &str) -> Self;\n\n    fn from_pico_fil(pico_fil_value: &str) -> Self;\n\n    fn from_nano_fil(nano_fil_value: &str) -> Self;\n\n    fn from_micro_fil(micro_fil_value: &str) -> Self;\n\n    fn from_milli_fil(milli_fil_value: &str) -> Self;\n\n    fn from_fil(fil_value: &str) -> Self;\n\n    fn add(self, b: Self) -> Self;\n\n    fn sub(self, b: Self) -> Self;\n}\n\nimpl FilecoinAmountConverter for FilecoinAmount {\n    fn from_decimal_str(val: &str) -> Self {\n        FilecoinAmount::parse_bytes(val.as_bytes(), 10).unwrap()\n    }\n\n    fn from_atto_fil(atto_fil_value: &str) -> Self {\n        FilecoinAmount::from_decimal_str(atto_fil_value)\n    }\n\n    fn from_femto_fil(femto_fil_value: &str) -> Self {\n        let atto_fil_value = to_atto_fil(femto_fil_value, Denomination::FemtoFIL.precision());\n        FilecoinAmount::from_decimal_str(&atto_fil_value)\n    }\n\n    fn from_pico_fil(pico_fil_value: &str) -> Self {\n        let atto_fil_value = to_atto_fil(pico_fil_value, Denomination::PicoFIL.precision());\n        FilecoinAmount::from_decimal_str(&atto_fil_value)\n    }\n\n    fn from_nano_fil(nano_fil_value: &str) -> Self {\n        let atto_fil_value = to_atto_fil(nano_fil_value, Denomination::NanoFIL.precision());\n        FilecoinAmount::from_decimal_str(&atto_fil_value)\n    }\n\n    fn from_micro_fil(micro_fil_value: &str) -> Self {\n        let atto_fil_value = to_atto_fil(micro_fil_value, Denomination::MilliFIL.precision());\n        FilecoinAmount::from_decimal_str(&atto_fil_value)\n    }\n\n    fn from_milli_fil(milli_fil_value: &str) -> Self {\n        let atto_fil_value = to_atto_fil(milli_fil_value, Denomination::MilliFIL.precision());\n        FilecoinAmount::from_decimal_str(&atto_fil_value)\n    }\n\n    fn from_fil(fil_value: &str) -> Self {\n        let atto_fil_value = to_atto_fil(fil_value, Denomination::FIL.precision());\n        FilecoinAmount::from_decimal_str(&atto_fil_value)\n    }\n\n    fn add(self, b: Self) -> Self {\n        &self + &b\n    }\n\n    fn sub(self, b: Self) -> Self {\n        &self + &b\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[test]\n    fn f() {\n        let atto_fil = FilecoinAmount::from_fil(\"0.0001\");\n        assert_eq!(\"100000000000000\", atto_fil.to_string());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/src/format.rs",
    "content": "use anychain_core::Format;\n\nuse core::fmt;\nuse serde::Serialize;\n\n/// Represents the format of a Filecoin address\n#[derive(Serialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum FilecoinFormat {\n    Base32,\n}\n\nimpl Format for FilecoinFormat {}\n\nimpl fmt::Display for FilecoinFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"Base32\")\n    }\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/src/lib.rs",
    "content": "pub mod address;\npub use self::address::*;\n\npub mod amount;\npub use self::amount::*;\n\npub mod format;\npub use self::format::*;\n\npub mod public_key;\npub use self::public_key::*;\n\npub mod transaction;\nmod utilities;\n\npub use self::transaction::*;\n"
  },
  {
    "path": "crates/anychain-filecoin/src/public_key.rs",
    "content": "use crate::address::FilecoinAddress;\nuse crate::format::FilecoinFormat;\nuse anychain_core::{hex, Address, AddressError, PublicKey, PublicKeyError};\nuse bls_signatures::{self, Serialize};\nuse core::panic;\nuse core::{fmt, fmt::Display, str::FromStr};\n\n/// Represents a filecoin secret key\n#[derive(Debug, Clone, PartialEq)]\npub enum FilecoinSecretKey {\n    Secp256k1(libsecp256k1::SecretKey),\n    Bls(bls_signatures::PrivateKey),\n}\n\n/// Represents a filecoin public key\n#[derive(Debug, Clone, PartialEq)]\npub enum FilecoinPublicKey {\n    Secp256k1(libsecp256k1::PublicKey),\n    Bls(bls_signatures::PublicKey),\n}\n\nimpl PublicKey for FilecoinPublicKey {\n    type SecretKey = FilecoinSecretKey;\n    type Address = FilecoinAddress;\n    type Format = FilecoinFormat;\n\n    /// Returns the filecoin public key corresponding to the given secp256k1 secret key.\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        match secret_key {\n            FilecoinSecretKey::Secp256k1(key) => {\n                Self::Secp256k1(libsecp256k1::PublicKey::from_secret_key(key))\n            }\n            FilecoinSecretKey::Bls(key) => Self::Bls(key.public_key()),\n        }\n    }\n\n    /// Returns the address of the corresponding filecoin public key.\n    fn to_address(&self, _format: &Self::Format) -> Result<Self::Address, AddressError> {\n        Self::Address::from_public_key(self, _format)\n    }\n}\n\nimpl FilecoinPublicKey {\n    /// Returns a filecoin public key given an secp256k1 public key.\n    pub fn from_secp256k1_public_key(public_key: libsecp256k1::PublicKey) -> Self {\n        Self::Secp256k1(public_key)\n    }\n\n    /// Returns the secp256k1 public key of this filecoin public key\n    pub fn to_secp256k1_public_key(&self) -> libsecp256k1::PublicKey {\n        match self {\n            Self::Secp256k1(key) => *key,\n            _ => panic!(\"not an secp256k1 public key\"),\n        }\n    }\n\n    /// Returns a filecoin public key given a bls public key\n    pub fn from_bls_public_key(public_key: bls_signatures::PublicKey) -> Self {\n        Self::Bls(public_key)\n    }\n\n    /// Returns the bls public key of this filecoin public key\n    pub fn to_bls_public_key(&self) -> bls_signatures::PublicKey {\n        match self {\n            Self::Bls(key) => *key,\n            _ => panic!(\"not a bls public key\"),\n        }\n    }\n}\n\nimpl FromStr for FilecoinPublicKey {\n    type Err = PublicKeyError;\n\n    fn from_str(public_key: &str) -> Result<Self, Self::Err> {\n        let mut s = public_key.to_string();\n        let mut is_bls = false;\n        if s.starts_with(\"secp256k1_pub_\") {\n            s = s[14..].to_string();\n        } else if s.starts_with(\"bls_pub_\") {\n            s = s[8..].to_string();\n            is_bls = true;\n        } else {\n            return Err(PublicKeyError::InvalidPrefix(\"\".to_string()));\n        }\n\n        let stream = hex::decode(&s)?;\n        match is_bls {\n            true => {\n                let key = bls_signatures::PublicKey::from_bytes(&stream)\n                    .map_err(|e| PublicKeyError::Crate(\"bls_signatures\", format!(\"{:?}\", e)))?;\n                Ok(Self::Bls(key))\n            }\n            false => {\n                let key = libsecp256k1::PublicKey::parse_slice(&stream, None).map_err(|error| {\n                    PublicKeyError::Crate(\"libsecp256k1\", format!(\"{:?}\", error))\n                })?;\n                Ok(Self::Secp256k1(key))\n            }\n        }\n    }\n}\n\nimpl Display for FilecoinPublicKey {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        match self {\n            Self::Secp256k1(key) => {\n                let mut s = \"secp256k1_pub_\".to_string();\n                s.push_str(&hex::encode(key.serialize()));\n                write!(f, \"{}\", s)\n            }\n            Self::Bls(key) => {\n                let mut s = \"bls_pub_\".to_string();\n                s.push_str(&hex::encode(key.as_bytes()));\n                write!(f, \"{}\", s)\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[test]\n    fn test_public_key_from_str() {\n        let invalid_bls = \"bls_pub_deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\";\n        let _key = FilecoinPublicKey::from_str(invalid_bls);\n        // Crate(\"bls_signatures\",\"GroupDecode\")\n        assert!(matches!(_key, Err(PublicKeyError::Crate(_, _))));\n    }\n\n    #[test]\n    fn test_public_key_secp256k1() {\n        let secret_bytes = [1u8; 32];\n        let secp_secret = libsecp256k1::SecretKey::parse_slice(&secret_bytes).unwrap();\n        let secret = FilecoinSecretKey::Secp256k1(secp_secret);\n\n        let public_key = FilecoinPublicKey::from_secret_key(&secret);\n        assert!(matches!(public_key, FilecoinPublicKey::Secp256k1(_)));\n\n        let encoded = public_key.to_string();\n        assert!(encoded.starts_with(\"secp256k1_pub_\"));\n        assert_eq!(\"secp256k1_pub_041b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f70beaf8f588b541507fed6a642c5ab42dfdf8120a7f639de5122d47a69a8e8d1\", encoded);\n\n        let parsed = FilecoinPublicKey::from_str(&encoded).unwrap();\n        assert_eq!(parsed, public_key);\n\n        let address = public_key.to_address(&FilecoinFormat::Base32).unwrap();\n        assert!(address.to_string().starts_with(\"t1\"));\n        assert_eq!(\n            \"t1ksu3ktw4xhyaoltwr546b3epfs5wxxqfyyxipwi\",\n            address.to_string()\n        );\n    }\n\n    #[test]\n    fn test_public_key_bls() {\n        let secret_bytes = [7u8; 32];\n        let bls_secret = bls_signatures::PrivateKey::from_bytes(&secret_bytes).unwrap();\n        let secret = FilecoinSecretKey::Bls(bls_secret);\n\n        let public_key = FilecoinPublicKey::from_secret_key(&secret);\n        assert!(matches!(public_key, FilecoinPublicKey::Bls(_)));\n\n        let encoded = public_key.to_string();\n        assert!(encoded.starts_with(\"bls_pub_\"));\n        assert_eq!(\"bls_pub_a4cafe0e4602bb74340d45b931591034894f6be4aae24c4e80931d622636bb4da64804903072c655995b423113f41705\", encoded);\n\n        let parsed = FilecoinPublicKey::from_str(&encoded).unwrap();\n        assert_eq!(parsed, public_key);\n\n        let address = public_key.to_address(&FilecoinFormat::Base32).unwrap();\n        assert!(address.to_string().starts_with(\"t3\"));\n        assert_eq!(\"t3utfp4dsgak5xinaniw4tcwiqgseu627evlreytuasmowejrwxng2msaesayhfrsvtfnuemit6qlqku4rk5ba\", address.to_string());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/src/transaction.rs",
    "content": "#![allow(non_local_definitions)]\nuse crate::address::ADDRESS_ENCODER as BASE32_ENCODER;\nuse crate::address::{FilecoinAddress, Protocol};\nuse crate::amount::FilecoinAmount;\nuse crate::format::FilecoinFormat;\nuse crate::public_key::FilecoinPublicKey;\nuse crate::utilities::crypto::blake2b_256;\nuse anychain_core::{Transaction, TransactionError, TransactionId};\nuse cid::Cid;\n\nuse anyhow::anyhow;\nuse fvm_ipld_encoding::de::{Deserialize, Deserializer};\nuse fvm_ipld_encoding::ser::{Serialize, Serializer};\npub use fvm_ipld_encoding::RawBytes;\nuse fvm_ipld_encoding::{de, ser, serde_bytes};\n\nuse forest_encoding::tuple::*;\nuse fvm_ipld_encoding::repr::*;\nuse fvm_shared::bigint::bigint_ser::{BigIntDe, BigIntSer};\nuse fvm_shared::MethodNum;\nuse num_derive::FromPrimitive;\n\nuse core::panic;\nuse std::borrow::Cow;\nuse std::fmt::{self, Display};\nuse std::str::FromStr;\n\nuse self::json::FilecoinTransactionJson;\n\nconst DAG_CBOR_CODEC: u64 = 0x71;\nconst BLAKE2B_256_MULTIHASH_CODE: u64 = 0xb220;\n\nfn cid_from_cbor<T: ser::Serialize>(value: &T) -> anyhow::Result<Cid> {\n    let data = fvm_ipld_encoding::to_vec(value)?;\n    let digest = blake2b_256(&data);\n    let hash = cid::multihash::Multihash::<64>::wrap(BLAKE2B_256_MULTIHASH_CODE, &digest)\n        .map_err(|e| anyhow!(\"failed to build multihash: {e}\"))?;\n    Ok(Cid::new_v1(DAG_CBOR_CODEC, hash))\n}\n\n/// Represents the parameters for a filecoin transaction\n#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]\npub struct FilecoinTransactionParameters {\n    pub version: i64,\n    pub from: FilecoinAddress,\n    pub to: FilecoinAddress,\n    pub sequence: u64,\n    pub value: FilecoinAmount,\n    pub method_num: MethodNum,\n    pub params: RawBytes,\n    pub gas_limit: i64,\n    pub gas_fee_cap: FilecoinAmount,\n    pub gas_premium: FilecoinAmount,\n}\n\n// impl Cbor for FilecoinTransactionParameters {}\n\nimpl FilecoinTransactionParameters {\n    pub fn cid(&self) -> anyhow::Result<Cid> {\n        cid_from_cbor(self)\n    }\n\n    /// Helper function to convert the message into signing bytes.\n    /// This function returns the message `Cid` bytes.\n    pub fn to_bytes(&self) -> Vec<u8> {\n        // Safe to unwrap here, unsigned message cannot fail to serialize.\n        self.cid().unwrap().to_bytes()\n    }\n\n    /// Does some basic checks on the Message to see if the fields are valid.\n    pub fn check(self: &FilecoinTransactionParameters) -> anyhow::Result<()> {\n        if self.gas_limit == 0 {\n            return Err(anyhow!(\"Message has no gas limit set\"));\n        }\n        if self.gas_limit < 0 {\n            return Err(anyhow!(\"Message has negative gas limit\"));\n        }\n        Ok(())\n    }\n}\n\nimpl Serialize for FilecoinTransactionParameters {\n    fn serialize<S>(&self, s: S) -> std::result::Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        (\n            &self.version,\n            &self.to,\n            &self.from,\n            &self.sequence,\n            BigIntSer(&self.value),\n            &self.gas_limit,\n            BigIntSer(&self.gas_fee_cap),\n            BigIntSer(&self.gas_premium),\n            &self.method_num,\n            &self.params,\n        )\n            .serialize(s)\n    }\n}\n\nimpl<'de> Deserialize<'de> for FilecoinTransactionParameters {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let (\n            version,\n            to,\n            from,\n            sequence,\n            BigIntDe(value),\n            gas_limit,\n            BigIntDe(gas_fee_cap),\n            BigIntDe(gas_premium),\n            method_num,\n            params,\n        ) = Deserialize::deserialize(deserializer)?;\n        Ok(Self {\n            version,\n            from,\n            to,\n            sequence,\n            value,\n            method_num,\n            params,\n            gas_limit,\n            gas_fee_cap,\n            gas_premium,\n        })\n    }\n}\n\n/// Signature variants for Filecoin signatures.\n#[allow(non_local_definitions)]\n#[derive(\n    Clone,\n    Debug,\n    PartialEq,\n    FromPrimitive,\n    Copy,\n    Eq,\n    Serialize_repr,\n    Deserialize_repr,\n    Hash,\n    Default,\n)]\n#[repr(u8)]\npub enum FilecoinSignatureType {\n    #[default]\n    Secp256k1 = 1,\n    BLS = 2,\n}\n\n/// A cryptographic signature, represented in bytes, of any key protocol.\n#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]\npub struct FilecoinSignature {\n    pub sig_type: FilecoinSignatureType,\n    pub bytes: Vec<u8>,\n}\n\n// impl Cbor for FilecoinSignature {}\n\nimpl ser::Serialize for FilecoinSignature {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: ser::Serializer,\n    {\n        let mut bytes = Vec::with_capacity(self.bytes.len() + 1);\n        // Insert signature type byte\n        bytes.push(self.sig_type as u8);\n        bytes.extend_from_slice(&self.bytes);\n\n        serde_bytes::Serialize::serialize(&bytes, serializer)\n    }\n}\n\nimpl<'de> de::Deserialize<'de> for FilecoinSignature {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: de::Deserializer<'de>,\n    {\n        let bytes: Cow<'de, [u8]> = serde_bytes::Deserialize::deserialize(deserializer)?;\n        if bytes.is_empty() {\n            return Err(de::Error::custom(\"Cannot deserialize empty bytes\"));\n        }\n\n        // Remove signature type byte\n        let mut sig_type = FilecoinSignatureType::Secp256k1;\n        let b = bytes[0];\n        if b == 1 {\n        } else if b == 2 {\n            sig_type = FilecoinSignatureType::BLS;\n        } else {\n            panic!(\"Invalid signature type byte (must be 1 or 2)\")\n        }\n\n        Ok(FilecoinSignature {\n            bytes: bytes[1..].to_vec(),\n            sig_type,\n        })\n    }\n}\n\n/// Represents a filecoin transaction id\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\npub struct FilecoinTransactionId {\n    pub txid: Vec<u8>,\n}\n\nimpl TransactionId for FilecoinTransactionId {}\n\nimpl fmt::Display for FilecoinTransactionId {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", &BASE32_ENCODER.encode(&self.txid[..]))\n    }\n}\n\n/// Represents a wrapped filecoin transaction with signature bytes.\n#[derive(PartialEq, Clone, Debug, Serialize_tuple, Deserialize_tuple, Hash, Eq, Default)]\npub struct FilecoinTransaction {\n    pub params: FilecoinTransactionParameters,\n    pub signature: FilecoinSignature,\n}\n\n// impl Cbor for FilecoinTransaction {}\n\nimpl Transaction for FilecoinTransaction {\n    type Address = FilecoinAddress;\n    type Format = FilecoinFormat;\n    type PublicKey = FilecoinPublicKey;\n    type TransactionId = FilecoinTransactionId;\n    type TransactionParameters = FilecoinTransactionParameters;\n\n    /// Returns a new filecoin transaction given the transaction parameters\n    fn new(parameters: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            params: parameters.clone(),\n            signature: FilecoinSignature::default(),\n        })\n    }\n\n    /// Reconstruct a filecoin transaction from the given binary stream and return it\n    fn from_bytes(transaction: &[u8]) -> Result<Self, TransactionError> {\n        Ok(serde_json::from_slice::<FilecoinTransactionJson>(transaction)?.0)\n    }\n\n    /// Insert the given signature into this filecoin transaction to make it signed,\n    /// and return the binary stream of it\n    fn sign(&mut self, mut signature: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError> {\n        signature.push(recid);\n        let sig = FilecoinSignature {\n            sig_type: match self.params.from.protocol() {\n                Protocol::Secp256k1 => FilecoinSignatureType::Secp256k1,\n                Protocol::BLS => FilecoinSignatureType::BLS,\n                _ => panic!(\"Unrecognized signature type\"),\n            },\n            bytes: signature,\n        };\n        self.signature = sig;\n        self.to_bytes()\n    }\n\n    /// Returns the binary stream of this filecoin transaction\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        Ok(\n            serde_json::to_string(&json::FilecoinTransactionJsonRef(self))?\n                .as_bytes()\n                .to_vec(),\n        )\n    }\n\n    /// Returns the transaction id of this filecoin transaction\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        let stream = self.to_bytes().unwrap();\n        Ok(FilecoinTransactionId {\n            txid: blake2b_256(&stream).to_vec(),\n        })\n    }\n}\n\nimpl FilecoinTransaction {\n    pub fn cid(&self) -> anyhow::Result<Cid> {\n        cid_from_cbor(self)\n    }\n\n    pub fn digest(&self) -> Result<Vec<u8>, TransactionError> {\n        Ok(blake2b_256(&self.params.to_bytes()).to_vec())\n    }\n}\n\nimpl FromStr for FilecoinTransaction {\n    type Err = TransactionError;\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        Ok(serde_json::from_str::<FilecoinTransactionJson>(s)?.0)\n    }\n}\n\nimpl Display for FilecoinTransaction {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            String::from_utf8(self.to_bytes().unwrap()).unwrap()\n        )\n    }\n}\n\npub mod json {\n    use super::*;\n    use cid::Cid;\n    use serde::{ser, Deserialize, Deserializer, Serialize, Serializer};\n\n    /// Wrapper for serializing and de-serializing a `FilecoinTransaction` from JSON.\n    #[derive(Deserialize, Serialize)]\n    #[serde(transparent)]\n    pub struct FilecoinTransactionJson(#[serde(with = \"self\")] pub FilecoinTransaction);\n\n    /// Wrapper for serializing a `FilecoinTransaction` reference to JSON.\n    #[derive(Serialize)]\n    #[serde(transparent)]\n    pub struct FilecoinTransactionJsonRef<'a>(#[serde(with = \"self\")] pub &'a FilecoinTransaction);\n\n    impl From<FilecoinTransactionJson> for FilecoinTransaction {\n        fn from(wrapper: FilecoinTransactionJson) -> Self {\n            wrapper.0\n        }\n    }\n\n    impl From<FilecoinTransaction> for FilecoinTransactionJson {\n        fn from(tx: FilecoinTransaction) -> Self {\n            FilecoinTransactionJson(tx)\n        }\n    }\n\n    pub fn serialize<S>(tx: &FilecoinTransaction, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        #[derive(Serialize)]\n        #[serde(rename_all = \"PascalCase\")]\n        struct FilecoinTransactionSer<'a> {\n            #[serde(with = \"parameter_json\")]\n            message: &'a FilecoinTransactionParameters,\n            #[serde(with = \"signature_json\")]\n            signature: &'a FilecoinSignature,\n            #[serde(default, rename = \"CID\", with = \"cid_json::opt\")]\n            cid: Option<Cid>,\n        }\n        FilecoinTransactionSer {\n            message: &tx.params,\n            signature: &tx.signature,\n            cid: Some(tx.cid().map_err(ser::Error::custom)?),\n        }\n        .serialize(serializer)\n    }\n\n    pub fn deserialize<'de, D>(deserializer: D) -> Result<FilecoinTransaction, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Serialize, Deserialize)]\n        #[serde(rename_all = \"PascalCase\")]\n        struct FilecoinTransactionDe {\n            #[serde(with = \"parameter_json\")]\n            message: FilecoinTransactionParameters,\n            #[serde(with = \"signature_json\")]\n            signature: FilecoinSignature,\n        }\n        let FilecoinTransactionDe { message, signature } = Deserialize::deserialize(deserializer)?;\n        Ok(FilecoinTransaction {\n            params: message,\n            signature,\n        })\n    }\n}\n\npub mod parameter_json {\n\n    use super::address_json::AddressJson;\n    use super::amount_json;\n    use super::cid_json;\n    use super::FilecoinAmount;\n    use super::FilecoinTransactionParameters;\n    use super::RawBytes;\n    use base64::{engine::general_purpose, Engine as _};\n    use cid::Cid;\n    use serde::{de, ser, Deserialize, Deserializer, Serialize, Serializer};\n\n    /// Wrapper for serializing and de-serializing a Message from JSON.\n    #[derive(Deserialize, Serialize, Debug)]\n    #[serde(transparent)]\n    pub struct ParameterJson(#[serde(with = \"self\")] pub FilecoinTransactionParameters);\n\n    /// Wrapper for serializing a Message reference to JSON.\n    #[derive(Serialize)]\n    #[serde(transparent)]\n    pub struct ParameterJsonRef<'a>(#[serde(with = \"self\")] pub &'a FilecoinTransactionParameters);\n\n    impl From<ParameterJson> for FilecoinTransactionParameters {\n        fn from(wrapper: ParameterJson) -> Self {\n            wrapper.0\n        }\n    }\n\n    impl From<FilecoinTransactionParameters> for ParameterJson {\n        fn from(wrapper: FilecoinTransactionParameters) -> Self {\n            ParameterJson(wrapper)\n        }\n    }\n\n    #[derive(Serialize, Deserialize)]\n    #[serde(rename_all = \"PascalCase\")]\n    struct JsonHelper {\n        version: i64,\n        to: AddressJson,\n        from: AddressJson,\n        #[serde(rename = \"Nonce\")]\n        sequence: u64,\n        #[serde(with = \"amount_json\")]\n        value: FilecoinAmount,\n        gas_limit: i64,\n        #[serde(with = \"amount_json\")]\n        gas_fee_cap: FilecoinAmount,\n        #[serde(with = \"amount_json\")]\n        gas_premium: FilecoinAmount,\n        #[serde(rename = \"Method\")]\n        method_num: u64,\n        params: Option<String>,\n        #[serde(default, rename = \"CID\", with = \"cid_json::opt\")]\n        cid: Option<Cid>,\n    }\n\n    pub fn serialize<S>(\n        params: &FilecoinTransactionParameters,\n        serializer: S,\n    ) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        JsonHelper {\n            version: params.version,\n            to: params.to.into(),\n            from: params.from.into(),\n            sequence: params.sequence,\n            value: params.value.clone(),\n            gas_limit: params.gas_limit,\n            gas_fee_cap: params.gas_fee_cap.clone(),\n            gas_premium: params.gas_premium.clone(),\n            method_num: params.method_num,\n            params: Some(general_purpose::STANDARD.encode(params.params.bytes())),\n            cid: Some(params.cid().map_err(ser::Error::custom)?),\n        }\n        .serialize(serializer)\n    }\n\n    pub fn deserialize<'de, D>(deserializer: D) -> Result<FilecoinTransactionParameters, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let m: JsonHelper = Deserialize::deserialize(deserializer)?;\n        Ok(FilecoinTransactionParameters {\n            version: m.version,\n            to: m.to.into(),\n            from: m.from.into(),\n            sequence: m.sequence,\n            value: m.value,\n            gas_limit: m.gas_limit,\n            gas_fee_cap: m.gas_fee_cap,\n            gas_premium: m.gas_premium,\n            method_num: m.method_num,\n            params: RawBytes::new(\n                general_purpose::STANDARD\n                    .decode(m.params.unwrap_or_default())\n                    .map_err(de::Error::custom)?,\n            ),\n        })\n    }\n}\n\npub mod signature_json {\n    use super::{FilecoinSignature, FilecoinSignatureType};\n    use base64::{engine::general_purpose, Engine as _};\n    use serde::{de, Deserialize, Deserializer, Serialize, Serializer};\n\n    // Wrapper for serializing and deserializing a Signature from JSON.\n    #[derive(Deserialize, Serialize)]\n    #[serde(transparent)]\n    pub struct SignatureJson(#[serde(with = \"self\")] pub FilecoinSignature);\n\n    /// Wrapper for serializing a Signature reference to JSON.\n    #[derive(Serialize)]\n    #[serde(transparent)]\n    pub struct SignatureJsonRef<'a>(#[serde(with = \"self\")] pub &'a FilecoinSignature);\n\n    #[derive(Serialize, Deserialize)]\n    struct JsonHelper {\n        #[serde(rename = \"Type\")]\n        sig_type: FilecoinSignatureType,\n        #[serde(rename = \"Data\")]\n        bytes: String,\n    }\n\n    pub fn serialize<S>(sig: &FilecoinSignature, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        JsonHelper {\n            sig_type: sig.sig_type,\n            bytes: general_purpose::STANDARD.encode(&sig.bytes),\n        }\n        .serialize(serializer)\n    }\n\n    pub fn deserialize<'de, D>(deserializer: D) -> Result<FilecoinSignature, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let JsonHelper { sig_type, bytes } = Deserialize::deserialize(deserializer)?;\n        Ok(FilecoinSignature {\n            sig_type,\n            bytes: general_purpose::STANDARD\n                .decode(bytes)\n                .map_err(de::Error::custom)?,\n        })\n    }\n\n    pub mod signature_type {\n        use super::*;\n        use serde::{Deserialize, Deserializer, Serialize, Serializer};\n\n        #[derive(Debug, Deserialize, Serialize)]\n        #[serde(rename_all = \"lowercase\")]\n        enum JsonHelperEnum {\n            Bls,\n            Secp256k1,\n        }\n\n        #[derive(Debug, Serialize, Deserialize)]\n        #[serde(transparent)]\n        pub struct SignatureTypeJson(#[serde(with = \"self\")] pub FilecoinSignatureType);\n\n        pub fn serialize<S>(\n            sig_type: &FilecoinSignatureType,\n            serializer: S,\n        ) -> Result<S::Ok, S::Error>\n        where\n            S: Serializer,\n        {\n            let json = match sig_type {\n                FilecoinSignatureType::BLS => JsonHelperEnum::Bls,\n                FilecoinSignatureType::Secp256k1 => JsonHelperEnum::Secp256k1,\n            };\n            json.serialize(serializer)\n        }\n\n        pub fn deserialize<'de, D>(deserializer: D) -> Result<FilecoinSignatureType, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            let json_enum: JsonHelperEnum = Deserialize::deserialize(deserializer)?;\n\n            let signature_type = match json_enum {\n                JsonHelperEnum::Bls => FilecoinSignatureType::BLS,\n                JsonHelperEnum::Secp256k1 => FilecoinSignatureType::Secp256k1,\n            };\n            Ok(signature_type)\n        }\n    }\n}\n\npub mod cid_json {\n    use cid::Cid;\n    use serde::{de, Deserialize, Deserializer, Serialize, Serializer};\n\n    /// Wrapper for serializing and de-serializing a Cid from JSON.\n    #[derive(Deserialize, Serialize, Clone, Debug)]\n    #[serde(transparent)]\n    pub struct CidJson(#[serde(with = \"self\")] pub Cid);\n\n    /// Wrapper for serializing a CID reference to JSON.\n    #[derive(Serialize)]\n    #[serde(transparent)]\n    pub struct CidJsonRef<'a>(#[serde(with = \"self\")] pub &'a Cid);\n\n    impl From<CidJson> for Cid {\n        fn from(wrapper: CidJson) -> Self {\n            wrapper.0\n        }\n    }\n\n    pub fn serialize<S>(c: &Cid, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        CidMap { cid: c.to_string() }.serialize(serializer)\n    }\n\n    pub fn deserialize<'de, D>(deserializer: D) -> Result<Cid, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let CidMap { cid } = Deserialize::deserialize(deserializer)?;\n        cid.parse().map_err(de::Error::custom)\n    }\n\n    /// Structure just used as a helper to serialize a CID into a map with key \"/\"\n    #[derive(Serialize, Deserialize)]\n    struct CidMap {\n        #[serde(rename = \"/\")]\n        cid: String,\n    }\n\n    pub mod opt {\n        use super::{Cid, CidJson, CidJsonRef};\n        use serde::{self, Deserialize, Deserializer, Serialize, Serializer};\n\n        pub fn serialize<S>(v: &Option<Cid>, serializer: S) -> Result<S::Ok, S::Error>\n        where\n            S: Serializer,\n        {\n            v.as_ref().map(CidJsonRef).serialize(serializer)\n        }\n\n        pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Cid>, D::Error>\n        where\n            D: Deserializer<'de>,\n        {\n            let s: Option<CidJson> = Deserialize::deserialize(deserializer)?;\n            Ok(s.map(|v| v.0))\n        }\n    }\n}\n\npub mod address_json {\n    use super::FilecoinAddress;\n    use serde::{de, Deserialize, Deserializer, Serialize, Serializer};\n    use std::borrow::Cow;\n    use std::str::FromStr;\n\n    /// Wrapper for serializing and de-serializing a `FilecoinAddress` from JSON.\n    #[derive(Deserialize, Serialize)]\n    #[serde(transparent)]\n    pub struct AddressJson(#[serde(with = \"self\")] pub FilecoinAddress);\n\n    /// Wrapper for serializing a `FilecoinAddress` reference to JSON.\n    #[derive(Serialize)]\n    #[serde(transparent)]\n    pub struct AddressJsonRef<'a>(#[serde(with = \"self\")] pub &'a FilecoinAddress);\n\n    impl From<FilecoinAddress> for AddressJson {\n        fn from(addr: FilecoinAddress) -> Self {\n            Self(addr)\n        }\n    }\n\n    impl From<AddressJson> for FilecoinAddress {\n        fn from(addr: AddressJson) -> Self {\n            addr.0\n        }\n    }\n\n    pub fn serialize<S>(addr: &FilecoinAddress, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_str(&addr.to_string())\n    }\n\n    pub fn deserialize<'de, D>(deserializer: D) -> Result<FilecoinAddress, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let address_as_string: Cow<'de, str> = Deserialize::deserialize(deserializer)?;\n        FilecoinAddress::from_str(&address_as_string).map_err(de::Error::custom)\n    }\n}\n\npub mod amount_json {\n    use super::FilecoinAmount;\n    use serde::{Deserialize, Serialize};\n    use std::str::FromStr;\n\n    /// Serializes `FilecoinAmount` as String\n    pub fn serialize<S>(amount: &FilecoinAmount, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: serde::Serializer,\n    {\n        String::serialize(&amount.to_string(), serializer)\n    }\n\n    /// De-serializes String into `BigInt`.\n    pub fn deserialize<'de, D>(deserializer: D) -> Result<FilecoinAmount, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        FilecoinAmount::from_str(&s).map_err(serde::de::Error::custom)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::str::FromStr;\n\n    use anychain_core::Transaction;\n    use fvm_ipld_encoding::RawBytes;\n\n    use crate::{\n        FilecoinAddress, FilecoinAmount, FilecoinAmountConverter, FilecoinTransaction,\n        FilecoinTransactionParameters,\n    };\n\n    #[test]\n    fn filecoin_transaction_serialization_test() {\n        let params = FilecoinTransactionParameters {\n            version: 0,\n            from: FilecoinAddress::from_str(\"f1lhjzzj6on64czzsgfw5jxsf7y5uv5qvh7dmpevy\").unwrap(),\n            to: FilecoinAddress::from_str(\"t1meiag3eum5xtxi5tivnw4fjhkrdtaqu4v5t4nly\").unwrap(),\n            sequence: 999,\n            value: FilecoinAmount::from_fil(\"1\"),\n            method_num: 0,\n            params: RawBytes::new(vec![]),\n            gas_limit: 500000,\n            gas_fee_cap: FilecoinAmount::from_milli_fil(\"1\"),\n            gas_premium: FilecoinAmount::from_milli_fil(\"100\"),\n        };\n\n        let tx = FilecoinTransaction::new(&params).unwrap();\n\n        let expected = r#\"{\"Message\":{\"Version\":0,\"To\":\"t1meiag3eum5xtxi5tivnw4fjhkrdtaqu4v5t4nly\",\"From\":\"f1lhjzzj6on64czzsgfw5jxsf7y5uv5qvh7dmpevy\",\"Nonce\":999,\"Value\":\"1000000000000000000\",\"GasLimit\":500000,\"GasFeeCap\":\"1000000000000000\",\"GasPremium\":\"100000000000000000\",\"Method\":0,\"Params\":\"\",\"CID\":{\"/\":\"bafy2bzacea2dufcc2vhvrt3pzn24t2zmuhnbdmf5kgch6blkxsppukc4rp6bu\"}},\"Signature\":{\"Type\":1,\"Data\":\"\"},\"CID\":{\"/\":\"bafy2bzacebx42rzvvl3v6mio44ileyxwohj2d2i34otmk7wwqsd4rdl4b3bhq\"}}\"#;\n\n        // Robust: compare parsed JSON, not raw string formatting.\n        let actual_json: serde_json::Value = serde_json::from_str(&tx.to_string()).unwrap();\n        let expected_json: serde_json::Value = serde_json::from_str(expected).unwrap();\n        assert_eq!(actual_json, expected_json);\n\n        let param_bytes = params.to_bytes();\n        assert_eq!(\n            &[\n                1, 113, 160, 228, 2, 32, 52, 58, 20, 66, 213, 79, 88, 207, 111, 203, 117, 201, 235,\n                44, 161, 218, 17, 176, 189, 81, 132, 127, 5, 106, 188, 158, 250, 40, 92, 139, 252,\n                26\n            ],\n            param_bytes.as_slice()\n        );\n    }\n\n    #[test]\n    fn filecoin_transaction_deserialization_test() {\n        let s = r#\"{\"Message\":{\"Version\":0,\"To\":\"t1meiag3eum5xtxi5tivnw4fjhkrdtaqu4v5t4nly\",\"From\":\"f1lhjzzj6on64czzsgfw5jxsf7y5uv5qvh7dmpevy\",\"Nonce\":999,\"Value\":\"1000000000000000000\",\"GasLimit\":500000,\"GasFeeCap\":\"1000000000000000\",\"GasPremium\":\"100000000000000000\",\"Method\":0,\"Params\":\"\",\"CID\":{\"/\":\"bafy2bzacea2dufcc2vhvrt3pzn24t2zmuhnbdmf5kgch6blkxsppukc4rp6bu\"}},\"Signature\":{\"Type\":1,\"Data\":\"\"},\"CID\":{\"/\":\"bafy2bzacebx42rzvvl3v6mio44ileyxwohj2d2i34otmk7wwqsd4rdl4b3bhq\"}}\"#;\n        let tx = FilecoinTransaction::from_bytes(s.as_bytes()).unwrap();\n\n        let expected_json: serde_json::Value = serde_json::from_str(s).unwrap();\n        let actual_json: serde_json::Value = serde_json::from_str(&tx.to_string()).unwrap();\n\n        assert_eq!(actual_json, expected_json);\n\n        // Assert each Message property explicitly\n        assert_eq!(tx.params.version, 0);\n        assert_eq!(\n            tx.params.to.to_string(),\n            \"t1meiag3eum5xtxi5tivnw4fjhkrdtaqu4v5t4nly\"\n        );\n        assert_eq!(\n            tx.params.from.to_string(),\n            \"f1lhjzzj6on64czzsgfw5jxsf7y5uv5qvh7dmpevy\"\n        );\n        assert_eq!(tx.params.sequence, 999);\n        assert_eq!(tx.params.value.to_string(), \"1000000000000000000\");\n        assert_eq!(tx.params.gas_limit, 500000);\n        assert_eq!(tx.params.gas_fee_cap.to_string(), \"1000000000000000\");\n        assert_eq!(tx.params.gas_premium.to_string(), \"100000000000000000\");\n        assert_eq!(tx.params.method_num, 0);\n        assert!(tx.params.params.bytes().is_empty());\n\n        assert_eq!(actual_json[\"Message\"][\"Params\"].as_str(), Some(\"\"));\n        assert_eq!(\n            actual_json[\"Message\"][\"CID\"][\"/\"].as_str(),\n            Some(\"bafy2bzacea2dufcc2vhvrt3pzn24t2zmuhnbdmf5kgch6blkxsppukc4rp6bu\")\n        );\n\n        // Optional extra field-level checks (nice for readable test failures)\n        assert_eq!(tx.signature.sig_type as u8, 1);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/src/utilities/crypto.rs",
    "content": "/// Hash length of payload for addresses of filecoin.\npub const PAYLOAD_HASH_LEN: usize = 20;\n\n/// Returns a 20-byte address hash for given public key\n// #[inline]\npub fn blake2b_160(input: &[u8]) -> [u8; 20] {\n    let digest = blake2b_simd::Params::new()\n        .hash_length(PAYLOAD_HASH_LEN)\n        .to_state()\n        .update(input)\n        .finalize();\n\n    let mut hash = [0u8; 20];\n    hash.copy_from_slice(digest.as_bytes());\n    hash\n}\n\n/// Returns a 32-byte hash for given data\n#[inline]\npub fn blake2b_256(ingest: &[u8]) -> [u8; 32] {\n    let digest = blake2b_simd::Params::new()\n        .hash_length(32)\n        .to_state()\n        .update(ingest)\n        .finalize();\n\n    let mut hash = [0u8; 32];\n    hash.clone_from_slice(digest.as_bytes());\n    hash\n}\n\n/// Length of the checksum hash for string encodings.\npub const CHECKSUM_HASH_LEN: usize = 4;\n\n/// Checksum calculates the 4 byte checksum hash\npub fn blake2b_checksum(ingest: &[u8]) -> Vec<u8> {\n    blake2b_simd::Params::new()\n        .hash_length(CHECKSUM_HASH_LEN)\n        .to_state()\n        .update(ingest)\n        .finalize()\n        .as_bytes()\n        .to_vec()\n}\n"
  },
  {
    "path": "crates/anychain-filecoin/src/utilities/mod.rs",
    "content": "pub mod crypto;\n"
  },
  {
    "path": "crates/anychain-kms/.gitignore",
    "content": "target/\n.DS_Store/\n"
  },
  {
    "path": "crates/anychain-kms/Cargo.toml",
    "content": "[package]\nname = \"anychain-kms\"\ndescription = \"A Rust library providing Key Management Schema for AnyChain. Handles general security and signature algorithms.\"\nversion = \"0.1.23\"\nkeywords = [\"cryptography\", \"security\", \"signature\", \"algorithm\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n[dependencies]\nrustc-hash = { workspace = true }\nrand = { workspace = true }\nsha2 = { workspace = true }\nhmac = { workspace = true }\nbs58 = { workspace = true }\npbkdf2 = { workspace = true }\nunicode-normalization = { workspace = true }\nanyhow = { workspace = true }\nthiserror = { workspace = true }\nzeroize = { workspace = true }\nonce_cell = { workspace = true }\nsubtle = { workspace = true }\nripemd = { workspace = true }\nhex = { workspace = true }\nlibsecp256k1 = { workspace = true }\ned25519-dalek = { workspace = true }\ncurve25519-dalek = { workspace = true }\ngroup = \"0.13.0\"\nencoding = \"0.2.33\"\nanychain-core = { version = \"0.1.8\", path = \"../anychain-core\" }\n\n[dev-dependencies]\nhex-literal = \"0.4\"\n\n[features]\nalloc = [\"zeroize/alloc\"]\nstd = [\"alloc\"]\nchinese-simplified = []\nchinese-traditional = []\n# Note: English is the standard for bip39 so always included\nfrench = []\nitalian = []\njapanese = []\nkorean = []\nspanish = []\ndefault = [\"std\", \"chinese-simplified\", \"chinese-traditional\", \"french\", \"italian\", \"japanese\", \"korean\", \"spanish\"]\n\n[lints]\nworkspace = true"
  },
  {
    "path": "crates/anychain-kms/README.md",
    "content": "# KMS\nKey Management Schema\n## Introduction\nRust implementation of BIP32、BIP39\n\n\n## Reference\n* [BIP32 Official Doc](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)\n* [BIP39 Official Doc](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)\n* [Elliptic-Curve-Cryptography](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography)"
  },
  {
    "path": "crates/anychain-kms/src/bip32/child_number.rs",
    "content": "//! Child numbers\n\nuse crate::bip32::{Error, Result};\nuse core::{\n    fmt::{self, Display},\n    str::FromStr,\n};\n\n/// Index of a particular child key for a given (extended) private key.\n#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, PartialOrd, Ord)]\npub struct ChildNumber(pub u32);\n\nimpl ChildNumber {\n    /// Size of a child number when encoded as bytes.\n    pub const BYTE_SIZE: usize = 4;\n\n    /// Hardened child keys use indices 2^31 through 2^32-1.\n    pub const HARDENED_FLAG: u32 = 1 << 31;\n\n    /// Create new [`ChildNumber`] with the given index and hardened flag.\n    ///\n    /// Returns an error if it is equal to or greater than [`Self::HARDENED_FLAG`].\n    pub fn new(index: u32, hardened: bool) -> Result<Self> {\n        if index >= Self::HARDENED_FLAG {\n            Err(Error::ChildNumber)\n        } else if hardened {\n            Ok(Self(index | Self::HARDENED_FLAG))\n        } else {\n            Ok(Self(index))\n        }\n    }\n\n    /// Parse a child number from the byte encoding.\n    pub fn from_bytes(bytes: [u8; Self::BYTE_SIZE]) -> Self {\n        u32::from_be_bytes(bytes).into()\n    }\n\n    /// Serialize this child number as bytes.\n    pub fn to_bytes(self) -> [u8; Self::BYTE_SIZE] {\n        self.0.to_be_bytes()\n    }\n\n    /// Get the index number for this [`ChildNumber`], i.e. with\n    /// [`Self::HARDENED_FLAG`] cleared.\n    pub fn index(self) -> u32 {\n        self.0 & !Self::HARDENED_FLAG\n    }\n\n    /// Is this child number within the hardened range?\n    pub fn is_hardened(&self) -> bool {\n        self.0 & Self::HARDENED_FLAG != 0\n    }\n}\n\nimpl Display for ChildNumber {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.index())?;\n\n        if self.is_hardened() {\n            f.write_str(\"\\'\")?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl From<u32> for ChildNumber {\n    fn from(n: u32) -> ChildNumber {\n        ChildNumber(n)\n    }\n}\n\nimpl From<ChildNumber> for u32 {\n    fn from(n: ChildNumber) -> u32 {\n        n.0\n    }\n}\n\nimpl FromStr for ChildNumber {\n    type Err = Error;\n\n    fn from_str(child: &str) -> Result<ChildNumber> {\n        let (child, hardened) = match child.strip_suffix('\\'') {\n            Some(c) => (c, true),\n            None => (child, false),\n        };\n\n        let index = child.parse().map_err(|_| Error::ChildNumber)?;\n        ChildNumber::new(index, hardened)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::ChildNumber;\n    use crate::bip32::Error;\n\n    #[test]\n    fn parse_non_hardened() {\n        let n = \"42\".parse::<ChildNumber>().unwrap();\n        assert_eq!(n, ChildNumber::new(42, false).unwrap());\n        assert_eq!(n.index(), 42);\n        assert!(!n.is_hardened());\n    }\n\n    #[test]\n    fn parse_hardened() {\n        let n = \"42'\".parse::<ChildNumber>().unwrap();\n        assert_eq!(n, ChildNumber::new(42, true).unwrap());\n        assert_eq!(n.index(), 42);\n        assert!(n.is_hardened());\n    }\n\n    #[test]\n    fn parse_rejects_invalid() {\n        assert_eq!(\"42!\".parse::<ChildNumber>(), Err(Error::ChildNumber));\n    }\n\n    #[test]\n    fn index_overflow() {\n        // Invalid index\n        let index = ChildNumber::HARDENED_FLAG;\n        assert_eq!(ChildNumber::new(index, false), Err(Error::ChildNumber));\n        assert_eq!(ChildNumber::new(index, true), Err(Error::ChildNumber));\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/derivation_path.rs",
    "content": "//! Derivation paths\n\nuse crate::bip32::{ChildNumber, Error, Result};\nuse alloc::vec::{self, Vec};\nuse core::{\n    fmt::{self, Display},\n    str::FromStr,\n};\n\n/// Prefix for all derivation paths.\nconst PREFIX: &str = \"m\";\n\n/// Derivation paths within a hierarchical keyspace.\n#[derive(Clone, Debug, Default, Eq, PartialEq)]\npub struct DerivationPath {\n    path: Vec<ChildNumber>,\n}\n\nimpl DerivationPath {\n    /// Iterate over the [`ChildNumber`] values in this derivation path.\n    pub fn iter(&self) -> impl Iterator<Item = ChildNumber> + '_ {\n        self.path.iter().cloned()\n    }\n\n    /// Is this derivation path empty? (i.e. the root)\n    pub fn is_empty(&self) -> bool {\n        self.path.is_empty()\n    }\n\n    /// Get the count of [`ChildNumber`] values in this derivation path.\n    pub fn len(&self) -> usize {\n        self.path.len()\n    }\n\n    /// Get the parent [`DerivationPath`] for the current one.\n    ///\n    /// Returns `None` if this is already the root path.\n    pub fn parent(&self) -> Option<Self> {\n        self.path.len().checked_sub(1).map(|n| {\n            let mut parent = self.clone();\n            parent.path.truncate(n);\n            parent\n        })\n    }\n\n    /// Push a [`ChildNumber`] onto an existing derivation path.\n    pub fn push(&mut self, child_number: ChildNumber) {\n        self.path.push(child_number)\n    }\n}\n\nimpl AsRef<[ChildNumber]> for DerivationPath {\n    fn as_ref(&self) -> &[ChildNumber] {\n        &self.path\n    }\n}\n\nimpl Display for DerivationPath {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(PREFIX)?;\n\n        for child_number in self.iter() {\n            write!(f, \"/{}\", child_number)?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl Extend<ChildNumber> for DerivationPath {\n    fn extend<T>(&mut self, iter: T)\n    where\n        T: IntoIterator<Item = ChildNumber>,\n    {\n        self.path.extend(iter);\n    }\n}\n\nimpl FromStr for DerivationPath {\n    type Err = Error;\n\n    fn from_str(path: &str) -> Result<DerivationPath> {\n        let mut path = path.split('/');\n\n        if path.next() != Some(PREFIX) {\n            return Err(Error::Decode);\n        }\n\n        Ok(DerivationPath {\n            path: path.map(str::parse).collect::<Result<_>>()?,\n        })\n    }\n}\n\nimpl IntoIterator for DerivationPath {\n    type Item = ChildNumber;\n    type IntoIter = vec::IntoIter<ChildNumber>;\n\n    fn into_iter(self) -> vec::IntoIter<ChildNumber> {\n        self.path.into_iter()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::DerivationPath;\n    use alloc::string::ToString;\n\n    /// BIP32 test vectors\n    // TODO(tarcieri): consolidate test vectors\n    #[test]\n    fn round_trip() {\n        let path_m = \"m\";\n        assert_eq!(\n            path_m.parse::<DerivationPath>().unwrap().to_string(),\n            path_m\n        );\n\n        let path_m_0 = \"m/0\";\n        assert_eq!(\n            path_m_0.parse::<DerivationPath>().unwrap().to_string(),\n            path_m_0\n        );\n\n        let path_m_0_2147483647h = \"m/0/2147483647'\";\n        assert_eq!(\n            path_m_0_2147483647h\n                .parse::<DerivationPath>()\n                .unwrap()\n                .to_string(),\n            path_m_0_2147483647h\n        );\n\n        let path_m_0_2147483647h_1 = \"m/0/2147483647'/1\";\n        assert_eq!(\n            path_m_0_2147483647h_1\n                .parse::<DerivationPath>()\n                .unwrap()\n                .to_string(),\n            path_m_0_2147483647h_1\n        );\n\n        let path_m_0_2147483647h_1_2147483646h = \"m/0/2147483647'/1/2147483646'\";\n        assert_eq!(\n            path_m_0_2147483647h_1_2147483646h\n                .parse::<DerivationPath>()\n                .unwrap()\n                .to_string(),\n            path_m_0_2147483647h_1_2147483646h\n        );\n\n        let path_m_0_2147483647h_1_2147483646h_2 = \"m/0/2147483647'/1/2147483646'/2\";\n        assert_eq!(\n            path_m_0_2147483647h_1_2147483646h_2\n                .parse::<DerivationPath>()\n                .unwrap()\n                .to_string(),\n            path_m_0_2147483647h_1_2147483646h_2\n        );\n    }\n\n    #[test]\n    fn parent() {\n        let path_m_0_2147483647h = \"m/0/2147483647'\".parse::<DerivationPath>().unwrap();\n        let path_m_0 = path_m_0_2147483647h.parent().unwrap();\n        assert_eq!(\"m/0\", path_m_0.to_string());\n\n        let path_m = path_m_0.parent().unwrap();\n        assert_eq!(\"m\", path_m.to_string());\n        assert_eq!(path_m.parent(), None);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/error.rs",
    "content": "//! Error type.\n\nuse core::fmt::{self, Display};\n\nuse hmac::digest::InvalidLength;\n\n/// Result type.\npub type Result<T> = core::result::Result<T, Error>;\n\n/// Error type.\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\n#[non_exhaustive]\npub enum Error {\n    /// Base58 errors.\n    Base58,\n\n    /// BIP39-related errors.\n    Bip39,\n\n    /// Child number-related errors.\n    ChildNumber,\n\n    /// Cryptographic errors.\n    Crypto,\n\n    /// Decoding errors (not related to Base58).\n    Decode,\n\n    /// Maximum derivation depth exceeded.\n    Depth,\n\n    /// Seed length invalid.\n    SeedLength,\n}\n\nimpl Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Error::Base58 => f.write_str(\"base58 error\"),\n            Error::Bip39 => f.write_str(\"bip39 error\"),\n            Error::ChildNumber => f.write_str(\"invalid child number\"),\n            Error::Crypto => f.write_str(\"cryptographic error\"),\n            Error::Decode => f.write_str(\"decoding error\"),\n            Error::Depth => f.write_str(\"maximum derivation depth exceeded\"),\n            Error::SeedLength => f.write_str(\"seed length invalid\"),\n        }\n    }\n}\n\nimpl std::error::Error for Error {}\n\nimpl From<bs58::decode::Error> for Error {\n    fn from(_: bs58::decode::Error) -> Error {\n        Error::Base58\n    }\n}\n\nimpl From<bs58::encode::Error> for Error {\n    fn from(_: bs58::encode::Error) -> Error {\n        Error::Base58\n    }\n}\n\nimpl From<core::array::TryFromSliceError> for Error {\n    fn from(_: core::array::TryFromSliceError) -> Error {\n        Error::Decode\n    }\n}\n\n/*\nimpl From<digest::InvalidKeyLength> for Error {\n    fn from(_: hmac::crypto_mac::InvalidKeyLength) -> Error {\n        Error::Crypto\n    }\n\n}\n */\n\nimpl From<InvalidLength> for Error {\n    fn from(_: InvalidLength) -> Error {\n        Error::Crypto\n    }\n}\n/*\nimpl From<k256::elliptic_curve::Error> for Error {\n    fn from(_: k256::elliptic_curve::Error) -> Error {\n        Error::Crypto\n    }\n}\n\n\nimpl From<k256::ecdsa::Error> for Error {\n    fn from(_: k256::ecdsa::Error) -> Error {\n        Error::Crypto\n    }\n}\n*/\n\nimpl From<libsecp256k1::Error> for Error {\n    fn from(_: libsecp256k1::Error) -> Error {\n        Error::Crypto\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/extended_key/attrs.rs",
    "content": "//! Extended key attributes.\n\nuse crate::bip32::{ChainCode, ChildNumber, Depth, KeyFingerprint};\n\n/// Extended key attributes: fields common to extended keys including depth,\n/// fingerprints, child numbers, and chain codes.\n#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\npub struct ExtendedKeyAttrs {\n    /// Depth in the key derivation hierarchy.\n    pub depth: Depth,\n\n    /// Parent fingerprint.\n    pub parent_fingerprint: KeyFingerprint,\n\n    /// Child number.\n    pub child_number: ChildNumber,\n\n    /// Chain code.\n    pub chain_code: ChainCode,\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/extended_key/extended_private_key.rs",
    "content": "//! Extended private keys\n\nuse crate::bip32::{\n    ChildNumber, Depth, Error, ExtendedKey, ExtendedKeyAttrs, ExtendedPublicKey, HmacSha512,\n    KeyFingerprint, Prefix, PrivateKey, PublicKey, Result, KEY_SIZE,\n};\nuse core::{\n    fmt::{self, Debug},\n    str::FromStr,\n};\nuse curve25519_dalek::scalar::Scalar;\nuse hmac::Mac;\nuse subtle::{Choice, ConstantTimeEq};\nuse zeroize::Zeroize;\n\nuse {\n    crate::bip32::DerivationPath,\n    alloc::string::{String, ToString},\n    zeroize::Zeroizing,\n};\n\n/// Derivation domain separator for BIP39 keys.\nconst BIP39_DOMAIN_SEPARATOR: [u8; 12] = [\n    0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x65, 0x64,\n];\n\n/// Extended private secp256k1 signing key.\npub type XprvSecp256k1 = ExtendedPrivateKey<libsecp256k1::SecretKey>;\n\n/// Extended private ed25519 signing key.\npub type XprvEd25519 = ExtendedPrivateKey<Scalar>;\n\n/// Extended private keys derived using BIP32.\n///\n/// Generic around a [`PrivateKey`] type. When the `secp256k1` feature of this\n/// crate is enabled, the [`XprvSecp256k1`] type provides a convenient alias for\n/// extended ECDSA/secp256k1 private keys.\n#[derive(Clone)]\npub struct ExtendedPrivateKey<K: PrivateKey> {\n    /// Derived private key\n    private_key: K,\n\n    /// Extended key attributes.\n    attrs: ExtendedKeyAttrs,\n}\n\nimpl<K> ExtendedPrivateKey<K>\nwhere\n    K: PrivateKey,\n{\n    /// Maximum derivation depth.\n    pub const MAX_DEPTH: Depth = u8::MAX;\n\n    /// Derive a child key from the given [`DerivationPath`].\n    pub fn new_from_path<S>(seed: S, path: &DerivationPath) -> Result<Self>\n    where\n        S: AsRef<[u8]>,\n    {\n        path.iter().fold(Self::new(seed), |maybe_key, child_num| {\n            maybe_key.and_then(|key| key.derive_child(child_num))\n        })\n    }\n\n    /// Create the root extended key for the given seed value.\n    pub fn new<S>(seed: S) -> Result<Self>\n    where\n        S: AsRef<[u8]>,\n    {\n        if ![16, 32, 64, 128].contains(&seed.as_ref().len()) {\n            return Err(Error::SeedLength);\n        }\n\n        let mut hmac = HmacSha512::new_from_slice(&BIP39_DOMAIN_SEPARATOR)?;\n        hmac.update(seed.as_ref());\n\n        let result = hmac.finalize().into_bytes();\n        let (secret_key, chain_code) = result.split_at(KEY_SIZE);\n        let private_key = PrivateKey::from_bytes(secret_key.to_vec())?;\n        let attrs = ExtendedKeyAttrs {\n            depth: 0,\n            parent_fingerprint: KeyFingerprint::default(),\n            child_number: ChildNumber::default(),\n            chain_code: chain_code.try_into()?,\n        };\n\n        Ok(ExtendedPrivateKey { private_key, attrs })\n    }\n\n    pub fn derive_from_path(self, path: &DerivationPath) -> Result<Self> {\n        path.iter()\n            .try_fold(self, |key, child_num| key.derive_child(child_num))\n    }\n\n    /// Derive a child key for a particular [`ChildNumber`].\n    pub fn derive_child(&self, child_number: ChildNumber) -> Result<Self> {\n        let depth = self.attrs.depth.checked_add(1).ok_or(Error::Depth)?;\n\n        let mut hmac =\n            HmacSha512::new_from_slice(&self.attrs.chain_code).map_err(|_| Error::Crypto)?;\n\n        if child_number.is_hardened() {\n            hmac.update(&[0]);\n            hmac.update(&self.private_key.to_bytes());\n        } else {\n            hmac.update(&self.private_key.public_key().to_bytes());\n        }\n\n        hmac.update(&child_number.to_bytes());\n\n        let result = hmac.finalize().into_bytes();\n        let (child_key, chain_code) = result.split_at(KEY_SIZE);\n\n        // We should technically loop here if a `secret_key` is zero or overflows\n        // the order of the underlying elliptic curve group, incrementing the\n        // index, however per \"Child key derivation (CKD) functions\":\n        // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions\n        //\n        // > \"Note: this has probability lower than 1 in 2^127.\"\n        //\n        // ...so instead, we simply return an error if this were ever to happen,\n        // as the chances of it happening are vanishingly small.\n        let private_key = self.private_key.derive_child(child_key.to_vec())?;\n\n        let attrs = ExtendedKeyAttrs {\n            parent_fingerprint: self.private_key.public_key().fingerprint(),\n            child_number,\n            chain_code: chain_code.try_into()?,\n            depth,\n        };\n\n        Ok(ExtendedPrivateKey { private_key, attrs })\n    }\n\n    /// Borrow the derived private key value.\n    pub fn private_key(&self) -> &K {\n        &self.private_key\n    }\n\n    /// Serialize the derived public key as bytes.\n    pub fn public_key(&self) -> ExtendedPublicKey<K::PublicKey> {\n        self.into()\n    }\n\n    /// Get attributes for this key such as depth, parent fingerprint,\n    /// child number, and chain code.\n    pub fn attrs(&self) -> &ExtendedKeyAttrs {\n        &self.attrs\n    }\n\n    /// Serialize the raw private key as a byte array.\n    pub fn to_bytes(&self) -> Vec<u8> {\n        self.private_key.to_bytes()\n    }\n\n    /// Serialize this key as an [`ExtendedKey`].\n    pub fn to_extended_key(&self, prefix: Prefix) -> ExtendedKey {\n        // Add leading `0` byte\n        let mut key_bytes = [0u8; KEY_SIZE + 1];\n        key_bytes[1..].copy_from_slice(&self.to_bytes());\n\n        ExtendedKey {\n            prefix,\n            attrs: self.attrs.clone(),\n            key_bytes,\n        }\n    }\n\n    /// Serialize this key as a self-[`Zeroizing`] `String`.\n    #[cfg(feature = \"alloc\")]\n    pub fn to_string(&self, prefix: Prefix) -> Zeroizing<String> {\n        Zeroizing::new(self.to_extended_key(prefix).to_string())\n    }\n}\n\nimpl<K> ConstantTimeEq for ExtendedPrivateKey<K>\nwhere\n    K: PrivateKey,\n{\n    fn ct_eq(&self, other: &Self) -> Choice {\n        let mut key_a = self.to_bytes();\n        let mut key_b = other.to_bytes();\n\n        let result = key_a.ct_eq(&key_b)\n            & self.attrs.depth.ct_eq(&other.attrs.depth)\n            & self\n                .attrs\n                .parent_fingerprint\n                .ct_eq(&other.attrs.parent_fingerprint)\n            & self.attrs.child_number.0.ct_eq(&other.attrs.child_number.0)\n            & self.attrs.chain_code.ct_eq(&other.attrs.chain_code);\n\n        key_a.zeroize();\n        key_b.zeroize();\n\n        result\n    }\n}\n\nimpl<K> Debug for ExtendedPrivateKey<K>\nwhere\n    K: PrivateKey,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // TODO(tarcieri): use `finish_non_exhaustive` when stable\n        f.debug_struct(\"ExtendedPrivateKey\")\n            .field(\"private_key\", &\"...\")\n            .field(\"attrs\", &self.attrs)\n            .finish()\n    }\n}\n\n/// NOTE: uses [`ConstantTimeEq`] internally\nimpl<K> Eq for ExtendedPrivateKey<K> where K: PrivateKey {}\n\n/// NOTE: uses [`ConstantTimeEq`] internally\nimpl<K> PartialEq for ExtendedPrivateKey<K>\nwhere\n    K: PrivateKey,\n{\n    fn eq(&self, other: &Self) -> bool {\n        self.ct_eq(other).into()\n    }\n}\n\nimpl<K> FromStr for ExtendedPrivateKey<K>\nwhere\n    K: PrivateKey,\n{\n    type Err = Error;\n\n    fn from_str(xprv: &str) -> Result<Self> {\n        ExtendedKey::from_str(xprv)?.try_into()\n    }\n}\n\nimpl<K> TryFrom<ExtendedKey> for ExtendedPrivateKey<K>\nwhere\n    K: PrivateKey,\n{\n    type Error = Error;\n\n    fn try_from(extended_key: ExtendedKey) -> Result<ExtendedPrivateKey<K>> {\n        if extended_key.prefix.is_private() && extended_key.key_bytes[0] == 0 {\n            Ok(ExtendedPrivateKey {\n                private_key: PrivateKey::from_bytes(extended_key.key_bytes[1..].to_vec())?,\n                attrs: extended_key.attrs.clone(),\n            })\n        } else {\n            Err(Error::Crypto)\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::bip32::{DerivationPath, XprvSecp256k1};\n    use subtle::ConstantTimeEq;\n\n    #[test]\n    fn test_constant_time_eq_same() {\n        let seed1 = [0x11u8; 64]; // All 0x11 bytes\n        let seed2 = [0x11u8; 64]; // All 0x11 bytes (SAME!)\n\n        let path: DerivationPath = \"m/44'/60'/0'/0/0\".parse().unwrap();\n\n        // Derive two completely same private keys\n        let key1 = XprvSecp256k1::new_from_path(seed1, &path).unwrap();\n        let key2 = XprvSecp256k1::new_from_path(seed2, &path).unwrap();\n\n        assert_eq!(key1.to_bytes(), key2.to_bytes(), \"Keys should be same!\");\n        assert!(bool::from(key1.ct_eq(&key2)));\n    }\n    #[test]\n    fn test_constant_time_eq_diff() {\n        let seed1 = [0x11u8; 64]; // All 0x11 bytes\n        let seed2 = [0x22u8; 64]; // All 0x22 bytes (DIFFERENT!)\n\n        let path: DerivationPath = \"m/44'/60'/0'/0/0\".parse().unwrap();\n\n        // Derive two completely different private keys\n        let key1 = XprvSecp256k1::new_from_path(seed1, &path).unwrap();\n        let key2 = XprvSecp256k1::new_from_path(seed2, &path).unwrap();\n\n        assert_ne!(\n            key1.to_bytes(),\n            key2.to_bytes(),\n            \"Keys should be different!\"\n        );\n        assert!(!bool::from(key1.ct_eq(&key2)));\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/extended_key/extended_public_key.rs",
    "content": "//! Extended public keys\n\nuse crate::bip32::{\n    ChildNumber, DerivationPath, Error, ExtendedKey, ExtendedKeyAttrs, ExtendedPrivateKey,\n    HmacSha512, KeyFingerprint, Prefix, PrivateKey, PublicKey, Result, KEY_SIZE,\n};\nuse core::str::FromStr;\nuse hmac::Mac;\n\n#[cfg(feature = \"alloc\")]\nuse alloc::string::{String, ToString};\n\n/// Extended public secp256k1 ECDSA verifiying key.\npub type XpubSecp256k1 = ExtendedPublicKey<libsecp256k1::PublicKey>;\n\n/// Extended public ed25519 EDDSA verifiying key.\npub type XpubEd25519 = ExtendedPublicKey<ed25519_dalek::VerifyingKey>;\n\n/// Extended public keys derived using BIP32.\n///\n/// Generic around a [`PublicKey`] type. When the `secp256k1` feature of this\n/// crate is enabled, the [`XpubSecp256k1`] type provides a convenient alias for\n/// extended ECDSA/secp256k1 public keys.\n#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\npub struct ExtendedPublicKey<K: PublicKey> {\n    /// Derived public key\n    public_key: K,\n\n    /// Extended key attributes.\n    attrs: ExtendedKeyAttrs,\n}\n\nimpl<K> ExtendedPublicKey<K>\nwhere\n    K: PublicKey,\n{\n    /// Obtain the non-extended public key value `K`.\n    pub fn public_key(&self) -> &K {\n        &self.public_key\n    }\n\n    /// Get attributes for this key such as depth, parent fingerprint,\n    /// child number, and chain code.\n    pub fn attrs(&self) -> &ExtendedKeyAttrs {\n        &self.attrs\n    }\n\n    /// Compute a 4-byte key fingerprint for this extended public key.\n    pub fn fingerprint(&self) -> KeyFingerprint {\n        self.public_key().fingerprint()\n    }\n\n    pub fn derive_from_path(self, path: &DerivationPath) -> Result<Self> {\n        path.iter()\n            .try_fold(self, |key, child_num| key.derive_child(child_num))\n    }\n\n    /// Derive a child key for a particular [`ChildNumber`].\n    pub fn derive_child(&self, child_number: ChildNumber) -> Result<Self> {\n        if child_number.is_hardened() {\n            // Cannot derive child public keys for hardened `ChildNumber`s\n            return Err(Error::ChildNumber);\n        }\n\n        let depth = self.attrs.depth.checked_add(1).ok_or(Error::Depth)?;\n\n        let mut hmac =\n            HmacSha512::new_from_slice(&self.attrs.chain_code).map_err(|_| Error::Crypto)?;\n\n        hmac.update(&self.public_key.to_bytes());\n        hmac.update(&child_number.to_bytes());\n\n        let result = hmac.finalize().into_bytes();\n        let (tweak, chain_code) = result.split_at(KEY_SIZE);\n        let public_key = self.public_key.derive_child(tweak.to_vec())?;\n\n        let attrs = ExtendedKeyAttrs {\n            parent_fingerprint: self.public_key.fingerprint(),\n            child_number,\n            chain_code: chain_code.try_into()?,\n            depth,\n        };\n\n        Ok(ExtendedPublicKey { public_key, attrs })\n    }\n\n    /// Serialize the raw public key as a byte array (e.g. SEC1-encoded).\n    pub fn to_bytes(&self) -> Vec<u8> {\n        self.public_key.to_bytes()\n    }\n\n    /// Serialize this key as an [`ExtendedKey`].\n    pub fn to_extended_key(&self, prefix: Prefix) -> ExtendedKey {\n        ExtendedKey {\n            prefix,\n            attrs: self.attrs.clone(),\n            key_bytes: {\n                let mut key_bytes = [0u8; KEY_SIZE + 1];\n                let bytes = self.to_bytes();\n                let bytes = match bytes.len() {\n                    KEY_SIZE => [vec![0u8], bytes].concat(),\n                    _ => bytes,\n                };\n                key_bytes.copy_from_slice(&bytes);\n                key_bytes\n            },\n        }\n    }\n\n    /// Serialize this key as a `String`.\n    #[cfg(feature = \"alloc\")]\n    pub fn to_string(&self, prefix: Prefix) -> String {\n        self.to_extended_key(prefix).to_string()\n    }\n}\n\nimpl<K> From<&ExtendedPrivateKey<K>> for ExtendedPublicKey<K::PublicKey>\nwhere\n    K: PrivateKey,\n{\n    fn from(xprv: &ExtendedPrivateKey<K>) -> ExtendedPublicKey<K::PublicKey> {\n        ExtendedPublicKey {\n            public_key: xprv.private_key().public_key(),\n            attrs: xprv.attrs().clone(),\n        }\n    }\n}\n\nimpl<K> FromStr for ExtendedPublicKey<K>\nwhere\n    K: PublicKey,\n{\n    type Err = Error;\n\n    fn from_str(xpub: &str) -> Result<Self> {\n        ExtendedKey::from_str(xpub)?.try_into()\n    }\n}\n\nimpl<K> TryFrom<ExtendedKey> for ExtendedPublicKey<K>\nwhere\n    K: PublicKey,\n{\n    type Error = Error;\n\n    fn try_from(extended_key: ExtendedKey) -> Result<ExtendedPublicKey<K>> {\n        if extended_key.prefix.is_public() {\n            Ok(ExtendedPublicKey {\n                public_key: PublicKey::from_bytes(extended_key.key_bytes.to_vec())?,\n                attrs: extended_key.attrs.clone(),\n            })\n        } else {\n            Err(Error::Crypto)\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/extended_key/mod.rs",
    "content": "//! Parser for extended key types (i.e. `xprv` and `xpub`)\n\npub(crate) mod attrs;\npub(crate) mod extended_private_key;\npub(crate) mod extended_public_key;\n\nuse crate::bip32::{ChildNumber, Error, ExtendedKeyAttrs, Prefix, Result, Version, KEY_SIZE};\nuse core::{\n    fmt::{self, Display},\n    str::{self, FromStr},\n};\nuse zeroize::Zeroize;\n\n/// Serialized extended key (e.g. `xprv` and `xpub`).\n#[derive(Clone)]\npub struct ExtendedKey {\n    /// [`Prefix`] (a.k.a. \"version\") of the key (e.g. `xprv`, `xpub`)\n    pub prefix: Prefix,\n\n    /// Extended key attributes.\n    pub attrs: ExtendedKeyAttrs,\n\n    /// Key material (may be public or private).\n    ///\n    /// Includes an extra byte for a public key's SEC1 tag.\n    pub key_bytes: [u8; KEY_SIZE + 1],\n}\n\nimpl ExtendedKey {\n    /// Size of an extended key when deserialized into bytes from Base58.\n    pub const BYTE_SIZE: usize = 78;\n\n    /// Maximum size of a Base58Check-encoded extended key in bytes.\n    ///\n    /// Note that extended keys can also be 111-bytes.\n    pub const MAX_BASE58_SIZE: usize = 112;\n\n    /// Write a Base58-encoded key to the provided buffer, returning a `&str`\n    /// containing the serialized data.\n    ///\n    /// Note that this type also impls [`Display`] and therefore you can\n    /// obtain an owned string by calling `to_string()`.\n    pub fn write_base58<'a>(&self, buffer: &'a mut [u8; Self::MAX_BASE58_SIZE]) -> Result<&'a str> {\n        let mut bytes = [0u8; Self::BYTE_SIZE]; // with 4-byte checksum\n        bytes[..4].copy_from_slice(&self.prefix.to_bytes());\n        bytes[4] = self.attrs.depth;\n        bytes[5..9].copy_from_slice(&self.attrs.parent_fingerprint);\n        bytes[9..13].copy_from_slice(&self.attrs.child_number.to_bytes());\n        bytes[13..45].copy_from_slice(&self.attrs.chain_code);\n        bytes[45..78].copy_from_slice(&self.key_bytes);\n\n        let base58_len = bs58::encode(&bytes).with_check().into(buffer.as_mut())?;\n        bytes.zeroize();\n\n        str::from_utf8(&buffer[..base58_len]).map_err(|_| Error::Base58)\n    }\n}\n\nimpl Display for ExtendedKey {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let mut buf = [0u8; Self::MAX_BASE58_SIZE];\n        self.write_base58(&mut buf)\n            .map_err(|_| fmt::Error)\n            .and_then(|base58| f.write_str(base58))\n    }\n}\n\nimpl FromStr for ExtendedKey {\n    type Err = Error;\n\n    fn from_str(base58: &str) -> Result<Self> {\n        let mut bytes = [0u8; Self::BYTE_SIZE + 4]; // with 4-byte checksum\n        let decoded_len = bs58::decode(base58).with_check(None).into(&mut bytes)?;\n\n        if decoded_len != Self::BYTE_SIZE {\n            return Err(Error::Decode);\n        }\n\n        let prefix = base58.get(..4).ok_or(Error::Decode).and_then(|chars| {\n            Prefix::validate_str(chars)?;\n            let version = Version::from_be_bytes(bytes[..4].try_into()?);\n            Ok(Prefix::from_parts_unchecked(chars, version))\n        })?;\n\n        let depth = bytes[4];\n        let parent_fingerprint = bytes[5..9].try_into()?;\n        let child_number = ChildNumber::from_bytes(bytes[9..13].try_into()?);\n        let chain_code = bytes[13..45].try_into()?;\n        let key_bytes = bytes[45..78].try_into()?;\n        bytes.zeroize();\n\n        let attrs = ExtendedKeyAttrs {\n            depth,\n            parent_fingerprint,\n            child_number,\n            chain_code,\n        };\n\n        Ok(ExtendedKey {\n            prefix,\n            attrs,\n            key_bytes,\n        })\n    }\n}\n\nimpl Drop for ExtendedKey {\n    fn drop(&mut self) {\n        self.key_bytes.zeroize();\n    }\n}\n\n// TODO(tarcieri): consolidate test vectors\n\n#[cfg(test)]\nmod tests {\n    use crate::bip32::{DerivationPath, ExtendedKey};\n    use crate::bip32::{Prefix, XprvSecp256k1};\n    use alloc::string::ToString;\n    use hex_literal::hex;\n\n    #[test]\n    fn bip32_test_vector_1_xprv() {\n        let xprv_base58 = \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPP\\\n             qjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\";\n\n        let xprv = xprv_base58.parse::<ExtendedKey>().unwrap();\n        assert_eq!(xprv.prefix.as_str(), \"xprv\");\n        assert_eq!(xprv.attrs.depth, 0);\n        assert_eq!(xprv.attrs.parent_fingerprint, [0u8; 4]);\n        assert_eq!(xprv.attrs.child_number.0, 0);\n        assert_eq!(\n            xprv.attrs.chain_code,\n            hex!(\"873DFF81C02F525623FD1FE5167EAC3A55A049DE3D314BB42EE227FFED37D508\")\n        );\n        assert_eq!(\n            xprv.key_bytes,\n            hex!(\"00E8F32E723DECF4051AEFAC8E2C93C9C5B214313817CDB01A1494B917C8436B35\")\n        );\n        assert_eq!(&xprv.to_string(), xprv_base58);\n    }\n\n    #[test]\n    fn bip32_test_vector_1_xpub() {\n        let xpub_base58 = \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhe\\\n             PY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\";\n\n        let xpub = xpub_base58.parse::<ExtendedKey>().unwrap();\n        assert_eq!(xpub.prefix.as_str(), \"xpub\");\n        assert_eq!(xpub.attrs.depth, 0);\n        assert_eq!(xpub.attrs.parent_fingerprint, [0u8; 4]);\n        assert_eq!(xpub.attrs.child_number.0, 0);\n        assert_eq!(\n            xpub.attrs.chain_code,\n            hex!(\"873DFF81C02F525623FD1FE5167EAC3A55A049DE3D314BB42EE227FFED37D508\")\n        );\n        assert_eq!(\n            xpub.key_bytes,\n            hex!(\"0339A36013301597DAEF41FBE593A02CC513D0B55527EC2DF1050E2E8FF49C85C2\")\n        );\n        assert_eq!(&xpub.to_string(), xpub_base58);\n    }\n\n    fn debug_extend_key(ek: &ExtendedKey) {\n        println!(\"prefix:{}\", ek.prefix.as_str());\n        println!(\"depth:{}\", ek.attrs.depth);\n        println!(\n            \"parent_fingerprint:{}\",\n            hex::encode(ek.attrs.parent_fingerprint)\n        );\n        println!(\"child_number:{}\", ek.attrs.child_number);\n        println!(\"chain_code:{}\", hex::encode(ek.attrs.chain_code));\n        println!(\"key_bytes:{}\", hex::encode(ek.key_bytes));\n    }\n\n    #[test]\n    fn test_master_xprv() {\n        let xprv_base58 = \"xprv9s21ZrQH143K3BMzbzRA1EtW4bTSDzvzPWeyUjjw6DdBGwM3GDNgd7wyAmy8R6KayQHRuTVQG4yvACbv4HLsyc9BPEGzu8GtYFTZTdncGnJ\";\n\n        let xprv = xprv_base58.parse::<ExtendedKey>().unwrap();\n        debug_extend_key(&xprv);\n\n        let xprv_base58_2 = \"xprv9s21ZrQH143K4UgTbVuwLxTrB8u488uJxogG9CA7eAEL7hmcPtyG7zT8BtpmvibJQ8q1nxnXRUpQAo1BVa9tbvXery13KY1dSsC5A155c5k\";\n        let xprv2 = xprv_base58_2.parse::<ExtendedKey>().unwrap();\n        debug_extend_key(&xprv2);\n    }\n\n    #[test]\n    fn test_xprv() {\n        let _seed = hex::decode(\"4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be\").unwrap();\n        let seed2 = \"4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be\".as_bytes();\n        let path: DerivationPath = \"m/44'/60/0'/10001\".parse().unwrap();\n        let xprv = XprvSecp256k1::new_from_path(seed2, &path).unwrap();\n        println!(\"xprv: {}\", xprv.to_extended_key(Prefix::XPRV));\n\n        let xpub = xprv.public_key();\n        println!(\"xpub: {}\", xpub.to_extended_key(Prefix::XPUB));\n        println!(\"{}\", hex::encode(xpub.public_key().serialize()));\n        // 040b4fed878e6b0ff6847e2ac9c13b556d161e1344cd270ed6cafac21f0144399d9ef31f267722fdeccba59ffd57ff84a020a2d3b416344c68e840bc7d97e77570\n        // 0x5a2a8410875e882aee87bf8e5f2e1ede8810617b\n    }\n\n    #[test]\n    fn test_hex() {\n        let raw = \"2b727519fa377f4195aabe4b5047849a3a55d838d15adc773bcc1ad89ed32b59c7d091795f578bdb6a523545edb9d3da514c7e5d3c130087c3b4f17b0ad1dd39\";\n        let bytes = raw.as_bytes();\n        let str = String::from_utf8(bytes.to_vec()).unwrap();\n        println!(\"{}\", str.len());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/mod.rs",
    "content": "mod child_number;\nmod derivation_path;\nmod error;\nmod extended_key;\nmod prefix;\nmod private_key;\nmod public_key;\n\npub use child_number::ChildNumber;\npub use error::{Error, Result};\npub use extended_key::{\n    attrs::ExtendedKeyAttrs, extended_private_key::ExtendedPrivateKey,\n    extended_public_key::ExtendedPublicKey, ExtendedKey,\n};\npub use extended_key::{\n    extended_private_key::{XprvEd25519, XprvSecp256k1},\n    extended_public_key::{XpubEd25519, XpubSecp256k1},\n};\npub use prefix::Prefix;\npub use private_key::PrivateKey;\npub use public_key::PublicKey;\n\npub use derivation_path::DerivationPath;\n\n/// Chain code: extension for both private and public keys which provides an\n/// additional 256-bits of entropy.\npub type ChainCode = [u8; KEY_SIZE];\n\n/// Derivation depth.\npub type Depth = u8;\n\n/// BIP32 key fingerprints.\npub type KeyFingerprint = [u8; 4];\n\n/// BIP32 \"versions\": integer representation of the key prefix.\npub type Version = u32;\n\n/// HMAC with SHA-512\npub type HmacSha512 = hmac::Hmac<sha2::Sha512>;\n\npub const KEY_SIZE: usize = 32;\n\n#[cfg(test)]\nmod test_mod {\n    use super::*;\n\n    pub(crate) struct TestVector {\n        pub seed: &'static str,\n        pub ckd: [(&'static str, &'static str, &'static str); 6],\n    }\n\n    // bip32 standard test vectors\n    const VECTORS :[TestVector;1] = [\n        TestVector{\n            seed: \"000102030405060708090a0b0c0d0e0f\",\n            ckd: [\n                (\n                    \"m\",\n                    \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n                    \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\"\n                ),\n                (\n                    \"m/0'\",\n                    \"xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7\",\n                    \"xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw\"\n                ),\n                (\n                    \"m/0'/1\",\n                    \"xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs\",\n                    \"xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ\"\n                ),\n                (\n                    \"m/0'/1/2'\",\n                    \"xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM\",\n                    \"xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5\"\n                ),\n                (\n                    \"m/0'/1/2'/2\",\n                    \"xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334\",\n                    \"xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV\"\n                ),\n                (\n                    \"m/0'/1/2'/2/1000000000\",\n                    \"xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76\",\n                    \"xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy\"\n                )\n            ]\n        }\n    ];\n\n    #[test]\n    pub fn test_vectors() {\n        VECTORS.iter().for_each(|vector| {\n            let seed = hex::decode(vector.seed).unwrap();\n            vector.ckd.iter().for_each(|item| {\n                let path: DerivationPath = item.0.parse().unwrap();\n                let xprv = XprvSecp256k1::new_from_path(seed.clone(), &path).unwrap();\n                let xpub = xprv.public_key();\n                assert_eq!(item.1, xprv.to_string(Prefix::XPRV).as_str());\n                assert_eq!(item.2, xpub.to_string(Prefix::XPUB).as_str());\n            })\n        })\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/prefix.rs",
    "content": "//! Extended key prefixes.\n\nuse crate::bip32::{Error, ExtendedKey, Result, Version};\nuse core::{\n    fmt::{self, Debug, Display},\n    str,\n};\n\n/// Constant panicking assertion.\n// TODO(tarcieri): use const panic when stable.\n// See: https://github.com/rust-lang/rust/issues/51999\nmacro_rules! const_assert {\n    ($bool:expr, $msg:expr) => {\n        [$msg][!$bool as usize]\n    };\n}\n\n/// BIP32 extended key prefixes a.k.a. \"versions\" (e.g. `xpub`, `xprv`)\n///\n/// The BIP32 spec describes these as \"versions\" and gives examples for\n/// `xprv`/`xpub` (mainnet) and `tprv`/`tpub` (testnet), however in practice\n/// there are many more used (e.g. `ypub`, `zpub`).\n#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]\n#[non_exhaustive]\npub struct Prefix {\n    /// ASCII characters representing the prefix.\n    chars: [u8; Self::LENGTH],\n\n    /// Prefix after Base58 decoding, interpreted as a big endian integer.\n    version: Version,\n}\n\nimpl Prefix {\n    /// Length of a prefix in ASCII characters.\n    pub const LENGTH: usize = 4;\n\n    /// `tprv` prefix\n    pub const TPRV: Self = Self::from_parts_unchecked(\"tprv\", 0x04358394);\n\n    /// `tpub` prefix\n    pub const TPUB: Self = Self::from_parts_unchecked(\"tpub\", 0x043587cf);\n\n    /// `xprv` prefix\n    pub const XPRV: Self = Self::from_parts_unchecked(\"xprv\", 0x0488ade4);\n\n    /// `xpub` prefix\n    pub const XPUB: Self = Self::from_parts_unchecked(\"xpub\", 0x0488b21e);\n\n    /// `yprv` prefix\n    pub const YPRV: Self = Self::from_parts_unchecked(\"yprv\", 0x049d7878);\n\n    /// `ypub` prefix\n    pub const YPUB: Self = Self::from_parts_unchecked(\"ypub\", 0x049d7cb2);\n\n    /// `zprv` prefix\n    pub const ZPRV: Self = Self::from_parts_unchecked(\"zprv\", 0x04b2430c);\n\n    /// `zpub` prefix\n    pub const ZPUB: Self = Self::from_parts_unchecked(\"zpub\", 0x04b24746);\n\n    /// Create a new prefix from the given 4-character string and version number.\n    /// The main intended use case for this function is [`Prefix`] constants\n    /// such as [`Prefix::XPRV`].\n    ///\n    /// Use this function with care: No consistency check is performed! It is\n    /// up to the caller to ensure that the version number matches the prefix.\n    ///\n    /// Panics if `s` is not 4 chars long, or any of the chars lie outside of\n    /// the supported range: lower case (`a..=z`) or upper case (`A..=Z`)\n    /// letters.\n    pub const fn from_parts_unchecked(s: &str, version: Version) -> Self {\n        // TODO(tarcieri): return `Result` when const panic is stable\n        const_assert!(Self::validate_str(s).is_ok(), \"invalid prefix\");\n        let bytes = s.as_bytes();\n        let chars = [bytes[0], bytes[1], bytes[2], bytes[3]];\n        Self { chars, version }\n    }\n\n    /// Create a new prefix from the given encoded bytes.\n    ///\n    /// These bytes represent the big endian serialization of a [`Version`] integer.\n    pub fn from_bytes(bytes: [u8; Self::LENGTH]) -> Result<Self> {\n        Self::from_version(Version::from_be_bytes(bytes))\n    }\n\n    /// Parse a [`Prefix`] from a 32-bit integer \"version\", e.g.:\n    ///\n    /// - 0x0488B21E => `xpub`\n    /// - 0x0488ADE4 => `xprv`\n    fn from_version(version: Version) -> Result<Self> {\n        let mut bytes = [0u8; ExtendedKey::BYTE_SIZE];\n        bytes[..4].copy_from_slice(&version.to_be_bytes());\n\n        let mut buffer = [0u8; ExtendedKey::MAX_BASE58_SIZE];\n        bs58::encode(&bytes).with_check().into(buffer.as_mut())?;\n\n        let s = str::from_utf8(&buffer[..4]).map_err(|_| Error::Base58)?;\n        Self::validate_str(s)?;\n        Ok(Self::from_parts_unchecked(s, version))\n    }\n\n    /// Get the prefix as a string.\n    pub fn as_str(&self) -> &str {\n        str::from_utf8(&self.chars).expect(\"prefix encoding error\")\n    }\n\n    /// Is this a public key?\n    pub fn is_public(self) -> bool {\n        &self.chars[1..] == b\"pub\"\n    }\n\n    /// Is this a private key?\n    pub fn is_private(self) -> bool {\n        &self.chars[1..] == b\"prv\"\n    }\n\n    /// Get the [`Version`] number.\n    pub fn version(self) -> Version {\n        self.version\n    }\n\n    /// Serialize the [`Version`] number as big-endian bytes.\n    pub fn to_bytes(self) -> [u8; Self::LENGTH] {\n        self.version.to_be_bytes()\n    }\n\n    /// Validate that the given prefix string is well-formed.\n    // TODO(tarcieri): validate the string ends with `prv` or `pub`?\n    pub(crate) const fn validate_str(s: &str) -> Result<&str> {\n        if s.len() != Self::LENGTH {\n            return Err(Error::Decode);\n        }\n\n        let mut i = 0;\n\n        while i < Self::LENGTH {\n            if s.as_bytes()[i].is_ascii_alphabetic() {\n                i += 1;\n            } else {\n                return Err(Error::Decode);\n            }\n        }\n\n        Ok(s)\n    }\n}\n\nimpl AsRef<str> for Prefix {\n    fn as_ref(&self) -> &str {\n        self.as_str()\n    }\n}\n\nimpl Debug for Prefix {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Prefix\")\n            .field(\"chars\", &self.as_str())\n            .field(\"version\", &DebugVersion(self.version))\n            .finish()\n    }\n}\n\nimpl Display for Prefix {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(self.as_str())\n    }\n}\n\nimpl From<Prefix> for Version {\n    fn from(prefix: Prefix) -> Version {\n        prefix.version()\n    }\n}\n\nimpl From<&Prefix> for Version {\n    fn from(prefix: &Prefix) -> Version {\n        prefix.version()\n    }\n}\n\nimpl TryFrom<Version> for Prefix {\n    type Error = Error;\n\n    fn try_from(version: Version) -> Result<Self> {\n        Self::from_version(version)\n    }\n}\n\nimpl TryFrom<&[u8]> for Prefix {\n    type Error = Error;\n\n    fn try_from(bytes: &[u8]) -> Result<Prefix> {\n        Self::from_bytes(bytes.try_into()?)\n    }\n}\n\n/// Debugging formatting helper for [`Version`] with a `Debug` impl that\n/// outputs hexadecimal instead of base 10.\nstruct DebugVersion(Version);\n\nimpl Debug for DebugVersion {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{:#010x}\", self.0)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::Prefix;\n\n    #[test]\n    fn constants() {\n        assert_eq!(Prefix::TPRV, Prefix::try_from(0x04358394).unwrap());\n        assert_eq!(Prefix::TPRV.as_str(), \"tprv\");\n        assert_eq!(Prefix::TPUB, Prefix::try_from(0x043587CF).unwrap());\n        assert_eq!(Prefix::TPUB.as_str(), \"tpub\");\n\n        assert_eq!(Prefix::XPRV, Prefix::try_from(0x0488ADE4).unwrap());\n        assert_eq!(Prefix::XPRV.as_str(), \"xprv\");\n        assert_eq!(Prefix::XPUB, Prefix::try_from(0x0488B21E).unwrap());\n        assert_eq!(Prefix::XPUB.as_str(), \"xpub\");\n\n        assert_eq!(Prefix::YPRV, Prefix::try_from(0x049d7878).unwrap());\n        assert_eq!(Prefix::YPRV.as_str(), \"yprv\");\n        assert_eq!(Prefix::YPUB, Prefix::try_from(0x049d7cb2).unwrap());\n        assert_eq!(Prefix::YPUB.as_str(), \"ypub\");\n\n        assert_eq!(Prefix::ZPRV, Prefix::try_from(0x04b2430c).unwrap());\n        assert_eq!(Prefix::ZPRV.as_str(), \"zprv\");\n        assert_eq!(Prefix::ZPUB, Prefix::try_from(0x04b24746).unwrap());\n        assert_eq!(Prefix::ZPUB.as_str(), \"zpub\");\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/private_key.rs",
    "content": "//! Trait for deriving child keys on a given type.\n\nuse crate::bip32::{Error, PublicKey, Result, XprvEd25519, XprvSecp256k1};\n\nuse curve25519_dalek::{constants::ED25519_BASEPOINT_TABLE as G, scalar::Scalar};\nuse group::GroupEncoding;\n\n/// Trait for key types which can be derived using BIP32.\npub trait PrivateKey: Sized {\n    /// Public key type which corresponds to this private key.\n    type PublicKey: PublicKey;\n\n    /// Initialize this key from bytes.\n    fn from_bytes(bytes: Vec<u8>) -> Result<Self>;\n\n    /// Serialize this key as bytes.\n    fn to_bytes(&self) -> Vec<u8>;\n\n    /// Derive a child key from a parent key with provided tweak value,\n    /// i.e. where `other` is referred to as \"I sub L\" in BIP32 and sourced\n    /// from the left half of the HMAC-SHA-512 output.\n    fn derive_child(&self, tweak: Vec<u8>) -> Result<Self>;\n\n    /// Get the [`Self::PublicKey`] that corresponds to this private key.\n    fn public_key(&self) -> Self::PublicKey;\n}\n\nimpl PrivateKey for libsecp256k1::SecretKey {\n    type PublicKey = libsecp256k1::PublicKey;\n\n    fn from_bytes(bytes: Vec<u8>) -> Result<Self> {\n        match libsecp256k1::SecretKey::parse_slice(&bytes) {\n            Ok(sk) => Ok(sk),\n            Err(_) => Err(Error::Crypto),\n        }\n    }\n\n    fn to_bytes(&self) -> Vec<u8> {\n        libsecp256k1::SecretKey::serialize(self).to_vec()\n    }\n\n    fn derive_child(&self, tweak: Vec<u8>) -> Result<Self> {\n        let mut cpk = *self;\n        match cpk.tweak_add_assign(&libsecp256k1::SecretKey::parse_slice(&tweak).unwrap()) {\n            Ok(_) => Ok(cpk),\n            Err(_) => Err(Error::Crypto),\n        }\n    }\n\n    fn public_key(&self) -> Self::PublicKey {\n        libsecp256k1::PublicKey::from_secret_key(self)\n    }\n}\n\nimpl From<XprvSecp256k1> for libsecp256k1::SecretKey {\n    fn from(xprv: XprvSecp256k1) -> libsecp256k1::SecretKey {\n        libsecp256k1::SecretKey::from(&xprv)\n    }\n}\n\nimpl From<&XprvSecp256k1> for libsecp256k1::SecretKey {\n    fn from(xprv: &XprvSecp256k1) -> libsecp256k1::SecretKey {\n        *xprv.private_key()\n    }\n}\n\nimpl PrivateKey for Scalar {\n    type PublicKey = ed25519_dalek::VerifyingKey;\n\n    fn from_bytes(bytes: Vec<u8>) -> Result<Self> {\n        let mut sk = [0u8; 32];\n        sk.copy_from_slice(&bytes);\n        Ok(Scalar::from_bytes_mod_order(sk))\n    }\n\n    fn to_bytes(&self) -> Vec<u8> {\n        self.to_bytes().to_vec()\n    }\n\n    fn derive_child(&self, tweak: Vec<u8>) -> Result<Self> {\n        let mut _tweak = [0u8; 32];\n        _tweak.copy_from_slice(&tweak);\n        let tweak = Scalar::from_bytes_mod_order(_tweak);\n        Ok(self + tweak)\n    }\n\n    fn public_key(&self) -> Self::PublicKey {\n        let pk = (G * self).to_bytes();\n        ed25519_dalek::VerifyingKey::from_bytes(&pk).unwrap()\n    }\n}\n\nimpl From<XprvEd25519> for Scalar {\n    fn from(xprv: XprvEd25519) -> Scalar {\n        Scalar::from(&xprv)\n    }\n}\n\nimpl From<&XprvEd25519> for Scalar {\n    fn from(xprv: &XprvEd25519) -> Scalar {\n        *xprv.private_key()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{XprvEd25519, XprvSecp256k1};\n    use hex_literal::hex;\n\n    #[test]\n    fn test_secp256k1_derivation() {\n        let seed = hex!(\n            \"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a2\n             9f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542\"\n        );\n\n        let path = \"m/0/2147483647'/1/2147483646'/2\";\n        let xprv = XprvSecp256k1::new_from_path(seed, &path.parse().unwrap()).unwrap();\n\n        assert_eq!(\n            xprv,\n            \"xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j\".parse().unwrap()\n        );\n    }\n\n    #[test]\n    fn test_ed25519_derivation() {\n        let seed = hex!(\n            \"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a2\n             9f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542\"\n        );\n\n        let path = \"m/0/2147483647'/1/2147483646'/2\";\n        let xprv = XprvEd25519::new_from_path(seed, &path.parse().unwrap()).unwrap();\n\n        assert_eq!(\n            xprv,\n            \"xprvA3jRL3NoAajWVMc6JWKPgQrxx5Xt6VVpgj8y6FMcBbseE4DkZEP8cfVqJQtQvyCqZpb39KZE5r7UUGwunJg9m3wksLj5x94cJv4ahGMarGU\".parse().unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip32/public_key.rs",
    "content": "//! Trait for deriving child keys on a given type.\n\nuse crate::bip32::{KeyFingerprint, Result};\nuse curve25519_dalek::{\n    constants::ED25519_BASEPOINT_TABLE as G, edwards::EdwardsPoint, scalar::Scalar,\n};\nuse group::GroupEncoding;\nuse ripemd::Ripemd160;\nuse sha2::{Digest, Sha256};\n\nuse crate::bip32::Error;\n\n/// Trait for key types which can be derived using BIP32.\npub trait PublicKey: Sized {\n    /// Initialize this key from bytes.\n    fn from_bytes(bytes: Vec<u8>) -> Result<Self>;\n\n    /// Serialize this key as bytes.\n    fn to_bytes(&self) -> Vec<u8>;\n\n    /// Derive a child key from a parent key and a provided tweak value.\n    fn derive_child(&self, tweak: Vec<u8>) -> Result<Self>;\n\n    /// Compute a 4-byte key fingerprint for this public key.\n    ///\n    /// Default implementation uses `RIPEMD160(SHA256(public_key))`.\n    fn fingerprint(&self) -> KeyFingerprint {\n        let digest = Ripemd160::digest(Sha256::digest(self.to_bytes()));\n        digest[..4].try_into().expect(\"digest truncated\")\n    }\n}\n\nimpl PublicKey for libsecp256k1::PublicKey {\n    fn from_bytes(bytes: Vec<u8>) -> Result<Self> {\n        match libsecp256k1::PublicKey::parse_slice(&bytes, None) {\n            Ok(pubkey) => Ok(pubkey),\n            Err(_) => Err(Error::Crypto),\n        }\n    }\n\n    fn to_bytes(&self) -> Vec<u8> {\n        libsecp256k1::PublicKey::serialize_compressed(self).to_vec()\n    }\n\n    fn derive_child(&self, tweak: Vec<u8>) -> Result<Self> {\n        let mut cpk = *self;\n        match cpk.tweak_add_assign(&libsecp256k1::SecretKey::parse_slice(&tweak).unwrap()) {\n            Ok(_) => Ok(cpk),\n            Err(_) => Err(Error::Crypto),\n        }\n    }\n}\n\nimpl PublicKey for ed25519_dalek::VerifyingKey {\n    fn from_bytes(bytes: Vec<u8>) -> Result<Self> {\n        if bytes.len() == 32 {\n            let arr: [u8; 32] = bytes.try_into().unwrap();\n            Ok(ed25519_dalek::VerifyingKey::from_bytes(&arr)\n                .or(Err(crate::bip32::Error::Crypto))?)\n        } else if bytes.len() == 33 {\n            let arr: [u8; 32] = bytes[1..].try_into().unwrap();\n            Ok(ed25519_dalek::VerifyingKey::from_bytes(&arr)\n                .or(Err(crate::bip32::Error::Crypto))?)\n        } else {\n            Err(crate::bip32::Error::Crypto)\n        }\n    }\n\n    fn to_bytes(&self) -> Vec<u8> {\n        self.as_bytes().to_vec()\n    }\n\n    fn derive_child(&self, tweak: Vec<u8>) -> Result<Self> {\n        let pk = self.as_bytes();\n        let mut _tweak = [0u8; 32];\n        _tweak.copy_from_slice(&tweak);\n        let point = EdwardsPoint::from_bytes(pk).unwrap();\n        let tweak = &Scalar::from_bytes_mod_order(_tweak) * G;\n        let child = point + tweak;\n        let child = child.to_bytes();\n        Ok(ed25519_dalek::VerifyingKey::from_bytes(&child).unwrap())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::str::FromStr;\n\n    use hex_literal::hex;\n\n    use crate::bip32::{extended_key::extended_public_key::XpubEd25519, DerivationPath};\n\n    const SEED: [u8; 64] = hex!(\n        \"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a2\n         9f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542\"\n    );\n\n    type XprvSecp256k1 = crate::bip32::ExtendedPrivateKey<libsecp256k1::SecretKey>;\n\n    #[test]\n    fn secp256k1_xprv_derivation() {\n        let path = \"m/0/2147483647'/1/2147483646'/2\";\n        let xprv = XprvSecp256k1::new_from_path(SEED, &path.parse().unwrap()).unwrap();\n\n        assert_eq!(\n            xprv.public_key(),\n            \"xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt\".parse().unwrap()\n        );\n    }\n\n    #[test]\n    fn secp256k1_ffi_xpub_derivation() {\n        let path = \"m/0/2147483647'/1/2147483646'\";\n        let xprv = XprvSecp256k1::new_from_path(SEED, &path.parse().unwrap()).unwrap();\n        let xpub = xprv.public_key().derive_child(2.into()).unwrap();\n\n        assert_eq!(\n            xpub,\n            \"xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt\".parse().unwrap()\n        );\n    }\n\n    #[test]\n    fn test_ed25519() {\n        let xpub = \"xpub661MyMwAqRbcGGrNUSVKfdjbzSrBSeah6YPb99PhpDyQRiYLKtC4RaASsF1k5xEW6u2tZZ1nb3A335ZbtNh9UJtwrNorMhmumn2X3r3dEn2\";\n        let xpub = XpubEd25519::from_str(xpub).unwrap();\n        let path = DerivationPath::from_str(\"m/1/2/3\").unwrap();\n        let child = xpub.derive_from_path(&path).unwrap();\n        let child = child.public_key().as_bytes();\n        println!(\"{:?}\", child);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/crypto.rs",
    "content": "//! These are internal helper functions used when creating a new [`Mnemonic`][Mnemonic], and when turning a [`Mnemonic`][Mnemonic]\n//! into a [`Seed`][Seed].\n//!\n//! [Mnemonic]: ../mnemonic/struct.Mnemonic.html\n//! [Seed]: ../seed/struct.Seed.html\n//!\n\nextern crate rand;\nuse self::rand::{thread_rng, RngCore};\nuse hmac::Hmac;\nuse sha2::Digest;\n\nconst PBKDF2_ROUNDS: u32 = 2048;\nconst PBKDF2_BYTES: usize = 64;\n\n/// SHA256 helper function, internal to the crate\n///\npub(crate) fn sha256_first_byte(input: &[u8]) -> u8 {\n    sha2::Sha256::digest(input)[0]\n}\n\n/// Random byte generator, used to create new mnemonics\n///\npub(crate) fn gen_random_bytes(byte_length: usize) -> Vec<u8> {\n    let mut rng = thread_rng();\n    let mut bytes = vec![0u8; byte_length];\n\n    rng.fill_bytes(&mut bytes);\n\n    bytes\n}\n/// PBKDF2 helper, used to generate [`Seed`][Seed] from [`Mnemonic`][Mnemonic]\n///\n/// [Mnemonic]: ../mnemonic/struct.Mnemonic.html\n/// [Seed]: ../seed/struct.Seed.html\n///\npub(crate) fn pbkdf2(input: &[u8], salt: &str) -> Vec<u8> {\n    let mut seed = vec![0u8; PBKDF2_BYTES];\n\n    let _ = pbkdf2::pbkdf2::<Hmac<sha2::Sha512>>(input, salt.as_bytes(), PBKDF2_ROUNDS, &mut seed);\n\n    seed\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/error.rs",
    "content": "use super::MnemonicType;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ErrorKind {\n    #[error(\"invalid checksum\")]\n    InvalidChecksum,\n    #[error(\"invalid word in phrase\")]\n    InvalidWord,\n    #[error(\"invalid keysize: {0}\")]\n    InvalidKeysize(usize),\n    #[error(\"invalid number of words in phrase: {0}\")]\n    InvalidWordLength(usize),\n    #[error(\"invalid entropy length {0}bits for mnemonic type {1:?}\")]\n    InvalidEntropyLength(usize, MnemonicType),\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    #[cfg(target_arch = \"wasm32\")]\n    use wasm_bindgen_test::*;\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn prints_correctly() {\n        assert_eq!(\n            format!(\"{}\", ErrorKind::InvalidChecksum),\n            \"invalid checksum\",\n        );\n        assert_eq!(\n            format!(\"{}\", ErrorKind::InvalidKeysize(42)),\n            \"invalid keysize: 42\",\n        );\n        assert_eq!(\n            format!(\n                \"{}\",\n                ErrorKind::InvalidEntropyLength(42, MnemonicType::Words12)\n            ),\n            \"invalid entropy length 42bits for mnemonic type Words12\",\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/chinese_simplified.txt",
    "content": "的\n一\n是\n在\n不\n了\n有\n和\n人\n这\n中\n大\n为\n上\n个\n国\n我\n以\n要\n他\n时\n来\n用\n们\n生\n到\n作\n地\n于\n出\n就\n分\n对\n成\n会\n可\n主\n发\n年\n动\n同\n工\n也\n能\n下\n过\n子\n说\n产\n种\n面\n而\n方\n后\n多\n定\n行\n学\n法\n所\n民\n得\n经\n十\n三\n之\n进\n着\n等\n部\n度\n家\n电\n力\n里\n如\n水\n化\n高\n自\n二\n理\n起\n小\n物\n现\n实\n加\n量\n都\n两\n体\n制\n机\n当\n使\n点\n从\n业\n本\n去\n把\n性\n好\n应\n开\n它\n合\n还\n因\n由\n其\n些\n然\n前\n外\n天\n政\n四\n日\n那\n社\n义\n事\n平\n形\n相\n全\n表\n间\n样\n与\n关\n各\n重\n新\n线\n内\n数\n正\n心\n反\n你\n明\n看\n原\n又\n么\n利\n比\n或\n但\n质\n气\n第\n向\n道\n命\n此\n变\n条\n只\n没\n结\n解\n问\n意\n建\n月\n公\n无\n系\n军\n很\n情\n者\n最\n立\n代\n想\n已\n通\n并\n提\n直\n题\n党\n程\n展\n五\n果\n料\n象\n员\n革\n位\n入\n常\n文\n总\n次\n品\n式\n活\n设\n及\n管\n特\n件\n长\n求\n老\n头\n基\n资\n边\n流\n路\n级\n少\n图\n山\n统\n接\n知\n较\n将\n组\n见\n计\n别\n她\n手\n角\n期\n根\n论\n运\n农\n指\n几\n九\n区\n强\n放\n决\n西\n被\n干\n做\n必\n战\n先\n回\n则\n任\n取\n据\n处\n队\n南\n给\n色\n光\n门\n即\n保\n治\n北\n造\n百\n规\n热\n领\n七\n海\n口\n东\n导\n器\n压\n志\n世\n金\n增\n争\n济\n阶\n油\n思\n术\n极\n交\n受\n联\n什\n认\n六\n共\n权\n收\n证\n改\n清\n美\n再\n采\n转\n更\n单\n风\n切\n打\n白\n教\n速\n花\n带\n安\n场\n身\n车\n例\n真\n务\n具\n万\n每\n目\n至\n达\n走\n积\n示\n议\n声\n报\n斗\n完\n类\n八\n离\n华\n名\n确\n才\n科\n张\n信\n马\n节\n话\n米\n整\n空\n元\n况\n今\n集\n温\n传\n土\n许\n步\n群\n广\n石\n记\n需\n段\n研\n界\n拉\n林\n律\n叫\n且\n究\n观\n越\n织\n装\n影\n算\n低\n持\n音\n众\n书\n布\n复\n容\n儿\n须\n际\n商\n非\n验\n连\n断\n深\n难\n近\n矿\n千\n周\n委\n素\n技\n备\n半\n办\n青\n省\n列\n习\n响\n约\n支\n般\n史\n感\n劳\n便\n团\n往\n酸\n历\n市\n克\n何\n除\n消\n构\n府\n称\n太\n准\n精\n值\n号\n率\n族\n维\n划\n选\n标\n写\n存\n候\n毛\n亲\n快\n效\n斯\n院\n查\n江\n型\n眼\n王\n按\n格\n养\n易\n置\n派\n层\n片\n始\n却\n专\n状\n育\n厂\n京\n识\n适\n属\n圆\n包\n火\n住\n调\n满\n县\n局\n照\n参\n红\n细\n引\n听\n该\n铁\n价\n严\n首\n底\n液\n官\n德\n随\n病\n苏\n失\n尔\n死\n讲\n配\n女\n黄\n推\n显\n谈\n罪\n神\n艺\n呢\n席\n含\n企\n望\n密\n批\n营\n项\n防\n举\n球\n英\n氧\n势\n告\n李\n台\n落\n木\n帮\n轮\n破\n亚\n师\n围\n注\n远\n字\n材\n排\n供\n河\n态\n封\n另\n施\n减\n树\n溶\n怎\n止\n案\n言\n士\n均\n武\n固\n叶\n鱼\n波\n视\n仅\n费\n紧\n爱\n左\n章\n早\n朝\n害\n续\n轻\n服\n试\n食\n充\n兵\n源\n判\n护\n司\n足\n某\n练\n差\n致\n板\n田\n降\n黑\n犯\n负\n击\n范\n继\n兴\n似\n余\n坚\n曲\n输\n修\n故\n城\n夫\n够\n送\n笔\n船\n占\n右\n财\n吃\n富\n春\n职\n觉\n汉\n画\n功\n巴\n跟\n虽\n杂\n飞\n检\n吸\n助\n升\n阳\n互\n初\n创\n抗\n考\n投\n坏\n策\n古\n径\n换\n未\n跑\n留\n钢\n曾\n端\n责\n站\n简\n述\n钱\n副\n尽\n帝\n射\n草\n冲\n承\n独\n令\n限\n阿\n宣\n环\n双\n请\n超\n微\n让\n控\n州\n良\n轴\n找\n否\n纪\n益\n依\n优\n顶\n础\n载\n倒\n房\n突\n坐\n粉\n敌\n略\n客\n袁\n冷\n胜\n绝\n析\n块\n剂\n测\n丝\n协\n诉\n念\n陈\n仍\n罗\n盐\n友\n洋\n错\n苦\n夜\n刑\n移\n频\n逐\n靠\n混\n母\n短\n皮\n终\n聚\n汽\n村\n云\n哪\n既\n距\n卫\n停\n烈\n央\n察\n烧\n迅\n境\n若\n印\n洲\n刻\n括\n激\n孔\n搞\n甚\n室\n待\n核\n校\n散\n侵\n吧\n甲\n游\n久\n菜\n味\n旧\n模\n湖\n货\n损\n预\n阻\n毫\n普\n稳\n乙\n妈\n植\n息\n扩\n银\n语\n挥\n酒\n守\n拿\n序\n纸\n医\n缺\n雨\n吗\n针\n刘\n啊\n急\n唱\n误\n训\n愿\n审\n附\n获\n茶\n鲜\n粮\n斤\n孩\n脱\n硫\n肥\n善\n龙\n演\n父\n渐\n血\n欢\n械\n掌\n歌\n沙\n刚\n攻\n谓\n盾\n讨\n晚\n粒\n乱\n燃\n矛\n乎\n杀\n药\n宁\n鲁\n贵\n钟\n煤\n读\n班\n伯\n香\n介\n迫\n句\n丰\n培\n握\n兰\n担\n弦\n蛋\n沉\n假\n穿\n执\n答\n乐\n谁\n顺\n烟\n缩\n征\n脸\n喜\n松\n脚\n困\n异\n免\n背\n星\n福\n买\n染\n井\n概\n慢\n怕\n磁\n倍\n祖\n皇\n促\n静\n补\n评\n翻\n肉\n践\n尼\n衣\n宽\n扬\n棉\n希\n伤\n操\n垂\n秋\n宜\n氢\n套\n督\n振\n架\n亮\n末\n宪\n庆\n编\n牛\n触\n映\n雷\n销\n诗\n座\n居\n抓\n裂\n胞\n呼\n娘\n景\n威\n绿\n晶\n厚\n盟\n衡\n鸡\n孙\n延\n危\n胶\n屋\n乡\n临\n陆\n顾\n掉\n呀\n灯\n岁\n措\n束\n耐\n剧\n玉\n赵\n跳\n哥\n季\n课\n凯\n胡\n额\n款\n绍\n卷\n齐\n伟\n蒸\n殖\n永\n宗\n苗\n川\n炉\n岩\n弱\n零\n杨\n奏\n沿\n露\n杆\n探\n滑\n镇\n饭\n浓\n航\n怀\n赶\n库\n夺\n伊\n灵\n税\n途\n灭\n赛\n归\n召\n鼓\n播\n盘\n裁\n险\n康\n唯\n录\n菌\n纯\n借\n糖\n盖\n横\n符\n私\n努\n堂\n域\n枪\n润\n幅\n哈\n竟\n熟\n虫\n泽\n脑\n壤\n碳\n欧\n遍\n侧\n寨\n敢\n彻\n虑\n斜\n薄\n庭\n纳\n弹\n饲\n伸\n折\n麦\n湿\n暗\n荷\n瓦\n塞\n床\n筑\n恶\n户\n访\n塔\n奇\n透\n梁\n刀\n旋\n迹\n卡\n氯\n遇\n份\n毒\n泥\n退\n洗\n摆\n灰\n彩\n卖\n耗\n夏\n择\n忙\n铜\n献\n硬\n予\n繁\n圈\n雪\n函\n亦\n抽\n篇\n阵\n阴\n丁\n尺\n追\n堆\n雄\n迎\n泛\n爸\n楼\n避\n谋\n吨\n野\n猪\n旗\n累\n偏\n典\n馆\n索\n秦\n脂\n潮\n爷\n豆\n忽\n托\n惊\n塑\n遗\n愈\n朱\n替\n纤\n粗\n倾\n尚\n痛\n楚\n谢\n奋\n购\n磨\n君\n池\n旁\n碎\n骨\n监\n捕\n弟\n暴\n割\n贯\n殊\n释\n词\n亡\n壁\n顿\n宝\n午\n尘\n闻\n揭\n炮\n残\n冬\n桥\n妇\n警\n综\n招\n吴\n付\n浮\n遭\n徐\n您\n摇\n谷\n赞\n箱\n隔\n订\n男\n吹\n园\n纷\n唐\n败\n宋\n玻\n巨\n耕\n坦\n荣\n闭\n湾\n键\n凡\n驻\n锅\n救\n恩\n剥\n凝\n碱\n齿\n截\n炼\n麻\n纺\n禁\n废\n盛\n版\n缓\n净\n睛\n昌\n婚\n涉\n筒\n嘴\n插\n岸\n朗\n庄\n街\n藏\n姑\n贸\n腐\n奴\n啦\n惯\n乘\n伙\n恢\n匀\n纱\n扎\n辩\n耳\n彪\n臣\n亿\n璃\n抵\n脉\n秀\n萨\n俄\n网\n舞\n店\n喷\n纵\n寸\n汗\n挂\n洪\n贺\n闪\n柬\n爆\n烯\n津\n稻\n墙\n软\n勇\n像\n滚\n厘\n蒙\n芳\n肯\n坡\n柱\n荡\n腿\n仪\n旅\n尾\n轧\n冰\n贡\n登\n黎\n削\n钻\n勒\n逃\n障\n氨\n郭\n峰\n币\n港\n伏\n轨\n亩\n毕\n擦\n莫\n刺\n浪\n秘\n援\n株\n健\n售\n股\n岛\n甘\n泡\n睡\n童\n铸\n汤\n阀\n休\n汇\n舍\n牧\n绕\n炸\n哲\n磷\n绩\n朋\n淡\n尖\n启\n陷\n柴\n呈\n徒\n颜\n泪\n稍\n忘\n泵\n蓝\n拖\n洞\n授\n镜\n辛\n壮\n锋\n贫\n虚\n弯\n摩\n泰\n幼\n廷\n尊\n窗\n纲\n弄\n隶\n疑\n氏\n宫\n姐\n震\n瑞\n怪\n尤\n琴\n循\n描\n膜\n违\n夹\n腰\n缘\n珠\n穷\n森\n枝\n竹\n沟\n催\n绳\n忆\n邦\n剩\n幸\n浆\n栏\n拥\n牙\n贮\n礼\n滤\n钠\n纹\n罢\n拍\n咱\n喊\n袖\n埃\n勤\n罚\n焦\n潜\n伍\n墨\n欲\n缝\n姓\n刊\n饱\n仿\n奖\n铝\n鬼\n丽\n跨\n默\n挖\n链\n扫\n喝\n袋\n炭\n污\n幕\n诸\n弧\n励\n梅\n奶\n洁\n灾\n舟\n鉴\n苯\n讼\n抱\n毁\n懂\n寒\n智\n埔\n寄\n届\n跃\n渡\n挑\n丹\n艰\n贝\n碰\n拔\n爹\n戴\n码\n梦\n芽\n熔\n赤\n渔\n哭\n敬\n颗\n奔\n铅\n仲\n虎\n稀\n妹\n乏\n珍\n申\n桌\n遵\n允\n隆\n螺\n仓\n魏\n锐\n晓\n氮\n兼\n隐\n碍\n赫\n拨\n忠\n肃\n缸\n牵\n抢\n博\n巧\n壳\n兄\n杜\n讯\n诚\n碧\n祥\n柯\n页\n巡\n矩\n悲\n灌\n龄\n伦\n票\n寻\n桂\n铺\n圣\n恐\n恰\n郑\n趣\n抬\n荒\n腾\n贴\n柔\n滴\n猛\n阔\n辆\n妻\n填\n撤\n储\n签\n闹\n扰\n紫\n砂\n递\n戏\n吊\n陶\n伐\n喂\n疗\n瓶\n婆\n抚\n臂\n摸\n忍\n虾\n蜡\n邻\n胸\n巩\n挤\n偶\n弃\n槽\n劲\n乳\n邓\n吉\n仁\n烂\n砖\n租\n乌\n舰\n伴\n瓜\n浅\n丙\n暂\n燥\n橡\n柳\n迷\n暖\n牌\n秧\n胆\n详\n簧\n踏\n瓷\n谱\n呆\n宾\n糊\n洛\n辉\n愤\n竞\n隙\n怒\n粘\n乃\n绪\n肩\n籍\n敏\n涂\n熙\n皆\n侦\n悬\n掘\n享\n纠\n醒\n狂\n锁\n淀\n恨\n牲\n霸\n爬\n赏\n逆\n玩\n陵\n祝\n秒\n浙\n貌\n役\n彼\n悉\n鸭\n趋\n凤\n晨\n畜\n辈\n秩\n卵\n署\n梯\n炎\n滩\n棋\n驱\n筛\n峡\n冒\n啥\n寿\n译\n浸\n泉\n帽\n迟\n硅\n疆\n贷\n漏\n稿\n冠\n嫩\n胁\n芯\n牢\n叛\n蚀\n奥\n鸣\n岭\n羊\n凭\n串\n塘\n绘\n酵\n融\n盆\n锡\n庙\n筹\n冻\n辅\n摄\n袭\n筋\n拒\n僚\n旱\n钾\n鸟\n漆\n沈\n眉\n疏\n添\n棒\n穗\n硝\n韩\n逼\n扭\n侨\n凉\n挺\n碗\n栽\n炒\n杯\n患\n馏\n劝\n豪\n辽\n勃\n鸿\n旦\n吏\n拜\n狗\n埋\n辊\n掩\n饮\n搬\n骂\n辞\n勾\n扣\n估\n蒋\n绒\n雾\n丈\n朵\n姆\n拟\n宇\n辑\n陕\n雕\n偿\n蓄\n崇\n剪\n倡\n厅\n咬\n驶\n薯\n刷\n斥\n番\n赋\n奉\n佛\n浇\n漫\n曼\n扇\n钙\n桃\n扶\n仔\n返\n俗\n亏\n腔\n鞋\n棱\n覆\n框\n悄\n叔\n撞\n骗\n勘\n旺\n沸\n孤\n吐\n孟\n渠\n屈\n疾\n妙\n惜\n仰\n狠\n胀\n谐\n抛\n霉\n桑\n岗\n嘛\n衰\n盗\n渗\n脏\n赖\n涌\n甜\n曹\n阅\n肌\n哩\n厉\n烃\n纬\n毅\n昨\n伪\n症\n煮\n叹\n钉\n搭\n茎\n笼\n酷\n偷\n弓\n锥\n恒\n杰\n坑\n鼻\n翼\n纶\n叙\n狱\n逮\n罐\n络\n棚\n抑\n膨\n蔬\n寺\n骤\n穆\n冶\n枯\n册\n尸\n凸\n绅\n坯\n牺\n焰\n轰\n欣\n晋\n瘦\n御\n锭\n锦\n丧\n旬\n锻\n垄\n搜\n扑\n邀\n亭\n酯\n迈\n舒\n脆\n酶\n闲\n忧\n酚\n顽\n羽\n涨\n卸\n仗\n陪\n辟\n惩\n杭\n姚\n肚\n捉\n飘\n漂\n昆\n欺\n吾\n郎\n烷\n汁\n呵\n饰\n萧\n雅\n邮\n迁\n燕\n撒\n姻\n赴\n宴\n烦\n债\n帐\n斑\n铃\n旨\n醇\n董\n饼\n雏\n姿\n拌\n傅\n腹\n妥\n揉\n贤\n拆\n歪\n葡\n胺\n丢\n浩\n徽\n昂\n垫\n挡\n览\n贪\n慰\n缴\n汪\n慌\n冯\n诺\n姜\n谊\n凶\n劣\n诬\n耀\n昏\n躺\n盈\n骑\n乔\n溪\n丛\n卢\n抹\n闷\n咨\n刮\n驾\n缆\n悟\n摘\n铒\n掷\n颇\n幻\n柄\n惠\n惨\n佳\n仇\n腊\n窝\n涤\n剑\n瞧\n堡\n泼\n葱\n罩\n霍\n捞\n胎\n苍\n滨\n俩\n捅\n湘\n砍\n霞\n邵\n萄\n疯\n淮\n遂\n熊\n粪\n烘\n宿\n档\n戈\n驳\n嫂\n裕\n徙\n箭\n捐\n肠\n撑\n晒\n辨\n殿\n莲\n摊\n搅\n酱\n屏\n疫\n哀\n蔡\n堵\n沫\n皱\n畅\n叠\n阁\n莱\n敲\n辖\n钩\n痕\n坝\n巷\n饿\n祸\n丘\n玄\n溜\n曰\n逻\n彭\n尝\n卿\n妨\n艇\n吞\n韦\n怨\n矮\n歇\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/chinese_traditional.txt",
    "content": "的\n一\n是\n在\n不\n了\n有\n和\n人\n這\n中\n大\n為\n上\n個\n國\n我\n以\n要\n他\n時\n來\n用\n們\n生\n到\n作\n地\n於\n出\n就\n分\n對\n成\n會\n可\n主\n發\n年\n動\n同\n工\n也\n能\n下\n過\n子\n說\n產\n種\n面\n而\n方\n後\n多\n定\n行\n學\n法\n所\n民\n得\n經\n十\n三\n之\n進\n著\n等\n部\n度\n家\n電\n力\n裡\n如\n水\n化\n高\n自\n二\n理\n起\n小\n物\n現\n實\n加\n量\n都\n兩\n體\n制\n機\n當\n使\n點\n從\n業\n本\n去\n把\n性\n好\n應\n開\n它\n合\n還\n因\n由\n其\n些\n然\n前\n外\n天\n政\n四\n日\n那\n社\n義\n事\n平\n形\n相\n全\n表\n間\n樣\n與\n關\n各\n重\n新\n線\n內\n數\n正\n心\n反\n你\n明\n看\n原\n又\n麼\n利\n比\n或\n但\n質\n氣\n第\n向\n道\n命\n此\n變\n條\n只\n沒\n結\n解\n問\n意\n建\n月\n公\n無\n系\n軍\n很\n情\n者\n最\n立\n代\n想\n已\n通\n並\n提\n直\n題\n黨\n程\n展\n五\n果\n料\n象\n員\n革\n位\n入\n常\n文\n總\n次\n品\n式\n活\n設\n及\n管\n特\n件\n長\n求\n老\n頭\n基\n資\n邊\n流\n路\n級\n少\n圖\n山\n統\n接\n知\n較\n將\n組\n見\n計\n別\n她\n手\n角\n期\n根\n論\n運\n農\n指\n幾\n九\n區\n強\n放\n決\n西\n被\n幹\n做\n必\n戰\n先\n回\n則\n任\n取\n據\n處\n隊\n南\n給\n色\n光\n門\n即\n保\n治\n北\n造\n百\n規\n熱\n領\n七\n海\n口\n東\n導\n器\n壓\n志\n世\n金\n增\n爭\n濟\n階\n油\n思\n術\n極\n交\n受\n聯\n什\n認\n六\n共\n權\n收\n證\n改\n清\n美\n再\n採\n轉\n更\n單\n風\n切\n打\n白\n教\n速\n花\n帶\n安\n場\n身\n車\n例\n真\n務\n具\n萬\n每\n目\n至\n達\n走\n積\n示\n議\n聲\n報\n鬥\n完\n類\n八\n離\n華\n名\n確\n才\n科\n張\n信\n馬\n節\n話\n米\n整\n空\n元\n況\n今\n集\n溫\n傳\n土\n許\n步\n群\n廣\n石\n記\n需\n段\n研\n界\n拉\n林\n律\n叫\n且\n究\n觀\n越\n織\n裝\n影\n算\n低\n持\n音\n眾\n書\n布\n复\n容\n兒\n須\n際\n商\n非\n驗\n連\n斷\n深\n難\n近\n礦\n千\n週\n委\n素\n技\n備\n半\n辦\n青\n省\n列\n習\n響\n約\n支\n般\n史\n感\n勞\n便\n團\n往\n酸\n歷\n市\n克\n何\n除\n消\n構\n府\n稱\n太\n準\n精\n值\n號\n率\n族\n維\n劃\n選\n標\n寫\n存\n候\n毛\n親\n快\n效\n斯\n院\n查\n江\n型\n眼\n王\n按\n格\n養\n易\n置\n派\n層\n片\n始\n卻\n專\n狀\n育\n廠\n京\n識\n適\n屬\n圓\n包\n火\n住\n調\n滿\n縣\n局\n照\n參\n紅\n細\n引\n聽\n該\n鐵\n價\n嚴\n首\n底\n液\n官\n德\n隨\n病\n蘇\n失\n爾\n死\n講\n配\n女\n黃\n推\n顯\n談\n罪\n神\n藝\n呢\n席\n含\n企\n望\n密\n批\n營\n項\n防\n舉\n球\n英\n氧\n勢\n告\n李\n台\n落\n木\n幫\n輪\n破\n亞\n師\n圍\n注\n遠\n字\n材\n排\n供\n河\n態\n封\n另\n施\n減\n樹\n溶\n怎\n止\n案\n言\n士\n均\n武\n固\n葉\n魚\n波\n視\n僅\n費\n緊\n愛\n左\n章\n早\n朝\n害\n續\n輕\n服\n試\n食\n充\n兵\n源\n判\n護\n司\n足\n某\n練\n差\n致\n板\n田\n降\n黑\n犯\n負\n擊\n范\n繼\n興\n似\n餘\n堅\n曲\n輸\n修\n故\n城\n夫\n夠\n送\n筆\n船\n佔\n右\n財\n吃\n富\n春\n職\n覺\n漢\n畫\n功\n巴\n跟\n雖\n雜\n飛\n檢\n吸\n助\n昇\n陽\n互\n初\n創\n抗\n考\n投\n壞\n策\n古\n徑\n換\n未\n跑\n留\n鋼\n曾\n端\n責\n站\n簡\n述\n錢\n副\n盡\n帝\n射\n草\n衝\n承\n獨\n令\n限\n阿\n宣\n環\n雙\n請\n超\n微\n讓\n控\n州\n良\n軸\n找\n否\n紀\n益\n依\n優\n頂\n礎\n載\n倒\n房\n突\n坐\n粉\n敵\n略\n客\n袁\n冷\n勝\n絕\n析\n塊\n劑\n測\n絲\n協\n訴\n念\n陳\n仍\n羅\n鹽\n友\n洋\n錯\n苦\n夜\n刑\n移\n頻\n逐\n靠\n混\n母\n短\n皮\n終\n聚\n汽\n村\n雲\n哪\n既\n距\n衛\n停\n烈\n央\n察\n燒\n迅\n境\n若\n印\n洲\n刻\n括\n激\n孔\n搞\n甚\n室\n待\n核\n校\n散\n侵\n吧\n甲\n遊\n久\n菜\n味\n舊\n模\n湖\n貨\n損\n預\n阻\n毫\n普\n穩\n乙\n媽\n植\n息\n擴\n銀\n語\n揮\n酒\n守\n拿\n序\n紙\n醫\n缺\n雨\n嗎\n針\n劉\n啊\n急\n唱\n誤\n訓\n願\n審\n附\n獲\n茶\n鮮\n糧\n斤\n孩\n脫\n硫\n肥\n善\n龍\n演\n父\n漸\n血\n歡\n械\n掌\n歌\n沙\n剛\n攻\n謂\n盾\n討\n晚\n粒\n亂\n燃\n矛\n乎\n殺\n藥\n寧\n魯\n貴\n鐘\n煤\n讀\n班\n伯\n香\n介\n迫\n句\n豐\n培\n握\n蘭\n擔\n弦\n蛋\n沉\n假\n穿\n執\n答\n樂\n誰\n順\n煙\n縮\n徵\n臉\n喜\n松\n腳\n困\n異\n免\n背\n星\n福\n買\n染\n井\n概\n慢\n怕\n磁\n倍\n祖\n皇\n促\n靜\n補\n評\n翻\n肉\n踐\n尼\n衣\n寬\n揚\n棉\n希\n傷\n操\n垂\n秋\n宜\n氫\n套\n督\n振\n架\n亮\n末\n憲\n慶\n編\n牛\n觸\n映\n雷\n銷\n詩\n座\n居\n抓\n裂\n胞\n呼\n娘\n景\n威\n綠\n晶\n厚\n盟\n衡\n雞\n孫\n延\n危\n膠\n屋\n鄉\n臨\n陸\n顧\n掉\n呀\n燈\n歲\n措\n束\n耐\n劇\n玉\n趙\n跳\n哥\n季\n課\n凱\n胡\n額\n款\n紹\n卷\n齊\n偉\n蒸\n殖\n永\n宗\n苗\n川\n爐\n岩\n弱\n零\n楊\n奏\n沿\n露\n桿\n探\n滑\n鎮\n飯\n濃\n航\n懷\n趕\n庫\n奪\n伊\n靈\n稅\n途\n滅\n賽\n歸\n召\n鼓\n播\n盤\n裁\n險\n康\n唯\n錄\n菌\n純\n借\n糖\n蓋\n橫\n符\n私\n努\n堂\n域\n槍\n潤\n幅\n哈\n竟\n熟\n蟲\n澤\n腦\n壤\n碳\n歐\n遍\n側\n寨\n敢\n徹\n慮\n斜\n薄\n庭\n納\n彈\n飼\n伸\n折\n麥\n濕\n暗\n荷\n瓦\n塞\n床\n築\n惡\n戶\n訪\n塔\n奇\n透\n梁\n刀\n旋\n跡\n卡\n氯\n遇\n份\n毒\n泥\n退\n洗\n擺\n灰\n彩\n賣\n耗\n夏\n擇\n忙\n銅\n獻\n硬\n予\n繁\n圈\n雪\n函\n亦\n抽\n篇\n陣\n陰\n丁\n尺\n追\n堆\n雄\n迎\n泛\n爸\n樓\n避\n謀\n噸\n野\n豬\n旗\n累\n偏\n典\n館\n索\n秦\n脂\n潮\n爺\n豆\n忽\n托\n驚\n塑\n遺\n愈\n朱\n替\n纖\n粗\n傾\n尚\n痛\n楚\n謝\n奮\n購\n磨\n君\n池\n旁\n碎\n骨\n監\n捕\n弟\n暴\n割\n貫\n殊\n釋\n詞\n亡\n壁\n頓\n寶\n午\n塵\n聞\n揭\n炮\n殘\n冬\n橋\n婦\n警\n綜\n招\n吳\n付\n浮\n遭\n徐\n您\n搖\n谷\n贊\n箱\n隔\n訂\n男\n吹\n園\n紛\n唐\n敗\n宋\n玻\n巨\n耕\n坦\n榮\n閉\n灣\n鍵\n凡\n駐\n鍋\n救\n恩\n剝\n凝\n鹼\n齒\n截\n煉\n麻\n紡\n禁\n廢\n盛\n版\n緩\n淨\n睛\n昌\n婚\n涉\n筒\n嘴\n插\n岸\n朗\n莊\n街\n藏\n姑\n貿\n腐\n奴\n啦\n慣\n乘\n夥\n恢\n勻\n紗\n扎\n辯\n耳\n彪\n臣\n億\n璃\n抵\n脈\n秀\n薩\n俄\n網\n舞\n店\n噴\n縱\n寸\n汗\n掛\n洪\n賀\n閃\n柬\n爆\n烯\n津\n稻\n牆\n軟\n勇\n像\n滾\n厘\n蒙\n芳\n肯\n坡\n柱\n盪\n腿\n儀\n旅\n尾\n軋\n冰\n貢\n登\n黎\n削\n鑽\n勒\n逃\n障\n氨\n郭\n峰\n幣\n港\n伏\n軌\n畝\n畢\n擦\n莫\n刺\n浪\n秘\n援\n株\n健\n售\n股\n島\n甘\n泡\n睡\n童\n鑄\n湯\n閥\n休\n匯\n舍\n牧\n繞\n炸\n哲\n磷\n績\n朋\n淡\n尖\n啟\n陷\n柴\n呈\n徒\n顏\n淚\n稍\n忘\n泵\n藍\n拖\n洞\n授\n鏡\n辛\n壯\n鋒\n貧\n虛\n彎\n摩\n泰\n幼\n廷\n尊\n窗\n綱\n弄\n隸\n疑\n氏\n宮\n姐\n震\n瑞\n怪\n尤\n琴\n循\n描\n膜\n違\n夾\n腰\n緣\n珠\n窮\n森\n枝\n竹\n溝\n催\n繩\n憶\n邦\n剩\n幸\n漿\n欄\n擁\n牙\n貯\n禮\n濾\n鈉\n紋\n罷\n拍\n咱\n喊\n袖\n埃\n勤\n罰\n焦\n潛\n伍\n墨\n欲\n縫\n姓\n刊\n飽\n仿\n獎\n鋁\n鬼\n麗\n跨\n默\n挖\n鏈\n掃\n喝\n袋\n炭\n污\n幕\n諸\n弧\n勵\n梅\n奶\n潔\n災\n舟\n鑑\n苯\n訟\n抱\n毀\n懂\n寒\n智\n埔\n寄\n屆\n躍\n渡\n挑\n丹\n艱\n貝\n碰\n拔\n爹\n戴\n碼\n夢\n芽\n熔\n赤\n漁\n哭\n敬\n顆\n奔\n鉛\n仲\n虎\n稀\n妹\n乏\n珍\n申\n桌\n遵\n允\n隆\n螺\n倉\n魏\n銳\n曉\n氮\n兼\n隱\n礙\n赫\n撥\n忠\n肅\n缸\n牽\n搶\n博\n巧\n殼\n兄\n杜\n訊\n誠\n碧\n祥\n柯\n頁\n巡\n矩\n悲\n灌\n齡\n倫\n票\n尋\n桂\n鋪\n聖\n恐\n恰\n鄭\n趣\n抬\n荒\n騰\n貼\n柔\n滴\n猛\n闊\n輛\n妻\n填\n撤\n儲\n簽\n鬧\n擾\n紫\n砂\n遞\n戲\n吊\n陶\n伐\n餵\n療\n瓶\n婆\n撫\n臂\n摸\n忍\n蝦\n蠟\n鄰\n胸\n鞏\n擠\n偶\n棄\n槽\n勁\n乳\n鄧\n吉\n仁\n爛\n磚\n租\n烏\n艦\n伴\n瓜\n淺\n丙\n暫\n燥\n橡\n柳\n迷\n暖\n牌\n秧\n膽\n詳\n簧\n踏\n瓷\n譜\n呆\n賓\n糊\n洛\n輝\n憤\n競\n隙\n怒\n粘\n乃\n緒\n肩\n籍\n敏\n塗\n熙\n皆\n偵\n懸\n掘\n享\n糾\n醒\n狂\n鎖\n淀\n恨\n牲\n霸\n爬\n賞\n逆\n玩\n陵\n祝\n秒\n浙\n貌\n役\n彼\n悉\n鴨\n趨\n鳳\n晨\n畜\n輩\n秩\n卵\n署\n梯\n炎\n灘\n棋\n驅\n篩\n峽\n冒\n啥\n壽\n譯\n浸\n泉\n帽\n遲\n矽\n疆\n貸\n漏\n稿\n冠\n嫩\n脅\n芯\n牢\n叛\n蝕\n奧\n鳴\n嶺\n羊\n憑\n串\n塘\n繪\n酵\n融\n盆\n錫\n廟\n籌\n凍\n輔\n攝\n襲\n筋\n拒\n僚\n旱\n鉀\n鳥\n漆\n沈\n眉\n疏\n添\n棒\n穗\n硝\n韓\n逼\n扭\n僑\n涼\n挺\n碗\n栽\n炒\n杯\n患\n餾\n勸\n豪\n遼\n勃\n鴻\n旦\n吏\n拜\n狗\n埋\n輥\n掩\n飲\n搬\n罵\n辭\n勾\n扣\n估\n蔣\n絨\n霧\n丈\n朵\n姆\n擬\n宇\n輯\n陝\n雕\n償\n蓄\n崇\n剪\n倡\n廳\n咬\n駛\n薯\n刷\n斥\n番\n賦\n奉\n佛\n澆\n漫\n曼\n扇\n鈣\n桃\n扶\n仔\n返\n俗\n虧\n腔\n鞋\n棱\n覆\n框\n悄\n叔\n撞\n騙\n勘\n旺\n沸\n孤\n吐\n孟\n渠\n屈\n疾\n妙\n惜\n仰\n狠\n脹\n諧\n拋\n黴\n桑\n崗\n嘛\n衰\n盜\n滲\n臟\n賴\n湧\n甜\n曹\n閱\n肌\n哩\n厲\n烴\n緯\n毅\n昨\n偽\n症\n煮\n嘆\n釘\n搭\n莖\n籠\n酷\n偷\n弓\n錐\n恆\n傑\n坑\n鼻\n翼\n綸\n敘\n獄\n逮\n罐\n絡\n棚\n抑\n膨\n蔬\n寺\n驟\n穆\n冶\n枯\n冊\n屍\n凸\n紳\n坯\n犧\n焰\n轟\n欣\n晉\n瘦\n禦\n錠\n錦\n喪\n旬\n鍛\n壟\n搜\n撲\n邀\n亭\n酯\n邁\n舒\n脆\n酶\n閒\n憂\n酚\n頑\n羽\n漲\n卸\n仗\n陪\n闢\n懲\n杭\n姚\n肚\n捉\n飄\n漂\n昆\n欺\n吾\n郎\n烷\n汁\n呵\n飾\n蕭\n雅\n郵\n遷\n燕\n撒\n姻\n赴\n宴\n煩\n債\n帳\n斑\n鈴\n旨\n醇\n董\n餅\n雛\n姿\n拌\n傅\n腹\n妥\n揉\n賢\n拆\n歪\n葡\n胺\n丟\n浩\n徽\n昂\n墊\n擋\n覽\n貪\n慰\n繳\n汪\n慌\n馮\n諾\n姜\n誼\n兇\n劣\n誣\n耀\n昏\n躺\n盈\n騎\n喬\n溪\n叢\n盧\n抹\n悶\n諮\n刮\n駕\n纜\n悟\n摘\n鉺\n擲\n頗\n幻\n柄\n惠\n慘\n佳\n仇\n臘\n窩\n滌\n劍\n瞧\n堡\n潑\n蔥\n罩\n霍\n撈\n胎\n蒼\n濱\n倆\n捅\n湘\n砍\n霞\n邵\n萄\n瘋\n淮\n遂\n熊\n糞\n烘\n宿\n檔\n戈\n駁\n嫂\n裕\n徙\n箭\n捐\n腸\n撐\n曬\n辨\n殿\n蓮\n攤\n攪\n醬\n屏\n疫\n哀\n蔡\n堵\n沫\n皺\n暢\n疊\n閣\n萊\n敲\n轄\n鉤\n痕\n壩\n巷\n餓\n禍\n丘\n玄\n溜\n曰\n邏\n彭\n嘗\n卿\n妨\n艇\n吞\n韋\n怨\n矮\n歇\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/english.txt",
    "content": "abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/french.txt",
    "content": "abaisser\nabandon\nabdiquer\nabeille\nabolir\naborder\naboutir\naboyer\nabrasif\nabreuver\nabriter\nabroger\nabrupt\nabsence\nabsolu\nabsurde\nabusif\nabyssal\nacadémie\nacajou\nacarien\naccabler\naccepter\nacclamer\naccolade\naccroche\naccuser\nacerbe\nachat\nacheter\naciduler\nacier\nacompte\nacquérir\nacronyme\nacteur\nactif\nactuel\nadepte\nadéquat\nadhésif\nadjectif\nadjuger\nadmettre\nadmirer\nadopter\nadorer\nadoucir\nadresse\nadroit\nadulte\nadverbe\naérer\naéronef\naffaire\naffecter\naffiche\naffreux\naffubler\nagacer\nagencer\nagile\nagiter\nagrafer\nagréable\nagrume\naider\naiguille\nailier\naimable\naisance\najouter\najuster\nalarmer\nalchimie\nalerte\nalgèbre\nalgue\naliéner\naliment\nalléger\nalliage\nallouer\nallumer\nalourdir\nalpaga\naltesse\nalvéole\namateur\nambigu\nambre\naménager\namertume\namidon\namiral\namorcer\namour\namovible\namphibie\nampleur\namusant\nanalyse\nanaphore\nanarchie\nanatomie\nancien\nanéantir\nangle\nangoisse\nanguleux\nanimal\nannexer\nannonce\nannuel\nanodin\nanomalie\nanonyme\nanormal\nantenne\nantidote\nanxieux\napaiser\napéritif\naplanir\napologie\nappareil\nappeler\napporter\nappuyer\naquarium\naqueduc\narbitre\narbuste\nardeur\nardoise\nargent\narlequin\narmature\narmement\narmoire\narmure\narpenter\narracher\narriver\narroser\narsenic\nartériel\narticle\naspect\nasphalte\naspirer\nassaut\nasservir\nassiette\nassocier\nassurer\nasticot\nastre\nastuce\natelier\natome\natrium\natroce\nattaque\nattentif\nattirer\nattraper\naubaine\nauberge\naudace\naudible\naugurer\naurore\nautomne\nautruche\navaler\navancer\navarice\navenir\naverse\naveugle\naviateur\navide\navion\naviser\navoine\navouer\navril\naxial\naxiome\nbadge\nbafouer\nbagage\nbaguette\nbaignade\nbalancer\nbalcon\nbaleine\nbalisage\nbambin\nbancaire\nbandage\nbanlieue\nbannière\nbanquier\nbarbier\nbaril\nbaron\nbarque\nbarrage\nbassin\nbastion\nbataille\nbateau\nbatterie\nbaudrier\nbavarder\nbelette\nbélier\nbelote\nbénéfice\nberceau\nberger\nberline\nbermuda\nbesace\nbesogne\nbétail\nbeurre\nbiberon\nbicycle\nbidule\nbijou\nbilan\nbilingue\nbillard\nbinaire\nbiologie\nbiopsie\nbiotype\nbiscuit\nbison\nbistouri\nbitume\nbizarre\nblafard\nblague\nblanchir\nblessant\nblinder\nblond\nbloquer\nblouson\nbobard\nbobine\nboire\nboiser\nbolide\nbonbon\nbondir\nbonheur\nbonifier\nbonus\nbordure\nborne\nbotte\nboucle\nboueux\nbougie\nboulon\nbouquin\nbourse\nboussole\nboutique\nboxeur\nbranche\nbrasier\nbrave\nbrebis\nbrèche\nbreuvage\nbricoler\nbrigade\nbrillant\nbrioche\nbrique\nbrochure\nbroder\nbronzer\nbrousse\nbroyeur\nbrume\nbrusque\nbrutal\nbruyant\nbuffle\nbuisson\nbulletin\nbureau\nburin\nbustier\nbutiner\nbutoir\nbuvable\nbuvette\ncabanon\ncabine\ncachette\ncadeau\ncadre\ncaféine\ncaillou\ncaisson\ncalculer\ncalepin\ncalibre\ncalmer\ncalomnie\ncalvaire\ncamarade\ncaméra\ncamion\ncampagne\ncanal\ncaneton\ncanon\ncantine\ncanular\ncapable\ncaporal\ncaprice\ncapsule\ncapter\ncapuche\ncarabine\ncarbone\ncaresser\ncaribou\ncarnage\ncarotte\ncarreau\ncarton\ncascade\ncasier\ncasque\ncassure\ncauser\ncaution\ncavalier\ncaverne\ncaviar\ncédille\nceinture\ncéleste\ncellule\ncendrier\ncensurer\ncentral\ncercle\ncérébral\ncerise\ncerner\ncerveau\ncesser\nchagrin\nchaise\nchaleur\nchambre\nchance\nchapitre\ncharbon\nchasseur\nchaton\nchausson\nchavirer\nchemise\nchenille\nchéquier\nchercher\ncheval\nchien\nchiffre\nchignon\nchimère\nchiot\nchlorure\nchocolat\nchoisir\nchose\nchouette\nchrome\nchute\ncigare\ncigogne\ncimenter\ncinéma\ncintrer\ncirculer\ncirer\ncirque\nciterne\ncitoyen\ncitron\ncivil\nclairon\nclameur\nclaquer\nclasse\nclavier\nclient\ncligner\nclimat\nclivage\ncloche\nclonage\ncloporte\ncobalt\ncobra\ncocasse\ncocotier\ncoder\ncodifier\ncoffre\ncogner\ncohésion\ncoiffer\ncoincer\ncolère\ncolibri\ncolline\ncolmater\ncolonel\ncombat\ncomédie\ncommande\ncompact\nconcert\nconduire\nconfier\ncongeler\nconnoter\nconsonne\ncontact\nconvexe\ncopain\ncopie\ncorail\ncorbeau\ncordage\ncorniche\ncorpus\ncorrect\ncortège\ncosmique\ncostume\ncoton\ncoude\ncoupure\ncourage\ncouteau\ncouvrir\ncoyote\ncrabe\ncrainte\ncravate\ncrayon\ncréature\ncréditer\ncrémeux\ncreuser\ncrevette\ncribler\ncrier\ncristal\ncritère\ncroire\ncroquer\ncrotale\ncrucial\ncruel\ncrypter\ncubique\ncueillir\ncuillère\ncuisine\ncuivre\nculminer\ncultiver\ncumuler\ncupide\ncuratif\ncurseur\ncyanure\ncycle\ncylindre\ncynique\ndaigner\ndamier\ndanger\ndanseur\ndauphin\ndébattre\ndébiter\ndéborder\ndébrider\ndébutant\ndécaler\ndécembre\ndéchirer\ndécider\ndéclarer\ndécorer\ndécrire\ndécupler\ndédale\ndéductif\ndéesse\ndéfensif\ndéfiler\ndéfrayer\ndégager\ndégivrer\ndéglutir\ndégrafer\ndéjeuner\ndélice\ndéloger\ndemander\ndemeurer\ndémolir\ndénicher\ndénouer\ndentelle\ndénuder\ndépart\ndépenser\ndéphaser\ndéplacer\ndéposer\ndéranger\ndérober\ndésastre\ndescente\ndésert\ndésigner\ndésobéir\ndessiner\ndestrier\ndétacher\ndétester\ndétourer\ndétresse\ndevancer\ndevenir\ndeviner\ndevoir\ndiable\ndialogue\ndiamant\ndicter\ndifférer\ndigérer\ndigital\ndigne\ndiluer\ndimanche\ndiminuer\ndioxyde\ndirectif\ndiriger\ndiscuter\ndisposer\ndissiper\ndistance\ndivertir\ndiviser\ndocile\ndocteur\ndogme\ndoigt\ndomaine\ndomicile\ndompter\ndonateur\ndonjon\ndonner\ndopamine\ndortoir\ndorure\ndosage\ndoseur\ndossier\ndotation\ndouanier\ndouble\ndouceur\ndouter\ndoyen\ndragon\ndraper\ndresser\ndribbler\ndroiture\nduperie\nduplexe\ndurable\ndurcir\ndynastie\néblouir\nécarter\nécharpe\néchelle\néclairer\néclipse\néclore\nécluse\nécole\néconomie\nécorce\nécouter\nécraser\nécrémer\nécrivain\nécrou\nécume\nécureuil\nédifier\néduquer\neffacer\neffectif\neffigie\neffort\neffrayer\neffusion\négaliser\négarer\néjecter\nélaborer\nélargir\nélectron\nélégant\néléphant\nélève\néligible\nélitisme\néloge\nélucider\néluder\nemballer\nembellir\nembryon\némeraude\némission\nemmener\némotion\némouvoir\nempereur\nemployer\nemporter\nemprise\némulsion\nencadrer\nenchère\nenclave\nencoche\nendiguer\nendosser\nendroit\nenduire\nénergie\nenfance\nenfermer\nenfouir\nengager\nengin\nenglober\nénigme\nenjamber\nenjeu\nenlever\nennemi\nennuyeux\nenrichir\nenrobage\nenseigne\nentasser\nentendre\nentier\nentourer\nentraver\nénumérer\nenvahir\nenviable\nenvoyer\nenzyme\néolien\népaissir\népargne\népatant\népaule\népicerie\népidémie\népier\népilogue\népine\népisode\népitaphe\népoque\népreuve\néprouver\népuisant\néquerre\néquipe\nériger\nérosion\nerreur\néruption\nescalier\nespadon\nespèce\nespiègle\nespoir\nesprit\nesquiver\nessayer\nessence\nessieu\nessorer\nestime\nestomac\nestrade\nétagère\nétaler\nétanche\nétatique\néteindre\nétendoir\néternel\néthanol\néthique\nethnie\nétirer\nétoffer\nétoile\nétonnant\nétourdir\nétrange\nétroit\nétude\neuphorie\névaluer\névasion\néventail\névidence\néviter\névolutif\névoquer\nexact\nexagérer\nexaucer\nexceller\nexcitant\nexclusif\nexcuse\nexécuter\nexemple\nexercer\nexhaler\nexhorter\nexigence\nexiler\nexister\nexotique\nexpédier\nexplorer\nexposer\nexprimer\nexquis\nextensif\nextraire\nexulter\nfable\nfabuleux\nfacette\nfacile\nfacture\nfaiblir\nfalaise\nfameux\nfamille\nfarceur\nfarfelu\nfarine\nfarouche\nfasciner\nfatal\nfatigue\nfaucon\nfautif\nfaveur\nfavori\nfébrile\nféconder\nfédérer\nfélin\nfemme\nfémur\nfendoir\nféodal\nfermer\nféroce\nferveur\nfestival\nfeuille\nfeutre\nfévrier\nfiasco\nficeler\nfictif\nfidèle\nfigure\nfilature\nfiletage\nfilière\nfilleul\nfilmer\nfilou\nfiltrer\nfinancer\nfinir\nfiole\nfirme\nfissure\nfixer\nflairer\nflamme\nflasque\nflatteur\nfléau\nflèche\nfleur\nflexion\nflocon\nflore\nfluctuer\nfluide\nfluvial\nfolie\nfonderie\nfongible\nfontaine\nforcer\nforgeron\nformuler\nfortune\nfossile\nfoudre\nfougère\nfouiller\nfoulure\nfourmi\nfragile\nfraise\nfranchir\nfrapper\nfrayeur\nfrégate\nfreiner\nfrelon\nfrémir\nfrénésie\nfrère\nfriable\nfriction\nfrisson\nfrivole\nfroid\nfromage\nfrontal\nfrotter\nfruit\nfugitif\nfuite\nfureur\nfurieux\nfurtif\nfusion\nfutur\ngagner\ngalaxie\ngalerie\ngambader\ngarantir\ngardien\ngarnir\ngarrigue\ngazelle\ngazon\ngéant\ngélatine\ngélule\ngendarme\ngénéral\ngénie\ngenou\ngentil\ngéologie\ngéomètre\ngéranium\ngerme\ngestuel\ngeyser\ngibier\ngicler\ngirafe\ngivre\nglace\nglaive\nglisser\nglobe\ngloire\nglorieux\ngolfeur\ngomme\ngonfler\ngorge\ngorille\ngoudron\ngouffre\ngoulot\ngoupille\ngourmand\ngoutte\ngraduel\ngraffiti\ngraine\ngrand\ngrappin\ngratuit\ngravir\ngrenat\ngriffure\ngriller\ngrimper\ngrogner\ngronder\ngrotte\ngroupe\ngruger\ngrutier\ngruyère\nguépard\nguerrier\nguide\nguimauve\nguitare\ngustatif\ngymnaste\ngyrostat\nhabitude\nhachoir\nhalte\nhameau\nhangar\nhanneton\nharicot\nharmonie\nharpon\nhasard\nhélium\nhématome\nherbe\nhérisson\nhermine\nhéron\nhésiter\nheureux\nhiberner\nhibou\nhilarant\nhistoire\nhiver\nhomard\nhommage\nhomogène\nhonneur\nhonorer\nhonteux\nhorde\nhorizon\nhorloge\nhormone\nhorrible\nhouleux\nhousse\nhublot\nhuileux\nhumain\nhumble\nhumide\nhumour\nhurler\nhydromel\nhygiène\nhymne\nhypnose\nidylle\nignorer\niguane\nillicite\nillusion\nimage\nimbiber\nimiter\nimmense\nimmobile\nimmuable\nimpact\nimpérial\nimplorer\nimposer\nimprimer\nimputer\nincarner\nincendie\nincident\nincliner\nincolore\nindexer\nindice\ninductif\ninédit\nineptie\ninexact\ninfini\ninfliger\ninformer\ninfusion\ningérer\ninhaler\ninhiber\ninjecter\ninjure\ninnocent\ninoculer\ninonder\ninscrire\ninsecte\ninsigne\ninsolite\ninspirer\ninstinct\ninsulter\nintact\nintense\nintime\nintrigue\nintuitif\ninutile\ninvasion\ninventer\ninviter\ninvoquer\nironique\nirradier\nirréel\nirriter\nisoler\nivoire\nivresse\njaguar\njaillir\njambe\njanvier\njardin\njauger\njaune\njavelot\njetable\njeton\njeudi\njeunesse\njoindre\njoncher\njongler\njoueur\njouissif\njournal\njovial\njoyau\njoyeux\njubiler\njugement\njunior\njupon\njuriste\njustice\njuteux\njuvénile\nkayak\nkimono\nkiosque\nlabel\nlabial\nlabourer\nlacérer\nlactose\nlagune\nlaine\nlaisser\nlaitier\nlambeau\nlamelle\nlampe\nlanceur\nlangage\nlanterne\nlapin\nlargeur\nlarme\nlaurier\nlavabo\nlavoir\nlecture\nlégal\nléger\nlégume\nlessive\nlettre\nlevier\nlexique\nlézard\nliasse\nlibérer\nlibre\nlicence\nlicorne\nliège\nlièvre\nligature\nligoter\nligue\nlimer\nlimite\nlimonade\nlimpide\nlinéaire\nlingot\nlionceau\nliquide\nlisière\nlister\nlithium\nlitige\nlittoral\nlivreur\nlogique\nlointain\nloisir\nlombric\nloterie\nlouer\nlourd\nloutre\nlouve\nloyal\nlubie\nlucide\nlucratif\nlueur\nlugubre\nluisant\nlumière\nlunaire\nlundi\nluron\nlutter\nluxueux\nmachine\nmagasin\nmagenta\nmagique\nmaigre\nmaillon\nmaintien\nmairie\nmaison\nmajorer\nmalaxer\nmaléfice\nmalheur\nmalice\nmallette\nmammouth\nmandater\nmaniable\nmanquant\nmanteau\nmanuel\nmarathon\nmarbre\nmarchand\nmardi\nmaritime\nmarqueur\nmarron\nmarteler\nmascotte\nmassif\nmatériel\nmatière\nmatraque\nmaudire\nmaussade\nmauve\nmaximal\nméchant\nméconnu\nmédaille\nmédecin\nméditer\nméduse\nmeilleur\nmélange\nmélodie\nmembre\nmémoire\nmenacer\nmener\nmenhir\nmensonge\nmentor\nmercredi\nmérite\nmerle\nmessager\nmesure\nmétal\nmétéore\nméthode\nmétier\nmeuble\nmiauler\nmicrobe\nmiette\nmignon\nmigrer\nmilieu\nmillion\nmimique\nmince\nminéral\nminimal\nminorer\nminute\nmiracle\nmiroiter\nmissile\nmixte\nmobile\nmoderne\nmoelleux\nmondial\nmoniteur\nmonnaie\nmonotone\nmonstre\nmontagne\nmonument\nmoqueur\nmorceau\nmorsure\nmortier\nmoteur\nmotif\nmouche\nmoufle\nmoulin\nmousson\nmouton\nmouvant\nmultiple\nmunition\nmuraille\nmurène\nmurmure\nmuscle\nmuséum\nmusicien\nmutation\nmuter\nmutuel\nmyriade\nmyrtille\nmystère\nmythique\nnageur\nnappe\nnarquois\nnarrer\nnatation\nnation\nnature\nnaufrage\nnautique\nnavire\nnébuleux\nnectar\nnéfaste\nnégation\nnégliger\nnégocier\nneige\nnerveux\nnettoyer\nneurone\nneutron\nneveu\nniche\nnickel\nnitrate\nniveau\nnoble\nnocif\nnocturne\nnoirceur\nnoisette\nnomade\nnombreux\nnommer\nnormatif\nnotable\nnotifier\nnotoire\nnourrir\nnouveau\nnovateur\nnovembre\nnovice\nnuage\nnuancer\nnuire\nnuisible\nnuméro\nnuptial\nnuque\nnutritif\nobéir\nobjectif\nobliger\nobscur\nobserver\nobstacle\nobtenir\nobturer\noccasion\noccuper\nocéan\noctobre\noctroyer\noctupler\noculaire\nodeur\nodorant\noffenser\nofficier\noffrir\nogive\noiseau\noisillon\nolfactif\nolivier\nombrage\nomettre\nonctueux\nonduler\nonéreux\nonirique\nopale\nopaque\nopérer\nopinion\nopportun\nopprimer\nopter\noptique\norageux\norange\norbite\nordonner\noreille\norgane\norgueil\norifice\nornement\norque\nortie\nosciller\nosmose\nossature\notarie\nouragan\nourson\noutil\noutrager\nouvrage\novation\noxyde\noxygène\nozone\npaisible\npalace\npalmarès\npalourde\npalper\npanache\npanda\npangolin\npaniquer\npanneau\npanorama\npantalon\npapaye\npapier\npapoter\npapyrus\nparadoxe\nparcelle\nparesse\nparfumer\nparler\nparole\nparrain\nparsemer\npartager\nparure\nparvenir\npassion\npastèque\npaternel\npatience\npatron\npavillon\npavoiser\npayer\npaysage\npeigne\npeintre\npelage\npélican\npelle\npelouse\npeluche\npendule\npénétrer\npénible\npensif\npénurie\npépite\npéplum\nperdrix\nperforer\npériode\npermuter\nperplexe\npersil\nperte\npeser\npétale\npetit\npétrir\npeuple\npharaon\nphobie\nphoque\nphoton\nphrase\nphysique\npiano\npictural\npièce\npierre\npieuvre\npilote\npinceau\npipette\npiquer\npirogue\npiscine\npiston\npivoter\npixel\npizza\nplacard\nplafond\nplaisir\nplaner\nplaque\nplastron\nplateau\npleurer\nplexus\npliage\nplomb\nplonger\npluie\nplumage\npochette\npoésie\npoète\npointe\npoirier\npoisson\npoivre\npolaire\npolicier\npollen\npolygone\npommade\npompier\nponctuel\npondérer\nponey\nportique\nposition\nposséder\nposture\npotager\npoteau\npotion\npouce\npoulain\npoumon\npourpre\npoussin\npouvoir\nprairie\npratique\nprécieux\nprédire\npréfixe\nprélude\nprénom\nprésence\nprétexte\nprévoir\nprimitif\nprince\nprison\npriver\nproblème\nprocéder\nprodige\nprofond\nprogrès\nproie\nprojeter\nprologue\npromener\npropre\nprospère\nprotéger\nprouesse\nproverbe\nprudence\npruneau\npsychose\npublic\npuceron\npuiser\npulpe\npulsar\npunaise\npunitif\npupitre\npurifier\npuzzle\npyramide\nquasar\nquerelle\nquestion\nquiétude\nquitter\nquotient\nracine\nraconter\nradieux\nragondin\nraideur\nraisin\nralentir\nrallonge\nramasser\nrapide\nrasage\nratisser\nravager\nravin\nrayonner\nréactif\nréagir\nréaliser\nréanimer\nrecevoir\nréciter\nréclamer\nrécolter\nrecruter\nreculer\nrecycler\nrédiger\nredouter\nrefaire\nréflexe\nréformer\nrefrain\nrefuge\nrégalien\nrégion\nréglage\nrégulier\nréitérer\nrejeter\nrejouer\nrelatif\nrelever\nrelief\nremarque\nremède\nremise\nremonter\nremplir\nremuer\nrenard\nrenfort\nrenifler\nrenoncer\nrentrer\nrenvoi\nreplier\nreporter\nreprise\nreptile\nrequin\nréserve\nrésineux\nrésoudre\nrespect\nrester\nrésultat\nrétablir\nretenir\nréticule\nretomber\nretracer\nréunion\nréussir\nrevanche\nrevivre\nrévolte\nrévulsif\nrichesse\nrideau\nrieur\nrigide\nrigoler\nrincer\nriposter\nrisible\nrisque\nrituel\nrival\nrivière\nrocheux\nromance\nrompre\nronce\nrondin\nroseau\nrosier\nrotatif\nrotor\nrotule\nrouge\nrouille\nrouleau\nroutine\nroyaume\nruban\nrubis\nruche\nruelle\nrugueux\nruiner\nruisseau\nruser\nrustique\nrythme\nsabler\nsaboter\nsabre\nsacoche\nsafari\nsagesse\nsaisir\nsalade\nsalive\nsalon\nsaluer\nsamedi\nsanction\nsanglier\nsarcasme\nsardine\nsaturer\nsaugrenu\nsaumon\nsauter\nsauvage\nsavant\nsavonner\nscalpel\nscandale\nscélérat\nscénario\nsceptre\nschéma\nscience\nscinder\nscore\nscrutin\nsculpter\nséance\nsécable\nsécher\nsecouer\nsécréter\nsédatif\nséduire\nseigneur\nséjour\nsélectif\nsemaine\nsembler\nsemence\nséminal\nsénateur\nsensible\nsentence\nséparer\nséquence\nserein\nsergent\nsérieux\nserrure\nsérum\nservice\nsésame\nsévir\nsevrage\nsextuple\nsidéral\nsiècle\nsiéger\nsiffler\nsigle\nsignal\nsilence\nsilicium\nsimple\nsincère\nsinistre\nsiphon\nsirop\nsismique\nsituer\nskier\nsocial\nsocle\nsodium\nsoigneux\nsoldat\nsoleil\nsolitude\nsoluble\nsombre\nsommeil\nsomnoler\nsonde\nsongeur\nsonnette\nsonore\nsorcier\nsortir\nsosie\nsottise\nsoucieux\nsoudure\nsouffle\nsoulever\nsoupape\nsource\nsoutirer\nsouvenir\nspacieux\nspatial\nspécial\nsphère\nspiral\nstable\nstation\nsternum\nstimulus\nstipuler\nstrict\nstudieux\nstupeur\nstyliste\nsublime\nsubstrat\nsubtil\nsubvenir\nsuccès\nsucre\nsuffixe\nsuggérer\nsuiveur\nsulfate\nsuperbe\nsupplier\nsurface\nsuricate\nsurmener\nsurprise\nsursaut\nsurvie\nsuspect\nsyllabe\nsymbole\nsymétrie\nsynapse\nsyntaxe\nsystème\ntabac\ntablier\ntactile\ntailler\ntalent\ntalisman\ntalonner\ntambour\ntamiser\ntangible\ntapis\ntaquiner\ntarder\ntarif\ntartine\ntasse\ntatami\ntatouage\ntaupe\ntaureau\ntaxer\ntémoin\ntemporel\ntenaille\ntendre\nteneur\ntenir\ntension\nterminer\nterne\nterrible\ntétine\ntexte\nthème\nthéorie\nthérapie\nthorax\ntibia\ntiède\ntimide\ntirelire\ntiroir\ntissu\ntitane\ntitre\ntituber\ntoboggan\ntolérant\ntomate\ntonique\ntonneau\ntoponyme\ntorche\ntordre\ntornade\ntorpille\ntorrent\ntorse\ntortue\ntotem\ntoucher\ntournage\ntousser\ntoxine\ntraction\ntrafic\ntragique\ntrahir\ntrain\ntrancher\ntravail\ntrèfle\ntremper\ntrésor\ntreuil\ntriage\ntribunal\ntricoter\ntrilogie\ntriomphe\ntripler\ntriturer\ntrivial\ntrombone\ntronc\ntropical\ntroupeau\ntuile\ntulipe\ntumulte\ntunnel\nturbine\ntuteur\ntutoyer\ntuyau\ntympan\ntyphon\ntypique\ntyran\nubuesque\nultime\nultrason\nunanime\nunifier\nunion\nunique\nunitaire\nunivers\nuranium\nurbain\nurticant\nusage\nusine\nusuel\nusure\nutile\nutopie\nvacarme\nvaccin\nvagabond\nvague\nvaillant\nvaincre\nvaisseau\nvalable\nvalise\nvallon\nvalve\nvampire\nvanille\nvapeur\nvarier\nvaseux\nvassal\nvaste\nvecteur\nvedette\nvégétal\nvéhicule\nveinard\nvéloce\nvendredi\nvénérer\nvenger\nvenimeux\nventouse\nverdure\nvérin\nvernir\nverrou\nverser\nvertu\nveston\nvétéran\nvétuste\nvexant\nvexer\nviaduc\nviande\nvictoire\nvidange\nvidéo\nvignette\nvigueur\nvilain\nvillage\nvinaigre\nviolon\nvipère\nvirement\nvirtuose\nvirus\nvisage\nviseur\nvision\nvisqueux\nvisuel\nvital\nvitesse\nviticole\nvitrine\nvivace\nvivipare\nvocation\nvoguer\nvoile\nvoisin\nvoiture\nvolaille\nvolcan\nvoltiger\nvolume\nvorace\nvortex\nvoter\nvouloir\nvoyage\nvoyelle\nwagon\nxénon\nyacht\nzèbre\nzénith\nzeste\nzoologie\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/italian.txt",
    "content": "abaco\nabbaglio\nabbinato\nabete\nabisso\nabolire\nabrasivo\nabrogato\naccadere\naccenno\naccusato\nacetone\nachille\nacido\nacqua\nacre\nacrilico\nacrobata\nacuto\nadagio\naddebito\naddome\nadeguato\naderire\nadipe\nadottare\nadulare\naffabile\naffetto\naffisso\naffranto\naforisma\nafoso\nafricano\nagave\nagente\nagevole\naggancio\nagire\nagitare\nagonismo\nagricolo\nagrumeto\naguzzo\nalabarda\nalato\nalbatro\nalberato\nalbo\nalbume\nalce\nalcolico\nalettone\nalfa\nalgebra\naliante\nalibi\nalimento\nallagato\nallegro\nallievo\nallodola\nallusivo\nalmeno\nalogeno\nalpaca\nalpestre\naltalena\nalterno\nalticcio\naltrove\nalunno\nalveolo\nalzare\namalgama\namanita\namarena\nambito\nambrato\nameba\namerica\nametista\namico\nammasso\nammenda\nammirare\nammonito\namore\nampio\nampliare\namuleto\nanacardo\nanagrafe\nanalista\nanarchia\nanatra\nanca\nancella\nancora\nandare\nandrea\nanello\nangelo\nangolare\nangusto\nanima\nannegare\nannidato\nanno\nannuncio\nanonimo\nanticipo\nanzi\napatico\napertura\napode\napparire\nappetito\nappoggio\napprodo\nappunto\naprile\narabica\narachide\naragosta\naraldica\narancio\naratura\narazzo\narbitro\narchivio\nardito\narenile\nargento\nargine\narguto\naria\narmonia\narnese\narredato\narringa\narrosto\narsenico\narso\nartefice\narzillo\nasciutto\nascolto\nasepsi\nasettico\nasfalto\nasino\nasola\naspirato\naspro\nassaggio\nasse\nassoluto\nassurdo\nasta\nastenuto\nastice\nastratto\natavico\nateismo\natomico\natono\nattesa\nattivare\nattorno\nattrito\nattuale\nausilio\naustria\nautista\nautonomo\nautunno\navanzato\navere\navvenire\navviso\navvolgere\nazione\nazoto\nazzimo\nazzurro\nbabele\nbaccano\nbacino\nbaco\nbadessa\nbadilata\nbagnato\nbaita\nbalcone\nbaldo\nbalena\nballata\nbalzano\nbambino\nbandire\nbaraonda\nbarbaro\nbarca\nbaritono\nbarlume\nbarocco\nbasilico\nbasso\nbatosta\nbattuto\nbaule\nbava\nbavosa\nbecco\nbeffa\nbelgio\nbelva\nbenda\nbenevole\nbenigno\nbenzina\nbere\nberlina\nbeta\nbibita\nbici\nbidone\nbifido\nbiga\nbilancia\nbimbo\nbinocolo\nbiologo\nbipede\nbipolare\nbirbante\nbirra\nbiscotto\nbisesto\nbisnonno\nbisonte\nbisturi\nbizzarro\nblando\nblatta\nbollito\nbonifico\nbordo\nbosco\nbotanico\nbottino\nbozzolo\nbraccio\nbradipo\nbrama\nbranca\nbravura\nbretella\nbrevetto\nbrezza\nbriglia\nbrillante\nbrindare\nbroccolo\nbrodo\nbronzina\nbrullo\nbruno\nbubbone\nbuca\nbudino\nbuffone\nbuio\nbulbo\nbuono\nburlone\nburrasca\nbussola\nbusta\ncadetto\ncaduco\ncalamaro\ncalcolo\ncalesse\ncalibro\ncalmo\ncaloria\ncambusa\ncamerata\ncamicia\ncammino\ncamola\ncampale\ncanapa\ncandela\ncane\ncanino\ncanotto\ncantina\ncapace\ncapello\ncapitolo\ncapogiro\ncappero\ncapra\ncapsula\ncarapace\ncarcassa\ncardo\ncarisma\ncarovana\ncarretto\ncartolina\ncasaccio\ncascata\ncaserma\ncaso\ncassone\ncastello\ncasuale\ncatasta\ncatena\ncatrame\ncauto\ncavillo\ncedibile\ncedrata\ncefalo\ncelebre\ncellulare\ncena\ncenone\ncentesimo\nceramica\ncercare\ncerto\ncerume\ncervello\ncesoia\ncespo\nceto\nchela\nchiaro\nchicca\nchiedere\nchimera\nchina\nchirurgo\nchitarra\nciao\nciclismo\ncifrare\ncigno\ncilindro\nciottolo\ncirca\ncirrosi\ncitrico\ncittadino\nciuffo\ncivetta\ncivile\nclassico\nclinica\ncloro\ncocco\ncodardo\ncodice\ncoerente\ncognome\ncollare\ncolmato\ncolore\ncolposo\ncoltivato\ncolza\ncoma\ncometa\ncommando\ncomodo\ncomputer\ncomune\nconciso\ncondurre\nconferma\ncongelare\nconiuge\nconnesso\nconoscere\nconsumo\ncontinuo\nconvegno\ncoperto\ncopione\ncoppia\ncopricapo\ncorazza\ncordata\ncoricato\ncornice\ncorolla\ncorpo\ncorredo\ncorsia\ncortese\ncosmico\ncostante\ncottura\ncovato\ncratere\ncravatta\ncreato\ncredere\ncremoso\ncrescita\ncreta\ncriceto\ncrinale\ncrisi\ncritico\ncroce\ncronaca\ncrostata\ncruciale\ncrusca\ncucire\ncuculo\ncugino\ncullato\ncupola\ncuratore\ncursore\ncurvo\ncuscino\ncustode\ndado\ndaino\ndalmata\ndamerino\ndaniela\ndannoso\ndanzare\ndatato\ndavanti\ndavvero\ndebutto\ndecennio\ndeciso\ndeclino\ndecollo\ndecreto\ndedicato\ndefinito\ndeforme\ndegno\ndelegare\ndelfino\ndelirio\ndelta\ndemenza\ndenotato\ndentro\ndeposito\nderapata\nderivare\nderoga\ndescritto\ndeserto\ndesiderio\ndesumere\ndetersivo\ndevoto\ndiametro\ndicembre\ndiedro\ndifeso\ndiffuso\ndigerire\ndigitale\ndiluvio\ndinamico\ndinnanzi\ndipinto\ndiploma\ndipolo\ndiradare\ndire\ndirotto\ndirupo\ndisagio\ndiscreto\ndisfare\ndisgelo\ndisposto\ndistanza\ndisumano\ndito\ndivano\ndivelto\ndividere\ndivorato\ndoblone\ndocente\ndoganale\ndogma\ndolce\ndomato\ndomenica\ndominare\ndondolo\ndono\ndormire\ndote\ndottore\ndovuto\ndozzina\ndrago\ndruido\ndubbio\ndubitare\nducale\nduna\nduomo\nduplice\nduraturo\nebano\neccesso\necco\neclissi\neconomia\nedera\nedicola\nedile\neditoria\neducare\negemonia\negli\negoismo\negregio\nelaborato\nelargire\nelegante\nelencato\neletto\nelevare\nelfico\nelica\nelmo\nelsa\neluso\nemanato\nemblema\nemesso\nemiro\nemotivo\nemozione\nempirico\nemulo\nendemico\nenduro\nenergia\nenfasi\nenoteca\nentrare\nenzima\nepatite\nepilogo\nepisodio\nepocale\neppure\nequatore\nerario\nerba\nerboso\nerede\neremita\nerigere\nermetico\neroe\nerosivo\nerrante\nesagono\nesame\nesanime\nesaudire\nesca\nesempio\nesercito\nesibito\nesigente\nesistere\nesito\nesofago\nesortato\nesoso\nespanso\nespresso\nessenza\nesso\nesteso\nestimare\nestonia\nestroso\nesultare\netilico\netnico\netrusco\netto\neuclideo\neuropa\nevaso\nevidenza\nevitato\nevoluto\nevviva\nfabbrica\nfaccenda\nfachiro\nfalco\nfamiglia\nfanale\nfanfara\nfango\nfantasma\nfare\nfarfalla\nfarinoso\nfarmaco\nfascia\nfastoso\nfasullo\nfaticare\nfato\nfavoloso\nfebbre\nfecola\nfede\nfegato\nfelpa\nfeltro\nfemmina\nfendere\nfenomeno\nfermento\nferro\nfertile\nfessura\nfestivo\nfetta\nfeudo\nfiaba\nfiducia\nfifa\nfigurato\nfilo\nfinanza\nfinestra\nfinire\nfiore\nfiscale\nfisico\nfiume\nflacone\nflamenco\nflebo\nflemma\nflorido\nfluente\nfluoro\nfobico\nfocaccia\nfocoso\nfoderato\nfoglio\nfolata\nfolclore\nfolgore\nfondente\nfonetico\nfonia\nfontana\nforbito\nforchetta\nforesta\nformica\nfornaio\nforo\nfortezza\nforzare\nfosfato\nfosso\nfracasso\nfrana\nfrassino\nfratello\nfreccetta\nfrenata\nfresco\nfrigo\nfrollino\nfronde\nfrugale\nfrutta\nfucilata\nfucsia\nfuggente\nfulmine\nfulvo\nfumante\nfumetto\nfumoso\nfune\nfunzione\nfuoco\nfurbo\nfurgone\nfurore\nfuso\nfutile\ngabbiano\ngaffe\ngalateo\ngallina\ngaloppo\ngambero\ngamma\ngaranzia\ngarbo\ngarofano\ngarzone\ngasdotto\ngasolio\ngastrico\ngatto\ngaudio\ngazebo\ngazzella\ngeco\ngelatina\ngelso\ngemello\ngemmato\ngene\ngenitore\ngennaio\ngenotipo\ngergo\nghepardo\nghiaccio\nghisa\ngiallo\ngilda\nginepro\ngiocare\ngioiello\ngiorno\ngiove\ngirato\ngirone\ngittata\ngiudizio\ngiurato\ngiusto\nglobulo\nglutine\ngnomo\ngobba\ngolf\ngomito\ngommone\ngonfio\ngonna\ngoverno\ngracile\ngrado\ngrafico\ngrammo\ngrande\ngrattare\ngravoso\ngrazia\ngreca\ngregge\ngrifone\ngrigio\ngrinza\ngrotta\ngruppo\nguadagno\nguaio\nguanto\nguardare\ngufo\nguidare\nibernato\nicona\nidentico\nidillio\nidolo\nidra\nidrico\nidrogeno\nigiene\nignaro\nignorato\nilare\nilleso\nillogico\nilludere\nimballo\nimbevuto\nimbocco\nimbuto\nimmane\nimmerso\nimmolato\nimpacco\nimpeto\nimpiego\nimporto\nimpronta\ninalare\ninarcare\ninattivo\nincanto\nincendio\ninchino\nincisivo\nincluso\nincontro\nincrocio\nincubo\nindagine\nindia\nindole\ninedito\ninfatti\ninfilare\ninflitto\ningaggio\ningegno\ninglese\ningordo\ningrosso\ninnesco\ninodore\ninoltrare\ninondato\ninsano\ninsetto\ninsieme\ninsonnia\ninsulina\nintasato\nintero\nintonaco\nintuito\ninumidire\ninvalido\ninvece\ninvito\niperbole\nipnotico\nipotesi\nippica\niride\nirlanda\nironico\nirrigato\nirrorare\nisolato\nisotopo\nisterico\nistituto\nistrice\nitalia\niterare\nlabbro\nlabirinto\nlacca\nlacerato\nlacrima\nlacuna\nladdove\nlago\nlampo\nlancetta\nlanterna\nlardoso\nlarga\nlaringe\nlastra\nlatenza\nlatino\nlattuga\nlavagna\nlavoro\nlegale\nleggero\nlembo\nlentezza\nlenza\nleone\nlepre\nlesivo\nlessato\nlesto\nletterale\nleva\nlevigato\nlibero\nlido\nlievito\nlilla\nlimatura\nlimitare\nlimpido\nlineare\nlingua\nliquido\nlira\nlirica\nlisca\nlite\nlitigio\nlivrea\nlocanda\nlode\nlogica\nlombare\nlondra\nlongevo\nloquace\nlorenzo\nloto\nlotteria\nluce\nlucidato\nlumaca\nluminoso\nlungo\nlupo\nluppolo\nlusinga\nlusso\nlutto\nmacabro\nmacchina\nmacero\nmacinato\nmadama\nmagico\nmaglia\nmagnete\nmagro\nmaiolica\nmalafede\nmalgrado\nmalinteso\nmalsano\nmalto\nmalumore\nmana\nmancia\nmandorla\nmangiare\nmanifesto\nmannaro\nmanovra\nmansarda\nmantide\nmanubrio\nmappa\nmaratona\nmarcire\nmaretta\nmarmo\nmarsupio\nmaschera\nmassaia\nmastino\nmaterasso\nmatricola\nmattone\nmaturo\nmazurca\nmeandro\nmeccanico\nmecenate\nmedesimo\nmeditare\nmega\nmelassa\nmelis\nmelodia\nmeninge\nmeno\nmensola\nmercurio\nmerenda\nmerlo\nmeschino\nmese\nmessere\nmestolo\nmetallo\nmetodo\nmettere\nmiagolare\nmica\nmicelio\nmichele\nmicrobo\nmidollo\nmiele\nmigliore\nmilano\nmilite\nmimosa\nminerale\nmini\nminore\nmirino\nmirtillo\nmiscela\nmissiva\nmisto\nmisurare\nmitezza\nmitigare\nmitra\nmittente\nmnemonico\nmodello\nmodifica\nmodulo\nmogano\nmogio\nmole\nmolosso\nmonastero\nmonco\nmondina\nmonetario\nmonile\nmonotono\nmonsone\nmontato\nmonviso\nmora\nmordere\nmorsicato\nmostro\nmotivato\nmotosega\nmotto\nmovenza\nmovimento\nmozzo\nmucca\nmucosa\nmuffa\nmughetto\nmugnaio\nmulatto\nmulinello\nmultiplo\nmummia\nmunto\nmuovere\nmurale\nmusa\nmuscolo\nmusica\nmutevole\nmuto\nnababbo\nnafta\nnanometro\nnarciso\nnarice\nnarrato\nnascere\nnastrare\nnaturale\nnautica\nnaviglio\nnebulosa\nnecrosi\nnegativo\nnegozio\nnemmeno\nneofita\nneretto\nnervo\nnessuno\nnettuno\nneutrale\nneve\nnevrotico\nnicchia\nninfa\nnitido\nnobile\nnocivo\nnodo\nnome\nnomina\nnordico\nnormale\nnorvegese\nnostrano\nnotare\nnotizia\nnotturno\nnovella\nnucleo\nnulla\nnumero\nnuovo\nnutrire\nnuvola\nnuziale\noasi\nobbedire\nobbligo\nobelisco\noblio\nobolo\nobsoleto\noccasione\nocchio\noccidente\noccorrere\noccultare\nocra\noculato\nodierno\nodorare\nofferta\noffrire\noffuscato\noggetto\noggi\nognuno\nolandese\nolfatto\noliato\noliva\nologramma\noltre\nomaggio\nombelico\nombra\nomega\nomissione\nondoso\nonere\nonice\nonnivoro\nonorevole\nonta\noperato\nopinione\nopposto\noracolo\norafo\nordine\norecchino\norefice\norfano\norganico\norigine\norizzonte\norma\normeggio\nornativo\norologio\norrendo\norribile\nortensia\nortica\norzata\norzo\nosare\noscurare\nosmosi\nospedale\nospite\nossa\nossidare\nostacolo\noste\notite\notre\nottagono\nottimo\nottobre\novale\novest\novino\noviparo\novocito\novunque\novviare\nozio\npacchetto\npace\npacifico\npadella\npadrone\npaese\npaga\npagina\npalazzina\npalesare\npallido\npalo\npalude\npandoro\npannello\npaolo\npaonazzo\npaprica\nparabola\nparcella\nparere\npargolo\npari\nparlato\nparola\npartire\nparvenza\nparziale\npassivo\npasticca\npatacca\npatologia\npattume\npavone\npeccato\npedalare\npedonale\npeggio\npeloso\npenare\npendice\npenisola\npennuto\npenombra\npensare\npentola\npepe\npepita\nperbene\npercorso\nperdonato\nperforare\npergamena\nperiodo\npermesso\nperno\nperplesso\npersuaso\npertugio\npervaso\npesatore\npesista\npeso\npestifero\npetalo\npettine\npetulante\npezzo\npiacere\npianta\npiattino\npiccino\npicozza\npiega\npietra\npiffero\npigiama\npigolio\npigro\npila\npilifero\npillola\npilota\npimpante\npineta\npinna\npinolo\npioggia\npiombo\npiramide\npiretico\npirite\npirolisi\npitone\npizzico\nplacebo\nplanare\nplasma\nplatano\nplenario\npochezza\npoderoso\npodismo\npoesia\npoggiare\npolenta\npoligono\npollice\npolmonite\npolpetta\npolso\npoltrona\npolvere\npomice\npomodoro\nponte\npopoloso\nporfido\nporoso\nporpora\nporre\nportata\nposa\npositivo\npossesso\npostulato\npotassio\npotere\npranzo\nprassi\npratica\nprecluso\npredica\nprefisso\npregiato\nprelievo\npremere\nprenotare\npreparato\npresenza\npretesto\nprevalso\nprima\nprincipe\nprivato\nproblema\nprocura\nprodurre\nprofumo\nprogetto\nprolunga\npromessa\npronome\nproposta\nproroga\nproteso\nprova\nprudente\nprugna\nprurito\npsiche\npubblico\npudica\npugilato\npugno\npulce\npulito\npulsante\npuntare\npupazzo\npupilla\npuro\nquadro\nqualcosa\nquasi\nquerela\nquota\nraccolto\nraddoppio\nradicale\nradunato\nraffica\nragazzo\nragione\nragno\nramarro\nramingo\nramo\nrandagio\nrantolare\nrapato\nrapina\nrappreso\nrasatura\nraschiato\nrasente\nrassegna\nrastrello\nrata\nravveduto\nreale\nrecepire\nrecinto\nrecluta\nrecondito\nrecupero\nreddito\nredimere\nregalato\nregistro\nregola\nregresso\nrelazione\nremare\nremoto\nrenna\nreplica\nreprimere\nreputare\nresa\nresidente\nresponso\nrestauro\nrete\nretina\nretorica\nrettifica\nrevocato\nriassunto\nribadire\nribelle\nribrezzo\nricarica\nricco\nricevere\nriciclato\nricordo\nricreduto\nridicolo\nridurre\nrifasare\nriflesso\nriforma\nrifugio\nrigare\nrigettato\nrighello\nrilassato\nrilevato\nrimanere\nrimbalzo\nrimedio\nrimorchio\nrinascita\nrincaro\nrinforzo\nrinnovo\nrinomato\nrinsavito\nrintocco\nrinuncia\nrinvenire\nriparato\nripetuto\nripieno\nriportare\nripresa\nripulire\nrisata\nrischio\nriserva\nrisibile\nriso\nrispetto\nristoro\nrisultato\nrisvolto\nritardo\nritegno\nritmico\nritrovo\nriunione\nriva\nriverso\nrivincita\nrivolto\nrizoma\nroba\nrobotico\nrobusto\nroccia\nroco\nrodaggio\nrodere\nroditore\nrogito\nrollio\nromantico\nrompere\nronzio\nrosolare\nrospo\nrotante\nrotondo\nrotula\nrovescio\nrubizzo\nrubrica\nruga\nrullino\nrumine\nrumoroso\nruolo\nrupe\nrussare\nrustico\nsabato\nsabbiare\nsabotato\nsagoma\nsalasso\nsaldatura\nsalgemma\nsalivare\nsalmone\nsalone\nsaltare\nsaluto\nsalvo\nsapere\nsapido\nsaporito\nsaraceno\nsarcasmo\nsarto\nsassoso\nsatellite\nsatira\nsatollo\nsaturno\nsavana\nsavio\nsaziato\nsbadiglio\nsbalzo\nsbancato\nsbarra\nsbattere\nsbavare\nsbendare\nsbirciare\nsbloccato\nsbocciato\nsbrinare\nsbruffone\nsbuffare\nscabroso\nscadenza\nscala\nscambiare\nscandalo\nscapola\nscarso\nscatenare\nscavato\nscelto\nscenico\nscettro\nscheda\nschiena\nsciarpa\nscienza\nscindere\nscippo\nsciroppo\nscivolo\nsclerare\nscodella\nscolpito\nscomparto\nsconforto\nscoprire\nscorta\nscossone\nscozzese\nscriba\nscrollare\nscrutinio\nscuderia\nscultore\nscuola\nscuro\nscusare\nsdebitare\nsdoganare\nseccatura\nsecondo\nsedano\nseggiola\nsegnalato\nsegregato\nseguito\nselciato\nselettivo\nsella\nselvaggio\nsemaforo\nsembrare\nseme\nseminato\nsempre\nsenso\nsentire\nsepolto\nsequenza\nserata\nserbato\nsereno\nserio\nserpente\nserraglio\nservire\nsestina\nsetola\nsettimana\nsfacelo\nsfaldare\nsfamato\nsfarzoso\nsfaticato\nsfera\nsfida\nsfilato\nsfinge\nsfocato\nsfoderare\nsfogo\nsfoltire\nsforzato\nsfratto\nsfruttato\nsfuggito\nsfumare\nsfuso\nsgabello\nsgarbato\nsgonfiare\nsgorbio\nsgrassato\nsguardo\nsibilo\nsiccome\nsierra\nsigla\nsignore\nsilenzio\nsillaba\nsimbolo\nsimpatico\nsimulato\nsinfonia\nsingolo\nsinistro\nsino\nsintesi\nsinusoide\nsipario\nsisma\nsistole\nsituato\nslitta\nslogatura\nsloveno\nsmarrito\nsmemorato\nsmentito\nsmeraldo\nsmilzo\nsmontare\nsmottato\nsmussato\nsnellire\nsnervato\nsnodo\nsobbalzo\nsobrio\nsoccorso\nsociale\nsodale\nsoffitto\nsogno\nsoldato\nsolenne\nsolido\nsollazzo\nsolo\nsolubile\nsolvente\nsomatico\nsomma\nsonda\nsonetto\nsonnifero\nsopire\nsoppeso\nsopra\nsorgere\nsorpasso\nsorriso\nsorso\nsorteggio\nsorvolato\nsospiro\nsosta\nsottile\nspada\nspalla\nspargere\nspatola\nspavento\nspazzola\nspecie\nspedire\nspegnere\nspelatura\nsperanza\nspessore\nspettrale\nspezzato\nspia\nspigoloso\nspillato\nspinoso\nspirale\nsplendido\nsportivo\nsposo\nspranga\nsprecare\nspronato\nspruzzo\nspuntino\nsquillo\nsradicare\nsrotolato\nstabile\nstacco\nstaffa\nstagnare\nstampato\nstantio\nstarnuto\nstasera\nstatuto\nstelo\nsteppa\nsterzo\nstiletto\nstima\nstirpe\nstivale\nstizzoso\nstonato\nstorico\nstrappo\nstregato\nstridulo\nstrozzare\nstrutto\nstuccare\nstufo\nstupendo\nsubentro\nsuccoso\nsudore\nsuggerito\nsugo\nsultano\nsuonare\nsuperbo\nsupporto\nsurgelato\nsurrogato\nsussurro\nsutura\nsvagare\nsvedese\nsveglio\nsvelare\nsvenuto\nsvezia\nsviluppo\nsvista\nsvizzera\nsvolta\nsvuotare\ntabacco\ntabulato\ntacciare\ntaciturno\ntale\ntalismano\ntampone\ntannino\ntara\ntardivo\ntargato\ntariffa\ntarpare\ntartaruga\ntasto\ntattico\ntaverna\ntavolata\ntazza\nteca\ntecnico\ntelefono\ntemerario\ntempo\ntemuto\ntendone\ntenero\ntensione\ntentacolo\nteorema\nterme\nterrazzo\nterzetto\ntesi\ntesserato\ntestato\ntetro\ntettoia\ntifare\ntigella\ntimbro\ntinto\ntipico\ntipografo\ntiraggio\ntiro\ntitanio\ntitolo\ntitubante\ntizio\ntizzone\ntoccare\ntollerare\ntolto\ntombola\ntomo\ntonfo\ntonsilla\ntopazio\ntopologia\ntoppa\ntorba\ntornare\ntorrone\ntortora\ntoscano\ntossire\ntostatura\ntotano\ntrabocco\ntrachea\ntrafila\ntragedia\ntralcio\ntramonto\ntransito\ntrapano\ntrarre\ntrasloco\ntrattato\ntrave\ntreccia\ntremolio\ntrespolo\ntributo\ntricheco\ntrifoglio\ntrillo\ntrincea\ntrio\ntristezza\ntriturato\ntrivella\ntromba\ntrono\ntroppo\ntrottola\ntrovare\ntruccato\ntubatura\ntuffato\ntulipano\ntumulto\ntunisia\nturbare\nturchino\ntuta\ntutela\nubicato\nuccello\nuccisore\nudire\nuditivo\nuffa\nufficio\nuguale\nulisse\nultimato\numano\numile\numorismo\nuncinetto\nungere\nungherese\nunicorno\nunificato\nunisono\nunitario\nunte\nuovo\nupupa\nuragano\nurgenza\nurlo\nusanza\nusato\nuscito\nusignolo\nusuraio\nutensile\nutilizzo\nutopia\nvacante\nvaccinato\nvagabondo\nvagliato\nvalanga\nvalgo\nvalico\nvalletta\nvaloroso\nvalutare\nvalvola\nvampata\nvangare\nvanitoso\nvano\nvantaggio\nvanvera\nvapore\nvarano\nvarcato\nvariante\nvasca\nvedetta\nvedova\nveduto\nvegetale\nveicolo\nvelcro\nvelina\nvelluto\nveloce\nvenato\nvendemmia\nvento\nverace\nverbale\nvergogna\nverifica\nvero\nverruca\nverticale\nvescica\nvessillo\nvestale\nveterano\nvetrina\nvetusto\nviandante\nvibrante\nvicenda\nvichingo\nvicinanza\nvidimare\nvigilia\nvigneto\nvigore\nvile\nvillano\nvimini\nvincitore\nviola\nvipera\nvirgola\nvirologo\nvirulento\nviscoso\nvisione\nvispo\nvissuto\nvisura\nvita\nvitello\nvittima\nvivanda\nvivido\nviziare\nvoce\nvoga\nvolatile\nvolere\nvolpe\nvoragine\nvulcano\nzampogna\nzanna\nzappato\nzattera\nzavorra\nzefiro\nzelante\nzelo\nzenzero\nzerbino\nzibetto\nzinco\nzircone\nzitto\nzolla\nzotico\nzucchero\nzufolo\nzulu\nzuppa\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/japanese.txt",
    "content": "あいこくしん\nあいさつ\nあいだ\nあおぞら\nあかちゃん\nあきる\nあけがた\nあける\nあこがれる\nあさい\nあさひ\nあしあと\nあじわう\nあずかる\nあずき\nあそぶ\nあたえる\nあたためる\nあたりまえ\nあたる\nあつい\nあつかう\nあっしゅく\nあつまり\nあつめる\nあてな\nあてはまる\nあひる\nあぶら\nあぶる\nあふれる\nあまい\nあまど\nあまやかす\nあまり\nあみもの\nあめりか\nあやまる\nあゆむ\nあらいぐま\nあらし\nあらすじ\nあらためる\nあらゆる\nあらわす\nありがとう\nあわせる\nあわてる\nあんい\nあんがい\nあんこ\nあんぜん\nあんてい\nあんない\nあんまり\nいいだす\nいおん\nいがい\nいがく\nいきおい\nいきなり\nいきもの\nいきる\nいくじ\nいくぶん\nいけばな\nいけん\nいこう\nいこく\nいこつ\nいさましい\nいさん\nいしき\nいじゅう\nいじょう\nいじわる\nいずみ\nいずれ\nいせい\nいせえび\nいせかい\nいせき\nいぜん\nいそうろう\nいそがしい\nいだい\nいだく\nいたずら\nいたみ\nいたりあ\nいちおう\nいちじ\nいちど\nいちば\nいちぶ\nいちりゅう\nいつか\nいっしゅん\nいっせい\nいっそう\nいったん\nいっち\nいってい\nいっぽう\nいてざ\nいてん\nいどう\nいとこ\nいない\nいなか\nいねむり\nいのち\nいのる\nいはつ\nいばる\nいはん\nいびき\nいひん\nいふく\nいへん\nいほう\nいみん\nいもうと\nいもたれ\nいもり\nいやがる\nいやす\nいよかん\nいよく\nいらい\nいらすと\nいりぐち\nいりょう\nいれい\nいれもの\nいれる\nいろえんぴつ\nいわい\nいわう\nいわかん\nいわば\nいわゆる\nいんげんまめ\nいんさつ\nいんしょう\nいんよう\nうえき\nうえる\nうおざ\nうがい\nうかぶ\nうかべる\nうきわ\nうくらいな\nうくれれ\nうけたまわる\nうけつけ\nうけとる\nうけもつ\nうける\nうごかす\nうごく\nうこん\nうさぎ\nうしなう\nうしろがみ\nうすい\nうすぎ\nうすぐらい\nうすめる\nうせつ\nうちあわせ\nうちがわ\nうちき\nうちゅう\nうっかり\nうつくしい\nうったえる\nうつる\nうどん\nうなぎ\nうなじ\nうなずく\nうなる\nうねる\nうのう\nうぶげ\nうぶごえ\nうまれる\nうめる\nうもう\nうやまう\nうよく\nうらがえす\nうらぐち\nうらない\nうりあげ\nうりきれ\nうるさい\nうれしい\nうれゆき\nうれる\nうろこ\nうわき\nうわさ\nうんこう\nうんちん\nうんてん\nうんどう\nえいえん\nえいが\nえいきょう\nえいご\nえいせい\nえいぶん\nえいよう\nえいわ\nえおり\nえがお\nえがく\nえきたい\nえくせる\nえしゃく\nえすて\nえつらん\nえのぐ\nえほうまき\nえほん\nえまき\nえもじ\nえもの\nえらい\nえらぶ\nえりあ\nえんえん\nえんかい\nえんぎ\nえんげき\nえんしゅう\nえんぜつ\nえんそく\nえんちょう\nえんとつ\nおいかける\nおいこす\nおいしい\nおいつく\nおうえん\nおうさま\nおうじ\nおうせつ\nおうたい\nおうふく\nおうべい\nおうよう\nおえる\nおおい\nおおう\nおおどおり\nおおや\nおおよそ\nおかえり\nおかず\nおがむ\nおかわり\nおぎなう\nおきる\nおくさま\nおくじょう\nおくりがな\nおくる\nおくれる\nおこす\nおこなう\nおこる\nおさえる\nおさない\nおさめる\nおしいれ\nおしえる\nおじぎ\nおじさん\nおしゃれ\nおそらく\nおそわる\nおたがい\nおたく\nおだやか\nおちつく\nおっと\nおつり\nおでかけ\nおとしもの\nおとなしい\nおどり\nおどろかす\nおばさん\nおまいり\nおめでとう\nおもいで\nおもう\nおもたい\nおもちゃ\nおやつ\nおやゆび\nおよぼす\nおらんだ\nおろす\nおんがく\nおんけい\nおんしゃ\nおんせん\nおんだん\nおんちゅう\nおんどけい\nかあつ\nかいが\nがいき\nがいけん\nがいこう\nかいさつ\nかいしゃ\nかいすいよく\nかいぜん\nかいぞうど\nかいつう\nかいてん\nかいとう\nかいふく\nがいへき\nかいほう\nかいよう\nがいらい\nかいわ\nかえる\nかおり\nかかえる\nかがく\nかがし\nかがみ\nかくご\nかくとく\nかざる\nがぞう\nかたい\nかたち\nがちょう\nがっきゅう\nがっこう\nがっさん\nがっしょう\nかなざわし\nかのう\nがはく\nかぶか\nかほう\nかほご\nかまう\nかまぼこ\nかめれおん\nかゆい\nかようび\nからい\nかるい\nかろう\nかわく\nかわら\nがんか\nかんけい\nかんこう\nかんしゃ\nかんそう\nかんたん\nかんち\nがんばる\nきあい\nきあつ\nきいろ\nぎいん\nきうい\nきうん\nきえる\nきおう\nきおく\nきおち\nきおん\nきかい\nきかく\nきかんしゃ\nききて\nきくばり\nきくらげ\nきけんせい\nきこう\nきこえる\nきこく\nきさい\nきさく\nきさま\nきさらぎ\nぎじかがく\nぎしき\nぎじたいけん\nぎじにってい\nぎじゅつしゃ\nきすう\nきせい\nきせき\nきせつ\nきそう\nきぞく\nきぞん\nきたえる\nきちょう\nきつえん\nぎっちり\nきつつき\nきつね\nきてい\nきどう\nきどく\nきない\nきなが\nきなこ\nきぬごし\nきねん\nきのう\nきのした\nきはく\nきびしい\nきひん\nきふく\nきぶん\nきぼう\nきほん\nきまる\nきみつ\nきむずかしい\nきめる\nきもだめし\nきもち\nきもの\nきゃく\nきやく\nぎゅうにく\nきよう\nきょうりゅう\nきらい\nきらく\nきりん\nきれい\nきれつ\nきろく\nぎろん\nきわめる\nぎんいろ\nきんかくじ\nきんじょ\nきんようび\nぐあい\nくいず\nくうかん\nくうき\nくうぐん\nくうこう\nぐうせい\nくうそう\nぐうたら\nくうふく\nくうぼ\nくかん\nくきょう\nくげん\nぐこう\nくさい\nくさき\nくさばな\nくさる\nくしゃみ\nくしょう\nくすのき\nくすりゆび\nくせげ\nくせん\nぐたいてき\nくださる\nくたびれる\nくちこみ\nくちさき\nくつした\nぐっすり\nくつろぐ\nくとうてん\nくどく\nくなん\nくねくね\nくのう\nくふう\nくみあわせ\nくみたてる\nくめる\nくやくしょ\nくらす\nくらべる\nくるま\nくれる\nくろう\nくわしい\nぐんかん\nぐんしょく\nぐんたい\nぐんて\nけあな\nけいかく\nけいけん\nけいこ\nけいさつ\nげいじゅつ\nけいたい\nげいのうじん\nけいれき\nけいろ\nけおとす\nけおりもの\nげきか\nげきげん\nげきだん\nげきちん\nげきとつ\nげきは\nげきやく\nげこう\nげこくじょう\nげざい\nけさき\nげざん\nけしき\nけしごむ\nけしょう\nげすと\nけたば\nけちゃっぷ\nけちらす\nけつあつ\nけつい\nけつえき\nけっこん\nけつじょ\nけっせき\nけってい\nけつまつ\nげつようび\nげつれい\nけつろん\nげどく\nけとばす\nけとる\nけなげ\nけなす\nけなみ\nけぬき\nげねつ\nけねん\nけはい\nげひん\nけぶかい\nげぼく\nけまり\nけみかる\nけむし\nけむり\nけもの\nけらい\nけろけろ\nけわしい\nけんい\nけんえつ\nけんお\nけんか\nげんき\nけんげん\nけんこう\nけんさく\nけんしゅう\nけんすう\nげんそう\nけんちく\nけんてい\nけんとう\nけんない\nけんにん\nげんぶつ\nけんま\nけんみん\nけんめい\nけんらん\nけんり\nこあくま\nこいぬ\nこいびと\nごうい\nこうえん\nこうおん\nこうかん\nごうきゅう\nごうけい\nこうこう\nこうさい\nこうじ\nこうすい\nごうせい\nこうそく\nこうたい\nこうちゃ\nこうつう\nこうてい\nこうどう\nこうない\nこうはい\nごうほう\nごうまん\nこうもく\nこうりつ\nこえる\nこおり\nごかい\nごがつ\nごかん\nこくご\nこくさい\nこくとう\nこくない\nこくはく\nこぐま\nこけい\nこける\nここのか\nこころ\nこさめ\nこしつ\nこすう\nこせい\nこせき\nこぜん\nこそだて\nこたい\nこたえる\nこたつ\nこちょう\nこっか\nこつこつ\nこつばん\nこつぶ\nこてい\nこてん\nことがら\nことし\nことば\nことり\nこなごな\nこねこね\nこのまま\nこのみ\nこのよ\nごはん\nこひつじ\nこふう\nこふん\nこぼれる\nごまあぶら\nこまかい\nごますり\nこまつな\nこまる\nこむぎこ\nこもじ\nこもち\nこもの\nこもん\nこやく\nこやま\nこゆう\nこゆび\nこよい\nこよう\nこりる\nこれくしょん\nころっけ\nこわもて\nこわれる\nこんいん\nこんかい\nこんき\nこんしゅう\nこんすい\nこんだて\nこんとん\nこんなん\nこんびに\nこんぽん\nこんまけ\nこんや\nこんれい\nこんわく\nざいえき\nさいかい\nさいきん\nざいげん\nざいこ\nさいしょ\nさいせい\nざいたく\nざいちゅう\nさいてき\nざいりょう\nさうな\nさかいし\nさがす\nさかな\nさかみち\nさがる\nさぎょう\nさくし\nさくひん\nさくら\nさこく\nさこつ\nさずかる\nざせき\nさたん\nさつえい\nざつおん\nざっか\nざつがく\nさっきょく\nざっし\nさつじん\nざっそう\nさつたば\nさつまいも\nさてい\nさといも\nさとう\nさとおや\nさとし\nさとる\nさのう\nさばく\nさびしい\nさべつ\nさほう\nさほど\nさます\nさみしい\nさみだれ\nさむけ\nさめる\nさやえんどう\nさゆう\nさよう\nさよく\nさらだ\nざるそば\nさわやか\nさわる\nさんいん\nさんか\nさんきゃく\nさんこう\nさんさい\nざんしょ\nさんすう\nさんせい\nさんそ\nさんち\nさんま\nさんみ\nさんらん\nしあい\nしあげ\nしあさって\nしあわせ\nしいく\nしいん\nしうち\nしえい\nしおけ\nしかい\nしかく\nじかん\nしごと\nしすう\nじだい\nしたうけ\nしたぎ\nしたて\nしたみ\nしちょう\nしちりん\nしっかり\nしつじ\nしつもん\nしてい\nしてき\nしてつ\nじてん\nじどう\nしなぎれ\nしなもの\nしなん\nしねま\nしねん\nしのぐ\nしのぶ\nしはい\nしばかり\nしはつ\nしはらい\nしはん\nしひょう\nしふく\nじぶん\nしへい\nしほう\nしほん\nしまう\nしまる\nしみん\nしむける\nじむしょ\nしめい\nしめる\nしもん\nしゃいん\nしゃうん\nしゃおん\nじゃがいも\nしやくしょ\nしゃくほう\nしゃけん\nしゃこ\nしゃざい\nしゃしん\nしゃせん\nしゃそう\nしゃたい\nしゃちょう\nしゃっきん\nじゃま\nしゃりん\nしゃれい\nじゆう\nじゅうしょ\nしゅくはく\nじゅしん\nしゅっせき\nしゅみ\nしゅらば\nじゅんばん\nしょうかい\nしょくたく\nしょっけん\nしょどう\nしょもつ\nしらせる\nしらべる\nしんか\nしんこう\nじんじゃ\nしんせいじ\nしんちく\nしんりん\nすあげ\nすあし\nすあな\nずあん\nすいえい\nすいか\nすいとう\nずいぶん\nすいようび\nすうがく\nすうじつ\nすうせん\nすおどり\nすきま\nすくう\nすくない\nすける\nすごい\nすこし\nずさん\nすずしい\nすすむ\nすすめる\nすっかり\nずっしり\nずっと\nすてき\nすてる\nすねる\nすのこ\nすはだ\nすばらしい\nずひょう\nずぶぬれ\nすぶり\nすふれ\nすべて\nすべる\nずほう\nすぼん\nすまい\nすめし\nすもう\nすやき\nすらすら\nするめ\nすれちがう\nすろっと\nすわる\nすんぜん\nすんぽう\nせあぶら\nせいかつ\nせいげん\nせいじ\nせいよう\nせおう\nせかいかん\nせきにん\nせきむ\nせきゆ\nせきらんうん\nせけん\nせこう\nせすじ\nせたい\nせたけ\nせっかく\nせっきゃく\nぜっく\nせっけん\nせっこつ\nせっさたくま\nせつぞく\nせつだん\nせつでん\nせっぱん\nせつび\nせつぶん\nせつめい\nせつりつ\nせなか\nせのび\nせはば\nせびろ\nせぼね\nせまい\nせまる\nせめる\nせもたれ\nせりふ\nぜんあく\nせんい\nせんえい\nせんか\nせんきょ\nせんく\nせんげん\nぜんご\nせんさい\nせんしゅ\nせんすい\nせんせい\nせんぞ\nせんたく\nせんちょう\nせんてい\nせんとう\nせんぬき\nせんねん\nせんぱい\nぜんぶ\nぜんぽう\nせんむ\nせんめんじょ\nせんもん\nせんやく\nせんゆう\nせんよう\nぜんら\nぜんりゃく\nせんれい\nせんろ\nそあく\nそいとげる\nそいね\nそうがんきょう\nそうき\nそうご\nそうしん\nそうだん\nそうなん\nそうび\nそうめん\nそうり\nそえもの\nそえん\nそがい\nそげき\nそこう\nそこそこ\nそざい\nそしな\nそせい\nそせん\nそそぐ\nそだてる\nそつう\nそつえん\nそっかん\nそつぎょう\nそっけつ\nそっこう\nそっせん\nそっと\nそとがわ\nそとづら\nそなえる\nそなた\nそふぼ\nそぼく\nそぼろ\nそまつ\nそまる\nそむく\nそむりえ\nそめる\nそもそも\nそよかぜ\nそらまめ\nそろう\nそんかい\nそんけい\nそんざい\nそんしつ\nそんぞく\nそんちょう\nぞんび\nぞんぶん\nそんみん\nたあい\nたいいん\nたいうん\nたいえき\nたいおう\nだいがく\nたいき\nたいぐう\nたいけん\nたいこ\nたいざい\nだいじょうぶ\nだいすき\nたいせつ\nたいそう\nだいたい\nたいちょう\nたいてい\nだいどころ\nたいない\nたいねつ\nたいのう\nたいはん\nだいひょう\nたいふう\nたいへん\nたいほ\nたいまつばな\nたいみんぐ\nたいむ\nたいめん\nたいやき\nたいよう\nたいら\nたいりょく\nたいる\nたいわん\nたうえ\nたえる\nたおす\nたおる\nたおれる\nたかい\nたかね\nたきび\nたくさん\nたこく\nたこやき\nたさい\nたしざん\nだじゃれ\nたすける\nたずさわる\nたそがれ\nたたかう\nたたく\nただしい\nたたみ\nたちばな\nだっかい\nだっきゃく\nだっこ\nだっしゅつ\nだったい\nたてる\nたとえる\nたなばた\nたにん\nたぬき\nたのしみ\nたはつ\nたぶん\nたべる\nたぼう\nたまご\nたまる\nだむる\nためいき\nためす\nためる\nたもつ\nたやすい\nたよる\nたらす\nたりきほんがん\nたりょう\nたりる\nたると\nたれる\nたれんと\nたろっと\nたわむれる\nだんあつ\nたんい\nたんおん\nたんか\nたんき\nたんけん\nたんご\nたんさん\nたんじょうび\nだんせい\nたんそく\nたんたい\nだんち\nたんてい\nたんとう\nだんな\nたんにん\nだんねつ\nたんのう\nたんぴん\nだんぼう\nたんまつ\nたんめい\nだんれつ\nだんろ\nだんわ\nちあい\nちあん\nちいき\nちいさい\nちえん\nちかい\nちから\nちきゅう\nちきん\nちけいず\nちけん\nちこく\nちさい\nちしき\nちしりょう\nちせい\nちそう\nちたい\nちたん\nちちおや\nちつじょ\nちてき\nちてん\nちぬき\nちぬり\nちのう\nちひょう\nちへいせん\nちほう\nちまた\nちみつ\nちみどろ\nちめいど\nちゃんこなべ\nちゅうい\nちゆりょく\nちょうし\nちょさくけん\nちらし\nちらみ\nちりがみ\nちりょう\nちるど\nちわわ\nちんたい\nちんもく\nついか\nついたち\nつうか\nつうじょう\nつうはん\nつうわ\nつかう\nつかれる\nつくね\nつくる\nつけね\nつける\nつごう\nつたえる\nつづく\nつつじ\nつつむ\nつとめる\nつながる\nつなみ\nつねづね\nつのる\nつぶす\nつまらない\nつまる\nつみき\nつめたい\nつもり\nつもる\nつよい\nつるぼ\nつるみく\nつわもの\nつわり\nてあし\nてあて\nてあみ\nていおん\nていか\nていき\nていけい\nていこく\nていさつ\nていし\nていせい\nていたい\nていど\nていねい\nていひょう\nていへん\nていぼう\nてうち\nておくれ\nてきとう\nてくび\nでこぼこ\nてさぎょう\nてさげ\nてすり\nてそう\nてちがい\nてちょう\nてつがく\nてつづき\nでっぱ\nてつぼう\nてつや\nでぬかえ\nてぬき\nてぬぐい\nてのひら\nてはい\nてぶくろ\nてふだ\nてほどき\nてほん\nてまえ\nてまきずし\nてみじか\nてみやげ\nてらす\nてれび\nてわけ\nてわたし\nでんあつ\nてんいん\nてんかい\nてんき\nてんぐ\nてんけん\nてんごく\nてんさい\nてんし\nてんすう\nでんち\nてんてき\nてんとう\nてんない\nてんぷら\nてんぼうだい\nてんめつ\nてんらんかい\nでんりょく\nでんわ\nどあい\nといれ\nどうかん\nとうきゅう\nどうぐ\nとうし\nとうむぎ\nとおい\nとおか\nとおく\nとおす\nとおる\nとかい\nとかす\nときおり\nときどき\nとくい\nとくしゅう\nとくてん\nとくに\nとくべつ\nとけい\nとける\nとこや\nとさか\nとしょかん\nとそう\nとたん\nとちゅう\nとっきゅう\nとっくん\nとつぜん\nとつにゅう\nとどける\nととのえる\nとない\nとなえる\nとなり\nとのさま\nとばす\nどぶがわ\nとほう\nとまる\nとめる\nともだち\nともる\nどようび\nとらえる\nとんかつ\nどんぶり\nないかく\nないこう\nないしょ\nないす\nないせん\nないそう\nなおす\nながい\nなくす\nなげる\nなこうど\nなさけ\nなたでここ\nなっとう\nなつやすみ\nななおし\nなにごと\nなにもの\nなにわ\nなのか\nなふだ\nなまいき\nなまえ\nなまみ\nなみだ\nなめらか\nなめる\nなやむ\nならう\nならび\nならぶ\nなれる\nなわとび\nなわばり\nにあう\nにいがた\nにうけ\nにおい\nにかい\nにがて\nにきび\nにくしみ\nにくまん\nにげる\nにさんかたんそ\nにしき\nにせもの\nにちじょう\nにちようび\nにっか\nにっき\nにっけい\nにっこう\nにっさん\nにっしょく\nにっすう\nにっせき\nにってい\nになう\nにほん\nにまめ\nにもつ\nにやり\nにゅういん\nにりんしゃ\nにわとり\nにんい\nにんか\nにんき\nにんげん\nにんしき\nにんずう\nにんそう\nにんたい\nにんち\nにんてい\nにんにく\nにんぷ\nにんまり\nにんむ\nにんめい\nにんよう\nぬいくぎ\nぬかす\nぬぐいとる\nぬぐう\nぬくもり\nぬすむ\nぬまえび\nぬめり\nぬらす\nぬんちゃく\nねあげ\nねいき\nねいる\nねいろ\nねぐせ\nねくたい\nねくら\nねこぜ\nねこむ\nねさげ\nねすごす\nねそべる\nねだん\nねつい\nねっしん\nねつぞう\nねったいぎょ\nねぶそく\nねふだ\nねぼう\nねほりはほり\nねまき\nねまわし\nねみみ\nねむい\nねむたい\nねもと\nねらう\nねわざ\nねんいり\nねんおし\nねんかん\nねんきん\nねんぐ\nねんざ\nねんし\nねんちゃく\nねんど\nねんぴ\nねんぶつ\nねんまつ\nねんりょう\nねんれい\nのいず\nのおづま\nのがす\nのきなみ\nのこぎり\nのこす\nのこる\nのせる\nのぞく\nのぞむ\nのたまう\nのちほど\nのっく\nのばす\nのはら\nのべる\nのぼる\nのみもの\nのやま\nのらいぬ\nのらねこ\nのりもの\nのりゆき\nのれん\nのんき\nばあい\nはあく\nばあさん\nばいか\nばいく\nはいけん\nはいご\nはいしん\nはいすい\nはいせん\nはいそう\nはいち\nばいばい\nはいれつ\nはえる\nはおる\nはかい\nばかり\nはかる\nはくしゅ\nはけん\nはこぶ\nはさみ\nはさん\nはしご\nばしょ\nはしる\nはせる\nぱそこん\nはそん\nはたん\nはちみつ\nはつおん\nはっかく\nはづき\nはっきり\nはっくつ\nはっけん\nはっこう\nはっさん\nはっしん\nはったつ\nはっちゅう\nはってん\nはっぴょう\nはっぽう\nはなす\nはなび\nはにかむ\nはぶらし\nはみがき\nはむかう\nはめつ\nはやい\nはやし\nはらう\nはろうぃん\nはわい\nはんい\nはんえい\nはんおん\nはんかく\nはんきょう\nばんぐみ\nはんこ\nはんしゃ\nはんすう\nはんだん\nぱんち\nぱんつ\nはんてい\nはんとし\nはんのう\nはんぱ\nはんぶん\nはんぺん\nはんぼうき\nはんめい\nはんらん\nはんろん\nひいき\nひうん\nひえる\nひかく\nひかり\nひかる\nひかん\nひくい\nひけつ\nひこうき\nひこく\nひさい\nひさしぶり\nひさん\nびじゅつかん\nひしょ\nひそか\nひそむ\nひたむき\nひだり\nひたる\nひつぎ\nひっこし\nひっし\nひつじゅひん\nひっす\nひつぜん\nぴったり\nぴっちり\nひつよう\nひてい\nひとごみ\nひなまつり\nひなん\nひねる\nひはん\nひびく\nひひょう\nひほう\nひまわり\nひまん\nひみつ\nひめい\nひめじし\nひやけ\nひやす\nひよう\nびょうき\nひらがな\nひらく\nひりつ\nひりょう\nひるま\nひるやすみ\nひれい\nひろい\nひろう\nひろき\nひろゆき\nひんかく\nひんけつ\nひんこん\nひんしゅ\nひんそう\nぴんち\nひんぱん\nびんぼう\nふあん\nふいうち\nふうけい\nふうせん\nぷうたろう\nふうとう\nふうふ\nふえる\nふおん\nふかい\nふきん\nふくざつ\nふくぶくろ\nふこう\nふさい\nふしぎ\nふじみ\nふすま\nふせい\nふせぐ\nふそく\nぶたにく\nふたん\nふちょう\nふつう\nふつか\nふっかつ\nふっき\nふっこく\nぶどう\nふとる\nふとん\nふのう\nふはい\nふひょう\nふへん\nふまん\nふみん\nふめつ\nふめん\nふよう\nふりこ\nふりる\nふるい\nふんいき\nぶんがく\nぶんぐ\nふんしつ\nぶんせき\nふんそう\nぶんぽう\nへいあん\nへいおん\nへいがい\nへいき\nへいげん\nへいこう\nへいさ\nへいしゃ\nへいせつ\nへいそ\nへいたく\nへいてん\nへいねつ\nへいわ\nへきが\nへこむ\nべにいろ\nべにしょうが\nへらす\nへんかん\nべんきょう\nべんごし\nへんさい\nへんたい\nべんり\nほあん\nほいく\nぼうぎょ\nほうこく\nほうそう\nほうほう\nほうもん\nほうりつ\nほえる\nほおん\nほかん\nほきょう\nぼきん\nほくろ\nほけつ\nほけん\nほこう\nほこる\nほしい\nほしつ\nほしゅ\nほしょう\nほせい\nほそい\nほそく\nほたて\nほたる\nぽちぶくろ\nほっきょく\nほっさ\nほったん\nほとんど\nほめる\nほんい\nほんき\nほんけ\nほんしつ\nほんやく\nまいにち\nまかい\nまかせる\nまがる\nまける\nまこと\nまさつ\nまじめ\nますく\nまぜる\nまつり\nまとめ\nまなぶ\nまぬけ\nまねく\nまほう\nまもる\nまゆげ\nまよう\nまろやか\nまわす\nまわり\nまわる\nまんが\nまんきつ\nまんぞく\nまんなか\nみいら\nみうち\nみえる\nみがく\nみかた\nみかん\nみけん\nみこん\nみじかい\nみすい\nみすえる\nみせる\nみっか\nみつかる\nみつける\nみてい\nみとめる\nみなと\nみなみかさい\nみねらる\nみのう\nみのがす\nみほん\nみもと\nみやげ\nみらい\nみりょく\nみわく\nみんか\nみんぞく\nむいか\nむえき\nむえん\nむかい\nむかう\nむかえ\nむかし\nむぎちゃ\nむける\nむげん\nむさぼる\nむしあつい\nむしば\nむじゅん\nむしろ\nむすう\nむすこ\nむすぶ\nむすめ\nむせる\nむせん\nむちゅう\nむなしい\nむのう\nむやみ\nむよう\nむらさき\nむりょう\nむろん\nめいあん\nめいうん\nめいえん\nめいかく\nめいきょく\nめいさい\nめいし\nめいそう\nめいぶつ\nめいれい\nめいわく\nめぐまれる\nめざす\nめした\nめずらしい\nめだつ\nめまい\nめやす\nめんきょ\nめんせき\nめんどう\nもうしあげる\nもうどうけん\nもえる\nもくし\nもくてき\nもくようび\nもちろん\nもどる\nもらう\nもんく\nもんだい\nやおや\nやける\nやさい\nやさしい\nやすい\nやすたろう\nやすみ\nやせる\nやそう\nやたい\nやちん\nやっと\nやっぱり\nやぶる\nやめる\nややこしい\nやよい\nやわらかい\nゆうき\nゆうびんきょく\nゆうべ\nゆうめい\nゆけつ\nゆしゅつ\nゆせん\nゆそう\nゆたか\nゆちゃく\nゆでる\nゆにゅう\nゆびわ\nゆらい\nゆれる\nようい\nようか\nようきゅう\nようじ\nようす\nようちえん\nよかぜ\nよかん\nよきん\nよくせい\nよくぼう\nよけい\nよごれる\nよさん\nよしゅう\nよそう\nよそく\nよっか\nよてい\nよどがわく\nよねつ\nよやく\nよゆう\nよろこぶ\nよろしい\nらいう\nらくがき\nらくご\nらくさつ\nらくだ\nらしんばん\nらせん\nらぞく\nらたい\nらっか\nられつ\nりえき\nりかい\nりきさく\nりきせつ\nりくぐん\nりくつ\nりけん\nりこう\nりせい\nりそう\nりそく\nりてん\nりねん\nりゆう\nりゅうがく\nりよう\nりょうり\nりょかん\nりょくちゃ\nりょこう\nりりく\nりれき\nりろん\nりんご\nるいけい\nるいさい\nるいじ\nるいせき\nるすばん\nるりがわら\nれいかん\nれいぎ\nれいせい\nれいぞうこ\nれいとう\nれいぼう\nれきし\nれきだい\nれんあい\nれんけい\nれんこん\nれんさい\nれんしゅう\nれんぞく\nれんらく\nろうか\nろうご\nろうじん\nろうそく\nろくが\nろこつ\nろじうら\nろしゅつ\nろせん\nろてん\nろめん\nろれつ\nろんぎ\nろんぱ\nろんぶん\nろんり\nわかす\nわかめ\nわかやま\nわかれる\nわしつ\nわじまし\nわすれもの\nわらう\nわれる\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/korean.txt",
    "content": "가격\n가끔\n가난\n가능\n가득\n가르침\n가뭄\n가방\n가상\n가슴\n가운데\n가을\n가이드\n가입\n가장\n가정\n가족\n가죽\n각오\n각자\n간격\n간부\n간섭\n간장\n간접\n간판\n갈등\n갈비\n갈색\n갈증\n감각\n감기\n감소\n감수성\n감자\n감정\n갑자기\n강남\n강당\n강도\n강력히\n강변\n강북\n강사\n강수량\n강아지\n강원도\n강의\n강제\n강조\n같이\n개구리\n개나리\n개방\n개별\n개선\n개성\n개인\n객관적\n거실\n거액\n거울\n거짓\n거품\n걱정\n건강\n건물\n건설\n건조\n건축\n걸음\n검사\n검토\n게시판\n게임\n겨울\n견해\n결과\n결국\n결론\n결석\n결승\n결심\n결정\n결혼\n경계\n경고\n경기\n경력\n경복궁\n경비\n경상도\n경영\n경우\n경쟁\n경제\n경주\n경찰\n경치\n경향\n경험\n계곡\n계단\n계란\n계산\n계속\n계약\n계절\n계층\n계획\n고객\n고구려\n고궁\n고급\n고등학생\n고무신\n고민\n고양이\n고장\n고전\n고집\n고춧가루\n고통\n고향\n곡식\n골목\n골짜기\n골프\n공간\n공개\n공격\n공군\n공급\n공기\n공동\n공무원\n공부\n공사\n공식\n공업\n공연\n공원\n공장\n공짜\n공책\n공통\n공포\n공항\n공휴일\n과목\n과일\n과장\n과정\n과학\n관객\n관계\n관광\n관념\n관람\n관련\n관리\n관습\n관심\n관점\n관찰\n광경\n광고\n광장\n광주\n괴로움\n굉장히\n교과서\n교문\n교복\n교실\n교양\n교육\n교장\n교직\n교통\n교환\n교훈\n구경\n구름\n구멍\n구별\n구분\n구석\n구성\n구속\n구역\n구입\n구청\n구체적\n국가\n국기\n국내\n국립\n국물\n국민\n국수\n국어\n국왕\n국적\n국제\n국회\n군대\n군사\n군인\n궁극적\n권리\n권위\n권투\n귀국\n귀신\n규정\n규칙\n균형\n그날\n그냥\n그늘\n그러나\n그룹\n그릇\n그림\n그제서야\n그토록\n극복\n극히\n근거\n근교\n근래\n근로\n근무\n근본\n근원\n근육\n근처\n글씨\n글자\n금강산\n금고\n금년\n금메달\n금액\n금연\n금요일\n금지\n긍정적\n기간\n기관\n기념\n기능\n기독교\n기둥\n기록\n기름\n기법\n기본\n기분\n기쁨\n기숙사\n기술\n기억\n기업\n기온\n기운\n기원\n기적\n기준\n기침\n기혼\n기획\n긴급\n긴장\n길이\n김밥\n김치\n김포공항\n깍두기\n깜빡\n깨달음\n깨소금\n껍질\n꼭대기\n꽃잎\n나들이\n나란히\n나머지\n나물\n나침반\n나흘\n낙엽\n난방\n날개\n날씨\n날짜\n남녀\n남대문\n남매\n남산\n남자\n남편\n남학생\n낭비\n낱말\n내년\n내용\n내일\n냄비\n냄새\n냇물\n냉동\n냉면\n냉방\n냉장고\n넥타이\n넷째\n노동\n노란색\n노력\n노인\n녹음\n녹차\n녹화\n논리\n논문\n논쟁\n놀이\n농구\n농담\n농민\n농부\n농업\n농장\n농촌\n높이\n눈동자\n눈물\n눈썹\n뉴욕\n느낌\n늑대\n능동적\n능력\n다방\n다양성\n다음\n다이어트\n다행\n단계\n단골\n단독\n단맛\n단순\n단어\n단위\n단점\n단체\n단추\n단편\n단풍\n달걀\n달러\n달력\n달리\n닭고기\n담당\n담배\n담요\n담임\n답변\n답장\n당근\n당분간\n당연히\n당장\n대규모\n대낮\n대단히\n대답\n대도시\n대략\n대량\n대륙\n대문\n대부분\n대신\n대응\n대장\n대전\n대접\n대중\n대책\n대출\n대충\n대통령\n대학\n대한민국\n대합실\n대형\n덩어리\n데이트\n도대체\n도덕\n도둑\n도망\n도서관\n도심\n도움\n도입\n도자기\n도저히\n도전\n도중\n도착\n독감\n독립\n독서\n독일\n독창적\n동화책\n뒷모습\n뒷산\n딸아이\n마누라\n마늘\n마당\n마라톤\n마련\n마무리\n마사지\n마약\n마요네즈\n마을\n마음\n마이크\n마중\n마지막\n마찬가지\n마찰\n마흔\n막걸리\n막내\n막상\n만남\n만두\n만세\n만약\n만일\n만점\n만족\n만화\n많이\n말기\n말씀\n말투\n맘대로\n망원경\n매년\n매달\n매력\n매번\n매스컴\n매일\n매장\n맥주\n먹이\n먼저\n먼지\n멀리\n메일\n며느리\n며칠\n면담\n멸치\n명단\n명령\n명예\n명의\n명절\n명칭\n명함\n모금\n모니터\n모델\n모든\n모범\n모습\n모양\n모임\n모조리\n모집\n모퉁이\n목걸이\n목록\n목사\n목소리\n목숨\n목적\n목표\n몰래\n몸매\n몸무게\n몸살\n몸속\n몸짓\n몸통\n몹시\n무관심\n무궁화\n무더위\n무덤\n무릎\n무슨\n무엇\n무역\n무용\n무조건\n무지개\n무척\n문구\n문득\n문법\n문서\n문제\n문학\n문화\n물가\n물건\n물결\n물고기\n물론\n물리학\n물음\n물질\n물체\n미국\n미디어\n미사일\n미술\n미역\n미용실\n미움\n미인\n미팅\n미혼\n민간\n민족\n민주\n믿음\n밀가루\n밀리미터\n밑바닥\n바가지\n바구니\n바나나\n바늘\n바닥\n바닷가\n바람\n바이러스\n바탕\n박물관\n박사\n박수\n반대\n반드시\n반말\n반발\n반성\n반응\n반장\n반죽\n반지\n반찬\n받침\n발가락\n발걸음\n발견\n발달\n발레\n발목\n발바닥\n발생\n발음\n발자국\n발전\n발톱\n발표\n밤하늘\n밥그릇\n밥맛\n밥상\n밥솥\n방금\n방면\n방문\n방바닥\n방법\n방송\n방식\n방안\n방울\n방지\n방학\n방해\n방향\n배경\n배꼽\n배달\n배드민턴\n백두산\n백색\n백성\n백인\n백제\n백화점\n버릇\n버섯\n버튼\n번개\n번역\n번지\n번호\n벌금\n벌레\n벌써\n범위\n범인\n범죄\n법률\n법원\n법적\n법칙\n베이징\n벨트\n변경\n변동\n변명\n변신\n변호사\n변화\n별도\n별명\n별일\n병실\n병아리\n병원\n보관\n보너스\n보라색\n보람\n보름\n보상\n보안\n보자기\n보장\n보전\n보존\n보통\n보편적\n보험\n복도\n복사\n복숭아\n복습\n볶음\n본격적\n본래\n본부\n본사\n본성\n본인\n본질\n볼펜\n봉사\n봉지\n봉투\n부근\n부끄러움\n부담\n부동산\n부문\n부분\n부산\n부상\n부엌\n부인\n부작용\n부장\n부정\n부족\n부지런히\n부친\n부탁\n부품\n부회장\n북부\n북한\n분노\n분량\n분리\n분명\n분석\n분야\n분위기\n분필\n분홍색\n불고기\n불과\n불교\n불꽃\n불만\n불법\n불빛\n불안\n불이익\n불행\n브랜드\n비극\n비난\n비닐\n비둘기\n비디오\n비로소\n비만\n비명\n비밀\n비바람\n비빔밥\n비상\n비용\n비율\n비중\n비타민\n비판\n빌딩\n빗물\n빗방울\n빗줄기\n빛깔\n빨간색\n빨래\n빨리\n사건\n사계절\n사나이\n사냥\n사람\n사랑\n사립\n사모님\n사물\n사방\n사상\n사생활\n사설\n사슴\n사실\n사업\n사용\n사월\n사장\n사전\n사진\n사촌\n사춘기\n사탕\n사투리\n사흘\n산길\n산부인과\n산업\n산책\n살림\n살인\n살짝\n삼계탕\n삼국\n삼십\n삼월\n삼촌\n상관\n상금\n상대\n상류\n상반기\n상상\n상식\n상업\n상인\n상자\n상점\n상처\n상추\n상태\n상표\n상품\n상황\n새벽\n색깔\n색연필\n생각\n생명\n생물\n생방송\n생산\n생선\n생신\n생일\n생활\n서랍\n서른\n서명\n서민\n서비스\n서양\n서울\n서적\n서점\n서쪽\n서클\n석사\n석유\n선거\n선물\n선배\n선생\n선수\n선원\n선장\n선전\n선택\n선풍기\n설거지\n설날\n설렁탕\n설명\n설문\n설사\n설악산\n설치\n설탕\n섭씨\n성공\n성당\n성명\n성별\n성인\n성장\n성적\n성질\n성함\n세금\n세미나\n세상\n세월\n세종대왕\n세탁\n센터\n센티미터\n셋째\n소규모\n소극적\n소금\n소나기\n소년\n소득\n소망\n소문\n소설\n소속\n소아과\n소용\n소원\n소음\n소중히\n소지품\n소질\n소풍\n소형\n속담\n속도\n속옷\n손가락\n손길\n손녀\n손님\n손등\n손목\n손뼉\n손실\n손질\n손톱\n손해\n솔직히\n솜씨\n송아지\n송이\n송편\n쇠고기\n쇼핑\n수건\n수년\n수단\n수돗물\n수동적\n수면\n수명\n수박\n수상\n수석\n수술\n수시로\n수업\n수염\n수영\n수입\n수준\n수집\n수출\n수컷\n수필\n수학\n수험생\n수화기\n숙녀\n숙소\n숙제\n순간\n순서\n순수\n순식간\n순위\n숟가락\n술병\n술집\n숫자\n스님\n스물\n스스로\n스승\n스웨터\n스위치\n스케이트\n스튜디오\n스트레스\n스포츠\n슬쩍\n슬픔\n습관\n습기\n승객\n승리\n승부\n승용차\n승진\n시각\n시간\n시골\n시금치\n시나리오\n시댁\n시리즈\n시멘트\n시민\n시부모\n시선\n시설\n시스템\n시아버지\n시어머니\n시월\n시인\n시일\n시작\n시장\n시절\n시점\n시중\n시즌\n시집\n시청\n시합\n시험\n식구\n식기\n식당\n식량\n식료품\n식물\n식빵\n식사\n식생활\n식초\n식탁\n식품\n신고\n신규\n신념\n신문\n신발\n신비\n신사\n신세\n신용\n신제품\n신청\n신체\n신화\n실감\n실내\n실력\n실례\n실망\n실수\n실습\n실시\n실장\n실정\n실질적\n실천\n실체\n실컷\n실태\n실패\n실험\n실현\n심리\n심부름\n심사\n심장\n심정\n심판\n쌍둥이\n씨름\n씨앗\n아가씨\n아나운서\n아드님\n아들\n아쉬움\n아스팔트\n아시아\n아울러\n아저씨\n아줌마\n아직\n아침\n아파트\n아프리카\n아픔\n아홉\n아흔\n악기\n악몽\n악수\n안개\n안경\n안과\n안내\n안녕\n안동\n안방\n안부\n안주\n알루미늄\n알코올\n암시\n암컷\n압력\n앞날\n앞문\n애인\n애정\n액수\n앨범\n야간\n야단\n야옹\n약간\n약국\n약속\n약수\n약점\n약품\n약혼녀\n양념\n양력\n양말\n양배추\n양주\n양파\n어둠\n어려움\n어른\n어젯밤\n어쨌든\n어쩌다가\n어쩐지\n언니\n언덕\n언론\n언어\n얼굴\n얼른\n얼음\n얼핏\n엄마\n업무\n업종\n업체\n엉덩이\n엉망\n엉터리\n엊그제\n에너지\n에어컨\n엔진\n여건\n여고생\n여관\n여군\n여권\n여대생\n여덟\n여동생\n여든\n여론\n여름\n여섯\n여성\n여왕\n여인\n여전히\n여직원\n여학생\n여행\n역사\n역시\n역할\n연결\n연구\n연극\n연기\n연락\n연설\n연세\n연속\n연습\n연애\n연예인\n연인\n연장\n연주\n연출\n연필\n연합\n연휴\n열기\n열매\n열쇠\n열심히\n열정\n열차\n열흘\n염려\n엽서\n영국\n영남\n영상\n영양\n영역\n영웅\n영원히\n영하\n영향\n영혼\n영화\n옆구리\n옆방\n옆집\n예감\n예금\n예방\n예산\n예상\n예선\n예술\n예습\n예식장\n예약\n예전\n예절\n예정\n예컨대\n옛날\n오늘\n오락\n오랫동안\n오렌지\n오로지\n오른발\n오븐\n오십\n오염\n오월\n오전\n오직\n오징어\n오페라\n오피스텔\n오히려\n옥상\n옥수수\n온갖\n온라인\n온몸\n온종일\n온통\n올가을\n올림픽\n올해\n옷차림\n와이셔츠\n와인\n완성\n완전\n왕비\n왕자\n왜냐하면\n왠지\n외갓집\n외국\n외로움\n외삼촌\n외출\n외침\n외할머니\n왼발\n왼손\n왼쪽\n요금\n요일\n요즘\n요청\n용기\n용서\n용어\n우산\n우선\n우승\n우연히\n우정\n우체국\n우편\n운동\n운명\n운반\n운전\n운행\n울산\n울음\n움직임\n웃어른\n웃음\n워낙\n원고\n원래\n원서\n원숭이\n원인\n원장\n원피스\n월급\n월드컵\n월세\n월요일\n웨이터\n위반\n위법\n위성\n위원\n위험\n위협\n윗사람\n유난히\n유럽\n유명\n유물\n유산\n유적\n유치원\n유학\n유행\n유형\n육군\n육상\n육십\n육체\n은행\n음력\n음료\n음반\n음성\n음식\n음악\n음주\n의견\n의논\n의문\n의복\n의식\n의심\n의외로\n의욕\n의원\n의학\n이것\n이곳\n이념\n이놈\n이달\n이대로\n이동\n이렇게\n이력서\n이론적\n이름\n이민\n이발소\n이별\n이불\n이빨\n이상\n이성\n이슬\n이야기\n이용\n이웃\n이월\n이윽고\n이익\n이전\n이중\n이튿날\n이틀\n이혼\n인간\n인격\n인공\n인구\n인근\n인기\n인도\n인류\n인물\n인생\n인쇄\n인연\n인원\n인재\n인종\n인천\n인체\n인터넷\n인하\n인형\n일곱\n일기\n일단\n일대\n일등\n일반\n일본\n일부\n일상\n일생\n일손\n일요일\n일월\n일정\n일종\n일주일\n일찍\n일체\n일치\n일행\n일회용\n임금\n임무\n입대\n입력\n입맛\n입사\n입술\n입시\n입원\n입장\n입학\n자가용\n자격\n자극\n자동\n자랑\n자부심\n자식\n자신\n자연\n자원\n자율\n자전거\n자정\n자존심\n자판\n작가\n작년\n작성\n작업\n작용\n작은딸\n작품\n잔디\n잔뜩\n잔치\n잘못\n잠깐\n잠수함\n잠시\n잠옷\n잠자리\n잡지\n장관\n장군\n장기간\n장래\n장례\n장르\n장마\n장면\n장모\n장미\n장비\n장사\n장소\n장식\n장애인\n장인\n장점\n장차\n장학금\n재능\n재빨리\n재산\n재생\n재작년\n재정\n재채기\n재판\n재학\n재활용\n저것\n저고리\n저곳\n저녁\n저런\n저렇게\n저번\n저울\n저절로\n저축\n적극\n적당히\n적성\n적용\n적응\n전개\n전공\n전기\n전달\n전라도\n전망\n전문\n전반\n전부\n전세\n전시\n전용\n전자\n전쟁\n전주\n전철\n전체\n전통\n전혀\n전후\n절대\n절망\n절반\n절약\n절차\n점검\n점수\n점심\n점원\n점점\n점차\n접근\n접시\n접촉\n젓가락\n정거장\n정도\n정류장\n정리\n정말\n정면\n정문\n정반대\n정보\n정부\n정비\n정상\n정성\n정오\n정원\n정장\n정지\n정치\n정확히\n제공\n제과점\n제대로\n제목\n제발\n제법\n제삿날\n제안\n제일\n제작\n제주도\n제출\n제품\n제한\n조각\n조건\n조금\n조깅\n조명\n조미료\n조상\n조선\n조용히\n조절\n조정\n조직\n존댓말\n존재\n졸업\n졸음\n종교\n종로\n종류\n종소리\n종업원\n종종\n종합\n좌석\n죄인\n주관적\n주름\n주말\n주머니\n주먹\n주문\n주민\n주방\n주변\n주식\n주인\n주일\n주장\n주전자\n주택\n준비\n줄거리\n줄기\n줄무늬\n중간\n중계방송\n중국\n중년\n중단\n중독\n중반\n중부\n중세\n중소기업\n중순\n중앙\n중요\n중학교\n즉석\n즉시\n즐거움\n증가\n증거\n증권\n증상\n증세\n지각\n지갑\n지경\n지극히\n지금\n지급\n지능\n지름길\n지리산\n지방\n지붕\n지식\n지역\n지우개\n지원\n지적\n지점\n지진\n지출\n직선\n직업\n직원\n직장\n진급\n진동\n진로\n진료\n진리\n진짜\n진찰\n진출\n진통\n진행\n질문\n질병\n질서\n짐작\n집단\n집안\n집중\n짜증\n찌꺼기\n차남\n차라리\n차량\n차림\n차별\n차선\n차츰\n착각\n찬물\n찬성\n참가\n참기름\n참새\n참석\n참여\n참외\n참조\n찻잔\n창가\n창고\n창구\n창문\n창밖\n창작\n창조\n채널\n채점\n책가방\n책방\n책상\n책임\n챔피언\n처벌\n처음\n천국\n천둥\n천장\n천재\n천천히\n철도\n철저히\n철학\n첫날\n첫째\n청년\n청바지\n청소\n청춘\n체계\n체력\n체온\n체육\n체중\n체험\n초등학생\n초반\n초밥\n초상화\n초순\n초여름\n초원\n초저녁\n초점\n초청\n초콜릿\n촛불\n총각\n총리\n총장\n촬영\n최근\n최상\n최선\n최신\n최악\n최종\n추석\n추억\n추진\n추천\n추측\n축구\n축소\n축제\n축하\n출근\n출발\n출산\n출신\n출연\n출입\n출장\n출판\n충격\n충고\n충돌\n충분히\n충청도\n취업\n취직\n취향\n치약\n친구\n친척\n칠십\n칠월\n칠판\n침대\n침묵\n침실\n칫솔\n칭찬\n카메라\n카운터\n칼국수\n캐릭터\n캠퍼스\n캠페인\n커튼\n컨디션\n컬러\n컴퓨터\n코끼리\n코미디\n콘서트\n콜라\n콤플렉스\n콩나물\n쾌감\n쿠데타\n크림\n큰길\n큰딸\n큰소리\n큰아들\n큰어머니\n큰일\n큰절\n클래식\n클럽\n킬로\n타입\n타자기\n탁구\n탁자\n탄생\n태권도\n태양\n태풍\n택시\n탤런트\n터널\n터미널\n테니스\n테스트\n테이블\n텔레비전\n토론\n토마토\n토요일\n통계\n통과\n통로\n통신\n통역\n통일\n통장\n통제\n통증\n통합\n통화\n퇴근\n퇴원\n퇴직금\n튀김\n트럭\n특급\n특별\n특성\n특수\n특징\n특히\n튼튼히\n티셔츠\n파란색\n파일\n파출소\n판결\n판단\n판매\n판사\n팔십\n팔월\n팝송\n패션\n팩스\n팩시밀리\n팬티\n퍼센트\n페인트\n편견\n편의\n편지\n편히\n평가\n평균\n평생\n평소\n평양\n평일\n평화\n포스터\n포인트\n포장\n포함\n표면\n표정\n표준\n표현\n품목\n품질\n풍경\n풍속\n풍습\n프랑스\n프린터\n플라스틱\n피곤\n피망\n피아노\n필름\n필수\n필요\n필자\n필통\n핑계\n하느님\n하늘\n하드웨어\n하룻밤\n하반기\n하숙집\n하순\n하여튼\n하지만\n하천\n하품\n하필\n학과\n학교\n학급\n학기\n학년\n학력\n학번\n학부모\n학비\n학생\n학술\n학습\n학용품\n학원\n학위\n학자\n학점\n한계\n한글\n한꺼번에\n한낮\n한눈\n한동안\n한때\n한라산\n한마디\n한문\n한번\n한복\n한식\n한여름\n한쪽\n할머니\n할아버지\n할인\n함께\n함부로\n합격\n합리적\n항공\n항구\n항상\n항의\n해결\n해군\n해답\n해당\n해물\n해석\n해설\n해수욕장\n해안\n핵심\n핸드백\n햄버거\n햇볕\n햇살\n행동\n행복\n행사\n행운\n행위\n향기\n향상\n향수\n허락\n허용\n헬기\n현관\n현금\n현대\n현상\n현실\n현장\n현재\n현지\n혈액\n협력\n형부\n형사\n형수\n형식\n형제\n형태\n형편\n혜택\n호기심\n호남\n호랑이\n호박\n호텔\n호흡\n혹시\n홀로\n홈페이지\n홍보\n홍수\n홍차\n화면\n화분\n화살\n화요일\n화장\n화학\n확보\n확인\n확장\n확정\n환갑\n환경\n환영\n환율\n환자\n활기\n활동\n활발히\n활용\n활짝\n회견\n회관\n회복\n회색\n회원\n회장\n회전\n횟수\n횡단보도\n효율적\n후반\n후춧가루\n훈련\n훨씬\n휴식\n휴일\n흉내\n흐름\n흑백\n흑인\n흔적\n흔히\n흥미\n흥분\n희곡\n희망\n희생\n흰색\n힘껏\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/langs/spanish.txt",
    "content": "ábaco\nabdomen\nabeja\nabierto\nabogado\nabono\naborto\nabrazo\nabrir\nabuelo\nabuso\nacabar\nacademia\nacceso\nacción\naceite\nacelga\nacento\naceptar\nácido\naclarar\nacné\nacoger\nacoso\nactivo\nacto\nactriz\nactuar\nacudir\nacuerdo\nacusar\nadicto\nadmitir\nadoptar\nadorno\naduana\nadulto\naéreo\nafectar\nafición\nafinar\nafirmar\nágil\nagitar\nagonía\nagosto\nagotar\nagregar\nagrio\nagua\nagudo\náguila\naguja\nahogo\nahorro\naire\naislar\najedrez\najeno\najuste\nalacrán\nalambre\nalarma\nalba\nálbum\nalcalde\naldea\nalegre\nalejar\nalerta\naleta\nalfiler\nalga\nalgodón\naliado\naliento\nalivio\nalma\nalmeja\nalmíbar\naltar\nalteza\naltivo\nalto\naltura\nalumno\nalzar\namable\namante\namapola\namargo\namasar\námbar\námbito\nameno\namigo\namistad\namor\namparo\namplio\nancho\nanciano\nancla\nandar\nandén\nanemia\nángulo\nanillo\nánimo\nanís\nanotar\nantena\nantiguo\nantojo\nanual\nanular\nanuncio\nañadir\nañejo\naño\napagar\naparato\napetito\napio\naplicar\napodo\naporte\napoyo\naprender\naprobar\napuesta\napuro\narado\naraña\narar\nárbitro\nárbol\narbusto\narchivo\narco\narder\nardilla\narduo\nárea\nárido\naries\narmonía\narnés\naroma\narpa\narpón\narreglo\narroz\narruga\narte\nartista\nasa\nasado\nasalto\nascenso\nasegurar\naseo\nasesor\nasiento\nasilo\nasistir\nasno\nasombro\náspero\nastilla\nastro\nastuto\nasumir\nasunto\natajo\nataque\natar\natento\nateo\nático\natleta\nátomo\natraer\natroz\natún\naudaz\naudio\nauge\naula\naumento\nausente\nautor\naval\navance\navaro\nave\navellana\navena\navestruz\navión\naviso\nayer\nayuda\nayuno\nazafrán\nazar\nazote\nazúcar\nazufre\nazul\nbaba\nbabor\nbache\nbahía\nbaile\nbajar\nbalanza\nbalcón\nbalde\nbambú\nbanco\nbanda\nbaño\nbarba\nbarco\nbarniz\nbarro\nbáscula\nbastón\nbasura\nbatalla\nbatería\nbatir\nbatuta\nbaúl\nbazar\nbebé\nbebida\nbello\nbesar\nbeso\nbestia\nbicho\nbien\nbingo\nblanco\nbloque\nblusa\nboa\nbobina\nbobo\nboca\nbocina\nboda\nbodega\nboina\nbola\nbolero\nbolsa\nbomba\nbondad\nbonito\nbono\nbonsái\nborde\nborrar\nbosque\nbote\nbotín\nbóveda\nbozal\nbravo\nbrazo\nbrecha\nbreve\nbrillo\nbrinco\nbrisa\nbroca\nbroma\nbronce\nbrote\nbruja\nbrusco\nbruto\nbuceo\nbucle\nbueno\nbuey\nbufanda\nbufón\nbúho\nbuitre\nbulto\nburbuja\nburla\nburro\nbuscar\nbutaca\nbuzón\ncaballo\ncabeza\ncabina\ncabra\ncacao\ncadáver\ncadena\ncaer\ncafé\ncaída\ncaimán\ncaja\ncajón\ncal\ncalamar\ncalcio\ncaldo\ncalidad\ncalle\ncalma\ncalor\ncalvo\ncama\ncambio\ncamello\ncamino\ncampo\ncáncer\ncandil\ncanela\ncanguro\ncanica\ncanto\ncaña\ncañón\ncaoba\ncaos\ncapaz\ncapitán\ncapote\ncaptar\ncapucha\ncara\ncarbón\ncárcel\ncareta\ncarga\ncariño\ncarne\ncarpeta\ncarro\ncarta\ncasa\ncasco\ncasero\ncaspa\ncastor\ncatorce\ncatre\ncaudal\ncausa\ncazo\ncebolla\nceder\ncedro\ncelda\ncélebre\nceloso\ncélula\ncemento\nceniza\ncentro\ncerca\ncerdo\ncereza\ncero\ncerrar\ncerteza\ncésped\ncetro\nchacal\nchaleco\nchampú\nchancla\nchapa\ncharla\nchico\nchiste\nchivo\nchoque\nchoza\nchuleta\nchupar\nciclón\nciego\ncielo\ncien\ncierto\ncifra\ncigarro\ncima\ncinco\ncine\ncinta\nciprés\ncirco\nciruela\ncisne\ncita\nciudad\nclamor\nclan\nclaro\nclase\nclave\ncliente\nclima\nclínica\ncobre\ncocción\ncochino\ncocina\ncoco\ncódigo\ncodo\ncofre\ncoger\ncohete\ncojín\ncojo\ncola\ncolcha\ncolegio\ncolgar\ncolina\ncollar\ncolmo\ncolumna\ncombate\ncomer\ncomida\ncómodo\ncompra\nconde\nconejo\nconga\nconocer\nconsejo\ncontar\ncopa\ncopia\ncorazón\ncorbata\ncorcho\ncordón\ncorona\ncorrer\ncoser\ncosmos\ncosta\ncráneo\ncráter\ncrear\ncrecer\ncreído\ncrema\ncría\ncrimen\ncripta\ncrisis\ncromo\ncrónica\ncroqueta\ncrudo\ncruz\ncuadro\ncuarto\ncuatro\ncubo\ncubrir\ncuchara\ncuello\ncuento\ncuerda\ncuesta\ncueva\ncuidar\nculebra\nculpa\nculto\ncumbre\ncumplir\ncuna\ncuneta\ncuota\ncupón\ncúpula\ncurar\ncurioso\ncurso\ncurva\ncutis\ndama\ndanza\ndar\ndardo\ndátil\ndeber\ndébil\ndécada\ndecir\ndedo\ndefensa\ndefinir\ndejar\ndelfín\ndelgado\ndelito\ndemora\ndenso\ndental\ndeporte\nderecho\nderrota\ndesayuno\ndeseo\ndesfile\ndesnudo\ndestino\ndesvío\ndetalle\ndetener\ndeuda\ndía\ndiablo\ndiadema\ndiamante\ndiana\ndiario\ndibujo\ndictar\ndiente\ndieta\ndiez\ndifícil\ndigno\ndilema\ndiluir\ndinero\ndirecto\ndirigir\ndisco\ndiseño\ndisfraz\ndiva\ndivino\ndoble\ndoce\ndolor\ndomingo\ndon\ndonar\ndorado\ndormir\ndorso\ndos\ndosis\ndragón\ndroga\nducha\nduda\nduelo\ndueño\ndulce\ndúo\nduque\ndurar\ndureza\nduro\nébano\nebrio\nechar\neco\necuador\nedad\nedición\nedificio\neditor\neducar\nefecto\neficaz\neje\nejemplo\nelefante\nelegir\nelemento\nelevar\nelipse\nélite\nelixir\nelogio\neludir\nembudo\nemitir\nemoción\nempate\nempeño\nempleo\nempresa\nenano\nencargo\nenchufe\nencía\nenemigo\nenero\nenfado\nenfermo\nengaño\nenigma\nenlace\nenorme\nenredo\nensayo\nenseñar\nentero\nentrar\nenvase\nenvío\népoca\nequipo\nerizo\nescala\nescena\nescolar\nescribir\nescudo\nesencia\nesfera\nesfuerzo\nespada\nespejo\nespía\nesposa\nespuma\nesquí\nestar\neste\nestilo\nestufa\netapa\neterno\nética\netnia\nevadir\nevaluar\nevento\nevitar\nexacto\nexamen\nexceso\nexcusa\nexento\nexigir\nexilio\nexistir\néxito\nexperto\nexplicar\nexponer\nextremo\nfábrica\nfábula\nfachada\nfácil\nfactor\nfaena\nfaja\nfalda\nfallo\nfalso\nfaltar\nfama\nfamilia\nfamoso\nfaraón\nfarmacia\nfarol\nfarsa\nfase\nfatiga\nfauna\nfavor\nfax\nfebrero\nfecha\nfeliz\nfeo\nferia\nferoz\nfértil\nfervor\nfestín\nfiable\nfianza\nfiar\nfibra\nficción\nficha\nfideo\nfiebre\nfiel\nfiera\nfiesta\nfigura\nfijar\nfijo\nfila\nfilete\nfilial\nfiltro\nfin\nfinca\nfingir\nfinito\nfirma\nflaco\nflauta\nflecha\nflor\nflota\nfluir\nflujo\nflúor\nfobia\nfoca\nfogata\nfogón\nfolio\nfolleto\nfondo\nforma\nforro\nfortuna\nforzar\nfosa\nfoto\nfracaso\nfrágil\nfranja\nfrase\nfraude\nfreír\nfreno\nfresa\nfrío\nfrito\nfruta\nfuego\nfuente\nfuerza\nfuga\nfumar\nfunción\nfunda\nfurgón\nfuria\nfusil\nfútbol\nfuturo\ngacela\ngafas\ngaita\ngajo\ngala\ngalería\ngallo\ngamba\nganar\ngancho\nganga\nganso\ngaraje\ngarza\ngasolina\ngastar\ngato\ngavilán\ngemelo\ngemir\ngen\ngénero\ngenio\ngente\ngeranio\ngerente\ngermen\ngesto\ngigante\ngimnasio\ngirar\ngiro\nglaciar\nglobo\ngloria\ngol\ngolfo\ngoloso\ngolpe\ngoma\ngordo\ngorila\ngorra\ngota\ngoteo\ngozar\ngrada\ngráfico\ngrano\ngrasa\ngratis\ngrave\ngrieta\ngrillo\ngripe\ngris\ngrito\ngrosor\ngrúa\ngrueso\ngrumo\ngrupo\nguante\nguapo\nguardia\nguerra\nguía\nguiño\nguion\nguiso\nguitarra\ngusano\ngustar\nhaber\nhábil\nhablar\nhacer\nhacha\nhada\nhallar\nhamaca\nharina\nhaz\nhazaña\nhebilla\nhebra\nhecho\nhelado\nhelio\nhembra\nherir\nhermano\nhéroe\nhervir\nhielo\nhierro\nhígado\nhigiene\nhijo\nhimno\nhistoria\nhocico\nhogar\nhoguera\nhoja\nhombre\nhongo\nhonor\nhonra\nhora\nhormiga\nhorno\nhostil\nhoyo\nhueco\nhuelga\nhuerta\nhueso\nhuevo\nhuida\nhuir\nhumano\nhúmedo\nhumilde\nhumo\nhundir\nhuracán\nhurto\nicono\nideal\nidioma\nídolo\niglesia\niglú\nigual\nilegal\nilusión\nimagen\nimán\nimitar\nimpar\nimperio\nimponer\nimpulso\nincapaz\níndice\ninerte\ninfiel\ninforme\ningenio\ninicio\ninmenso\ninmune\ninnato\ninsecto\ninstante\ninterés\níntimo\nintuir\ninútil\ninvierno\nira\niris\nironía\nisla\nislote\njabalí\njabón\njamón\njarabe\njardín\njarra\njaula\njazmín\njefe\njeringa\njinete\njornada\njoroba\njoven\njoya\njuerga\njueves\njuez\njugador\njugo\njuguete\njuicio\njunco\njungla\njunio\njuntar\njúpiter\njurar\njusto\njuvenil\njuzgar\nkilo\nkoala\nlabio\nlacio\nlacra\nlado\nladrón\nlagarto\nlágrima\nlaguna\nlaico\nlamer\nlámina\nlámpara\nlana\nlancha\nlangosta\nlanza\nlápiz\nlargo\nlarva\nlástima\nlata\nlátex\nlatir\nlaurel\nlavar\nlazo\nleal\nlección\nleche\nlector\nleer\nlegión\nlegumbre\nlejano\nlengua\nlento\nleña\nleón\nleopardo\nlesión\nletal\nletra\nleve\nleyenda\nlibertad\nlibro\nlicor\nlíder\nlidiar\nlienzo\nliga\nligero\nlima\nlímite\nlimón\nlimpio\nlince\nlindo\nlínea\nlingote\nlino\nlinterna\nlíquido\nliso\nlista\nlitera\nlitio\nlitro\nllaga\nllama\nllanto\nllave\nllegar\nllenar\nllevar\nllorar\nllover\nlluvia\nlobo\nloción\nloco\nlocura\nlógica\nlogro\nlombriz\nlomo\nlonja\nlote\nlucha\nlucir\nlugar\nlujo\nluna\nlunes\nlupa\nlustro\nluto\nluz\nmaceta\nmacho\nmadera\nmadre\nmaduro\nmaestro\nmafia\nmagia\nmago\nmaíz\nmaldad\nmaleta\nmalla\nmalo\nmamá\nmambo\nmamut\nmanco\nmando\nmanejar\nmanga\nmaniquí\nmanjar\nmano\nmanso\nmanta\nmañana\nmapa\nmáquina\nmar\nmarco\nmarea\nmarfil\nmargen\nmarido\nmármol\nmarrón\nmartes\nmarzo\nmasa\nmáscara\nmasivo\nmatar\nmateria\nmatiz\nmatriz\nmáximo\nmayor\nmazorca\nmecha\nmedalla\nmedio\nmédula\nmejilla\nmejor\nmelena\nmelón\nmemoria\nmenor\nmensaje\nmente\nmenú\nmercado\nmerengue\nmérito\nmes\nmesón\nmeta\nmeter\nmétodo\nmetro\nmezcla\nmiedo\nmiel\nmiembro\nmiga\nmil\nmilagro\nmilitar\nmillón\nmimo\nmina\nminero\nmínimo\nminuto\nmiope\nmirar\nmisa\nmiseria\nmisil\nmismo\nmitad\nmito\nmochila\nmoción\nmoda\nmodelo\nmoho\nmojar\nmolde\nmoler\nmolino\nmomento\nmomia\nmonarca\nmoneda\nmonja\nmonto\nmoño\nmorada\nmorder\nmoreno\nmorir\nmorro\nmorsa\nmortal\nmosca\nmostrar\nmotivo\nmover\nmóvil\nmozo\nmucho\nmudar\nmueble\nmuela\nmuerte\nmuestra\nmugre\nmujer\nmula\nmuleta\nmulta\nmundo\nmuñeca\nmural\nmuro\nmúsculo\nmuseo\nmusgo\nmúsica\nmuslo\nnácar\nnación\nnadar\nnaipe\nnaranja\nnariz\nnarrar\nnasal\nnatal\nnativo\nnatural\nnáusea\nnaval\nnave\nnavidad\nnecio\nnéctar\nnegar\nnegocio\nnegro\nneón\nnervio\nneto\nneutro\nnevar\nnevera\nnicho\nnido\nniebla\nnieto\nniñez\nniño\nnítido\nnivel\nnobleza\nnoche\nnómina\nnoria\nnorma\nnorte\nnota\nnoticia\nnovato\nnovela\nnovio\nnube\nnuca\nnúcleo\nnudillo\nnudo\nnuera\nnueve\nnuez\nnulo\nnúmero\nnutria\noasis\nobeso\nobispo\nobjeto\nobra\nobrero\nobservar\nobtener\nobvio\noca\nocaso\nocéano\nochenta\nocho\nocio\nocre\noctavo\noctubre\noculto\nocupar\nocurrir\nodiar\nodio\nodisea\noeste\nofensa\noferta\noficio\nofrecer\nogro\noído\noír\nojo\nola\noleada\nolfato\nolivo\nolla\nolmo\nolor\nolvido\nombligo\nonda\nonza\nopaco\nopción\nópera\nopinar\noponer\noptar\nóptica\nopuesto\noración\norador\noral\nórbita\norca\norden\noreja\nórgano\norgía\norgullo\noriente\norigen\norilla\noro\norquesta\noruga\nosadía\noscuro\nosezno\noso\nostra\notoño\notro\noveja\nóvulo\nóxido\noxígeno\noyente\nozono\npacto\npadre\npaella\npágina\npago\npaís\npájaro\npalabra\npalco\npaleta\npálido\npalma\npaloma\npalpar\npan\npanal\npánico\npantera\npañuelo\npapá\npapel\npapilla\npaquete\nparar\nparcela\npared\nparir\nparo\npárpado\nparque\npárrafo\nparte\npasar\npaseo\npasión\npaso\npasta\npata\npatio\npatria\npausa\npauta\npavo\npayaso\npeatón\npecado\npecera\npecho\npedal\npedir\npegar\npeine\npelar\npeldaño\npelea\npeligro\npellejo\npelo\npeluca\npena\npensar\npeñón\npeón\npeor\npepino\npequeño\npera\npercha\nperder\npereza\nperfil\nperico\nperla\npermiso\nperro\npersona\npesa\npesca\npésimo\npestaña\npétalo\npetróleo\npez\npezuña\npicar\npichón\npie\npiedra\npierna\npieza\npijama\npilar\npiloto\npimienta\npino\npintor\npinza\npiña\npiojo\npipa\npirata\npisar\npiscina\npiso\npista\npitón\npizca\nplaca\nplan\nplata\nplaya\nplaza\npleito\npleno\nplomo\npluma\nplural\npobre\npoco\npoder\npodio\npoema\npoesía\npoeta\npolen\npolicía\npollo\npolvo\npomada\npomelo\npomo\npompa\nponer\nporción\nportal\nposada\nposeer\nposible\nposte\npotencia\npotro\npozo\nprado\nprecoz\npregunta\npremio\nprensa\npreso\nprevio\nprimo\npríncipe\nprisión\nprivar\nproa\nprobar\nproceso\nproducto\nproeza\nprofesor\nprograma\nprole\npromesa\npronto\npropio\npróximo\nprueba\npúblico\npuchero\npudor\npueblo\npuerta\npuesto\npulga\npulir\npulmón\npulpo\npulso\npuma\npunto\npuñal\npuño\npupa\npupila\npuré\nquedar\nqueja\nquemar\nquerer\nqueso\nquieto\nquímica\nquince\nquitar\nrábano\nrabia\nrabo\nración\nradical\nraíz\nrama\nrampa\nrancho\nrango\nrapaz\nrápido\nrapto\nrasgo\nraspa\nrato\nrayo\nraza\nrazón\nreacción\nrealidad\nrebaño\nrebote\nrecaer\nreceta\nrechazo\nrecoger\nrecreo\nrecto\nrecurso\nred\nredondo\nreducir\nreflejo\nreforma\nrefrán\nrefugio\nregalo\nregir\nregla\nregreso\nrehén\nreino\nreír\nreja\nrelato\nrelevo\nrelieve\nrelleno\nreloj\nremar\nremedio\nremo\nrencor\nrendir\nrenta\nreparto\nrepetir\nreposo\nreptil\nres\nrescate\nresina\nrespeto\nresto\nresumen\nretiro\nretorno\nretrato\nreunir\nrevés\nrevista\nrey\nrezar\nrico\nriego\nrienda\nriesgo\nrifa\nrígido\nrigor\nrincón\nriñón\nrío\nriqueza\nrisa\nritmo\nrito\nrizo\nroble\nroce\nrociar\nrodar\nrodeo\nrodilla\nroer\nrojizo\nrojo\nromero\nromper\nron\nronco\nronda\nropa\nropero\nrosa\nrosca\nrostro\nrotar\nrubí\nrubor\nrudo\nrueda\nrugir\nruido\nruina\nruleta\nrulo\nrumbo\nrumor\nruptura\nruta\nrutina\nsábado\nsaber\nsabio\nsable\nsacar\nsagaz\nsagrado\nsala\nsaldo\nsalero\nsalir\nsalmón\nsalón\nsalsa\nsalto\nsalud\nsalvar\nsamba\nsanción\nsandía\nsanear\nsangre\nsanidad\nsano\nsanto\nsapo\nsaque\nsardina\nsartén\nsastre\nsatán\nsauna\nsaxofón\nsección\nseco\nsecreto\nsecta\nsed\nseguir\nseis\nsello\nselva\nsemana\nsemilla\nsenda\nsensor\nseñal\nseñor\nseparar\nsepia\nsequía\nser\nserie\nsermón\nservir\nsesenta\nsesión\nseta\nsetenta\nsevero\nsexo\nsexto\nsidra\nsiesta\nsiete\nsiglo\nsigno\nsílaba\nsilbar\nsilencio\nsilla\nsímbolo\nsimio\nsirena\nsistema\nsitio\nsituar\nsobre\nsocio\nsodio\nsol\nsolapa\nsoldado\nsoledad\nsólido\nsoltar\nsolución\nsombra\nsondeo\nsonido\nsonoro\nsonrisa\nsopa\nsoplar\nsoporte\nsordo\nsorpresa\nsorteo\nsostén\nsótano\nsuave\nsubir\nsuceso\nsudor\nsuegra\nsuelo\nsueño\nsuerte\nsufrir\nsujeto\nsultán\nsumar\nsuperar\nsuplir\nsuponer\nsupremo\nsur\nsurco\nsureño\nsurgir\nsusto\nsutil\ntabaco\ntabique\ntabla\ntabú\ntaco\ntacto\ntajo\ntalar\ntalco\ntalento\ntalla\ntalón\ntamaño\ntambor\ntango\ntanque\ntapa\ntapete\ntapia\ntapón\ntaquilla\ntarde\ntarea\ntarifa\ntarjeta\ntarot\ntarro\ntarta\ntatuaje\ntauro\ntaza\ntazón\nteatro\ntecho\ntecla\ntécnica\ntejado\ntejer\ntejido\ntela\nteléfono\ntema\ntemor\ntemplo\ntenaz\ntender\ntener\ntenis\ntenso\nteoría\nterapia\nterco\ntérmino\nternura\nterror\ntesis\ntesoro\ntestigo\ntetera\ntexto\ntez\ntibio\ntiburón\ntiempo\ntienda\ntierra\ntieso\ntigre\ntijera\ntilde\ntimbre\ntímido\ntimo\ntinta\ntío\ntípico\ntipo\ntira\ntirón\ntitán\ntítere\ntítulo\ntiza\ntoalla\ntobillo\ntocar\ntocino\ntodo\ntoga\ntoldo\ntomar\ntono\ntonto\ntopar\ntope\ntoque\ntórax\ntorero\ntormenta\ntorneo\ntoro\ntorpedo\ntorre\ntorso\ntortuga\ntos\ntosco\ntoser\ntóxico\ntrabajo\ntractor\ntraer\ntráfico\ntrago\ntraje\ntramo\ntrance\ntrato\ntrauma\ntrazar\ntrébol\ntregua\ntreinta\ntren\ntrepar\ntres\ntribu\ntrigo\ntripa\ntriste\ntriunfo\ntrofeo\ntrompa\ntronco\ntropa\ntrote\ntrozo\ntruco\ntrueno\ntrufa\ntubería\ntubo\ntuerto\ntumba\ntumor\ntúnel\ntúnica\nturbina\nturismo\nturno\ntutor\nubicar\núlcera\numbral\nunidad\nunir\nuniverso\nuno\nuntar\nuña\nurbano\nurbe\nurgente\nurna\nusar\nusuario\nútil\nutopía\nuva\nvaca\nvacío\nvacuna\nvagar\nvago\nvaina\nvajilla\nvale\nválido\nvalle\nvalor\nválvula\nvampiro\nvara\nvariar\nvarón\nvaso\nvecino\nvector\nvehículo\nveinte\nvejez\nvela\nvelero\nveloz\nvena\nvencer\nvenda\nveneno\nvengar\nvenir\nventa\nvenus\nver\nverano\nverbo\nverde\nvereda\nverja\nverso\nverter\nvía\nviaje\nvibrar\nvicio\nvíctima\nvida\nvídeo\nvidrio\nviejo\nviernes\nvigor\nvil\nvilla\nvinagre\nvino\nviñedo\nviolín\nviral\nvirgo\nvirtud\nvisor\nvíspera\nvista\nvitamina\nviudo\nvivaz\nvivero\nvivir\nvivo\nvolcán\nvolumen\nvolver\nvoraz\nvotar\nvoto\nvoz\nvuelo\nvulgar\nyacer\nyate\nyegua\nyema\nyerno\nyeso\nyodo\nyoga\nyogur\nzafiro\nzanja\nzapato\nzarza\nzona\nzorro\nzumo\nzurdo\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/language.rs",
    "content": "use super::util::{Bits, Bits11};\nuse super::ErrorKind;\nuse rustc_hash::FxHashMap;\n\npub struct WordMap {\n    inner: FxHashMap<&'static str, Bits11>,\n}\n\npub struct WordList {\n    inner: Vec<&'static str>,\n}\n\nimpl WordMap {\n    pub fn get_bits(&self, word: &str) -> Result<Bits11, ErrorKind> {\n        match self.inner.get(word) {\n            Some(n) => Ok(*n),\n            None => Err(ErrorKind::InvalidWord)?,\n        }\n    }\n}\n\nimpl WordList {\n    pub fn get_word(&self, bits: Bits11) -> &'static str {\n        self.inner[bits.bits() as usize]\n    }\n\n    pub fn get_words_by_prefix(&self, prefix: &str) -> &[&'static str] {\n        let start = self.inner.binary_search(&prefix).unwrap_or_else(|idx| idx);\n        let count = self.inner[start..]\n            .iter()\n            .take_while(|word| word.starts_with(prefix))\n            .count();\n\n        &self.inner[start..start + count]\n    }\n}\n\nmod lazy {\n    use super::{Bits11, WordList, WordMap};\n    use once_cell::sync::Lazy;\n\n    /// lazy generation of the word list\n    fn gen_wordlist(lang_words: &'static str) -> WordList {\n        let inner: Vec<_> = lang_words.split_whitespace().collect();\n\n        debug_assert!(inner.len() == 2048, \"Invalid wordlist length\");\n\n        WordList { inner }\n    }\n\n    /// lazy generation of the word map\n    fn gen_wordmap(wordlist: &WordList) -> WordMap {\n        let inner = wordlist\n            .inner\n            .iter()\n            .enumerate()\n            .map(|(i, item)| (*item, Bits11::from(i as u16)))\n            .collect();\n\n        WordMap { inner }\n    }\n\n    pub static WORDLIST_ENGLISH: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/english.txt\")));\n    pub static WORDLIST_CHINESE_SIMPLIFIED: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/chinese_simplified.txt\")));\n    #[cfg(feature = \"chinese-traditional\")]\n    pub static WORDLIST_CHINESE_TRADITIONAL: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/chinese_traditional.txt\")));\n    #[cfg(feature = \"french\")]\n    pub static WORDLIST_FRENCH: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/french.txt\")));\n    #[cfg(feature = \"italian\")]\n    pub static WORDLIST_ITALIAN: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/italian.txt\")));\n    #[cfg(feature = \"japanese\")]\n    pub static WORDLIST_JAPANESE: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/japanese.txt\")));\n    #[cfg(feature = \"korean\")]\n    pub static WORDLIST_KOREAN: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/korean.txt\")));\n    #[cfg(feature = \"spanish\")]\n    pub static WORDLIST_SPANISH: Lazy<WordList> =\n        Lazy::new(|| gen_wordlist(include_str!(\"langs/spanish.txt\")));\n\n    pub static WORDMAP_ENGLISH: Lazy<WordMap> = Lazy::new(|| gen_wordmap(&WORDLIST_ENGLISH));\n    pub static WORDMAP_CHINESE_SIMPLIFIED: Lazy<WordMap> =\n        Lazy::new(|| gen_wordmap(&WORDLIST_CHINESE_SIMPLIFIED));\n    #[cfg(feature = \"chinese-traditional\")]\n    pub static WORDMAP_CHINESE_TRADITIONAL: Lazy<WordMap> =\n        Lazy::new(|| gen_wordmap(&WORDLIST_CHINESE_TRADITIONAL));\n    #[cfg(feature = \"french\")]\n    pub static WORDMAP_FRENCH: Lazy<WordMap> = Lazy::new(|| gen_wordmap(&WORDLIST_FRENCH));\n    #[cfg(feature = \"italian\")]\n    pub static WORDMAP_ITALIAN: Lazy<WordMap> = Lazy::new(|| gen_wordmap(&WORDLIST_ITALIAN));\n    #[cfg(feature = \"japanese\")]\n    pub static WORDMAP_JAPANESE: Lazy<WordMap> = Lazy::new(|| gen_wordmap(&WORDLIST_JAPANESE));\n    #[cfg(feature = \"korean\")]\n    pub static WORDMAP_KOREAN: Lazy<WordMap> = Lazy::new(|| gen_wordmap(&WORDLIST_KOREAN));\n    #[cfg(feature = \"spanish\")]\n    pub static WORDMAP_SPANISH: Lazy<WordMap> = Lazy::new(|| gen_wordmap(&WORDLIST_SPANISH));\n}\n\n/// The language determines which words will be used in a mnemonic phrase, but also indirectly\n/// determines the binary value of each word when a [`Mnemonic`][Mnemonic] is turned into a [`Seed`][Seed].\n///\n/// These are not of much use right now, and may even be removed from the crate, as there is no\n/// official language specified by the standard except English.\n///\n/// [Mnemonic]: ./mnemonic/struct.Mnemonic.html\n/// [Seed]: ./seed/struct.Seed.html\n#[derive(Debug, Clone, Copy, PartialEq, Default)]\npub enum Language {\n    #[default]\n    English,\n    ChineseSimplified,\n    #[cfg(feature = \"chinese-traditional\")]\n    ChineseTraditional,\n    #[cfg(feature = \"french\")]\n    French,\n    #[cfg(feature = \"italian\")]\n    Italian,\n    #[cfg(feature = \"japanese\")]\n    Japanese,\n    #[cfg(feature = \"korean\")]\n    Korean,\n    #[cfg(feature = \"spanish\")]\n    Spanish,\n}\n\nimpl Language {\n    /// Construct a word list from its language code. Returns None\n    /// if the language code is not valid or not supported.\n    pub fn from_language_code(language_code: &str) -> Option<Self> {\n        match &language_code.to_ascii_lowercase()[..] {\n            \"en\" => Some(Language::English),\n            #[cfg(feature = \"chinese-simplified\")]\n            \"zh-hans\" => Some(Language::ChineseSimplified),\n            #[cfg(feature = \"chinese-simplified\")]\n            \"zh-cn\" => Some(Language::ChineseSimplified),\n            #[cfg(feature = \"chinese-traditional\")]\n            \"zh-hant\" => Some(Language::ChineseTraditional),\n            #[cfg(feature = \"chinese-traditional\")]\n            \"zh-tw\" => Some(Language::ChineseTraditional),\n            #[cfg(feature = \"french\")]\n            \"fr\" => Some(Language::French),\n            #[cfg(feature = \"italian\")]\n            \"it\" => Some(Language::Italian),\n            #[cfg(feature = \"japanese\")]\n            \"ja\" => Some(Language::Japanese),\n            #[cfg(feature = \"korean\")]\n            \"ko\" => Some(Language::Korean),\n            #[cfg(feature = \"spanish\")]\n            \"es\" => Some(Language::Spanish),\n            _ => None,\n        }\n    }\n\n    pub fn from_phrase(phrase: &str) -> Option<Self> {\n        let mut iter = phrase.split_whitespace();\n        iter.next(); // skip the first word, which might not be included in the bip32 chinese wordlist.\n        match iter.next() {\n            Some(word) => {\n                if lazy::WORDMAP_ENGLISH.get_bits(word).is_ok() {\n                    Some(Language::English)\n                } else if lazy::WORDMAP_CHINESE_SIMPLIFIED.get_bits(word).is_ok() {\n                    Some(Language::ChineseSimplified)\n                } else {\n                    None\n                }\n            }\n            _ => None,\n        }\n    }\n\n    /// Get the word list for this language\n    pub fn wordlist(&self) -> &'static WordList {\n        match *self {\n            Language::English => &lazy::WORDLIST_ENGLISH,\n            Language::ChineseSimplified => &lazy::WORDLIST_CHINESE_SIMPLIFIED,\n            #[cfg(feature = \"chinese-traditional\")]\n            Language::ChineseTraditional => &lazy::WORDLIST_CHINESE_TRADITIONAL,\n            #[cfg(feature = \"french\")]\n            Language::French => &lazy::WORDLIST_FRENCH,\n            #[cfg(feature = \"italian\")]\n            Language::Italian => &lazy::WORDLIST_ITALIAN,\n            #[cfg(feature = \"japanese\")]\n            Language::Japanese => &lazy::WORDLIST_JAPANESE,\n            #[cfg(feature = \"korean\")]\n            Language::Korean => &lazy::WORDLIST_KOREAN,\n            #[cfg(feature = \"spanish\")]\n            Language::Spanish => &lazy::WORDLIST_SPANISH,\n        }\n    }\n\n    /// Get a WordMap that allows word -> index lookups in the word list\n    ///\n    /// The index of an individual word in the word list is used as the binary value of that word\n    /// when the phrase is turned into a Seed\n    pub fn wordmap(&self) -> &'static WordMap {\n        match *self {\n            Language::English => &lazy::WORDMAP_ENGLISH,\n            Language::ChineseSimplified => &lazy::WORDMAP_CHINESE_SIMPLIFIED,\n            #[cfg(feature = \"chinese-traditional\")]\n            Language::ChineseTraditional => &lazy::WORDMAP_CHINESE_TRADITIONAL,\n            #[cfg(feature = \"french\")]\n            Language::French => &lazy::WORDMAP_FRENCH,\n            #[cfg(feature = \"italian\")]\n            Language::Italian => &lazy::WORDMAP_ITALIAN,\n            #[cfg(feature = \"japanese\")]\n            Language::Japanese => &lazy::WORDMAP_JAPANESE,\n            #[cfg(feature = \"korean\")]\n            Language::Korean => &lazy::WORDMAP_KOREAN,\n            #[cfg(feature = \"spanish\")]\n            Language::Spanish => &lazy::WORDMAP_SPANISH,\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::lazy;\n    use super::Language;\n    use super::WordList;\n    #[cfg(target_arch = \"wasm32\")]\n    use wasm_bindgen_test::*;\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn words_by_prefix() {\n        let wl = &lazy::WORDLIST_ENGLISH;\n        let res = wl.get_words_by_prefix(\"woo\");\n        assert_eq!(res, [\"wood\", \"wool\"]);\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn all_words_by_prefix() {\n        let wl = &lazy::WORDLIST_ENGLISH;\n        let res = wl.get_words_by_prefix(\"\");\n        assert_eq!(res.len(), 2048);\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn words_by_invalid_prefix() {\n        let wl = &lazy::WORDLIST_ENGLISH;\n        let res = wl.get_words_by_prefix(\"woof\");\n        assert!(res.is_empty());\n    }\n\n    fn is_wordlist_nfkd(wl: &WordList) -> bool {\n        for idx in 0..2047 {\n            let word = wl.get_word(idx.into());\n            if !unicode_normalization::is_nfkd(word) {\n                return false;\n            }\n        }\n        true\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"chinese-simplified\")]\n    fn chinese_simplified_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_CHINESE_SIMPLIFIED));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"chinese-traditional\")]\n    fn chinese_traditional_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_CHINESE_TRADITIONAL));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"french\")]\n    fn french_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_FRENCH));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"italian\")]\n    fn italian_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_ITALIAN));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"japanese\")]\n    fn japanese_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_JAPANESE));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"korean\")]\n    fn korean_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_KOREAN));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"spanish\")]\n    fn spanish_wordlist_is_nfkd() {\n        assert!(is_wordlist_nfkd(&lazy::WORDLIST_SPANISH));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn from_language_code_en() {\n        assert_eq!(\n            Language::from_language_code(\"En\").expect(\"en is a valid language\"),\n            Language::English\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"chinese-simplified\")]\n    fn from_language_code_cn_hans() {\n        assert_eq!(\n            Language::from_language_code(\"Zh-Hans\").expect(\"zh-hans is a valid language\"),\n            Language::ChineseSimplified\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"chinese-traditional\")]\n    fn from_language_code_cn_hant() {\n        assert_eq!(\n            Language::from_language_code(\"zh-hanT\").expect(\"zh-hant is a valid language\"),\n            Language::ChineseTraditional\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"french\")]\n    fn from_language_code_fr() {\n        assert_eq!(\n            Language::from_language_code(\"fr\").expect(\"fr is a valid language\"),\n            Language::French\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"italian\")]\n    fn from_language_code_it() {\n        assert_eq!(\n            Language::from_language_code(\"It\").expect(\"it is a valid language\"),\n            Language::Italian\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"japanese\")]\n    fn from_language_code_ja() {\n        assert_eq!(\n            Language::from_language_code(\"Ja\").expect(\"ja is a valid language\"),\n            Language::Japanese\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"korean\")]\n    fn from_language_code_ko() {\n        assert_eq!(\n            Language::from_language_code(\"kO\").expect(\"ko is a valid language\"),\n            Language::Korean\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"spanish\")]\n    fn from_language_code_es() {\n        assert_eq!(\n            Language::from_language_code(\"ES\").expect(\"es is a valid language\"),\n            Language::Spanish\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn from_invalid_language_code() {\n        assert_eq!(Language::from_language_code(\"not a real language\"), None);\n    }\n\n    #[test]\n    fn test_ffrom_phrase() {\n        let language = Language::from_phrase(\n            \"heavy face learn track claw jaguar pigeon uncle seven enough glow where\",\n        );\n        assert_eq!(Some(Language::English), language);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/mnemonic.rs",
    "content": "use super::crypto::{gen_random_bytes, sha256_first_byte};\nuse super::util::{checksum, BitWriter, IterExt};\nuse super::ErrorKind;\nuse super::Language;\nuse super::MnemonicType;\nuse anyhow::Error;\nuse encoding::{all::GB18030, EncoderTrap, Encoding};\nuse std::fmt;\nuse std::mem;\nuse unicode_normalization::UnicodeNormalization;\nuse zeroize::Zeroizing;\n\n/// The primary type in this crate, most tasks require creating or using one.\n///\n/// To create a *new* [`Mnemonic`][Mnemonic] from a randomly generated key, call [`Mnemonic::new()`][Mnemonic::new()].\n///\n/// To get a [`Mnemonic`][Mnemonic] instance for an existing mnemonic phrase, including\n/// those generated by other software or hardware wallets, use [`Mnemonic::from_phrase()`][Mnemonic::from_phrase()].\n///\n/// You can get the HD wallet [`Seed`][Seed] from a [`Mnemonic`][Mnemonic] by calling [`Seed::new()`][Seed::new()].\n/// From there you can either get the raw byte value with [`Seed::as_bytes()`][Seed::as_bytes()], or the hex\n/// representation using Rust formatting: `format!(\"{:X}\", seed)`.\n///\n/// You can also get the original entropy value back from a [`Mnemonic`][Mnemonic] with [`Mnemonic::entropy()`][Mnemonic::entropy()],\n/// but beware that the entropy value is **not the same thing** as an HD wallet seed, and should\n/// *never* be used that way.\n///\n/// [`Mnemonic`][Mnemonic] implements Zeroize, so it's bytes will be zeroed when it's dropped.\n///\n/// [Mnemonic]: ./mnemonic/struct.Mnemonic.html\n/// [Mnemonic::new()]: ./mnemonic/struct.Mnemonic.html#method.new\n/// [Mnemonic::from_phrase()]: ./mnemonic/struct.Mnemonic.html#method.from_phrase\n/// [Mnemonic::entropy()]: ./mnemonic/struct.Mnemonic.html#method.entropy\n/// [Seed]: ./seed/struct.Seed.html\n/// [Seed::new()]: ./seed/struct.Seed.html#method.new\n/// [Seed::as_bytes()]: ./seed/struct.Seed.html#method.as_bytes\n///\n#[derive(Clone)]\npub struct Mnemonic {\n    phrase: Zeroizing<String>,\n    lang: Language,\n    entropy: Zeroizing<Vec<u8>>,\n}\n\nimpl Mnemonic {\n    /// Generates a new [`Mnemonic`][Mnemonic]\n    ///\n    /// Use [`Mnemonic::phrase()`][Mnemonic::phrase()] to get an `str` slice of the generated phrase.\n    ///\n    /// # Example\n    ///\n    /// ```\n    /// use crate::anychain_kms::bip39::{Mnemonic, MnemonicType, Language};\n    ///\n    /// let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English);\n    /// let phrase = mnemonic.phrase();\n    ///\n    /// println!(\"phrase: {}\", phrase);\n    ///\n    /// assert_eq!(phrase.split(\" \").count(), 12);\n    /// ```\n    ///\n    /// [Mnemonic]: ./mnemonic/struct.Mnemonic.html\n    /// [Mnemonic::phrase()]: ./mnemonic/struct.Mnemonic.html#method.phrase\n    pub fn new(mtype: MnemonicType, lang: Language) -> Mnemonic {\n        let entropy = gen_random_bytes(mtype.entropy_bits() / 8);\n\n        Mnemonic::from_entropy_unchecked(entropy, lang)\n    }\n\n    /// Create a [`Mnemonic`][Mnemonic] from pre-generated entropy\n    ///\n    /// # Example\n    ///\n    /// ```\n    /// use crate::anychain_kms::bip39::{Mnemonic, MnemonicType, Language};\n    ///\n    /// let entropy = &[0x33, 0xE4, 0x6B, 0xB1, 0x3A, 0x74, 0x6E, 0xA4, 0x1C, 0xDD, 0xE4, 0x5C, 0x90, 0x84, 0x6A, 0x79];\n    /// let mnemonic = Mnemonic::from_entropy(entropy, Language::English).unwrap();\n    ///\n    /// assert_eq!(\"crop cash unable insane eight faith inflict route frame loud box vibrant\", mnemonic.phrase());\n    /// assert_eq!(\"33E46BB13A746EA41CDDE45C90846A79\", format!(\"{:X}\", mnemonic));\n    /// ```\n    ///\n    /// [Mnemonic]: ../mnemonic/struct.Mnemonic.html\n    pub fn from_entropy(entropy: &[u8], lang: Language) -> Result<Mnemonic, Error> {\n        // Validate entropy size\n        MnemonicType::for_key_size(entropy.len() * 8)?;\n\n        Ok(Self::from_entropy_unchecked(entropy, lang))\n    }\n\n    fn from_entropy_unchecked<E>(entropy: E, lang: Language) -> Mnemonic\n    where\n        E: Into<Vec<u8>>,\n    {\n        let entropy = Zeroizing::new(entropy.into());\n        let wordlist = lang.wordlist();\n\n        let checksum_byte = sha256_first_byte(&entropy);\n\n        // First, create a byte iterator for the given entropy and the first byte of the\n        // hash of the entropy that will serve as the checksum (up to 8 bits for biggest\n        // entropy source).\n        //\n        // Then we transform that into a bits iterator that returns 11 bits at a\n        // time (as u16), which we can map to the words on the `wordlist`.\n        //\n        // Given the entropy is of correct size, this ought to give us the correct word\n        // count.\n        let phrase = Zeroizing::new(\n            entropy\n                .iter()\n                .chain(Some(&checksum_byte))\n                .bits()\n                .map(|bits| wordlist.get_word(bits))\n                .join(\" \"),\n        );\n\n        Mnemonic {\n            phrase,\n            lang,\n            entropy,\n        }\n    }\n\n    /// Create a [`Mnemonic`][Mnemonic] from an existing mnemonic phrase\n    ///\n    /// The phrase supplied will be checked for word length and validated according to the checksum\n    /// specified in BIP0039\n    ///\n    /// # Example\n    ///\n    /// ```\n    /// use crate::anychain_kms::bip39::{Mnemonic, Language};\n    ///\n    /// let phrase = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    /// let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();\n    ///\n    /// assert_eq!(phrase, mnemonic.phrase());\n    /// ```\n    ///\n    /// [Mnemonic]: ../mnemonic/struct.Mnemonic.html\n    pub fn from_phrase(phrase: &str, lang: Language) -> Result<Mnemonic, Error> {\n        let phrase = Zeroizing::new(\n            phrase\n                .split_whitespace()\n                .map(|w| w.nfkd())\n                .join::<String>(\" \"),\n        );\n\n        // this also validates the checksum and phrase length before returning the entropy so we\n        // can store it. We don't use the validate function here to avoid having a public API that\n        // takes a phrase string and returns the entropy directly.\n        let entropy = Zeroizing::new(Mnemonic::phrase_to_entropy(&phrase, lang)?);\n\n        let mnemonic = Mnemonic {\n            phrase,\n            lang,\n            entropy,\n        };\n\n        Ok(mnemonic)\n    }\n\n    /// Validate a mnemonic phrase\n    ///\n    /// The phrase supplied will be checked for word length and validated according to the checksum\n    /// specified in BIP0039.\n    ///\n    /// # Example\n    ///\n    /// ```\n    /// use crate::anychain_kms::bip39::{Mnemonic, Language};\n    ///\n    /// let test_mnemonic = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    ///\n    /// assert!(Mnemonic::validate(test_mnemonic, Language::English).is_ok());\n    /// ```\n    pub fn validate(phrase: &str, lang: Language) -> Result<(), Error> {\n        Mnemonic::phrase_to_entropy(phrase, lang)?;\n\n        Ok(())\n    }\n\n    /// Calculate the checksum, verify it and return the entropy\n    ///\n    /// Only intended for internal use, as returning a `Vec<u8>` that looks a bit like it could be\n    /// used as the seed is likely to cause problems for someone eventually. All the other functions\n    /// that return something like that are explicit about what it is and what to use it for.\n    fn phrase_to_entropy(phrase: &str, lang: Language) -> Result<Vec<u8>, Error> {\n        let wordmap = lang.wordmap();\n\n        // Preallocate enough space for the longest possible word list\n        let mut bits = BitWriter::with_capacity(264);\n\n        for word in phrase.split(' ') {\n            bits.push(wordmap.get_bits(word)?);\n        }\n\n        let mtype = MnemonicType::for_word_count(bits.len() / 11)?;\n\n        debug_assert!(\n            bits.len() == mtype.total_bits(),\n            \"Insufficient amount of bits to validate\"\n        );\n\n        let mut entropy = bits.into_bytes();\n        let entropy_bytes = mtype.entropy_bits() / 8;\n\n        let actual_checksum = checksum(entropy[entropy_bytes], mtype.checksum_bits());\n\n        // Truncate to get rid of the byte containing the checksum\n        entropy.truncate(entropy_bytes);\n\n        let checksum_byte = sha256_first_byte(&entropy);\n        let expected_checksum = checksum(checksum_byte, mtype.checksum_bits());\n\n        if actual_checksum != expected_checksum {\n            Err(ErrorKind::InvalidChecksum)?;\n        }\n\n        Ok(entropy)\n    }\n\n    /// Get the mnemonic phrase as a string reference.\n    pub fn phrase(&self) -> &str {\n        &self.phrase\n    }\n\n    /// Consume the `Mnemonic` and return the phrase as a `String`.\n    pub fn into_phrase(mut self) -> String {\n        // Create an empty string and swap values with the mnemonic's phrase.\n        // This allows `Mnemonic` to implement `Drop`, while still returning the phrase.\n        mem::take(&mut self.phrase)\n    }\n\n    /// Get the original entropy value of the mnemonic phrase as a slice.\n    ///\n    /// # Example\n    ///\n    /// ```\n    /// use crate::anychain_kms::bip39::{Mnemonic, Language};\n    ///\n    /// let phrase = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    ///\n    /// let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();\n    ///\n    /// let entropy: &[u8] = mnemonic.entropy();\n    /// ```\n    ///\n    /// **Note:** You shouldn't use the generated entropy as secrets, for that generate a new\n    /// `Seed` from the `Mnemonic`.\n    pub fn entropy(&self) -> &[u8] {\n        &self.entropy\n    }\n\n    /// Get the [`Language`][Language]\n    ///\n    /// [Language]: ../language/struct.Language.html\n    pub fn language(&self) -> Language {\n        self.lang\n    }\n\n    pub fn as_bytes(&self) -> Vec<u8> {\n        match self.lang {\n            Language::ChineseSimplified => {\n                GB18030.encode(self.phrase(), EncoderTrap::Strict).unwrap()\n            }\n            _ => self.phrase().as_bytes().to_vec(),\n        }\n    }\n}\n\nimpl AsRef<str> for Mnemonic {\n    fn as_ref(&self) -> &str {\n        self.phrase()\n    }\n}\n\nimpl fmt::Display for Mnemonic {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        fmt::Display::fmt(self.phrase(), f)\n    }\n}\n\nimpl fmt::Debug for Mnemonic {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        fmt::Debug::fmt(self.phrase(), f)\n    }\n}\n\nimpl fmt::LowerHex for Mnemonic {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        if f.alternate() {\n            f.write_str(\"0x\")?;\n        }\n\n        for byte in self.entropy() {\n            write!(f, \"{:02x}\", byte)?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl fmt::UpperHex for Mnemonic {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        if f.alternate() {\n            f.write_str(\"0x\")?;\n        }\n\n        for byte in self.entropy() {\n            write!(f, \"{:02X}\", byte)?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl From<Mnemonic> for String {\n    fn from(val: Mnemonic) -> String {\n        val.into_phrase()\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    #[cfg(target_arch = \"wasm32\")]\n    use wasm_bindgen_test::*;\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn back_to_back() {\n        let m1 = Mnemonic::new(MnemonicType::Words12, Language::English);\n        let m2 = Mnemonic::from_phrase(m1.phrase(), Language::English).unwrap();\n        let m3 = Mnemonic::from_entropy(m1.entropy(), Language::English).unwrap();\n\n        assert_eq!(m1.entropy(), m2.entropy(), \"Entropy must be the same\");\n        assert_eq!(m1.entropy(), m3.entropy(), \"Entropy must be the same\");\n        assert_eq!(m1.phrase(), m2.phrase(), \"Phrase must be the same\");\n        assert_eq!(m1.phrase(), m3.phrase(), \"Phrase must be the same\");\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn mnemonic_from_entropy() {\n        let entropy = &[\n            0x33, 0xE4, 0x6B, 0xB1, 0x3A, 0x74, 0x6E, 0xA4, 0x1C, 0xDD, 0xE4, 0x5C, 0x90, 0x84,\n            0x6A, 0x79,\n        ];\n        let phrase = \"crop cash unable insane eight faith inflict route frame loud box vibrant\";\n\n        let mnemonic = Mnemonic::from_entropy(entropy, Language::English).unwrap();\n\n        assert_eq!(phrase, mnemonic.phrase());\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn mnemonic_from_phrase() {\n        let entropy = &[\n            0x33, 0xE4, 0x6B, 0xB1, 0x3A, 0x74, 0x6E, 0xA4, 0x1C, 0xDD, 0xE4, 0x5C, 0x90, 0x84,\n            0x6A, 0x79,\n        ];\n        let phrase = \"crop cash unable insane eight faith inflict route frame loud box vibrant\";\n\n        let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();\n\n        assert_eq!(entropy, mnemonic.entropy());\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn mnemonic_format() {\n        let mnemonic = Mnemonic::new(MnemonicType::Words15, Language::English);\n\n        assert_eq!(mnemonic.phrase(), format!(\"{}\", mnemonic));\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn mnemonic_hex_format() {\n        let entropy = &[\n            0x03, 0xE4, 0x6B, 0xB1, 0x3A, 0x74, 0x6E, 0xA4, 0x1C, 0xDD, 0xE4, 0x5C, 0x90, 0x84,\n            0x6A, 0x79,\n        ];\n\n        let mnemonic = Mnemonic::from_entropy(entropy, Language::English).unwrap();\n\n        assert_eq!(\n            format!(\"{:x}\", mnemonic),\n            \"03e46bb13a746ea41cdde45c90846a79\"\n        );\n        assert_eq!(\n            format!(\"{:X}\", mnemonic),\n            \"03E46BB13A746EA41CDDE45C90846A79\"\n        );\n        assert_eq!(\n            format!(\"{:#x}\", mnemonic),\n            \"0x03e46bb13a746ea41cdde45c90846a79\"\n        );\n        assert_eq!(\n            format!(\"{:#X}\", mnemonic),\n            \"0x03E46BB13A746EA41CDDE45C90846A79\"\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/mnemonic_type.rs",
    "content": "use super::ErrorKind;\nuse anyhow::Error;\nuse std::fmt;\n\nconst ENTROPY_OFFSET: usize = 8;\n\n/// Determines the number of words that will be present in a [`Mnemonic`][Mnemonic] phrase\n///\n/// Also directly affects the amount of entropy that will be used to create a [`Mnemonic`][Mnemonic],\n/// and therefore the cryptographic strength of the HD wallet keys/addresses that can be derived from\n/// it using the [`Seed`][Seed].\n///\n/// For example, a 12 word mnemonic phrase is essentially a friendly representation of a 128-bit key,\n/// while a 24 word mnemonic phrase is essentially a 256-bit key.\n///\n/// If you know you want a specific phrase length, you can use the enum variant directly, for example\n/// `MnemonicType::Words12`.\n///\n/// You can also get a `MnemonicType` that corresponds to one of the standard BIP39 key sizes by\n/// passing arbitrary `usize` values:\n///\n/// ```\n/// use crate::anychain_kms::bip39::{MnemonicType};\n///\n/// let mnemonic_type = MnemonicType::for_key_size(128).unwrap();\n/// ```\n///\n/// [MnemonicType]: ../mnemonic_type/struct.MnemonicType.html\n/// [Mnemonic]: ../mnemonic/struct.Mnemonic.html\n/// [Seed]: ../seed/struct.Seed.html\n///\n#[derive(Debug, Copy, Clone, Default)]\npub enum MnemonicType {\n    //  ... = (entropy_bits << ...)   | checksum_bits\n    #[default]\n    Words12 = (128 << ENTROPY_OFFSET) | 4,\n    Words15 = (160 << ENTROPY_OFFSET) | 5,\n    Words18 = (192 << ENTROPY_OFFSET) | 6,\n    Words21 = (224 << ENTROPY_OFFSET) | 7,\n    Words24 = (256 << ENTROPY_OFFSET) | 8,\n}\n\nimpl MnemonicType {\n    /// Get a `MnemonicType` for a mnemonic phrase with a specific number of words\n    ///\n    /// Specifying a word count not provided for by the BIP39 standard will return an `Error`\n    /// of kind `ErrorKind::InvalidWordLength`.\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let mnemonic_type = MnemonicType::for_word_count(12).unwrap();\n    /// ```\n    pub fn for_word_count(size: usize) -> Result<MnemonicType, Error> {\n        let mnemonic_type = match size {\n            12 => MnemonicType::Words12,\n            15 => MnemonicType::Words15,\n            18 => MnemonicType::Words18,\n            21 => MnemonicType::Words21,\n            24 => MnemonicType::Words24,\n            _ => Err(ErrorKind::InvalidWordLength(size))?,\n        };\n\n        Ok(mnemonic_type)\n    }\n\n    /// Get a `MnemonicType` for a mnemonic phrase representing the given key size as bits\n    ///\n    /// Specifying a key size not provided for by the BIP39 standard will return an `Error`\n    /// of kind `ErrorKind::InvalidKeysize`.\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let mnemonic_type = MnemonicType::for_key_size(128).unwrap();\n    /// ```\n    pub fn for_key_size(size: usize) -> Result<MnemonicType, Error> {\n        let mnemonic_type = match size {\n            128 => MnemonicType::Words12,\n            160 => MnemonicType::Words15,\n            192 => MnemonicType::Words18,\n            224 => MnemonicType::Words21,\n            256 => MnemonicType::Words24,\n            _ => Err(ErrorKind::InvalidKeysize(size))?,\n        };\n\n        Ok(mnemonic_type)\n    }\n\n    /// Get a `MnemonicType` for an existing mnemonic phrase\n    ///\n    /// This can be used when you need information about a mnemonic phrase based on the number of\n    /// words, for example you can get the entropy value using [`MnemonicType::entropy_bits`][MnemonicType::entropy_bits()].\n    ///\n    /// Specifying a phrase that does not match one of the standard BIP39 phrase lengths will return\n    /// an `Error` of kind `ErrorKind::InvalidWordLength`. The phrase will not be validated in any\n    /// other way.\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let test_mnemonic = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    ///\n    /// let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();\n    ///\n    /// let entropy_bits = mnemonic_type.entropy_bits();\n    /// ```\n    ///\n    /// [MnemonicType::entropy_bits()]: ./enum.MnemonicType.html#method.entropy_bits\n    pub fn for_phrase(phrase: &str) -> Result<MnemonicType, Error> {\n        let word_count = phrase.split(' ').count();\n\n        Self::for_word_count(word_count)\n    }\n\n    /// Return the number of entropy+checksum bits\n    ///\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let test_mnemonic = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    ///\n    /// let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();\n    ///\n    /// let total_bits = mnemonic_type.total_bits();\n    /// ```\n    pub fn total_bits(&self) -> usize {\n        self.entropy_bits() + self.checksum_bits() as usize\n    }\n\n    /// Return the number of entropy bits\n    ///\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let test_mnemonic = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    ///\n    /// let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();\n    ///\n    /// let entropy_bits = mnemonic_type.entropy_bits();\n    /// ```\n    pub fn entropy_bits(&self) -> usize {\n        (*self as usize) >> ENTROPY_OFFSET\n    }\n\n    /// Return the number of checksum bits\n    ///\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let test_mnemonic = \"park remain person kitchen mule spell knee armed position rail grid ankle\";\n    ///\n    /// let mnemonic_type = MnemonicType::for_phrase(test_mnemonic).unwrap();\n    ///\n    /// let checksum_bits = mnemonic_type.checksum_bits();\n    /// ```\n    pub fn checksum_bits(&self) -> u8 {\n        (*self as usize) as u8\n    }\n\n    /// Return the number of words\n    ///\n    ///\n    /// # Example\n    /// ```\n    /// use crate::anychain_kms::bip39::{MnemonicType};\n    ///\n    /// let mnemonic_type = MnemonicType::Words12;\n    ///\n    /// let word_count = mnemonic_type.word_count();\n    /// ```\n    pub fn word_count(&self) -> usize {\n        self.total_bits() / 11\n    }\n}\n\nimpl fmt::Display for MnemonicType {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(\n            f,\n            \"{} words ({}bits)\",\n            self.word_count(),\n            self.entropy_bits()\n        )\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    #[cfg(target_arch = \"wasm32\")]\n    use wasm_bindgen_test::*;\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn word_count() {\n        assert_eq!(MnemonicType::Words12.word_count(), 12);\n        assert_eq!(MnemonicType::Words15.word_count(), 15);\n        assert_eq!(MnemonicType::Words18.word_count(), 18);\n        assert_eq!(MnemonicType::Words21.word_count(), 21);\n        assert_eq!(MnemonicType::Words24.word_count(), 24);\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn entropy_bits() {\n        assert_eq!(MnemonicType::Words12.entropy_bits(), 128);\n        assert_eq!(MnemonicType::Words15.entropy_bits(), 160);\n        assert_eq!(MnemonicType::Words18.entropy_bits(), 192);\n        assert_eq!(MnemonicType::Words21.entropy_bits(), 224);\n        assert_eq!(MnemonicType::Words24.entropy_bits(), 256);\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    fn checksum_bits() {\n        assert_eq!(MnemonicType::Words12.checksum_bits(), 4);\n        assert_eq!(MnemonicType::Words15.checksum_bits(), 5);\n        assert_eq!(MnemonicType::Words18.checksum_bits(), 6);\n        assert_eq!(MnemonicType::Words21.checksum_bits(), 7);\n        assert_eq!(MnemonicType::Words24.checksum_bits(), 8);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/mod.rs",
    "content": "mod crypto;\nmod error;\nmod language;\nmod mnemonic;\nmod mnemonic_type;\nmod seed;\nmod util;\n\npub use error::ErrorKind;\npub use language::Language;\npub use mnemonic::Mnemonic;\npub use mnemonic_type::MnemonicType;\npub use seed::Seed;\n\n/**\n * BIP39 standard test vectors\n * ref: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#Test_vectors\n */\n#[cfg(test)]\nmod test_mod {\n    use super::*;\n    use crate::bip32::{Prefix, XprvSecp256k1};\n    const VECTORS: [[&str;4];24] = [\n        [\n            \"00000000000000000000000000000000\",\n            \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about\",\n            \"c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04\",\n            \"xprv9s21ZrQH143K3h3fDYiay8mocZ3afhfULfb5GX8kCBdno77K4HiA15Tg23wpbeF1pLfs1c5SPmYHrEpTuuRhxMwvKDwqdKiGJS9XFKzUsAF\"\n        ],\n        [\n            \"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f\",\n            \"legal winner thank year wave sausage worth useful legal winner thank yellow\",\n            \"2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607\",\n            \"xprv9s21ZrQH143K2gA81bYFHqU68xz1cX2APaSq5tt6MFSLeXnCKV1RVUJt9FWNTbrrryem4ZckN8k4Ls1H6nwdvDTvnV7zEXs2HgPezuVccsq\"\n        ],\n        [\n            \"80808080808080808080808080808080\",\n            \"letter advice cage absurd amount doctor acoustic avoid letter advice cage above\",\n            \"d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8\",\n            \"xprv9s21ZrQH143K2shfP28KM3nr5Ap1SXjz8gc2rAqqMEynmjt6o1qboCDpxckqXavCwdnYds6yBHZGKHv7ef2eTXy461PXUjBFQg6PrwY4Gzq\"\n        ],\n        [\n            \"ffffffffffffffffffffffffffffffff\",\n            \"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong\",\n            \"ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069\",\n            \"xprv9s21ZrQH143K2V4oox4M8Zmhi2Fjx5XK4Lf7GKRvPSgydU3mjZuKGCTg7UPiBUD7ydVPvSLtg9hjp7MQTYsW67rZHAXeccqYqrsx8LcXnyd\"\n        ],\n        [\n            \"000000000000000000000000000000000000000000000000\",\n            \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent\",\n            \"035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa\",\n            \"xprv9s21ZrQH143K3mEDrypcZ2usWqFgzKB6jBBx9B6GfC7fu26X6hPRzVjzkqkPvDqp6g5eypdk6cyhGnBngbjeHTe4LsuLG1cCmKJka5SMkmU\"\n        ],\n        [\n            \"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f\",\n            \"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will\",\n            \"f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd\",\n            \"xprv9s21ZrQH143K3Lv9MZLj16np5GzLe7tDKQfVusBni7toqJGcnKRtHSxUwbKUyUWiwpK55g1DUSsw76TF1T93VT4gz4wt5RM23pkaQLnvBh7\"\n        ],\n        [\n            \"808080808080808080808080808080808080808080808080\",\n            \"letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always\",\n            \"107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65\",\n            \"xprv9s21ZrQH143K3VPCbxbUtpkh9pRG371UCLDz3BjceqP1jz7XZsQ5EnNkYAEkfeZp62cDNj13ZTEVG1TEro9sZ9grfRmcYWLBhCocViKEJae\"\n        ],\n        [\n            \"ffffffffffffffffffffffffffffffffffffffffffffffff\",\n            \"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when\",\n            \"0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528\",\n            \"xprv9s21ZrQH143K36Ao5jHRVhFGDbLP6FCx8BEEmpru77ef3bmA928BxsqvVM27WnvvyfWywiFN8K6yToqMaGYfzS6Db1EHAXT5TuyCLBXUfdm\"\n        ],\n        [\n            \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art\",\n            \"bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8\",\n            \"xprv9s21ZrQH143K32qBagUJAMU2LsHg3ka7jqMcV98Y7gVeVyNStwYS3U7yVVoDZ4btbRNf4h6ibWpY22iRmXq35qgLs79f312g2kj5539ebPM\"\n        ],\n        [\n            \"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f\",\n            \"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title\",\n            \"bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87\",\n            \"xprv9s21ZrQH143K3Y1sd2XVu9wtqxJRvybCfAetjUrMMco6r3v9qZTBeXiBZkS8JxWbcGJZyio8TrZtm6pkbzG8SYt1sxwNLh3Wx7to5pgiVFU\"\n        ],\n        [\n            \"8080808080808080808080808080808080808080808080808080808080808080\",\n            \"letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless\",\n            \"c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f\",\n            \"xprv9s21ZrQH143K3CSnQNYC3MqAAqHwxeTLhDbhF43A4ss4ciWNmCY9zQGvAKUSqVUf2vPHBTSE1rB2pg4avopqSiLVzXEU8KziNnVPauTqLRo\"\n        ],\n        [\n            \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n            \"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote\",\n            \"dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad\",\n            \"xprv9s21ZrQH143K2WFF16X85T2QCpndrGwx6GueB72Zf3AHwHJaknRXNF37ZmDrtHrrLSHvbuRejXcnYxoZKvRquTPyp2JiNG3XcjQyzSEgqCB\"\n        ],\n        [\n            \"9e885d952ad362caeb4efe34a8e91bd2\",\n            \"ozone drill grab fiber curtain grace pudding thank cruise elder eight picnic\",\n            \"274ddc525802f7c828d8ef7ddbcdc5304e87ac3535913611fbbfa986d0c9e5476c91689f9c8a54fd55bd38606aa6a8595ad213d4c9c9f9aca3fb217069a41028\",\n            \"xprv9s21ZrQH143K2oZ9stBYpoaZ2ktHj7jLz7iMqpgg1En8kKFTXJHsjxry1JbKH19YrDTicVwKPehFKTbmaxgVEc5TpHdS1aYhB2s9aFJBeJH\"\n        ],\n        [\n            \"6610b25967cdcca9d59875f5cb50b0ea75433311869e930b\",\n            \"gravity machine north sort system female filter attitude volume fold club stay feature office ecology stable narrow fog\",\n            \"628c3827a8823298ee685db84f55caa34b5cc195a778e52d45f59bcf75aba68e4d7590e101dc414bc1bbd5737666fbbef35d1f1903953b66624f910feef245ac\",\n            \"xprv9s21ZrQH143K3uT8eQowUjsxrmsA9YUuQQK1RLqFufzybxD6DH6gPY7NjJ5G3EPHjsWDrs9iivSbmvjc9DQJbJGatfa9pv4MZ3wjr8qWPAK\"\n        ],\n        [\n            \"68a79eaca2324873eacc50cb9c6eca8cc68ea5d936f98787c60c7ebc74e6ce7c\",\n            \"hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length\",\n            \"64c87cde7e12ecf6704ab95bb1408bef047c22db4cc7491c4271d170a1b213d20b385bc1588d9c7b38f1b39d415665b8a9030c9ec653d75e65f847d8fc1fc440\",\n            \"xprv9s21ZrQH143K2XTAhys3pMNcGn261Fi5Ta2Pw8PwaVPhg3D8DWkzWQwjTJfskj8ofb81i9NP2cUNKxwjueJHHMQAnxtivTA75uUFqPFeWzk\"\n        ],\n        [\n            \"c0ba5a8e914111210f2bd131f3d5e08d\",\n            \"scheme spot photo card baby mountain device kick cradle pact join borrow\",\n            \"ea725895aaae8d4c1cf682c1bfd2d358d52ed9f0f0591131b559e2724bb234fca05aa9c02c57407e04ee9dc3b454aa63fbff483a8b11de949624b9f1831a9612\",\n            \"xprv9s21ZrQH143K3FperxDp8vFsFycKCRcJGAFmcV7umQmcnMZaLtZRt13QJDsoS5F6oYT6BB4sS6zmTmyQAEkJKxJ7yByDNtRe5asP2jFGhT6\"\n        ],\n        [\n            \"6d9be1ee6ebd27a258115aad99b7317b9c8d28b6d76431c3\",\n            \"horn tenant knee talent sponsor spell gate clip pulse soap slush warm silver nephew swap uncle crack brave\",\n            \"fd579828af3da1d32544ce4db5c73d53fc8acc4ddb1e3b251a31179cdb71e853c56d2fcb11aed39898ce6c34b10b5382772db8796e52837b54468aeb312cfc3d\",\n            \"xprv9s21ZrQH143K3R1SfVZZLtVbXEB9ryVxmVtVMsMwmEyEvgXN6Q84LKkLRmf4ST6QrLeBm3jQsb9gx1uo23TS7vo3vAkZGZz71uuLCcywUkt\"\n        ],\n        [\n            \"9f6a2878b2520799a44ef18bc7df394e7061a224d2c33cd015b157d746869863\",\n            \"panda eyebrow bullet gorilla call smoke muffin taste mesh discover soft ostrich alcohol speed nation flash devote level hobby quick inner drive ghost inside\",\n            \"72be8e052fc4919d2adf28d5306b5474b0069df35b02303de8c1729c9538dbb6fc2d731d5f832193cd9fb6aeecbc469594a70e3dd50811b5067f3b88b28c3e8d\",\n            \"xprv9s21ZrQH143K2WNnKmssvZYM96VAr47iHUQUTUyUXH3sAGNjhJANddnhw3i3y3pBbRAVk5M5qUGFr4rHbEWwXgX4qrvrceifCYQJbbFDems\"\n        ],\n        [\n            \"23db8160a31d3e0dca3688ed941adbf3\",\n            \"cat swing flag economy stadium alone churn speed unique patch report train\",\n            \"deb5f45449e615feff5640f2e49f933ff51895de3b4381832b3139941c57b59205a42480c52175b6efcffaa58a2503887c1e8b363a707256bdd2b587b46541f5\",\n            \"xprv9s21ZrQH143K4G28omGMogEoYgDQuigBo8AFHAGDaJdqQ99QKMQ5J6fYTMfANTJy6xBmhvsNZ1CJzRZ64PWbnTFUn6CDV2FxoMDLXdk95DQ\"\n        ],\n        [\n            \"8197a4a47f0425faeaa69deebc05ca29c0a5b5cc76ceacc0\",\n            \"light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud access\",\n            \"4cbdff1ca2db800fd61cae72a57475fdc6bab03e441fd63f96dabd1f183ef5b782925f00105f318309a7e9c3ea6967c7801e46c8a58082674c860a37b93eda02\",\n            \"xprv9s21ZrQH143K3wtsvY8L2aZyxkiWULZH4vyQE5XkHTXkmx8gHo6RUEfH3Jyr6NwkJhvano7Xb2o6UqFKWHVo5scE31SGDCAUsgVhiUuUDyh\"\n        ],\n        [\n            \"066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad\",\n            \"all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform\",\n            \"26e975ec644423f4a4c4f4215ef09b4bd7ef924e85d1d17c4cf3f136c2863cf6df0a475045652c57eb5fb41513ca2a2d67722b77e954b4b3fc11f7590449191d\",\n            \"xprv9s21ZrQH143K3rEfqSM4QZRVmiMuSWY9wugscmaCjYja3SbUD3KPEB1a7QXJoajyR2T1SiXU7rFVRXMV9XdYVSZe7JoUXdP4SRHTxsT1nzm\"\n        ],\n        [\n            \"f30f8c1da665478f49b001d94c5fc452\",\n            \"vessel ladder alter error federal sibling chat ability sun glass valve picture\",\n            \"2aaa9242daafcee6aa9d7269f17d4efe271e1b9a529178d7dc139cd18747090bf9d60295d0ce74309a78852a9caadf0af48aae1c6253839624076224374bc63f\",\n            \"xprv9s21ZrQH143K2QWV9Wn8Vvs6jbqfF1YbTCdURQW9dLFKDovpKaKrqS3SEWsXCu6ZNky9PSAENg6c9AQYHcg4PjopRGGKmdD313ZHszymnps\"\n        ],\n        [\n            \"c10ec20dc3cd9f652c7fac2f1230f7a3c828389a14392f05\",\n            \"scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump\",\n            \"7b4a10be9d98e6cba265566db7f136718e1398c71cb581e1b2f464cac1ceedf4f3e274dc270003c670ad8d02c4558b2f8e39edea2775c9e232c7cb798b069e88\",\n            \"xprv9s21ZrQH143K4aERa2bq7559eMCCEs2QmmqVjUuzfy5eAeDX4mqZffkYwpzGQRE2YEEeLVRoH4CSHxianrFaVnMN2RYaPUZJhJx8S5j6puX\"\n        ],\n        [\n            \"f585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f\",\n            \"void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold\",\n            \"01f5bced59dec48e362f2c45b5de68b9fd6c92c6634f44d6d40aab69056506f0e35524a518034ddc1192e1dacd32c1ed3eaa3c3b131c88ed8e7e54c49a5d0998\",\n            \"xprv9s21ZrQH143K39rnQJknpH1WEPFJrzmAqqasiDcVrNuk926oizzJDDQkdiTvNPr2FYDYzWgiMiC63YmfPAa2oPyNB23r2g7d1yiK6WpqaQS\"\n        ]\n\n    ];\n\n    #[test]\n    fn test_vectors() {\n        VECTORS.iter().for_each(|item| {\n            let mnemonic = Mnemonic::from_phrase(item[1], Language::English).unwrap();\n            let seed = Seed::new(&mnemonic, \"TREZOR\");\n            assert_eq!(item[0], hex::encode(mnemonic.entropy()));\n            assert_eq!(item[1], mnemonic.phrase());\n            assert_eq!(item[2], format!(\"{:x}\", seed));\n            let xprv = XprvSecp256k1::new(seed).unwrap();\n            assert_eq!(item[3], xprv.to_extended_key(Prefix::XPRV).to_string());\n        })\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/seed.rs",
    "content": "use super::crypto::pbkdf2;\nuse super::Mnemonic;\nuse std::fmt;\nuse unicode_normalization::UnicodeNormalization;\nuse zeroize::Zeroize;\n\n/// The secret value used to derive HD wallet addresses from a [`Mnemonic`][Mnemonic] phrase.\n///\n/// Because it is not possible to create a [`Mnemonic`][Mnemonic] instance that is invalid, it is\n/// therefore impossible to have a [`Seed`][Seed] instance that is invalid. This guarantees that only\n/// a valid, intact mnemonic phrase can be used to derive HD wallet addresses.\n///\n/// To get the raw byte value use [`Seed::as_bytes()`][Seed::as_bytes()]. These can be used to derive\n/// HD wallet addresses using another crate (deriving HD wallet addresses is outside the scope of this\n/// crate and the BIP39 standard).\n///\n/// [`Seed`][Seed] implements [`Zeroize`][Zeroize], so it's bytes will be zeroed when it's dropped.\n///\n/// [Mnemonic]: ./mnemonic/struct.Mnemonic.html\n/// [Seed]: ./seed/struct.Seed.html\n/// [Seed::as_bytes()]: ./seed/struct.Seed.html#method.as_bytes\n\n#[derive(Clone)]\npub struct Seed {\n    bytes: Vec<u8>,\n}\n\nimpl Seed {\n    /// Generates the seed from the [`Mnemonic`][Mnemonic] and the password.\n    ///\n    /// [Mnemonic]: ./mnemonic/struct.Mnemonic.html\n    pub fn new(mnemonic: &Mnemonic, password: &str) -> Self {\n        let salt = format!(\"mnemonic{}\", password);\n        let normalized_salt = salt.nfkd().to_string();\n        let bytes = pbkdf2(&mnemonic.as_bytes(), &normalized_salt);\n\n        Self { bytes }\n    }\n\n    /// Get the seed value as a byte slice\n    pub fn as_bytes(&self) -> &[u8] {\n        &self.bytes\n    }\n}\n\nimpl AsRef<[u8]> for Seed {\n    fn as_ref(&self) -> &[u8] {\n        self.as_bytes()\n    }\n}\n\nimpl fmt::Debug for Seed {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{:#X}\", self)\n    }\n}\n\nimpl fmt::LowerHex for Seed {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        if f.alternate() {\n            f.write_str(\"0x\")?;\n        }\n\n        for byte in &self.bytes {\n            write!(f, \"{:02x}\", byte)?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl fmt::UpperHex for Seed {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        if f.alternate() {\n            f.write_str(\"0x\")?;\n        }\n\n        for byte in &self.bytes {\n            write!(f, \"{:02X}\", byte)?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl Drop for Seed {\n    fn drop(&mut self) {\n        self.bytes.zeroize();\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::bip39::Language;\n    #[cfg(target_arch = \"wasm32\")]\n    use wasm_bindgen_test::*;\n\n    #[test]\n    fn seed_hex_format() {\n        let entropy = &[\n            0x33, 0xE4, 0x6B, 0xB1, 0x3A, 0x74, 0x6E, 0xA4, 0x1C, 0xDD, 0xE4, 0x5C, 0x90, 0x84,\n            0x6A, 0x79,\n        ];\n\n        let mnemonic = Mnemonic::from_entropy(entropy, Language::English).unwrap();\n        let seed = Seed::new(&mnemonic, \"password\");\n\n        assert_eq!(format!(\"{:x}\", seed), \"0bde96f14c35a66235478e0c16c152fcaf6301e4d9a81d3febc50879fe7e5438e6a8dd3e39bdf3ab7b12d6b44218710e17d7a2844ee9633fab0e03d9a6c8569b\");\n        assert_eq!(format!(\"{:X}\", seed), \"0BDE96F14C35A66235478E0C16C152FCAF6301E4D9A81D3FEBC50879FE7E5438E6A8DD3E39BDF3AB7B12D6B44218710E17D7A2844EE9633FAB0E03D9A6C8569B\");\n        assert_eq!(format!(\"{:#x}\", seed), \"0x0bde96f14c35a66235478e0c16c152fcaf6301e4d9a81d3febc50879fe7e5438e6a8dd3e39bdf3ab7b12d6b44218710e17d7a2844ee9633fab0e03d9a6c8569b\");\n        assert_eq!(format!(\"{:#X}\", seed), \"0x0BDE96F14C35A66235478E0C16C152FCAF6301E4D9A81D3FEBC50879FE7E5438E6A8DD3E39BDF3AB7B12D6B44218710E17D7A2844EE9633FAB0E03D9A6C8569B\");\n    }\n\n    fn test_unicode_normalization(\n        lang: Language,\n        phrase: &str,\n        password: &str,\n        expected_seed_hex: &str,\n    ) {\n        let mnemonic = Mnemonic::from_phrase(phrase, lang).unwrap();\n        let seed = Seed::new(&mnemonic, password);\n        assert_eq!(format!(\"{:x}\", seed), expected_seed_hex);\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    /// Test vector is derived from https://github.com/infincia/bip39-rs/issues/26#issuecomment-586476647\n    #[cfg(feature = \"spanish\")]\n    fn issue_26() {\n        test_unicode_normalization(\n            Language::Spanish,\n            \"camello pomelo toque oponer urgente lástima merengue cutis tirón pudor pomo barco\",\n            \"el español se habla en muchos países\",\n            \"67a2cf87b9d110dd5210275fd4d7a107a0a0dd9446e02f3822f177365786ae440b8873693c88f732834af90785753d989a367f7094230901b204c567718ce6be\",\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    /// https://github.com/MetacoSA/NBitcoin/blob/master/NBitcoin.Tests/data/bip39_vectors.en.json\n    fn password_is_unicode_normalized() {\n        test_unicode_normalization(\n            Language::English,\n            \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about\",\n            \"nullius　à　nym.zone ¹teſts² English\",\n            \"61f3aa13adcf5f4b8661fc062501d67eca3a53fc0ed129076ad7a22983b6b5ed0e84e47b24cff23b7fca57e127f62f28c1584ed487872d4bfbc773257bdbc434\",\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    /// https://github.com/bip32JP/bip32JP.github.io/commit/360c05a6439e5c461bbe5e84c7567ec38eb4ac5f\n    #[cfg(feature = \"japanese\")]\n    fn japanese_normalization_1() {\n        test_unicode_normalization(\n            Language::Japanese,\n            \"あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あいこくしん　あおぞら\",\n            \"㍍ガバヴァぱばぐゞちぢ十人十色\",\n            \"a262d6fb6122ecf45be09c50492b31f92e9beb7d9a845987a02cefda57a15f9c467a17872029a9e92299b5cbdf306e3a0ee620245cbd508959b6cb7ca637bd55\",\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"japanese\")]\n    fn japanese_normalization_2() {\n        test_unicode_normalization(\n            Language::Japanese,\n            \"うちゅう　ふそく　ひしょ　がちょう　うけもつ　めいそう　みかん　そざい　いばる　うけとる　さんま　さこつ　おうさま　ぱんつ　しひょう　めした　たはつ　いちぶ　つうじょう　てさぎょう　きつね　みすえる　いりぐち　かめれおん\",\n            \"㍍ガバヴァぱばぐゞちぢ十人十色\",\n            \"346b7321d8c04f6f37b49fdf062a2fddc8e1bf8f1d33171b65074531ec546d1d3469974beccb1a09263440fc92e1042580a557fdce314e27ee4eabb25fa5e5fe\",\n        );\n    }\n\n    #[cfg_attr(all(target_arch = \"wasm32\"), wasm_bindgen_test)]\n    #[cfg_attr(not(target_arch = \"wasm32\"), test)]\n    #[cfg(feature = \"french\")]\n    fn french_normalization() {\n        test_unicode_normalization(\n            Language::French,\n            \"paternel xénon curatif séparer docile capable exigence boulon styliste plexus surface embryon crayon gorge exister\",\n            \"nullius　à　nym.zone ¹teſts² Français\",\n            \"cff9ffd2b23549e73601db4129a334c81b28a40f0ee819b5d6a54c409999f0dfb6b89df17cae6408c96786165c205403d283baadc03ffdd391a490923b7d9493\",\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/bip39/util.rs",
    "content": "use unicode_normalization::Decompositions;\n\npub(crate) trait IterExt: Iterator {\n    fn join<R>(&mut self, glue: &str) -> R\n    where\n        R: From<String>,\n        Self::Item: Joinable,\n    {\n        let first = match self.next() {\n            Some(first) => first,\n            None => return String::new().into(),\n        };\n\n        let (lower, _) = self.size_hint();\n\n        let mut buffer = String::with_capacity(lower * (10 + glue.len()));\n\n        first.write_into(&mut buffer);\n\n        for item in self {\n            buffer.push_str(glue);\n            item.write_into(&mut buffer);\n        }\n\n        buffer.into()\n    }\n\n    fn bits<Out>(self) -> BitIter<Self::Item, Out, Self>\n    where\n        Out: Bits,\n        Self::Item: Bits,\n        Self: Sized,\n    {\n        BitIter::new(self)\n    }\n}\n\npub(crate) trait Joinable {\n    fn write_into(self, buf: &mut String);\n}\n\n/// Allow iterator joining on str slices\nimpl Joinable for &str {\n    fn write_into(self, buf: &mut String) {\n        buf.push_str(self);\n    }\n}\n\n/// Allow iterator joining on unicode_normalization iterators\nimpl<I: Iterator<Item = char>> Joinable for Decompositions<I> {\n    fn write_into(self, buf: &mut String) {\n        buf.extend(self);\n    }\n}\n\nimpl<I: Iterator> IterExt for I {}\n\npub(crate) trait Bits {\n    const SIZE: usize;\n\n    fn bits(self) -> u32;\n}\n\nimpl Bits for u8 {\n    const SIZE: usize = 8;\n\n    fn bits(self) -> u32 {\n        self as u32\n    }\n}\n\nimpl Bits for &u8 {\n    const SIZE: usize = 8;\n\n    fn bits(self) -> u32 {\n        *self as u32\n    }\n}\n\n#[derive(Clone, Copy, Debug)]\npub struct Bits11(u16);\n\nimpl Bits for Bits11 {\n    const SIZE: usize = 11;\n\n    fn bits(self) -> u32 {\n        self.0 as u32\n    }\n}\n\nimpl From<u16> for Bits11 {\n    fn from(val: u16) -> Self {\n        Bits11(val)\n    }\n}\n\nimpl From<Bits11> for u16 {\n    fn from(val: Bits11) -> Self {\n        val.0\n    }\n}\n\npub(crate) struct BitWriter {\n    offset: usize,\n    remainder: u32,\n    inner: Vec<u8>,\n}\n\nimpl BitWriter {\n    pub fn with_capacity(capacity: usize) -> Self {\n        let mut bytes = capacity / 8;\n\n        #[allow(clippy::manual_is_multiple_of)]\n        if capacity % 8 != 0 {\n            bytes += 1;\n        }\n\n        Self {\n            offset: 0,\n            remainder: 0,\n            inner: Vec::with_capacity(bytes),\n        }\n    }\n\n    pub fn push<B: Bits>(&mut self, source: B) {\n        let shift = 32 - B::SIZE;\n\n        self.remainder |= (source.bits() << shift) >> self.offset;\n        self.offset += B::SIZE;\n\n        while self.offset >= 8 {\n            self.inner.push((self.remainder >> 24) as u8);\n            self.remainder <<= 8;\n            self.offset -= 8;\n        }\n    }\n\n    pub fn len(&self) -> usize {\n        self.inner.len() * 8 + self.offset\n    }\n\n    pub fn into_bytes(mut self) -> Vec<u8> {\n        if self.offset != 0 {\n            self.inner.push((self.remainder >> 24) as u8);\n        }\n\n        self.inner\n    }\n}\n\npub(crate) struct BitIter<In: Bits, Out: Bits, I: Iterator<Item = In> + Sized> {\n    _phantom: ::std::marker::PhantomData<Out>,\n    source: I,\n    read: usize,\n    buffer: u64,\n}\n\nimpl<In, Out, I> BitIter<In, Out, I>\nwhere\n    In: Bits,\n    Out: Bits,\n    I: Iterator<Item = In>,\n{\n    fn new(source: I) -> Self {\n        let source = source;\n\n        BitIter {\n            _phantom: ::std::marker::PhantomData,\n            source,\n            read: 0,\n            buffer: 0,\n        }\n    }\n}\n\nimpl<In, Out, I> Iterator for BitIter<In, Out, I>\nwhere\n    In: Bits,\n    Out: Bits + From<u16>,\n    I: Iterator<Item = In>,\n{\n    type Item = Out;\n\n    fn next(&mut self) -> Option<Out> {\n        while self.read < Out::SIZE {\n            let bits = self.source.next()?.bits() as u64;\n\n            self.read += In::SIZE;\n            self.buffer |= bits << (64 - self.read);\n        }\n\n        let result = (self.buffer >> (64 - Out::SIZE)) as u16;\n\n        self.buffer <<= Out::SIZE;\n        self.read -= Out::SIZE;\n\n        Some(result.into())\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        let (lower, upper) = self.source.size_hint();\n\n        (\n            (lower * In::SIZE) / Out::SIZE,\n            upper.map(|n| (n * In::SIZE) / Out::SIZE),\n        )\n    }\n}\n\n/// Extract the first `bits` from the `source` byte\npub(crate) fn checksum(source: u8, bits: u8) -> u8 {\n    debug_assert!(bits <= 8, \"Can operate on 8-bit integers only\");\n\n    source >> (8 - bits)\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/crypto.rs",
    "content": "use hex;\nuse ripemd::{Digest, Ripemd160};\n\npub fn ripemd(msg: &[u8]) -> String {\n    // create a RIPEMD-160 hasher instance\n    let mut hasher = Ripemd160::new();\n    // process input message\n    //hasher.update(b\"Hello world!\");\n    hasher.update(msg);\n    // acquire hash digest in the form of GenericArray,\n    // which in this case is equivalent to [u8; 20]\n    let result = hasher.finalize();\n    hex::encode(&result[..])\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/error.rs",
    "content": "#[derive(Debug, thiserror::Error)]\npub enum Error {\n    #[error(\"secp256k1 error\")]\n    Secp256k1Error(#[from] libsecp256k1::Error),\n}\n"
  },
  {
    "path": "crates/anychain-kms/src/lib.rs",
    "content": "#[cfg(feature = \"alloc\")]\nextern crate alloc;\n\n#[cfg(feature = \"std\")]\nextern crate std;\n\npub mod bip32;\npub mod bip39;\npub mod crypto;\npub mod error;\n\nuse anychain_core::crypto::sha256;\nuse anyhow::{anyhow, Result};\nuse bip32::PrivateKey;\nuse curve25519_dalek::Scalar;\nuse ed25519_dalek::{hazmat::ExpandedSecretKey, Signature};\nuse sha2::Sha512;\n\npub fn secp256k1_sign(sk: &[u8], msg: &[u8]) -> Result<(Vec<u8>, u8)> {\n    let sk = libsecp256k1::SecretKey::parse_slice(sk)?;\n    let msg = libsecp256k1::Message::parse_slice(msg)?;\n    let (sig, recid) = libsecp256k1::sign(&msg, &sk);\n    Ok((sig.serialize().to_vec(), recid.into()))\n}\n\npub fn ed25519_sign(sk: &[u8], msg: &[u8]) -> Result<Vec<u8>> {\n    // tests can inject nonce bytes via ed25519_sign_inner\n    let nonce = sha256(sk);\n\n    ed25519_sign_inner(sk, msg, &nonce)\n}\n\nfn ed25519_sign_inner(sk: &[u8], msg: &[u8], nonce_bytes: &[u8]) -> Result<Vec<u8>> {\n    let sk: [u8; 32] = sk\n        .try_into()\n        .map_err(|_| anyhow!(\"Invalid private key length\".to_string()))?;\n\n    /* * NOTE: We intentionally bypass the standard Ed25519 \"clamping\" process\n     * (clearing the lowest 3 bits and specific MSB bits).\n     *\n     * In standard RFC 8032, clamping is required to prevent small-subgroup attacks.\n     * However, clamping breaks the additivity of scalars, which is essential for\n     * Hierarchical Deterministic (HD) wallets. By using raw scalars without clamping,\n     * we enable \"non-hardened derivation,\" allowing sub-public keys and addresses\n     * to be derived directly from a parent public key without exposing the private key.\n     *\n     * Warning: This makes the implementation non-compliant with standard Ed25519\n     * and should only be used within protocols that handle the co-factor 8 issue\n     * (e.g., via Ristretto or ensuring all points are in the prime-order subgroup).\n     */\n    let scalar = Scalar::from_bytes_mod_order(sk);\n    let nonce: [u8; 32] = nonce_bytes\n        .try_into()\n        .map_err(|_| anyhow!(\"Invalid nonce length\".to_string()))?;\n\n    let xsk = ExpandedSecretKey {\n        scalar,\n        hash_prefix: nonce,\n    };\n\n    let pk = PrivateKey::public_key(&scalar);\n    let sig: Signature = ed25519_dalek::hazmat::raw_sign::<Sha512>(&xsk, msg, &pk);\n    let sig_vec = sig.to_bytes().to_vec();\n\n    Ok(sig_vec)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{ed25519_sign, ed25519_sign_inner};\n    use crate::bip32::{ChildNumber, DerivationPath, Prefix, XprvSecp256k1, XpubSecp256k1};\n    use crate::bip39::{Language, Mnemonic, Seed};\n    use ed25519_dalek::{\n        hazmat::{self, ExpandedSecretKey},\n        Signature, Signer, SigningKey, VerifyingKey,\n    };\n    use sha2::Sha512;\n\n    #[test]\n    fn test_mnemonic() {\n        let phrase = \"heavy face learn track claw jaguar pigeon uncle seven enough glow where\";\n        // let mnemonic =  Mnemonic::new(MnemonicType::Words12,Language::English);\n        let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();\n        //let phrase = mnemonic.phrase();\n        assert_eq!(phrase, mnemonic.phrase());\n        println!(\"phrase:{:#?}\", phrase);\n        let seed = Seed::new(&mnemonic, \"\");\n        println!(\"seed:{:X}\", seed);\n\n        let path: DerivationPath = \"m/44'/196'/300049'/0\".parse().unwrap();\n        let xprv = XprvSecp256k1::new_from_path(seed, &path).unwrap();\n        let _ek = xprv.to_extended_key(Prefix::XPRV);\n        println!(\"xprv:{:?}\", xprv);\n        let cp: ChildNumber = 1u32.into();\n        let cx = xprv.derive_child(cp).unwrap();\n        let mut hex = String::new();\n        for b in cx.to_bytes() {\n            hex.push_str(format!(\"{:X}\", b).as_str());\n        }\n        println!(\"{}\", hex)\n    }\n\n    #[test]\n    fn test_master_xprv() {\n        let phrase = \"heavy face learn track claw jaguar pigeon uncle seven enough glow where\";\n        // let mnemonic =  Mnemonic::new(MnemonicType::Words12,Language::English);\n        let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();\n        //let phrase = mnemonic.phrase();\n        let seed = Seed::new(&mnemonic, \"\");\n        // let path: DerivationPath = \"m\".parse().unwrap();\n        let xprv = XprvSecp256k1::new(seed).unwrap();\n        let _secret = xprv.private_key();\n        //let ek = xprv.to_extended_key(Prefix::XPRV);\n        println!(\"xprv:{:}\", xprv.to_string(Prefix::XPRV).as_str());\n    }\n\n    #[test]\n    fn test_xpub() {\n        let phrase =\n            \"deal pretty baby midnight federal capital suggest cheese creek mutual boil shine\";\n        let mnemonic = Mnemonic::from_phrase(phrase, Language::English).unwrap();\n        //let phrase = mnemonic.phrase();\n        let seed = Seed::new(&mnemonic, \"\");\n        let path: DerivationPath = \"m/44'/60\".parse().unwrap();\n        let xprv = XprvSecp256k1::new_from_path(seed, &path).unwrap();\n        let xpub: XpubSecp256k1 = xprv.public_key();\n\n        println!(\"{}\", xpub.to_string(Prefix::XPUB));\n    }\n\n    #[test]\n    fn test_stand_ed25519_sign() {\n        // ed25519-dalek v2.2.0\n\n        let secret_key_bytes: [u8; 32] = [\n            224, 90, 166, 77, 51, 213, 200, 177, 62, 18, 172, 127, 11, 124, 215, 1, 150, 165, 56,\n            139, 192, 234, 139, 72, 131, 7, 67, 224, 44, 17, 79, 101,\n        ];\n\n        let secret_key = ed25519_dalek::SecretKey::from(secret_key_bytes);\n        let expanded_secret_key: ExpandedSecretKey = ExpandedSecretKey::from(&secret_key);\n        let verifying_key = VerifyingKey::from(&expanded_secret_key);\n\n        let message = b\"helloworld\";\n        let raw_signature: Signature =\n            hazmat::raw_sign::<Sha512>(&expanded_secret_key, message, &verifying_key);\n\n        let signing_key = SigningKey::from_bytes(&secret_key_bytes);\n        let standard_signature = signing_key.sign(message);\n\n        assert_eq!(raw_signature, standard_signature);\n\n        let custom_signature_result = ed25519_sign(&expanded_secret_key.scalar.to_bytes(), message);\n        assert!(custom_signature_result.is_ok());\n\n        let custom_signature_bytes = custom_signature_result.unwrap();\n\n        // custom_signature_bytes does not equal raw_signature\n        assert_ne!(custom_signature_bytes.as_slice(), raw_signature.to_bytes());\n    }\n\n    #[test]\n    fn test_ed25519_sign() {\n        let sk = [1u8; 32];\n        let msg = b\"hello world\";\n        let sig = super::ed25519_sign(&sk, msg);\n        assert!(sig.is_ok());\n\n        let sig = sig.unwrap();\n        let expected_sig = [\n            5, 0, 237, 32, 228, 86, 144, 1, 231, 127, 241, 133, 219, 99, 108, 67, 2, 122, 193, 83,\n            79, 26, 253, 179, 22, 235, 248, 218, 171, 222, 240, 37, 141, 35, 38, 109, 86, 242, 219,\n            149, 203, 118, 228, 214, 173, 156, 71, 238, 246, 140, 200, 129, 33, 217, 203, 199, 44,\n            91, 144, 161, 185, 213, 14, 6,\n        ];\n        assert_eq!(expected_sig.as_slice(), sig);\n    }\n\n    #[test]\n    fn test_ed25519_exception() {\n        let msg = b\"hello world\";\n\n        let short_sk = [1u8; 31];\n        let sk_err = ed25519_sign(&short_sk, msg).unwrap_err();\n        assert!(sk_err.to_string().contains(\"Invalid private key length\"));\n\n        let sk = [1u8; 32];\n        let short_nonce = [2u8; 31];\n        let nonce_err = ed25519_sign_inner(&sk, msg, &short_nonce).unwrap_err();\n        assert!(nonce_err.to_string().contains(\"Invalid nonce length\"));\n    }\n}\n"
  },
  {
    "path": "crates/anychain-neo/Cargo.toml",
    "content": "[package]\nname = \"anychain-neo\"\nversion = \"0.1.1\"\nauthors.workspace = true\nedition.workspace = true\nhomepage.workspace = true\nlicense.workspace = true\nrepository.workspace = true\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\np256 = { workspace  = true }\nbase58 = { workspace = true }\nbase64 = { workspace = true }\n\n[dev-dependencies]\nrand = { workspace = true }\n\n[lints]\nworkspace = true"
  },
  {
    "path": "crates/anychain-neo/src/address.rs",
    "content": "use crate::{NeoFormat, NeoPublicKey};\nuse anychain_core::{\n    crypto::{checksum, hash160},\n    Address, AddressError, PublicKey,\n};\nuse base58::{FromBase58, ToBase58};\nuse std::{fmt::Display, str::FromStr};\n\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]\npub struct NeoAddress(pub String);\n\nimpl Address for NeoAddress {\n    type Format = NeoFormat;\n    type SecretKey = p256::SecretKey;\n    type PublicKey = NeoPublicKey;\n\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        Self::PublicKey::from_secret_key(secret_key).to_address(format)\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        _format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        let bytes = public_key.serialize_compressed();\n        let bytes = [\n            vec![\n                0x0c, /* PushData1 */\n                0x21, /* compressed key length */\n            ],\n            bytes, /* compressed public key bytes */\n            vec![\n                0x41, /* Opcode.Syscall */\n                0x56, 0xe7, 0xb3, 0x27, /* System.Crypto.CheckSig */\n            ],\n        ]\n        .concat();\n\n        let hash = hash160(&bytes);\n        let payload = [vec![0x35u8 /* version byte */], hash].concat();\n\n        let checksum = checksum(&payload)[..4].to_vec();\n        let res = [payload, checksum].concat();\n\n        Ok(Self(res.to_base58()))\n    }\n}\n\nimpl NeoAddress {\n    pub fn to_script_hash(&self) -> Vec<u8> {\n        let bytes = self.0.as_str().from_base58().unwrap();\n        // strip the version byte and the checksum\n        bytes[1..21].to_vec()\n    }\n}\n\nimpl FromStr for NeoAddress {\n    type Err = AddressError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        let bytes = s.from_base58()?;\n        let checksum_provided = bytes[21..].to_vec();\n        let checksum_gen = checksum(&bytes[..21])[..4].to_vec();\n\n        if checksum_gen != checksum_provided {\n            return Err(AddressError::Message(format!(\"Invalid address {}\", s)));\n        }\n\n        Ok(Self(s.to_string()))\n    }\n}\n\nimpl Display for NeoAddress {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n#[allow(unused_imports)]\n#[cfg(test)]\nmod tests {\n    // use anychain_core::{Address, PublicKey};\n    // use super::{NeoFormat, NeoAddress, NeoPublicKey};\n    use super::*;\n    use rand::rngs::OsRng;\n\n    #[test]\n    fn test_address_from_secret_key() {\n        // Create a secret key for testing\n        let mut rng = OsRng;\n        let secret_key = p256::SecretKey::random(&mut rng);\n\n        // Define the desired format\n        let format = NeoFormat::Standard;\n        let result = NeoAddress::from_secret_key(&secret_key, &format);\n\n        assert!(result.is_ok());\n\n        let address = result.unwrap();\n        assert_eq!(address.to_script_hash().len(), 20);\n    }\n\n    #[test]\n    fn test_address_from_public_key() {\n        // Create a public key for testing\n\n        let mut rng = OsRng;\n        let secret_key = p256::SecretKey::random(&mut rng);\n        let public_key = NeoPublicKey::from_secret_key(&secret_key);\n\n        let format = NeoFormat::Standard;\n        let result = NeoAddress::from_public_key(&public_key, &format);\n\n        assert!(result.is_ok());\n\n        let address = result.unwrap();\n        assert_eq!(address.to_script_hash().len(), 20);\n    }\n\n    #[test]\n    fn test_address_from_str() {\n        let address_str = \"NVEqR4e73afGKpVBzBXLEnY5F5uZSmSKZZ\";\n        let address = NeoAddress::from_str(address_str);\n\n        assert!(address.is_ok());\n\n        let parsed_address = address.unwrap();\n        assert_eq!(parsed_address.to_string(), address_str);\n    }\n\n    #[test]\n    fn tesa_addresses_from_sk() {\n        let mut sk = [\n            1u8, 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,\n            1, 1, 1, 1,\n        ];\n\n        let format = NeoFormat::Standard;\n\n        let addresses = [\n            \"NKvAasuNZqDc8dQDXd6Wm2XccTh6Dt3nr4\",\n            \"NUz6PKTAM7NbPJzkKJFNay3VckQtcDkgWo\",\n            \"NgZs1i1hZSWh9Lpj9mVRZyNLT3gvydn5Y7\",\n            \"NVKhps7L2souj2xUSw9dWuyGn5Sdgv8g6J\",\n            \"NcBrH4zAwCf3XhywpxgWPcTv3y67y8C1C2\",\n            \"NdvNCaDAt4gn4cWz1Ua8AUp6RQ3u5uABpK\",\n            \"NMkKsN8SrmSTDB4j6EsbELxnJ5UmcUZLVS\",\n            \"NYQLdcRTgLcnsZ3fWjnobBxZkzc4rRnbtb\",\n            \"NbnMx2Bt6b6AWgZzuK7c3iuNFySoGhyg5S\",\n            \"NWUTErT9hs9QiphzhkxbFzhpfKQXX5xvqf\",\n        ];\n\n        for i in 0..10 {\n            sk[3] = i;\n            let sk = p256::SecretKey::from_slice(&sk).unwrap();\n            let addr = NeoPublicKey::from_secret_key(&sk)\n                .to_address(&format)\n                .unwrap();\n            assert_eq!(format!(\"{}\", addr), addresses[i as usize]);\n        }\n    }\n}\n"
  },
  {
    "path": "crates/anychain-neo/src/format.rs",
    "content": "use anychain_core::Format;\n\nuse core::fmt;\n\n/// Represents the format of a Ethereum address\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum NeoFormat {\n    Standard,\n}\n\nimpl Format for NeoFormat {}\n\nimpl fmt::Display for NeoFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"Standard\")\n    }\n}\n"
  },
  {
    "path": "crates/anychain-neo/src/lib.rs",
    "content": "mod address;\npub use address::*;\n\nmod format;\npub use format::*;\n\nmod public_key;\npub use public_key::*;\n\nmod transaction;\npub use transaction::*;\n"
  },
  {
    "path": "crates/anychain-neo/src/public_key.rs",
    "content": "use crate::{NeoAddress, NeoFormat};\nuse anychain_core::{hex, Address, AddressError, PublicKey, PublicKeyError};\nuse std::{fmt::Display, str::FromStr};\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct NeoPublicKey(pub p256::PublicKey);\n\nimpl PublicKey for NeoPublicKey {\n    type SecretKey = p256::SecretKey;\n    type Address = NeoAddress;\n    type Format = NeoFormat;\n\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        let scalar = secret_key.to_nonzero_scalar();\n        Self(p256::PublicKey::from_secret_scalar(&scalar))\n    }\n\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError> {\n        Self::Address::from_public_key(self, format)\n    }\n}\n\nimpl NeoPublicKey {\n    #[allow(deprecated)]\n    pub fn serialize_compressed(&self) -> Vec<u8> {\n        p256::CompressedPoint::from(self.0).as_slice().to_vec()\n    }\n}\n\nimpl FromStr for NeoPublicKey {\n    type Err = PublicKeyError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        let bin = hex::decode(s)?;\n        let public_key = p256::PublicKey::from_sec1_bytes(&bin).unwrap();\n        Ok(NeoPublicKey(public_key))\n    }\n}\n\nimpl Display for NeoPublicKey {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        let bytes = self.0.to_sec1_bytes().to_vec();\n        let s = hex::encode(bytes);\n        write!(f, \"pk = {}, len = {}\", s, s.len())\n    }\n}\n\n#[cfg(test)]\nmod test {\n\n    use super::*;\n    use crate::NeoPublicKey;\n    use anychain_core::PublicKey;\n\n    #[test]\n    fn test_public_key_from_str() {\n        let sk = [\n            1u8, 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,\n            1, 1, 1, 1,\n        ];\n\n        let sk = p256::SecretKey::from_slice(&sk).unwrap();\n        let _public_key = NeoPublicKey::from_secret_key(&sk);\n\n        let public_key = \"046ff03b949241ce1dadd43519e6960e0a85b41a69a05c328103aa2bce1594ca163c4f753a55bf01dc53f6c0b0c7eee78b40c6ff7d25a96e2282b989cef71c144a\";\n\n        let pb = NeoPublicKey::from_str(public_key);\n        assert!(pb.is_ok());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-neo/src/transaction.rs",
    "content": "use crate::{NeoAddress, NeoFormat, NeoPublicKey};\nuse anychain_core::{crypto::sha256, hex, Transaction, TransactionError, TransactionId};\nuse std::fmt::{Display, Error};\n\n#[derive(Clone)]\npub struct TxIn {\n    prev_hash: Vec<u8>,\n    index: u16,\n}\n\n#[derive(Clone)]\npub struct TxOut {\n    asset_id: Vec<u8>,\n    address: String,\n    value: u64,\n}\n\nimpl TxIn {\n    fn serialize(&self) -> Vec<u8> {\n        if self.prev_hash.len() != 32 {\n            panic!(\"Invalid prev_hash length\");\n        }\n        let prevhash = self.prev_hash.clone();\n        let index = self.index.to_le_bytes().to_vec();\n        [prevhash, index].concat()\n    }\n}\n\nimpl TxOut {\n    fn serialize(&self) -> Vec<u8> {\n        if self.asset_id.len() != 32 {\n            panic!(\"Invalid prev_hash length\");\n        }\n        let mut asset_id = self.asset_id.clone();\n        asset_id.reverse();\n        let value = self.value.to_le_bytes().to_vec();\n        let address = NeoAddress(self.address.clone());\n        let address = address.to_script_hash();\n\n        [asset_id, value, address].concat()\n    }\n}\n\n#[derive(Clone)]\npub struct NeoTransactionParameters {\n    txins: Vec<TxIn>,\n    txouts: Vec<TxOut>,\n}\n\nimpl NeoTransactionParameters {\n    fn serialize(&self) -> Vec<u8> {\n        let mut ret = vec![0u8; 0];\n        ret.push(0x80); // contract type byte\n        ret.push(0x00); // version byte\n\n        ret.push(0u8); // attribute length, which is 0\n\n        ret.push(self.txins.len() as u8);\n\n        for txin in &self.txins {\n            ret.extend(txin.serialize());\n        }\n\n        ret.push(self.txouts.len() as u8);\n\n        for txout in &self.txouts {\n            ret.extend(txout.serialize());\n        }\n\n        ret\n    }\n}\n\n#[derive(Clone)]\npub struct NeoSignature {\n    rs: Vec<u8>,\n    public_key: Vec<u8>,\n}\n\nimpl NeoSignature {\n    fn serialize(&self) -> Vec<u8> {\n        let mut stream = vec![];\n        let rs = self.rs.clone();\n        let pk = self.public_key.clone();\n\n        let rs_script = [vec![rs.len() as u8], rs].concat();\n        let pk_script = [vec![pk.len() as u8], pk, vec![172 /* Opcode::CheckSig */]].concat();\n\n        stream.push(rs_script.len() as u8);\n        stream.extend(rs_script);\n        stream.push(pk_script.len() as u8);\n        stream.extend(pk_script);\n        stream\n    }\n}\n\n#[derive(Clone)]\npub struct NeoTransaction {\n    params: NeoTransactionParameters,\n    signatures: Option<Vec<NeoSignature>>,\n}\n\n#[derive(Clone, Debug, Hash, PartialEq, Eq)]\npub struct NeoTransactionId {\n    txid: Vec<u8>,\n}\n\nimpl Display for NeoTransactionId {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n\nimpl TransactionId for NeoTransactionId {}\n\nimpl Transaction for NeoTransaction {\n    type TransactionId = NeoTransactionId;\n    type Format = NeoFormat;\n    type TransactionParameters = NeoTransactionParameters;\n    type Address = NeoAddress;\n    type PublicKey = NeoPublicKey;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            params: params.clone(),\n            signatures: None,\n        })\n    }\n\n    fn sign(&mut self, rs_pk_s: Vec<u8>, _recid: u8) -> Result<Vec<u8>, TransactionError> {\n        if !rs_pk_s.len().is_multiple_of(97) {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signauture-public-key tuple length {}\",\n                rs_pk_s.len()\n            )));\n        }\n\n        let sigs_cnt = rs_pk_s.len() / 97;\n        let txins_cnt = self.params.txins.len();\n\n        if sigs_cnt != txins_cnt {\n            return Err(TransactionError::Message(format!(\n                \"Amount of signatures {} differs with that of tx inputs {}\",\n                sigs_cnt, txins_cnt,\n            )));\n        }\n\n        let mut sigs = vec![];\n        for i in 0..sigs_cnt {\n            let start = 97 * i;\n            let divide = start + 64;\n            let end = divide + 33;\n            let sig = NeoSignature {\n                rs: rs_pk_s[start..divide].to_vec(),\n                public_key: rs_pk_s[divide..end].to_vec(),\n            };\n            sigs.push(sig);\n        }\n\n        self.signatures = Some(sigs);\n        self.to_bytes()\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        let mut stream = self.params.serialize();\n        if let Some(sigs) = &self.signatures {\n            stream.push(sigs.len() as u8);\n            for sig in sigs {\n                stream.extend(sig.serialize());\n            }\n        }\n        Ok(stream)\n    }\n\n    fn from_bytes(_tx: &[u8]) -> Result<Self, TransactionError> {\n        todo!()\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        let stream = self.to_bytes()?;\n        Ok(NeoTransactionId {\n            txid: sha256(&stream).to_vec(),\n        })\n    }\n}\n\nimpl Display for NeoTransaction {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            &hex::encode(match self.to_bytes() {\n                Ok(transaction) => transaction,\n                _ => return Err(Error),\n            })\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{TxIn, TxOut};\n\n    use super::{NeoFormat, NeoPublicKey, NeoTransaction, NeoTransactionParameters};\n\n    use p256::ecdsa::{signature::Signer, Signature, SigningKey};\n\n    use anychain_core::{hex, PublicKey, Transaction};\n    use base64::{engine::general_purpose::STANDARD_NO_PAD, Engine};\n\n    #[allow(deprecated)]\n    #[test]\n    fn test_tx_gen() {\n        let sk = [\n            1u8, 1, 1, 23, 1, 1, 1, 59, 1, 1, 1, 16, 87, 1, 1, 1, 1, 99, 1, 1, 1, 1, 79, 1, 1, 1,\n            1, 1, 121, 1, 1, 1,\n        ];\n        let sk = p256::SecretKey::from_slice(&sk).unwrap();\n        let pk = NeoPublicKey::from_secret_key(&sk);\n        let format = &NeoFormat::Standard;\n        let _from = pk.to_address(format).unwrap();\n\n        let sk_to = [\n            2u8, 7, 0, 5, 0, 0, 1, 1, 111, 23, 34, 39, 109, 20, 1, 2, 7, 0, 5, 0, 0, 1, 1, 111, 23,\n            34, 39, 109, 203, 1, 5, 55,\n        ];\n        let sk_to = p256::SecretKey::from_slice(&sk_to).unwrap();\n        let pk_to = NeoPublicKey::from_secret_key(&sk_to);\n        let to = pk_to.to_address(format).unwrap();\n\n        let prev_hash = \"b3ad3320f8230a8358a4c056ead57182d787ec8607870f70d70a844dc4d049a3\";\n        let index = 0;\n\n        let asset_id = \"c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b\";\n\n        let mut prev_hash = hex::decode(prev_hash).unwrap();\n        prev_hash.reverse();\n\n        let asset_id = hex::decode(asset_id).unwrap();\n\n        let input = TxIn { prev_hash, index };\n        let output = TxOut {\n            asset_id,\n            address: to.0,\n            value: 1000000000,\n        };\n\n        let params = NeoTransactionParameters {\n            txins: vec![input],\n            txouts: vec![output],\n        };\n\n        let mut tx = NeoTransaction::new(&params).unwrap();\n        let hash = tx.to_transaction_id().unwrap().txid;\n\n        let signing_key = SigningKey::from(sk);\n\n        // the signature differs with bipay signature, possible cause being that\n        // bipay use a random r as opposed to a fixed r used by this signer\n        let sig: Signature = signing_key.sign(&hash);\n\n        let mut sig = sig.to_bytes().as_slice().to_vec();\n        sig.extend(pk.serialize_compressed());\n\n        let tx = tx.sign(sig, 0).unwrap();\n        let tx_hex = hex::encode(&tx);\n        let tx_64 = STANDARD_NO_PAD.encode(&tx);\n\n        println!(\"tx hex = {}\\ntx 64 = {}\", tx_hex, tx_64);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/Cargo.toml",
    "content": "[package]\nname = \"anychain-polkadot\"\ndescription = \"A Rust library for Polkadot cryptocurrency wallets, enabling seamless transactions on the Polkadot blockchain\"\nversion = \"0.1.7\"\nkeywords = [\"polkadot\", \"blockchain\", \"wallet\", \"transactions\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\nsp-core = \"38.1.0\"\nbase58 = { workspace = true }\nparity-scale-codec = { version = \"3.6.5\" }\ned25519-dalek = { workspace = true }\nserde_json = { workspace = true }\nlibsecp256k1 = { workspace = true }\nblake2b_simd = { workspace = true }\nsha2 = {workspace = true}\n\n[dev-dependencies]\ncurve25519-dalek = {workspace = true}\nanychain-kms = { path = \"../anychain-kms\", version = \"0.1.20\" }\n\n[lints]\nworkspace = true"
  },
  {
    "path": "crates/anychain-polkadot/README.md",
    "content": "# anychain-polkadot\n\nanychain-polkadot is a Rust library for Polkadot cryptocurrency wallets. It enables seamless transactions on the Polkadot blockchain.\n\n## Features\n\n- Address generation and validation\n- Transaction building, signing, and broadcasting\n- Querying blockchain data (blocks, transactions, balances, etc.)\n\n## Installation\n\nAdd the following to your `Cargo.toml` file:\n\n```toml\n[dependencies]\nanychain-polkadot = \"0.1.4\"\n```\n\nThen run `cargo build` to download and compile the library.\n\n## Usage\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute, please follow these steps:\n\n1. Fork the repository\n2. Create a new branch for your changes\n3. Make your changes and commit them to your branch\n4. Create a pull request and describe your changes\n\nPlease make sure to follow the Rust coding guidelines and add tests for any new features or bug fixes.\n\n## License\n\nanychain-polkadot is released under the MIT License. See the [LICENSE](LICENSE) file for more information."
  },
  {
    "path": "crates/anychain-polkadot/src/address.rs",
    "content": "use std::{fmt::Display, marker::PhantomData, str::FromStr};\n\nuse anychain_core::{hex, Address, AddressError, PublicKey, TransactionError};\n\nuse crate::{PolkadotFormat, PolkadotNetwork, PolkadotPublicKey, PolkadotSecretKey};\nuse base58::{FromBase58, ToBase58};\nuse sp_core::hashing::blake2_512;\n\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub struct PolkadotAddress<N: PolkadotNetwork> {\n    addr: String,\n    _network: PhantomData<N>,\n}\n\nimpl<N: PolkadotNetwork> Address for PolkadotAddress<N> {\n    type SecretKey = PolkadotSecretKey;\n    type PublicKey = PolkadotPublicKey<N>;\n    type Format = PolkadotFormat;\n\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, anychain_core::AddressError> {\n        Self::PublicKey::from_secret_key(secret_key).to_address(format)\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        _format: &Self::Format,\n    ) -> Result<Self, anychain_core::AddressError> {\n        Self::from_payload(&hex::encode(public_key.address_payload()))\n    }\n}\n\nimpl<N: PolkadotNetwork> PolkadotAddress<N> {\n    pub fn from_payload(payload: &str) -> Result<Self, AddressError> {\n        let payload = hex::decode(payload).unwrap();\n        let payload = [vec![N::VERSION], payload].concat();\n\n        let ss_prefix = vec![0x53u8, 0x53, 0x35, 0x38, 0x50, 0x52, 0x45];\n\n        let checksum = blake2_512(&[ss_prefix, payload.clone()].concat()).to_vec();\n        let addr = [payload, checksum[..2].to_vec()].concat().to_base58();\n\n        Ok(PolkadotAddress {\n            addr,\n            _network: PhantomData::<N>,\n        })\n    }\n\n    pub fn to_payload(&self) -> Result<Vec<u8>, AddressError> {\n        let bin = self.addr.as_str().from_base58()?;\n        Ok(bin[1..33].to_vec())\n    }\n}\n\nimpl<N: PolkadotNetwork> FromStr for PolkadotAddress<N> {\n    type Err = TransactionError;\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        let bytes = s.from_base58()?;\n        if N::VERSION != bytes[0] {\n            return Err(TransactionError::Message(format!(\n                \"Invalid version byte {} for polkadot network {}\",\n                bytes[0],\n                N::NAME,\n            )));\n        }\n        let checksum_provided = bytes[33..].to_vec();\n        let ss_prefix = vec![0x53u8, 0x53, 0x35, 0x38, 0x50, 0x52, 0x45];\n        let checksum_expected =\n            blake2_512(&[ss_prefix, bytes[..33].to_vec()].concat())[..2].to_vec();\n        if checksum_expected != checksum_provided {\n            return Err(TransactionError::Message(format!(\n                \"Invalid {} address\",\n                N::NAME\n            )));\n        }\n        Ok(PolkadotAddress {\n            addr: s.to_string(),\n            _network: PhantomData,\n        })\n    }\n}\n\nimpl<N: PolkadotNetwork> Display for PolkadotAddress<N> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", self.addr)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{PolkadotAddress, PolkadotFormat, PolkadotSecretKey, Westend};\n    use anychain_core::{hex, Address};\n    use std::str::FromStr;\n\n    #[test]\n    fn test_address() {\n        let sk = [\n            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n            25, 26, 27, 28, 29, 30, 31, 32,\n        ];\n        let h = hex::encode(sk);\n        println!(\"{}\", h);\n\n        // let sk = SecretKey::from_bytes(sk.as_slice()).unwrap();\n        let signing_key: ed25519_dalek::SigningKey = ed25519_dalek::SigningKey::from_bytes(&sk);\n        let sk = PolkadotSecretKey::Ed25519(signing_key.to_bytes());\n\n        let address =\n            PolkadotAddress::<Westend>::from_secret_key(&sk, &PolkadotFormat::Standard).unwrap();\n\n        assert_eq!(\n            \"5EpHX5foDtnhZngj4GsKq5eKGpUvuMqbpUG48ZfCCCs7EzKR\",\n            address.addr\n        );\n    }\n\n    #[test]\n    fn test_address_2() {\n        let hash = \"8ee504148e75c34e8f051899b3c6e4241ff18dc1c9211260b6a6a434bedb485f\";\n        let address = PolkadotAddress::<Westend>::from_payload(hash).unwrap();\n        assert_eq!(\n            \"5FJ4gu9eVX6DG4qYi1hxkUgu1yaTm1CnQ4MiiZPjPVaXiATo\",\n            address.addr\n        );\n    }\n\n    #[test]\n    fn test_address_3() {\n        let addr = \"5DoW9HHuqSfpf55Ux5pLdJbHFWvbngeg8Ynhub9DrdtxmZeV\";\n        let addr = PolkadotAddress::<Westend>::from_str(addr).unwrap();\n        let payload = addr.to_payload().unwrap();\n        let payload = hex::encode(payload);\n        assert_eq!(\n            \"4ce05abd387b560855a3d486eba6237b9a08c6e9dfe351302a5ceda90be801fe\",\n            payload\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/format.rs",
    "content": "use anychain_core::Format;\nuse std::fmt::Display;\n\n#[derive(Hash, Clone, PartialEq, PartialOrd, Eq, Ord, Debug)]\npub enum PolkadotFormat {\n    Standard,\n}\n\nimpl Format for PolkadotFormat {}\n\nimpl Display for PolkadotFormat {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/lib.rs",
    "content": "mod public_key;\npub use public_key::*;\n\nmod address;\npub use address::*;\n\nmod format;\npub use format::*;\n\nmod transaction;\npub use transaction::*;\n\nmod network;\npub use network::*;\n\nmod utilities;\n"
  },
  {
    "path": "crates/anychain-polkadot/src/network/kusama.rs",
    "content": "use std::{fmt::Display, str::FromStr};\n\nuse crate::PolkadotNetwork;\nuse anychain_core::{Network, NetworkError};\n\n#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]\npub struct Kusama;\n\nimpl Network for Kusama {\n    const NAME: &'static str = \"kusama\";\n}\n\nimpl PolkadotNetwork for Kusama {\n    const VERSION: u8 = 0x02;\n    const PALLET_ASSET: u8 = 4;\n    const TRANSFER_ALLOW_DEATH: u8 = 0;\n    const TRANSFER_KEEP_ALIVE: u8 = 3;\n}\n\nimpl FromStr for Kusama {\n    type Err = NetworkError;\n    fn from_str(_s: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\nimpl Display for Kusama {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/network/mod.rs",
    "content": "mod polkadot;\npub use polkadot::*;\n\nmod kusama;\npub use kusama::*;\n\nmod westend;\npub use westend::*;\n\nmod rococo;\npub use rococo::*;\n\nuse anychain_core::Network;\n\npub trait PolkadotNetwork: Network {\n    const VERSION: u8;\n    const PALLET_ASSET: u8;\n    const TRANSFER_ALLOW_DEATH: u8;\n    const TRANSFER_KEEP_ALIVE: u8;\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/network/polkadot.rs",
    "content": "use std::{fmt::Display, str::FromStr};\n\nuse crate::PolkadotNetwork;\nuse anychain_core::{Network, NetworkError};\n\n#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]\npub struct Polkadot;\n\nimpl Network for Polkadot {\n    const NAME: &'static str = \"polkadot\";\n}\n\nimpl PolkadotNetwork for Polkadot {\n    const VERSION: u8 = 0x00;\n    const PALLET_ASSET: u8 = 5;\n    const TRANSFER_ALLOW_DEATH: u8 = 0;\n    const TRANSFER_KEEP_ALIVE: u8 = 3;\n}\n\nimpl FromStr for Polkadot {\n    type Err = NetworkError;\n    fn from_str(_s: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\nimpl Display for Polkadot {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/network/rococo.rs",
    "content": "use std::{fmt::Display, str::FromStr};\n\nuse crate::PolkadotNetwork;\nuse anychain_core::{Network, NetworkError};\n\n#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]\npub struct Rococo;\n\nimpl Network for Rococo {\n    const NAME: &'static str = \"rococo\";\n}\n\nimpl PolkadotNetwork for Rococo {\n    const VERSION: u8 = 0x2a;\n    const PALLET_ASSET: u8 = 4;\n    const TRANSFER_ALLOW_DEATH: u8 = 0;\n    const TRANSFER_KEEP_ALIVE: u8 = 3;\n}\n\nimpl FromStr for Rococo {\n    type Err = NetworkError;\n    fn from_str(_s: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\nimpl Display for Rococo {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/network/westend.rs",
    "content": "use std::{fmt::Display, str::FromStr};\n\nuse crate::PolkadotNetwork;\nuse anychain_core::{Network, NetworkError};\n\n#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]\npub struct Westend;\n\nimpl Network for Westend {\n    const NAME: &'static str = \"westend\";\n}\n\nimpl PolkadotNetwork for Westend {\n    const VERSION: u8 = 0x2a;\n    const PALLET_ASSET: u8 = 4;\n    const TRANSFER_ALLOW_DEATH: u8 = 0;\n    const TRANSFER_KEEP_ALIVE: u8 = 3;\n}\n\nimpl FromStr for Westend {\n    type Err = NetworkError;\n    fn from_str(_s: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\nimpl Display for Westend {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/public_key.rs",
    "content": "use crate::{PolkadotAddress, PolkadotFormat, PolkadotNetwork};\nuse anychain_core::{Address, PublicKey, PublicKeyError};\nuse sp_core::blake2_256;\nuse std::{fmt::Display, marker::PhantomData, str::FromStr};\n\npub enum PolkadotSecretKey {\n    Secp256k1(libsecp256k1::SecretKey),\n    Ed25519(ed25519_dalek::SecretKey),\n}\n\n#[derive(Debug, Clone)]\npub enum PublicKeyContent {\n    Secp256k1(libsecp256k1::PublicKey),\n    Ed25519(ed25519_dalek::VerifyingKey),\n}\n\n#[derive(Debug, Clone)]\npub struct PolkadotPublicKey<N: PolkadotNetwork> {\n    pub key: PublicKeyContent,\n    _network: PhantomData<N>,\n}\n\nimpl<N: PolkadotNetwork> PublicKey for PolkadotPublicKey<N> {\n    type SecretKey = PolkadotSecretKey;\n    type Address = PolkadotAddress<N>;\n    type Format = PolkadotFormat;\n\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        match secret_key {\n            Self::SecretKey::Secp256k1(sk) => {\n                let pk = libsecp256k1::PublicKey::from_secret_key(sk);\n                let pk = PublicKeyContent::Secp256k1(pk);\n                Self {\n                    key: pk,\n                    _network: PhantomData,\n                }\n            }\n            Self::SecretKey::Ed25519(sk) => {\n                let signing_key: ed25519_dalek::SigningKey =\n                    ed25519_dalek::SigningKey::from_bytes(sk);\n                let pk: ed25519_dalek::VerifyingKey = signing_key.verifying_key();\n                let pk = PublicKeyContent::Ed25519(pk);\n                Self {\n                    key: pk,\n                    _network: PhantomData,\n                }\n            }\n        }\n    }\n\n    fn to_address(\n        &self,\n        format: &Self::Format,\n    ) -> Result<Self::Address, anychain_core::AddressError> {\n        Self::Address::from_public_key(self, format)\n    }\n}\n\nimpl<N: PolkadotNetwork> PolkadotPublicKey<N> {\n    pub fn serialize(&self) -> Vec<u8> {\n        match self.key {\n            PublicKeyContent::Secp256k1(pk) => pk.serialize_compressed().to_vec(),\n            PublicKeyContent::Ed25519(pk) => pk.to_bytes().to_vec(),\n        }\n    }\n\n    pub fn address_payload(&self) -> Vec<u8> {\n        match self.key {\n            PublicKeyContent::Secp256k1(_) => blake2_256(&self.serialize()).to_vec(),\n            PublicKeyContent::Ed25519(_) => self.serialize(),\n        }\n    }\n}\n\nimpl<N: PolkadotNetwork> FromStr for PolkadotPublicKey<N> {\n    type Err = PublicKeyError;\n    fn from_str(_s: &str) -> Result<Self, Self::Err> {\n        todo!()\n    }\n}\n\nimpl<N: PolkadotNetwork> Display for PolkadotPublicKey<N> {\n    fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        todo!()\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/transaction.rs",
    "content": "use crate::utilities::crypto::blake2b_256;\nuse crate::{PolkadotAddress, PolkadotFormat, PolkadotNetwork, PolkadotPublicKey};\nuse anychain_core::{hex, Transaction, TransactionError, TransactionId};\nuse parity_scale_codec::{Decode, Encode, HasCompact};\nuse std::fmt::Display;\n\n#[derive(Clone)]\npub struct PolkadotTransactionParameters<N: PolkadotNetwork> {\n    pub from: PolkadotAddress<N>,\n    pub to: PolkadotAddress<N>,\n    pub amount: u64,\n    pub nonce: u64,\n    pub tip: u64,\n    pub block_hash: String,\n    pub genesis_hash: String,\n    pub spec_version: u32,\n    pub tx_version: u32,\n}\n\nstruct TxInterim {\n    method: Vec<u8>,\n    era: Vec<u8>,\n    nonce: Vec<u8>,\n    tip: Vec<u8>,\n    spec_version: Vec<u8>,\n    genesis_hash: Vec<u8>,\n    block_hash: Vec<u8>,\n    tx_version: Vec<u8>,\n}\n\n#[derive(Clone)]\npub struct PolkadotTransaction<N: PolkadotNetwork> {\n    pub params: PolkadotTransactionParameters<N>,\n    pub signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Clone, Hash, PartialEq, Eq)]\npub struct PolkadotTransactionId {\n    txid: Vec<u8>,\n}\n\nimpl TransactionId for PolkadotTransactionId {}\n\nimpl Display for PolkadotTransactionId {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"0x{}\", hex::encode(&self.txid))\n    }\n}\n\n#[derive(Debug, PartialEq, Encode, Decode)]\nstruct CompactWrapper<T: HasCompact> {\n    #[codec(encoded_as = \"<T as HasCompact>::Type\")]\n    val: T,\n}\n\nfn encode(val: u64) -> Vec<u8> {\n    if val == 0 {\n        vec![0]\n    } else {\n        CompactWrapper { val }.encode()\n    }\n}\n\nimpl<N: PolkadotNetwork> Transaction for PolkadotTransaction<N> {\n    type Address = PolkadotAddress<N>;\n    type Format = PolkadotFormat;\n    type PublicKey = PolkadotPublicKey<N>;\n    type TransactionId = PolkadotTransactionId;\n    type TransactionParameters = PolkadotTransactionParameters<N>;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(PolkadotTransaction {\n            params: params.clone(),\n            signature: None,\n        })\n    }\n\n    // Only used for secp256k1 signing scheme\n    fn sign(&mut self, rs: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError> {\n        if rs.len() != 64 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signature length {}\",\n                rs.len(),\n            )));\n        }\n        self.signature = Some([rs, vec![recid]].concat());\n        self.to_bytes()\n    }\n\n    fn from_bytes(_tx: &[u8]) -> Result<Self, TransactionError> {\n        todo!()\n    }\n\n    // Only used for secp256k1 signing scheme\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        match &self.signature {\n            Some(sig) => {\n                let interim = self.to_interim()?;\n                let from = self.params.from.to_payload()?;\n\n                let stream = [\n                    vec![0x84], // version = 0x84\n                    vec![0],\n                    from,\n                    vec![2], // ed25519 = 0, sr25519 = 1, secp256k1 = 2\n                    sig.clone(),\n                    interim.era,\n                    interim.nonce,\n                    interim.tip,\n                    interim.method,\n                ]\n                .concat();\n\n                let len = stream.len() as u64;\n                let len = encode(len);\n\n                Ok([len, stream].concat())\n            }\n            None => {\n                let interim = self.to_interim()?;\n                Ok([\n                    interim.method,\n                    interim.era,\n                    interim.nonce,\n                    interim.tip,\n                    interim.spec_version,\n                    interim.tx_version,\n                    interim.genesis_hash,\n                    interim.block_hash,\n                ]\n                .concat())\n            }\n        }\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        Ok(PolkadotTransactionId {\n            txid: blake2b_256(&self.to_bytes()?).to_vec(),\n        })\n    }\n}\n\nimpl<N: PolkadotNetwork> PolkadotTransaction<N> {\n    fn to_interim(&self) -> Result<TxInterim, TransactionError> {\n        let params = &self.params;\n\n        let to = params.to.to_payload()?;\n        let amount = encode(params.amount);\n        let era = vec![0];\n\n        let nonce = encode(params.nonce);\n        let tip = encode(params.tip);\n\n        let spec_version = params.spec_version.to_le_bytes().to_vec();\n        let tx_version = params.tx_version.to_le_bytes().to_vec();\n\n        let genesis_hash = hex::decode(&params.genesis_hash)?;\n        let block_hash = hex::decode(&params.block_hash)?;\n\n        let interim = TxInterim {\n            method: [\n                vec![N::PALLET_ASSET, N::TRANSFER_ALLOW_DEATH],\n                vec![0],\n                to,\n                amount,\n            ]\n            .concat(),\n            era,\n            nonce,\n            tip,\n            spec_version,\n            tx_version,\n            genesis_hash,\n            block_hash,\n        };\n\n        Ok(interim)\n    }\n\n    // Alternative to to_bytes() when using ed25519 signing scheme\n    fn to_bytes_ed25519(&self) -> Result<Vec<u8>, TransactionError> {\n        match &self.signature {\n            Some(sig) => {\n                let interim = self.to_interim()?;\n                let from = self.params.from.to_payload()?;\n\n                let stream = [\n                    vec![0x84], // version = 0x84\n                    vec![0],\n                    from,\n                    vec![0], // ed25519 = 0, sr25519 = 1, secp256k1 = 2\n                    sig.clone(),\n                    interim.era,\n                    interim.nonce,\n                    interim.tip,\n                    interim.method,\n                ]\n                .concat();\n\n                let len = stream.len() as u64;\n                let len = encode(len);\n\n                Ok([len, stream].concat())\n            }\n            None => {\n                let interim = self.to_interim()?;\n                Ok([\n                    interim.method,\n                    interim.era,\n                    interim.nonce,\n                    interim.tip,\n                    interim.spec_version,\n                    interim.tx_version,\n                    interim.genesis_hash,\n                    interim.block_hash,\n                ]\n                .concat())\n            }\n        }\n    }\n\n    // Alternative to sign() when using ed25519 signing scheme\n    pub fn sign_ed25519(&mut self, rs: Vec<u8>) -> Result<Vec<u8>, TransactionError> {\n        if rs.len() != 64 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signature length {}\",\n                rs.len(),\n            )));\n        }\n        self.signature = Some(rs);\n        self.to_bytes_ed25519()\n    }\n}\n\nimpl<N: PolkadotNetwork> Display for PolkadotTransaction<N> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", hex::encode(self.to_bytes().unwrap()))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{\n        PolkadotAddress, PolkadotFormat, PolkadotNetwork, PolkadotSecretKey, PolkadotTransaction,\n        PolkadotTransactionParameters, Westend,\n    };\n    use anychain_core::Address;\n    use anychain_core::{hex, Transaction};\n    use ed25519_dalek::{\n        hazmat::{self, ExpandedSecretKey},\n        Signature, VerifyingKey,\n    };\n    use serde_json::Value;\n    use sha2::Sha512;\n    use std::str::FromStr;\n\n    fn tx_from_str<N: PolkadotNetwork>(json: &str) -> PolkadotTransaction<N> {\n        let json = serde_json::from_str::<Value>(json).unwrap();\n\n        let from = PolkadotAddress::<N>::from_str(json[\"from\"].as_str().unwrap()).unwrap();\n\n        let to = PolkadotAddress::<N>::from_str(json[\"to\"].as_str().unwrap()).unwrap();\n\n        let amount = json[\"amount\"].as_u64().unwrap();\n        let nonce = json[\"nonce\"].as_u64().unwrap();\n        let tip = json[\"tip\"].as_u64().unwrap();\n        let block_hash = json[\"block_hash\"].as_str().unwrap().to_string();\n        let genesis_hash = json[\"genesis_hash\"].as_str().unwrap().to_string();\n        let spec_version = json[\"spec_version\"].as_u64().unwrap() as u32;\n        let tx_version = json[\"tx_version\"].as_u64().unwrap() as u32;\n\n        let params = PolkadotTransactionParameters::<N> {\n            from,\n            to,\n            amount,\n            nonce,\n            tip,\n            block_hash,\n            genesis_hash,\n            spec_version,\n            tx_version,\n        };\n\n        PolkadotTransaction::<N>::new(&params).unwrap()\n    }\n\n    #[test]\n    fn test_address_gen() {\n        let format = &PolkadotFormat::Standard;\n\n        let sk_from = [\n            228u8, 121, 108, 167, 244, 6, 57, 61, 104, 68, 229, 88, 23, 16, 212, 157, 110, 171, 36,\n            26, 232, 171, 144, 41, 109, 182, 148, 243, 20, 23, 29, 61,\n        ];\n\n        let sk_to = [\n            3, 1, 2, 5, 8, 1, 118, 203, 0, 1, 2, 1, 1, 2, 1, 1, 1, 103, 0, 0, 2, 2, 2, 2, 2, 2, 3,\n            5, 8, 13, 17, 29,\n        ];\n\n        let sk_from = libsecp256k1::SecretKey::parse_slice(&sk_from).unwrap();\n        let sk_to = libsecp256k1::SecretKey::parse_slice(&sk_to).unwrap();\n\n        let sk_from = PolkadotSecretKey::Secp256k1(sk_from);\n        let sk_to = PolkadotSecretKey::Secp256k1(sk_to);\n\n        let from = PolkadotAddress::<Westend>::from_secret_key(&sk_from, format).unwrap();\n        let to = PolkadotAddress::<Westend>::from_secret_key(&sk_to, format).unwrap();\n\n        assert_eq!(\n            \"5FnS6tYbCTAtK3QCfNnddwVR61ypLLM7APRrs98paFs7yMSY\",\n            from.to_string()\n        );\n        assert_eq!(\n            \"5DoW9HHuqSfpf55Ux5pLdJbHFWvbngeg8Ynhub9DrdtxmZeV\",\n            to.to_string()\n        );\n    }\n\n    #[test]\n    fn test_address_gen_2() {\n        let format = &PolkadotFormat::Standard;\n\n        let sk_from = [\n            228u8, 121, 108, 167, 244, 6, 57, 61, 104, 68, 229, 88, 23, 16, 212, 157, 110, 171, 36,\n            26, 232, 171, 144, 41, 109, 182, 148, 243, 20, 23, 29, 61,\n        ];\n\n        let sk_to = [\n            3, 1, 2, 5, 8, 1, 118, 203, 0, 1, 2, 1, 1, 2, 1, 1, 1, 103, 0, 0, 2, 2, 2, 2, 2, 2, 3,\n            5, 8, 13, 17, 29,\n        ];\n\n        // let sk_from = ed25519_dalek::SecretKey::from_bytes(sk_from.as_slice()).unwrap();\n        // let sk_to = ed25519_dalek::SecretKey::from_bytes(sk_to.as_slice()).unwrap();\n        let sk_from = ed25519_dalek::SecretKey::from(sk_from);\n        let sk_to = ed25519_dalek::SecretKey::from(sk_to);\n\n        let sk_from = PolkadotSecretKey::Ed25519(sk_from);\n        let sk_to = PolkadotSecretKey::Ed25519(sk_to);\n\n        let from = PolkadotAddress::<Westend>::from_secret_key(&sk_from, format).unwrap();\n        let to = PolkadotAddress::<Westend>::from_secret_key(&sk_to, format).unwrap();\n\n        assert_eq!(\n            \"5DPaKszR7KpCbvNNtGCGTfrGdeDTUNRt1UdxwXp9G6iWvdk7\",\n            from.to_string()\n        );\n        assert_eq!(\n            \"5D1NKGqfc2Q8hw53icrX74YQryjb3MMySWwFBhM71afKbdad\",\n            to.to_string()\n        );\n    }\n\n    #[test]\n    fn test_tx_gen() {\n        let tx = r#\"{\n            \"from\": \"5FnS6tYbCTAtK3QCfNnddwVR61ypLLM7APRrs98paFs7yMSY\",\n            \"to\": \"5DoW9HHuqSfpf55Ux5pLdJbHFWvbngeg8Ynhub9DrdtxmZeV\",\n            \"amount\": 1000000000000,\n            \"nonce\": 3,\n            \"tip\": 0,\n            \"block_hash\": \"e143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n            \"genesis_hash\": \"e143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n            \"spec_version\": 1005000,\n            \"tx_version\": 24\n        }\"#;\n\n        let mut tx = tx_from_str::<Westend>(tx);\n        let hash = tx.to_transaction_id().unwrap().txid;\n        let msg = libsecp256k1::Message::parse_slice(&hash).unwrap();\n\n        let sk = [\n            228u8, 121, 108, 167, 244, 6, 57, 61, 104, 68, 229, 88, 23, 16, 212, 157, 110, 171, 36,\n            26, 232, 171, 144, 41, 109, 182, 148, 243, 20, 23, 29, 61,\n        ];\n\n        let sk = libsecp256k1::SecretKey::parse_slice(&sk).unwrap();\n        let (sig, rec) = libsecp256k1::sign(&msg, &sk);\n        let sig = sig.serialize().to_vec();\n        let rec = rec.serialize();\n\n        let signed_tx = tx.sign(sig, rec).unwrap();\n        let signed_tx = hex::encode(signed_tx);\n\n        assert_eq!(\n            \"41028400a487f8cf0c11fd48eae13f819dbb06e5cb97b7103d2434897bd7cb3ea80963e502ba136449919abc037e45cb36fbeae2b1d5dde212f7cd6f9eef604833811a6ac07eba271bdbb4bfb940f6f0ab810e0afea3d0bcdce0b2a51270a2235d42d3816300000c000400004ce05abd387b560855a3d486eba6237b9a08c6e9dfe351302a5ceda90be801fe070010a5d4e8\",\n            signed_tx\n        );\n    }\n\n    #[test]\n    fn test_tx_gen_2() {\n        let tx = r#\"{\n            \"from\": \"5DPaKszR7KpCbvNNtGCGTfrGdeDTUNRt1UdxwXp9G6iWvdk7\",\n            \"to\": \"5D1NKGqfc2Q8hw53icrX74YQryjb3MMySWwFBhM71afKbdad\",\n            \"amount\": 1000000000000,\n            \"nonce\": 5,\n            \"tip\": 0,\n            \"block_hash\": \"e143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n            \"genesis_hash\": \"e143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n            \"spec_version\": 1005000,\n            \"tx_version\": 24\n        }\"#;\n\n        let mut tx = tx_from_str::<Westend>(tx);\n        let msg = tx.to_bytes_ed25519().unwrap();\n\n        let sk = [\n            228u8, 121, 108, 167, 244, 6, 57, 61, 104, 68, 229, 88, 23, 16, 212, 157, 110, 171, 36,\n            26, 232, 171, 144, 41, 109, 182, 148, 243, 20, 23, 29, 61,\n        ];\n\n        let secret = ed25519_dalek::SecretKey::from(sk);\n        let xsk: ed25519_dalek::hazmat::ExpandedSecretKey = ExpandedSecretKey::from(&secret);\n        let pk = VerifyingKey::from(&xsk);\n        let signature: Signature = hazmat::raw_sign::<Sha512>(&xsk, &msg, &pk);\n\n        // let sk = SecretKey::from_bytes(sk.as_slice()).unwrap();\n        // let pk = PublicKey::from(&sk);\n        // let xsk = ExpandedSecretKey::from_slice(&sk).unwrap();\n        // let sig = xsk.sign(&msg, &pk);\n\n        let signed_tx = tx.sign_ed25519(signature.to_bytes().to_vec()).unwrap();\n        let signed_tx = hex::encode(signed_tx);\n\n        assert_eq!(\n            \"3d0284003aa08b895131d34e7c1364ca80067f282fc6b2417b4eefcf7e2ecf7c19d7f81900aff4f335398d8584150fae80adc6dcaea686b2a5a2c9cb28a82a5a59314b7fd3ceaac142b91c949e482aec06f16202c9ea8dcd1c82a4b250cc72dfae03a6360400140004000029b0b723f2e8b89f1bcdc0cf2b3d0e624454a0cb898a46b5b59368964c5544f5070010a5d4e8\",\n            signed_tx\n        );\n    }\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/utilities/crypto.rs",
    "content": "/// Returns a 32-byte hash for given data\n#[inline]\npub fn blake2b_256(ingest: &[u8]) -> [u8; 32] {\n    let digest = blake2b_simd::Params::new()\n        .hash_length(32)\n        .to_state()\n        .update(ingest)\n        .finalize();\n\n    let mut hash = [0u8; 32];\n    hash.clone_from_slice(digest.as_bytes());\n    hash\n}\n"
  },
  {
    "path": "crates/anychain-polkadot/src/utilities/mod.rs",
    "content": "pub mod crypto;\n"
  },
  {
    "path": "crates/anychain-ripple/Cargo.toml",
    "content": "[package]\nname = \"anychain-ripple\"\ndescription = \"A Rust library for interacting with the Ripple blockchain. It provides core functionalities such as transaction signing and serialization, address generation, and network communication.\"\nversion = \"0.1.12\"\nkeywords = [\"ripple\", \"blockchain\", \"wallet\", \"transactions\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\nbase58 = { workspace = true }\nlibsecp256k1 = { workspace = true }\n\n[lints]\nworkspace = true"
  },
  {
    "path": "crates/anychain-ripple/README.md",
    "content": "anychain-ripple\n\nanychain-ripple is a Rust library that provides a unified interface for interacting with the Ripple blockchain. It is part of the anychain project, which aims to provide a consistent API for interacting with different blockchains.\nInstallation\n\nFeatures\n\n- Get balance of a Ripple address\n- Send XRP to a Ripple address\n- Get transaction history of a Ripple address\n- More features coming soon!\n\n## Installation\n\nAdd the following to your Cargo.toml file:\n```toml\n[dependencies]\nanychain-ripple = \"0.1.10\"\n```\n\nThen run cargo build to download and compile the anychain-ripple library.\n\n## Usage\n\nHere is a basic example of how to use anychain-ripple:\n```rust\n```\n\nFor more examples and detailed usage instructions, please refer to the [documentation](https://docs.rs/anychain-ripple).\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute, please follow these steps:\n\n1. Fork the repository\n2. Create a new branch for your changes\n3. Make your changes and commit them to your branch\n4. Create a pull request and describe your changes\n\nPlease make sure to follow the Rust coding guidelines and add tests for any new features or bug fixes.\n\n## License\n\nanychain-ripple is released under the MIT License. See the [LICENSE](LICENSE) file for more information. \n"
  },
  {
    "path": "crates/anychain-ripple/src/address.rs",
    "content": "use base58::{FromBase58, ToBase58};\nuse std::{fmt::Display, str::FromStr};\n\nuse crate::{RippleFormat, RipplePublicKey};\nuse anychain_core::{\n    crypto::{checksum, hash160},\n    Address, AddressError, PublicKey,\n};\n\n// fn map_gen(from: &str, to: &str) {\n//     let from = from.as_bytes();\n//     let to = to.as_bytes();\n\n//     let mut table = [-1i8; 128];\n\n//     for i in 0..58 {\n//         table[from[i] as usize] = to[i] as i8;\n//     }\n\n//     println!(\"{:?}\", table);\n// }\n\n// /// You can run this test function to generate the 2 maps below\n// #[test]\n// fn gen_map() {\n//     let ripple_alphabet: &str = \"rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz\";\n//     let bitcoin_alphabet: &str =\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\n//     map_gen(bitcoin_alphabet, ripple_alphabet);\n//     map_gen(ripple_alphabet, bitcoin_alphabet);\n// }\n\nconst RIPPLE_ALPHABET: &str = \"rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz\";\n\n/// Utility for mapping the bitcoin base58 alphabet to ripple base58 alphabet\nstatic BTC_2_XRP_BS58_MAP: [i8; 128] = [\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, 114, 112, 115, 104, 110, 97, 102, 51, 57, -1, -1, -1, -1, -1, -1, -1, 119, 66, 85, 68, 78,\n    69, 71, 72, -1, 74, 75, 76, 77, 52, -1, 80, 81, 82, 83, 84, 55, 86, 87, 88, 89, 90, -1, -1, -1,\n    -1, -1, -1, 50, 98, 99, 100, 101, 67, 103, 54, 53, 106, 107, -1, 109, 56, 111, 70, 113, 105,\n    49, 116, 117, 118, 65, 120, 121, 122, -1, -1, -1, -1, -1,\n];\n\n/// Utility for mapping the ripple base58 alphabet to bitcoin base58 alphabet\nstatic XRP_2_BTC_BS58_MAP: [i8; 128] = [\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n    -1, 115, 97, 56, 78, 105, 104, 85, 110, 57, -1, -1, -1, -1, -1, -1, -1, 119, 66, 102, 68, 70,\n    112, 71, 72, -1, 74, 75, 76, 77, 69, -1, 80, 81, 82, 83, 84, 67, 86, 87, 88, 89, 90, -1, -1,\n    -1, -1, -1, -1, 54, 98, 99, 100, 101, 55, 103, 52, 114, 106, 107, -1, 109, 53, 111, 50, 113,\n    49, 51, 116, 117, 118, 65, 120, 121, 122, -1, -1, -1, -1, -1,\n];\n\n/// Map the string in bitcoin base58 format to ripple base58 format\nfn to_xrp_bs58(s: &str) -> Result<String, AddressError> {\n    let to: Vec<u8> = s\n        .as_bytes()\n        .iter()\n        .map(|b| BTC_2_XRP_BS58_MAP[*b as usize] as u8)\n        .collect();\n\n    Ok(String::from_utf8(to)?)\n}\n\n/// Map the string in ripple base58 format to bitcoin base58 format\nfn to_btc_bs58(s: &str) -> Result<String, AddressError> {\n    let to: Vec<u8> = s\n        .as_bytes()\n        .iter()\n        .map(|b| XRP_2_BTC_BS58_MAP[*b as usize] as u8)\n        .collect();\n\n    Ok(String::from_utf8(to)?)\n}\n\n/// Represents a Ripple address\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct RippleAddress(String);\n\nimpl Address for RippleAddress {\n    type SecretKey = libsecp256k1::SecretKey;\n    type PublicKey = RipplePublicKey;\n    type Format = RippleFormat;\n\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, anychain_core::AddressError> {\n        Self::PublicKey::from_secret_key(secret_key).to_address(format)\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        _: &Self::Format,\n    ) -> Result<Self, anychain_core::AddressError> {\n        let hash = hash160(&public_key.serialize());\n        Self::from_hash160(&hash)\n    }\n}\n\nimpl FromStr for RippleAddress {\n    type Err = AddressError;\n    fn from_str(addr: &str) -> Result<Self, Self::Err> {\n        for c in addr.chars() {\n            if !RIPPLE_ALPHABET.contains(c) {\n                return Err(AddressError::InvalidAddress(\n                    \"illegal ripple address\".to_string(),\n                ));\n            }\n        }\n        let s = to_btc_bs58(addr)?;\n        let data = s.from_base58()?;\n        if data.len() != 25 {\n            return Err(AddressError::InvalidByteLength(s.len()));\n        }\n        if data[0] != 0 {\n            return Err(AddressError::Message(format!(\n                \"Invalid version byte {}\",\n                data[0]\n            )));\n        }\n\n        // Check if the payload produces the provided checksum\n        let expected_checksum = &checksum(&data[..21])[..4];\n        let provided_checksum = &data[21..];\n\n        if *expected_checksum != *provided_checksum {\n            return Err(AddressError::InvalidChecksum(\n                to_xrp_bs58(\n                    &[data[..21].to_vec(), expected_checksum.to_vec()]\n                        .concat()\n                        .to_base58(),\n                )?,\n                addr.to_string(),\n            ));\n        }\n\n        Ok(RippleAddress(addr.to_string()))\n    }\n}\n\nimpl Display for RippleAddress {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\nimpl RippleAddress {\n    pub fn to_hash160(&self) -> Result<[u8; 20], AddressError> {\n        let _ = Self::from_str(&self.0)?;\n        let btc_bs58 = to_btc_bs58(&self.0)?;\n        let bytes = btc_bs58.from_base58()?;\n\n        let mut ret = [0u8; 20];\n\n        // strip version bytes and checksum\n        ret.copy_from_slice(&bytes[1..21]);\n\n        Ok(ret)\n    }\n\n    pub fn from_hash160(hash: &[u8]) -> Result<Self, AddressError> {\n        if hash.len() != 20 {\n            return Err(AddressError::Message(\"Illegal hash160 length\".to_string()));\n        }\n        let mut data = [0u8; 25];\n        data[1..21].copy_from_slice(hash);\n        let checksum = &checksum(&data[..21])[..4];\n        data[21..].copy_from_slice(checksum);\n\n        Ok(RippleAddress(to_xrp_bs58(&data.to_base58())?))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::str::FromStr;\n\n    use super::{Address, RippleAddress, RippleFormat};\n\n    #[test]\n    fn test_from_secret_key() {\n        let sk = [\n            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,\n            1, 1, 1,\n        ];\n\n        let sk = libsecp256k1::SecretKey::parse_slice(&sk).unwrap();\n\n        let addr = RippleAddress::from_secret_key(&sk, &RippleFormat::Standard).unwrap();\n\n        println!(\"addr = {}\", addr);\n    }\n\n    #[test]\n    fn test_from_str() {\n        let addrs = [\n            \"rJ6HEKFe8T2mkZQqzuGbFEmE8SKtadxd8n\",\n            \"rBbvWBK4pmibqtwNMWhPMTgJUGfaNh71Yk\",\n        ];\n\n        addrs.iter().for_each(|&addr| {\n            let addr = RippleAddress::from_str(addr);\n            assert!(addr.is_ok());\n            dbg!(\"address = {}\", addr.unwrap());\n        });\n    }\n\n    #[test]\n    fn test_from_str_invalid_address() {\n        let addr_str = \"HanzōFe8T2mkZQqzuGbFEmE8SKtadxd8n\";\n        let addr = RippleAddress::from_str(addr_str);\n        assert!(addr.is_err());\n        matches!(addr.unwrap_err(), super::AddressError::InvalidAddress(_));\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ripple/src/format.rs",
    "content": "use anychain_core::Format;\n\nuse core::fmt;\n\n/// Represents the format of a Ripple address\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum RippleFormat {\n    Standard,\n}\n\nimpl Format for RippleFormat {}\n\nimpl fmt::Display for RippleFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"Standard\")\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ripple/src/lib.rs",
    "content": "pub mod address;\npub use self::address::*;\n\npub mod format;\npub use self::format::*;\n\npub mod public_key;\npub use self::public_key::*;\n\npub mod transaction;\npub use self::transaction::*;\n"
  },
  {
    "path": "crates/anychain-ripple/src/public_key.rs",
    "content": "use crate::{RippleAddress, RippleFormat};\nuse anychain_core::{hex, Address, AddressError, PublicKey, PublicKeyError};\nuse core::{fmt, str::FromStr};\n\n/// Represents a Ripple public key\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct RipplePublicKey {\n    /// The secp256k1 public key\n    public_key: libsecp256k1::PublicKey,\n    /// If true, the public key is serialized in compressed form\n    compressed: bool,\n}\n\nimpl PublicKey for RipplePublicKey {\n    type SecretKey = libsecp256k1::SecretKey;\n    type Address = RippleAddress;\n    type Format = RippleFormat;\n\n    /// Returns a Ripple public key given an secp256k1 secret key.\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        Self {\n            public_key: libsecp256k1::PublicKey::from_secret_key(secret_key),\n            compressed: true,\n        }\n    }\n\n    /// Returns a Ripple address corresponding to this Ripple public key.\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError> {\n        Self::Address::from_public_key(self, format)\n    }\n}\n\nimpl RipplePublicKey {\n    /// Returns a Ripple public key given an secp256k1 public key.\n    pub fn from_secp256k1_public_key(\n        public_key: libsecp256k1::PublicKey,\n        compressed: bool,\n    ) -> Self {\n        Self {\n            public_key,\n            compressed,\n        }\n    }\n\n    /// Returns the secp256k1 public key of this Ripple public key.\n    pub fn to_secp256k1_public_key(&self) -> libsecp256k1::PublicKey {\n        self.public_key\n    }\n\n    /// Serialize the Ripple public key as a vector of u8\n    pub fn serialize(&self) -> Vec<u8> {\n        match self.compressed {\n            true => self.public_key.serialize_compressed().to_vec(),\n            false => self.public_key.serialize().to_vec(),\n        }\n    }\n\n    /// Returns `true` if the public key is in compressed form.\n    pub fn is_compressed(&self) -> bool {\n        self.compressed\n    }\n}\n\nimpl FromStr for RipplePublicKey {\n    type Err = PublicKeyError;\n\n    fn from_str(public_key: &str) -> Result<Self, Self::Err> {\n        let compressed = public_key.len() == 66;\n        let p = hex::decode(public_key)\n            .map_err(|error| PublicKeyError::Crate(\"hex\", format!(\"{:?}\", error)))?;\n        let public_key = libsecp256k1::PublicKey::parse_slice(&p, None)\n            .map_err(|error| PublicKeyError::Crate(\"libsecp256k1\", format!(\"{:?}\", error)))?;\n\n        Ok(Self {\n            public_key,\n            compressed,\n        })\n    }\n}\n\nimpl fmt::Display for RipplePublicKey {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        if self.compressed {\n            for s in &self.public_key.serialize_compressed()[..] {\n                write!(f, \"{:02x}\", s)?;\n            }\n        } else {\n            for s in &self.public_key.serialize()[..] {\n                write!(f, \"{:02x}\", s)?;\n            }\n        }\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "crates/anychain-ripple/src/transaction.rs",
    "content": "use std::cmp::{Ord, Ordering};\nuse std::{fmt, str::FromStr};\n\nuse crate::{RippleAddress, RippleFormat, RipplePublicKey};\nuse anychain_core::{\n    crypto::{hash160, sha512},\n    hex,\n    no_std::io::Read,\n    Transaction, TransactionError, TransactionId,\n};\nuse libsecp256k1::Signature;\n\n#[derive(Clone, Debug, Hash, Eq, PartialEq)]\npub struct RippleTransactionParameters {\n    pub destination: [u8; 20],\n    pub fee: u32,\n    pub sequence: u32,\n    pub destination_tag: u32,\n    pub amount: u64,\n    pub memos: Vec<String>,\n    pub public_key: [u8; 33],\n}\n\n#[derive(Clone, Debug, Hash, Eq, PartialEq)]\npub struct RippleTransaction {\n    pub params: RippleTransactionParameters,\n    pub signature: Option<Vec<u8>>,\n}\n\nimpl Transaction for RippleTransaction {\n    type Address = RippleAddress;\n    type Format = RippleFormat;\n    type PublicKey = RipplePublicKey;\n    type TransactionParameters = RippleTransactionParameters;\n    type TransactionId = RippleTransactionId;\n\n    fn new(parameters: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            params: parameters.clone(),\n            signature: None,\n        })\n    }\n\n    fn sign(&mut self, rs: Vec<u8>, _recid: u8) -> Result<Vec<u8>, TransactionError> {\n        if rs.len() != 64 {\n            return Err(TransactionError::Message(format!(\n                \"Invalid signature length {}\",\n                rs.len(),\n            )));\n        }\n        self.signature = Some(rs);\n        self.to_bytes()\n    }\n\n    fn from_bytes(stream: &[u8]) -> Result<Self, TransactionError> {\n        // Before we deserialize the stream, we should postfix the\n        // stream with a mark of ending for object type\n        let mut stream = stream.to_vec();\n        stream.extend(serialize_type(SerializedTypeID::Object, 1)?);\n\n        // Deserialize the stream to a SerializedType object, which\n        // is then converted to a Ripple Transaction\n        Self::from_st(&SerializedType::deserialize(\n            &mut stream.as_slice(),\n            SerializedTypeID::Object,\n            0,\n        )?)\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        self.to_st()?.serialize()\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        match &self.signature {\n            // compute the txid of the signed tx\n            Some(_) => {\n                // prefix the tx stream with \"TXN\\0\"\n                let mut stream = vec![b'T', b'X', b'N', 0];\n                stream.extend(self.to_bytes()?);\n                // we take the first half of the sha512 hash as txid\n                let txid = sha512(&stream)[..32].to_vec();\n                Ok(RippleTransactionId { txid })\n            }\n            // compute the raw tx's digest for signing\n            None => {\n                // preifx the tx stream with \"STX\\0\"\n                let mut stream = vec![b'S', b'T', b'X', 0];\n                stream.extend(self.to_bytes()?);\n                // we take the first half of the sha512 hash as digest for signing\n                let digest = sha512(&stream)[..32].to_vec();\n                Ok(RippleTransactionId { txid: digest })\n            }\n        }\n    }\n}\n\nimpl FromStr for RippleTransaction {\n    type Err = TransactionError;\n\n    fn from_str(tx: &str) -> Result<Self, Self::Err> {\n        Self::from_bytes(&hex::decode(tx)?)\n    }\n}\n\nimpl fmt::Display for RippleTransaction {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", hex::encode(self.to_bytes().unwrap()))\n    }\n}\n\nimpl RippleTransaction {\n    fn to_st(&self) -> Result<SerializedType, TransactionError> {\n        let mut account_id = [0u8; 20];\n        account_id.copy_from_slice(&hash160(&self.params.public_key));\n\n        // It is a transaction of type 'payment'\n        let tx_type = SerializedType::Uint16 {\n            field_value: 2,\n            value: 0,\n        };\n\n        let account = SerializedType::Account {\n            field_value: 1,\n            account_id,\n        };\n\n        let dest = SerializedType::Account {\n            field_value: 3,\n            account_id: self.params.destination,\n        };\n\n        let fee = SerializedType::Amount {\n            field_value: 8,\n            value: self.params.fee as u64 | 0x4000000000000000,\n        };\n\n        let sequence = SerializedType::Uint32 {\n            field_value: 4,\n            value: self.params.sequence,\n        };\n\n        let dest_tag = SerializedType::Uint32 {\n            field_value: 14,\n            value: self.params.destination_tag,\n        };\n\n        let amount = SerializedType::Amount {\n            field_value: 1,\n            value: self.params.amount | 0x4000000000000000,\n        };\n\n        let public_key = SerializedType::Blob {\n            field_value: 3,\n            buffer: self.params.public_key.to_vec(),\n        };\n\n        let mut st = SerializedType::Object {\n            field_value: 0,\n            members: vec![\n                tx_type, account, dest, fee, sequence, dest_tag, amount, public_key,\n            ],\n        };\n\n        let memos: Vec<SerializedType> = self\n            .params\n            .memos\n            .iter()\n            .map(|memo| {\n                let memo_type = SerializedType::Blob {\n                    field_value: 12,\n                    buffer: \"payment\".as_bytes().to_vec(),\n                };\n                let memo = SerializedType::Blob {\n                    field_value: 13,\n                    buffer: memo.as_bytes().to_vec(),\n                };\n                SerializedType::Object {\n                    field_value: 10,\n                    members: vec![memo_type, memo],\n                }\n            })\n            .collect();\n\n        if !memos.is_empty() {\n            st.add(SerializedType::Array {\n                field_value: 9,\n                elems: memos,\n            })?\n        }\n\n        if let Some(sig) = &self.signature {\n            let sig = Signature::parse_standard_slice(sig)\n                .map_err(|error| TransactionError::Crate(\"libsecp256k1\", format!(\"{:?}\", error)))?\n                .serialize_der()\n                .as_ref()\n                .to_vec();\n            let sig = SerializedType::Blob {\n                field_value: 4,\n                buffer: sig,\n            };\n            st.add(sig)?;\n        }\n\n        // Ascendingly sort the object's members by SerializedTypeID. If SerializedTypeIDs\n        // are equal, ascendingly sort them by field value\n        st.sort()?;\n\n        Ok(st)\n    }\n\n    fn from_st(st: &SerializedType) -> Result<Self, TransactionError> {\n        if let SerializedType::Object { members, .. } = st {\n            let mut source = [0u8; 20];\n            let mut destination = [0u8; 20];\n            let mut fee = 0;\n            let mut sequence = 0;\n            let mut destination_tag = 0;\n            let mut amount = 0;\n            let mut memos = vec![];\n            let mut public_key = [0u8; 33];\n            let mut signature: Option<Vec<u8>> = None;\n\n            for mem in members {\n                match mem {\n                    SerializedType::Account {\n                        field_value,\n                        account_id,\n                        ..\n                    } => {\n                        if *field_value == 3 {\n                            destination = *account_id;\n                        } else if *field_value == 1 {\n                            // Store source account (field 1) for later hash160(public_key) verification.\n                            source = *account_id;\n                        } else {\n                            return Err(TransactionError::Message(format!(\n                                \"Invalid field value {} for field serialized type 'account'\",\n                                *field_value,\n                            )));\n                        }\n                    }\n                    SerializedType::Amount {\n                        field_value, value, ..\n                    } => {\n                        if *field_value == 1 {\n                            amount = *value & !0x4000000000000000;\n                        } else if *field_value == 8 {\n                            fee = *value as u32;\n                        } else {\n                            return Err(TransactionError::Message(format!(\n                                \"Invalid field value {} for serialized type 'amount'\",\n                                *field_value,\n                            )));\n                        }\n                    }\n                    SerializedType::Array { field_value, elems } => {\n                        if *field_value == 9 {\n                            for elem in elems {\n                                if let SerializedType::Object {\n                                    field_value,\n                                    members,\n                                } = elem\n                                {\n                                    if *field_value == 10 {\n                                        for mem in members {\n                                            if let SerializedType::Blob {\n                                                field_value,\n                                                buffer,\n                                            } = mem\n                                            {\n                                                if *field_value == 12 {\n                                                    // we skip the deserialization of memo_type\n                                                } else if *field_value == 13 {\n                                                    match String::from_utf8(buffer.clone()) {\n                                                        Ok(memo) => memos.push(memo),\n                                                        Err(_) => {\n                                                            return Err(TransactionError::Message(\n                                                                \"Invalid memo\".to_string(),\n                                                            ))\n                                                        }\n                                                    }\n                                                } else {\n                                                    return Err(TransactionError::Message(format!(\n                                                        \"Invalid field value {} for serialized type\",\n                                                        *field_value,\n                                                    )));\n                                                }\n                                            }\n                                        }\n                                    } else {\n                                        return Err(TransactionError::Message(format!(\n                                            \"Invalid field value {} for serialized type 'object'\",\n                                            *field_value,\n                                        )));\n                                    }\n                                } else {\n                                    return Err(TransactionError::Message(\n                                        \"None object array elements not allowed\".to_string(),\n                                    ));\n                                }\n                            }\n                        } else {\n                            return Err(TransactionError::Message(format!(\n                                \"Invalid field value {} for serialized type 'array'\",\n                                *field_value,\n                            )));\n                        }\n                    }\n                    SerializedType::Blob {\n                        field_value,\n                        buffer,\n                    } => {\n                        if *field_value == 3 {\n                            if buffer.len() != 33 {\n                                return Err(TransactionError::Message(format!(\n                                    \"Invalid public key length {}\",\n                                    buffer.len(),\n                                )));\n                            }\n                            public_key.copy_from_slice(buffer);\n                        } else if *field_value == 4 {\n                            if !(70..=72).contains(&buffer.len()) {\n                                return Err(TransactionError::Message(format!(\n                                    \"Invalid signature length {}\",\n                                    buffer.len(),\n                                )));\n                            }\n                            let sig = Signature::parse_der(buffer)\n                                .map_err(|error| {\n                                    TransactionError::Crate(\"libsecp256k1\", format!(\"{:?}\", error))\n                                })?\n                                .serialize()\n                                .to_vec();\n                            signature = Some(sig);\n                        } else {\n                            return Err(TransactionError::Message(format!(\n                                \"Invalid field value {} for serialized type 'blob'\",\n                                *field_value,\n                            )));\n                        }\n                    }\n                    SerializedType::Uint32 { field_value, value } => {\n                        if *field_value == 4 {\n                            sequence = *value;\n                        } else if *field_value == 14 {\n                            destination_tag = *value;\n                        } else {\n                            return Err(TransactionError::Message(format!(\n                                \"Invalid field value {} for serialized type 'integer'\",\n                                *field_value,\n                            )));\n                        }\n                    }\n                    SerializedType::Uint16 { .. } => {}\n                    SerializedType::Object { .. } => {\n                        return Err(TransactionError::Message(\n                            \"Serialized type 'object' not allowd in first layer deserialization\"\n                                .to_string(),\n                        ))\n                    }\n                }\n            }\n\n            // Enforce that Account(source) matches the signer public key hash.\n            let derived_source = hash160(&public_key);\n            if source != derived_source.as_slice() {\n                return Err(TransactionError::Message(format!(\n                    \"Invalid source account: expected {}, got {}\",\n                    hex::encode(derived_source),\n                    hex::encode(source),\n                )));\n            }\n\n            let mut tx = RippleTransaction::new(&RippleTransactionParameters {\n                destination,\n                fee,\n                sequence,\n                destination_tag,\n                amount,\n                memos,\n                public_key,\n            })?;\n\n            if signature.is_some() {\n                tx.signature = signature;\n            }\n\n            Ok(tx)\n        } else {\n            Err(TransactionError::Message(\n                \"Deserialization of none object serialized type not allowed for Ripple transaction\"\n                    .to_string(),\n            ))\n        }\n    }\n\n    pub fn set_public_key(&mut self, pk: Vec<u8>) -> Result<(), TransactionError> {\n        self.params.public_key = pk.try_into().unwrap();\n        Ok(())\n    }\n}\n\n#[derive(Eq, PartialEq, Hash, Debug, Clone)]\npub struct RippleTransactionId {\n    pub txid: Vec<u8>,\n}\n\nimpl TransactionId for RippleTransactionId {}\n\nimpl fmt::Display for RippleTransactionId {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", hex::encode(&self.txid).to_uppercase())\n    }\n}\n\n#[derive(PartialEq)]\nenum SerializedTypeID {\n    Uint16 = 1,\n    Uint32 = 2,\n    Amount = 6,\n    VL = 7,\n    Account = 8,\n    // 9-13 are reserved\n    Object = 14,\n    Array = 15,\n}\n\nimpl SerializedTypeID {\n    fn from_u8(b: u8) -> Result<Self, TransactionError> {\n        match b {\n            1 => Ok(Self::Uint16),\n            2 => Ok(Self::Uint32),\n            6 => Ok(Self::Amount),\n            7 => Ok(Self::VL),\n            8 => Ok(Self::Account),\n            14 => Ok(Self::Object),\n            15 => Ok(Self::Array),\n            _ => Err(TransactionError::Message(format!(\n                \"Unsupported serialized type id {}\",\n                b,\n            ))),\n        }\n    }\n}\n\nimpl fmt::Display for SerializedTypeID {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::Uint16 => write!(f, \"Uint16\"),\n            Self::Uint32 => write!(f, \"Uint32\"),\n            Self::Amount => write!(f, \"Amount\"),\n            Self::VL => write!(f, \"Blob\"),\n            Self::Account => write!(f, \"Account\"),\n            Self::Object => write!(f, \"Object\"),\n            Self::Array => write!(f, \"Array\"),\n        }\n    }\n}\n\n#[derive(Clone, Debug, Eq)]\nenum SerializedType {\n    Account {\n        field_value: u32,\n        account_id: [u8; 20],\n    },\n\n    Amount {\n        field_value: u32,\n        value: u64,\n    },\n\n    Uint16 {\n        field_value: u32,\n        value: u16,\n    },\n\n    Uint32 {\n        field_value: u32,\n        value: u32,\n    },\n\n    Blob {\n        field_value: u32,\n        buffer: Vec<u8>,\n    },\n\n    Array {\n        field_value: u32,\n        elems: Vec<SerializedType>,\n    },\n\n    Object {\n        field_value: u32,\n        members: Vec<SerializedType>,\n    },\n}\n\nimpl PartialEq for SerializedType {\n    fn eq(&self, other: &Self) -> bool {\n        let typ0 = self.typ() as u32;\n        let val0 = self.val();\n        let typ1 = other.typ() as u32;\n        let val1 = other.val();\n\n        typ0 == typ1 && val0 == val1\n    }\n}\n\nimpl Ord for SerializedType {\n    fn cmp(&self, other: &Self) -> Ordering {\n        let typ0 = self.typ() as u32;\n        let val0 = self.val();\n        let typ1 = other.typ() as u32;\n        let val1 = other.val();\n\n        if typ0 < typ1 {\n            Ordering::Less\n        } else if typ0 > typ1 {\n            Ordering::Greater\n        } else if val0 < val1 {\n            Ordering::Less\n        } else if val0 > val1 {\n            Ordering::Greater\n        } else {\n            Ordering::Equal\n        }\n    }\n}\n\nimpl PartialOrd for SerializedType {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nfn serialize_len(mut len: u32) -> Result<Vec<u8>, TransactionError> {\n    if len <= 192 {\n        Ok(vec![len as u8])\n    } else if len <= 12480 {\n        len -= 193;\n        let b0 = 193 + (len >> 8) as u8;\n        let b1 = (len & 0xff) as u8;\n        Ok(vec![b0, b1])\n    } else if len <= 918744 {\n        len -= 12481;\n        let b0 = 241 + (len >> 16) as u8;\n        let b1 = ((len >> 8) & 0xff) as u8;\n        let b2 = (len & 0xff) as u8;\n        Ok(vec![b0, b1, b2])\n    } else {\n        Err(TransactionError::Message(\n            \"Maximum length exceeded\".to_string(),\n        ))\n    }\n}\n\nfn deserialize_len(stream: &mut &[u8]) -> Result<u32, TransactionError> {\n    let mut b = [0u8; 1];\n    let _ = stream.read(&mut b)?;\n\n    match b[0] {\n        (..=192) => Ok(b[0] as u32),\n        (193..=240) => {\n            let mut buf = [0u8; 1];\n            let _ = stream.read(&mut buf)?;\n            let mut len = [0u8; 4];\n            len[2] = b[0] - 193;\n            len[3] = buf[0];\n            Ok(u32::from_be_bytes(len))\n        }\n        (241..) => {\n            let mut buf = [0u8; 2];\n            let _ = stream.read(&mut buf)?;\n            let mut len = [0u8; 4];\n            len[1] = b[0] - 241;\n            len[2] = buf[0];\n            len[3] = buf[1];\n            Ok(u32::from_be_bytes(len))\n        }\n    }\n}\n\nfn serialize_type(typ: SerializedTypeID, val: u32) -> Result<Vec<u8>, TransactionError> {\n    let typ = typ as u32;\n\n    if !(..256).contains(&typ) || !(..256).contains(&val) {\n        return Err(TransactionError::Message(\"Number out of range\".to_string()));\n    }\n\n    if typ < 16 {\n        if val < 16 {\n            // common type, common val\n            Ok(vec![((typ << 4) | val) as u8])\n        } else {\n            // common type, uncommon val\n            let b0 = (typ << 4) as u8;\n            let b1 = val as u8;\n            Ok(vec![b0, b1])\n        }\n    } else if val < 16 {\n        // uncommon type, common val\n        let b0 = val as u8;\n        let b1 = typ as u8;\n        Ok(vec![b0, b1])\n    } else {\n        // uncommon type, uncommon val\n        let b0 = 0;\n        let b1 = typ as u8;\n        let b2 = val as u8;\n        Ok(vec![b0, b1, b2])\n    }\n}\n\nfn deserialize_type(stream: &mut &[u8]) -> Result<(u8, u8), TransactionError> {\n    let mut b = [0u8; 1];\n    let _ = stream.read(&mut b)?;\n\n    match (b[0] & 0xf0 == 0, b[0] & 0x0f == 0) {\n        // both higher and lower 4 bits are zero\n        (true, true) => {\n            let mut buf = [0u8; 2];\n            let _ = stream.read(&mut buf)?;\n            Ok((buf[0], buf[1]))\n        }\n        // only higher 4 bits are zero\n        (true, false) => {\n            let mut buf = [0u8; 1];\n            let _ = stream.read(&mut buf)?;\n            Ok((buf[0], b[0]))\n        }\n        // only lower 4 bits are zero\n        (false, true) => {\n            let mut buf = [0u8; 1];\n            let _ = stream.read(&mut buf)?;\n            Ok((b[0] >> 4, buf[0]))\n        }\n        // neither higher 4 bits nor lower 4 bits are zero\n        (false, false) => Ok(((b[0] & 0xf0) >> 4, b[0] & 0x0f)),\n    }\n}\n\nimpl SerializedType {\n    fn typ(&self) -> SerializedTypeID {\n        match self {\n            Self::Account { .. } => SerializedTypeID::Account,\n            Self::Amount { .. } => SerializedTypeID::Amount,\n            Self::Uint16 { .. } => SerializedTypeID::Uint16,\n            Self::Uint32 { .. } => SerializedTypeID::Uint32,\n            Self::Blob { .. } => SerializedTypeID::VL,\n            Self::Array { .. } => SerializedTypeID::Array,\n            Self::Object { .. } => SerializedTypeID::Object,\n        }\n    }\n\n    fn val(&self) -> u32 {\n        match self {\n            Self::Account { field_value, .. } => *field_value,\n            Self::Amount { field_value, .. } => *field_value,\n            Self::Uint16 { field_value, .. } => *field_value,\n            Self::Uint32 { field_value, .. } => *field_value,\n            Self::Blob { field_value, .. } => *field_value,\n            Self::Array { field_value, .. } => *field_value,\n            Self::Object { field_value, .. } => *field_value,\n        }\n    }\n\n    fn serialize_type(&self) -> Result<Vec<u8>, TransactionError> {\n        serialize_type(self.typ(), self.val())\n    }\n\n    fn serialize(&self) -> Result<Vec<u8>, TransactionError> {\n        match self {\n            Self::Amount { value, .. } => Ok(value.to_be_bytes().to_vec()),\n            Self::Uint16 { value, .. } => Ok(value.to_be_bytes().to_vec()),\n            Self::Uint32 { value, .. } => Ok(value.to_be_bytes().to_vec()),\n            Self::Account { account_id, .. } => {\n                let mut stream = serialize_len(account_id.len() as u32)?;\n                stream.extend(account_id.to_vec());\n                Ok(stream)\n            }\n            Self::Blob { buffer, .. } => {\n                let mut stream = serialize_len(buffer.len() as u32)?;\n                stream.extend(buffer);\n                Ok(stream)\n            }\n            Self::Array { elems, .. } => {\n                let mut stream = vec![];\n                for elem in elems {\n                    stream.extend(elem.serialize_type()?);\n                    stream.extend(elem.serialize()?);\n                    stream.extend(serialize_type(SerializedTypeID::Object, 1)?);\n                }\n                Ok(stream)\n            }\n            Self::Object { members, .. } => {\n                let mut stream = vec![];\n                for mem in members {\n                    stream.extend(mem.serialize_type()?);\n                    stream.extend(mem.serialize()?);\n                    match mem.typ() {\n                        SerializedTypeID::Array | SerializedTypeID::Object => {\n                            stream.extend(serialize_type(mem.typ(), 1)?)\n                        }\n                        _ => {}\n                    }\n                }\n                Ok(stream)\n            }\n        }\n    }\n\n    fn deserialize(\n        stream: &mut &[u8],\n        typ: SerializedTypeID,\n        field_value: u32,\n    ) -> Result<Self, TransactionError> {\n        match typ {\n            SerializedTypeID::Account => {\n                // Firstly we extract the length of the account id\n                let len = deserialize_len(stream)?;\n                if len != 20 {\n                    return Err(TransactionError::Message(format!(\n                        \"Invalid account length {}\",\n                        len,\n                    )));\n                }\n\n                // Then we extract the account id\n                let mut account_id = [0u8; 20];\n                let _ = stream.read(&mut account_id)?;\n\n                // Return the ST\n                Ok(SerializedType::Account {\n                    field_value,\n                    account_id,\n                })\n            }\n            SerializedTypeID::Amount => {\n                let mut value = [0u8; 8];\n                let _ = stream.read(&mut value)?;\n                let value = u64::from_be_bytes(value);\n\n                // Return the ST\n                Ok(SerializedType::Amount { field_value, value })\n            }\n            SerializedTypeID::Uint16 => {\n                let mut value = [0u8; 2];\n                let _ = stream.read(&mut value)?;\n                let value = u16::from_be_bytes(value);\n\n                // Return the ST\n                Ok(SerializedType::Uint16 { field_value, value })\n            }\n            SerializedTypeID::Uint32 => {\n                let mut value = [0u8; 4];\n                let _ = stream.read(&mut value)?;\n                let value = u32::from_be_bytes(value);\n\n                // Return the ST\n                Ok(SerializedType::Uint32 { field_value, value })\n            }\n            SerializedTypeID::VL => {\n                // Firstly we extract the length of the blob\n                let len = deserialize_len(stream)?;\n\n                // Then we extract the blob according to its length\n                let mut buffer = vec![0u8; len as usize];\n                let _ = stream.read(&mut buffer)?;\n\n                // Return the ST\n                Ok(SerializedType::Blob {\n                    field_value,\n                    buffer,\n                })\n            }\n            SerializedTypeID::Array => {\n                let mut array = SerializedType::Array {\n                    field_value,\n                    elems: vec![],\n                };\n                loop {\n                    let (typ, fv) = deserialize_type(stream)?;\n                    let typ = SerializedTypeID::from_u8(typ)?;\n\n                    // we have reached the end of the array\n                    if typ == SerializedTypeID::Array && fv == 1 {\n                        break;\n                    }\n\n                    let st = Self::deserialize(stream, typ, fv as u32)?;\n                    array.add(st)?;\n                }\n                Ok(array)\n            }\n            SerializedTypeID::Object => {\n                let mut obj = SerializedType::Object {\n                    field_value,\n                    members: vec![],\n                };\n                loop {\n                    let (typ, fv) = deserialize_type(stream)?;\n                    let typ = SerializedTypeID::from_u8(typ)?;\n\n                    // we have reached the end of the object\n                    if typ == SerializedTypeID::Object && fv == 1 {\n                        break;\n                    }\n\n                    let st = Self::deserialize(stream, typ, fv as u32)?;\n                    obj.add(st)?;\n                }\n                Ok(obj)\n            }\n        }\n    }\n\n    fn add(&mut self, st: SerializedType) -> Result<(), TransactionError> {\n        match self {\n            SerializedType::Object { members, .. } => {\n                members.push(st);\n                Ok(())\n            }\n            SerializedType::Array { elems, .. } => {\n                elems.push(st);\n                Ok(())\n            }\n            _ => Err(TransactionError::Message(\n                \"Adding fields to neither an object or an array\".to_string(),\n            )),\n        }\n    }\n\n    fn sort(&mut self) -> Result<(), TransactionError> {\n        match self {\n            SerializedType::Object { members, .. } => {\n                members.sort();\n                Ok(())\n            }\n            _ => Err(TransactionError::Message(\n                \"Sorting non-object ST\".to_string(),\n            )),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{RippleFormat, RipplePublicKey};\n\n    use super::{RippleTransaction, RippleTransactionParameters};\n    use anychain_core::{PublicKey, Transaction, TransactionError};\n    use libsecp256k1::{self, Message, SecretKey};\n    use std::str::FromStr;\n\n    #[test]\n    fn test_tx_gen() {\n        let sk_from = [\n            1u8, 1, 1, 1, 1, 117, 1, 1, 1, 1, 1, 1, 118, 1, 1, 92, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1,\n            1, 1, 1, 1, 1,\n        ];\n\n        let sk_to = [\n            1u8, 1, 8, 1, 33, 17, 1, 1, 1, 99, 1, 1, 18, 1, 1, 2, 1, 1, 1, 1, 1, 37, 1, 1, 101, 7,\n            1, 1, 1, 0, 1, 2,\n        ];\n\n        let sk_from = SecretKey::parse(&sk_from).unwrap();\n        let sk_to = SecretKey::parse(&sk_to).unwrap();\n\n        let pk_from = RipplePublicKey::from_secret_key(&sk_from);\n        let pk_to = RipplePublicKey::from_secret_key(&sk_to);\n\n        let from = pk_from.to_address(&RippleFormat::Standard).unwrap();\n        let to = pk_to.to_address(&RippleFormat::Standard).unwrap();\n\n        assert_eq!(from.to_string(), \"rDZr8KX1A5Ws1DyT7jZd8TPonchDzDGfX2\");\n        assert_eq!(to.to_string(), \"rpnZmX9CW1QoP2uPRgB5mupp9exFyZmuKM\");\n\n        let pk_from = pk_from.serialize();\n\n        let params = RippleTransactionParameters {\n            destination: to.to_hash160().unwrap(),\n            fee: 500000,\n            sequence: 39998031,\n            destination_tag: 50,\n            amount: 100000000,\n            memos: vec![\"guai\".to_string()],\n            public_key: pk_from.try_into().unwrap(),\n        };\n\n        let mut tx = RippleTransaction::new(&params).unwrap();\n\n        let txid = tx.to_transaction_id().unwrap().txid;\n        let msg = Message::parse_slice(&txid).unwrap();\n        let sig = libsecp256k1::sign(&msg, &sk_from).0.serialize().to_vec();\n\n        let tx = tx.sign(sig, 0).unwrap();\n        let tx = RippleTransaction::from_bytes(&tx).unwrap();\n\n        assert_eq!(\"120000240262524f2e00000032614000000005f5e10068400000000007a120732102b722a70170451981d269bb52db986c46cd5e46d82628f7770fbc2962a60c5e997446304402200adf9912caaf33ef357031cd46a49c026e5780ca198b1d32dfd252f38fdde572022056b953c08d31b0d68ed6e9ffb810fd8deeefbad21d08f82527bbfa3ec6de0330811489af78f1b802fca6dfaa06c9b6807d2288a9c3be83140bd52483842334109d52935847c4bc188a04998ff9ea7c077061796d656e747d0467756169e1f1\", tx.to_string());\n        // println!(\"tx = {:?}\", tx);\n        // println!(\"tx = {}\", tx);\n    }\n\n    #[test]\n    fn test_tx_from_str() {\n        let tx = \"120000240262524f2e00000032614000000005f5e10068400000000007a120732102b722a70170451981d269bb52db986c46cd5e46d82628f7770fbc2962a60c5e997446304402200adf9912caaf33ef357031cd46a49c026e5780ca198b1d32dfd252f38fdde572022056b953c08d31b0d68ed6e9ffb810fd8deeefbad21d08f82527bbfa3ec6de0330811489af78f1b802fca6dfaa06c9b6807d2288a9c3be83140bd52483842334109d52935847c4bc188a04998ff9ea7c077061796d656e747d0467756169e1f1\";\n        let tx = RippleTransaction::from_str(tx).unwrap();\n\n        assert_eq!(\n            tx.params.destination,\n            [\n                11, 213, 36, 131, 132, 35, 52, 16, 157, 82, 147, 88, 71, 196, 188, 24, 138, 4, 153,\n                143\n            ]\n        );\n        assert_eq!(tx.params.fee, 500000);\n        assert_eq!(tx.params.sequence, 39998031);\n        assert_eq!(tx.params.destination_tag, 50);\n        assert_eq!(tx.params.amount, 100000000);\n        assert_eq!(tx.params.memos.len(), 1);\n        assert_eq!(\n            tx.params.public_key,\n            [\n                2, 183, 34, 167, 1, 112, 69, 25, 129, 210, 105, 187, 82, 219, 152, 108, 70, 205,\n                94, 70, 216, 38, 40, 247, 119, 15, 188, 41, 98, 166, 12, 94, 153\n            ]\n        );\n        let expected_signagure: Vec<u8> = [\n            10, 223, 153, 18, 202, 175, 51, 239, 53, 112, 49, 205, 70, 164, 156, 2, 110, 87, 128,\n            202, 25, 139, 29, 50, 223, 210, 82, 243, 143, 221, 229, 114, 86, 185, 83, 192, 141, 49,\n            176, 214, 142, 214, 233, 255, 184, 16, 253, 141, 238, 239, 186, 210, 29, 8, 248, 37,\n            39, 187, 250, 62, 198, 222, 3, 48,\n        ]\n        .into();\n        assert_eq!(tx.signature, Some(expected_signagure));\n    }\n\n    #[test]\n    fn test_tx_from_str_rejects_tampered_source_account() {\n        let tx = \"120000240262524f2e00000032614000000005f5e10068400000000007a120732102b722a70170451981d269bb52db986c46cd5e46d82628f7770fbc2962a60c5e997446304402200adf9912caaf33ef357031cd46a49c026e5780ca198b1d32dfd252f38fdde572022056b953c08d31b0d68ed6e9ffb810fd8deeefbad21d08f82527bbfa3ec6de0330811489af78f1b802fca6dfaa06c9b6807d2288a9c3be83140bd52483842334109d52935847c4bc188a04998ff9ea7c077061796d656e747d0467756169e1f1\";\n\n        // Tamper source account (field 0x81 + len 0x14 + 20-byte payload) but keep SigningPubKey unchanged.\n        let tampered = tx.replacen(\n            \"811489af78f1b802fca6dfaa06c9b6807d2288a9c3b\",\n            \"811400af78f1b802fca6dfaa06c9b6807d2288a9c3b\",\n            1,\n        );\n\n        let err = RippleTransaction::from_str(&tampered).unwrap_err();\n        assert!(matches!(\n            err,\n            TransactionError::Message(msg) if msg.contains(\"Invalid source account\")\n        ));\n    }\n}\n"
  },
  {
    "path": "crates/anychain-tron/Cargo.toml",
    "content": "[package]\nname = \"anychain-tron\"\ndescription = \"A Rust library for Tron-focused cryptocurrency wallets, enabling seamless transactions on the Tron blockchain\"\nversion = \"0.2.14\"\nkeywords = [\"tron\", \"blockchain\", \"wallet\", \"transactions\"]\ncategories = [\"cryptography::cryptocurrencies\"]\n\n# Workspace inherited keys\nauthors = { workspace = true }\nedition = { workspace = true }\nhomepage = { workspace = true }\nlicense = { workspace = true }\nrepository = { workspace = true }\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../anychain-core\", version = \"0.1.8\" }\nserde = { workspace = true }\nsha3 = { workspace = true }\nsha2 = { workspace = true }\nhex = { workspace = true }\nbase58 = { workspace = true }\nprotobuf = { workspace = true }\nchrono = { workspace = true }\nethabi = { workspace = true }\nlibsecp256k1 = { workspace = true }\nethereum-types = { workspace = true }\n\n[lints]\nworkspace = true\n"
  },
  {
    "path": "crates/anychain-tron/README.md",
    "content": "# anychain-tron\n\nanychain-tron is a Rust library that provides a simple and unified interface for interacting with the Tron blockchain. It is designed to be easy to use and integrate into your Rust projects, while maintaining compatibility with the anychain-bitcoin library.\n\n## Features\n\n- Unified API for Tron blockchain operations\n- Support for mainnet and testnet networks\n- Account management (create, import, export)\n- Transaction building and signing\n- Querying blockchain data (balances, transactions, etc.)\n- Support for smart contracts and TRC10/TRC20 tokens\n\n## Installation\n\nAdd the following to your Cargo.toml file:\n```toml\n[dependencies]\nanychain-tron = \"0.2.8\"\n```\n\nThen, run cargo build to download and compile the library.\n\n## Usage\n\nHere's a simple example of how to create a new Tron account and query its balance:\n```rust\n\n```\n\nFor more examples and detailed usage instructions, please refer to the [documentation](https://docs.rs/anychain-tron).\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute, please follow these steps:\n\n1. Fork the repository\n2. Create a new branch for your changes\n3. Make your changes and commit them to your branch\n4. Submit a pull request with a description of your changes\n\nPlease make sure to write tests for your changes and follow the Rust coding style.\n\n## License\n\nanychain-tron is released under the MIT License. See the [LICENSE](LICENSE) file for more information. "
  },
  {
    "path": "crates/anychain-tron/src/abi.rs",
    "content": "use crate::TronAddress;\nuse anychain_core::utilities::crypto::keccak256;\nuse ethabi::{encode, Token};\nuse ethereum_types::U256;\nuse std::str::FromStr;\n\n/// Represents a parameter that's fed to a\n/// function of an on-chain contract\npub struct Param {\n    pub type_: String,\n    pub value: Token,\n}\n\nimpl From<&TronAddress> for Param {\n    fn from(address: &TronAddress) -> Self {\n        Param {\n            type_: \"address\".to_string(),\n            value: address.to_token(),\n        }\n    }\n}\n\nimpl From<U256> for Param {\n    fn from(amount: U256) -> Self {\n        Param {\n            type_: \"uint256\".to_string(),\n            value: Token::Uint(amount),\n        }\n    }\n}\n\npub fn contract_function_call(function_name: &str, params: &[Param]) -> Vec<u8> {\n    let mut data = Vec::<u8>::new();\n\n    let param_types = params\n        .iter()\n        .map(|param| param.type_.as_str())\n        .collect::<Vec<&str>>()\n        .join(\",\");\n\n    let function_selector = format!(\"{}({})\", function_name, param_types);\n\n    data.extend_from_slice(&keccak256(function_selector.as_bytes())[..4]);\n\n    let tokens = params\n        .iter()\n        .map(|param| param.value.clone())\n        .collect::<Vec<Token>>();\n\n    data.extend_from_slice(&encode(&tokens));\n\n    data\n}\n\npub fn trc20_transfer(address: &str, amount: &str) -> Vec<u8> {\n    let address = TronAddress::from_str(address).unwrap();\n    let amount = U256::from_dec_str(amount).unwrap();\n\n    contract_function_call(\"transfer\", &[Param::from(&address), Param::from(amount)])\n}\n\npub fn trc20_approve(address: &str, amount: &str) -> Vec<u8> {\n    let address = TronAddress::from_str(address).unwrap();\n    let amount = U256::from_dec_str(amount).unwrap();\n\n    contract_function_call(\"approve\", &[Param::from(&address), Param::from(amount)])\n}\n\n#[cfg(test)]\nmod test_mod {\n    use std::str::FromStr;\n\n    use super::{contract_function_call, Param};\n    use crate::TronAddress;\n    use ethabi::ethereum_types::U256;\n\n    #[test]\n    fn test_contract_function_call() {\n        let address = TronAddress::from_str(\"TG7jQ7eGsns6nmQNfcKNgZKyKBFkx7CvXr\").unwrap();\n        let amount = U256::from_dec_str(\"20000000000000000000\").unwrap();\n\n        let call_data =\n            contract_function_call(\"transfer\", &[Param::from(&address), Param::from(amount)]);\n\n        assert_eq!(\n            \"a9059cbb000000000000000000000041436d74fc1577266b7\\\n             290b85801145d9c5287e19400000000000000000000000000\\\n             0000000000000000000001158e460913d00000\",\n            hex::encode(call_data)\n        )\n    }\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/address.rs",
    "content": "use crate::{TronFormat, TronPublicKey};\nuse anychain_core::{Address, AddressError, PublicKey};\nuse base58::{FromBase58, ToBase58};\nuse ethabi::Token;\nuse hex::FromHex;\nuse serde::Serialize;\nuse sha2::{Digest, Sha256};\nuse sha3::Keccak256;\nuse std::fmt;\nuse std::str::FromStr;\n\nconst ADDRESS_TYPE_PREFIX: u8 = 0x41;\n\n#[derive(Clone, PartialEq, Eq, Serialize, Hash)]\npub struct TronAddress([u8; 21]);\n\nimpl Address for TronAddress {\n    type SecretKey = libsecp256k1::SecretKey;\n    type Format = TronFormat;\n    type PublicKey = TronPublicKey;\n\n    fn from_secret_key(\n        secret_key: &Self::SecretKey,\n        format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        Self::from_public_key(&TronPublicKey::from_secret_key(secret_key), format)\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey,\n        _format: &Self::Format,\n    ) -> Result<Self, AddressError> {\n        let mut hasher = Keccak256::new();\n\n        hasher.update(&public_key.to_secp256k1_public_key().serialize()[1..]);\n        let digest = hasher.finalize();\n        let mut raw = [ADDRESS_TYPE_PREFIX; 21];\n        raw[1..21].copy_from_slice(&digest[digest.len() - 20..]);\n\n        Ok(TronAddress(raw))\n    }\n}\n\nimpl TronAddress {\n    pub fn to_hex(&self) -> String {\n        hex::encode_upper(self.0)\n    }\n\n    pub fn as_bytes(&self) -> &[u8] {\n        &self.0\n    }\n\n    pub fn from_bytes(raw: &[u8]) -> Result<Self, AddressError> {\n        if raw.len() != 21 {\n            return Err(AddressError::InvalidAddress(\"Invalid length\".to_string()));\n        }\n\n        let mut address = [0u8; 21];\n        address.copy_from_slice(raw);\n        Ok(TronAddress(address))\n\n        // assert!(raw.len() == 21);\n        // unsafe { std::mem::transmute(&raw[0]) }\n    }\n\n    pub fn to_base58(&self) -> String {\n        self.to_string()\n    }\n\n    pub fn to_token(&self) -> Token {\n        let mut bytes = [0u8; 11].to_vec();\n        bytes.extend_from_slice(self.as_bytes());\n        Token::FixedBytes(bytes)\n    }\n}\n\nimpl Default for TronAddress {\n    fn default() -> Self {\n        TronAddress([\n            0x41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        ])\n    }\n}\n\nimpl fmt::Display for TronAddress {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        b58encode_check(self.0).fmt(f)\n    }\n}\n\nimpl ::std::fmt::Debug for TronAddress {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        f.debug_tuple(\"Address\").field(&self.to_string()).finish()\n    }\n}\n\nimpl TryFrom<&[u8]> for TronAddress {\n    type Error = AddressError;\n\n    fn try_from(value: &[u8]) -> Result<Self, AddressError> {\n        if value.len() != 21 {\n            Err(AddressError::InvalidAddress(\"Invalid length\".to_string()))\n        } else if value[0] != ADDRESS_TYPE_PREFIX {\n            Err(AddressError::Message(format!(\n                \"Invalid version byte {}\",\n                value[0]\n            )))\n        } else {\n            let mut raw = [0u8; 21];\n            raw[..21].copy_from_slice(value);\n            Ok(TronAddress(raw))\n        }\n    }\n}\n\nimpl TryFrom<Vec<u8>> for TronAddress {\n    type Error = AddressError;\n\n    fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {\n        Self::try_from(&value[..])\n    }\n}\n\nimpl TryFrom<&Vec<u8>> for TronAddress {\n    type Error = AddressError;\n\n    fn try_from(value: &Vec<u8>) -> Result<Self, Self::Error> {\n        Self::try_from(&value[..])\n    }\n}\n\nimpl TryFrom<&str> for TronAddress {\n    type Error = AddressError;\n\n    fn try_from(value: &str) -> Result<Self, Self::Error> {\n        TronAddress::from_str(value)\n    }\n}\n\nimpl FromHex for TronAddress {\n    type Error = AddressError;\n\n    fn from_hex<T: AsRef<[u8]>>(hex: T) -> Result<Self, Self::Error> {\n        TronAddress::try_from(hex.as_ref())\n    }\n}\n\nimpl FromStr for TronAddress {\n    type Err = AddressError;\n\n    fn from_str(s: &str) -> Result<Self, AddressError>\n    where\n        Self: Sized,\n    {\n        if s.len() == 34 {\n            b58decode_check(s).and_then(TronAddress::try_from)\n        } else if s.len() == 42 && s[..2] == hex::encode([ADDRESS_TYPE_PREFIX]) {\n            Vec::from_hex(s)\n                .map_err(|_| AddressError::InvalidAddress(\"InvalidAddress\".to_string()))\n                .and_then(TronAddress::try_from)\n        } else if s.len() == 44 && (s.starts_with(\"0x\") || s.starts_with(\"0X\")) {\n            Vec::from_hex(&s.as_bytes()[2..])\n                .map_err(|_| AddressError::InvalidAddress(\"InvalidAddress\".to_string()))\n                .and_then(TronAddress::try_from)\n        } else if s == \"_\" || s == \"0x0\" || s == \"/0\" {\n            \"410000000000000000000000000000000000000000\".parse()\n        } else {\n            // eprintln!(\"len={} prefix={:x}\", s.len(), s.as_bytes()[0]);\n            Err(AddressError::InvalidAddress(\"Invalid length\".to_string()))\n        }\n    }\n}\n\n// NOTE: AsRef<[u8]> implies ToHex\nimpl AsRef<[u8]> for TronAddress {\n    fn as_ref(&self) -> &[u8] {\n        &self.0\n    }\n}\n\n/// Base58check encode.\npub fn b58encode_check<T: AsRef<[u8]>>(raw: T) -> String {\n    let mut hasher = Sha256::new();\n    hasher.update(raw.as_ref());\n    let digest1 = hasher.finalize();\n\n    let mut hasher = Sha256::new();\n    hasher.update(digest1);\n    let digest = hasher.finalize();\n\n    let mut raw = raw.as_ref().to_owned();\n    raw.extend(&digest[..4]);\n    raw.to_base58()\n}\n\n/// Base58check decode.\npub fn b58decode_check(s: &str) -> Result<Vec<u8>, AddressError> {\n    let mut result = s\n        .from_base58()\n        .map_err(|_| AddressError::InvalidAddress(\"\".to_string()))?;\n\n    let check = result.split_off(result.len() - 4);\n\n    let mut hasher = Sha256::new();\n    hasher.update(&result);\n    let digest1 = hasher.finalize();\n\n    let mut hasher = Sha256::new();\n    hasher.update(digest1);\n    let digest = hasher.finalize();\n\n    if check != digest[..4] {\n        Err(AddressError::InvalidAddress(\"\".to_string()))\n    } else {\n        Ok(result)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use hex::ToHex;\n\n    #[test]\n    fn test_address() {\n        let addr = TronAddress([\n            65, 150, 163, 186, 206, 90, 218, 207, 99, 126, 183, 204, 121, 213, 120, 127, 66, 71,\n            218, 75, 190,\n        ]);\n\n        assert_eq!(\"TPhiVyQZ5xyvVK2KS2LTke8YvXJU5wxnbN\", format!(\"{:}\", addr));\n        assert_eq!(\n            addr,\n            \"TPhiVyQZ5xyvVK2KS2LTke8YvXJU5wxnbN\"\n                .parse()\n                .expect(\"parse error\")\n        );\n        assert_eq!(\n            addr,\n            \"4196a3bace5adacf637eb7cc79d5787f4247da4bbe\"\n                .parse()\n                .expect(\"parse error\")\n        );\n\n        assert_eq!(\n            addr.as_bytes().encode_hex::<String>(),\n            \"4196a3bace5adacf637eb7cc79d5787f4247da4bbe\"\n        )\n    }\n\n    #[test]\n    fn test_address_from_public() {\n        let public = TronPublicKey::from_str(\"56f19ba7de92264d94f9b6600ec05c16c0b25a064e2ee1cf5bf0dd9661d04515c99c3a6b42b2c574232a5b951bf57cf706bbfd36377b406f9313772f65612cd0\").unwrap();\n\n        let addr = TronAddress::from_public_key(&public, &TronFormat::Standard).unwrap();\n        assert_eq!(addr.to_string(), \"TQHAvs2ZFTbsd93ycTfw1Wuf1e4WsPZWCp\");\n    }\n\n    #[test]\n    fn test_address_from_bytes() {\n        let bytes = [\n            65, 150, 163, 186, 206, 90, 218, 207, 99, 126, 183, 204, 121, 213, 120, 127, 66, 71,\n            218, 75, 190,\n        ];\n        let addr = TronAddress::from_bytes(&bytes);\n        assert!(addr.is_ok());\n\n        let malicious_bytes: [u8; 22] = [\n            0xde, 0xad, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        ];\n        let addr = TronAddress::from_bytes(&malicious_bytes);\n        assert!(addr.is_err());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/format.rs",
    "content": "use anychain_core::Format;\n\nuse core::fmt;\nuse serde::Serialize;\n\n/// Represents the format of a Ethereum address\n#[derive(Serialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub enum TronFormat {\n    Standard,\n}\n\nimpl Format for TronFormat {}\n\nimpl fmt::Display for TronFormat {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"TronFormat\")\n    }\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/lib.rs",
    "content": "pub mod address;\npub use address::*;\n\npub mod format;\npub use format::*;\n\npub mod public_key;\npub use public_key::*;\n\npub mod protocol;\n\npub mod transaction;\npub use transaction::*;\npub mod abi;\npub mod trx;\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/Discover.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/Discover.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.Endpoint)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Endpoint {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Endpoint.address)\n    pub address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Endpoint.port)\n    pub port: i32,\n    // @@protoc_insertion_point(field:protocol.Endpoint.nodeId)\n    pub nodeId: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Endpoint.addressIpv6)\n    pub addressIpv6: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Endpoint.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Endpoint {\n    fn default() -> &'a Endpoint {\n        <Endpoint as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Endpoint {\n    pub fn new() -> Endpoint {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &Endpoint| { &m.address },\n            |m: &mut Endpoint| { &mut m.address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"port\",\n            |m: &Endpoint| { &m.port },\n            |m: &mut Endpoint| { &mut m.port },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"nodeId\",\n            |m: &Endpoint| { &m.nodeId },\n            |m: &mut Endpoint| { &mut m.nodeId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"addressIpv6\",\n            |m: &Endpoint| { &m.addressIpv6 },\n            |m: &mut Endpoint| { &mut m.addressIpv6 },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Endpoint>(\n            \"Endpoint\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Endpoint {\n    const NAME: &'static str = \"Endpoint\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.address = is.read_bytes()?;\n                },\n                16 => {\n                    self.port = is.read_int32()?;\n                },\n                26 => {\n                    self.nodeId = is.read_bytes()?;\n                },\n                34 => {\n                    self.addressIpv6 = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.address);\n        }\n        if self.port != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.port);\n        }\n        if !self.nodeId.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.nodeId);\n        }\n        if !self.addressIpv6.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.addressIpv6);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.address.is_empty() {\n            os.write_bytes(1, &self.address)?;\n        }\n        if self.port != 0 {\n            os.write_int32(2, self.port)?;\n        }\n        if !self.nodeId.is_empty() {\n            os.write_bytes(3, &self.nodeId)?;\n        }\n        if !self.addressIpv6.is_empty() {\n            os.write_bytes(4, &self.addressIpv6)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Endpoint {\n        Endpoint::new()\n    }\n\n    fn clear(&mut self) {\n        self.address.clear();\n        self.port = 0;\n        self.nodeId.clear();\n        self.addressIpv6.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Endpoint {\n        static instance: Endpoint = Endpoint {\n            address: ::std::vec::Vec::new(),\n            port: 0,\n            nodeId: ::std::vec::Vec::new(),\n            addressIpv6: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Endpoint {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Endpoint\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Endpoint {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Endpoint {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.PingMessage)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct PingMessage {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.PingMessage.from)\n    pub from: ::protobuf::MessageField<Endpoint>,\n    // @@protoc_insertion_point(field:protocol.PingMessage.to)\n    pub to: ::protobuf::MessageField<Endpoint>,\n    // @@protoc_insertion_point(field:protocol.PingMessage.version)\n    pub version: i32,\n    // @@protoc_insertion_point(field:protocol.PingMessage.timestamp)\n    pub timestamp: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.PingMessage.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a PingMessage {\n    fn default() -> &'a PingMessage {\n        <PingMessage as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl PingMessage {\n    pub fn new() -> PingMessage {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Endpoint>(\n            \"from\",\n            |m: &PingMessage| { &m.from },\n            |m: &mut PingMessage| { &mut m.from },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Endpoint>(\n            \"to\",\n            |m: &PingMessage| { &m.to },\n            |m: &mut PingMessage| { &mut m.to },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"version\",\n            |m: &PingMessage| { &m.version },\n            |m: &mut PingMessage| { &mut m.version },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &PingMessage| { &m.timestamp },\n            |m: &mut PingMessage| { &mut m.timestamp },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<PingMessage>(\n            \"PingMessage\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for PingMessage {\n    const NAME: &'static str = \"PingMessage\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.from)?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.to)?;\n                },\n                24 => {\n                    self.version = is.read_int32()?;\n                },\n                32 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.from.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.to.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.version != 0 {\n            my_size += ::protobuf::rt::int32_size(3, self.version);\n        }\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.timestamp);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.from.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if let Some(v) = self.to.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        if self.version != 0 {\n            os.write_int32(3, self.version)?;\n        }\n        if self.timestamp != 0 {\n            os.write_int64(4, self.timestamp)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> PingMessage {\n        PingMessage::new()\n    }\n\n    fn clear(&mut self) {\n        self.from.clear();\n        self.to.clear();\n        self.version = 0;\n        self.timestamp = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static PingMessage {\n        static instance: PingMessage = PingMessage {\n            from: ::protobuf::MessageField::none(),\n            to: ::protobuf::MessageField::none(),\n            version: 0,\n            timestamp: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for PingMessage {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"PingMessage\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for PingMessage {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for PingMessage {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.PongMessage)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct PongMessage {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.PongMessage.from)\n    pub from: ::protobuf::MessageField<Endpoint>,\n    // @@protoc_insertion_point(field:protocol.PongMessage.echo)\n    pub echo: i32,\n    // @@protoc_insertion_point(field:protocol.PongMessage.timestamp)\n    pub timestamp: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.PongMessage.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a PongMessage {\n    fn default() -> &'a PongMessage {\n        <PongMessage as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl PongMessage {\n    pub fn new() -> PongMessage {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Endpoint>(\n            \"from\",\n            |m: &PongMessage| { &m.from },\n            |m: &mut PongMessage| { &mut m.from },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"echo\",\n            |m: &PongMessage| { &m.echo },\n            |m: &mut PongMessage| { &mut m.echo },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &PongMessage| { &m.timestamp },\n            |m: &mut PongMessage| { &mut m.timestamp },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<PongMessage>(\n            \"PongMessage\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for PongMessage {\n    const NAME: &'static str = \"PongMessage\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.from)?;\n                },\n                16 => {\n                    self.echo = is.read_int32()?;\n                },\n                24 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.from.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.echo != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.echo);\n        }\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.timestamp);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.from.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if self.echo != 0 {\n            os.write_int32(2, self.echo)?;\n        }\n        if self.timestamp != 0 {\n            os.write_int64(3, self.timestamp)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> PongMessage {\n        PongMessage::new()\n    }\n\n    fn clear(&mut self) {\n        self.from.clear();\n        self.echo = 0;\n        self.timestamp = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static PongMessage {\n        static instance: PongMessage = PongMessage {\n            from: ::protobuf::MessageField::none(),\n            echo: 0,\n            timestamp: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for PongMessage {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"PongMessage\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for PongMessage {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for PongMessage {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.FindNeighbours)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct FindNeighbours {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.FindNeighbours.from)\n    pub from: ::protobuf::MessageField<Endpoint>,\n    // @@protoc_insertion_point(field:protocol.FindNeighbours.targetId)\n    pub targetId: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.FindNeighbours.timestamp)\n    pub timestamp: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.FindNeighbours.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a FindNeighbours {\n    fn default() -> &'a FindNeighbours {\n        <FindNeighbours as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl FindNeighbours {\n    pub fn new() -> FindNeighbours {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Endpoint>(\n            \"from\",\n            |m: &FindNeighbours| { &m.from },\n            |m: &mut FindNeighbours| { &mut m.from },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"targetId\",\n            |m: &FindNeighbours| { &m.targetId },\n            |m: &mut FindNeighbours| { &mut m.targetId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &FindNeighbours| { &m.timestamp },\n            |m: &mut FindNeighbours| { &mut m.timestamp },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<FindNeighbours>(\n            \"FindNeighbours\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for FindNeighbours {\n    const NAME: &'static str = \"FindNeighbours\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.from)?;\n                },\n                18 => {\n                    self.targetId = is.read_bytes()?;\n                },\n                24 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.from.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.targetId.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.targetId);\n        }\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.timestamp);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.from.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if !self.targetId.is_empty() {\n            os.write_bytes(2, &self.targetId)?;\n        }\n        if self.timestamp != 0 {\n            os.write_int64(3, self.timestamp)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> FindNeighbours {\n        FindNeighbours::new()\n    }\n\n    fn clear(&mut self) {\n        self.from.clear();\n        self.targetId.clear();\n        self.timestamp = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static FindNeighbours {\n        static instance: FindNeighbours = FindNeighbours {\n            from: ::protobuf::MessageField::none(),\n            targetId: ::std::vec::Vec::new(),\n            timestamp: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for FindNeighbours {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"FindNeighbours\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for FindNeighbours {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for FindNeighbours {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.Neighbours)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Neighbours {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Neighbours.from)\n    pub from: ::protobuf::MessageField<Endpoint>,\n    // @@protoc_insertion_point(field:protocol.Neighbours.neighbours)\n    pub neighbours: ::std::vec::Vec<Endpoint>,\n    // @@protoc_insertion_point(field:protocol.Neighbours.timestamp)\n    pub timestamp: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Neighbours.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Neighbours {\n    fn default() -> &'a Neighbours {\n        <Neighbours as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Neighbours {\n    pub fn new() -> Neighbours {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Endpoint>(\n            \"from\",\n            |m: &Neighbours| { &m.from },\n            |m: &mut Neighbours| { &mut m.from },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"neighbours\",\n            |m: &Neighbours| { &m.neighbours },\n            |m: &mut Neighbours| { &mut m.neighbours },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &Neighbours| { &m.timestamp },\n            |m: &mut Neighbours| { &mut m.timestamp },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Neighbours>(\n            \"Neighbours\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Neighbours {\n    const NAME: &'static str = \"Neighbours\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.from)?;\n                },\n                18 => {\n                    self.neighbours.push(is.read_message()?);\n                },\n                24 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.from.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.neighbours {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.timestamp);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.from.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        for v in &self.neighbours {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        };\n        if self.timestamp != 0 {\n            os.write_int64(3, self.timestamp)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Neighbours {\n        Neighbours::new()\n    }\n\n    fn clear(&mut self) {\n        self.from.clear();\n        self.neighbours.clear();\n        self.timestamp = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Neighbours {\n        static instance: Neighbours = Neighbours {\n            from: ::protobuf::MessageField::none(),\n            neighbours: ::std::vec::Vec::new(),\n            timestamp: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Neighbours {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Neighbours\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Neighbours {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Neighbours {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.BackupMessage)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct BackupMessage {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.BackupMessage.flag)\n    pub flag: bool,\n    // @@protoc_insertion_point(field:protocol.BackupMessage.priority)\n    pub priority: i32,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.BackupMessage.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a BackupMessage {\n    fn default() -> &'a BackupMessage {\n        <BackupMessage as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl BackupMessage {\n    pub fn new() -> BackupMessage {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"flag\",\n            |m: &BackupMessage| { &m.flag },\n            |m: &mut BackupMessage| { &mut m.flag },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"priority\",\n            |m: &BackupMessage| { &m.priority },\n            |m: &mut BackupMessage| { &mut m.priority },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BackupMessage>(\n            \"BackupMessage\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for BackupMessage {\n    const NAME: &'static str = \"BackupMessage\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.flag = is.read_bool()?;\n                },\n                16 => {\n                    self.priority = is.read_int32()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.flag != false {\n            my_size += 1 + 1;\n        }\n        if self.priority != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.priority);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.flag != false {\n            os.write_bool(1, self.flag)?;\n        }\n        if self.priority != 0 {\n            os.write_int32(2, self.priority)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> BackupMessage {\n        BackupMessage::new()\n    }\n\n    fn clear(&mut self) {\n        self.flag = false;\n        self.priority = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static BackupMessage {\n        static instance: BackupMessage = BackupMessage {\n            flag: false,\n            priority: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for BackupMessage {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"BackupMessage\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for BackupMessage {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for BackupMessage {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n\\x13core/Discover.proto\\x12\\x08protocol\\\"r\\n\\x08Endpoint\\x12\\x18\\n\\x07\\\n    address\\x18\\x01\\x20\\x01(\\x0cR\\x07address\\x12\\x12\\n\\x04port\\x18\\x02\\x20\\\n    \\x01(\\x05R\\x04port\\x12\\x16\\n\\x06nodeId\\x18\\x03\\x20\\x01(\\x0cR\\x06nodeId\\\n    \\x12\\x20\\n\\x0baddressIpv6\\x18\\x04\\x20\\x01(\\x0cR\\x0baddressIpv6\\\"\\x91\\x01\\\n    \\n\\x0bPingMessage\\x12&\\n\\x04from\\x18\\x01\\x20\\x01(\\x0b2\\x12.protocol.Endp\\\n    ointR\\x04from\\x12\\\"\\n\\x02to\\x18\\x02\\x20\\x01(\\x0b2\\x12.protocol.EndpointR\\\n    \\x02to\\x12\\x18\\n\\x07version\\x18\\x03\\x20\\x01(\\x05R\\x07version\\x12\\x1c\\n\\t\\\n    timestamp\\x18\\x04\\x20\\x01(\\x03R\\ttimestamp\\\"g\\n\\x0bPongMessage\\x12&\\n\\\n    \\x04from\\x18\\x01\\x20\\x01(\\x0b2\\x12.protocol.EndpointR\\x04from\\x12\\x12\\n\\\n    \\x04echo\\x18\\x02\\x20\\x01(\\x05R\\x04echo\\x12\\x1c\\n\\ttimestamp\\x18\\x03\\x20\\\n    \\x01(\\x03R\\ttimestamp\\\"r\\n\\x0eFindNeighbours\\x12&\\n\\x04from\\x18\\x01\\x20\\\n    \\x01(\\x0b2\\x12.protocol.EndpointR\\x04from\\x12\\x1a\\n\\x08targetId\\x18\\x02\\\n    \\x20\\x01(\\x0cR\\x08targetId\\x12\\x1c\\n\\ttimestamp\\x18\\x03\\x20\\x01(\\x03R\\tt\\\n    imestamp\\\"\\x86\\x01\\n\\nNeighbours\\x12&\\n\\x04from\\x18\\x01\\x20\\x01(\\x0b2\\\n    \\x12.protocol.EndpointR\\x04from\\x122\\n\\nneighbours\\x18\\x02\\x20\\x03(\\x0b2\\\n    \\x12.protocol.EndpointR\\nneighbours\\x12\\x1c\\n\\ttimestamp\\x18\\x03\\x20\\x01\\\n    (\\x03R\\ttimestamp\\\"?\\n\\rBackupMessage\\x12\\x12\\n\\x04flag\\x18\\x01\\x20\\x01(\\\n    \\x08R\\x04flag\\x12\\x1a\\n\\x08priority\\x18\\x02\\x20\\x01(\\x05R\\x08priorityBF\\\n    \\n\\x0forg.tron.protosB\\x08DiscoverZ)github.com/tronprotocol/grpc-gateway\\\n    /coreJ\\x81\\x0b\\n\\x06\\x12\\x04\\0\\0,\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\\n    \\x08\\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x05\\0(\\nH\\n\\x02\\\n    \\x08\\x01\\x12\\x03\\x05\\0(\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\\n    \\x20that\\x20generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\\n    \\x06\\0)\\n=\\n\\x02\\x08\\x08\\x12\\x03\\x06\\0)\\\"2Specify\\x20the\\x20class\\x20nam\\\n    e\\x20of\\x20the\\x20generated\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\\n    \\x07\\0@\\n\\t\\n\\x02\\x08\\x0b\\x12\\x03\\x07\\0@\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\t\\0\\x0e\\\n    \\x01\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\t\\x08\\x10\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\\n    \\x03\\n\\x02\\x14\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\n\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\0\\x01\\x12\\x03\\n\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\n\\\n    \\x12\\x13\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\x0b\\x02\\x11\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x01\\x05\\x12\\x03\\x0b\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\\n    \\x0b\\x08\\x0c\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\x0b\\x0f\\x10\\n\\x0b\\n\\\n    \\x04\\x04\\0\\x02\\x02\\x12\\x03\\x0c\\x02\\x13\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x05\\x12\\\n    \\x03\\x0c\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\x0c\\x08\\x0e\\n\\x0c\\\n    \\n\\x05\\x04\\0\\x02\\x02\\x03\\x12\\x03\\x0c\\x11\\x12\\n\\x0b\\n\\x04\\x04\\0\\x02\\x03\\\n    \\x12\\x03\\r\\x02\\x18\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x05\\x12\\x03\\r\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\0\\x02\\x03\\x01\\x12\\x03\\r\\x08\\x13\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x03\\\n    \\x12\\x03\\r\\x16\\x17\\n\\n\\n\\x02\\x04\\x01\\x12\\x04\\x10\\0\\x15\\x01\\n\\n\\n\\x03\\x04\\\n    \\x01\\x01\\x12\\x03\\x10\\x08\\x13\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x11\\x02\\\n    \\x14\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x06\\x12\\x03\\x11\\x02\\n\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\0\\x01\\x12\\x03\\x11\\x0b\\x0f\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x11\\\n    \\x12\\x13\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x01\\x12\\x03\\x12\\x02\\x12\\n\\x0c\\n\\x05\\x04\\\n    \\x01\\x02\\x01\\x06\\x12\\x03\\x12\\x02\\n\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\\n    \\x03\\x12\\x0b\\r\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\x12\\x10\\x11\\n\\x0b\\\n    \\n\\x04\\x04\\x01\\x02\\x02\\x12\\x03\\x13\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\\n    \\x05\\x12\\x03\\x13\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x01\\x12\\x03\\x13\\x08\\\n    \\x0f\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x03\\x12\\x03\\x13\\x12\\x13\\n\\x0b\\n\\x04\\x04\\\n    \\x01\\x02\\x03\\x12\\x03\\x14\\x02\\x16\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x03\\x05\\x12\\x03\\\n    \\x14\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x03\\x01\\x12\\x03\\x14\\x08\\x11\\n\\x0c\\n\\\n    \\x05\\x04\\x01\\x02\\x03\\x03\\x12\\x03\\x14\\x14\\x15\\n\\n\\n\\x02\\x04\\x02\\x12\\x04\\\n    \\x17\\0\\x1b\\x01\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\x17\\x08\\x13\\n\\x0b\\n\\x04\\x04\\\n    \\x02\\x02\\0\\x12\\x03\\x18\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x06\\x12\\x03\\x18\\\n    \\x02\\n\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\x18\\x0b\\x0f\\n\\x0c\\n\\x05\\x04\\\n    \\x02\\x02\\0\\x03\\x12\\x03\\x18\\x12\\x13\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x01\\x12\\x03\\\n    \\x19\\x02\\x11\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\x12\\x03\\x19\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03\\x19\\x08\\x0c\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\\n    \\x03\\x12\\x03\\x19\\x0f\\x10\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x02\\x12\\x03\\x1a\\x02\\x16\\\n    \\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x05\\x12\\x03\\x1a\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\\n    \\x02\\x02\\x01\\x12\\x03\\x1a\\x08\\x11\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x03\\x12\\x03\\\n    \\x1a\\x14\\x15\\n\\n\\n\\x02\\x04\\x03\\x12\\x04\\x1d\\0!\\x01\\n\\n\\n\\x03\\x04\\x03\\x01\\\n    \\x12\\x03\\x1d\\x08\\x16\\n\\x0b\\n\\x04\\x04\\x03\\x02\\0\\x12\\x03\\x1e\\x02\\x14\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\0\\x06\\x12\\x03\\x1e\\x02\\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x01\\\n    \\x12\\x03\\x1e\\x0b\\x0f\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\x03\\x1e\\x12\\x13\\n\\\n    \\x0b\\n\\x04\\x04\\x03\\x02\\x01\\x12\\x03\\x1f\\x02\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x01\\x05\\x12\\x03\\x1f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x03\\x1f\\\n    \\x08\\x10\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x03\\x12\\x03\\x1f\\x13\\x14\\n\\x0b\\n\\x04\\\n    \\x04\\x03\\x02\\x02\\x12\\x03\\x20\\x02\\x16\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x05\\x12\\\n    \\x03\\x20\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x01\\x12\\x03\\x20\\x08\\x11\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x03\\x12\\x03\\x20\\x14\\x15\\n\\n\\n\\x02\\x04\\x04\\x12\\\n    \\x04#\\0'\\x01\\n\\n\\n\\x03\\x04\\x04\\x01\\x12\\x03#\\x08\\x12\\n\\x0b\\n\\x04\\x04\\x04\\\n    \\x02\\0\\x12\\x03$\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x06\\x12\\x03$\\x02\\n\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\0\\x01\\x12\\x03$\\x0b\\x0f\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\\n    \\x03\\x12\\x03$\\x12\\x13\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x01\\x12\\x03%\\x02#\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x01\\x04\\x12\\x03%\\x02\\n\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x06\\\n    \\x12\\x03%\\x0b\\x13\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x01\\x12\\x03%\\x14\\x1e\\n\\x0c\\\n    \\n\\x05\\x04\\x04\\x02\\x01\\x03\\x12\\x03%!\\\"\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x02\\x12\\\n    \\x03&\\x02\\x16\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\x05\\x12\\x03&\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x02\\x01\\x12\\x03&\\x08\\x11\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\\n    \\x03\\x12\\x03&\\x14\\x15\\n\\n\\n\\x02\\x04\\x05\\x12\\x04)\\0,\\x01\\n\\n\\n\\x03\\x04\\\n    \\x05\\x01\\x12\\x03)\\x08\\x15\\n\\x0b\\n\\x04\\x04\\x05\\x02\\0\\x12\\x03*\\x02\\x10\\n\\\n    \\x0c\\n\\x05\\x04\\x05\\x02\\0\\x05\\x12\\x03*\\x02\\x06\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\\n    \\x01\\x12\\x03*\\x07\\x0b\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x03\\x12\\x03*\\x0e\\x0f\\n\\\n    \\x0b\\n\\x04\\x04\\x05\\x02\\x01\\x12\\x03+\\x02\\x15\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\\n    \\x05\\x12\\x03+\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\x01\\x12\\x03+\\x08\\x10\\n\\\n    \\x0c\\n\\x05\\x04\\x05\\x02\\x01\\x03\\x12\\x03+\\x13\\x14b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(6);\n            messages.push(Endpoint::generated_message_descriptor_data());\n            messages.push(PingMessage::generated_message_descriptor_data());\n            messages.push(PongMessage::generated_message_descriptor_data());\n            messages.push(FindNeighbours::generated_message_descriptor_data());\n            messages.push(Neighbours::generated_message_descriptor_data());\n            messages.push(BackupMessage::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/Tron.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/Tron.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n///  AccountId, (name, address) use name, (null, address) use address, (name, null) use name,\n// @@protoc_insertion_point(message:protocol.AccountId)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountId {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountId.name)\n    pub name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AccountId.address)\n    pub address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountId.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountId {\n    fn default() -> &'a AccountId {\n        <AccountId as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountId {\n    pub fn new() -> AccountId {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"name\",\n            |m: &AccountId| { &m.name },\n            |m: &mut AccountId| { &mut m.name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &AccountId| { &m.address },\n            |m: &mut AccountId| { &mut m.address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountId>(\n            \"AccountId\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountId {\n    const NAME: &'static str = \"AccountId\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.name = is.read_bytes()?;\n                },\n                18 => {\n                    self.address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.name);\n        }\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.name.is_empty() {\n            os.write_bytes(1, &self.name)?;\n        }\n        if !self.address.is_empty() {\n            os.write_bytes(2, &self.address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountId {\n        AccountId::new()\n    }\n\n    fn clear(&mut self) {\n        self.name.clear();\n        self.address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountId {\n        static instance: AccountId = AccountId {\n            name: ::std::vec::Vec::new(),\n            address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountId {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountId\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountId {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountId {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n///  vote message\n// @@protoc_insertion_point(message:protocol.Vote)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Vote {\n    // message fields\n    ///  the super rep address\n    // @@protoc_insertion_point(field:protocol.Vote.vote_address)\n    pub vote_address: ::std::vec::Vec<u8>,\n    ///  the vote num to this super rep.\n    // @@protoc_insertion_point(field:protocol.Vote.vote_count)\n    pub vote_count: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Vote.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Vote {\n    fn default() -> &'a Vote {\n        <Vote as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Vote {\n    pub fn new() -> Vote {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"vote_address\",\n            |m: &Vote| { &m.vote_address },\n            |m: &mut Vote| { &mut m.vote_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"vote_count\",\n            |m: &Vote| { &m.vote_count },\n            |m: &mut Vote| { &mut m.vote_count },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Vote>(\n            \"Vote\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Vote {\n    const NAME: &'static str = \"Vote\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.vote_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.vote_count = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.vote_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.vote_address);\n        }\n        if self.vote_count != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.vote_count);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.vote_address.is_empty() {\n            os.write_bytes(1, &self.vote_address)?;\n        }\n        if self.vote_count != 0 {\n            os.write_int64(2, self.vote_count)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Vote {\n        Vote::new()\n    }\n\n    fn clear(&mut self) {\n        self.vote_address.clear();\n        self.vote_count = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Vote {\n        static instance: Vote = Vote {\n            vote_address: ::std::vec::Vec::new(),\n            vote_count: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Vote {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Vote\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Vote {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Vote {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n///  Proposal\n// @@protoc_insertion_point(message:protocol.Proposal)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Proposal {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Proposal.proposal_id)\n    pub proposal_id: i64,\n    // @@protoc_insertion_point(field:protocol.Proposal.proposer_address)\n    pub proposer_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Proposal.parameters)\n    pub parameters: ::std::collections::HashMap<i64, i64>,\n    // @@protoc_insertion_point(field:protocol.Proposal.expiration_time)\n    pub expiration_time: i64,\n    // @@protoc_insertion_point(field:protocol.Proposal.create_time)\n    pub create_time: i64,\n    // @@protoc_insertion_point(field:protocol.Proposal.approvals)\n    pub approvals: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.Proposal.state)\n    pub state: ::protobuf::EnumOrUnknown<proposal::State>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Proposal.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Proposal {\n    fn default() -> &'a Proposal {\n        <Proposal as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Proposal {\n    pub fn new() -> Proposal {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(7);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"proposal_id\",\n            |m: &Proposal| { &m.proposal_id },\n            |m: &mut Proposal| { &mut m.proposal_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"proposer_address\",\n            |m: &Proposal| { &m.proposer_address },\n            |m: &mut Proposal| { &mut m.proposer_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"parameters\",\n            |m: &Proposal| { &m.parameters },\n            |m: &mut Proposal| { &mut m.parameters },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"expiration_time\",\n            |m: &Proposal| { &m.expiration_time },\n            |m: &mut Proposal| { &mut m.expiration_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"create_time\",\n            |m: &Proposal| { &m.create_time },\n            |m: &mut Proposal| { &mut m.create_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"approvals\",\n            |m: &Proposal| { &m.approvals },\n            |m: &mut Proposal| { &mut m.approvals },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"state\",\n            |m: &Proposal| { &m.state },\n            |m: &mut Proposal| { &mut m.state },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Proposal>(\n            \"Proposal\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Proposal {\n    const NAME: &'static str = \"Proposal\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.proposal_id = is.read_int64()?;\n                },\n                18 => {\n                    self.proposer_address = is.read_bytes()?;\n                },\n                26 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            8 => key = is.read_int64()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.parameters.insert(key, value);\n                },\n                32 => {\n                    self.expiration_time = is.read_int64()?;\n                },\n                40 => {\n                    self.create_time = is.read_int64()?;\n                },\n                50 => {\n                    self.approvals.push(is.read_bytes()?);\n                },\n                56 => {\n                    self.state = is.read_enum_or_unknown()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.proposal_id != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.proposal_id);\n        }\n        if !self.proposer_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.proposer_address);\n        }\n        for (k, v) in &self.parameters {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::int64_size(1, *k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        if self.expiration_time != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.expiration_time);\n        }\n        if self.create_time != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.create_time);\n        }\n        for value in &self.approvals {\n            my_size += ::protobuf::rt::bytes_size(6, &value);\n        };\n        if self.state != ::protobuf::EnumOrUnknown::new(proposal::State::PENDING) {\n            my_size += ::protobuf::rt::int32_size(7, self.state.value());\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.proposal_id != 0 {\n            os.write_int64(1, self.proposal_id)?;\n        }\n        if !self.proposer_address.is_empty() {\n            os.write_bytes(2, &self.proposer_address)?;\n        }\n        for (k, v) in &self.parameters {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::int64_size(1, *k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(26)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_int64(1, *k)?;\n            os.write_int64(2, *v)?;\n        };\n        if self.expiration_time != 0 {\n            os.write_int64(4, self.expiration_time)?;\n        }\n        if self.create_time != 0 {\n            os.write_int64(5, self.create_time)?;\n        }\n        for v in &self.approvals {\n            os.write_bytes(6, &v)?;\n        };\n        if self.state != ::protobuf::EnumOrUnknown::new(proposal::State::PENDING) {\n            os.write_enum(7, ::protobuf::EnumOrUnknown::value(&self.state))?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Proposal {\n        Proposal::new()\n    }\n\n    fn clear(&mut self) {\n        self.proposal_id = 0;\n        self.proposer_address.clear();\n        self.parameters.clear();\n        self.expiration_time = 0;\n        self.create_time = 0;\n        self.approvals.clear();\n        self.state = ::protobuf::EnumOrUnknown::new(proposal::State::PENDING);\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Proposal {\n        static instance: ::protobuf::rt::Lazy<Proposal> = ::protobuf::rt::Lazy::new();\n        instance.get(Proposal::new)\n    }\n}\n\nimpl ::protobuf::MessageFull for Proposal {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Proposal\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Proposal {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Proposal {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `Proposal`\npub mod proposal {\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.Proposal.State)\n    pub enum State {\n        // @@protoc_insertion_point(enum_value:protocol.Proposal.State.PENDING)\n        PENDING = 0,\n        // @@protoc_insertion_point(enum_value:protocol.Proposal.State.DISAPPROVED)\n        DISAPPROVED = 1,\n        // @@protoc_insertion_point(enum_value:protocol.Proposal.State.APPROVED)\n        APPROVED = 2,\n        // @@protoc_insertion_point(enum_value:protocol.Proposal.State.CANCELED)\n        CANCELED = 3,\n    }\n\n    impl ::protobuf::Enum for State {\n        const NAME: &'static str = \"State\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<State> {\n            match value {\n                0 => ::std::option::Option::Some(State::PENDING),\n                1 => ::std::option::Option::Some(State::DISAPPROVED),\n                2 => ::std::option::Option::Some(State::APPROVED),\n                3 => ::std::option::Option::Some(State::CANCELED),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<State> {\n            match str {\n                \"PENDING\" => ::std::option::Option::Some(State::PENDING),\n                \"DISAPPROVED\" => ::std::option::Option::Some(State::DISAPPROVED),\n                \"APPROVED\" => ::std::option::Option::Some(State::APPROVED),\n                \"CANCELED\" => ::std::option::Option::Some(State::CANCELED),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [State] = &[\n            State::PENDING,\n            State::DISAPPROVED,\n            State::APPROVED,\n            State::CANCELED,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for State {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"Proposal.State\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for State {\n        fn default() -> Self {\n            State::PENDING\n        }\n    }\n\n    impl State {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<State>(\"Proposal.State\")\n        }\n    }\n}\n\n///  Exchange\n// @@protoc_insertion_point(message:protocol.Exchange)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Exchange {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Exchange.exchange_id)\n    pub exchange_id: i64,\n    // @@protoc_insertion_point(field:protocol.Exchange.creator_address)\n    pub creator_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Exchange.create_time)\n    pub create_time: i64,\n    // @@protoc_insertion_point(field:protocol.Exchange.first_token_id)\n    pub first_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Exchange.first_token_balance)\n    pub first_token_balance: i64,\n    // @@protoc_insertion_point(field:protocol.Exchange.second_token_id)\n    pub second_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Exchange.second_token_balance)\n    pub second_token_balance: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Exchange.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Exchange {\n    fn default() -> &'a Exchange {\n        <Exchange as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Exchange {\n    pub fn new() -> Exchange {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(7);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_id\",\n            |m: &Exchange| { &m.exchange_id },\n            |m: &mut Exchange| { &mut m.exchange_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"creator_address\",\n            |m: &Exchange| { &m.creator_address },\n            |m: &mut Exchange| { &mut m.creator_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"create_time\",\n            |m: &Exchange| { &m.create_time },\n            |m: &mut Exchange| { &mut m.create_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"first_token_id\",\n            |m: &Exchange| { &m.first_token_id },\n            |m: &mut Exchange| { &mut m.first_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"first_token_balance\",\n            |m: &Exchange| { &m.first_token_balance },\n            |m: &mut Exchange| { &mut m.first_token_balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"second_token_id\",\n            |m: &Exchange| { &m.second_token_id },\n            |m: &mut Exchange| { &mut m.second_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"second_token_balance\",\n            |m: &Exchange| { &m.second_token_balance },\n            |m: &mut Exchange| { &mut m.second_token_balance },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Exchange>(\n            \"Exchange\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Exchange {\n    const NAME: &'static str = \"Exchange\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.exchange_id = is.read_int64()?;\n                },\n                18 => {\n                    self.creator_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.create_time = is.read_int64()?;\n                },\n                50 => {\n                    self.first_token_id = is.read_bytes()?;\n                },\n                56 => {\n                    self.first_token_balance = is.read_int64()?;\n                },\n                66 => {\n                    self.second_token_id = is.read_bytes()?;\n                },\n                72 => {\n                    self.second_token_balance = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.exchange_id != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.exchange_id);\n        }\n        if !self.creator_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.creator_address);\n        }\n        if self.create_time != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.create_time);\n        }\n        if !self.first_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.first_token_id);\n        }\n        if self.first_token_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(7, self.first_token_balance);\n        }\n        if !self.second_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(8, &self.second_token_id);\n        }\n        if self.second_token_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(9, self.second_token_balance);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.exchange_id != 0 {\n            os.write_int64(1, self.exchange_id)?;\n        }\n        if !self.creator_address.is_empty() {\n            os.write_bytes(2, &self.creator_address)?;\n        }\n        if self.create_time != 0 {\n            os.write_int64(3, self.create_time)?;\n        }\n        if !self.first_token_id.is_empty() {\n            os.write_bytes(6, &self.first_token_id)?;\n        }\n        if self.first_token_balance != 0 {\n            os.write_int64(7, self.first_token_balance)?;\n        }\n        if !self.second_token_id.is_empty() {\n            os.write_bytes(8, &self.second_token_id)?;\n        }\n        if self.second_token_balance != 0 {\n            os.write_int64(9, self.second_token_balance)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Exchange {\n        Exchange::new()\n    }\n\n    fn clear(&mut self) {\n        self.exchange_id = 0;\n        self.creator_address.clear();\n        self.create_time = 0;\n        self.first_token_id.clear();\n        self.first_token_balance = 0;\n        self.second_token_id.clear();\n        self.second_token_balance = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Exchange {\n        static instance: Exchange = Exchange {\n            exchange_id: 0,\n            creator_address: ::std::vec::Vec::new(),\n            create_time: 0,\n            first_token_id: ::std::vec::Vec::new(),\n            first_token_balance: 0,\n            second_token_id: ::std::vec::Vec::new(),\n            second_token_balance: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Exchange {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Exchange\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Exchange {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Exchange {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n///  market\n// @@protoc_insertion_point(message:protocol.MarketOrder)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketOrder {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketOrder.order_id)\n    pub order_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.create_time)\n    pub create_time: i64,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.sell_token_id)\n    pub sell_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.sell_token_quantity)\n    pub sell_token_quantity: i64,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.buy_token_id)\n    pub buy_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.buy_token_quantity)\n    pub buy_token_quantity: i64,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.sell_token_quantity_remain)\n    pub sell_token_quantity_remain: i64,\n    ///  When state != ACTIVE and sell_token_quantity_return !=0,\n    /// it means that some sell tokens are returned to the account due to insufficient remaining amount\n    // @@protoc_insertion_point(field:protocol.MarketOrder.sell_token_quantity_return)\n    pub sell_token_quantity_return: i64,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.state)\n    pub state: ::protobuf::EnumOrUnknown<market_order::State>,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.prev)\n    pub prev: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrder.next)\n    pub next: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketOrder.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketOrder {\n    fn default() -> &'a MarketOrder {\n        <MarketOrder as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketOrder {\n    pub fn new() -> MarketOrder {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(12);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"order_id\",\n            |m: &MarketOrder| { &m.order_id },\n            |m: &mut MarketOrder| { &mut m.order_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &MarketOrder| { &m.owner_address },\n            |m: &mut MarketOrder| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"create_time\",\n            |m: &MarketOrder| { &m.create_time },\n            |m: &mut MarketOrder| { &mut m.create_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_id\",\n            |m: &MarketOrder| { &m.sell_token_id },\n            |m: &mut MarketOrder| { &mut m.sell_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_quantity\",\n            |m: &MarketOrder| { &m.sell_token_quantity },\n            |m: &mut MarketOrder| { &mut m.sell_token_quantity },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_id\",\n            |m: &MarketOrder| { &m.buy_token_id },\n            |m: &mut MarketOrder| { &mut m.buy_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_quantity\",\n            |m: &MarketOrder| { &m.buy_token_quantity },\n            |m: &mut MarketOrder| { &mut m.buy_token_quantity },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_quantity_remain\",\n            |m: &MarketOrder| { &m.sell_token_quantity_remain },\n            |m: &mut MarketOrder| { &mut m.sell_token_quantity_remain },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_quantity_return\",\n            |m: &MarketOrder| { &m.sell_token_quantity_return },\n            |m: &mut MarketOrder| { &mut m.sell_token_quantity_return },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"state\",\n            |m: &MarketOrder| { &m.state },\n            |m: &mut MarketOrder| { &mut m.state },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"prev\",\n            |m: &MarketOrder| { &m.prev },\n            |m: &mut MarketOrder| { &mut m.prev },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"next\",\n            |m: &MarketOrder| { &m.next },\n            |m: &mut MarketOrder| { &mut m.next },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketOrder>(\n            \"MarketOrder\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketOrder {\n    const NAME: &'static str = \"MarketOrder\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.order_id = is.read_bytes()?;\n                },\n                18 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.create_time = is.read_int64()?;\n                },\n                34 => {\n                    self.sell_token_id = is.read_bytes()?;\n                },\n                40 => {\n                    self.sell_token_quantity = is.read_int64()?;\n                },\n                50 => {\n                    self.buy_token_id = is.read_bytes()?;\n                },\n                56 => {\n                    self.buy_token_quantity = is.read_int64()?;\n                },\n                72 => {\n                    self.sell_token_quantity_remain = is.read_int64()?;\n                },\n                80 => {\n                    self.sell_token_quantity_return = is.read_int64()?;\n                },\n                88 => {\n                    self.state = is.read_enum_or_unknown()?;\n                },\n                98 => {\n                    self.prev = is.read_bytes()?;\n                },\n                106 => {\n                    self.next = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.order_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.order_id);\n        }\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.owner_address);\n        }\n        if self.create_time != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.create_time);\n        }\n        if !self.sell_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.sell_token_id);\n        }\n        if self.sell_token_quantity != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.sell_token_quantity);\n        }\n        if !self.buy_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.buy_token_id);\n        }\n        if self.buy_token_quantity != 0 {\n            my_size += ::protobuf::rt::int64_size(7, self.buy_token_quantity);\n        }\n        if self.sell_token_quantity_remain != 0 {\n            my_size += ::protobuf::rt::int64_size(9, self.sell_token_quantity_remain);\n        }\n        if self.sell_token_quantity_return != 0 {\n            my_size += ::protobuf::rt::int64_size(10, self.sell_token_quantity_return);\n        }\n        if self.state != ::protobuf::EnumOrUnknown::new(market_order::State::ACTIVE) {\n            my_size += ::protobuf::rt::int32_size(11, self.state.value());\n        }\n        if !self.prev.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(12, &self.prev);\n        }\n        if !self.next.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(13, &self.next);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.order_id.is_empty() {\n            os.write_bytes(1, &self.order_id)?;\n        }\n        if !self.owner_address.is_empty() {\n            os.write_bytes(2, &self.owner_address)?;\n        }\n        if self.create_time != 0 {\n            os.write_int64(3, self.create_time)?;\n        }\n        if !self.sell_token_id.is_empty() {\n            os.write_bytes(4, &self.sell_token_id)?;\n        }\n        if self.sell_token_quantity != 0 {\n            os.write_int64(5, self.sell_token_quantity)?;\n        }\n        if !self.buy_token_id.is_empty() {\n            os.write_bytes(6, &self.buy_token_id)?;\n        }\n        if self.buy_token_quantity != 0 {\n            os.write_int64(7, self.buy_token_quantity)?;\n        }\n        if self.sell_token_quantity_remain != 0 {\n            os.write_int64(9, self.sell_token_quantity_remain)?;\n        }\n        if self.sell_token_quantity_return != 0 {\n            os.write_int64(10, self.sell_token_quantity_return)?;\n        }\n        if self.state != ::protobuf::EnumOrUnknown::new(market_order::State::ACTIVE) {\n            os.write_enum(11, ::protobuf::EnumOrUnknown::value(&self.state))?;\n        }\n        if !self.prev.is_empty() {\n            os.write_bytes(12, &self.prev)?;\n        }\n        if !self.next.is_empty() {\n            os.write_bytes(13, &self.next)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketOrder {\n        MarketOrder::new()\n    }\n\n    fn clear(&mut self) {\n        self.order_id.clear();\n        self.owner_address.clear();\n        self.create_time = 0;\n        self.sell_token_id.clear();\n        self.sell_token_quantity = 0;\n        self.buy_token_id.clear();\n        self.buy_token_quantity = 0;\n        self.sell_token_quantity_remain = 0;\n        self.sell_token_quantity_return = 0;\n        self.state = ::protobuf::EnumOrUnknown::new(market_order::State::ACTIVE);\n        self.prev.clear();\n        self.next.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketOrder {\n        static instance: MarketOrder = MarketOrder {\n            order_id: ::std::vec::Vec::new(),\n            owner_address: ::std::vec::Vec::new(),\n            create_time: 0,\n            sell_token_id: ::std::vec::Vec::new(),\n            sell_token_quantity: 0,\n            buy_token_id: ::std::vec::Vec::new(),\n            buy_token_quantity: 0,\n            sell_token_quantity_remain: 0,\n            sell_token_quantity_return: 0,\n            state: ::protobuf::EnumOrUnknown::from_i32(0),\n            prev: ::std::vec::Vec::new(),\n            next: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketOrder {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketOrder\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketOrder {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketOrder {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `MarketOrder`\npub mod market_order {\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.MarketOrder.State)\n    pub enum State {\n        // @@protoc_insertion_point(enum_value:protocol.MarketOrder.State.ACTIVE)\n        ACTIVE = 0,\n        // @@protoc_insertion_point(enum_value:protocol.MarketOrder.State.INACTIVE)\n        INACTIVE = 1,\n        // @@protoc_insertion_point(enum_value:protocol.MarketOrder.State.CANCELED)\n        CANCELED = 2,\n    }\n\n    impl ::protobuf::Enum for State {\n        const NAME: &'static str = \"State\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<State> {\n            match value {\n                0 => ::std::option::Option::Some(State::ACTIVE),\n                1 => ::std::option::Option::Some(State::INACTIVE),\n                2 => ::std::option::Option::Some(State::CANCELED),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<State> {\n            match str {\n                \"ACTIVE\" => ::std::option::Option::Some(State::ACTIVE),\n                \"INACTIVE\" => ::std::option::Option::Some(State::INACTIVE),\n                \"CANCELED\" => ::std::option::Option::Some(State::CANCELED),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [State] = &[\n            State::ACTIVE,\n            State::INACTIVE,\n            State::CANCELED,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for State {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"MarketOrder.State\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for State {\n        fn default() -> Self {\n            State::ACTIVE\n        }\n    }\n\n    impl State {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<State>(\"MarketOrder.State\")\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.MarketOrderList)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketOrderList {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketOrderList.orders)\n    pub orders: ::std::vec::Vec<MarketOrder>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketOrderList.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketOrderList {\n    fn default() -> &'a MarketOrderList {\n        <MarketOrderList as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketOrderList {\n    pub fn new() -> MarketOrderList {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"orders\",\n            |m: &MarketOrderList| { &m.orders },\n            |m: &mut MarketOrderList| { &mut m.orders },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketOrderList>(\n            \"MarketOrderList\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketOrderList {\n    const NAME: &'static str = \"MarketOrderList\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.orders.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.orders {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.orders {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketOrderList {\n        MarketOrderList::new()\n    }\n\n    fn clear(&mut self) {\n        self.orders.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketOrderList {\n        static instance: MarketOrderList = MarketOrderList {\n            orders: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketOrderList {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketOrderList\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketOrderList {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketOrderList {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketOrderPairList)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketOrderPairList {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketOrderPairList.orderPair)\n    pub orderPair: ::std::vec::Vec<MarketOrderPair>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketOrderPairList.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketOrderPairList {\n    fn default() -> &'a MarketOrderPairList {\n        <MarketOrderPairList as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketOrderPairList {\n    pub fn new() -> MarketOrderPairList {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"orderPair\",\n            |m: &MarketOrderPairList| { &m.orderPair },\n            |m: &mut MarketOrderPairList| { &mut m.orderPair },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketOrderPairList>(\n            \"MarketOrderPairList\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketOrderPairList {\n    const NAME: &'static str = \"MarketOrderPairList\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.orderPair.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.orderPair {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.orderPair {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketOrderPairList {\n        MarketOrderPairList::new()\n    }\n\n    fn clear(&mut self) {\n        self.orderPair.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketOrderPairList {\n        static instance: MarketOrderPairList = MarketOrderPairList {\n            orderPair: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketOrderPairList {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketOrderPairList\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketOrderPairList {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketOrderPairList {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketOrderPair)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketOrderPair {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketOrderPair.sell_token_id)\n    pub sell_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrderPair.buy_token_id)\n    pub buy_token_id: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketOrderPair.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketOrderPair {\n    fn default() -> &'a MarketOrderPair {\n        <MarketOrderPair as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketOrderPair {\n    pub fn new() -> MarketOrderPair {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_id\",\n            |m: &MarketOrderPair| { &m.sell_token_id },\n            |m: &mut MarketOrderPair| { &mut m.sell_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_id\",\n            |m: &MarketOrderPair| { &m.buy_token_id },\n            |m: &mut MarketOrderPair| { &mut m.buy_token_id },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketOrderPair>(\n            \"MarketOrderPair\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketOrderPair {\n    const NAME: &'static str = \"MarketOrderPair\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.sell_token_id = is.read_bytes()?;\n                },\n                18 => {\n                    self.buy_token_id = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.sell_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.sell_token_id);\n        }\n        if !self.buy_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.buy_token_id);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.sell_token_id.is_empty() {\n            os.write_bytes(1, &self.sell_token_id)?;\n        }\n        if !self.buy_token_id.is_empty() {\n            os.write_bytes(2, &self.buy_token_id)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketOrderPair {\n        MarketOrderPair::new()\n    }\n\n    fn clear(&mut self) {\n        self.sell_token_id.clear();\n        self.buy_token_id.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketOrderPair {\n        static instance: MarketOrderPair = MarketOrderPair {\n            sell_token_id: ::std::vec::Vec::new(),\n            buy_token_id: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketOrderPair {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketOrderPair\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketOrderPair {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketOrderPair {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketAccountOrder)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketAccountOrder {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketAccountOrder.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketAccountOrder.orders)\n    pub orders: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.MarketAccountOrder.count)\n    pub count: i64,\n    // @@protoc_insertion_point(field:protocol.MarketAccountOrder.total_count)\n    pub total_count: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketAccountOrder.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketAccountOrder {\n    fn default() -> &'a MarketAccountOrder {\n        <MarketAccountOrder as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketAccountOrder {\n    pub fn new() -> MarketAccountOrder {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &MarketAccountOrder| { &m.owner_address },\n            |m: &mut MarketAccountOrder| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"orders\",\n            |m: &MarketAccountOrder| { &m.orders },\n            |m: &mut MarketAccountOrder| { &mut m.orders },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"count\",\n            |m: &MarketAccountOrder| { &m.count },\n            |m: &mut MarketAccountOrder| { &mut m.count },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"total_count\",\n            |m: &MarketAccountOrder| { &m.total_count },\n            |m: &mut MarketAccountOrder| { &mut m.total_count },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketAccountOrder>(\n            \"MarketAccountOrder\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketAccountOrder {\n    const NAME: &'static str = \"MarketAccountOrder\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.orders.push(is.read_bytes()?);\n                },\n                24 => {\n                    self.count = is.read_int64()?;\n                },\n                32 => {\n                    self.total_count = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        for value in &self.orders {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        if self.count != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.count);\n        }\n        if self.total_count != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.total_count);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        for v in &self.orders {\n            os.write_bytes(2, &v)?;\n        };\n        if self.count != 0 {\n            os.write_int64(3, self.count)?;\n        }\n        if self.total_count != 0 {\n            os.write_int64(4, self.total_count)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketAccountOrder {\n        MarketAccountOrder::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.orders.clear();\n        self.count = 0;\n        self.total_count = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketAccountOrder {\n        static instance: MarketAccountOrder = MarketAccountOrder {\n            owner_address: ::std::vec::Vec::new(),\n            orders: ::std::vec::Vec::new(),\n            count: 0,\n            total_count: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketAccountOrder {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketAccountOrder\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketAccountOrder {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketAccountOrder {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketPrice)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketPrice {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketPrice.sell_token_quantity)\n    pub sell_token_quantity: i64,\n    // @@protoc_insertion_point(field:protocol.MarketPrice.buy_token_quantity)\n    pub buy_token_quantity: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketPrice.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketPrice {\n    fn default() -> &'a MarketPrice {\n        <MarketPrice as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketPrice {\n    pub fn new() -> MarketPrice {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_quantity\",\n            |m: &MarketPrice| { &m.sell_token_quantity },\n            |m: &mut MarketPrice| { &mut m.sell_token_quantity },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_quantity\",\n            |m: &MarketPrice| { &m.buy_token_quantity },\n            |m: &mut MarketPrice| { &mut m.buy_token_quantity },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketPrice>(\n            \"MarketPrice\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketPrice {\n    const NAME: &'static str = \"MarketPrice\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.sell_token_quantity = is.read_int64()?;\n                },\n                16 => {\n                    self.buy_token_quantity = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.sell_token_quantity != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.sell_token_quantity);\n        }\n        if self.buy_token_quantity != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.buy_token_quantity);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.sell_token_quantity != 0 {\n            os.write_int64(1, self.sell_token_quantity)?;\n        }\n        if self.buy_token_quantity != 0 {\n            os.write_int64(2, self.buy_token_quantity)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketPrice {\n        MarketPrice::new()\n    }\n\n    fn clear(&mut self) {\n        self.sell_token_quantity = 0;\n        self.buy_token_quantity = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketPrice {\n        static instance: MarketPrice = MarketPrice {\n            sell_token_quantity: 0,\n            buy_token_quantity: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketPrice {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketPrice\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketPrice {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketPrice {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketPriceList)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketPriceList {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketPriceList.sell_token_id)\n    pub sell_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketPriceList.buy_token_id)\n    pub buy_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketPriceList.prices)\n    pub prices: ::std::vec::Vec<MarketPrice>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketPriceList.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketPriceList {\n    fn default() -> &'a MarketPriceList {\n        <MarketPriceList as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketPriceList {\n    pub fn new() -> MarketPriceList {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_id\",\n            |m: &MarketPriceList| { &m.sell_token_id },\n            |m: &mut MarketPriceList| { &mut m.sell_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_id\",\n            |m: &MarketPriceList| { &m.buy_token_id },\n            |m: &mut MarketPriceList| { &mut m.buy_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"prices\",\n            |m: &MarketPriceList| { &m.prices },\n            |m: &mut MarketPriceList| { &mut m.prices },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketPriceList>(\n            \"MarketPriceList\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketPriceList {\n    const NAME: &'static str = \"MarketPriceList\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.sell_token_id = is.read_bytes()?;\n                },\n                18 => {\n                    self.buy_token_id = is.read_bytes()?;\n                },\n                26 => {\n                    self.prices.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.sell_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.sell_token_id);\n        }\n        if !self.buy_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.buy_token_id);\n        }\n        for value in &self.prices {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.sell_token_id.is_empty() {\n            os.write_bytes(1, &self.sell_token_id)?;\n        }\n        if !self.buy_token_id.is_empty() {\n            os.write_bytes(2, &self.buy_token_id)?;\n        }\n        for v in &self.prices {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketPriceList {\n        MarketPriceList::new()\n    }\n\n    fn clear(&mut self) {\n        self.sell_token_id.clear();\n        self.buy_token_id.clear();\n        self.prices.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketPriceList {\n        static instance: MarketPriceList = MarketPriceList {\n            sell_token_id: ::std::vec::Vec::new(),\n            buy_token_id: ::std::vec::Vec::new(),\n            prices: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketPriceList {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketPriceList\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketPriceList {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketPriceList {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketOrderIdList)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketOrderIdList {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketOrderIdList.head)\n    pub head: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrderIdList.tail)\n    pub tail: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketOrderIdList.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketOrderIdList {\n    fn default() -> &'a MarketOrderIdList {\n        <MarketOrderIdList as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketOrderIdList {\n    pub fn new() -> MarketOrderIdList {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"head\",\n            |m: &MarketOrderIdList| { &m.head },\n            |m: &mut MarketOrderIdList| { &mut m.head },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"tail\",\n            |m: &MarketOrderIdList| { &m.tail },\n            |m: &mut MarketOrderIdList| { &mut m.tail },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketOrderIdList>(\n            \"MarketOrderIdList\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketOrderIdList {\n    const NAME: &'static str = \"MarketOrderIdList\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.head = is.read_bytes()?;\n                },\n                18 => {\n                    self.tail = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.head.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.head);\n        }\n        if !self.tail.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.tail);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.head.is_empty() {\n            os.write_bytes(1, &self.head)?;\n        }\n        if !self.tail.is_empty() {\n            os.write_bytes(2, &self.tail)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketOrderIdList {\n        MarketOrderIdList::new()\n    }\n\n    fn clear(&mut self) {\n        self.head.clear();\n        self.tail.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketOrderIdList {\n        static instance: MarketOrderIdList = MarketOrderIdList {\n            head: ::std::vec::Vec::new(),\n            tail: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketOrderIdList {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketOrderIdList\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketOrderIdList {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketOrderIdList {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ChainParameters)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ChainParameters {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ChainParameters.chainParameter)\n    pub chainParameter: ::std::vec::Vec<chain_parameters::ChainParameter>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ChainParameters.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ChainParameters {\n    fn default() -> &'a ChainParameters {\n        <ChainParameters as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ChainParameters {\n    pub fn new() -> ChainParameters {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"chainParameter\",\n            |m: &ChainParameters| { &m.chainParameter },\n            |m: &mut ChainParameters| { &mut m.chainParameter },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ChainParameters>(\n            \"ChainParameters\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ChainParameters {\n    const NAME: &'static str = \"ChainParameters\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.chainParameter.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.chainParameter {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.chainParameter {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ChainParameters {\n        ChainParameters::new()\n    }\n\n    fn clear(&mut self) {\n        self.chainParameter.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ChainParameters {\n        static instance: ChainParameters = ChainParameters {\n            chainParameter: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ChainParameters {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ChainParameters\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ChainParameters {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ChainParameters {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `ChainParameters`\npub mod chain_parameters {\n    // @@protoc_insertion_point(message:protocol.ChainParameters.ChainParameter)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct ChainParameter {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.ChainParameters.ChainParameter.key)\n        pub key: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.ChainParameters.ChainParameter.value)\n        pub value: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.ChainParameters.ChainParameter.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a ChainParameter {\n        fn default() -> &'a ChainParameter {\n            <ChainParameter as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl ChainParameter {\n        pub fn new() -> ChainParameter {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"key\",\n                |m: &ChainParameter| { &m.key },\n                |m: &mut ChainParameter| { &mut m.key },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"value\",\n                |m: &ChainParameter| { &m.value },\n                |m: &mut ChainParameter| { &mut m.value },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ChainParameter>(\n                \"ChainParameters.ChainParameter\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for ChainParameter {\n        const NAME: &'static str = \"ChainParameter\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.key = is.read_string()?;\n                    },\n                    16 => {\n                        self.value = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.key.is_empty() {\n                my_size += ::protobuf::rt::string_size(1, &self.key);\n            }\n            if self.value != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.value);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.key.is_empty() {\n                os.write_string(1, &self.key)?;\n            }\n            if self.value != 0 {\n                os.write_int64(2, self.value)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> ChainParameter {\n            ChainParameter::new()\n        }\n\n        fn clear(&mut self) {\n            self.key.clear();\n            self.value = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static ChainParameter {\n            static instance: ChainParameter = ChainParameter {\n                key: ::std::string::String::new(),\n                value: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for ChainParameter {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"ChainParameters.ChainParameter\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for ChainParameter {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for ChainParameter {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n///  Account \n// @@protoc_insertion_point(message:protocol.Account)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Account {\n    // message fields\n    ///  account nick name\n    // @@protoc_insertion_point(field:protocol.Account.account_name)\n    pub account_name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Account.type)\n    pub type_: ::protobuf::EnumOrUnknown<AccountType>,\n    ///  the create address\n    // @@protoc_insertion_point(field:protocol.Account.address)\n    pub address: ::std::vec::Vec<u8>,\n    ///  the trx balance\n    // @@protoc_insertion_point(field:protocol.Account.balance)\n    pub balance: i64,\n    ///  the votes\n    // @@protoc_insertion_point(field:protocol.Account.votes)\n    pub votes: ::std::vec::Vec<Vote>,\n    ///  the other asset owned by this account\n    // @@protoc_insertion_point(field:protocol.Account.asset)\n    pub asset: ::std::collections::HashMap<::std::string::String, i64>,\n    ///  the other asset owned by this account，key is assetId\n    // @@protoc_insertion_point(field:protocol.Account.assetV2)\n    pub assetV2: ::std::collections::HashMap<::std::string::String, i64>,\n    ///  the frozen balance for bandwidth\n    // @@protoc_insertion_point(field:protocol.Account.frozen)\n    pub frozen: ::std::vec::Vec<account::Frozen>,\n    ///  bandwidth, get from frozen\n    // @@protoc_insertion_point(field:protocol.Account.net_usage)\n    pub net_usage: i64,\n    /// Frozen balance provided by other accounts to this account\n    // @@protoc_insertion_point(field:protocol.Account.acquired_delegated_frozen_balance_for_bandwidth)\n    pub acquired_delegated_frozen_balance_for_bandwidth: i64,\n    /// Freeze and provide balances to other accounts\n    // @@protoc_insertion_point(field:protocol.Account.delegated_frozen_balance_for_bandwidth)\n    pub delegated_frozen_balance_for_bandwidth: i64,\n    // @@protoc_insertion_point(field:protocol.Account.old_tron_power)\n    pub old_tron_power: i64,\n    // @@protoc_insertion_point(field:protocol.Account.tron_power)\n    pub tron_power: ::protobuf::MessageField<account::Frozen>,\n    // @@protoc_insertion_point(field:protocol.Account.asset_optimized)\n    pub asset_optimized: bool,\n    ///  this account create time\n    // @@protoc_insertion_point(field:protocol.Account.create_time)\n    pub create_time: i64,\n    ///  this last operation time, including transfer, voting and so on. //FIXME fix grammar\n    // @@protoc_insertion_point(field:protocol.Account.latest_opration_time)\n    pub latest_opration_time: i64,\n    ///  witness block producing allowance\n    // @@protoc_insertion_point(field:protocol.Account.allowance)\n    pub allowance: i64,\n    ///  last withdraw time\n    // @@protoc_insertion_point(field:protocol.Account.latest_withdraw_time)\n    pub latest_withdraw_time: i64,\n    ///  not used so far\n    // @@protoc_insertion_point(field:protocol.Account.code)\n    pub code: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Account.is_witness)\n    pub is_witness: bool,\n    // @@protoc_insertion_point(field:protocol.Account.is_committee)\n    pub is_committee: bool,\n    ///  frozen asset(for asset issuer)\n    // @@protoc_insertion_point(field:protocol.Account.frozen_supply)\n    pub frozen_supply: ::std::vec::Vec<account::Frozen>,\n    ///  asset_issued_name\n    // @@protoc_insertion_point(field:protocol.Account.asset_issued_name)\n    pub asset_issued_name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Account.asset_issued_ID)\n    pub asset_issued_ID: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Account.latest_asset_operation_time)\n    pub latest_asset_operation_time: ::std::collections::HashMap<::std::string::String, i64>,\n    // @@protoc_insertion_point(field:protocol.Account.latest_asset_operation_timeV2)\n    pub latest_asset_operation_timeV2: ::std::collections::HashMap<::std::string::String, i64>,\n    // @@protoc_insertion_point(field:protocol.Account.free_net_usage)\n    pub free_net_usage: i64,\n    // @@protoc_insertion_point(field:protocol.Account.free_asset_net_usage)\n    pub free_asset_net_usage: ::std::collections::HashMap<::std::string::String, i64>,\n    // @@protoc_insertion_point(field:protocol.Account.free_asset_net_usageV2)\n    pub free_asset_net_usageV2: ::std::collections::HashMap<::std::string::String, i64>,\n    // @@protoc_insertion_point(field:protocol.Account.latest_consume_time)\n    pub latest_consume_time: i64,\n    // @@protoc_insertion_point(field:protocol.Account.latest_consume_free_time)\n    pub latest_consume_free_time: i64,\n    ///  the identity of this account, case insensitive\n    // @@protoc_insertion_point(field:protocol.Account.account_id)\n    pub account_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Account.net_window_size)\n    pub net_window_size: i64,\n    // @@protoc_insertion_point(field:protocol.Account.net_window_optimized)\n    pub net_window_optimized: bool,\n    // @@protoc_insertion_point(field:protocol.Account.account_resource)\n    pub account_resource: ::protobuf::MessageField<account::AccountResource>,\n    // @@protoc_insertion_point(field:protocol.Account.codeHash)\n    pub codeHash: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Account.owner_permission)\n    pub owner_permission: ::protobuf::MessageField<Permission>,\n    // @@protoc_insertion_point(field:protocol.Account.witness_permission)\n    pub witness_permission: ::protobuf::MessageField<Permission>,\n    // @@protoc_insertion_point(field:protocol.Account.active_permission)\n    pub active_permission: ::std::vec::Vec<Permission>,\n    // @@protoc_insertion_point(field:protocol.Account.frozenV2)\n    pub frozenV2: ::std::vec::Vec<account::FreezeV2>,\n    // @@protoc_insertion_point(field:protocol.Account.unfrozenV2)\n    pub unfrozenV2: ::std::vec::Vec<account::UnFreezeV2>,\n    // @@protoc_insertion_point(field:protocol.Account.delegated_frozenV2_balance_for_bandwidth)\n    pub delegated_frozenV2_balance_for_bandwidth: i64,\n    // @@protoc_insertion_point(field:protocol.Account.acquired_delegated_frozenV2_balance_for_bandwidth)\n    pub acquired_delegated_frozenV2_balance_for_bandwidth: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Account.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Account {\n    fn default() -> &'a Account {\n        <Account as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Account {\n    pub fn new() -> Account {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(43);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"account_name\",\n            |m: &Account| { &m.account_name },\n            |m: &mut Account| { &mut m.account_name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &Account| { &m.type_ },\n            |m: &mut Account| { &mut m.type_ },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &Account| { &m.address },\n            |m: &mut Account| { &mut m.address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"balance\",\n            |m: &Account| { &m.balance },\n            |m: &mut Account| { &mut m.balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"votes\",\n            |m: &Account| { &m.votes },\n            |m: &mut Account| { &mut m.votes },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"asset\",\n            |m: &Account| { &m.asset },\n            |m: &mut Account| { &mut m.asset },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"assetV2\",\n            |m: &Account| { &m.assetV2 },\n            |m: &mut Account| { &mut m.assetV2 },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"frozen\",\n            |m: &Account| { &m.frozen },\n            |m: &mut Account| { &mut m.frozen },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"net_usage\",\n            |m: &Account| { &m.net_usage },\n            |m: &mut Account| { &mut m.net_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"acquired_delegated_frozen_balance_for_bandwidth\",\n            |m: &Account| { &m.acquired_delegated_frozen_balance_for_bandwidth },\n            |m: &mut Account| { &mut m.acquired_delegated_frozen_balance_for_bandwidth },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"delegated_frozen_balance_for_bandwidth\",\n            |m: &Account| { &m.delegated_frozen_balance_for_bandwidth },\n            |m: &mut Account| { &mut m.delegated_frozen_balance_for_bandwidth },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"old_tron_power\",\n            |m: &Account| { &m.old_tron_power },\n            |m: &mut Account| { &mut m.old_tron_power },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, account::Frozen>(\n            \"tron_power\",\n            |m: &Account| { &m.tron_power },\n            |m: &mut Account| { &mut m.tron_power },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"asset_optimized\",\n            |m: &Account| { &m.asset_optimized },\n            |m: &mut Account| { &mut m.asset_optimized },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"create_time\",\n            |m: &Account| { &m.create_time },\n            |m: &mut Account| { &mut m.create_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"latest_opration_time\",\n            |m: &Account| { &m.latest_opration_time },\n            |m: &mut Account| { &mut m.latest_opration_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"allowance\",\n            |m: &Account| { &m.allowance },\n            |m: &mut Account| { &mut m.allowance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"latest_withdraw_time\",\n            |m: &Account| { &m.latest_withdraw_time },\n            |m: &mut Account| { &mut m.latest_withdraw_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"code\",\n            |m: &Account| { &m.code },\n            |m: &mut Account| { &mut m.code },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"is_witness\",\n            |m: &Account| { &m.is_witness },\n            |m: &mut Account| { &mut m.is_witness },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"is_committee\",\n            |m: &Account| { &m.is_committee },\n            |m: &mut Account| { &mut m.is_committee },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"frozen_supply\",\n            |m: &Account| { &m.frozen_supply },\n            |m: &mut Account| { &mut m.frozen_supply },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"asset_issued_name\",\n            |m: &Account| { &m.asset_issued_name },\n            |m: &mut Account| { &mut m.asset_issued_name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"asset_issued_ID\",\n            |m: &Account| { &m.asset_issued_ID },\n            |m: &mut Account| { &mut m.asset_issued_ID },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"latest_asset_operation_time\",\n            |m: &Account| { &m.latest_asset_operation_time },\n            |m: &mut Account| { &mut m.latest_asset_operation_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"latest_asset_operation_timeV2\",\n            |m: &Account| { &m.latest_asset_operation_timeV2 },\n            |m: &mut Account| { &mut m.latest_asset_operation_timeV2 },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"free_net_usage\",\n            |m: &Account| { &m.free_net_usage },\n            |m: &mut Account| { &mut m.free_net_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"free_asset_net_usage\",\n            |m: &Account| { &m.free_asset_net_usage },\n            |m: &mut Account| { &mut m.free_asset_net_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"free_asset_net_usageV2\",\n            |m: &Account| { &m.free_asset_net_usageV2 },\n            |m: &mut Account| { &mut m.free_asset_net_usageV2 },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"latest_consume_time\",\n            |m: &Account| { &m.latest_consume_time },\n            |m: &mut Account| { &mut m.latest_consume_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"latest_consume_free_time\",\n            |m: &Account| { &m.latest_consume_free_time },\n            |m: &mut Account| { &mut m.latest_consume_free_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"account_id\",\n            |m: &Account| { &m.account_id },\n            |m: &mut Account| { &mut m.account_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"net_window_size\",\n            |m: &Account| { &m.net_window_size },\n            |m: &mut Account| { &mut m.net_window_size },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"net_window_optimized\",\n            |m: &Account| { &m.net_window_optimized },\n            |m: &mut Account| { &mut m.net_window_optimized },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, account::AccountResource>(\n            \"account_resource\",\n            |m: &Account| { &m.account_resource },\n            |m: &mut Account| { &mut m.account_resource },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"codeHash\",\n            |m: &Account| { &m.codeHash },\n            |m: &mut Account| { &mut m.codeHash },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Permission>(\n            \"owner_permission\",\n            |m: &Account| { &m.owner_permission },\n            |m: &mut Account| { &mut m.owner_permission },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Permission>(\n            \"witness_permission\",\n            |m: &Account| { &m.witness_permission },\n            |m: &mut Account| { &mut m.witness_permission },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"active_permission\",\n            |m: &Account| { &m.active_permission },\n            |m: &mut Account| { &mut m.active_permission },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"frozenV2\",\n            |m: &Account| { &m.frozenV2 },\n            |m: &mut Account| { &mut m.frozenV2 },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"unfrozenV2\",\n            |m: &Account| { &m.unfrozenV2 },\n            |m: &mut Account| { &mut m.unfrozenV2 },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"delegated_frozenV2_balance_for_bandwidth\",\n            |m: &Account| { &m.delegated_frozenV2_balance_for_bandwidth },\n            |m: &mut Account| { &mut m.delegated_frozenV2_balance_for_bandwidth },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"acquired_delegated_frozenV2_balance_for_bandwidth\",\n            |m: &Account| { &m.acquired_delegated_frozenV2_balance_for_bandwidth },\n            |m: &mut Account| { &mut m.acquired_delegated_frozenV2_balance_for_bandwidth },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Account>(\n            \"Account\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Account {\n    const NAME: &'static str = \"Account\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.account_name = is.read_bytes()?;\n                },\n                16 => {\n                    self.type_ = is.read_enum_or_unknown()?;\n                },\n                26 => {\n                    self.address = is.read_bytes()?;\n                },\n                32 => {\n                    self.balance = is.read_int64()?;\n                },\n                42 => {\n                    self.votes.push(is.read_message()?);\n                },\n                50 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.asset.insert(key, value);\n                },\n                450 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.assetV2.insert(key, value);\n                },\n                58 => {\n                    self.frozen.push(is.read_message()?);\n                },\n                64 => {\n                    self.net_usage = is.read_int64()?;\n                },\n                328 => {\n                    self.acquired_delegated_frozen_balance_for_bandwidth = is.read_int64()?;\n                },\n                336 => {\n                    self.delegated_frozen_balance_for_bandwidth = is.read_int64()?;\n                },\n                368 => {\n                    self.old_tron_power = is.read_int64()?;\n                },\n                378 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.tron_power)?;\n                },\n                480 => {\n                    self.asset_optimized = is.read_bool()?;\n                },\n                72 => {\n                    self.create_time = is.read_int64()?;\n                },\n                80 => {\n                    self.latest_opration_time = is.read_int64()?;\n                },\n                88 => {\n                    self.allowance = is.read_int64()?;\n                },\n                96 => {\n                    self.latest_withdraw_time = is.read_int64()?;\n                },\n                106 => {\n                    self.code = is.read_bytes()?;\n                },\n                112 => {\n                    self.is_witness = is.read_bool()?;\n                },\n                120 => {\n                    self.is_committee = is.read_bool()?;\n                },\n                130 => {\n                    self.frozen_supply.push(is.read_message()?);\n                },\n                138 => {\n                    self.asset_issued_name = is.read_bytes()?;\n                },\n                458 => {\n                    self.asset_issued_ID = is.read_bytes()?;\n                },\n                146 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.latest_asset_operation_time.insert(key, value);\n                },\n                466 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.latest_asset_operation_timeV2.insert(key, value);\n                },\n                152 => {\n                    self.free_net_usage = is.read_int64()?;\n                },\n                162 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.free_asset_net_usage.insert(key, value);\n                },\n                474 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.free_asset_net_usageV2.insert(key, value);\n                },\n                168 => {\n                    self.latest_consume_time = is.read_int64()?;\n                },\n                176 => {\n                    self.latest_consume_free_time = is.read_int64()?;\n                },\n                186 => {\n                    self.account_id = is.read_bytes()?;\n                },\n                192 => {\n                    self.net_window_size = is.read_int64()?;\n                },\n                200 => {\n                    self.net_window_optimized = is.read_bool()?;\n                },\n                210 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.account_resource)?;\n                },\n                242 => {\n                    self.codeHash = is.read_bytes()?;\n                },\n                250 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.owner_permission)?;\n                },\n                258 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.witness_permission)?;\n                },\n                266 => {\n                    self.active_permission.push(is.read_message()?);\n                },\n                274 => {\n                    self.frozenV2.push(is.read_message()?);\n                },\n                282 => {\n                    self.unfrozenV2.push(is.read_message()?);\n                },\n                288 => {\n                    self.delegated_frozenV2_balance_for_bandwidth = is.read_int64()?;\n                },\n                296 => {\n                    self.acquired_delegated_frozenV2_balance_for_bandwidth = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.account_name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.account_name);\n        }\n        if self.type_ != ::protobuf::EnumOrUnknown::new(AccountType::Normal) {\n            my_size += ::protobuf::rt::int32_size(2, self.type_.value());\n        }\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.address);\n        }\n        if self.balance != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.balance);\n        }\n        for value in &self.votes {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for (k, v) in &self.asset {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        for (k, v) in &self.assetV2 {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        for value in &self.frozen {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.net_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(8, self.net_usage);\n        }\n        if self.acquired_delegated_frozen_balance_for_bandwidth != 0 {\n            my_size += ::protobuf::rt::int64_size(41, self.acquired_delegated_frozen_balance_for_bandwidth);\n        }\n        if self.delegated_frozen_balance_for_bandwidth != 0 {\n            my_size += ::protobuf::rt::int64_size(42, self.delegated_frozen_balance_for_bandwidth);\n        }\n        if self.old_tron_power != 0 {\n            my_size += ::protobuf::rt::int64_size(46, self.old_tron_power);\n        }\n        if let Some(v) = self.tron_power.as_ref() {\n            let len = v.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.asset_optimized != false {\n            my_size += 2 + 1;\n        }\n        if self.create_time != 0 {\n            my_size += ::protobuf::rt::int64_size(9, self.create_time);\n        }\n        if self.latest_opration_time != 0 {\n            my_size += ::protobuf::rt::int64_size(10, self.latest_opration_time);\n        }\n        if self.allowance != 0 {\n            my_size += ::protobuf::rt::int64_size(11, self.allowance);\n        }\n        if self.latest_withdraw_time != 0 {\n            my_size += ::protobuf::rt::int64_size(12, self.latest_withdraw_time);\n        }\n        if !self.code.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(13, &self.code);\n        }\n        if self.is_witness != false {\n            my_size += 1 + 1;\n        }\n        if self.is_committee != false {\n            my_size += 1 + 1;\n        }\n        for value in &self.frozen_supply {\n            let len = value.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if !self.asset_issued_name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(17, &self.asset_issued_name);\n        }\n        if !self.asset_issued_ID.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(57, &self.asset_issued_ID);\n        }\n        for (k, v) in &self.latest_asset_operation_time {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        for (k, v) in &self.latest_asset_operation_timeV2 {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        if self.free_net_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(19, self.free_net_usage);\n        }\n        for (k, v) in &self.free_asset_net_usage {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        for (k, v) in &self.free_asset_net_usageV2 {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        if self.latest_consume_time != 0 {\n            my_size += ::protobuf::rt::int64_size(21, self.latest_consume_time);\n        }\n        if self.latest_consume_free_time != 0 {\n            my_size += ::protobuf::rt::int64_size(22, self.latest_consume_free_time);\n        }\n        if !self.account_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(23, &self.account_id);\n        }\n        if self.net_window_size != 0 {\n            my_size += ::protobuf::rt::int64_size(24, self.net_window_size);\n        }\n        if self.net_window_optimized != false {\n            my_size += 2 + 1;\n        }\n        if let Some(v) = self.account_resource.as_ref() {\n            let len = v.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.codeHash.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(30, &self.codeHash);\n        }\n        if let Some(v) = self.owner_permission.as_ref() {\n            let len = v.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.witness_permission.as_ref() {\n            let len = v.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.active_permission {\n            let len = value.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.frozenV2 {\n            let len = value.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.unfrozenV2 {\n            let len = value.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.delegated_frozenV2_balance_for_bandwidth != 0 {\n            my_size += ::protobuf::rt::int64_size(36, self.delegated_frozenV2_balance_for_bandwidth);\n        }\n        if self.acquired_delegated_frozenV2_balance_for_bandwidth != 0 {\n            my_size += ::protobuf::rt::int64_size(37, self.acquired_delegated_frozenV2_balance_for_bandwidth);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.account_name.is_empty() {\n            os.write_bytes(1, &self.account_name)?;\n        }\n        if self.type_ != ::protobuf::EnumOrUnknown::new(AccountType::Normal) {\n            os.write_enum(2, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n        }\n        if !self.address.is_empty() {\n            os.write_bytes(3, &self.address)?;\n        }\n        if self.balance != 0 {\n            os.write_int64(4, self.balance)?;\n        }\n        for v in &self.votes {\n            ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?;\n        };\n        for (k, v) in &self.asset {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(50)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        for (k, v) in &self.assetV2 {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(450)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        for v in &self.frozen {\n            ::protobuf::rt::write_message_field_with_cached_size(7, v, os)?;\n        };\n        if self.net_usage != 0 {\n            os.write_int64(8, self.net_usage)?;\n        }\n        if self.acquired_delegated_frozen_balance_for_bandwidth != 0 {\n            os.write_int64(41, self.acquired_delegated_frozen_balance_for_bandwidth)?;\n        }\n        if self.delegated_frozen_balance_for_bandwidth != 0 {\n            os.write_int64(42, self.delegated_frozen_balance_for_bandwidth)?;\n        }\n        if self.old_tron_power != 0 {\n            os.write_int64(46, self.old_tron_power)?;\n        }\n        if let Some(v) = self.tron_power.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(47, v, os)?;\n        }\n        if self.asset_optimized != false {\n            os.write_bool(60, self.asset_optimized)?;\n        }\n        if self.create_time != 0 {\n            os.write_int64(9, self.create_time)?;\n        }\n        if self.latest_opration_time != 0 {\n            os.write_int64(10, self.latest_opration_time)?;\n        }\n        if self.allowance != 0 {\n            os.write_int64(11, self.allowance)?;\n        }\n        if self.latest_withdraw_time != 0 {\n            os.write_int64(12, self.latest_withdraw_time)?;\n        }\n        if !self.code.is_empty() {\n            os.write_bytes(13, &self.code)?;\n        }\n        if self.is_witness != false {\n            os.write_bool(14, self.is_witness)?;\n        }\n        if self.is_committee != false {\n            os.write_bool(15, self.is_committee)?;\n        }\n        for v in &self.frozen_supply {\n            ::protobuf::rt::write_message_field_with_cached_size(16, v, os)?;\n        };\n        if !self.asset_issued_name.is_empty() {\n            os.write_bytes(17, &self.asset_issued_name)?;\n        }\n        if !self.asset_issued_ID.is_empty() {\n            os.write_bytes(57, &self.asset_issued_ID)?;\n        }\n        for (k, v) in &self.latest_asset_operation_time {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(146)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        for (k, v) in &self.latest_asset_operation_timeV2 {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(466)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        if self.free_net_usage != 0 {\n            os.write_int64(19, self.free_net_usage)?;\n        }\n        for (k, v) in &self.free_asset_net_usage {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(162)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        for (k, v) in &self.free_asset_net_usageV2 {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(474)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        if self.latest_consume_time != 0 {\n            os.write_int64(21, self.latest_consume_time)?;\n        }\n        if self.latest_consume_free_time != 0 {\n            os.write_int64(22, self.latest_consume_free_time)?;\n        }\n        if !self.account_id.is_empty() {\n            os.write_bytes(23, &self.account_id)?;\n        }\n        if self.net_window_size != 0 {\n            os.write_int64(24, self.net_window_size)?;\n        }\n        if self.net_window_optimized != false {\n            os.write_bool(25, self.net_window_optimized)?;\n        }\n        if let Some(v) = self.account_resource.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(26, v, os)?;\n        }\n        if !self.codeHash.is_empty() {\n            os.write_bytes(30, &self.codeHash)?;\n        }\n        if let Some(v) = self.owner_permission.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(31, v, os)?;\n        }\n        if let Some(v) = self.witness_permission.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(32, v, os)?;\n        }\n        for v in &self.active_permission {\n            ::protobuf::rt::write_message_field_with_cached_size(33, v, os)?;\n        };\n        for v in &self.frozenV2 {\n            ::protobuf::rt::write_message_field_with_cached_size(34, v, os)?;\n        };\n        for v in &self.unfrozenV2 {\n            ::protobuf::rt::write_message_field_with_cached_size(35, v, os)?;\n        };\n        if self.delegated_frozenV2_balance_for_bandwidth != 0 {\n            os.write_int64(36, self.delegated_frozenV2_balance_for_bandwidth)?;\n        }\n        if self.acquired_delegated_frozenV2_balance_for_bandwidth != 0 {\n            os.write_int64(37, self.acquired_delegated_frozenV2_balance_for_bandwidth)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Account {\n        Account::new()\n    }\n\n    fn clear(&mut self) {\n        self.account_name.clear();\n        self.type_ = ::protobuf::EnumOrUnknown::new(AccountType::Normal);\n        self.address.clear();\n        self.balance = 0;\n        self.votes.clear();\n        self.asset.clear();\n        self.assetV2.clear();\n        self.frozen.clear();\n        self.net_usage = 0;\n        self.acquired_delegated_frozen_balance_for_bandwidth = 0;\n        self.delegated_frozen_balance_for_bandwidth = 0;\n        self.old_tron_power = 0;\n        self.tron_power.clear();\n        self.asset_optimized = false;\n        self.create_time = 0;\n        self.latest_opration_time = 0;\n        self.allowance = 0;\n        self.latest_withdraw_time = 0;\n        self.code.clear();\n        self.is_witness = false;\n        self.is_committee = false;\n        self.frozen_supply.clear();\n        self.asset_issued_name.clear();\n        self.asset_issued_ID.clear();\n        self.latest_asset_operation_time.clear();\n        self.latest_asset_operation_timeV2.clear();\n        self.free_net_usage = 0;\n        self.free_asset_net_usage.clear();\n        self.free_asset_net_usageV2.clear();\n        self.latest_consume_time = 0;\n        self.latest_consume_free_time = 0;\n        self.account_id.clear();\n        self.net_window_size = 0;\n        self.net_window_optimized = false;\n        self.account_resource.clear();\n        self.codeHash.clear();\n        self.owner_permission.clear();\n        self.witness_permission.clear();\n        self.active_permission.clear();\n        self.frozenV2.clear();\n        self.unfrozenV2.clear();\n        self.delegated_frozenV2_balance_for_bandwidth = 0;\n        self.acquired_delegated_frozenV2_balance_for_bandwidth = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Account {\n        static instance: ::protobuf::rt::Lazy<Account> = ::protobuf::rt::Lazy::new();\n        instance.get(Account::new)\n    }\n}\n\nimpl ::protobuf::MessageFull for Account {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Account\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Account {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Account {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `Account`\npub mod account {\n    ///  frozen balance \n    // @@protoc_insertion_point(message:protocol.Account.Frozen)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Frozen {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Account.Frozen.frozen_balance)\n        pub frozen_balance: i64,\n        // @@protoc_insertion_point(field:protocol.Account.Frozen.expire_time)\n        pub expire_time: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Account.Frozen.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Frozen {\n        fn default() -> &'a Frozen {\n            <Frozen as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Frozen {\n        pub fn new() -> Frozen {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"frozen_balance\",\n                |m: &Frozen| { &m.frozen_balance },\n                |m: &mut Frozen| { &mut m.frozen_balance },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"expire_time\",\n                |m: &Frozen| { &m.expire_time },\n                |m: &mut Frozen| { &mut m.expire_time },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Frozen>(\n                \"Account.Frozen\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Frozen {\n        const NAME: &'static str = \"Frozen\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.frozen_balance = is.read_int64()?;\n                    },\n                    16 => {\n                        self.expire_time = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.frozen_balance != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.frozen_balance);\n            }\n            if self.expire_time != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.expire_time);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.frozen_balance != 0 {\n                os.write_int64(1, self.frozen_balance)?;\n            }\n            if self.expire_time != 0 {\n                os.write_int64(2, self.expire_time)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Frozen {\n            Frozen::new()\n        }\n\n        fn clear(&mut self) {\n            self.frozen_balance = 0;\n            self.expire_time = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Frozen {\n            static instance: Frozen = Frozen {\n                frozen_balance: 0,\n                expire_time: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Frozen {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Account.Frozen\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Frozen {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Frozen {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.Account.AccountResource)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct AccountResource {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.energy_usage)\n        pub energy_usage: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.frozen_balance_for_energy)\n        pub frozen_balance_for_energy: ::protobuf::MessageField<Frozen>,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.latest_consume_time_for_energy)\n        pub latest_consume_time_for_energy: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.acquired_delegated_frozen_balance_for_energy)\n        pub acquired_delegated_frozen_balance_for_energy: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.delegated_frozen_balance_for_energy)\n        pub delegated_frozen_balance_for_energy: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.storage_limit)\n        pub storage_limit: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.storage_usage)\n        pub storage_usage: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.latest_exchange_storage_time)\n        pub latest_exchange_storage_time: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.energy_window_size)\n        pub energy_window_size: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.delegated_frozenV2_balance_for_energy)\n        pub delegated_frozenV2_balance_for_energy: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.acquired_delegated_frozenV2_balance_for_energy)\n        pub acquired_delegated_frozenV2_balance_for_energy: i64,\n        // @@protoc_insertion_point(field:protocol.Account.AccountResource.energy_window_optimized)\n        pub energy_window_optimized: bool,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Account.AccountResource.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a AccountResource {\n        fn default() -> &'a AccountResource {\n            <AccountResource as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl AccountResource {\n        pub fn new() -> AccountResource {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(12);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"energy_usage\",\n                |m: &AccountResource| { &m.energy_usage },\n                |m: &mut AccountResource| { &mut m.energy_usage },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Frozen>(\n                \"frozen_balance_for_energy\",\n                |m: &AccountResource| { &m.frozen_balance_for_energy },\n                |m: &mut AccountResource| { &mut m.frozen_balance_for_energy },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"latest_consume_time_for_energy\",\n                |m: &AccountResource| { &m.latest_consume_time_for_energy },\n                |m: &mut AccountResource| { &mut m.latest_consume_time_for_energy },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"acquired_delegated_frozen_balance_for_energy\",\n                |m: &AccountResource| { &m.acquired_delegated_frozen_balance_for_energy },\n                |m: &mut AccountResource| { &mut m.acquired_delegated_frozen_balance_for_energy },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"delegated_frozen_balance_for_energy\",\n                |m: &AccountResource| { &m.delegated_frozen_balance_for_energy },\n                |m: &mut AccountResource| { &mut m.delegated_frozen_balance_for_energy },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"storage_limit\",\n                |m: &AccountResource| { &m.storage_limit },\n                |m: &mut AccountResource| { &mut m.storage_limit },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"storage_usage\",\n                |m: &AccountResource| { &m.storage_usage },\n                |m: &mut AccountResource| { &mut m.storage_usage },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"latest_exchange_storage_time\",\n                |m: &AccountResource| { &m.latest_exchange_storage_time },\n                |m: &mut AccountResource| { &mut m.latest_exchange_storage_time },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"energy_window_size\",\n                |m: &AccountResource| { &m.energy_window_size },\n                |m: &mut AccountResource| { &mut m.energy_window_size },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"delegated_frozenV2_balance_for_energy\",\n                |m: &AccountResource| { &m.delegated_frozenV2_balance_for_energy },\n                |m: &mut AccountResource| { &mut m.delegated_frozenV2_balance_for_energy },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"acquired_delegated_frozenV2_balance_for_energy\",\n                |m: &AccountResource| { &m.acquired_delegated_frozenV2_balance_for_energy },\n                |m: &mut AccountResource| { &mut m.acquired_delegated_frozenV2_balance_for_energy },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"energy_window_optimized\",\n                |m: &AccountResource| { &m.energy_window_optimized },\n                |m: &mut AccountResource| { &mut m.energy_window_optimized },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountResource>(\n                \"Account.AccountResource\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for AccountResource {\n        const NAME: &'static str = \"AccountResource\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.energy_usage = is.read_int64()?;\n                    },\n                    18 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.frozen_balance_for_energy)?;\n                    },\n                    24 => {\n                        self.latest_consume_time_for_energy = is.read_int64()?;\n                    },\n                    32 => {\n                        self.acquired_delegated_frozen_balance_for_energy = is.read_int64()?;\n                    },\n                    40 => {\n                        self.delegated_frozen_balance_for_energy = is.read_int64()?;\n                    },\n                    48 => {\n                        self.storage_limit = is.read_int64()?;\n                    },\n                    56 => {\n                        self.storage_usage = is.read_int64()?;\n                    },\n                    64 => {\n                        self.latest_exchange_storage_time = is.read_int64()?;\n                    },\n                    72 => {\n                        self.energy_window_size = is.read_int64()?;\n                    },\n                    80 => {\n                        self.delegated_frozenV2_balance_for_energy = is.read_int64()?;\n                    },\n                    88 => {\n                        self.acquired_delegated_frozenV2_balance_for_energy = is.read_int64()?;\n                    },\n                    96 => {\n                        self.energy_window_optimized = is.read_bool()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.energy_usage != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.energy_usage);\n            }\n            if let Some(v) = self.frozen_balance_for_energy.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if self.latest_consume_time_for_energy != 0 {\n                my_size += ::protobuf::rt::int64_size(3, self.latest_consume_time_for_energy);\n            }\n            if self.acquired_delegated_frozen_balance_for_energy != 0 {\n                my_size += ::protobuf::rt::int64_size(4, self.acquired_delegated_frozen_balance_for_energy);\n            }\n            if self.delegated_frozen_balance_for_energy != 0 {\n                my_size += ::protobuf::rt::int64_size(5, self.delegated_frozen_balance_for_energy);\n            }\n            if self.storage_limit != 0 {\n                my_size += ::protobuf::rt::int64_size(6, self.storage_limit);\n            }\n            if self.storage_usage != 0 {\n                my_size += ::protobuf::rt::int64_size(7, self.storage_usage);\n            }\n            if self.latest_exchange_storage_time != 0 {\n                my_size += ::protobuf::rt::int64_size(8, self.latest_exchange_storage_time);\n            }\n            if self.energy_window_size != 0 {\n                my_size += ::protobuf::rt::int64_size(9, self.energy_window_size);\n            }\n            if self.delegated_frozenV2_balance_for_energy != 0 {\n                my_size += ::protobuf::rt::int64_size(10, self.delegated_frozenV2_balance_for_energy);\n            }\n            if self.acquired_delegated_frozenV2_balance_for_energy != 0 {\n                my_size += ::protobuf::rt::int64_size(11, self.acquired_delegated_frozenV2_balance_for_energy);\n            }\n            if self.energy_window_optimized != false {\n                my_size += 1 + 1;\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.energy_usage != 0 {\n                os.write_int64(1, self.energy_usage)?;\n            }\n            if let Some(v) = self.frozen_balance_for_energy.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n            }\n            if self.latest_consume_time_for_energy != 0 {\n                os.write_int64(3, self.latest_consume_time_for_energy)?;\n            }\n            if self.acquired_delegated_frozen_balance_for_energy != 0 {\n                os.write_int64(4, self.acquired_delegated_frozen_balance_for_energy)?;\n            }\n            if self.delegated_frozen_balance_for_energy != 0 {\n                os.write_int64(5, self.delegated_frozen_balance_for_energy)?;\n            }\n            if self.storage_limit != 0 {\n                os.write_int64(6, self.storage_limit)?;\n            }\n            if self.storage_usage != 0 {\n                os.write_int64(7, self.storage_usage)?;\n            }\n            if self.latest_exchange_storage_time != 0 {\n                os.write_int64(8, self.latest_exchange_storage_time)?;\n            }\n            if self.energy_window_size != 0 {\n                os.write_int64(9, self.energy_window_size)?;\n            }\n            if self.delegated_frozenV2_balance_for_energy != 0 {\n                os.write_int64(10, self.delegated_frozenV2_balance_for_energy)?;\n            }\n            if self.acquired_delegated_frozenV2_balance_for_energy != 0 {\n                os.write_int64(11, self.acquired_delegated_frozenV2_balance_for_energy)?;\n            }\n            if self.energy_window_optimized != false {\n                os.write_bool(12, self.energy_window_optimized)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> AccountResource {\n            AccountResource::new()\n        }\n\n        fn clear(&mut self) {\n            self.energy_usage = 0;\n            self.frozen_balance_for_energy.clear();\n            self.latest_consume_time_for_energy = 0;\n            self.acquired_delegated_frozen_balance_for_energy = 0;\n            self.delegated_frozen_balance_for_energy = 0;\n            self.storage_limit = 0;\n            self.storage_usage = 0;\n            self.latest_exchange_storage_time = 0;\n            self.energy_window_size = 0;\n            self.delegated_frozenV2_balance_for_energy = 0;\n            self.acquired_delegated_frozenV2_balance_for_energy = 0;\n            self.energy_window_optimized = false;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static AccountResource {\n            static instance: AccountResource = AccountResource {\n                energy_usage: 0,\n                frozen_balance_for_energy: ::protobuf::MessageField::none(),\n                latest_consume_time_for_energy: 0,\n                acquired_delegated_frozen_balance_for_energy: 0,\n                delegated_frozen_balance_for_energy: 0,\n                storage_limit: 0,\n                storage_usage: 0,\n                latest_exchange_storage_time: 0,\n                energy_window_size: 0,\n                delegated_frozenV2_balance_for_energy: 0,\n                acquired_delegated_frozenV2_balance_for_energy: 0,\n                energy_window_optimized: false,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for AccountResource {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Account.AccountResource\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for AccountResource {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for AccountResource {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.Account.FreezeV2)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct FreezeV2 {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Account.FreezeV2.type)\n        pub type_: ::protobuf::EnumOrUnknown<super::super::common::ResourceCode>,\n        // @@protoc_insertion_point(field:protocol.Account.FreezeV2.amount)\n        pub amount: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Account.FreezeV2.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a FreezeV2 {\n        fn default() -> &'a FreezeV2 {\n            <FreezeV2 as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl FreezeV2 {\n        pub fn new() -> FreezeV2 {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"type\",\n                |m: &FreezeV2| { &m.type_ },\n                |m: &mut FreezeV2| { &mut m.type_ },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"amount\",\n                |m: &FreezeV2| { &m.amount },\n                |m: &mut FreezeV2| { &mut m.amount },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<FreezeV2>(\n                \"Account.FreezeV2\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for FreezeV2 {\n        const NAME: &'static str = \"FreezeV2\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.type_ = is.read_enum_or_unknown()?;\n                    },\n                    16 => {\n                        self.amount = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.type_ != ::protobuf::EnumOrUnknown::new(super::super::common::ResourceCode::BANDWIDTH) {\n                my_size += ::protobuf::rt::int32_size(1, self.type_.value());\n            }\n            if self.amount != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.amount);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.type_ != ::protobuf::EnumOrUnknown::new(super::super::common::ResourceCode::BANDWIDTH) {\n                os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n            }\n            if self.amount != 0 {\n                os.write_int64(2, self.amount)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> FreezeV2 {\n            FreezeV2::new()\n        }\n\n        fn clear(&mut self) {\n            self.type_ = ::protobuf::EnumOrUnknown::new(super::super::common::ResourceCode::BANDWIDTH);\n            self.amount = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static FreezeV2 {\n            static instance: FreezeV2 = FreezeV2 {\n                type_: ::protobuf::EnumOrUnknown::from_i32(0),\n                amount: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for FreezeV2 {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Account.FreezeV2\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for FreezeV2 {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for FreezeV2 {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.Account.UnFreezeV2)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct UnFreezeV2 {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Account.UnFreezeV2.type)\n        pub type_: ::protobuf::EnumOrUnknown<super::super::common::ResourceCode>,\n        // @@protoc_insertion_point(field:protocol.Account.UnFreezeV2.unfreeze_amount)\n        pub unfreeze_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Account.UnFreezeV2.unfreeze_expire_time)\n        pub unfreeze_expire_time: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Account.UnFreezeV2.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a UnFreezeV2 {\n        fn default() -> &'a UnFreezeV2 {\n            <UnFreezeV2 as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl UnFreezeV2 {\n        pub fn new() -> UnFreezeV2 {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(3);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"type\",\n                |m: &UnFreezeV2| { &m.type_ },\n                |m: &mut UnFreezeV2| { &mut m.type_ },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"unfreeze_amount\",\n                |m: &UnFreezeV2| { &m.unfreeze_amount },\n                |m: &mut UnFreezeV2| { &mut m.unfreeze_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"unfreeze_expire_time\",\n                |m: &UnFreezeV2| { &m.unfreeze_expire_time },\n                |m: &mut UnFreezeV2| { &mut m.unfreeze_expire_time },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UnFreezeV2>(\n                \"Account.UnFreezeV2\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for UnFreezeV2 {\n        const NAME: &'static str = \"UnFreezeV2\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.type_ = is.read_enum_or_unknown()?;\n                    },\n                    24 => {\n                        self.unfreeze_amount = is.read_int64()?;\n                    },\n                    32 => {\n                        self.unfreeze_expire_time = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.type_ != ::protobuf::EnumOrUnknown::new(super::super::common::ResourceCode::BANDWIDTH) {\n                my_size += ::protobuf::rt::int32_size(1, self.type_.value());\n            }\n            if self.unfreeze_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(3, self.unfreeze_amount);\n            }\n            if self.unfreeze_expire_time != 0 {\n                my_size += ::protobuf::rt::int64_size(4, self.unfreeze_expire_time);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.type_ != ::protobuf::EnumOrUnknown::new(super::super::common::ResourceCode::BANDWIDTH) {\n                os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n            }\n            if self.unfreeze_amount != 0 {\n                os.write_int64(3, self.unfreeze_amount)?;\n            }\n            if self.unfreeze_expire_time != 0 {\n                os.write_int64(4, self.unfreeze_expire_time)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> UnFreezeV2 {\n            UnFreezeV2::new()\n        }\n\n        fn clear(&mut self) {\n            self.type_ = ::protobuf::EnumOrUnknown::new(super::super::common::ResourceCode::BANDWIDTH);\n            self.unfreeze_amount = 0;\n            self.unfreeze_expire_time = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static UnFreezeV2 {\n            static instance: UnFreezeV2 = UnFreezeV2 {\n                type_: ::protobuf::EnumOrUnknown::from_i32(0),\n                unfreeze_amount: 0,\n                unfreeze_expire_time: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for UnFreezeV2 {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Account.UnFreezeV2\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for UnFreezeV2 {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for UnFreezeV2 {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.Key)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Key {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Key.address)\n    pub address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Key.weight)\n    pub weight: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Key.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Key {\n    fn default() -> &'a Key {\n        <Key as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Key {\n    pub fn new() -> Key {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &Key| { &m.address },\n            |m: &mut Key| { &mut m.address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"weight\",\n            |m: &Key| { &m.weight },\n            |m: &mut Key| { &mut m.weight },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Key>(\n            \"Key\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Key {\n    const NAME: &'static str = \"Key\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.address = is.read_bytes()?;\n                },\n                16 => {\n                    self.weight = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.address);\n        }\n        if self.weight != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.weight);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.address.is_empty() {\n            os.write_bytes(1, &self.address)?;\n        }\n        if self.weight != 0 {\n            os.write_int64(2, self.weight)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Key {\n        Key::new()\n    }\n\n    fn clear(&mut self) {\n        self.address.clear();\n        self.weight = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Key {\n        static instance: Key = Key {\n            address: ::std::vec::Vec::new(),\n            weight: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Key {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Key\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Key {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Key {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.DelegatedResource)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct DelegatedResource {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.DelegatedResource.from)\n    pub from: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.DelegatedResource.to)\n    pub to: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.DelegatedResource.frozen_balance_for_bandwidth)\n    pub frozen_balance_for_bandwidth: i64,\n    // @@protoc_insertion_point(field:protocol.DelegatedResource.frozen_balance_for_energy)\n    pub frozen_balance_for_energy: i64,\n    // @@protoc_insertion_point(field:protocol.DelegatedResource.expire_time_for_bandwidth)\n    pub expire_time_for_bandwidth: i64,\n    // @@protoc_insertion_point(field:protocol.DelegatedResource.expire_time_for_energy)\n    pub expire_time_for_energy: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.DelegatedResource.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a DelegatedResource {\n    fn default() -> &'a DelegatedResource {\n        <DelegatedResource as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl DelegatedResource {\n    pub fn new() -> DelegatedResource {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(6);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"from\",\n            |m: &DelegatedResource| { &m.from },\n            |m: &mut DelegatedResource| { &mut m.from },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"to\",\n            |m: &DelegatedResource| { &m.to },\n            |m: &mut DelegatedResource| { &mut m.to },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"frozen_balance_for_bandwidth\",\n            |m: &DelegatedResource| { &m.frozen_balance_for_bandwidth },\n            |m: &mut DelegatedResource| { &mut m.frozen_balance_for_bandwidth },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"frozen_balance_for_energy\",\n            |m: &DelegatedResource| { &m.frozen_balance_for_energy },\n            |m: &mut DelegatedResource| { &mut m.frozen_balance_for_energy },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"expire_time_for_bandwidth\",\n            |m: &DelegatedResource| { &m.expire_time_for_bandwidth },\n            |m: &mut DelegatedResource| { &mut m.expire_time_for_bandwidth },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"expire_time_for_energy\",\n            |m: &DelegatedResource| { &m.expire_time_for_energy },\n            |m: &mut DelegatedResource| { &mut m.expire_time_for_energy },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DelegatedResource>(\n            \"DelegatedResource\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for DelegatedResource {\n    const NAME: &'static str = \"DelegatedResource\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.from = is.read_bytes()?;\n                },\n                18 => {\n                    self.to = is.read_bytes()?;\n                },\n                24 => {\n                    self.frozen_balance_for_bandwidth = is.read_int64()?;\n                },\n                32 => {\n                    self.frozen_balance_for_energy = is.read_int64()?;\n                },\n                40 => {\n                    self.expire_time_for_bandwidth = is.read_int64()?;\n                },\n                48 => {\n                    self.expire_time_for_energy = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.from.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.from);\n        }\n        if !self.to.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.to);\n        }\n        if self.frozen_balance_for_bandwidth != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.frozen_balance_for_bandwidth);\n        }\n        if self.frozen_balance_for_energy != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.frozen_balance_for_energy);\n        }\n        if self.expire_time_for_bandwidth != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.expire_time_for_bandwidth);\n        }\n        if self.expire_time_for_energy != 0 {\n            my_size += ::protobuf::rt::int64_size(6, self.expire_time_for_energy);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.from.is_empty() {\n            os.write_bytes(1, &self.from)?;\n        }\n        if !self.to.is_empty() {\n            os.write_bytes(2, &self.to)?;\n        }\n        if self.frozen_balance_for_bandwidth != 0 {\n            os.write_int64(3, self.frozen_balance_for_bandwidth)?;\n        }\n        if self.frozen_balance_for_energy != 0 {\n            os.write_int64(4, self.frozen_balance_for_energy)?;\n        }\n        if self.expire_time_for_bandwidth != 0 {\n            os.write_int64(5, self.expire_time_for_bandwidth)?;\n        }\n        if self.expire_time_for_energy != 0 {\n            os.write_int64(6, self.expire_time_for_energy)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> DelegatedResource {\n        DelegatedResource::new()\n    }\n\n    fn clear(&mut self) {\n        self.from.clear();\n        self.to.clear();\n        self.frozen_balance_for_bandwidth = 0;\n        self.frozen_balance_for_energy = 0;\n        self.expire_time_for_bandwidth = 0;\n        self.expire_time_for_energy = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static DelegatedResource {\n        static instance: DelegatedResource = DelegatedResource {\n            from: ::std::vec::Vec::new(),\n            to: ::std::vec::Vec::new(),\n            frozen_balance_for_bandwidth: 0,\n            frozen_balance_for_energy: 0,\n            expire_time_for_bandwidth: 0,\n            expire_time_for_energy: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for DelegatedResource {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"DelegatedResource\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for DelegatedResource {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for DelegatedResource {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.authority)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Authority {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.authority.account)\n    pub account: ::protobuf::MessageField<AccountId>,\n    // @@protoc_insertion_point(field:protocol.authority.permission_name)\n    pub permission_name: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.authority.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Authority {\n    fn default() -> &'a Authority {\n        <Authority as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Authority {\n    pub fn new() -> Authority {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, AccountId>(\n            \"account\",\n            |m: &Authority| { &m.account },\n            |m: &mut Authority| { &mut m.account },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"permission_name\",\n            |m: &Authority| { &m.permission_name },\n            |m: &mut Authority| { &mut m.permission_name },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Authority>(\n            \"authority\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Authority {\n    const NAME: &'static str = \"authority\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.account)?;\n                },\n                18 => {\n                    self.permission_name = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.account.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.permission_name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.permission_name);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.account.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if !self.permission_name.is_empty() {\n            os.write_bytes(2, &self.permission_name)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Authority {\n        Authority::new()\n    }\n\n    fn clear(&mut self) {\n        self.account.clear();\n        self.permission_name.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Authority {\n        static instance: Authority = Authority {\n            account: ::protobuf::MessageField::none(),\n            permission_name: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Authority {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"authority\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Authority {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Authority {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.Permission)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Permission {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Permission.type)\n    pub type_: ::protobuf::EnumOrUnknown<permission::PermissionType>,\n    // @@protoc_insertion_point(field:protocol.Permission.id)\n    pub id: i32,\n    // @@protoc_insertion_point(field:protocol.Permission.permission_name)\n    pub permission_name: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.Permission.threshold)\n    pub threshold: i64,\n    // @@protoc_insertion_point(field:protocol.Permission.parent_id)\n    pub parent_id: i32,\n    // @@protoc_insertion_point(field:protocol.Permission.operations)\n    pub operations: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Permission.keys)\n    pub keys: ::std::vec::Vec<Key>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Permission.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Permission {\n    fn default() -> &'a Permission {\n        <Permission as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Permission {\n    pub fn new() -> Permission {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(7);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &Permission| { &m.type_ },\n            |m: &mut Permission| { &mut m.type_ },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"id\",\n            |m: &Permission| { &m.id },\n            |m: &mut Permission| { &mut m.id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"permission_name\",\n            |m: &Permission| { &m.permission_name },\n            |m: &mut Permission| { &mut m.permission_name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"threshold\",\n            |m: &Permission| { &m.threshold },\n            |m: &mut Permission| { &mut m.threshold },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"parent_id\",\n            |m: &Permission| { &m.parent_id },\n            |m: &mut Permission| { &mut m.parent_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"operations\",\n            |m: &Permission| { &m.operations },\n            |m: &mut Permission| { &mut m.operations },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"keys\",\n            |m: &Permission| { &m.keys },\n            |m: &mut Permission| { &mut m.keys },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Permission>(\n            \"Permission\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Permission {\n    const NAME: &'static str = \"Permission\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.type_ = is.read_enum_or_unknown()?;\n                },\n                16 => {\n                    self.id = is.read_int32()?;\n                },\n                26 => {\n                    self.permission_name = is.read_string()?;\n                },\n                32 => {\n                    self.threshold = is.read_int64()?;\n                },\n                40 => {\n                    self.parent_id = is.read_int32()?;\n                },\n                50 => {\n                    self.operations = is.read_bytes()?;\n                },\n                58 => {\n                    self.keys.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.type_ != ::protobuf::EnumOrUnknown::new(permission::PermissionType::Owner) {\n            my_size += ::protobuf::rt::int32_size(1, self.type_.value());\n        }\n        if self.id != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.id);\n        }\n        if !self.permission_name.is_empty() {\n            my_size += ::protobuf::rt::string_size(3, &self.permission_name);\n        }\n        if self.threshold != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.threshold);\n        }\n        if self.parent_id != 0 {\n            my_size += ::protobuf::rt::int32_size(5, self.parent_id);\n        }\n        if !self.operations.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.operations);\n        }\n        for value in &self.keys {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.type_ != ::protobuf::EnumOrUnknown::new(permission::PermissionType::Owner) {\n            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n        }\n        if self.id != 0 {\n            os.write_int32(2, self.id)?;\n        }\n        if !self.permission_name.is_empty() {\n            os.write_string(3, &self.permission_name)?;\n        }\n        if self.threshold != 0 {\n            os.write_int64(4, self.threshold)?;\n        }\n        if self.parent_id != 0 {\n            os.write_int32(5, self.parent_id)?;\n        }\n        if !self.operations.is_empty() {\n            os.write_bytes(6, &self.operations)?;\n        }\n        for v in &self.keys {\n            ::protobuf::rt::write_message_field_with_cached_size(7, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Permission {\n        Permission::new()\n    }\n\n    fn clear(&mut self) {\n        self.type_ = ::protobuf::EnumOrUnknown::new(permission::PermissionType::Owner);\n        self.id = 0;\n        self.permission_name.clear();\n        self.threshold = 0;\n        self.parent_id = 0;\n        self.operations.clear();\n        self.keys.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Permission {\n        static instance: Permission = Permission {\n            type_: ::protobuf::EnumOrUnknown::from_i32(0),\n            id: 0,\n            permission_name: ::std::string::String::new(),\n            threshold: 0,\n            parent_id: 0,\n            operations: ::std::vec::Vec::new(),\n            keys: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Permission {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Permission\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Permission {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Permission {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `Permission`\npub mod permission {\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.Permission.PermissionType)\n    pub enum PermissionType {\n        // @@protoc_insertion_point(enum_value:protocol.Permission.PermissionType.Owner)\n        Owner = 0,\n        // @@protoc_insertion_point(enum_value:protocol.Permission.PermissionType.Witness)\n        Witness = 1,\n        // @@protoc_insertion_point(enum_value:protocol.Permission.PermissionType.Active)\n        Active = 2,\n    }\n\n    impl ::protobuf::Enum for PermissionType {\n        const NAME: &'static str = \"PermissionType\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<PermissionType> {\n            match value {\n                0 => ::std::option::Option::Some(PermissionType::Owner),\n                1 => ::std::option::Option::Some(PermissionType::Witness),\n                2 => ::std::option::Option::Some(PermissionType::Active),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<PermissionType> {\n            match str {\n                \"Owner\" => ::std::option::Option::Some(PermissionType::Owner),\n                \"Witness\" => ::std::option::Option::Some(PermissionType::Witness),\n                \"Active\" => ::std::option::Option::Some(PermissionType::Active),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [PermissionType] = &[\n            PermissionType::Owner,\n            PermissionType::Witness,\n            PermissionType::Active,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for PermissionType {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"Permission.PermissionType\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for PermissionType {\n        fn default() -> Self {\n            PermissionType::Owner\n        }\n    }\n\n    impl PermissionType {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<PermissionType>(\"Permission.PermissionType\")\n        }\n    }\n}\n\n///  Witness\n// @@protoc_insertion_point(message:protocol.Witness)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Witness {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Witness.address)\n    pub address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Witness.voteCount)\n    pub voteCount: i64,\n    // @@protoc_insertion_point(field:protocol.Witness.pubKey)\n    pub pubKey: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Witness.url)\n    pub url: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.Witness.totalProduced)\n    pub totalProduced: i64,\n    // @@protoc_insertion_point(field:protocol.Witness.totalMissed)\n    pub totalMissed: i64,\n    // @@protoc_insertion_point(field:protocol.Witness.latestBlockNum)\n    pub latestBlockNum: i64,\n    // @@protoc_insertion_point(field:protocol.Witness.latestSlotNum)\n    pub latestSlotNum: i64,\n    // @@protoc_insertion_point(field:protocol.Witness.isJobs)\n    pub isJobs: bool,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Witness.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Witness {\n    fn default() -> &'a Witness {\n        <Witness as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Witness {\n    pub fn new() -> Witness {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(9);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &Witness| { &m.address },\n            |m: &mut Witness| { &mut m.address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"voteCount\",\n            |m: &Witness| { &m.voteCount },\n            |m: &mut Witness| { &mut m.voteCount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"pubKey\",\n            |m: &Witness| { &m.pubKey },\n            |m: &mut Witness| { &mut m.pubKey },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"url\",\n            |m: &Witness| { &m.url },\n            |m: &mut Witness| { &mut m.url },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"totalProduced\",\n            |m: &Witness| { &m.totalProduced },\n            |m: &mut Witness| { &mut m.totalProduced },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"totalMissed\",\n            |m: &Witness| { &m.totalMissed },\n            |m: &mut Witness| { &mut m.totalMissed },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"latestBlockNum\",\n            |m: &Witness| { &m.latestBlockNum },\n            |m: &mut Witness| { &mut m.latestBlockNum },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"latestSlotNum\",\n            |m: &Witness| { &m.latestSlotNum },\n            |m: &mut Witness| { &mut m.latestSlotNum },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"isJobs\",\n            |m: &Witness| { &m.isJobs },\n            |m: &mut Witness| { &mut m.isJobs },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Witness>(\n            \"Witness\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Witness {\n    const NAME: &'static str = \"Witness\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.address = is.read_bytes()?;\n                },\n                16 => {\n                    self.voteCount = is.read_int64()?;\n                },\n                26 => {\n                    self.pubKey = is.read_bytes()?;\n                },\n                34 => {\n                    self.url = is.read_string()?;\n                },\n                40 => {\n                    self.totalProduced = is.read_int64()?;\n                },\n                48 => {\n                    self.totalMissed = is.read_int64()?;\n                },\n                56 => {\n                    self.latestBlockNum = is.read_int64()?;\n                },\n                64 => {\n                    self.latestSlotNum = is.read_int64()?;\n                },\n                72 => {\n                    self.isJobs = is.read_bool()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.address);\n        }\n        if self.voteCount != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.voteCount);\n        }\n        if !self.pubKey.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.pubKey);\n        }\n        if !self.url.is_empty() {\n            my_size += ::protobuf::rt::string_size(4, &self.url);\n        }\n        if self.totalProduced != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.totalProduced);\n        }\n        if self.totalMissed != 0 {\n            my_size += ::protobuf::rt::int64_size(6, self.totalMissed);\n        }\n        if self.latestBlockNum != 0 {\n            my_size += ::protobuf::rt::int64_size(7, self.latestBlockNum);\n        }\n        if self.latestSlotNum != 0 {\n            my_size += ::protobuf::rt::int64_size(8, self.latestSlotNum);\n        }\n        if self.isJobs != false {\n            my_size += 1 + 1;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.address.is_empty() {\n            os.write_bytes(1, &self.address)?;\n        }\n        if self.voteCount != 0 {\n            os.write_int64(2, self.voteCount)?;\n        }\n        if !self.pubKey.is_empty() {\n            os.write_bytes(3, &self.pubKey)?;\n        }\n        if !self.url.is_empty() {\n            os.write_string(4, &self.url)?;\n        }\n        if self.totalProduced != 0 {\n            os.write_int64(5, self.totalProduced)?;\n        }\n        if self.totalMissed != 0 {\n            os.write_int64(6, self.totalMissed)?;\n        }\n        if self.latestBlockNum != 0 {\n            os.write_int64(7, self.latestBlockNum)?;\n        }\n        if self.latestSlotNum != 0 {\n            os.write_int64(8, self.latestSlotNum)?;\n        }\n        if self.isJobs != false {\n            os.write_bool(9, self.isJobs)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Witness {\n        Witness::new()\n    }\n\n    fn clear(&mut self) {\n        self.address.clear();\n        self.voteCount = 0;\n        self.pubKey.clear();\n        self.url.clear();\n        self.totalProduced = 0;\n        self.totalMissed = 0;\n        self.latestBlockNum = 0;\n        self.latestSlotNum = 0;\n        self.isJobs = false;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Witness {\n        static instance: Witness = Witness {\n            address: ::std::vec::Vec::new(),\n            voteCount: 0,\n            pubKey: ::std::vec::Vec::new(),\n            url: ::std::string::String::new(),\n            totalProduced: 0,\n            totalMissed: 0,\n            latestBlockNum: 0,\n            latestSlotNum: 0,\n            isJobs: false,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Witness {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Witness\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Witness {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Witness {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n///  Vote Change\n// @@protoc_insertion_point(message:protocol.Votes)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Votes {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Votes.address)\n    pub address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.Votes.old_votes)\n    pub old_votes: ::std::vec::Vec<Vote>,\n    // @@protoc_insertion_point(field:protocol.Votes.new_votes)\n    pub new_votes: ::std::vec::Vec<Vote>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Votes.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Votes {\n    fn default() -> &'a Votes {\n        <Votes as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Votes {\n    pub fn new() -> Votes {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &Votes| { &m.address },\n            |m: &mut Votes| { &mut m.address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"old_votes\",\n            |m: &Votes| { &m.old_votes },\n            |m: &mut Votes| { &mut m.old_votes },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"new_votes\",\n            |m: &Votes| { &m.new_votes },\n            |m: &mut Votes| { &mut m.new_votes },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Votes>(\n            \"Votes\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Votes {\n    const NAME: &'static str = \"Votes\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.address = is.read_bytes()?;\n                },\n                18 => {\n                    self.old_votes.push(is.read_message()?);\n                },\n                26 => {\n                    self.new_votes.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.address);\n        }\n        for value in &self.old_votes {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.new_votes {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.address.is_empty() {\n            os.write_bytes(1, &self.address)?;\n        }\n        for v in &self.old_votes {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        };\n        for v in &self.new_votes {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Votes {\n        Votes::new()\n    }\n\n    fn clear(&mut self) {\n        self.address.clear();\n        self.old_votes.clear();\n        self.new_votes.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Votes {\n        static instance: Votes = Votes {\n            address: ::std::vec::Vec::new(),\n            old_votes: ::std::vec::Vec::new(),\n            new_votes: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Votes {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Votes\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Votes {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Votes {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.TXOutput)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TXOutput {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TXOutput.value)\n    pub value: i64,\n    // @@protoc_insertion_point(field:protocol.TXOutput.pubKeyHash)\n    pub pubKeyHash: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TXOutput.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TXOutput {\n    fn default() -> &'a TXOutput {\n        <TXOutput as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TXOutput {\n    pub fn new() -> TXOutput {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"value\",\n            |m: &TXOutput| { &m.value },\n            |m: &mut TXOutput| { &mut m.value },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"pubKeyHash\",\n            |m: &TXOutput| { &m.pubKeyHash },\n            |m: &mut TXOutput| { &mut m.pubKeyHash },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TXOutput>(\n            \"TXOutput\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TXOutput {\n    const NAME: &'static str = \"TXOutput\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.value = is.read_int64()?;\n                },\n                18 => {\n                    self.pubKeyHash = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.value != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.value);\n        }\n        if !self.pubKeyHash.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.pubKeyHash);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.value != 0 {\n            os.write_int64(1, self.value)?;\n        }\n        if !self.pubKeyHash.is_empty() {\n            os.write_bytes(2, &self.pubKeyHash)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TXOutput {\n        TXOutput::new()\n    }\n\n    fn clear(&mut self) {\n        self.value = 0;\n        self.pubKeyHash.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TXOutput {\n        static instance: TXOutput = TXOutput {\n            value: 0,\n            pubKeyHash: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TXOutput {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TXOutput\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TXOutput {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TXOutput {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.TXInput)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TXInput {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TXInput.raw_data)\n    pub raw_data: ::protobuf::MessageField<txinput::Raw>,\n    // @@protoc_insertion_point(field:protocol.TXInput.signature)\n    pub signature: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TXInput.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TXInput {\n    fn default() -> &'a TXInput {\n        <TXInput as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TXInput {\n    pub fn new() -> TXInput {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, txinput::Raw>(\n            \"raw_data\",\n            |m: &TXInput| { &m.raw_data },\n            |m: &mut TXInput| { &mut m.raw_data },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"signature\",\n            |m: &TXInput| { &m.signature },\n            |m: &mut TXInput| { &mut m.signature },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TXInput>(\n            \"TXInput\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TXInput {\n    const NAME: &'static str = \"TXInput\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.raw_data)?;\n                },\n                34 => {\n                    self.signature = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.raw_data.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.signature.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.signature);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.raw_data.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if !self.signature.is_empty() {\n            os.write_bytes(4, &self.signature)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TXInput {\n        TXInput::new()\n    }\n\n    fn clear(&mut self) {\n        self.raw_data.clear();\n        self.signature.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TXInput {\n        static instance: TXInput = TXInput {\n            raw_data: ::protobuf::MessageField::none(),\n            signature: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TXInput {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TXInput\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TXInput {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TXInput {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `TXInput`\npub mod txinput {\n    // @@protoc_insertion_point(message:protocol.TXInput.raw)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Raw {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.TXInput.raw.txID)\n        pub txID: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.TXInput.raw.vout)\n        pub vout: i64,\n        // @@protoc_insertion_point(field:protocol.TXInput.raw.pubKey)\n        pub pubKey: ::std::vec::Vec<u8>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.TXInput.raw.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Raw {\n        fn default() -> &'a Raw {\n            <Raw as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Raw {\n        pub fn new() -> Raw {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(3);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"txID\",\n                |m: &Raw| { &m.txID },\n                |m: &mut Raw| { &mut m.txID },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"vout\",\n                |m: &Raw| { &m.vout },\n                |m: &mut Raw| { &mut m.vout },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"pubKey\",\n                |m: &Raw| { &m.pubKey },\n                |m: &mut Raw| { &mut m.pubKey },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Raw>(\n                \"TXInput.raw\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Raw {\n        const NAME: &'static str = \"raw\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.txID = is.read_bytes()?;\n                    },\n                    16 => {\n                        self.vout = is.read_int64()?;\n                    },\n                    26 => {\n                        self.pubKey = is.read_bytes()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.txID.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.txID);\n            }\n            if self.vout != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.vout);\n            }\n            if !self.pubKey.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(3, &self.pubKey);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.txID.is_empty() {\n                os.write_bytes(1, &self.txID)?;\n            }\n            if self.vout != 0 {\n                os.write_int64(2, self.vout)?;\n            }\n            if !self.pubKey.is_empty() {\n                os.write_bytes(3, &self.pubKey)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Raw {\n            Raw::new()\n        }\n\n        fn clear(&mut self) {\n            self.txID.clear();\n            self.vout = 0;\n            self.pubKey.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Raw {\n            static instance: Raw = Raw {\n                txID: ::std::vec::Vec::new(),\n                vout: 0,\n                pubKey: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Raw {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"TXInput.raw\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Raw {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Raw {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.TXOutputs)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TXOutputs {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TXOutputs.outputs)\n    pub outputs: ::std::vec::Vec<TXOutput>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TXOutputs.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TXOutputs {\n    fn default() -> &'a TXOutputs {\n        <TXOutputs as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TXOutputs {\n    pub fn new() -> TXOutputs {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"outputs\",\n            |m: &TXOutputs| { &m.outputs },\n            |m: &mut TXOutputs| { &mut m.outputs },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TXOutputs>(\n            \"TXOutputs\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TXOutputs {\n    const NAME: &'static str = \"TXOutputs\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.outputs.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.outputs {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.outputs {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TXOutputs {\n        TXOutputs::new()\n    }\n\n    fn clear(&mut self) {\n        self.outputs.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TXOutputs {\n        static instance: TXOutputs = TXOutputs {\n            outputs: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TXOutputs {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TXOutputs\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TXOutputs {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TXOutputs {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ResourceReceipt)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ResourceReceipt {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.energy_usage)\n    pub energy_usage: i64,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.energy_fee)\n    pub energy_fee: i64,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.origin_energy_usage)\n    pub origin_energy_usage: i64,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.energy_usage_total)\n    pub energy_usage_total: i64,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.net_usage)\n    pub net_usage: i64,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.net_fee)\n    pub net_fee: i64,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.result)\n    pub result: ::protobuf::EnumOrUnknown<transaction::result::ContractResult>,\n    // @@protoc_insertion_point(field:protocol.ResourceReceipt.energy_penalty_total)\n    pub energy_penalty_total: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ResourceReceipt.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ResourceReceipt {\n    fn default() -> &'a ResourceReceipt {\n        <ResourceReceipt as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ResourceReceipt {\n    pub fn new() -> ResourceReceipt {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(8);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"energy_usage\",\n            |m: &ResourceReceipt| { &m.energy_usage },\n            |m: &mut ResourceReceipt| { &mut m.energy_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"energy_fee\",\n            |m: &ResourceReceipt| { &m.energy_fee },\n            |m: &mut ResourceReceipt| { &mut m.energy_fee },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"origin_energy_usage\",\n            |m: &ResourceReceipt| { &m.origin_energy_usage },\n            |m: &mut ResourceReceipt| { &mut m.origin_energy_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"energy_usage_total\",\n            |m: &ResourceReceipt| { &m.energy_usage_total },\n            |m: &mut ResourceReceipt| { &mut m.energy_usage_total },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"net_usage\",\n            |m: &ResourceReceipt| { &m.net_usage },\n            |m: &mut ResourceReceipt| { &mut m.net_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"net_fee\",\n            |m: &ResourceReceipt| { &m.net_fee },\n            |m: &mut ResourceReceipt| { &mut m.net_fee },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"result\",\n            |m: &ResourceReceipt| { &m.result },\n            |m: &mut ResourceReceipt| { &mut m.result },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"energy_penalty_total\",\n            |m: &ResourceReceipt| { &m.energy_penalty_total },\n            |m: &mut ResourceReceipt| { &mut m.energy_penalty_total },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ResourceReceipt>(\n            \"ResourceReceipt\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ResourceReceipt {\n    const NAME: &'static str = \"ResourceReceipt\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.energy_usage = is.read_int64()?;\n                },\n                16 => {\n                    self.energy_fee = is.read_int64()?;\n                },\n                24 => {\n                    self.origin_energy_usage = is.read_int64()?;\n                },\n                32 => {\n                    self.energy_usage_total = is.read_int64()?;\n                },\n                40 => {\n                    self.net_usage = is.read_int64()?;\n                },\n                48 => {\n                    self.net_fee = is.read_int64()?;\n                },\n                56 => {\n                    self.result = is.read_enum_or_unknown()?;\n                },\n                64 => {\n                    self.energy_penalty_total = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.energy_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.energy_usage);\n        }\n        if self.energy_fee != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.energy_fee);\n        }\n        if self.origin_energy_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.origin_energy_usage);\n        }\n        if self.energy_usage_total != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.energy_usage_total);\n        }\n        if self.net_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.net_usage);\n        }\n        if self.net_fee != 0 {\n            my_size += ::protobuf::rt::int64_size(6, self.net_fee);\n        }\n        if self.result != ::protobuf::EnumOrUnknown::new(transaction::result::ContractResult::DEFAULT) {\n            my_size += ::protobuf::rt::int32_size(7, self.result.value());\n        }\n        if self.energy_penalty_total != 0 {\n            my_size += ::protobuf::rt::int64_size(8, self.energy_penalty_total);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.energy_usage != 0 {\n            os.write_int64(1, self.energy_usage)?;\n        }\n        if self.energy_fee != 0 {\n            os.write_int64(2, self.energy_fee)?;\n        }\n        if self.origin_energy_usage != 0 {\n            os.write_int64(3, self.origin_energy_usage)?;\n        }\n        if self.energy_usage_total != 0 {\n            os.write_int64(4, self.energy_usage_total)?;\n        }\n        if self.net_usage != 0 {\n            os.write_int64(5, self.net_usage)?;\n        }\n        if self.net_fee != 0 {\n            os.write_int64(6, self.net_fee)?;\n        }\n        if self.result != ::protobuf::EnumOrUnknown::new(transaction::result::ContractResult::DEFAULT) {\n            os.write_enum(7, ::protobuf::EnumOrUnknown::value(&self.result))?;\n        }\n        if self.energy_penalty_total != 0 {\n            os.write_int64(8, self.energy_penalty_total)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ResourceReceipt {\n        ResourceReceipt::new()\n    }\n\n    fn clear(&mut self) {\n        self.energy_usage = 0;\n        self.energy_fee = 0;\n        self.origin_energy_usage = 0;\n        self.energy_usage_total = 0;\n        self.net_usage = 0;\n        self.net_fee = 0;\n        self.result = ::protobuf::EnumOrUnknown::new(transaction::result::ContractResult::DEFAULT);\n        self.energy_penalty_total = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ResourceReceipt {\n        static instance: ResourceReceipt = ResourceReceipt {\n            energy_usage: 0,\n            energy_fee: 0,\n            origin_energy_usage: 0,\n            energy_usage_total: 0,\n            net_usage: 0,\n            net_fee: 0,\n            result: ::protobuf::EnumOrUnknown::from_i32(0),\n            energy_penalty_total: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ResourceReceipt {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ResourceReceipt\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ResourceReceipt {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ResourceReceipt {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketOrderDetail)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketOrderDetail {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketOrderDetail.makerOrderId)\n    pub makerOrderId: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrderDetail.takerOrderId)\n    pub takerOrderId: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketOrderDetail.fillSellQuantity)\n    pub fillSellQuantity: i64,\n    // @@protoc_insertion_point(field:protocol.MarketOrderDetail.fillBuyQuantity)\n    pub fillBuyQuantity: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketOrderDetail.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketOrderDetail {\n    fn default() -> &'a MarketOrderDetail {\n        <MarketOrderDetail as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketOrderDetail {\n    pub fn new() -> MarketOrderDetail {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"makerOrderId\",\n            |m: &MarketOrderDetail| { &m.makerOrderId },\n            |m: &mut MarketOrderDetail| { &mut m.makerOrderId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"takerOrderId\",\n            |m: &MarketOrderDetail| { &m.takerOrderId },\n            |m: &mut MarketOrderDetail| { &mut m.takerOrderId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"fillSellQuantity\",\n            |m: &MarketOrderDetail| { &m.fillSellQuantity },\n            |m: &mut MarketOrderDetail| { &mut m.fillSellQuantity },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"fillBuyQuantity\",\n            |m: &MarketOrderDetail| { &m.fillBuyQuantity },\n            |m: &mut MarketOrderDetail| { &mut m.fillBuyQuantity },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketOrderDetail>(\n            \"MarketOrderDetail\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketOrderDetail {\n    const NAME: &'static str = \"MarketOrderDetail\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.makerOrderId = is.read_bytes()?;\n                },\n                18 => {\n                    self.takerOrderId = is.read_bytes()?;\n                },\n                24 => {\n                    self.fillSellQuantity = is.read_int64()?;\n                },\n                32 => {\n                    self.fillBuyQuantity = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.makerOrderId.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.makerOrderId);\n        }\n        if !self.takerOrderId.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.takerOrderId);\n        }\n        if self.fillSellQuantity != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.fillSellQuantity);\n        }\n        if self.fillBuyQuantity != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.fillBuyQuantity);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.makerOrderId.is_empty() {\n            os.write_bytes(1, &self.makerOrderId)?;\n        }\n        if !self.takerOrderId.is_empty() {\n            os.write_bytes(2, &self.takerOrderId)?;\n        }\n        if self.fillSellQuantity != 0 {\n            os.write_int64(3, self.fillSellQuantity)?;\n        }\n        if self.fillBuyQuantity != 0 {\n            os.write_int64(4, self.fillBuyQuantity)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketOrderDetail {\n        MarketOrderDetail::new()\n    }\n\n    fn clear(&mut self) {\n        self.makerOrderId.clear();\n        self.takerOrderId.clear();\n        self.fillSellQuantity = 0;\n        self.fillBuyQuantity = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketOrderDetail {\n        static instance: MarketOrderDetail = MarketOrderDetail {\n            makerOrderId: ::std::vec::Vec::new(),\n            takerOrderId: ::std::vec::Vec::new(),\n            fillSellQuantity: 0,\n            fillBuyQuantity: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketOrderDetail {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketOrderDetail\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketOrderDetail {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketOrderDetail {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.Transaction)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Transaction {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Transaction.raw_data)\n    pub raw_data: ::protobuf::MessageField<transaction::Raw>,\n    ///  only support size = 1,  repeated list here for muti-sig extension\n    // @@protoc_insertion_point(field:protocol.Transaction.signature)\n    pub signature: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.Transaction.ret)\n    pub ret: ::std::vec::Vec<transaction::Result>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Transaction.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Transaction {\n    fn default() -> &'a Transaction {\n        <Transaction as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Transaction {\n    pub fn new() -> Transaction {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, transaction::Raw>(\n            \"raw_data\",\n            |m: &Transaction| { &m.raw_data },\n            |m: &mut Transaction| { &mut m.raw_data },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"signature\",\n            |m: &Transaction| { &m.signature },\n            |m: &mut Transaction| { &mut m.signature },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"ret\",\n            |m: &Transaction| { &m.ret },\n            |m: &mut Transaction| { &mut m.ret },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Transaction>(\n            \"Transaction\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Transaction {\n    const NAME: &'static str = \"Transaction\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.raw_data)?;\n                },\n                18 => {\n                    self.signature.push(is.read_bytes()?);\n                },\n                42 => {\n                    self.ret.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.raw_data.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.signature {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        for value in &self.ret {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.raw_data.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        for v in &self.signature {\n            os.write_bytes(2, &v)?;\n        };\n        for v in &self.ret {\n            ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Transaction {\n        Transaction::new()\n    }\n\n    fn clear(&mut self) {\n        self.raw_data.clear();\n        self.signature.clear();\n        self.ret.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Transaction {\n        static instance: Transaction = Transaction {\n            raw_data: ::protobuf::MessageField::none(),\n            signature: ::std::vec::Vec::new(),\n            ret: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Transaction {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Transaction\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Transaction {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Transaction {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `Transaction`\npub mod transaction {\n    // @@protoc_insertion_point(message:protocol.Transaction.Contract)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Contract {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Transaction.Contract.type)\n        pub type_: ::protobuf::EnumOrUnknown<contract::ContractType>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Contract.parameter)\n        pub parameter: ::protobuf::MessageField<::protobuf::well_known_types::any::Any>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Contract.provider)\n        pub provider: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Contract.ContractName)\n        pub ContractName: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Contract.Permission_id)\n        pub Permission_id: i32,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Transaction.Contract.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Contract {\n        fn default() -> &'a Contract {\n            <Contract as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Contract {\n        pub fn new() -> Contract {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(5);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"type\",\n                |m: &Contract| { &m.type_ },\n                |m: &mut Contract| { &mut m.type_ },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::any::Any>(\n                \"parameter\",\n                |m: &Contract| { &m.parameter },\n                |m: &mut Contract| { &mut m.parameter },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"provider\",\n                |m: &Contract| { &m.provider },\n                |m: &mut Contract| { &mut m.provider },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"ContractName\",\n                |m: &Contract| { &m.ContractName },\n                |m: &mut Contract| { &mut m.ContractName },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"Permission_id\",\n                |m: &Contract| { &m.Permission_id },\n                |m: &mut Contract| { &mut m.Permission_id },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Contract>(\n                \"Transaction.Contract\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Contract {\n        const NAME: &'static str = \"Contract\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.type_ = is.read_enum_or_unknown()?;\n                    },\n                    18 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.parameter)?;\n                    },\n                    26 => {\n                        self.provider = is.read_bytes()?;\n                    },\n                    34 => {\n                        self.ContractName = is.read_bytes()?;\n                    },\n                    40 => {\n                        self.Permission_id = is.read_int32()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.type_ != ::protobuf::EnumOrUnknown::new(contract::ContractType::AccountCreateContract) {\n                my_size += ::protobuf::rt::int32_size(1, self.type_.value());\n            }\n            if let Some(v) = self.parameter.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if !self.provider.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(3, &self.provider);\n            }\n            if !self.ContractName.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(4, &self.ContractName);\n            }\n            if self.Permission_id != 0 {\n                my_size += ::protobuf::rt::int32_size(5, self.Permission_id);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.type_ != ::protobuf::EnumOrUnknown::new(contract::ContractType::AccountCreateContract) {\n                os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n            }\n            if let Some(v) = self.parameter.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n            }\n            if !self.provider.is_empty() {\n                os.write_bytes(3, &self.provider)?;\n            }\n            if !self.ContractName.is_empty() {\n                os.write_bytes(4, &self.ContractName)?;\n            }\n            if self.Permission_id != 0 {\n                os.write_int32(5, self.Permission_id)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Contract {\n            Contract::new()\n        }\n\n        fn clear(&mut self) {\n            self.type_ = ::protobuf::EnumOrUnknown::new(contract::ContractType::AccountCreateContract);\n            self.parameter.clear();\n            self.provider.clear();\n            self.ContractName.clear();\n            self.Permission_id = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Contract {\n            static instance: Contract = Contract {\n                type_: ::protobuf::EnumOrUnknown::from_i32(0),\n                parameter: ::protobuf::MessageField::none(),\n                provider: ::std::vec::Vec::new(),\n                ContractName: ::std::vec::Vec::new(),\n                Permission_id: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Contract {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Transaction.Contract\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Contract {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Contract {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    /// Nested message and enums of message `Contract`\n    pub mod contract {\n        #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n        // @@protoc_insertion_point(enum:protocol.Transaction.Contract.ContractType)\n        pub enum ContractType {\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.AccountCreateContract)\n            AccountCreateContract = 0,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.TransferContract)\n            TransferContract = 1,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.TransferAssetContract)\n            TransferAssetContract = 2,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.VoteAssetContract)\n            VoteAssetContract = 3,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.VoteWitnessContract)\n            VoteWitnessContract = 4,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.WitnessCreateContract)\n            WitnessCreateContract = 5,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.AssetIssueContract)\n            AssetIssueContract = 6,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.WitnessUpdateContract)\n            WitnessUpdateContract = 8,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ParticipateAssetIssueContract)\n            ParticipateAssetIssueContract = 9,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.AccountUpdateContract)\n            AccountUpdateContract = 10,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.FreezeBalanceContract)\n            FreezeBalanceContract = 11,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UnfreezeBalanceContract)\n            UnfreezeBalanceContract = 12,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.WithdrawBalanceContract)\n            WithdrawBalanceContract = 13,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UnfreezeAssetContract)\n            UnfreezeAssetContract = 14,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UpdateAssetContract)\n            UpdateAssetContract = 15,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ProposalCreateContract)\n            ProposalCreateContract = 16,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ProposalApproveContract)\n            ProposalApproveContract = 17,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ProposalDeleteContract)\n            ProposalDeleteContract = 18,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.SetAccountIdContract)\n            SetAccountIdContract = 19,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.CustomContract)\n            CustomContract = 20,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.CreateSmartContract)\n            CreateSmartContract = 30,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.TriggerSmartContract)\n            TriggerSmartContract = 31,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.GetContract)\n            GetContract = 32,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UpdateSettingContract)\n            UpdateSettingContract = 33,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ExchangeCreateContract)\n            ExchangeCreateContract = 41,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ExchangeInjectContract)\n            ExchangeInjectContract = 42,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ExchangeWithdrawContract)\n            ExchangeWithdrawContract = 43,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ExchangeTransactionContract)\n            ExchangeTransactionContract = 44,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UpdateEnergyLimitContract)\n            UpdateEnergyLimitContract = 45,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.AccountPermissionUpdateContract)\n            AccountPermissionUpdateContract = 46,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ClearABIContract)\n            ClearABIContract = 48,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UpdateBrokerageContract)\n            UpdateBrokerageContract = 49,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.ShieldedTransferContract)\n            ShieldedTransferContract = 51,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.MarketSellAssetContract)\n            MarketSellAssetContract = 52,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.MarketCancelOrderContract)\n            MarketCancelOrderContract = 53,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.FreezeBalanceV2Contract)\n            FreezeBalanceV2Contract = 54,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UnfreezeBalanceV2Contract)\n            UnfreezeBalanceV2Contract = 55,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.WithdrawExpireUnfreezeContract)\n            WithdrawExpireUnfreezeContract = 56,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.DelegateResourceContract)\n            DelegateResourceContract = 57,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.UnDelegateResourceContract)\n            UnDelegateResourceContract = 58,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Contract.ContractType.CancelAllUnfreezeV2Contract)\n            CancelAllUnfreezeV2Contract = 59,\n        }\n\n        impl ::protobuf::Enum for ContractType {\n            const NAME: &'static str = \"ContractType\";\n\n            fn value(&self) -> i32 {\n                *self as i32\n            }\n\n            fn from_i32(value: i32) -> ::std::option::Option<ContractType> {\n                match value {\n                    0 => ::std::option::Option::Some(ContractType::AccountCreateContract),\n                    1 => ::std::option::Option::Some(ContractType::TransferContract),\n                    2 => ::std::option::Option::Some(ContractType::TransferAssetContract),\n                    3 => ::std::option::Option::Some(ContractType::VoteAssetContract),\n                    4 => ::std::option::Option::Some(ContractType::VoteWitnessContract),\n                    5 => ::std::option::Option::Some(ContractType::WitnessCreateContract),\n                    6 => ::std::option::Option::Some(ContractType::AssetIssueContract),\n                    8 => ::std::option::Option::Some(ContractType::WitnessUpdateContract),\n                    9 => ::std::option::Option::Some(ContractType::ParticipateAssetIssueContract),\n                    10 => ::std::option::Option::Some(ContractType::AccountUpdateContract),\n                    11 => ::std::option::Option::Some(ContractType::FreezeBalanceContract),\n                    12 => ::std::option::Option::Some(ContractType::UnfreezeBalanceContract),\n                    13 => ::std::option::Option::Some(ContractType::WithdrawBalanceContract),\n                    14 => ::std::option::Option::Some(ContractType::UnfreezeAssetContract),\n                    15 => ::std::option::Option::Some(ContractType::UpdateAssetContract),\n                    16 => ::std::option::Option::Some(ContractType::ProposalCreateContract),\n                    17 => ::std::option::Option::Some(ContractType::ProposalApproveContract),\n                    18 => ::std::option::Option::Some(ContractType::ProposalDeleteContract),\n                    19 => ::std::option::Option::Some(ContractType::SetAccountIdContract),\n                    20 => ::std::option::Option::Some(ContractType::CustomContract),\n                    30 => ::std::option::Option::Some(ContractType::CreateSmartContract),\n                    31 => ::std::option::Option::Some(ContractType::TriggerSmartContract),\n                    32 => ::std::option::Option::Some(ContractType::GetContract),\n                    33 => ::std::option::Option::Some(ContractType::UpdateSettingContract),\n                    41 => ::std::option::Option::Some(ContractType::ExchangeCreateContract),\n                    42 => ::std::option::Option::Some(ContractType::ExchangeInjectContract),\n                    43 => ::std::option::Option::Some(ContractType::ExchangeWithdrawContract),\n                    44 => ::std::option::Option::Some(ContractType::ExchangeTransactionContract),\n                    45 => ::std::option::Option::Some(ContractType::UpdateEnergyLimitContract),\n                    46 => ::std::option::Option::Some(ContractType::AccountPermissionUpdateContract),\n                    48 => ::std::option::Option::Some(ContractType::ClearABIContract),\n                    49 => ::std::option::Option::Some(ContractType::UpdateBrokerageContract),\n                    51 => ::std::option::Option::Some(ContractType::ShieldedTransferContract),\n                    52 => ::std::option::Option::Some(ContractType::MarketSellAssetContract),\n                    53 => ::std::option::Option::Some(ContractType::MarketCancelOrderContract),\n                    54 => ::std::option::Option::Some(ContractType::FreezeBalanceV2Contract),\n                    55 => ::std::option::Option::Some(ContractType::UnfreezeBalanceV2Contract),\n                    56 => ::std::option::Option::Some(ContractType::WithdrawExpireUnfreezeContract),\n                    57 => ::std::option::Option::Some(ContractType::DelegateResourceContract),\n                    58 => ::std::option::Option::Some(ContractType::UnDelegateResourceContract),\n                    59 => ::std::option::Option::Some(ContractType::CancelAllUnfreezeV2Contract),\n                    _ => ::std::option::Option::None\n                }\n            }\n\n            fn from_str(str: &str) -> ::std::option::Option<ContractType> {\n                match str {\n                    \"AccountCreateContract\" => ::std::option::Option::Some(ContractType::AccountCreateContract),\n                    \"TransferContract\" => ::std::option::Option::Some(ContractType::TransferContract),\n                    \"TransferAssetContract\" => ::std::option::Option::Some(ContractType::TransferAssetContract),\n                    \"VoteAssetContract\" => ::std::option::Option::Some(ContractType::VoteAssetContract),\n                    \"VoteWitnessContract\" => ::std::option::Option::Some(ContractType::VoteWitnessContract),\n                    \"WitnessCreateContract\" => ::std::option::Option::Some(ContractType::WitnessCreateContract),\n                    \"AssetIssueContract\" => ::std::option::Option::Some(ContractType::AssetIssueContract),\n                    \"WitnessUpdateContract\" => ::std::option::Option::Some(ContractType::WitnessUpdateContract),\n                    \"ParticipateAssetIssueContract\" => ::std::option::Option::Some(ContractType::ParticipateAssetIssueContract),\n                    \"AccountUpdateContract\" => ::std::option::Option::Some(ContractType::AccountUpdateContract),\n                    \"FreezeBalanceContract\" => ::std::option::Option::Some(ContractType::FreezeBalanceContract),\n                    \"UnfreezeBalanceContract\" => ::std::option::Option::Some(ContractType::UnfreezeBalanceContract),\n                    \"WithdrawBalanceContract\" => ::std::option::Option::Some(ContractType::WithdrawBalanceContract),\n                    \"UnfreezeAssetContract\" => ::std::option::Option::Some(ContractType::UnfreezeAssetContract),\n                    \"UpdateAssetContract\" => ::std::option::Option::Some(ContractType::UpdateAssetContract),\n                    \"ProposalCreateContract\" => ::std::option::Option::Some(ContractType::ProposalCreateContract),\n                    \"ProposalApproveContract\" => ::std::option::Option::Some(ContractType::ProposalApproveContract),\n                    \"ProposalDeleteContract\" => ::std::option::Option::Some(ContractType::ProposalDeleteContract),\n                    \"SetAccountIdContract\" => ::std::option::Option::Some(ContractType::SetAccountIdContract),\n                    \"CustomContract\" => ::std::option::Option::Some(ContractType::CustomContract),\n                    \"CreateSmartContract\" => ::std::option::Option::Some(ContractType::CreateSmartContract),\n                    \"TriggerSmartContract\" => ::std::option::Option::Some(ContractType::TriggerSmartContract),\n                    \"GetContract\" => ::std::option::Option::Some(ContractType::GetContract),\n                    \"UpdateSettingContract\" => ::std::option::Option::Some(ContractType::UpdateSettingContract),\n                    \"ExchangeCreateContract\" => ::std::option::Option::Some(ContractType::ExchangeCreateContract),\n                    \"ExchangeInjectContract\" => ::std::option::Option::Some(ContractType::ExchangeInjectContract),\n                    \"ExchangeWithdrawContract\" => ::std::option::Option::Some(ContractType::ExchangeWithdrawContract),\n                    \"ExchangeTransactionContract\" => ::std::option::Option::Some(ContractType::ExchangeTransactionContract),\n                    \"UpdateEnergyLimitContract\" => ::std::option::Option::Some(ContractType::UpdateEnergyLimitContract),\n                    \"AccountPermissionUpdateContract\" => ::std::option::Option::Some(ContractType::AccountPermissionUpdateContract),\n                    \"ClearABIContract\" => ::std::option::Option::Some(ContractType::ClearABIContract),\n                    \"UpdateBrokerageContract\" => ::std::option::Option::Some(ContractType::UpdateBrokerageContract),\n                    \"ShieldedTransferContract\" => ::std::option::Option::Some(ContractType::ShieldedTransferContract),\n                    \"MarketSellAssetContract\" => ::std::option::Option::Some(ContractType::MarketSellAssetContract),\n                    \"MarketCancelOrderContract\" => ::std::option::Option::Some(ContractType::MarketCancelOrderContract),\n                    \"FreezeBalanceV2Contract\" => ::std::option::Option::Some(ContractType::FreezeBalanceV2Contract),\n                    \"UnfreezeBalanceV2Contract\" => ::std::option::Option::Some(ContractType::UnfreezeBalanceV2Contract),\n                    \"WithdrawExpireUnfreezeContract\" => ::std::option::Option::Some(ContractType::WithdrawExpireUnfreezeContract),\n                    \"DelegateResourceContract\" => ::std::option::Option::Some(ContractType::DelegateResourceContract),\n                    \"UnDelegateResourceContract\" => ::std::option::Option::Some(ContractType::UnDelegateResourceContract),\n                    \"CancelAllUnfreezeV2Contract\" => ::std::option::Option::Some(ContractType::CancelAllUnfreezeV2Contract),\n                    _ => ::std::option::Option::None\n                }\n            }\n\n            const VALUES: &'static [ContractType] = &[\n                ContractType::AccountCreateContract,\n                ContractType::TransferContract,\n                ContractType::TransferAssetContract,\n                ContractType::VoteAssetContract,\n                ContractType::VoteWitnessContract,\n                ContractType::WitnessCreateContract,\n                ContractType::AssetIssueContract,\n                ContractType::WitnessUpdateContract,\n                ContractType::ParticipateAssetIssueContract,\n                ContractType::AccountUpdateContract,\n                ContractType::FreezeBalanceContract,\n                ContractType::UnfreezeBalanceContract,\n                ContractType::WithdrawBalanceContract,\n                ContractType::UnfreezeAssetContract,\n                ContractType::UpdateAssetContract,\n                ContractType::ProposalCreateContract,\n                ContractType::ProposalApproveContract,\n                ContractType::ProposalDeleteContract,\n                ContractType::SetAccountIdContract,\n                ContractType::CustomContract,\n                ContractType::CreateSmartContract,\n                ContractType::TriggerSmartContract,\n                ContractType::GetContract,\n                ContractType::UpdateSettingContract,\n                ContractType::ExchangeCreateContract,\n                ContractType::ExchangeInjectContract,\n                ContractType::ExchangeWithdrawContract,\n                ContractType::ExchangeTransactionContract,\n                ContractType::UpdateEnergyLimitContract,\n                ContractType::AccountPermissionUpdateContract,\n                ContractType::ClearABIContract,\n                ContractType::UpdateBrokerageContract,\n                ContractType::ShieldedTransferContract,\n                ContractType::MarketSellAssetContract,\n                ContractType::MarketCancelOrderContract,\n                ContractType::FreezeBalanceV2Contract,\n                ContractType::UnfreezeBalanceV2Contract,\n                ContractType::WithdrawExpireUnfreezeContract,\n                ContractType::DelegateResourceContract,\n                ContractType::UnDelegateResourceContract,\n                ContractType::CancelAllUnfreezeV2Contract,\n            ];\n        }\n\n        impl ::protobuf::EnumFull for ContractType {\n            fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().enum_by_package_relative_name(\"Transaction.Contract.ContractType\").unwrap()).clone()\n            }\n\n            fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n                let index = match self {\n                    ContractType::AccountCreateContract => 0,\n                    ContractType::TransferContract => 1,\n                    ContractType::TransferAssetContract => 2,\n                    ContractType::VoteAssetContract => 3,\n                    ContractType::VoteWitnessContract => 4,\n                    ContractType::WitnessCreateContract => 5,\n                    ContractType::AssetIssueContract => 6,\n                    ContractType::WitnessUpdateContract => 7,\n                    ContractType::ParticipateAssetIssueContract => 8,\n                    ContractType::AccountUpdateContract => 9,\n                    ContractType::FreezeBalanceContract => 10,\n                    ContractType::UnfreezeBalanceContract => 11,\n                    ContractType::WithdrawBalanceContract => 12,\n                    ContractType::UnfreezeAssetContract => 13,\n                    ContractType::UpdateAssetContract => 14,\n                    ContractType::ProposalCreateContract => 15,\n                    ContractType::ProposalApproveContract => 16,\n                    ContractType::ProposalDeleteContract => 17,\n                    ContractType::SetAccountIdContract => 18,\n                    ContractType::CustomContract => 19,\n                    ContractType::CreateSmartContract => 20,\n                    ContractType::TriggerSmartContract => 21,\n                    ContractType::GetContract => 22,\n                    ContractType::UpdateSettingContract => 23,\n                    ContractType::ExchangeCreateContract => 24,\n                    ContractType::ExchangeInjectContract => 25,\n                    ContractType::ExchangeWithdrawContract => 26,\n                    ContractType::ExchangeTransactionContract => 27,\n                    ContractType::UpdateEnergyLimitContract => 28,\n                    ContractType::AccountPermissionUpdateContract => 29,\n                    ContractType::ClearABIContract => 30,\n                    ContractType::UpdateBrokerageContract => 31,\n                    ContractType::ShieldedTransferContract => 32,\n                    ContractType::MarketSellAssetContract => 33,\n                    ContractType::MarketCancelOrderContract => 34,\n                    ContractType::FreezeBalanceV2Contract => 35,\n                    ContractType::UnfreezeBalanceV2Contract => 36,\n                    ContractType::WithdrawExpireUnfreezeContract => 37,\n                    ContractType::DelegateResourceContract => 38,\n                    ContractType::UnDelegateResourceContract => 39,\n                    ContractType::CancelAllUnfreezeV2Contract => 40,\n                };\n                Self::enum_descriptor().value_by_index(index)\n            }\n        }\n\n        impl ::std::default::Default for ContractType {\n            fn default() -> Self {\n                ContractType::AccountCreateContract\n            }\n        }\n\n        impl ContractType {\n            pub(in super::super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n                ::protobuf::reflect::GeneratedEnumDescriptorData::new::<ContractType>(\"Transaction.Contract.ContractType\")\n            }\n        }\n    }\n\n    // @@protoc_insertion_point(message:protocol.Transaction.Result)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Result {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.fee)\n        pub fee: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.ret)\n        pub ret: ::protobuf::EnumOrUnknown<result::Code>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.contractRet)\n        pub contractRet: ::protobuf::EnumOrUnknown<result::ContractResult>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.assetIssueID)\n        pub assetIssueID: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.withdraw_amount)\n        pub withdraw_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.unfreeze_amount)\n        pub unfreeze_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.exchange_received_amount)\n        pub exchange_received_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.exchange_inject_another_amount)\n        pub exchange_inject_another_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.exchange_withdraw_another_amount)\n        pub exchange_withdraw_another_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.exchange_id)\n        pub exchange_id: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.shielded_transaction_fee)\n        pub shielded_transaction_fee: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.orderId)\n        pub orderId: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.orderDetails)\n        pub orderDetails: ::std::vec::Vec<super::MarketOrderDetail>,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.withdraw_expire_amount)\n        pub withdraw_expire_amount: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.Result.cancel_unfreezeV2_amount)\n        pub cancel_unfreezeV2_amount: ::std::collections::HashMap<::std::string::String, i64>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Transaction.Result.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Result {\n        fn default() -> &'a Result {\n            <Result as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Result {\n        pub fn new() -> Result {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(15);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"fee\",\n                |m: &Result| { &m.fee },\n                |m: &mut Result| { &mut m.fee },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"ret\",\n                |m: &Result| { &m.ret },\n                |m: &mut Result| { &mut m.ret },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"contractRet\",\n                |m: &Result| { &m.contractRet },\n                |m: &mut Result| { &mut m.contractRet },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"assetIssueID\",\n                |m: &Result| { &m.assetIssueID },\n                |m: &mut Result| { &mut m.assetIssueID },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"withdraw_amount\",\n                |m: &Result| { &m.withdraw_amount },\n                |m: &mut Result| { &mut m.withdraw_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"unfreeze_amount\",\n                |m: &Result| { &m.unfreeze_amount },\n                |m: &mut Result| { &mut m.unfreeze_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"exchange_received_amount\",\n                |m: &Result| { &m.exchange_received_amount },\n                |m: &mut Result| { &mut m.exchange_received_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"exchange_inject_another_amount\",\n                |m: &Result| { &m.exchange_inject_another_amount },\n                |m: &mut Result| { &mut m.exchange_inject_another_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"exchange_withdraw_another_amount\",\n                |m: &Result| { &m.exchange_withdraw_another_amount },\n                |m: &mut Result| { &mut m.exchange_withdraw_another_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"exchange_id\",\n                |m: &Result| { &m.exchange_id },\n                |m: &mut Result| { &mut m.exchange_id },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"shielded_transaction_fee\",\n                |m: &Result| { &m.shielded_transaction_fee },\n                |m: &mut Result| { &mut m.shielded_transaction_fee },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"orderId\",\n                |m: &Result| { &m.orderId },\n                |m: &mut Result| { &mut m.orderId },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"orderDetails\",\n                |m: &Result| { &m.orderDetails },\n                |m: &mut Result| { &mut m.orderDetails },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"withdraw_expire_amount\",\n                |m: &Result| { &m.withdraw_expire_amount },\n                |m: &mut Result| { &mut m.withdraw_expire_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n                \"cancel_unfreezeV2_amount\",\n                |m: &Result| { &m.cancel_unfreezeV2_amount },\n                |m: &mut Result| { &mut m.cancel_unfreezeV2_amount },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Result>(\n                \"Transaction.Result\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Result {\n        const NAME: &'static str = \"Result\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.fee = is.read_int64()?;\n                    },\n                    16 => {\n                        self.ret = is.read_enum_or_unknown()?;\n                    },\n                    24 => {\n                        self.contractRet = is.read_enum_or_unknown()?;\n                    },\n                    114 => {\n                        self.assetIssueID = is.read_string()?;\n                    },\n                    120 => {\n                        self.withdraw_amount = is.read_int64()?;\n                    },\n                    128 => {\n                        self.unfreeze_amount = is.read_int64()?;\n                    },\n                    144 => {\n                        self.exchange_received_amount = is.read_int64()?;\n                    },\n                    152 => {\n                        self.exchange_inject_another_amount = is.read_int64()?;\n                    },\n                    160 => {\n                        self.exchange_withdraw_another_amount = is.read_int64()?;\n                    },\n                    168 => {\n                        self.exchange_id = is.read_int64()?;\n                    },\n                    176 => {\n                        self.shielded_transaction_fee = is.read_int64()?;\n                    },\n                    202 => {\n                        self.orderId = is.read_bytes()?;\n                    },\n                    210 => {\n                        self.orderDetails.push(is.read_message()?);\n                    },\n                    216 => {\n                        self.withdraw_expire_amount = is.read_int64()?;\n                    },\n                    226 => {\n                        let len = is.read_raw_varint32()?;\n                        let old_limit = is.push_limit(len as u64)?;\n                        let mut key = ::std::default::Default::default();\n                        let mut value = ::std::default::Default::default();\n                        while let Some(tag) = is.read_raw_tag_or_eof()? {\n                            match tag {\n                                10 => key = is.read_string()?,\n                                16 => value = is.read_int64()?,\n                                _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                            };\n                        }\n                        is.pop_limit(old_limit);\n                        self.cancel_unfreezeV2_amount.insert(key, value);\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.fee != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.fee);\n            }\n            if self.ret != ::protobuf::EnumOrUnknown::new(result::Code::SUCESS) {\n                my_size += ::protobuf::rt::int32_size(2, self.ret.value());\n            }\n            if self.contractRet != ::protobuf::EnumOrUnknown::new(result::ContractResult::DEFAULT) {\n                my_size += ::protobuf::rt::int32_size(3, self.contractRet.value());\n            }\n            if !self.assetIssueID.is_empty() {\n                my_size += ::protobuf::rt::string_size(14, &self.assetIssueID);\n            }\n            if self.withdraw_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(15, self.withdraw_amount);\n            }\n            if self.unfreeze_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(16, self.unfreeze_amount);\n            }\n            if self.exchange_received_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(18, self.exchange_received_amount);\n            }\n            if self.exchange_inject_another_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(19, self.exchange_inject_another_amount);\n            }\n            if self.exchange_withdraw_another_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(20, self.exchange_withdraw_another_amount);\n            }\n            if self.exchange_id != 0 {\n                my_size += ::protobuf::rt::int64_size(21, self.exchange_id);\n            }\n            if self.shielded_transaction_fee != 0 {\n                my_size += ::protobuf::rt::int64_size(22, self.shielded_transaction_fee);\n            }\n            if !self.orderId.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(25, &self.orderId);\n            }\n            for value in &self.orderDetails {\n                let len = value.compute_size();\n                my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            if self.withdraw_expire_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(27, self.withdraw_expire_amount);\n            }\n            for (k, v) in &self.cancel_unfreezeV2_amount {\n                let mut entry_size = 0;\n                entry_size += ::protobuf::rt::string_size(1, &k);\n                entry_size += ::protobuf::rt::int64_size(2, *v);\n                my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n            };\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.fee != 0 {\n                os.write_int64(1, self.fee)?;\n            }\n            if self.ret != ::protobuf::EnumOrUnknown::new(result::Code::SUCESS) {\n                os.write_enum(2, ::protobuf::EnumOrUnknown::value(&self.ret))?;\n            }\n            if self.contractRet != ::protobuf::EnumOrUnknown::new(result::ContractResult::DEFAULT) {\n                os.write_enum(3, ::protobuf::EnumOrUnknown::value(&self.contractRet))?;\n            }\n            if !self.assetIssueID.is_empty() {\n                os.write_string(14, &self.assetIssueID)?;\n            }\n            if self.withdraw_amount != 0 {\n                os.write_int64(15, self.withdraw_amount)?;\n            }\n            if self.unfreeze_amount != 0 {\n                os.write_int64(16, self.unfreeze_amount)?;\n            }\n            if self.exchange_received_amount != 0 {\n                os.write_int64(18, self.exchange_received_amount)?;\n            }\n            if self.exchange_inject_another_amount != 0 {\n                os.write_int64(19, self.exchange_inject_another_amount)?;\n            }\n            if self.exchange_withdraw_another_amount != 0 {\n                os.write_int64(20, self.exchange_withdraw_another_amount)?;\n            }\n            if self.exchange_id != 0 {\n                os.write_int64(21, self.exchange_id)?;\n            }\n            if self.shielded_transaction_fee != 0 {\n                os.write_int64(22, self.shielded_transaction_fee)?;\n            }\n            if !self.orderId.is_empty() {\n                os.write_bytes(25, &self.orderId)?;\n            }\n            for v in &self.orderDetails {\n                ::protobuf::rt::write_message_field_with_cached_size(26, v, os)?;\n            };\n            if self.withdraw_expire_amount != 0 {\n                os.write_int64(27, self.withdraw_expire_amount)?;\n            }\n            for (k, v) in &self.cancel_unfreezeV2_amount {\n                let mut entry_size = 0;\n                entry_size += ::protobuf::rt::string_size(1, &k);\n                entry_size += ::protobuf::rt::int64_size(2, *v);\n                os.write_raw_varint32(226)?; // Tag.\n                os.write_raw_varint32(entry_size as u32)?;\n                os.write_string(1, &k)?;\n                os.write_int64(2, *v)?;\n            };\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Result {\n            Result::new()\n        }\n\n        fn clear(&mut self) {\n            self.fee = 0;\n            self.ret = ::protobuf::EnumOrUnknown::new(result::Code::SUCESS);\n            self.contractRet = ::protobuf::EnumOrUnknown::new(result::ContractResult::DEFAULT);\n            self.assetIssueID.clear();\n            self.withdraw_amount = 0;\n            self.unfreeze_amount = 0;\n            self.exchange_received_amount = 0;\n            self.exchange_inject_another_amount = 0;\n            self.exchange_withdraw_another_amount = 0;\n            self.exchange_id = 0;\n            self.shielded_transaction_fee = 0;\n            self.orderId.clear();\n            self.orderDetails.clear();\n            self.withdraw_expire_amount = 0;\n            self.cancel_unfreezeV2_amount.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Result {\n            static instance: ::protobuf::rt::Lazy<Result> = ::protobuf::rt::Lazy::new();\n            instance.get(Result::new)\n        }\n    }\n\n    impl ::protobuf::MessageFull for Result {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Transaction.Result\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Result {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Result {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    /// Nested message and enums of message `Result`\n    pub mod result {\n        #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n        // @@protoc_insertion_point(enum:protocol.Transaction.Result.code)\n        pub enum Code {\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.code.SUCESS)\n            SUCESS = 0,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.code.FAILED)\n            FAILED = 1,\n        }\n\n        impl ::protobuf::Enum for Code {\n            const NAME: &'static str = \"code\";\n\n            fn value(&self) -> i32 {\n                *self as i32\n            }\n\n            fn from_i32(value: i32) -> ::std::option::Option<Code> {\n                match value {\n                    0 => ::std::option::Option::Some(Code::SUCESS),\n                    1 => ::std::option::Option::Some(Code::FAILED),\n                    _ => ::std::option::Option::None\n                }\n            }\n\n            fn from_str(str: &str) -> ::std::option::Option<Code> {\n                match str {\n                    \"SUCESS\" => ::std::option::Option::Some(Code::SUCESS),\n                    \"FAILED\" => ::std::option::Option::Some(Code::FAILED),\n                    _ => ::std::option::Option::None\n                }\n            }\n\n            const VALUES: &'static [Code] = &[\n                Code::SUCESS,\n                Code::FAILED,\n            ];\n        }\n\n        impl ::protobuf::EnumFull for Code {\n            fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().enum_by_package_relative_name(\"Transaction.Result.code\").unwrap()).clone()\n            }\n\n            fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n                let index = *self as usize;\n                Self::enum_descriptor().value_by_index(index)\n            }\n        }\n\n        impl ::std::default::Default for Code {\n            fn default() -> Self {\n                Code::SUCESS\n            }\n        }\n\n        impl Code {\n            pub(in super::super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n                ::protobuf::reflect::GeneratedEnumDescriptorData::new::<Code>(\"Transaction.Result.code\")\n            }\n        }\n\n        #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n        // @@protoc_insertion_point(enum:protocol.Transaction.Result.contractResult)\n        pub enum ContractResult {\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.DEFAULT)\n            DEFAULT = 0,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.SUCCESS)\n            SUCCESS = 1,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.REVERT)\n            REVERT = 2,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.BAD_JUMP_DESTINATION)\n            BAD_JUMP_DESTINATION = 3,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.OUT_OF_MEMORY)\n            OUT_OF_MEMORY = 4,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.PRECOMPILED_CONTRACT)\n            PRECOMPILED_CONTRACT = 5,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.STACK_TOO_SMALL)\n            STACK_TOO_SMALL = 6,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.STACK_TOO_LARGE)\n            STACK_TOO_LARGE = 7,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.ILLEGAL_OPERATION)\n            ILLEGAL_OPERATION = 8,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.STACK_OVERFLOW)\n            STACK_OVERFLOW = 9,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.OUT_OF_ENERGY)\n            OUT_OF_ENERGY = 10,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.OUT_OF_TIME)\n            OUT_OF_TIME = 11,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.JVM_STACK_OVER_FLOW)\n            JVM_STACK_OVER_FLOW = 12,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.UNKNOWN)\n            UNKNOWN = 13,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.TRANSFER_FAILED)\n            TRANSFER_FAILED = 14,\n            // @@protoc_insertion_point(enum_value:protocol.Transaction.Result.contractResult.INVALID_CODE)\n            INVALID_CODE = 15,\n        }\n\n        impl ::protobuf::Enum for ContractResult {\n            const NAME: &'static str = \"contractResult\";\n\n            fn value(&self) -> i32 {\n                *self as i32\n            }\n\n            fn from_i32(value: i32) -> ::std::option::Option<ContractResult> {\n                match value {\n                    0 => ::std::option::Option::Some(ContractResult::DEFAULT),\n                    1 => ::std::option::Option::Some(ContractResult::SUCCESS),\n                    2 => ::std::option::Option::Some(ContractResult::REVERT),\n                    3 => ::std::option::Option::Some(ContractResult::BAD_JUMP_DESTINATION),\n                    4 => ::std::option::Option::Some(ContractResult::OUT_OF_MEMORY),\n                    5 => ::std::option::Option::Some(ContractResult::PRECOMPILED_CONTRACT),\n                    6 => ::std::option::Option::Some(ContractResult::STACK_TOO_SMALL),\n                    7 => ::std::option::Option::Some(ContractResult::STACK_TOO_LARGE),\n                    8 => ::std::option::Option::Some(ContractResult::ILLEGAL_OPERATION),\n                    9 => ::std::option::Option::Some(ContractResult::STACK_OVERFLOW),\n                    10 => ::std::option::Option::Some(ContractResult::OUT_OF_ENERGY),\n                    11 => ::std::option::Option::Some(ContractResult::OUT_OF_TIME),\n                    12 => ::std::option::Option::Some(ContractResult::JVM_STACK_OVER_FLOW),\n                    13 => ::std::option::Option::Some(ContractResult::UNKNOWN),\n                    14 => ::std::option::Option::Some(ContractResult::TRANSFER_FAILED),\n                    15 => ::std::option::Option::Some(ContractResult::INVALID_CODE),\n                    _ => ::std::option::Option::None\n                }\n            }\n\n            fn from_str(str: &str) -> ::std::option::Option<ContractResult> {\n                match str {\n                    \"DEFAULT\" => ::std::option::Option::Some(ContractResult::DEFAULT),\n                    \"SUCCESS\" => ::std::option::Option::Some(ContractResult::SUCCESS),\n                    \"REVERT\" => ::std::option::Option::Some(ContractResult::REVERT),\n                    \"BAD_JUMP_DESTINATION\" => ::std::option::Option::Some(ContractResult::BAD_JUMP_DESTINATION),\n                    \"OUT_OF_MEMORY\" => ::std::option::Option::Some(ContractResult::OUT_OF_MEMORY),\n                    \"PRECOMPILED_CONTRACT\" => ::std::option::Option::Some(ContractResult::PRECOMPILED_CONTRACT),\n                    \"STACK_TOO_SMALL\" => ::std::option::Option::Some(ContractResult::STACK_TOO_SMALL),\n                    \"STACK_TOO_LARGE\" => ::std::option::Option::Some(ContractResult::STACK_TOO_LARGE),\n                    \"ILLEGAL_OPERATION\" => ::std::option::Option::Some(ContractResult::ILLEGAL_OPERATION),\n                    \"STACK_OVERFLOW\" => ::std::option::Option::Some(ContractResult::STACK_OVERFLOW),\n                    \"OUT_OF_ENERGY\" => ::std::option::Option::Some(ContractResult::OUT_OF_ENERGY),\n                    \"OUT_OF_TIME\" => ::std::option::Option::Some(ContractResult::OUT_OF_TIME),\n                    \"JVM_STACK_OVER_FLOW\" => ::std::option::Option::Some(ContractResult::JVM_STACK_OVER_FLOW),\n                    \"UNKNOWN\" => ::std::option::Option::Some(ContractResult::UNKNOWN),\n                    \"TRANSFER_FAILED\" => ::std::option::Option::Some(ContractResult::TRANSFER_FAILED),\n                    \"INVALID_CODE\" => ::std::option::Option::Some(ContractResult::INVALID_CODE),\n                    _ => ::std::option::Option::None\n                }\n            }\n\n            const VALUES: &'static [ContractResult] = &[\n                ContractResult::DEFAULT,\n                ContractResult::SUCCESS,\n                ContractResult::REVERT,\n                ContractResult::BAD_JUMP_DESTINATION,\n                ContractResult::OUT_OF_MEMORY,\n                ContractResult::PRECOMPILED_CONTRACT,\n                ContractResult::STACK_TOO_SMALL,\n                ContractResult::STACK_TOO_LARGE,\n                ContractResult::ILLEGAL_OPERATION,\n                ContractResult::STACK_OVERFLOW,\n                ContractResult::OUT_OF_ENERGY,\n                ContractResult::OUT_OF_TIME,\n                ContractResult::JVM_STACK_OVER_FLOW,\n                ContractResult::UNKNOWN,\n                ContractResult::TRANSFER_FAILED,\n                ContractResult::INVALID_CODE,\n            ];\n        }\n\n        impl ::protobuf::EnumFull for ContractResult {\n            fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().enum_by_package_relative_name(\"Transaction.Result.contractResult\").unwrap()).clone()\n            }\n\n            fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n                let index = *self as usize;\n                Self::enum_descriptor().value_by_index(index)\n            }\n        }\n\n        impl ::std::default::Default for ContractResult {\n            fn default() -> Self {\n                ContractResult::DEFAULT\n            }\n        }\n\n        impl ContractResult {\n            pub(in super::super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n                ::protobuf::reflect::GeneratedEnumDescriptorData::new::<ContractResult>(\"Transaction.Result.contractResult\")\n            }\n        }\n    }\n\n    // @@protoc_insertion_point(message:protocol.Transaction.raw)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Raw {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.ref_block_bytes)\n        pub ref_block_bytes: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.ref_block_num)\n        pub ref_block_num: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.ref_block_hash)\n        pub ref_block_hash: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.expiration)\n        pub expiration: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.auths)\n        pub auths: ::std::vec::Vec<super::Authority>,\n        ///  data not used\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.data)\n        pub data: ::std::vec::Vec<u8>,\n        /// only support size = 1,  repeated list here for extension\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.contract)\n        pub contract: ::std::vec::Vec<Contract>,\n        ///  scripts not used\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.scripts)\n        pub scripts: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.timestamp)\n        pub timestamp: i64,\n        // @@protoc_insertion_point(field:protocol.Transaction.raw.fee_limit)\n        pub fee_limit: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.Transaction.raw.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Raw {\n        fn default() -> &'a Raw {\n            <Raw as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Raw {\n        pub fn new() -> Raw {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(10);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"ref_block_bytes\",\n                |m: &Raw| { &m.ref_block_bytes },\n                |m: &mut Raw| { &mut m.ref_block_bytes },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"ref_block_num\",\n                |m: &Raw| { &m.ref_block_num },\n                |m: &mut Raw| { &mut m.ref_block_num },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"ref_block_hash\",\n                |m: &Raw| { &m.ref_block_hash },\n                |m: &mut Raw| { &mut m.ref_block_hash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"expiration\",\n                |m: &Raw| { &m.expiration },\n                |m: &mut Raw| { &mut m.expiration },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"auths\",\n                |m: &Raw| { &m.auths },\n                |m: &mut Raw| { &mut m.auths },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"data\",\n                |m: &Raw| { &m.data },\n                |m: &mut Raw| { &mut m.data },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"contract\",\n                |m: &Raw| { &m.contract },\n                |m: &mut Raw| { &mut m.contract },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"scripts\",\n                |m: &Raw| { &m.scripts },\n                |m: &mut Raw| { &mut m.scripts },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"timestamp\",\n                |m: &Raw| { &m.timestamp },\n                |m: &mut Raw| { &mut m.timestamp },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"fee_limit\",\n                |m: &Raw| { &m.fee_limit },\n                |m: &mut Raw| { &mut m.fee_limit },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Raw>(\n                \"Transaction.raw\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Raw {\n        const NAME: &'static str = \"raw\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.ref_block_bytes = is.read_bytes()?;\n                    },\n                    24 => {\n                        self.ref_block_num = is.read_int64()?;\n                    },\n                    34 => {\n                        self.ref_block_hash = is.read_bytes()?;\n                    },\n                    64 => {\n                        self.expiration = is.read_int64()?;\n                    },\n                    74 => {\n                        self.auths.push(is.read_message()?);\n                    },\n                    82 => {\n                        self.data = is.read_bytes()?;\n                    },\n                    90 => {\n                        self.contract.push(is.read_message()?);\n                    },\n                    98 => {\n                        self.scripts = is.read_bytes()?;\n                    },\n                    112 => {\n                        self.timestamp = is.read_int64()?;\n                    },\n                    144 => {\n                        self.fee_limit = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.ref_block_bytes.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.ref_block_bytes);\n            }\n            if self.ref_block_num != 0 {\n                my_size += ::protobuf::rt::int64_size(3, self.ref_block_num);\n            }\n            if !self.ref_block_hash.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(4, &self.ref_block_hash);\n            }\n            if self.expiration != 0 {\n                my_size += ::protobuf::rt::int64_size(8, self.expiration);\n            }\n            for value in &self.auths {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            if !self.data.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(10, &self.data);\n            }\n            for value in &self.contract {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            if !self.scripts.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(12, &self.scripts);\n            }\n            if self.timestamp != 0 {\n                my_size += ::protobuf::rt::int64_size(14, self.timestamp);\n            }\n            if self.fee_limit != 0 {\n                my_size += ::protobuf::rt::int64_size(18, self.fee_limit);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.ref_block_bytes.is_empty() {\n                os.write_bytes(1, &self.ref_block_bytes)?;\n            }\n            if self.ref_block_num != 0 {\n                os.write_int64(3, self.ref_block_num)?;\n            }\n            if !self.ref_block_hash.is_empty() {\n                os.write_bytes(4, &self.ref_block_hash)?;\n            }\n            if self.expiration != 0 {\n                os.write_int64(8, self.expiration)?;\n            }\n            for v in &self.auths {\n                ::protobuf::rt::write_message_field_with_cached_size(9, v, os)?;\n            };\n            if !self.data.is_empty() {\n                os.write_bytes(10, &self.data)?;\n            }\n            for v in &self.contract {\n                ::protobuf::rt::write_message_field_with_cached_size(11, v, os)?;\n            };\n            if !self.scripts.is_empty() {\n                os.write_bytes(12, &self.scripts)?;\n            }\n            if self.timestamp != 0 {\n                os.write_int64(14, self.timestamp)?;\n            }\n            if self.fee_limit != 0 {\n                os.write_int64(18, self.fee_limit)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Raw {\n            Raw::new()\n        }\n\n        fn clear(&mut self) {\n            self.ref_block_bytes.clear();\n            self.ref_block_num = 0;\n            self.ref_block_hash.clear();\n            self.expiration = 0;\n            self.auths.clear();\n            self.data.clear();\n            self.contract.clear();\n            self.scripts.clear();\n            self.timestamp = 0;\n            self.fee_limit = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Raw {\n            static instance: Raw = Raw {\n                ref_block_bytes: ::std::vec::Vec::new(),\n                ref_block_num: 0,\n                ref_block_hash: ::std::vec::Vec::new(),\n                expiration: 0,\n                auths: ::std::vec::Vec::new(),\n                data: ::std::vec::Vec::new(),\n                contract: ::std::vec::Vec::new(),\n                scripts: ::std::vec::Vec::new(),\n                timestamp: 0,\n                fee_limit: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Raw {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"Transaction.raw\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Raw {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Raw {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.TransactionInfo)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TransactionInfo {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.id)\n    pub id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.fee)\n    pub fee: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.blockNumber)\n    pub blockNumber: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.blockTimeStamp)\n    pub blockTimeStamp: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.contractResult)\n    pub contractResult: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.contract_address)\n    pub contract_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.receipt)\n    pub receipt: ::protobuf::MessageField<ResourceReceipt>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.log)\n    pub log: ::std::vec::Vec<transaction_info::Log>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.result)\n    pub result: ::protobuf::EnumOrUnknown<transaction_info::Code>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.resMessage)\n    pub resMessage: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.assetIssueID)\n    pub assetIssueID: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.withdraw_amount)\n    pub withdraw_amount: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.unfreeze_amount)\n    pub unfreeze_amount: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.internal_transactions)\n    pub internal_transactions: ::std::vec::Vec<InternalTransaction>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.exchange_received_amount)\n    pub exchange_received_amount: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.exchange_inject_another_amount)\n    pub exchange_inject_another_amount: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.exchange_withdraw_another_amount)\n    pub exchange_withdraw_another_amount: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.exchange_id)\n    pub exchange_id: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.shielded_transaction_fee)\n    pub shielded_transaction_fee: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.orderId)\n    pub orderId: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.orderDetails)\n    pub orderDetails: ::std::vec::Vec<MarketOrderDetail>,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.packingFee)\n    pub packingFee: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.withdraw_expire_amount)\n    pub withdraw_expire_amount: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionInfo.cancel_unfreezeV2_amount)\n    pub cancel_unfreezeV2_amount: ::std::collections::HashMap<::std::string::String, i64>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TransactionInfo.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TransactionInfo {\n    fn default() -> &'a TransactionInfo {\n        <TransactionInfo as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TransactionInfo {\n    pub fn new() -> TransactionInfo {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(24);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"id\",\n            |m: &TransactionInfo| { &m.id },\n            |m: &mut TransactionInfo| { &mut m.id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"fee\",\n            |m: &TransactionInfo| { &m.fee },\n            |m: &mut TransactionInfo| { &mut m.fee },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"blockNumber\",\n            |m: &TransactionInfo| { &m.blockNumber },\n            |m: &mut TransactionInfo| { &mut m.blockNumber },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"blockTimeStamp\",\n            |m: &TransactionInfo| { &m.blockTimeStamp },\n            |m: &mut TransactionInfo| { &mut m.blockTimeStamp },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"contractResult\",\n            |m: &TransactionInfo| { &m.contractResult },\n            |m: &mut TransactionInfo| { &mut m.contractResult },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"contract_address\",\n            |m: &TransactionInfo| { &m.contract_address },\n            |m: &mut TransactionInfo| { &mut m.contract_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ResourceReceipt>(\n            \"receipt\",\n            |m: &TransactionInfo| { &m.receipt },\n            |m: &mut TransactionInfo| { &mut m.receipt },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"log\",\n            |m: &TransactionInfo| { &m.log },\n            |m: &mut TransactionInfo| { &mut m.log },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"result\",\n            |m: &TransactionInfo| { &m.result },\n            |m: &mut TransactionInfo| { &mut m.result },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resMessage\",\n            |m: &TransactionInfo| { &m.resMessage },\n            |m: &mut TransactionInfo| { &mut m.resMessage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"assetIssueID\",\n            |m: &TransactionInfo| { &m.assetIssueID },\n            |m: &mut TransactionInfo| { &mut m.assetIssueID },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"withdraw_amount\",\n            |m: &TransactionInfo| { &m.withdraw_amount },\n            |m: &mut TransactionInfo| { &mut m.withdraw_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"unfreeze_amount\",\n            |m: &TransactionInfo| { &m.unfreeze_amount },\n            |m: &mut TransactionInfo| { &mut m.unfreeze_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"internal_transactions\",\n            |m: &TransactionInfo| { &m.internal_transactions },\n            |m: &mut TransactionInfo| { &mut m.internal_transactions },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_received_amount\",\n            |m: &TransactionInfo| { &m.exchange_received_amount },\n            |m: &mut TransactionInfo| { &mut m.exchange_received_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_inject_another_amount\",\n            |m: &TransactionInfo| { &m.exchange_inject_another_amount },\n            |m: &mut TransactionInfo| { &mut m.exchange_inject_another_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_withdraw_another_amount\",\n            |m: &TransactionInfo| { &m.exchange_withdraw_another_amount },\n            |m: &mut TransactionInfo| { &mut m.exchange_withdraw_another_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_id\",\n            |m: &TransactionInfo| { &m.exchange_id },\n            |m: &mut TransactionInfo| { &mut m.exchange_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"shielded_transaction_fee\",\n            |m: &TransactionInfo| { &m.shielded_transaction_fee },\n            |m: &mut TransactionInfo| { &mut m.shielded_transaction_fee },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"orderId\",\n            |m: &TransactionInfo| { &m.orderId },\n            |m: &mut TransactionInfo| { &mut m.orderId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"orderDetails\",\n            |m: &TransactionInfo| { &m.orderDetails },\n            |m: &mut TransactionInfo| { &mut m.orderDetails },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"packingFee\",\n            |m: &TransactionInfo| { &m.packingFee },\n            |m: &mut TransactionInfo| { &mut m.packingFee },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"withdraw_expire_amount\",\n            |m: &TransactionInfo| { &m.withdraw_expire_amount },\n            |m: &mut TransactionInfo| { &mut m.withdraw_expire_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"cancel_unfreezeV2_amount\",\n            |m: &TransactionInfo| { &m.cancel_unfreezeV2_amount },\n            |m: &mut TransactionInfo| { &mut m.cancel_unfreezeV2_amount },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TransactionInfo>(\n            \"TransactionInfo\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TransactionInfo {\n    const NAME: &'static str = \"TransactionInfo\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.id = is.read_bytes()?;\n                },\n                16 => {\n                    self.fee = is.read_int64()?;\n                },\n                24 => {\n                    self.blockNumber = is.read_int64()?;\n                },\n                32 => {\n                    self.blockTimeStamp = is.read_int64()?;\n                },\n                42 => {\n                    self.contractResult.push(is.read_bytes()?);\n                },\n                50 => {\n                    self.contract_address = is.read_bytes()?;\n                },\n                58 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.receipt)?;\n                },\n                66 => {\n                    self.log.push(is.read_message()?);\n                },\n                72 => {\n                    self.result = is.read_enum_or_unknown()?;\n                },\n                82 => {\n                    self.resMessage = is.read_bytes()?;\n                },\n                114 => {\n                    self.assetIssueID = is.read_string()?;\n                },\n                120 => {\n                    self.withdraw_amount = is.read_int64()?;\n                },\n                128 => {\n                    self.unfreeze_amount = is.read_int64()?;\n                },\n                138 => {\n                    self.internal_transactions.push(is.read_message()?);\n                },\n                144 => {\n                    self.exchange_received_amount = is.read_int64()?;\n                },\n                152 => {\n                    self.exchange_inject_another_amount = is.read_int64()?;\n                },\n                160 => {\n                    self.exchange_withdraw_another_amount = is.read_int64()?;\n                },\n                168 => {\n                    self.exchange_id = is.read_int64()?;\n                },\n                176 => {\n                    self.shielded_transaction_fee = is.read_int64()?;\n                },\n                202 => {\n                    self.orderId = is.read_bytes()?;\n                },\n                210 => {\n                    self.orderDetails.push(is.read_message()?);\n                },\n                216 => {\n                    self.packingFee = is.read_int64()?;\n                },\n                224 => {\n                    self.withdraw_expire_amount = is.read_int64()?;\n                },\n                234 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.cancel_unfreezeV2_amount.insert(key, value);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.id);\n        }\n        if self.fee != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.fee);\n        }\n        if self.blockNumber != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.blockNumber);\n        }\n        if self.blockTimeStamp != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.blockTimeStamp);\n        }\n        for value in &self.contractResult {\n            my_size += ::protobuf::rt::bytes_size(5, &value);\n        };\n        if !self.contract_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.contract_address);\n        }\n        if let Some(v) = self.receipt.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.log {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.result != ::protobuf::EnumOrUnknown::new(transaction_info::Code::SUCESS) {\n            my_size += ::protobuf::rt::int32_size(9, self.result.value());\n        }\n        if !self.resMessage.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(10, &self.resMessage);\n        }\n        if !self.assetIssueID.is_empty() {\n            my_size += ::protobuf::rt::string_size(14, &self.assetIssueID);\n        }\n        if self.withdraw_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(15, self.withdraw_amount);\n        }\n        if self.unfreeze_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(16, self.unfreeze_amount);\n        }\n        for value in &self.internal_transactions {\n            let len = value.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.exchange_received_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(18, self.exchange_received_amount);\n        }\n        if self.exchange_inject_another_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(19, self.exchange_inject_another_amount);\n        }\n        if self.exchange_withdraw_another_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(20, self.exchange_withdraw_another_amount);\n        }\n        if self.exchange_id != 0 {\n            my_size += ::protobuf::rt::int64_size(21, self.exchange_id);\n        }\n        if self.shielded_transaction_fee != 0 {\n            my_size += ::protobuf::rt::int64_size(22, self.shielded_transaction_fee);\n        }\n        if !self.orderId.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(25, &self.orderId);\n        }\n        for value in &self.orderDetails {\n            let len = value.compute_size();\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.packingFee != 0 {\n            my_size += ::protobuf::rt::int64_size(27, self.packingFee);\n        }\n        if self.withdraw_expire_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(28, self.withdraw_expire_amount);\n        }\n        for (k, v) in &self.cancel_unfreezeV2_amount {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.id.is_empty() {\n            os.write_bytes(1, &self.id)?;\n        }\n        if self.fee != 0 {\n            os.write_int64(2, self.fee)?;\n        }\n        if self.blockNumber != 0 {\n            os.write_int64(3, self.blockNumber)?;\n        }\n        if self.blockTimeStamp != 0 {\n            os.write_int64(4, self.blockTimeStamp)?;\n        }\n        for v in &self.contractResult {\n            os.write_bytes(5, &v)?;\n        };\n        if !self.contract_address.is_empty() {\n            os.write_bytes(6, &self.contract_address)?;\n        }\n        if let Some(v) = self.receipt.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(7, v, os)?;\n        }\n        for v in &self.log {\n            ::protobuf::rt::write_message_field_with_cached_size(8, v, os)?;\n        };\n        if self.result != ::protobuf::EnumOrUnknown::new(transaction_info::Code::SUCESS) {\n            os.write_enum(9, ::protobuf::EnumOrUnknown::value(&self.result))?;\n        }\n        if !self.resMessage.is_empty() {\n            os.write_bytes(10, &self.resMessage)?;\n        }\n        if !self.assetIssueID.is_empty() {\n            os.write_string(14, &self.assetIssueID)?;\n        }\n        if self.withdraw_amount != 0 {\n            os.write_int64(15, self.withdraw_amount)?;\n        }\n        if self.unfreeze_amount != 0 {\n            os.write_int64(16, self.unfreeze_amount)?;\n        }\n        for v in &self.internal_transactions {\n            ::protobuf::rt::write_message_field_with_cached_size(17, v, os)?;\n        };\n        if self.exchange_received_amount != 0 {\n            os.write_int64(18, self.exchange_received_amount)?;\n        }\n        if self.exchange_inject_another_amount != 0 {\n            os.write_int64(19, self.exchange_inject_another_amount)?;\n        }\n        if self.exchange_withdraw_another_amount != 0 {\n            os.write_int64(20, self.exchange_withdraw_another_amount)?;\n        }\n        if self.exchange_id != 0 {\n            os.write_int64(21, self.exchange_id)?;\n        }\n        if self.shielded_transaction_fee != 0 {\n            os.write_int64(22, self.shielded_transaction_fee)?;\n        }\n        if !self.orderId.is_empty() {\n            os.write_bytes(25, &self.orderId)?;\n        }\n        for v in &self.orderDetails {\n            ::protobuf::rt::write_message_field_with_cached_size(26, v, os)?;\n        };\n        if self.packingFee != 0 {\n            os.write_int64(27, self.packingFee)?;\n        }\n        if self.withdraw_expire_amount != 0 {\n            os.write_int64(28, self.withdraw_expire_amount)?;\n        }\n        for (k, v) in &self.cancel_unfreezeV2_amount {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(234)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_int64(2, *v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TransactionInfo {\n        TransactionInfo::new()\n    }\n\n    fn clear(&mut self) {\n        self.id.clear();\n        self.fee = 0;\n        self.blockNumber = 0;\n        self.blockTimeStamp = 0;\n        self.contractResult.clear();\n        self.contract_address.clear();\n        self.receipt.clear();\n        self.log.clear();\n        self.result = ::protobuf::EnumOrUnknown::new(transaction_info::Code::SUCESS);\n        self.resMessage.clear();\n        self.assetIssueID.clear();\n        self.withdraw_amount = 0;\n        self.unfreeze_amount = 0;\n        self.internal_transactions.clear();\n        self.exchange_received_amount = 0;\n        self.exchange_inject_another_amount = 0;\n        self.exchange_withdraw_another_amount = 0;\n        self.exchange_id = 0;\n        self.shielded_transaction_fee = 0;\n        self.orderId.clear();\n        self.orderDetails.clear();\n        self.packingFee = 0;\n        self.withdraw_expire_amount = 0;\n        self.cancel_unfreezeV2_amount.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TransactionInfo {\n        static instance: ::protobuf::rt::Lazy<TransactionInfo> = ::protobuf::rt::Lazy::new();\n        instance.get(TransactionInfo::new)\n    }\n}\n\nimpl ::protobuf::MessageFull for TransactionInfo {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TransactionInfo\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TransactionInfo {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TransactionInfo {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `TransactionInfo`\npub mod transaction_info {\n    // @@protoc_insertion_point(message:protocol.TransactionInfo.Log)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Log {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.TransactionInfo.Log.address)\n        pub address: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.TransactionInfo.Log.topics)\n        pub topics: ::std::vec::Vec<::std::vec::Vec<u8>>,\n        // @@protoc_insertion_point(field:protocol.TransactionInfo.Log.data)\n        pub data: ::std::vec::Vec<u8>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.TransactionInfo.Log.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Log {\n        fn default() -> &'a Log {\n            <Log as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Log {\n        pub fn new() -> Log {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(3);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"address\",\n                |m: &Log| { &m.address },\n                |m: &mut Log| { &mut m.address },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"topics\",\n                |m: &Log| { &m.topics },\n                |m: &mut Log| { &mut m.topics },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"data\",\n                |m: &Log| { &m.data },\n                |m: &mut Log| { &mut m.data },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Log>(\n                \"TransactionInfo.Log\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Log {\n        const NAME: &'static str = \"Log\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.address = is.read_bytes()?;\n                    },\n                    18 => {\n                        self.topics.push(is.read_bytes()?);\n                    },\n                    26 => {\n                        self.data = is.read_bytes()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.address.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.address);\n            }\n            for value in &self.topics {\n                my_size += ::protobuf::rt::bytes_size(2, &value);\n            };\n            if !self.data.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(3, &self.data);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.address.is_empty() {\n                os.write_bytes(1, &self.address)?;\n            }\n            for v in &self.topics {\n                os.write_bytes(2, &v)?;\n            };\n            if !self.data.is_empty() {\n                os.write_bytes(3, &self.data)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Log {\n            Log::new()\n        }\n\n        fn clear(&mut self) {\n            self.address.clear();\n            self.topics.clear();\n            self.data.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Log {\n            static instance: Log = Log {\n                address: ::std::vec::Vec::new(),\n                topics: ::std::vec::Vec::new(),\n                data: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Log {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"TransactionInfo.Log\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Log {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Log {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.TransactionInfo.code)\n    pub enum Code {\n        // @@protoc_insertion_point(enum_value:protocol.TransactionInfo.code.SUCESS)\n        SUCESS = 0,\n        // @@protoc_insertion_point(enum_value:protocol.TransactionInfo.code.FAILED)\n        FAILED = 1,\n    }\n\n    impl ::protobuf::Enum for Code {\n        const NAME: &'static str = \"code\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<Code> {\n            match value {\n                0 => ::std::option::Option::Some(Code::SUCESS),\n                1 => ::std::option::Option::Some(Code::FAILED),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<Code> {\n            match str {\n                \"SUCESS\" => ::std::option::Option::Some(Code::SUCESS),\n                \"FAILED\" => ::std::option::Option::Some(Code::FAILED),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [Code] = &[\n            Code::SUCESS,\n            Code::FAILED,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for Code {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"TransactionInfo.code\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for Code {\n        fn default() -> Self {\n            Code::SUCESS\n        }\n    }\n\n    impl Code {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<Code>(\"TransactionInfo.code\")\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.TransactionRet)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TransactionRet {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TransactionRet.blockNumber)\n    pub blockNumber: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionRet.blockTimeStamp)\n    pub blockTimeStamp: i64,\n    // @@protoc_insertion_point(field:protocol.TransactionRet.transactioninfo)\n    pub transactioninfo: ::std::vec::Vec<TransactionInfo>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TransactionRet.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TransactionRet {\n    fn default() -> &'a TransactionRet {\n        <TransactionRet as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TransactionRet {\n    pub fn new() -> TransactionRet {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"blockNumber\",\n            |m: &TransactionRet| { &m.blockNumber },\n            |m: &mut TransactionRet| { &mut m.blockNumber },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"blockTimeStamp\",\n            |m: &TransactionRet| { &m.blockTimeStamp },\n            |m: &mut TransactionRet| { &mut m.blockTimeStamp },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"transactioninfo\",\n            |m: &TransactionRet| { &m.transactioninfo },\n            |m: &mut TransactionRet| { &mut m.transactioninfo },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TransactionRet>(\n            \"TransactionRet\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TransactionRet {\n    const NAME: &'static str = \"TransactionRet\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.blockNumber = is.read_int64()?;\n                },\n                16 => {\n                    self.blockTimeStamp = is.read_int64()?;\n                },\n                26 => {\n                    self.transactioninfo.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.blockNumber != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.blockNumber);\n        }\n        if self.blockTimeStamp != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.blockTimeStamp);\n        }\n        for value in &self.transactioninfo {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.blockNumber != 0 {\n            os.write_int64(1, self.blockNumber)?;\n        }\n        if self.blockTimeStamp != 0 {\n            os.write_int64(2, self.blockTimeStamp)?;\n        }\n        for v in &self.transactioninfo {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TransactionRet {\n        TransactionRet::new()\n    }\n\n    fn clear(&mut self) {\n        self.blockNumber = 0;\n        self.blockTimeStamp = 0;\n        self.transactioninfo.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TransactionRet {\n        static instance: TransactionRet = TransactionRet {\n            blockNumber: 0,\n            blockTimeStamp: 0,\n            transactioninfo: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TransactionRet {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TransactionRet\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TransactionRet {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TransactionRet {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.Transactions)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Transactions {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Transactions.transactions)\n    pub transactions: ::std::vec::Vec<Transaction>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Transactions.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Transactions {\n    fn default() -> &'a Transactions {\n        <Transactions as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Transactions {\n    pub fn new() -> Transactions {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"transactions\",\n            |m: &Transactions| { &m.transactions },\n            |m: &mut Transactions| { &mut m.transactions },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Transactions>(\n            \"Transactions\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Transactions {\n    const NAME: &'static str = \"Transactions\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.transactions.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.transactions {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.transactions {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Transactions {\n        Transactions::new()\n    }\n\n    fn clear(&mut self) {\n        self.transactions.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Transactions {\n        static instance: Transactions = Transactions {\n            transactions: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Transactions {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Transactions\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Transactions {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Transactions {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.BlockHeader)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct BlockHeader {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.BlockHeader.raw_data)\n    pub raw_data: ::protobuf::MessageField<block_header::Raw>,\n    // @@protoc_insertion_point(field:protocol.BlockHeader.witness_signature)\n    pub witness_signature: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.BlockHeader.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a BlockHeader {\n    fn default() -> &'a BlockHeader {\n        <BlockHeader as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl BlockHeader {\n    pub fn new() -> BlockHeader {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, block_header::Raw>(\n            \"raw_data\",\n            |m: &BlockHeader| { &m.raw_data },\n            |m: &mut BlockHeader| { &mut m.raw_data },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"witness_signature\",\n            |m: &BlockHeader| { &m.witness_signature },\n            |m: &mut BlockHeader| { &mut m.witness_signature },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockHeader>(\n            \"BlockHeader\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for BlockHeader {\n    const NAME: &'static str = \"BlockHeader\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.raw_data)?;\n                },\n                18 => {\n                    self.witness_signature = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.raw_data.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.witness_signature.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.witness_signature);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.raw_data.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if !self.witness_signature.is_empty() {\n            os.write_bytes(2, &self.witness_signature)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> BlockHeader {\n        BlockHeader::new()\n    }\n\n    fn clear(&mut self) {\n        self.raw_data.clear();\n        self.witness_signature.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static BlockHeader {\n        static instance: BlockHeader = BlockHeader {\n            raw_data: ::protobuf::MessageField::none(),\n            witness_signature: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for BlockHeader {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"BlockHeader\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for BlockHeader {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for BlockHeader {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `BlockHeader`\npub mod block_header {\n    // @@protoc_insertion_point(message:protocol.BlockHeader.raw)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Raw {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.timestamp)\n        pub timestamp: i64,\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.txTrieRoot)\n        pub txTrieRoot: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.parentHash)\n        pub parentHash: ::std::vec::Vec<u8>,\n        /// bytes nonce = 5;\n        /// bytes difficulty = 6;\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.number)\n        pub number: i64,\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.witness_id)\n        pub witness_id: i64,\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.witness_address)\n        pub witness_address: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.version)\n        pub version: i32,\n        // @@protoc_insertion_point(field:protocol.BlockHeader.raw.accountStateRoot)\n        pub accountStateRoot: ::std::vec::Vec<u8>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.BlockHeader.raw.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Raw {\n        fn default() -> &'a Raw {\n            <Raw as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Raw {\n        pub fn new() -> Raw {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(8);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"timestamp\",\n                |m: &Raw| { &m.timestamp },\n                |m: &mut Raw| { &mut m.timestamp },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"txTrieRoot\",\n                |m: &Raw| { &m.txTrieRoot },\n                |m: &mut Raw| { &mut m.txTrieRoot },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"parentHash\",\n                |m: &Raw| { &m.parentHash },\n                |m: &mut Raw| { &mut m.parentHash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"number\",\n                |m: &Raw| { &m.number },\n                |m: &mut Raw| { &mut m.number },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"witness_id\",\n                |m: &Raw| { &m.witness_id },\n                |m: &mut Raw| { &mut m.witness_id },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"witness_address\",\n                |m: &Raw| { &m.witness_address },\n                |m: &mut Raw| { &mut m.witness_address },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"version\",\n                |m: &Raw| { &m.version },\n                |m: &mut Raw| { &mut m.version },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"accountStateRoot\",\n                |m: &Raw| { &m.accountStateRoot },\n                |m: &mut Raw| { &mut m.accountStateRoot },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Raw>(\n                \"BlockHeader.raw\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Raw {\n        const NAME: &'static str = \"raw\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.timestamp = is.read_int64()?;\n                    },\n                    18 => {\n                        self.txTrieRoot = is.read_bytes()?;\n                    },\n                    26 => {\n                        self.parentHash = is.read_bytes()?;\n                    },\n                    56 => {\n                        self.number = is.read_int64()?;\n                    },\n                    64 => {\n                        self.witness_id = is.read_int64()?;\n                    },\n                    74 => {\n                        self.witness_address = is.read_bytes()?;\n                    },\n                    80 => {\n                        self.version = is.read_int32()?;\n                    },\n                    90 => {\n                        self.accountStateRoot = is.read_bytes()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.timestamp != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.timestamp);\n            }\n            if !self.txTrieRoot.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(2, &self.txTrieRoot);\n            }\n            if !self.parentHash.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(3, &self.parentHash);\n            }\n            if self.number != 0 {\n                my_size += ::protobuf::rt::int64_size(7, self.number);\n            }\n            if self.witness_id != 0 {\n                my_size += ::protobuf::rt::int64_size(8, self.witness_id);\n            }\n            if !self.witness_address.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(9, &self.witness_address);\n            }\n            if self.version != 0 {\n                my_size += ::protobuf::rt::int32_size(10, self.version);\n            }\n            if !self.accountStateRoot.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(11, &self.accountStateRoot);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.timestamp != 0 {\n                os.write_int64(1, self.timestamp)?;\n            }\n            if !self.txTrieRoot.is_empty() {\n                os.write_bytes(2, &self.txTrieRoot)?;\n            }\n            if !self.parentHash.is_empty() {\n                os.write_bytes(3, &self.parentHash)?;\n            }\n            if self.number != 0 {\n                os.write_int64(7, self.number)?;\n            }\n            if self.witness_id != 0 {\n                os.write_int64(8, self.witness_id)?;\n            }\n            if !self.witness_address.is_empty() {\n                os.write_bytes(9, &self.witness_address)?;\n            }\n            if self.version != 0 {\n                os.write_int32(10, self.version)?;\n            }\n            if !self.accountStateRoot.is_empty() {\n                os.write_bytes(11, &self.accountStateRoot)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Raw {\n            Raw::new()\n        }\n\n        fn clear(&mut self) {\n            self.timestamp = 0;\n            self.txTrieRoot.clear();\n            self.parentHash.clear();\n            self.number = 0;\n            self.witness_id = 0;\n            self.witness_address.clear();\n            self.version = 0;\n            self.accountStateRoot.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Raw {\n            static instance: Raw = Raw {\n                timestamp: 0,\n                txTrieRoot: ::std::vec::Vec::new(),\n                parentHash: ::std::vec::Vec::new(),\n                number: 0,\n                witness_id: 0,\n                witness_address: ::std::vec::Vec::new(),\n                version: 0,\n                accountStateRoot: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Raw {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"BlockHeader.raw\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Raw {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Raw {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n///  block\n// @@protoc_insertion_point(message:protocol.Block)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Block {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Block.transactions)\n    pub transactions: ::std::vec::Vec<Transaction>,\n    // @@protoc_insertion_point(field:protocol.Block.block_header)\n    pub block_header: ::protobuf::MessageField<BlockHeader>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Block.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Block {\n    fn default() -> &'a Block {\n        <Block as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Block {\n    pub fn new() -> Block {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"transactions\",\n            |m: &Block| { &m.transactions },\n            |m: &mut Block| { &mut m.transactions },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, BlockHeader>(\n            \"block_header\",\n            |m: &Block| { &m.block_header },\n            |m: &mut Block| { &mut m.block_header },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Block>(\n            \"Block\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Block {\n    const NAME: &'static str = \"Block\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.transactions.push(is.read_message()?);\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.block_header)?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.transactions {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if let Some(v) = self.block_header.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.transactions {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        if let Some(v) = self.block_header.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Block {\n        Block::new()\n    }\n\n    fn clear(&mut self) {\n        self.transactions.clear();\n        self.block_header.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Block {\n        static instance: Block = Block {\n            transactions: ::std::vec::Vec::new(),\n            block_header: ::protobuf::MessageField::none(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Block {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Block\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Block {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Block {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ChainInventory)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ChainInventory {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ChainInventory.ids)\n    pub ids: ::std::vec::Vec<chain_inventory::BlockId>,\n    // @@protoc_insertion_point(field:protocol.ChainInventory.remain_num)\n    pub remain_num: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ChainInventory.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ChainInventory {\n    fn default() -> &'a ChainInventory {\n        <ChainInventory as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ChainInventory {\n    pub fn new() -> ChainInventory {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"ids\",\n            |m: &ChainInventory| { &m.ids },\n            |m: &mut ChainInventory| { &mut m.ids },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"remain_num\",\n            |m: &ChainInventory| { &m.remain_num },\n            |m: &mut ChainInventory| { &mut m.remain_num },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ChainInventory>(\n            \"ChainInventory\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ChainInventory {\n    const NAME: &'static str = \"ChainInventory\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.ids.push(is.read_message()?);\n                },\n                16 => {\n                    self.remain_num = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.ids {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.remain_num != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.remain_num);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.ids {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        if self.remain_num != 0 {\n            os.write_int64(2, self.remain_num)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ChainInventory {\n        ChainInventory::new()\n    }\n\n    fn clear(&mut self) {\n        self.ids.clear();\n        self.remain_num = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ChainInventory {\n        static instance: ChainInventory = ChainInventory {\n            ids: ::std::vec::Vec::new(),\n            remain_num: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ChainInventory {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ChainInventory\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ChainInventory {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ChainInventory {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `ChainInventory`\npub mod chain_inventory {\n    // @@protoc_insertion_point(message:protocol.ChainInventory.BlockId)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct BlockId {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.ChainInventory.BlockId.hash)\n        pub hash: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.ChainInventory.BlockId.number)\n        pub number: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.ChainInventory.BlockId.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a BlockId {\n        fn default() -> &'a BlockId {\n            <BlockId as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl BlockId {\n        pub fn new() -> BlockId {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"hash\",\n                |m: &BlockId| { &m.hash },\n                |m: &mut BlockId| { &mut m.hash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"number\",\n                |m: &BlockId| { &m.number },\n                |m: &mut BlockId| { &mut m.number },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockId>(\n                \"ChainInventory.BlockId\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for BlockId {\n        const NAME: &'static str = \"BlockId\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.hash = is.read_bytes()?;\n                    },\n                    16 => {\n                        self.number = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.hash.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.hash);\n            }\n            if self.number != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.number);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.hash.is_empty() {\n                os.write_bytes(1, &self.hash)?;\n            }\n            if self.number != 0 {\n                os.write_int64(2, self.number)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> BlockId {\n            BlockId::new()\n        }\n\n        fn clear(&mut self) {\n            self.hash.clear();\n            self.number = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static BlockId {\n            static instance: BlockId = BlockId {\n                hash: ::std::vec::Vec::new(),\n                number: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for BlockId {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"ChainInventory.BlockId\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for BlockId {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for BlockId {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n///  Inventory\n// @@protoc_insertion_point(message:protocol.BlockInventory)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct BlockInventory {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.BlockInventory.ids)\n    pub ids: ::std::vec::Vec<block_inventory::BlockId>,\n    // @@protoc_insertion_point(field:protocol.BlockInventory.type)\n    pub type_: ::protobuf::EnumOrUnknown<block_inventory::Type>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.BlockInventory.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a BlockInventory {\n    fn default() -> &'a BlockInventory {\n        <BlockInventory as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl BlockInventory {\n    pub fn new() -> BlockInventory {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"ids\",\n            |m: &BlockInventory| { &m.ids },\n            |m: &mut BlockInventory| { &mut m.ids },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &BlockInventory| { &m.type_ },\n            |m: &mut BlockInventory| { &mut m.type_ },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockInventory>(\n            \"BlockInventory\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for BlockInventory {\n    const NAME: &'static str = \"BlockInventory\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.ids.push(is.read_message()?);\n                },\n                16 => {\n                    self.type_ = is.read_enum_or_unknown()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.ids {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.type_ != ::protobuf::EnumOrUnknown::new(block_inventory::Type::SYNC) {\n            my_size += ::protobuf::rt::int32_size(2, self.type_.value());\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.ids {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        if self.type_ != ::protobuf::EnumOrUnknown::new(block_inventory::Type::SYNC) {\n            os.write_enum(2, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> BlockInventory {\n        BlockInventory::new()\n    }\n\n    fn clear(&mut self) {\n        self.ids.clear();\n        self.type_ = ::protobuf::EnumOrUnknown::new(block_inventory::Type::SYNC);\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static BlockInventory {\n        static instance: BlockInventory = BlockInventory {\n            ids: ::std::vec::Vec::new(),\n            type_: ::protobuf::EnumOrUnknown::from_i32(0),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for BlockInventory {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"BlockInventory\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for BlockInventory {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for BlockInventory {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `BlockInventory`\npub mod block_inventory {\n    // @@protoc_insertion_point(message:protocol.BlockInventory.BlockId)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct BlockId {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.BlockInventory.BlockId.hash)\n        pub hash: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.BlockInventory.BlockId.number)\n        pub number: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.BlockInventory.BlockId.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a BlockId {\n        fn default() -> &'a BlockId {\n            <BlockId as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl BlockId {\n        pub fn new() -> BlockId {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"hash\",\n                |m: &BlockId| { &m.hash },\n                |m: &mut BlockId| { &mut m.hash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"number\",\n                |m: &BlockId| { &m.number },\n                |m: &mut BlockId| { &mut m.number },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockId>(\n                \"BlockInventory.BlockId\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for BlockId {\n        const NAME: &'static str = \"BlockId\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.hash = is.read_bytes()?;\n                    },\n                    16 => {\n                        self.number = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.hash.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.hash);\n            }\n            if self.number != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.number);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.hash.is_empty() {\n                os.write_bytes(1, &self.hash)?;\n            }\n            if self.number != 0 {\n                os.write_int64(2, self.number)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> BlockId {\n            BlockId::new()\n        }\n\n        fn clear(&mut self) {\n            self.hash.clear();\n            self.number = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static BlockId {\n            static instance: BlockId = BlockId {\n                hash: ::std::vec::Vec::new(),\n                number: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for BlockId {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"BlockInventory.BlockId\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for BlockId {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for BlockId {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.BlockInventory.Type)\n    pub enum Type {\n        // @@protoc_insertion_point(enum_value:protocol.BlockInventory.Type.SYNC)\n        SYNC = 0,\n        // @@protoc_insertion_point(enum_value:protocol.BlockInventory.Type.ADVTISE)\n        ADVTISE = 1,\n        // @@protoc_insertion_point(enum_value:protocol.BlockInventory.Type.FETCH)\n        FETCH = 2,\n    }\n\n    impl ::protobuf::Enum for Type {\n        const NAME: &'static str = \"Type\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<Type> {\n            match value {\n                0 => ::std::option::Option::Some(Type::SYNC),\n                1 => ::std::option::Option::Some(Type::ADVTISE),\n                2 => ::std::option::Option::Some(Type::FETCH),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<Type> {\n            match str {\n                \"SYNC\" => ::std::option::Option::Some(Type::SYNC),\n                \"ADVTISE\" => ::std::option::Option::Some(Type::ADVTISE),\n                \"FETCH\" => ::std::option::Option::Some(Type::FETCH),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [Type] = &[\n            Type::SYNC,\n            Type::ADVTISE,\n            Type::FETCH,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for Type {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"BlockInventory.Type\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for Type {\n        fn default() -> Self {\n            Type::SYNC\n        }\n    }\n\n    impl Type {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<Type>(\"BlockInventory.Type\")\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.Inventory)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Inventory {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Inventory.type)\n    pub type_: ::protobuf::EnumOrUnknown<inventory::InventoryType>,\n    // @@protoc_insertion_point(field:protocol.Inventory.ids)\n    pub ids: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Inventory.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Inventory {\n    fn default() -> &'a Inventory {\n        <Inventory as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Inventory {\n    pub fn new() -> Inventory {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &Inventory| { &m.type_ },\n            |m: &mut Inventory| { &mut m.type_ },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"ids\",\n            |m: &Inventory| { &m.ids },\n            |m: &mut Inventory| { &mut m.ids },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Inventory>(\n            \"Inventory\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Inventory {\n    const NAME: &'static str = \"Inventory\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.type_ = is.read_enum_or_unknown()?;\n                },\n                18 => {\n                    self.ids.push(is.read_bytes()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.type_ != ::protobuf::EnumOrUnknown::new(inventory::InventoryType::TRX) {\n            my_size += ::protobuf::rt::int32_size(1, self.type_.value());\n        }\n        for value in &self.ids {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.type_ != ::protobuf::EnumOrUnknown::new(inventory::InventoryType::TRX) {\n            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n        }\n        for v in &self.ids {\n            os.write_bytes(2, &v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Inventory {\n        Inventory::new()\n    }\n\n    fn clear(&mut self) {\n        self.type_ = ::protobuf::EnumOrUnknown::new(inventory::InventoryType::TRX);\n        self.ids.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Inventory {\n        static instance: Inventory = Inventory {\n            type_: ::protobuf::EnumOrUnknown::from_i32(0),\n            ids: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Inventory {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Inventory\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Inventory {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Inventory {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `Inventory`\npub mod inventory {\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.Inventory.InventoryType)\n    pub enum InventoryType {\n        // @@protoc_insertion_point(enum_value:protocol.Inventory.InventoryType.TRX)\n        TRX = 0,\n        // @@protoc_insertion_point(enum_value:protocol.Inventory.InventoryType.BLOCK)\n        BLOCK = 1,\n    }\n\n    impl ::protobuf::Enum for InventoryType {\n        const NAME: &'static str = \"InventoryType\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<InventoryType> {\n            match value {\n                0 => ::std::option::Option::Some(InventoryType::TRX),\n                1 => ::std::option::Option::Some(InventoryType::BLOCK),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<InventoryType> {\n            match str {\n                \"TRX\" => ::std::option::Option::Some(InventoryType::TRX),\n                \"BLOCK\" => ::std::option::Option::Some(InventoryType::BLOCK),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [InventoryType] = &[\n            InventoryType::TRX,\n            InventoryType::BLOCK,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for InventoryType {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"Inventory.InventoryType\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for InventoryType {\n        fn default() -> Self {\n            InventoryType::TRX\n        }\n    }\n\n    impl InventoryType {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<InventoryType>(\"Inventory.InventoryType\")\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.Items)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct Items {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.Items.type)\n    pub type_: ::protobuf::EnumOrUnknown<items::ItemType>,\n    // @@protoc_insertion_point(field:protocol.Items.blocks)\n    pub blocks: ::std::vec::Vec<Block>,\n    // @@protoc_insertion_point(field:protocol.Items.block_headers)\n    pub block_headers: ::std::vec::Vec<BlockHeader>,\n    // @@protoc_insertion_point(field:protocol.Items.transactions)\n    pub transactions: ::std::vec::Vec<Transaction>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.Items.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a Items {\n    fn default() -> &'a Items {\n        <Items as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl Items {\n    pub fn new() -> Items {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &Items| { &m.type_ },\n            |m: &mut Items| { &mut m.type_ },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"blocks\",\n            |m: &Items| { &m.blocks },\n            |m: &mut Items| { &mut m.blocks },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"block_headers\",\n            |m: &Items| { &m.block_headers },\n            |m: &mut Items| { &mut m.block_headers },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"transactions\",\n            |m: &Items| { &m.transactions },\n            |m: &mut Items| { &mut m.transactions },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Items>(\n            \"Items\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for Items {\n    const NAME: &'static str = \"Items\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.type_ = is.read_enum_or_unknown()?;\n                },\n                18 => {\n                    self.blocks.push(is.read_message()?);\n                },\n                26 => {\n                    self.block_headers.push(is.read_message()?);\n                },\n                34 => {\n                    self.transactions.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.type_ != ::protobuf::EnumOrUnknown::new(items::ItemType::ERR) {\n            my_size += ::protobuf::rt::int32_size(1, self.type_.value());\n        }\n        for value in &self.blocks {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.block_headers {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.transactions {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.type_ != ::protobuf::EnumOrUnknown::new(items::ItemType::ERR) {\n            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n        }\n        for v in &self.blocks {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        };\n        for v in &self.block_headers {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        for v in &self.transactions {\n            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> Items {\n        Items::new()\n    }\n\n    fn clear(&mut self) {\n        self.type_ = ::protobuf::EnumOrUnknown::new(items::ItemType::ERR);\n        self.blocks.clear();\n        self.block_headers.clear();\n        self.transactions.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static Items {\n        static instance: Items = Items {\n            type_: ::protobuf::EnumOrUnknown::from_i32(0),\n            blocks: ::std::vec::Vec::new(),\n            block_headers: ::std::vec::Vec::new(),\n            transactions: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for Items {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"Items\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for Items {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for Items {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `Items`\npub mod items {\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.Items.ItemType)\n    pub enum ItemType {\n        // @@protoc_insertion_point(enum_value:protocol.Items.ItemType.ERR)\n        ERR = 0,\n        // @@protoc_insertion_point(enum_value:protocol.Items.ItemType.TRX)\n        TRX = 1,\n        // @@protoc_insertion_point(enum_value:protocol.Items.ItemType.BLOCK)\n        BLOCK = 2,\n        // @@protoc_insertion_point(enum_value:protocol.Items.ItemType.BLOCKHEADER)\n        BLOCKHEADER = 3,\n    }\n\n    impl ::protobuf::Enum for ItemType {\n        const NAME: &'static str = \"ItemType\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<ItemType> {\n            match value {\n                0 => ::std::option::Option::Some(ItemType::ERR),\n                1 => ::std::option::Option::Some(ItemType::TRX),\n                2 => ::std::option::Option::Some(ItemType::BLOCK),\n                3 => ::std::option::Option::Some(ItemType::BLOCKHEADER),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<ItemType> {\n            match str {\n                \"ERR\" => ::std::option::Option::Some(ItemType::ERR),\n                \"TRX\" => ::std::option::Option::Some(ItemType::TRX),\n                \"BLOCK\" => ::std::option::Option::Some(ItemType::BLOCK),\n                \"BLOCKHEADER\" => ::std::option::Option::Some(ItemType::BLOCKHEADER),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [ItemType] = &[\n            ItemType::ERR,\n            ItemType::TRX,\n            ItemType::BLOCK,\n            ItemType::BLOCKHEADER,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for ItemType {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"Items.ItemType\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for ItemType {\n        fn default() -> Self {\n            ItemType::ERR\n        }\n    }\n\n    impl ItemType {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<ItemType>(\"Items.ItemType\")\n        }\n    }\n}\n\n///  DynamicProperties\n// @@protoc_insertion_point(message:protocol.DynamicProperties)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct DynamicProperties {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.DynamicProperties.last_solidity_block_num)\n    pub last_solidity_block_num: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.DynamicProperties.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a DynamicProperties {\n    fn default() -> &'a DynamicProperties {\n        <DynamicProperties as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl DynamicProperties {\n    pub fn new() -> DynamicProperties {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"last_solidity_block_num\",\n            |m: &DynamicProperties| { &m.last_solidity_block_num },\n            |m: &mut DynamicProperties| { &mut m.last_solidity_block_num },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DynamicProperties>(\n            \"DynamicProperties\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for DynamicProperties {\n    const NAME: &'static str = \"DynamicProperties\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.last_solidity_block_num = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.last_solidity_block_num != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.last_solidity_block_num);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.last_solidity_block_num != 0 {\n            os.write_int64(1, self.last_solidity_block_num)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> DynamicProperties {\n        DynamicProperties::new()\n    }\n\n    fn clear(&mut self) {\n        self.last_solidity_block_num = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static DynamicProperties {\n        static instance: DynamicProperties = DynamicProperties {\n            last_solidity_block_num: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for DynamicProperties {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"DynamicProperties\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for DynamicProperties {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for DynamicProperties {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.DisconnectMessage)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct DisconnectMessage {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.DisconnectMessage.reason)\n    pub reason: ::protobuf::EnumOrUnknown<ReasonCode>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.DisconnectMessage.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a DisconnectMessage {\n    fn default() -> &'a DisconnectMessage {\n        <DisconnectMessage as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl DisconnectMessage {\n    pub fn new() -> DisconnectMessage {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"reason\",\n            |m: &DisconnectMessage| { &m.reason },\n            |m: &mut DisconnectMessage| { &mut m.reason },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DisconnectMessage>(\n            \"DisconnectMessage\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for DisconnectMessage {\n    const NAME: &'static str = \"DisconnectMessage\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.reason = is.read_enum_or_unknown()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.reason != ::protobuf::EnumOrUnknown::new(ReasonCode::REQUESTED) {\n            my_size += ::protobuf::rt::int32_size(1, self.reason.value());\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.reason != ::protobuf::EnumOrUnknown::new(ReasonCode::REQUESTED) {\n            os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.reason))?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> DisconnectMessage {\n        DisconnectMessage::new()\n    }\n\n    fn clear(&mut self) {\n        self.reason = ::protobuf::EnumOrUnknown::new(ReasonCode::REQUESTED);\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static DisconnectMessage {\n        static instance: DisconnectMessage = DisconnectMessage {\n            reason: ::protobuf::EnumOrUnknown::from_i32(0),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for DisconnectMessage {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"DisconnectMessage\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for DisconnectMessage {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for DisconnectMessage {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.HelloMessage)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct HelloMessage {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.HelloMessage.from)\n    pub from: ::protobuf::MessageField<super::Discover::Endpoint>,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.version)\n    pub version: i32,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.timestamp)\n    pub timestamp: i64,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.genesisBlockId)\n    pub genesisBlockId: ::protobuf::MessageField<hello_message::BlockId>,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.solidBlockId)\n    pub solidBlockId: ::protobuf::MessageField<hello_message::BlockId>,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.headBlockId)\n    pub headBlockId: ::protobuf::MessageField<hello_message::BlockId>,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.address)\n    pub address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.signature)\n    pub signature: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.nodeType)\n    pub nodeType: i32,\n    // @@protoc_insertion_point(field:protocol.HelloMessage.lowestBlockNum)\n    pub lowestBlockNum: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.HelloMessage.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a HelloMessage {\n    fn default() -> &'a HelloMessage {\n        <HelloMessage as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl HelloMessage {\n    pub fn new() -> HelloMessage {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(10);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::Discover::Endpoint>(\n            \"from\",\n            |m: &HelloMessage| { &m.from },\n            |m: &mut HelloMessage| { &mut m.from },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"version\",\n            |m: &HelloMessage| { &m.version },\n            |m: &mut HelloMessage| { &mut m.version },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &HelloMessage| { &m.timestamp },\n            |m: &mut HelloMessage| { &mut m.timestamp },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, hello_message::BlockId>(\n            \"genesisBlockId\",\n            |m: &HelloMessage| { &m.genesisBlockId },\n            |m: &mut HelloMessage| { &mut m.genesisBlockId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, hello_message::BlockId>(\n            \"solidBlockId\",\n            |m: &HelloMessage| { &m.solidBlockId },\n            |m: &mut HelloMessage| { &mut m.solidBlockId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, hello_message::BlockId>(\n            \"headBlockId\",\n            |m: &HelloMessage| { &m.headBlockId },\n            |m: &mut HelloMessage| { &mut m.headBlockId },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &HelloMessage| { &m.address },\n            |m: &mut HelloMessage| { &mut m.address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"signature\",\n            |m: &HelloMessage| { &m.signature },\n            |m: &mut HelloMessage| { &mut m.signature },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"nodeType\",\n            |m: &HelloMessage| { &m.nodeType },\n            |m: &mut HelloMessage| { &mut m.nodeType },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"lowestBlockNum\",\n            |m: &HelloMessage| { &m.lowestBlockNum },\n            |m: &mut HelloMessage| { &mut m.lowestBlockNum },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<HelloMessage>(\n            \"HelloMessage\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for HelloMessage {\n    const NAME: &'static str = \"HelloMessage\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.from)?;\n                },\n                16 => {\n                    self.version = is.read_int32()?;\n                },\n                24 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                34 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.genesisBlockId)?;\n                },\n                42 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.solidBlockId)?;\n                },\n                50 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.headBlockId)?;\n                },\n                58 => {\n                    self.address = is.read_bytes()?;\n                },\n                66 => {\n                    self.signature = is.read_bytes()?;\n                },\n                72 => {\n                    self.nodeType = is.read_int32()?;\n                },\n                80 => {\n                    self.lowestBlockNum = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.from.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.version != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.version);\n        }\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.timestamp);\n        }\n        if let Some(v) = self.genesisBlockId.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.solidBlockId.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.headBlockId.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(7, &self.address);\n        }\n        if !self.signature.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(8, &self.signature);\n        }\n        if self.nodeType != 0 {\n            my_size += ::protobuf::rt::int32_size(9, self.nodeType);\n        }\n        if self.lowestBlockNum != 0 {\n            my_size += ::protobuf::rt::int64_size(10, self.lowestBlockNum);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.from.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if self.version != 0 {\n            os.write_int32(2, self.version)?;\n        }\n        if self.timestamp != 0 {\n            os.write_int64(3, self.timestamp)?;\n        }\n        if let Some(v) = self.genesisBlockId.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n        }\n        if let Some(v) = self.solidBlockId.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?;\n        }\n        if let Some(v) = self.headBlockId.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(6, v, os)?;\n        }\n        if !self.address.is_empty() {\n            os.write_bytes(7, &self.address)?;\n        }\n        if !self.signature.is_empty() {\n            os.write_bytes(8, &self.signature)?;\n        }\n        if self.nodeType != 0 {\n            os.write_int32(9, self.nodeType)?;\n        }\n        if self.lowestBlockNum != 0 {\n            os.write_int64(10, self.lowestBlockNum)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> HelloMessage {\n        HelloMessage::new()\n    }\n\n    fn clear(&mut self) {\n        self.from.clear();\n        self.version = 0;\n        self.timestamp = 0;\n        self.genesisBlockId.clear();\n        self.solidBlockId.clear();\n        self.headBlockId.clear();\n        self.address.clear();\n        self.signature.clear();\n        self.nodeType = 0;\n        self.lowestBlockNum = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static HelloMessage {\n        static instance: HelloMessage = HelloMessage {\n            from: ::protobuf::MessageField::none(),\n            version: 0,\n            timestamp: 0,\n            genesisBlockId: ::protobuf::MessageField::none(),\n            solidBlockId: ::protobuf::MessageField::none(),\n            headBlockId: ::protobuf::MessageField::none(),\n            address: ::std::vec::Vec::new(),\n            signature: ::std::vec::Vec::new(),\n            nodeType: 0,\n            lowestBlockNum: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for HelloMessage {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"HelloMessage\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for HelloMessage {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for HelloMessage {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `HelloMessage`\npub mod hello_message {\n    // @@protoc_insertion_point(message:protocol.HelloMessage.BlockId)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct BlockId {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.HelloMessage.BlockId.hash)\n        pub hash: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.HelloMessage.BlockId.number)\n        pub number: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.HelloMessage.BlockId.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a BlockId {\n        fn default() -> &'a BlockId {\n            <BlockId as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl BlockId {\n        pub fn new() -> BlockId {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"hash\",\n                |m: &BlockId| { &m.hash },\n                |m: &mut BlockId| { &mut m.hash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"number\",\n                |m: &BlockId| { &m.number },\n                |m: &mut BlockId| { &mut m.number },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockId>(\n                \"HelloMessage.BlockId\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for BlockId {\n        const NAME: &'static str = \"BlockId\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.hash = is.read_bytes()?;\n                    },\n                    16 => {\n                        self.number = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.hash.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.hash);\n            }\n            if self.number != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.number);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.hash.is_empty() {\n                os.write_bytes(1, &self.hash)?;\n            }\n            if self.number != 0 {\n                os.write_int64(2, self.number)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> BlockId {\n            BlockId::new()\n        }\n\n        fn clear(&mut self) {\n            self.hash.clear();\n            self.number = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static BlockId {\n            static instance: BlockId = BlockId {\n                hash: ::std::vec::Vec::new(),\n                number: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for BlockId {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"HelloMessage.BlockId\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for BlockId {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for BlockId {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.InternalTransaction)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct InternalTransaction {\n    // message fields\n    ///  internalTransaction identity, the root InternalTransaction hash\n    ///  should equals to root transaction id.\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.hash)\n    pub hash: ::std::vec::Vec<u8>,\n    ///  the one send trx (TBD: or token) via function\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.caller_address)\n    pub caller_address: ::std::vec::Vec<u8>,\n    ///  the one recieve trx (TBD: or token) via function\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.transferTo_address)\n    pub transferTo_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.callValueInfo)\n    pub callValueInfo: ::std::vec::Vec<internal_transaction::CallValueInfo>,\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.note)\n    pub note: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.rejected)\n    pub rejected: bool,\n    // @@protoc_insertion_point(field:protocol.InternalTransaction.extra)\n    pub extra: ::std::string::String,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.InternalTransaction.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a InternalTransaction {\n    fn default() -> &'a InternalTransaction {\n        <InternalTransaction as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl InternalTransaction {\n    pub fn new() -> InternalTransaction {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(7);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"hash\",\n            |m: &InternalTransaction| { &m.hash },\n            |m: &mut InternalTransaction| { &mut m.hash },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"caller_address\",\n            |m: &InternalTransaction| { &m.caller_address },\n            |m: &mut InternalTransaction| { &mut m.caller_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"transferTo_address\",\n            |m: &InternalTransaction| { &m.transferTo_address },\n            |m: &mut InternalTransaction| { &mut m.transferTo_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"callValueInfo\",\n            |m: &InternalTransaction| { &m.callValueInfo },\n            |m: &mut InternalTransaction| { &mut m.callValueInfo },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"note\",\n            |m: &InternalTransaction| { &m.note },\n            |m: &mut InternalTransaction| { &mut m.note },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"rejected\",\n            |m: &InternalTransaction| { &m.rejected },\n            |m: &mut InternalTransaction| { &mut m.rejected },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"extra\",\n            |m: &InternalTransaction| { &m.extra },\n            |m: &mut InternalTransaction| { &mut m.extra },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<InternalTransaction>(\n            \"InternalTransaction\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for InternalTransaction {\n    const NAME: &'static str = \"InternalTransaction\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.hash = is.read_bytes()?;\n                },\n                18 => {\n                    self.caller_address = is.read_bytes()?;\n                },\n                26 => {\n                    self.transferTo_address = is.read_bytes()?;\n                },\n                34 => {\n                    self.callValueInfo.push(is.read_message()?);\n                },\n                42 => {\n                    self.note = is.read_bytes()?;\n                },\n                48 => {\n                    self.rejected = is.read_bool()?;\n                },\n                58 => {\n                    self.extra = is.read_string()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.hash.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.hash);\n        }\n        if !self.caller_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.caller_address);\n        }\n        if !self.transferTo_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.transferTo_address);\n        }\n        for value in &self.callValueInfo {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if !self.note.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(5, &self.note);\n        }\n        if self.rejected != false {\n            my_size += 1 + 1;\n        }\n        if !self.extra.is_empty() {\n            my_size += ::protobuf::rt::string_size(7, &self.extra);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.hash.is_empty() {\n            os.write_bytes(1, &self.hash)?;\n        }\n        if !self.caller_address.is_empty() {\n            os.write_bytes(2, &self.caller_address)?;\n        }\n        if !self.transferTo_address.is_empty() {\n            os.write_bytes(3, &self.transferTo_address)?;\n        }\n        for v in &self.callValueInfo {\n            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n        };\n        if !self.note.is_empty() {\n            os.write_bytes(5, &self.note)?;\n        }\n        if self.rejected != false {\n            os.write_bool(6, self.rejected)?;\n        }\n        if !self.extra.is_empty() {\n            os.write_string(7, &self.extra)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> InternalTransaction {\n        InternalTransaction::new()\n    }\n\n    fn clear(&mut self) {\n        self.hash.clear();\n        self.caller_address.clear();\n        self.transferTo_address.clear();\n        self.callValueInfo.clear();\n        self.note.clear();\n        self.rejected = false;\n        self.extra.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static InternalTransaction {\n        static instance: InternalTransaction = InternalTransaction {\n            hash: ::std::vec::Vec::new(),\n            caller_address: ::std::vec::Vec::new(),\n            transferTo_address: ::std::vec::Vec::new(),\n            callValueInfo: ::std::vec::Vec::new(),\n            note: ::std::vec::Vec::new(),\n            rejected: false,\n            extra: ::std::string::String::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for InternalTransaction {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"InternalTransaction\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for InternalTransaction {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for InternalTransaction {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `InternalTransaction`\npub mod internal_transaction {\n    // @@protoc_insertion_point(message:protocol.InternalTransaction.CallValueInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct CallValueInfo {\n        // message fields\n        ///  trx (TBD: or token) value\n        // @@protoc_insertion_point(field:protocol.InternalTransaction.CallValueInfo.callValue)\n        pub callValue: i64,\n        ///  TBD: tokenName, trx should be empty\n        // @@protoc_insertion_point(field:protocol.InternalTransaction.CallValueInfo.tokenId)\n        pub tokenId: ::std::string::String,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.InternalTransaction.CallValueInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a CallValueInfo {\n        fn default() -> &'a CallValueInfo {\n            <CallValueInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl CallValueInfo {\n        pub fn new() -> CallValueInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"callValue\",\n                |m: &CallValueInfo| { &m.callValue },\n                |m: &mut CallValueInfo| { &mut m.callValue },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"tokenId\",\n                |m: &CallValueInfo| { &m.tokenId },\n                |m: &mut CallValueInfo| { &mut m.tokenId },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<CallValueInfo>(\n                \"InternalTransaction.CallValueInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for CallValueInfo {\n        const NAME: &'static str = \"CallValueInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.callValue = is.read_int64()?;\n                    },\n                    18 => {\n                        self.tokenId = is.read_string()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.callValue != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.callValue);\n            }\n            if !self.tokenId.is_empty() {\n                my_size += ::protobuf::rt::string_size(2, &self.tokenId);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.callValue != 0 {\n                os.write_int64(1, self.callValue)?;\n            }\n            if !self.tokenId.is_empty() {\n                os.write_string(2, &self.tokenId)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> CallValueInfo {\n            CallValueInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.callValue = 0;\n            self.tokenId.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static CallValueInfo {\n            static instance: CallValueInfo = CallValueInfo {\n                callValue: 0,\n                tokenId: ::std::string::String::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for CallValueInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"InternalTransaction.CallValueInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for CallValueInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for CallValueInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.DelegatedResourceAccountIndex)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct DelegatedResourceAccountIndex {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.DelegatedResourceAccountIndex.account)\n    pub account: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.DelegatedResourceAccountIndex.fromAccounts)\n    pub fromAccounts: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.DelegatedResourceAccountIndex.toAccounts)\n    pub toAccounts: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.DelegatedResourceAccountIndex.timestamp)\n    pub timestamp: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.DelegatedResourceAccountIndex.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a DelegatedResourceAccountIndex {\n    fn default() -> &'a DelegatedResourceAccountIndex {\n        <DelegatedResourceAccountIndex as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl DelegatedResourceAccountIndex {\n    pub fn new() -> DelegatedResourceAccountIndex {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"account\",\n            |m: &DelegatedResourceAccountIndex| { &m.account },\n            |m: &mut DelegatedResourceAccountIndex| { &mut m.account },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"fromAccounts\",\n            |m: &DelegatedResourceAccountIndex| { &m.fromAccounts },\n            |m: &mut DelegatedResourceAccountIndex| { &mut m.fromAccounts },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"toAccounts\",\n            |m: &DelegatedResourceAccountIndex| { &m.toAccounts },\n            |m: &mut DelegatedResourceAccountIndex| { &mut m.toAccounts },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &DelegatedResourceAccountIndex| { &m.timestamp },\n            |m: &mut DelegatedResourceAccountIndex| { &mut m.timestamp },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DelegatedResourceAccountIndex>(\n            \"DelegatedResourceAccountIndex\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for DelegatedResourceAccountIndex {\n    const NAME: &'static str = \"DelegatedResourceAccountIndex\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.account = is.read_bytes()?;\n                },\n                18 => {\n                    self.fromAccounts.push(is.read_bytes()?);\n                },\n                26 => {\n                    self.toAccounts.push(is.read_bytes()?);\n                },\n                32 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.account.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.account);\n        }\n        for value in &self.fromAccounts {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        for value in &self.toAccounts {\n            my_size += ::protobuf::rt::bytes_size(3, &value);\n        };\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.timestamp);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.account.is_empty() {\n            os.write_bytes(1, &self.account)?;\n        }\n        for v in &self.fromAccounts {\n            os.write_bytes(2, &v)?;\n        };\n        for v in &self.toAccounts {\n            os.write_bytes(3, &v)?;\n        };\n        if self.timestamp != 0 {\n            os.write_int64(4, self.timestamp)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> DelegatedResourceAccountIndex {\n        DelegatedResourceAccountIndex::new()\n    }\n\n    fn clear(&mut self) {\n        self.account.clear();\n        self.fromAccounts.clear();\n        self.toAccounts.clear();\n        self.timestamp = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static DelegatedResourceAccountIndex {\n        static instance: DelegatedResourceAccountIndex = DelegatedResourceAccountIndex {\n            account: ::std::vec::Vec::new(),\n            fromAccounts: ::std::vec::Vec::new(),\n            toAccounts: ::std::vec::Vec::new(),\n            timestamp: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for DelegatedResourceAccountIndex {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"DelegatedResourceAccountIndex\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for DelegatedResourceAccountIndex {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for DelegatedResourceAccountIndex {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.NodeInfo)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct NodeInfo {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.NodeInfo.beginSyncNum)\n    pub beginSyncNum: i64,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.block)\n    pub block: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.solidityBlock)\n    pub solidityBlock: ::std::string::String,\n    /// connect information\n    // @@protoc_insertion_point(field:protocol.NodeInfo.currentConnectCount)\n    pub currentConnectCount: i32,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.activeConnectCount)\n    pub activeConnectCount: i32,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.passiveConnectCount)\n    pub passiveConnectCount: i32,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.totalFlow)\n    pub totalFlow: i64,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.peerInfoList)\n    pub peerInfoList: ::std::vec::Vec<node_info::PeerInfo>,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.configNodeInfo)\n    pub configNodeInfo: ::protobuf::MessageField<node_info::ConfigNodeInfo>,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.machineInfo)\n    pub machineInfo: ::protobuf::MessageField<node_info::MachineInfo>,\n    // @@protoc_insertion_point(field:protocol.NodeInfo.cheatWitnessInfoMap)\n    pub cheatWitnessInfoMap: ::std::collections::HashMap<::std::string::String, ::std::string::String>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.NodeInfo.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a NodeInfo {\n    fn default() -> &'a NodeInfo {\n        <NodeInfo as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl NodeInfo {\n    pub fn new() -> NodeInfo {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(11);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"beginSyncNum\",\n            |m: &NodeInfo| { &m.beginSyncNum },\n            |m: &mut NodeInfo| { &mut m.beginSyncNum },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"block\",\n            |m: &NodeInfo| { &m.block },\n            |m: &mut NodeInfo| { &mut m.block },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"solidityBlock\",\n            |m: &NodeInfo| { &m.solidityBlock },\n            |m: &mut NodeInfo| { &mut m.solidityBlock },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"currentConnectCount\",\n            |m: &NodeInfo| { &m.currentConnectCount },\n            |m: &mut NodeInfo| { &mut m.currentConnectCount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"activeConnectCount\",\n            |m: &NodeInfo| { &m.activeConnectCount },\n            |m: &mut NodeInfo| { &mut m.activeConnectCount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"passiveConnectCount\",\n            |m: &NodeInfo| { &m.passiveConnectCount },\n            |m: &mut NodeInfo| { &mut m.passiveConnectCount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"totalFlow\",\n            |m: &NodeInfo| { &m.totalFlow },\n            |m: &mut NodeInfo| { &mut m.totalFlow },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"peerInfoList\",\n            |m: &NodeInfo| { &m.peerInfoList },\n            |m: &mut NodeInfo| { &mut m.peerInfoList },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, node_info::ConfigNodeInfo>(\n            \"configNodeInfo\",\n            |m: &NodeInfo| { &m.configNodeInfo },\n            |m: &mut NodeInfo| { &mut m.configNodeInfo },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, node_info::MachineInfo>(\n            \"machineInfo\",\n            |m: &NodeInfo| { &m.machineInfo },\n            |m: &mut NodeInfo| { &mut m.machineInfo },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"cheatWitnessInfoMap\",\n            |m: &NodeInfo| { &m.cheatWitnessInfoMap },\n            |m: &mut NodeInfo| { &mut m.cheatWitnessInfoMap },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<NodeInfo>(\n            \"NodeInfo\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for NodeInfo {\n    const NAME: &'static str = \"NodeInfo\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.beginSyncNum = is.read_int64()?;\n                },\n                18 => {\n                    self.block = is.read_string()?;\n                },\n                26 => {\n                    self.solidityBlock = is.read_string()?;\n                },\n                32 => {\n                    self.currentConnectCount = is.read_int32()?;\n                },\n                40 => {\n                    self.activeConnectCount = is.read_int32()?;\n                },\n                48 => {\n                    self.passiveConnectCount = is.read_int32()?;\n                },\n                56 => {\n                    self.totalFlow = is.read_int64()?;\n                },\n                66 => {\n                    self.peerInfoList.push(is.read_message()?);\n                },\n                74 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.configNodeInfo)?;\n                },\n                82 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.machineInfo)?;\n                },\n                90 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => key = is.read_string()?,\n                            18 => value = is.read_string()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.cheatWitnessInfoMap.insert(key, value);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.beginSyncNum != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.beginSyncNum);\n        }\n        if !self.block.is_empty() {\n            my_size += ::protobuf::rt::string_size(2, &self.block);\n        }\n        if !self.solidityBlock.is_empty() {\n            my_size += ::protobuf::rt::string_size(3, &self.solidityBlock);\n        }\n        if self.currentConnectCount != 0 {\n            my_size += ::protobuf::rt::int32_size(4, self.currentConnectCount);\n        }\n        if self.activeConnectCount != 0 {\n            my_size += ::protobuf::rt::int32_size(5, self.activeConnectCount);\n        }\n        if self.passiveConnectCount != 0 {\n            my_size += ::protobuf::rt::int32_size(6, self.passiveConnectCount);\n        }\n        if self.totalFlow != 0 {\n            my_size += ::protobuf::rt::int64_size(7, self.totalFlow);\n        }\n        for value in &self.peerInfoList {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if let Some(v) = self.configNodeInfo.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.machineInfo.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for (k, v) in &self.cheatWitnessInfoMap {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::string_size(2, &v);\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.beginSyncNum != 0 {\n            os.write_int64(1, self.beginSyncNum)?;\n        }\n        if !self.block.is_empty() {\n            os.write_string(2, &self.block)?;\n        }\n        if !self.solidityBlock.is_empty() {\n            os.write_string(3, &self.solidityBlock)?;\n        }\n        if self.currentConnectCount != 0 {\n            os.write_int32(4, self.currentConnectCount)?;\n        }\n        if self.activeConnectCount != 0 {\n            os.write_int32(5, self.activeConnectCount)?;\n        }\n        if self.passiveConnectCount != 0 {\n            os.write_int32(6, self.passiveConnectCount)?;\n        }\n        if self.totalFlow != 0 {\n            os.write_int64(7, self.totalFlow)?;\n        }\n        for v in &self.peerInfoList {\n            ::protobuf::rt::write_message_field_with_cached_size(8, v, os)?;\n        };\n        if let Some(v) = self.configNodeInfo.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(9, v, os)?;\n        }\n        if let Some(v) = self.machineInfo.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?;\n        }\n        for (k, v) in &self.cheatWitnessInfoMap {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::string_size(1, &k);\n            entry_size += ::protobuf::rt::string_size(2, &v);\n            os.write_raw_varint32(90)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_string(1, &k)?;\n            os.write_string(2, &v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> NodeInfo {\n        NodeInfo::new()\n    }\n\n    fn clear(&mut self) {\n        self.beginSyncNum = 0;\n        self.block.clear();\n        self.solidityBlock.clear();\n        self.currentConnectCount = 0;\n        self.activeConnectCount = 0;\n        self.passiveConnectCount = 0;\n        self.totalFlow = 0;\n        self.peerInfoList.clear();\n        self.configNodeInfo.clear();\n        self.machineInfo.clear();\n        self.cheatWitnessInfoMap.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static NodeInfo {\n        static instance: ::protobuf::rt::Lazy<NodeInfo> = ::protobuf::rt::Lazy::new();\n        instance.get(NodeInfo::new)\n    }\n}\n\nimpl ::protobuf::MessageFull for NodeInfo {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"NodeInfo\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for NodeInfo {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for NodeInfo {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `NodeInfo`\npub mod node_info {\n    // @@protoc_insertion_point(message:protocol.NodeInfo.PeerInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct PeerInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.lastSyncBlock)\n        pub lastSyncBlock: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.remainNum)\n        pub remainNum: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.lastBlockUpdateTime)\n        pub lastBlockUpdateTime: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.syncFlag)\n        pub syncFlag: bool,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.headBlockTimeWeBothHave)\n        pub headBlockTimeWeBothHave: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.needSyncFromPeer)\n        pub needSyncFromPeer: bool,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.needSyncFromUs)\n        pub needSyncFromUs: bool,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.host)\n        pub host: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.port)\n        pub port: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.nodeId)\n        pub nodeId: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.connectTime)\n        pub connectTime: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.avgLatency)\n        pub avgLatency: f64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.syncToFetchSize)\n        pub syncToFetchSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.syncToFetchSizePeekNum)\n        pub syncToFetchSizePeekNum: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.syncBlockRequestedSize)\n        pub syncBlockRequestedSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.unFetchSynNum)\n        pub unFetchSynNum: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.blockInPorcSize)\n        pub blockInPorcSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.headBlockWeBothHave)\n        pub headBlockWeBothHave: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.isActive)\n        pub isActive: bool,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.score)\n        pub score: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.nodeCount)\n        pub nodeCount: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.inFlow)\n        pub inFlow: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.disconnectTimes)\n        pub disconnectTimes: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.localDisconnectReason)\n        pub localDisconnectReason: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.PeerInfo.remoteDisconnectReason)\n        pub remoteDisconnectReason: ::std::string::String,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.NodeInfo.PeerInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a PeerInfo {\n        fn default() -> &'a PeerInfo {\n            <PeerInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl PeerInfo {\n        pub fn new() -> PeerInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(25);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"lastSyncBlock\",\n                |m: &PeerInfo| { &m.lastSyncBlock },\n                |m: &mut PeerInfo| { &mut m.lastSyncBlock },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"remainNum\",\n                |m: &PeerInfo| { &m.remainNum },\n                |m: &mut PeerInfo| { &mut m.remainNum },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"lastBlockUpdateTime\",\n                |m: &PeerInfo| { &m.lastBlockUpdateTime },\n                |m: &mut PeerInfo| { &mut m.lastBlockUpdateTime },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"syncFlag\",\n                |m: &PeerInfo| { &m.syncFlag },\n                |m: &mut PeerInfo| { &mut m.syncFlag },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"headBlockTimeWeBothHave\",\n                |m: &PeerInfo| { &m.headBlockTimeWeBothHave },\n                |m: &mut PeerInfo| { &mut m.headBlockTimeWeBothHave },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"needSyncFromPeer\",\n                |m: &PeerInfo| { &m.needSyncFromPeer },\n                |m: &mut PeerInfo| { &mut m.needSyncFromPeer },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"needSyncFromUs\",\n                |m: &PeerInfo| { &m.needSyncFromUs },\n                |m: &mut PeerInfo| { &mut m.needSyncFromUs },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"host\",\n                |m: &PeerInfo| { &m.host },\n                |m: &mut PeerInfo| { &mut m.host },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"port\",\n                |m: &PeerInfo| { &m.port },\n                |m: &mut PeerInfo| { &mut m.port },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"nodeId\",\n                |m: &PeerInfo| { &m.nodeId },\n                |m: &mut PeerInfo| { &mut m.nodeId },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"connectTime\",\n                |m: &PeerInfo| { &m.connectTime },\n                |m: &mut PeerInfo| { &mut m.connectTime },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"avgLatency\",\n                |m: &PeerInfo| { &m.avgLatency },\n                |m: &mut PeerInfo| { &mut m.avgLatency },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"syncToFetchSize\",\n                |m: &PeerInfo| { &m.syncToFetchSize },\n                |m: &mut PeerInfo| { &mut m.syncToFetchSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"syncToFetchSizePeekNum\",\n                |m: &PeerInfo| { &m.syncToFetchSizePeekNum },\n                |m: &mut PeerInfo| { &mut m.syncToFetchSizePeekNum },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"syncBlockRequestedSize\",\n                |m: &PeerInfo| { &m.syncBlockRequestedSize },\n                |m: &mut PeerInfo| { &mut m.syncBlockRequestedSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"unFetchSynNum\",\n                |m: &PeerInfo| { &m.unFetchSynNum },\n                |m: &mut PeerInfo| { &mut m.unFetchSynNum },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"blockInPorcSize\",\n                |m: &PeerInfo| { &m.blockInPorcSize },\n                |m: &mut PeerInfo| { &mut m.blockInPorcSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"headBlockWeBothHave\",\n                |m: &PeerInfo| { &m.headBlockWeBothHave },\n                |m: &mut PeerInfo| { &mut m.headBlockWeBothHave },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"isActive\",\n                |m: &PeerInfo| { &m.isActive },\n                |m: &mut PeerInfo| { &mut m.isActive },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"score\",\n                |m: &PeerInfo| { &m.score },\n                |m: &mut PeerInfo| { &mut m.score },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"nodeCount\",\n                |m: &PeerInfo| { &m.nodeCount },\n                |m: &mut PeerInfo| { &mut m.nodeCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"inFlow\",\n                |m: &PeerInfo| { &m.inFlow },\n                |m: &mut PeerInfo| { &mut m.inFlow },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"disconnectTimes\",\n                |m: &PeerInfo| { &m.disconnectTimes },\n                |m: &mut PeerInfo| { &mut m.disconnectTimes },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"localDisconnectReason\",\n                |m: &PeerInfo| { &m.localDisconnectReason },\n                |m: &mut PeerInfo| { &mut m.localDisconnectReason },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"remoteDisconnectReason\",\n                |m: &PeerInfo| { &m.remoteDisconnectReason },\n                |m: &mut PeerInfo| { &mut m.remoteDisconnectReason },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<PeerInfo>(\n                \"NodeInfo.PeerInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for PeerInfo {\n        const NAME: &'static str = \"PeerInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.lastSyncBlock = is.read_string()?;\n                    },\n                    16 => {\n                        self.remainNum = is.read_int64()?;\n                    },\n                    24 => {\n                        self.lastBlockUpdateTime = is.read_int64()?;\n                    },\n                    32 => {\n                        self.syncFlag = is.read_bool()?;\n                    },\n                    40 => {\n                        self.headBlockTimeWeBothHave = is.read_int64()?;\n                    },\n                    48 => {\n                        self.needSyncFromPeer = is.read_bool()?;\n                    },\n                    56 => {\n                        self.needSyncFromUs = is.read_bool()?;\n                    },\n                    66 => {\n                        self.host = is.read_string()?;\n                    },\n                    72 => {\n                        self.port = is.read_int32()?;\n                    },\n                    82 => {\n                        self.nodeId = is.read_string()?;\n                    },\n                    88 => {\n                        self.connectTime = is.read_int64()?;\n                    },\n                    97 => {\n                        self.avgLatency = is.read_double()?;\n                    },\n                    104 => {\n                        self.syncToFetchSize = is.read_int32()?;\n                    },\n                    112 => {\n                        self.syncToFetchSizePeekNum = is.read_int64()?;\n                    },\n                    120 => {\n                        self.syncBlockRequestedSize = is.read_int32()?;\n                    },\n                    128 => {\n                        self.unFetchSynNum = is.read_int64()?;\n                    },\n                    136 => {\n                        self.blockInPorcSize = is.read_int32()?;\n                    },\n                    146 => {\n                        self.headBlockWeBothHave = is.read_string()?;\n                    },\n                    152 => {\n                        self.isActive = is.read_bool()?;\n                    },\n                    160 => {\n                        self.score = is.read_int32()?;\n                    },\n                    168 => {\n                        self.nodeCount = is.read_int32()?;\n                    },\n                    176 => {\n                        self.inFlow = is.read_int64()?;\n                    },\n                    184 => {\n                        self.disconnectTimes = is.read_int32()?;\n                    },\n                    194 => {\n                        self.localDisconnectReason = is.read_string()?;\n                    },\n                    202 => {\n                        self.remoteDisconnectReason = is.read_string()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.lastSyncBlock.is_empty() {\n                my_size += ::protobuf::rt::string_size(1, &self.lastSyncBlock);\n            }\n            if self.remainNum != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.remainNum);\n            }\n            if self.lastBlockUpdateTime != 0 {\n                my_size += ::protobuf::rt::int64_size(3, self.lastBlockUpdateTime);\n            }\n            if self.syncFlag != false {\n                my_size += 1 + 1;\n            }\n            if self.headBlockTimeWeBothHave != 0 {\n                my_size += ::protobuf::rt::int64_size(5, self.headBlockTimeWeBothHave);\n            }\n            if self.needSyncFromPeer != false {\n                my_size += 1 + 1;\n            }\n            if self.needSyncFromUs != false {\n                my_size += 1 + 1;\n            }\n            if !self.host.is_empty() {\n                my_size += ::protobuf::rt::string_size(8, &self.host);\n            }\n            if self.port != 0 {\n                my_size += ::protobuf::rt::int32_size(9, self.port);\n            }\n            if !self.nodeId.is_empty() {\n                my_size += ::protobuf::rt::string_size(10, &self.nodeId);\n            }\n            if self.connectTime != 0 {\n                my_size += ::protobuf::rt::int64_size(11, self.connectTime);\n            }\n            if self.avgLatency != 0. {\n                my_size += 1 + 8;\n            }\n            if self.syncToFetchSize != 0 {\n                my_size += ::protobuf::rt::int32_size(13, self.syncToFetchSize);\n            }\n            if self.syncToFetchSizePeekNum != 0 {\n                my_size += ::protobuf::rt::int64_size(14, self.syncToFetchSizePeekNum);\n            }\n            if self.syncBlockRequestedSize != 0 {\n                my_size += ::protobuf::rt::int32_size(15, self.syncBlockRequestedSize);\n            }\n            if self.unFetchSynNum != 0 {\n                my_size += ::protobuf::rt::int64_size(16, self.unFetchSynNum);\n            }\n            if self.blockInPorcSize != 0 {\n                my_size += ::protobuf::rt::int32_size(17, self.blockInPorcSize);\n            }\n            if !self.headBlockWeBothHave.is_empty() {\n                my_size += ::protobuf::rt::string_size(18, &self.headBlockWeBothHave);\n            }\n            if self.isActive != false {\n                my_size += 2 + 1;\n            }\n            if self.score != 0 {\n                my_size += ::protobuf::rt::int32_size(20, self.score);\n            }\n            if self.nodeCount != 0 {\n                my_size += ::protobuf::rt::int32_size(21, self.nodeCount);\n            }\n            if self.inFlow != 0 {\n                my_size += ::protobuf::rt::int64_size(22, self.inFlow);\n            }\n            if self.disconnectTimes != 0 {\n                my_size += ::protobuf::rt::int32_size(23, self.disconnectTimes);\n            }\n            if !self.localDisconnectReason.is_empty() {\n                my_size += ::protobuf::rt::string_size(24, &self.localDisconnectReason);\n            }\n            if !self.remoteDisconnectReason.is_empty() {\n                my_size += ::protobuf::rt::string_size(25, &self.remoteDisconnectReason);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.lastSyncBlock.is_empty() {\n                os.write_string(1, &self.lastSyncBlock)?;\n            }\n            if self.remainNum != 0 {\n                os.write_int64(2, self.remainNum)?;\n            }\n            if self.lastBlockUpdateTime != 0 {\n                os.write_int64(3, self.lastBlockUpdateTime)?;\n            }\n            if self.syncFlag != false {\n                os.write_bool(4, self.syncFlag)?;\n            }\n            if self.headBlockTimeWeBothHave != 0 {\n                os.write_int64(5, self.headBlockTimeWeBothHave)?;\n            }\n            if self.needSyncFromPeer != false {\n                os.write_bool(6, self.needSyncFromPeer)?;\n            }\n            if self.needSyncFromUs != false {\n                os.write_bool(7, self.needSyncFromUs)?;\n            }\n            if !self.host.is_empty() {\n                os.write_string(8, &self.host)?;\n            }\n            if self.port != 0 {\n                os.write_int32(9, self.port)?;\n            }\n            if !self.nodeId.is_empty() {\n                os.write_string(10, &self.nodeId)?;\n            }\n            if self.connectTime != 0 {\n                os.write_int64(11, self.connectTime)?;\n            }\n            if self.avgLatency != 0. {\n                os.write_double(12, self.avgLatency)?;\n            }\n            if self.syncToFetchSize != 0 {\n                os.write_int32(13, self.syncToFetchSize)?;\n            }\n            if self.syncToFetchSizePeekNum != 0 {\n                os.write_int64(14, self.syncToFetchSizePeekNum)?;\n            }\n            if self.syncBlockRequestedSize != 0 {\n                os.write_int32(15, self.syncBlockRequestedSize)?;\n            }\n            if self.unFetchSynNum != 0 {\n                os.write_int64(16, self.unFetchSynNum)?;\n            }\n            if self.blockInPorcSize != 0 {\n                os.write_int32(17, self.blockInPorcSize)?;\n            }\n            if !self.headBlockWeBothHave.is_empty() {\n                os.write_string(18, &self.headBlockWeBothHave)?;\n            }\n            if self.isActive != false {\n                os.write_bool(19, self.isActive)?;\n            }\n            if self.score != 0 {\n                os.write_int32(20, self.score)?;\n            }\n            if self.nodeCount != 0 {\n                os.write_int32(21, self.nodeCount)?;\n            }\n            if self.inFlow != 0 {\n                os.write_int64(22, self.inFlow)?;\n            }\n            if self.disconnectTimes != 0 {\n                os.write_int32(23, self.disconnectTimes)?;\n            }\n            if !self.localDisconnectReason.is_empty() {\n                os.write_string(24, &self.localDisconnectReason)?;\n            }\n            if !self.remoteDisconnectReason.is_empty() {\n                os.write_string(25, &self.remoteDisconnectReason)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> PeerInfo {\n            PeerInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.lastSyncBlock.clear();\n            self.remainNum = 0;\n            self.lastBlockUpdateTime = 0;\n            self.syncFlag = false;\n            self.headBlockTimeWeBothHave = 0;\n            self.needSyncFromPeer = false;\n            self.needSyncFromUs = false;\n            self.host.clear();\n            self.port = 0;\n            self.nodeId.clear();\n            self.connectTime = 0;\n            self.avgLatency = 0.;\n            self.syncToFetchSize = 0;\n            self.syncToFetchSizePeekNum = 0;\n            self.syncBlockRequestedSize = 0;\n            self.unFetchSynNum = 0;\n            self.blockInPorcSize = 0;\n            self.headBlockWeBothHave.clear();\n            self.isActive = false;\n            self.score = 0;\n            self.nodeCount = 0;\n            self.inFlow = 0;\n            self.disconnectTimes = 0;\n            self.localDisconnectReason.clear();\n            self.remoteDisconnectReason.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static PeerInfo {\n            static instance: PeerInfo = PeerInfo {\n                lastSyncBlock: ::std::string::String::new(),\n                remainNum: 0,\n                lastBlockUpdateTime: 0,\n                syncFlag: false,\n                headBlockTimeWeBothHave: 0,\n                needSyncFromPeer: false,\n                needSyncFromUs: false,\n                host: ::std::string::String::new(),\n                port: 0,\n                nodeId: ::std::string::String::new(),\n                connectTime: 0,\n                avgLatency: 0.,\n                syncToFetchSize: 0,\n                syncToFetchSizePeekNum: 0,\n                syncBlockRequestedSize: 0,\n                unFetchSynNum: 0,\n                blockInPorcSize: 0,\n                headBlockWeBothHave: ::std::string::String::new(),\n                isActive: false,\n                score: 0,\n                nodeCount: 0,\n                inFlow: 0,\n                disconnectTimes: 0,\n                localDisconnectReason: ::std::string::String::new(),\n                remoteDisconnectReason: ::std::string::String::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for PeerInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"NodeInfo.PeerInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for PeerInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for PeerInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.NodeInfo.ConfigNodeInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct ConfigNodeInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.codeVersion)\n        pub codeVersion: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.p2pVersion)\n        pub p2pVersion: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.listenPort)\n        pub listenPort: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.discoverEnable)\n        pub discoverEnable: bool,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.activeNodeSize)\n        pub activeNodeSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.passiveNodeSize)\n        pub passiveNodeSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.sendNodeSize)\n        pub sendNodeSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.maxConnectCount)\n        pub maxConnectCount: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.sameIpMaxConnectCount)\n        pub sameIpMaxConnectCount: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.backupListenPort)\n        pub backupListenPort: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.backupMemberSize)\n        pub backupMemberSize: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.backupPriority)\n        pub backupPriority: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.dbVersion)\n        pub dbVersion: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.minParticipationRate)\n        pub minParticipationRate: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.supportConstant)\n        pub supportConstant: bool,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.minTimeRatio)\n        pub minTimeRatio: f64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.maxTimeRatio)\n        pub maxTimeRatio: f64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.allowCreationOfContracts)\n        pub allowCreationOfContracts: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.ConfigNodeInfo.allowAdaptiveEnergy)\n        pub allowAdaptiveEnergy: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.NodeInfo.ConfigNodeInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a ConfigNodeInfo {\n        fn default() -> &'a ConfigNodeInfo {\n            <ConfigNodeInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl ConfigNodeInfo {\n        pub fn new() -> ConfigNodeInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(19);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"codeVersion\",\n                |m: &ConfigNodeInfo| { &m.codeVersion },\n                |m: &mut ConfigNodeInfo| { &mut m.codeVersion },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"p2pVersion\",\n                |m: &ConfigNodeInfo| { &m.p2pVersion },\n                |m: &mut ConfigNodeInfo| { &mut m.p2pVersion },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"listenPort\",\n                |m: &ConfigNodeInfo| { &m.listenPort },\n                |m: &mut ConfigNodeInfo| { &mut m.listenPort },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"discoverEnable\",\n                |m: &ConfigNodeInfo| { &m.discoverEnable },\n                |m: &mut ConfigNodeInfo| { &mut m.discoverEnable },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"activeNodeSize\",\n                |m: &ConfigNodeInfo| { &m.activeNodeSize },\n                |m: &mut ConfigNodeInfo| { &mut m.activeNodeSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"passiveNodeSize\",\n                |m: &ConfigNodeInfo| { &m.passiveNodeSize },\n                |m: &mut ConfigNodeInfo| { &mut m.passiveNodeSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"sendNodeSize\",\n                |m: &ConfigNodeInfo| { &m.sendNodeSize },\n                |m: &mut ConfigNodeInfo| { &mut m.sendNodeSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"maxConnectCount\",\n                |m: &ConfigNodeInfo| { &m.maxConnectCount },\n                |m: &mut ConfigNodeInfo| { &mut m.maxConnectCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"sameIpMaxConnectCount\",\n                |m: &ConfigNodeInfo| { &m.sameIpMaxConnectCount },\n                |m: &mut ConfigNodeInfo| { &mut m.sameIpMaxConnectCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"backupListenPort\",\n                |m: &ConfigNodeInfo| { &m.backupListenPort },\n                |m: &mut ConfigNodeInfo| { &mut m.backupListenPort },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"backupMemberSize\",\n                |m: &ConfigNodeInfo| { &m.backupMemberSize },\n                |m: &mut ConfigNodeInfo| { &mut m.backupMemberSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"backupPriority\",\n                |m: &ConfigNodeInfo| { &m.backupPriority },\n                |m: &mut ConfigNodeInfo| { &mut m.backupPriority },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"dbVersion\",\n                |m: &ConfigNodeInfo| { &m.dbVersion },\n                |m: &mut ConfigNodeInfo| { &mut m.dbVersion },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"minParticipationRate\",\n                |m: &ConfigNodeInfo| { &m.minParticipationRate },\n                |m: &mut ConfigNodeInfo| { &mut m.minParticipationRate },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"supportConstant\",\n                |m: &ConfigNodeInfo| { &m.supportConstant },\n                |m: &mut ConfigNodeInfo| { &mut m.supportConstant },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"minTimeRatio\",\n                |m: &ConfigNodeInfo| { &m.minTimeRatio },\n                |m: &mut ConfigNodeInfo| { &mut m.minTimeRatio },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"maxTimeRatio\",\n                |m: &ConfigNodeInfo| { &m.maxTimeRatio },\n                |m: &mut ConfigNodeInfo| { &mut m.maxTimeRatio },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"allowCreationOfContracts\",\n                |m: &ConfigNodeInfo| { &m.allowCreationOfContracts },\n                |m: &mut ConfigNodeInfo| { &mut m.allowCreationOfContracts },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"allowAdaptiveEnergy\",\n                |m: &ConfigNodeInfo| { &m.allowAdaptiveEnergy },\n                |m: &mut ConfigNodeInfo| { &mut m.allowAdaptiveEnergy },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ConfigNodeInfo>(\n                \"NodeInfo.ConfigNodeInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for ConfigNodeInfo {\n        const NAME: &'static str = \"ConfigNodeInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.codeVersion = is.read_string()?;\n                    },\n                    18 => {\n                        self.p2pVersion = is.read_string()?;\n                    },\n                    24 => {\n                        self.listenPort = is.read_int32()?;\n                    },\n                    32 => {\n                        self.discoverEnable = is.read_bool()?;\n                    },\n                    40 => {\n                        self.activeNodeSize = is.read_int32()?;\n                    },\n                    48 => {\n                        self.passiveNodeSize = is.read_int32()?;\n                    },\n                    56 => {\n                        self.sendNodeSize = is.read_int32()?;\n                    },\n                    64 => {\n                        self.maxConnectCount = is.read_int32()?;\n                    },\n                    72 => {\n                        self.sameIpMaxConnectCount = is.read_int32()?;\n                    },\n                    80 => {\n                        self.backupListenPort = is.read_int32()?;\n                    },\n                    88 => {\n                        self.backupMemberSize = is.read_int32()?;\n                    },\n                    96 => {\n                        self.backupPriority = is.read_int32()?;\n                    },\n                    104 => {\n                        self.dbVersion = is.read_int32()?;\n                    },\n                    112 => {\n                        self.minParticipationRate = is.read_int32()?;\n                    },\n                    120 => {\n                        self.supportConstant = is.read_bool()?;\n                    },\n                    129 => {\n                        self.minTimeRatio = is.read_double()?;\n                    },\n                    137 => {\n                        self.maxTimeRatio = is.read_double()?;\n                    },\n                    144 => {\n                        self.allowCreationOfContracts = is.read_int64()?;\n                    },\n                    152 => {\n                        self.allowAdaptiveEnergy = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.codeVersion.is_empty() {\n                my_size += ::protobuf::rt::string_size(1, &self.codeVersion);\n            }\n            if !self.p2pVersion.is_empty() {\n                my_size += ::protobuf::rt::string_size(2, &self.p2pVersion);\n            }\n            if self.listenPort != 0 {\n                my_size += ::protobuf::rt::int32_size(3, self.listenPort);\n            }\n            if self.discoverEnable != false {\n                my_size += 1 + 1;\n            }\n            if self.activeNodeSize != 0 {\n                my_size += ::protobuf::rt::int32_size(5, self.activeNodeSize);\n            }\n            if self.passiveNodeSize != 0 {\n                my_size += ::protobuf::rt::int32_size(6, self.passiveNodeSize);\n            }\n            if self.sendNodeSize != 0 {\n                my_size += ::protobuf::rt::int32_size(7, self.sendNodeSize);\n            }\n            if self.maxConnectCount != 0 {\n                my_size += ::protobuf::rt::int32_size(8, self.maxConnectCount);\n            }\n            if self.sameIpMaxConnectCount != 0 {\n                my_size += ::protobuf::rt::int32_size(9, self.sameIpMaxConnectCount);\n            }\n            if self.backupListenPort != 0 {\n                my_size += ::protobuf::rt::int32_size(10, self.backupListenPort);\n            }\n            if self.backupMemberSize != 0 {\n                my_size += ::protobuf::rt::int32_size(11, self.backupMemberSize);\n            }\n            if self.backupPriority != 0 {\n                my_size += ::protobuf::rt::int32_size(12, self.backupPriority);\n            }\n            if self.dbVersion != 0 {\n                my_size += ::protobuf::rt::int32_size(13, self.dbVersion);\n            }\n            if self.minParticipationRate != 0 {\n                my_size += ::protobuf::rt::int32_size(14, self.minParticipationRate);\n            }\n            if self.supportConstant != false {\n                my_size += 1 + 1;\n            }\n            if self.minTimeRatio != 0. {\n                my_size += 2 + 8;\n            }\n            if self.maxTimeRatio != 0. {\n                my_size += 2 + 8;\n            }\n            if self.allowCreationOfContracts != 0 {\n                my_size += ::protobuf::rt::int64_size(18, self.allowCreationOfContracts);\n            }\n            if self.allowAdaptiveEnergy != 0 {\n                my_size += ::protobuf::rt::int64_size(19, self.allowAdaptiveEnergy);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.codeVersion.is_empty() {\n                os.write_string(1, &self.codeVersion)?;\n            }\n            if !self.p2pVersion.is_empty() {\n                os.write_string(2, &self.p2pVersion)?;\n            }\n            if self.listenPort != 0 {\n                os.write_int32(3, self.listenPort)?;\n            }\n            if self.discoverEnable != false {\n                os.write_bool(4, self.discoverEnable)?;\n            }\n            if self.activeNodeSize != 0 {\n                os.write_int32(5, self.activeNodeSize)?;\n            }\n            if self.passiveNodeSize != 0 {\n                os.write_int32(6, self.passiveNodeSize)?;\n            }\n            if self.sendNodeSize != 0 {\n                os.write_int32(7, self.sendNodeSize)?;\n            }\n            if self.maxConnectCount != 0 {\n                os.write_int32(8, self.maxConnectCount)?;\n            }\n            if self.sameIpMaxConnectCount != 0 {\n                os.write_int32(9, self.sameIpMaxConnectCount)?;\n            }\n            if self.backupListenPort != 0 {\n                os.write_int32(10, self.backupListenPort)?;\n            }\n            if self.backupMemberSize != 0 {\n                os.write_int32(11, self.backupMemberSize)?;\n            }\n            if self.backupPriority != 0 {\n                os.write_int32(12, self.backupPriority)?;\n            }\n            if self.dbVersion != 0 {\n                os.write_int32(13, self.dbVersion)?;\n            }\n            if self.minParticipationRate != 0 {\n                os.write_int32(14, self.minParticipationRate)?;\n            }\n            if self.supportConstant != false {\n                os.write_bool(15, self.supportConstant)?;\n            }\n            if self.minTimeRatio != 0. {\n                os.write_double(16, self.minTimeRatio)?;\n            }\n            if self.maxTimeRatio != 0. {\n                os.write_double(17, self.maxTimeRatio)?;\n            }\n            if self.allowCreationOfContracts != 0 {\n                os.write_int64(18, self.allowCreationOfContracts)?;\n            }\n            if self.allowAdaptiveEnergy != 0 {\n                os.write_int64(19, self.allowAdaptiveEnergy)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> ConfigNodeInfo {\n            ConfigNodeInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.codeVersion.clear();\n            self.p2pVersion.clear();\n            self.listenPort = 0;\n            self.discoverEnable = false;\n            self.activeNodeSize = 0;\n            self.passiveNodeSize = 0;\n            self.sendNodeSize = 0;\n            self.maxConnectCount = 0;\n            self.sameIpMaxConnectCount = 0;\n            self.backupListenPort = 0;\n            self.backupMemberSize = 0;\n            self.backupPriority = 0;\n            self.dbVersion = 0;\n            self.minParticipationRate = 0;\n            self.supportConstant = false;\n            self.minTimeRatio = 0.;\n            self.maxTimeRatio = 0.;\n            self.allowCreationOfContracts = 0;\n            self.allowAdaptiveEnergy = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static ConfigNodeInfo {\n            static instance: ConfigNodeInfo = ConfigNodeInfo {\n                codeVersion: ::std::string::String::new(),\n                p2pVersion: ::std::string::String::new(),\n                listenPort: 0,\n                discoverEnable: false,\n                activeNodeSize: 0,\n                passiveNodeSize: 0,\n                sendNodeSize: 0,\n                maxConnectCount: 0,\n                sameIpMaxConnectCount: 0,\n                backupListenPort: 0,\n                backupMemberSize: 0,\n                backupPriority: 0,\n                dbVersion: 0,\n                minParticipationRate: 0,\n                supportConstant: false,\n                minTimeRatio: 0.,\n                maxTimeRatio: 0.,\n                allowCreationOfContracts: 0,\n                allowAdaptiveEnergy: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for ConfigNodeInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"NodeInfo.ConfigNodeInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for ConfigNodeInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for ConfigNodeInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.NodeInfo.MachineInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct MachineInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.threadCount)\n        pub threadCount: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.deadLockThreadCount)\n        pub deadLockThreadCount: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.cpuCount)\n        pub cpuCount: i32,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.totalMemory)\n        pub totalMemory: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.freeMemory)\n        pub freeMemory: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.cpuRate)\n        pub cpuRate: f64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.javaVersion)\n        pub javaVersion: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.osName)\n        pub osName: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.jvmTotalMemory)\n        pub jvmTotalMemory: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.jvmFreeMemory)\n        pub jvmFreeMemory: i64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.processCpuRate)\n        pub processCpuRate: f64,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.memoryDescInfoList)\n        pub memoryDescInfoList: ::std::vec::Vec<machine_info::MemoryDescInfo>,\n        // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.deadLockThreadInfoList)\n        pub deadLockThreadInfoList: ::std::vec::Vec<machine_info::DeadLockThreadInfo>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.NodeInfo.MachineInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a MachineInfo {\n        fn default() -> &'a MachineInfo {\n            <MachineInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl MachineInfo {\n        pub fn new() -> MachineInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(13);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"threadCount\",\n                |m: &MachineInfo| { &m.threadCount },\n                |m: &mut MachineInfo| { &mut m.threadCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"deadLockThreadCount\",\n                |m: &MachineInfo| { &m.deadLockThreadCount },\n                |m: &mut MachineInfo| { &mut m.deadLockThreadCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"cpuCount\",\n                |m: &MachineInfo| { &m.cpuCount },\n                |m: &mut MachineInfo| { &mut m.cpuCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"totalMemory\",\n                |m: &MachineInfo| { &m.totalMemory },\n                |m: &mut MachineInfo| { &mut m.totalMemory },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"freeMemory\",\n                |m: &MachineInfo| { &m.freeMemory },\n                |m: &mut MachineInfo| { &mut m.freeMemory },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"cpuRate\",\n                |m: &MachineInfo| { &m.cpuRate },\n                |m: &mut MachineInfo| { &mut m.cpuRate },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"javaVersion\",\n                |m: &MachineInfo| { &m.javaVersion },\n                |m: &mut MachineInfo| { &mut m.javaVersion },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"osName\",\n                |m: &MachineInfo| { &m.osName },\n                |m: &mut MachineInfo| { &mut m.osName },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"jvmTotalMemory\",\n                |m: &MachineInfo| { &m.jvmTotalMemory },\n                |m: &mut MachineInfo| { &mut m.jvmTotalMemory },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"jvmFreeMemory\",\n                |m: &MachineInfo| { &m.jvmFreeMemory },\n                |m: &mut MachineInfo| { &mut m.jvmFreeMemory },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"processCpuRate\",\n                |m: &MachineInfo| { &m.processCpuRate },\n                |m: &mut MachineInfo| { &mut m.processCpuRate },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"memoryDescInfoList\",\n                |m: &MachineInfo| { &m.memoryDescInfoList },\n                |m: &mut MachineInfo| { &mut m.memoryDescInfoList },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"deadLockThreadInfoList\",\n                |m: &MachineInfo| { &m.deadLockThreadInfoList },\n                |m: &mut MachineInfo| { &mut m.deadLockThreadInfoList },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MachineInfo>(\n                \"NodeInfo.MachineInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for MachineInfo {\n        const NAME: &'static str = \"MachineInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.threadCount = is.read_int32()?;\n                    },\n                    16 => {\n                        self.deadLockThreadCount = is.read_int32()?;\n                    },\n                    24 => {\n                        self.cpuCount = is.read_int32()?;\n                    },\n                    32 => {\n                        self.totalMemory = is.read_int64()?;\n                    },\n                    40 => {\n                        self.freeMemory = is.read_int64()?;\n                    },\n                    49 => {\n                        self.cpuRate = is.read_double()?;\n                    },\n                    58 => {\n                        self.javaVersion = is.read_string()?;\n                    },\n                    66 => {\n                        self.osName = is.read_string()?;\n                    },\n                    72 => {\n                        self.jvmTotalMemory = is.read_int64()?;\n                    },\n                    80 => {\n                        self.jvmFreeMemory = is.read_int64()?;\n                    },\n                    89 => {\n                        self.processCpuRate = is.read_double()?;\n                    },\n                    98 => {\n                        self.memoryDescInfoList.push(is.read_message()?);\n                    },\n                    106 => {\n                        self.deadLockThreadInfoList.push(is.read_message()?);\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.threadCount != 0 {\n                my_size += ::protobuf::rt::int32_size(1, self.threadCount);\n            }\n            if self.deadLockThreadCount != 0 {\n                my_size += ::protobuf::rt::int32_size(2, self.deadLockThreadCount);\n            }\n            if self.cpuCount != 0 {\n                my_size += ::protobuf::rt::int32_size(3, self.cpuCount);\n            }\n            if self.totalMemory != 0 {\n                my_size += ::protobuf::rt::int64_size(4, self.totalMemory);\n            }\n            if self.freeMemory != 0 {\n                my_size += ::protobuf::rt::int64_size(5, self.freeMemory);\n            }\n            if self.cpuRate != 0. {\n                my_size += 1 + 8;\n            }\n            if !self.javaVersion.is_empty() {\n                my_size += ::protobuf::rt::string_size(7, &self.javaVersion);\n            }\n            if !self.osName.is_empty() {\n                my_size += ::protobuf::rt::string_size(8, &self.osName);\n            }\n            if self.jvmTotalMemory != 0 {\n                my_size += ::protobuf::rt::int64_size(9, self.jvmTotalMemory);\n            }\n            if self.jvmFreeMemory != 0 {\n                my_size += ::protobuf::rt::int64_size(10, self.jvmFreeMemory);\n            }\n            if self.processCpuRate != 0. {\n                my_size += 1 + 8;\n            }\n            for value in &self.memoryDescInfoList {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            for value in &self.deadLockThreadInfoList {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.threadCount != 0 {\n                os.write_int32(1, self.threadCount)?;\n            }\n            if self.deadLockThreadCount != 0 {\n                os.write_int32(2, self.deadLockThreadCount)?;\n            }\n            if self.cpuCount != 0 {\n                os.write_int32(3, self.cpuCount)?;\n            }\n            if self.totalMemory != 0 {\n                os.write_int64(4, self.totalMemory)?;\n            }\n            if self.freeMemory != 0 {\n                os.write_int64(5, self.freeMemory)?;\n            }\n            if self.cpuRate != 0. {\n                os.write_double(6, self.cpuRate)?;\n            }\n            if !self.javaVersion.is_empty() {\n                os.write_string(7, &self.javaVersion)?;\n            }\n            if !self.osName.is_empty() {\n                os.write_string(8, &self.osName)?;\n            }\n            if self.jvmTotalMemory != 0 {\n                os.write_int64(9, self.jvmTotalMemory)?;\n            }\n            if self.jvmFreeMemory != 0 {\n                os.write_int64(10, self.jvmFreeMemory)?;\n            }\n            if self.processCpuRate != 0. {\n                os.write_double(11, self.processCpuRate)?;\n            }\n            for v in &self.memoryDescInfoList {\n                ::protobuf::rt::write_message_field_with_cached_size(12, v, os)?;\n            };\n            for v in &self.deadLockThreadInfoList {\n                ::protobuf::rt::write_message_field_with_cached_size(13, v, os)?;\n            };\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> MachineInfo {\n            MachineInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.threadCount = 0;\n            self.deadLockThreadCount = 0;\n            self.cpuCount = 0;\n            self.totalMemory = 0;\n            self.freeMemory = 0;\n            self.cpuRate = 0.;\n            self.javaVersion.clear();\n            self.osName.clear();\n            self.jvmTotalMemory = 0;\n            self.jvmFreeMemory = 0;\n            self.processCpuRate = 0.;\n            self.memoryDescInfoList.clear();\n            self.deadLockThreadInfoList.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static MachineInfo {\n            static instance: MachineInfo = MachineInfo {\n                threadCount: 0,\n                deadLockThreadCount: 0,\n                cpuCount: 0,\n                totalMemory: 0,\n                freeMemory: 0,\n                cpuRate: 0.,\n                javaVersion: ::std::string::String::new(),\n                osName: ::std::string::String::new(),\n                jvmTotalMemory: 0,\n                jvmFreeMemory: 0,\n                processCpuRate: 0.,\n                memoryDescInfoList: ::std::vec::Vec::new(),\n                deadLockThreadInfoList: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for MachineInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"NodeInfo.MachineInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for MachineInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for MachineInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    /// Nested message and enums of message `MachineInfo`\n    pub mod machine_info {\n        // @@protoc_insertion_point(message:protocol.NodeInfo.MachineInfo.MemoryDescInfo)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct MemoryDescInfo {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.MemoryDescInfo.name)\n            pub name: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.MemoryDescInfo.initSize)\n            pub initSize: i64,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.MemoryDescInfo.useSize)\n            pub useSize: i64,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.MemoryDescInfo.maxSize)\n            pub maxSize: i64,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.MemoryDescInfo.useRate)\n            pub useRate: f64,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.NodeInfo.MachineInfo.MemoryDescInfo.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a MemoryDescInfo {\n            fn default() -> &'a MemoryDescInfo {\n                <MemoryDescInfo as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl MemoryDescInfo {\n            pub fn new() -> MemoryDescInfo {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(5);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"name\",\n                    |m: &MemoryDescInfo| { &m.name },\n                    |m: &mut MemoryDescInfo| { &mut m.name },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"initSize\",\n                    |m: &MemoryDescInfo| { &m.initSize },\n                    |m: &mut MemoryDescInfo| { &mut m.initSize },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"useSize\",\n                    |m: &MemoryDescInfo| { &m.useSize },\n                    |m: &mut MemoryDescInfo| { &mut m.useSize },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"maxSize\",\n                    |m: &MemoryDescInfo| { &m.maxSize },\n                    |m: &mut MemoryDescInfo| { &mut m.maxSize },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"useRate\",\n                    |m: &MemoryDescInfo| { &m.useRate },\n                    |m: &mut MemoryDescInfo| { &mut m.useRate },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MemoryDescInfo>(\n                    \"NodeInfo.MachineInfo.MemoryDescInfo\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for MemoryDescInfo {\n            const NAME: &'static str = \"MemoryDescInfo\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        10 => {\n                            self.name = is.read_string()?;\n                        },\n                        16 => {\n                            self.initSize = is.read_int64()?;\n                        },\n                        24 => {\n                            self.useSize = is.read_int64()?;\n                        },\n                        32 => {\n                            self.maxSize = is.read_int64()?;\n                        },\n                        41 => {\n                            self.useRate = is.read_double()?;\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if !self.name.is_empty() {\n                    my_size += ::protobuf::rt::string_size(1, &self.name);\n                }\n                if self.initSize != 0 {\n                    my_size += ::protobuf::rt::int64_size(2, self.initSize);\n                }\n                if self.useSize != 0 {\n                    my_size += ::protobuf::rt::int64_size(3, self.useSize);\n                }\n                if self.maxSize != 0 {\n                    my_size += ::protobuf::rt::int64_size(4, self.maxSize);\n                }\n                if self.useRate != 0. {\n                    my_size += 1 + 8;\n                }\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if !self.name.is_empty() {\n                    os.write_string(1, &self.name)?;\n                }\n                if self.initSize != 0 {\n                    os.write_int64(2, self.initSize)?;\n                }\n                if self.useSize != 0 {\n                    os.write_int64(3, self.useSize)?;\n                }\n                if self.maxSize != 0 {\n                    os.write_int64(4, self.maxSize)?;\n                }\n                if self.useRate != 0. {\n                    os.write_double(5, self.useRate)?;\n                }\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> MemoryDescInfo {\n                MemoryDescInfo::new()\n            }\n\n            fn clear(&mut self) {\n                self.name.clear();\n                self.initSize = 0;\n                self.useSize = 0;\n                self.maxSize = 0;\n                self.useRate = 0.;\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static MemoryDescInfo {\n                static instance: MemoryDescInfo = MemoryDescInfo {\n                    name: ::std::string::String::new(),\n                    initSize: 0,\n                    useSize: 0,\n                    maxSize: 0,\n                    useRate: 0.,\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for MemoryDescInfo {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"NodeInfo.MachineInfo.MemoryDescInfo\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for MemoryDescInfo {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for MemoryDescInfo {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n\n        // @@protoc_insertion_point(message:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct DeadLockThreadInfo {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.name)\n            pub name: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.lockName)\n            pub lockName: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.lockOwner)\n            pub lockOwner: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.state)\n            pub state: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.blockTime)\n            pub blockTime: i64,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.waitTime)\n            pub waitTime: i64,\n            // @@protoc_insertion_point(field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.stackTrace)\n            pub stackTrace: ::std::string::String,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.NodeInfo.MachineInfo.DeadLockThreadInfo.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a DeadLockThreadInfo {\n            fn default() -> &'a DeadLockThreadInfo {\n                <DeadLockThreadInfo as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl DeadLockThreadInfo {\n            pub fn new() -> DeadLockThreadInfo {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(7);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"name\",\n                    |m: &DeadLockThreadInfo| { &m.name },\n                    |m: &mut DeadLockThreadInfo| { &mut m.name },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"lockName\",\n                    |m: &DeadLockThreadInfo| { &m.lockName },\n                    |m: &mut DeadLockThreadInfo| { &mut m.lockName },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"lockOwner\",\n                    |m: &DeadLockThreadInfo| { &m.lockOwner },\n                    |m: &mut DeadLockThreadInfo| { &mut m.lockOwner },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"state\",\n                    |m: &DeadLockThreadInfo| { &m.state },\n                    |m: &mut DeadLockThreadInfo| { &mut m.state },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"blockTime\",\n                    |m: &DeadLockThreadInfo| { &m.blockTime },\n                    |m: &mut DeadLockThreadInfo| { &mut m.blockTime },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"waitTime\",\n                    |m: &DeadLockThreadInfo| { &m.waitTime },\n                    |m: &mut DeadLockThreadInfo| { &mut m.waitTime },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"stackTrace\",\n                    |m: &DeadLockThreadInfo| { &m.stackTrace },\n                    |m: &mut DeadLockThreadInfo| { &mut m.stackTrace },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DeadLockThreadInfo>(\n                    \"NodeInfo.MachineInfo.DeadLockThreadInfo\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for DeadLockThreadInfo {\n            const NAME: &'static str = \"DeadLockThreadInfo\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        10 => {\n                            self.name = is.read_string()?;\n                        },\n                        18 => {\n                            self.lockName = is.read_string()?;\n                        },\n                        26 => {\n                            self.lockOwner = is.read_string()?;\n                        },\n                        34 => {\n                            self.state = is.read_string()?;\n                        },\n                        40 => {\n                            self.blockTime = is.read_int64()?;\n                        },\n                        48 => {\n                            self.waitTime = is.read_int64()?;\n                        },\n                        58 => {\n                            self.stackTrace = is.read_string()?;\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if !self.name.is_empty() {\n                    my_size += ::protobuf::rt::string_size(1, &self.name);\n                }\n                if !self.lockName.is_empty() {\n                    my_size += ::protobuf::rt::string_size(2, &self.lockName);\n                }\n                if !self.lockOwner.is_empty() {\n                    my_size += ::protobuf::rt::string_size(3, &self.lockOwner);\n                }\n                if !self.state.is_empty() {\n                    my_size += ::protobuf::rt::string_size(4, &self.state);\n                }\n                if self.blockTime != 0 {\n                    my_size += ::protobuf::rt::int64_size(5, self.blockTime);\n                }\n                if self.waitTime != 0 {\n                    my_size += ::protobuf::rt::int64_size(6, self.waitTime);\n                }\n                if !self.stackTrace.is_empty() {\n                    my_size += ::protobuf::rt::string_size(7, &self.stackTrace);\n                }\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if !self.name.is_empty() {\n                    os.write_string(1, &self.name)?;\n                }\n                if !self.lockName.is_empty() {\n                    os.write_string(2, &self.lockName)?;\n                }\n                if !self.lockOwner.is_empty() {\n                    os.write_string(3, &self.lockOwner)?;\n                }\n                if !self.state.is_empty() {\n                    os.write_string(4, &self.state)?;\n                }\n                if self.blockTime != 0 {\n                    os.write_int64(5, self.blockTime)?;\n                }\n                if self.waitTime != 0 {\n                    os.write_int64(6, self.waitTime)?;\n                }\n                if !self.stackTrace.is_empty() {\n                    os.write_string(7, &self.stackTrace)?;\n                }\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> DeadLockThreadInfo {\n                DeadLockThreadInfo::new()\n            }\n\n            fn clear(&mut self) {\n                self.name.clear();\n                self.lockName.clear();\n                self.lockOwner.clear();\n                self.state.clear();\n                self.blockTime = 0;\n                self.waitTime = 0;\n                self.stackTrace.clear();\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static DeadLockThreadInfo {\n                static instance: DeadLockThreadInfo = DeadLockThreadInfo {\n                    name: ::std::string::String::new(),\n                    lockName: ::std::string::String::new(),\n                    lockOwner: ::std::string::String::new(),\n                    state: ::std::string::String::new(),\n                    blockTime: 0,\n                    waitTime: 0,\n                    stackTrace: ::std::string::String::new(),\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for DeadLockThreadInfo {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"NodeInfo.MachineInfo.DeadLockThreadInfo\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for DeadLockThreadInfo {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for DeadLockThreadInfo {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.MetricsInfo)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MetricsInfo {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MetricsInfo.interval)\n    pub interval: i64,\n    // @@protoc_insertion_point(field:protocol.MetricsInfo.node)\n    pub node: ::protobuf::MessageField<metrics_info::NodeInfo>,\n    // @@protoc_insertion_point(field:protocol.MetricsInfo.blockchain)\n    pub blockchain: ::protobuf::MessageField<metrics_info::BlockChainInfo>,\n    // @@protoc_insertion_point(field:protocol.MetricsInfo.net)\n    pub net: ::protobuf::MessageField<metrics_info::NetInfo>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MetricsInfo.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MetricsInfo {\n    fn default() -> &'a MetricsInfo {\n        <MetricsInfo as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MetricsInfo {\n    pub fn new() -> MetricsInfo {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"interval\",\n            |m: &MetricsInfo| { &m.interval },\n            |m: &mut MetricsInfo| { &mut m.interval },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, metrics_info::NodeInfo>(\n            \"node\",\n            |m: &MetricsInfo| { &m.node },\n            |m: &mut MetricsInfo| { &mut m.node },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, metrics_info::BlockChainInfo>(\n            \"blockchain\",\n            |m: &MetricsInfo| { &m.blockchain },\n            |m: &mut MetricsInfo| { &mut m.blockchain },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, metrics_info::NetInfo>(\n            \"net\",\n            |m: &MetricsInfo| { &m.net },\n            |m: &mut MetricsInfo| { &mut m.net },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MetricsInfo>(\n            \"MetricsInfo\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MetricsInfo {\n    const NAME: &'static str = \"MetricsInfo\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.interval = is.read_int64()?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.node)?;\n                },\n                26 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.blockchain)?;\n                },\n                34 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.net)?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.interval != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.interval);\n        }\n        if let Some(v) = self.node.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.blockchain.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.net.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.interval != 0 {\n            os.write_int64(1, self.interval)?;\n        }\n        if let Some(v) = self.node.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        if let Some(v) = self.blockchain.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        }\n        if let Some(v) = self.net.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MetricsInfo {\n        MetricsInfo::new()\n    }\n\n    fn clear(&mut self) {\n        self.interval = 0;\n        self.node.clear();\n        self.blockchain.clear();\n        self.net.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MetricsInfo {\n        static instance: MetricsInfo = MetricsInfo {\n            interval: 0,\n            node: ::protobuf::MessageField::none(),\n            blockchain: ::protobuf::MessageField::none(),\n            net: ::protobuf::MessageField::none(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MetricsInfo {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MetricsInfo\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MetricsInfo {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MetricsInfo {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `MetricsInfo`\npub mod metrics_info {\n    // @@protoc_insertion_point(message:protocol.MetricsInfo.NodeInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct NodeInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NodeInfo.ip)\n        pub ip: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NodeInfo.nodeType)\n        pub nodeType: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NodeInfo.version)\n        pub version: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NodeInfo.backupStatus)\n        pub backupStatus: i32,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NodeInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a NodeInfo {\n        fn default() -> &'a NodeInfo {\n            <NodeInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl NodeInfo {\n        pub fn new() -> NodeInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(4);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"ip\",\n                |m: &NodeInfo| { &m.ip },\n                |m: &mut NodeInfo| { &mut m.ip },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"nodeType\",\n                |m: &NodeInfo| { &m.nodeType },\n                |m: &mut NodeInfo| { &mut m.nodeType },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"version\",\n                |m: &NodeInfo| { &m.version },\n                |m: &mut NodeInfo| { &mut m.version },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"backupStatus\",\n                |m: &NodeInfo| { &m.backupStatus },\n                |m: &mut NodeInfo| { &mut m.backupStatus },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<NodeInfo>(\n                \"MetricsInfo.NodeInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for NodeInfo {\n        const NAME: &'static str = \"NodeInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.ip = is.read_string()?;\n                    },\n                    16 => {\n                        self.nodeType = is.read_int32()?;\n                    },\n                    26 => {\n                        self.version = is.read_string()?;\n                    },\n                    32 => {\n                        self.backupStatus = is.read_int32()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.ip.is_empty() {\n                my_size += ::protobuf::rt::string_size(1, &self.ip);\n            }\n            if self.nodeType != 0 {\n                my_size += ::protobuf::rt::int32_size(2, self.nodeType);\n            }\n            if !self.version.is_empty() {\n                my_size += ::protobuf::rt::string_size(3, &self.version);\n            }\n            if self.backupStatus != 0 {\n                my_size += ::protobuf::rt::int32_size(4, self.backupStatus);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.ip.is_empty() {\n                os.write_string(1, &self.ip)?;\n            }\n            if self.nodeType != 0 {\n                os.write_int32(2, self.nodeType)?;\n            }\n            if !self.version.is_empty() {\n                os.write_string(3, &self.version)?;\n            }\n            if self.backupStatus != 0 {\n                os.write_int32(4, self.backupStatus)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> NodeInfo {\n            NodeInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.ip.clear();\n            self.nodeType = 0;\n            self.version.clear();\n            self.backupStatus = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static NodeInfo {\n            static instance: NodeInfo = NodeInfo {\n                ip: ::std::string::String::new(),\n                nodeType: 0,\n                version: ::std::string::String::new(),\n                backupStatus: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for NodeInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NodeInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for NodeInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for NodeInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.MetricsInfo.BlockChainInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct BlockChainInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.headBlockNum)\n        pub headBlockNum: i64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.headBlockTimestamp)\n        pub headBlockTimestamp: i64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.headBlockHash)\n        pub headBlockHash: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.forkCount)\n        pub forkCount: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.failForkCount)\n        pub failForkCount: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.blockProcessTime)\n        pub blockProcessTime: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.tps)\n        pub tps: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.transactionCacheSize)\n        pub transactionCacheSize: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.missedTransaction)\n        pub missedTransaction: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.witnesses)\n        pub witnesses: ::std::vec::Vec<block_chain_info::Witness>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.failProcessBlockNum)\n        pub failProcessBlockNum: i64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.failProcessBlockReason)\n        pub failProcessBlockReason: ::std::string::String,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.dupWitness)\n        pub dupWitness: ::std::vec::Vec<block_chain_info::DupWitness>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.MetricsInfo.BlockChainInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a BlockChainInfo {\n        fn default() -> &'a BlockChainInfo {\n            <BlockChainInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl BlockChainInfo {\n        pub fn new() -> BlockChainInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(13);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"headBlockNum\",\n                |m: &BlockChainInfo| { &m.headBlockNum },\n                |m: &mut BlockChainInfo| { &mut m.headBlockNum },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"headBlockTimestamp\",\n                |m: &BlockChainInfo| { &m.headBlockTimestamp },\n                |m: &mut BlockChainInfo| { &mut m.headBlockTimestamp },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"headBlockHash\",\n                |m: &BlockChainInfo| { &m.headBlockHash },\n                |m: &mut BlockChainInfo| { &mut m.headBlockHash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"forkCount\",\n                |m: &BlockChainInfo| { &m.forkCount },\n                |m: &mut BlockChainInfo| { &mut m.forkCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"failForkCount\",\n                |m: &BlockChainInfo| { &m.failForkCount },\n                |m: &mut BlockChainInfo| { &mut m.failForkCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"blockProcessTime\",\n                |m: &BlockChainInfo| { &m.blockProcessTime },\n                |m: &mut BlockChainInfo| { &mut m.blockProcessTime },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"tps\",\n                |m: &BlockChainInfo| { &m.tps },\n                |m: &mut BlockChainInfo| { &mut m.tps },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"transactionCacheSize\",\n                |m: &BlockChainInfo| { &m.transactionCacheSize },\n                |m: &mut BlockChainInfo| { &mut m.transactionCacheSize },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"missedTransaction\",\n                |m: &BlockChainInfo| { &m.missedTransaction },\n                |m: &mut BlockChainInfo| { &mut m.missedTransaction },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"witnesses\",\n                |m: &BlockChainInfo| { &m.witnesses },\n                |m: &mut BlockChainInfo| { &mut m.witnesses },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"failProcessBlockNum\",\n                |m: &BlockChainInfo| { &m.failProcessBlockNum },\n                |m: &mut BlockChainInfo| { &mut m.failProcessBlockNum },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"failProcessBlockReason\",\n                |m: &BlockChainInfo| { &m.failProcessBlockReason },\n                |m: &mut BlockChainInfo| { &mut m.failProcessBlockReason },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"dupWitness\",\n                |m: &BlockChainInfo| { &m.dupWitness },\n                |m: &mut BlockChainInfo| { &mut m.dupWitness },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockChainInfo>(\n                \"MetricsInfo.BlockChainInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for BlockChainInfo {\n        const NAME: &'static str = \"BlockChainInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.headBlockNum = is.read_int64()?;\n                    },\n                    16 => {\n                        self.headBlockTimestamp = is.read_int64()?;\n                    },\n                    26 => {\n                        self.headBlockHash = is.read_string()?;\n                    },\n                    32 => {\n                        self.forkCount = is.read_int32()?;\n                    },\n                    40 => {\n                        self.failForkCount = is.read_int32()?;\n                    },\n                    50 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.blockProcessTime)?;\n                    },\n                    58 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.tps)?;\n                    },\n                    64 => {\n                        self.transactionCacheSize = is.read_int32()?;\n                    },\n                    74 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.missedTransaction)?;\n                    },\n                    82 => {\n                        self.witnesses.push(is.read_message()?);\n                    },\n                    88 => {\n                        self.failProcessBlockNum = is.read_int64()?;\n                    },\n                    98 => {\n                        self.failProcessBlockReason = is.read_string()?;\n                    },\n                    106 => {\n                        self.dupWitness.push(is.read_message()?);\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.headBlockNum != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.headBlockNum);\n            }\n            if self.headBlockTimestamp != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.headBlockTimestamp);\n            }\n            if !self.headBlockHash.is_empty() {\n                my_size += ::protobuf::rt::string_size(3, &self.headBlockHash);\n            }\n            if self.forkCount != 0 {\n                my_size += ::protobuf::rt::int32_size(4, self.forkCount);\n            }\n            if self.failForkCount != 0 {\n                my_size += ::protobuf::rt::int32_size(5, self.failForkCount);\n            }\n            if let Some(v) = self.blockProcessTime.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if let Some(v) = self.tps.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if self.transactionCacheSize != 0 {\n                my_size += ::protobuf::rt::int32_size(8, self.transactionCacheSize);\n            }\n            if let Some(v) = self.missedTransaction.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            for value in &self.witnesses {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            if self.failProcessBlockNum != 0 {\n                my_size += ::protobuf::rt::int64_size(11, self.failProcessBlockNum);\n            }\n            if !self.failProcessBlockReason.is_empty() {\n                my_size += ::protobuf::rt::string_size(12, &self.failProcessBlockReason);\n            }\n            for value in &self.dupWitness {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.headBlockNum != 0 {\n                os.write_int64(1, self.headBlockNum)?;\n            }\n            if self.headBlockTimestamp != 0 {\n                os.write_int64(2, self.headBlockTimestamp)?;\n            }\n            if !self.headBlockHash.is_empty() {\n                os.write_string(3, &self.headBlockHash)?;\n            }\n            if self.forkCount != 0 {\n                os.write_int32(4, self.forkCount)?;\n            }\n            if self.failForkCount != 0 {\n                os.write_int32(5, self.failForkCount)?;\n            }\n            if let Some(v) = self.blockProcessTime.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(6, v, os)?;\n            }\n            if let Some(v) = self.tps.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(7, v, os)?;\n            }\n            if self.transactionCacheSize != 0 {\n                os.write_int32(8, self.transactionCacheSize)?;\n            }\n            if let Some(v) = self.missedTransaction.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(9, v, os)?;\n            }\n            for v in &self.witnesses {\n                ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?;\n            };\n            if self.failProcessBlockNum != 0 {\n                os.write_int64(11, self.failProcessBlockNum)?;\n            }\n            if !self.failProcessBlockReason.is_empty() {\n                os.write_string(12, &self.failProcessBlockReason)?;\n            }\n            for v in &self.dupWitness {\n                ::protobuf::rt::write_message_field_with_cached_size(13, v, os)?;\n            };\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> BlockChainInfo {\n            BlockChainInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.headBlockNum = 0;\n            self.headBlockTimestamp = 0;\n            self.headBlockHash.clear();\n            self.forkCount = 0;\n            self.failForkCount = 0;\n            self.blockProcessTime.clear();\n            self.tps.clear();\n            self.transactionCacheSize = 0;\n            self.missedTransaction.clear();\n            self.witnesses.clear();\n            self.failProcessBlockNum = 0;\n            self.failProcessBlockReason.clear();\n            self.dupWitness.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static BlockChainInfo {\n            static instance: BlockChainInfo = BlockChainInfo {\n                headBlockNum: 0,\n                headBlockTimestamp: 0,\n                headBlockHash: ::std::string::String::new(),\n                forkCount: 0,\n                failForkCount: 0,\n                blockProcessTime: ::protobuf::MessageField::none(),\n                tps: ::protobuf::MessageField::none(),\n                transactionCacheSize: 0,\n                missedTransaction: ::protobuf::MessageField::none(),\n                witnesses: ::std::vec::Vec::new(),\n                failProcessBlockNum: 0,\n                failProcessBlockReason: ::std::string::String::new(),\n                dupWitness: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for BlockChainInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.BlockChainInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for BlockChainInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for BlockChainInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    /// Nested message and enums of message `BlockChainInfo`\n    pub mod block_chain_info {\n        // @@protoc_insertion_point(message:protocol.MetricsInfo.BlockChainInfo.Witness)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct Witness {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.Witness.address)\n            pub address: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.Witness.version)\n            pub version: i32,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.MetricsInfo.BlockChainInfo.Witness.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a Witness {\n            fn default() -> &'a Witness {\n                <Witness as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl Witness {\n            pub fn new() -> Witness {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(2);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"address\",\n                    |m: &Witness| { &m.address },\n                    |m: &mut Witness| { &mut m.address },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"version\",\n                    |m: &Witness| { &m.version },\n                    |m: &mut Witness| { &mut m.version },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Witness>(\n                    \"MetricsInfo.BlockChainInfo.Witness\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for Witness {\n            const NAME: &'static str = \"Witness\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        10 => {\n                            self.address = is.read_string()?;\n                        },\n                        16 => {\n                            self.version = is.read_int32()?;\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if !self.address.is_empty() {\n                    my_size += ::protobuf::rt::string_size(1, &self.address);\n                }\n                if self.version != 0 {\n                    my_size += ::protobuf::rt::int32_size(2, self.version);\n                }\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if !self.address.is_empty() {\n                    os.write_string(1, &self.address)?;\n                }\n                if self.version != 0 {\n                    os.write_int32(2, self.version)?;\n                }\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> Witness {\n                Witness::new()\n            }\n\n            fn clear(&mut self) {\n                self.address.clear();\n                self.version = 0;\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static Witness {\n                static instance: Witness = Witness {\n                    address: ::std::string::String::new(),\n                    version: 0,\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for Witness {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.BlockChainInfo.Witness\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for Witness {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for Witness {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n\n        // @@protoc_insertion_point(message:protocol.MetricsInfo.BlockChainInfo.DupWitness)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct DupWitness {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.DupWitness.address)\n            pub address: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.DupWitness.blockNum)\n            pub blockNum: i64,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.BlockChainInfo.DupWitness.count)\n            pub count: i32,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.MetricsInfo.BlockChainInfo.DupWitness.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a DupWitness {\n            fn default() -> &'a DupWitness {\n                <DupWitness as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl DupWitness {\n            pub fn new() -> DupWitness {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(3);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"address\",\n                    |m: &DupWitness| { &m.address },\n                    |m: &mut DupWitness| { &mut m.address },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"blockNum\",\n                    |m: &DupWitness| { &m.blockNum },\n                    |m: &mut DupWitness| { &mut m.blockNum },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"count\",\n                    |m: &DupWitness| { &m.count },\n                    |m: &mut DupWitness| { &mut m.count },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DupWitness>(\n                    \"MetricsInfo.BlockChainInfo.DupWitness\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for DupWitness {\n            const NAME: &'static str = \"DupWitness\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        10 => {\n                            self.address = is.read_string()?;\n                        },\n                        16 => {\n                            self.blockNum = is.read_int64()?;\n                        },\n                        24 => {\n                            self.count = is.read_int32()?;\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if !self.address.is_empty() {\n                    my_size += ::protobuf::rt::string_size(1, &self.address);\n                }\n                if self.blockNum != 0 {\n                    my_size += ::protobuf::rt::int64_size(2, self.blockNum);\n                }\n                if self.count != 0 {\n                    my_size += ::protobuf::rt::int32_size(3, self.count);\n                }\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if !self.address.is_empty() {\n                    os.write_string(1, &self.address)?;\n                }\n                if self.blockNum != 0 {\n                    os.write_int64(2, self.blockNum)?;\n                }\n                if self.count != 0 {\n                    os.write_int32(3, self.count)?;\n                }\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> DupWitness {\n                DupWitness::new()\n            }\n\n            fn clear(&mut self) {\n                self.address.clear();\n                self.blockNum = 0;\n                self.count = 0;\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static DupWitness {\n                static instance: DupWitness = DupWitness {\n                    address: ::std::string::String::new(),\n                    blockNum: 0,\n                    count: 0,\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for DupWitness {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.BlockChainInfo.DupWitness\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for DupWitness {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for DupWitness {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n    }\n\n    // @@protoc_insertion_point(message:protocol.MetricsInfo.RateInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct RateInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.RateInfo.count)\n        pub count: i64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.RateInfo.meanRate)\n        pub meanRate: f64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.RateInfo.oneMinuteRate)\n        pub oneMinuteRate: f64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.RateInfo.fiveMinuteRate)\n        pub fiveMinuteRate: f64,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.RateInfo.fifteenMinuteRate)\n        pub fifteenMinuteRate: f64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.MetricsInfo.RateInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a RateInfo {\n        fn default() -> &'a RateInfo {\n            <RateInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl RateInfo {\n        pub fn new() -> RateInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(5);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"count\",\n                |m: &RateInfo| { &m.count },\n                |m: &mut RateInfo| { &mut m.count },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"meanRate\",\n                |m: &RateInfo| { &m.meanRate },\n                |m: &mut RateInfo| { &mut m.meanRate },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"oneMinuteRate\",\n                |m: &RateInfo| { &m.oneMinuteRate },\n                |m: &mut RateInfo| { &mut m.oneMinuteRate },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"fiveMinuteRate\",\n                |m: &RateInfo| { &m.fiveMinuteRate },\n                |m: &mut RateInfo| { &mut m.fiveMinuteRate },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"fifteenMinuteRate\",\n                |m: &RateInfo| { &m.fifteenMinuteRate },\n                |m: &mut RateInfo| { &mut m.fifteenMinuteRate },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<RateInfo>(\n                \"MetricsInfo.RateInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for RateInfo {\n        const NAME: &'static str = \"RateInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.count = is.read_int64()?;\n                    },\n                    17 => {\n                        self.meanRate = is.read_double()?;\n                    },\n                    25 => {\n                        self.oneMinuteRate = is.read_double()?;\n                    },\n                    33 => {\n                        self.fiveMinuteRate = is.read_double()?;\n                    },\n                    41 => {\n                        self.fifteenMinuteRate = is.read_double()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.count != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.count);\n            }\n            if self.meanRate != 0. {\n                my_size += 1 + 8;\n            }\n            if self.oneMinuteRate != 0. {\n                my_size += 1 + 8;\n            }\n            if self.fiveMinuteRate != 0. {\n                my_size += 1 + 8;\n            }\n            if self.fifteenMinuteRate != 0. {\n                my_size += 1 + 8;\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.count != 0 {\n                os.write_int64(1, self.count)?;\n            }\n            if self.meanRate != 0. {\n                os.write_double(2, self.meanRate)?;\n            }\n            if self.oneMinuteRate != 0. {\n                os.write_double(3, self.oneMinuteRate)?;\n            }\n            if self.fiveMinuteRate != 0. {\n                os.write_double(4, self.fiveMinuteRate)?;\n            }\n            if self.fifteenMinuteRate != 0. {\n                os.write_double(5, self.fifteenMinuteRate)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> RateInfo {\n            RateInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.count = 0;\n            self.meanRate = 0.;\n            self.oneMinuteRate = 0.;\n            self.fiveMinuteRate = 0.;\n            self.fifteenMinuteRate = 0.;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static RateInfo {\n            static instance: RateInfo = RateInfo {\n                count: 0,\n                meanRate: 0.,\n                oneMinuteRate: 0.,\n                fiveMinuteRate: 0.,\n                fifteenMinuteRate: 0.,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for RateInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.RateInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for RateInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for RateInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    // @@protoc_insertion_point(message:protocol.MetricsInfo.NetInfo)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct NetInfo {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.errorProtoCount)\n        pub errorProtoCount: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.api)\n        pub api: ::protobuf::MessageField<net_info::ApiInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.connectionCount)\n        pub connectionCount: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.validConnectionCount)\n        pub validConnectionCount: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.tcpInTraffic)\n        pub tcpInTraffic: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.tcpOutTraffic)\n        pub tcpOutTraffic: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.disconnectionCount)\n        pub disconnectionCount: i32,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.disconnectionDetail)\n        pub disconnectionDetail: ::std::vec::Vec<net_info::DisconnectionDetailInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.udpInTraffic)\n        pub udpInTraffic: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.udpOutTraffic)\n        pub udpOutTraffic: ::protobuf::MessageField<RateInfo>,\n        // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.latency)\n        pub latency: ::protobuf::MessageField<net_info::LatencyInfo>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NetInfo.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a NetInfo {\n        fn default() -> &'a NetInfo {\n            <NetInfo as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl NetInfo {\n        pub fn new() -> NetInfo {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(11);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"errorProtoCount\",\n                |m: &NetInfo| { &m.errorProtoCount },\n                |m: &mut NetInfo| { &mut m.errorProtoCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, net_info::ApiInfo>(\n                \"api\",\n                |m: &NetInfo| { &m.api },\n                |m: &mut NetInfo| { &mut m.api },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"connectionCount\",\n                |m: &NetInfo| { &m.connectionCount },\n                |m: &mut NetInfo| { &mut m.connectionCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"validConnectionCount\",\n                |m: &NetInfo| { &m.validConnectionCount },\n                |m: &mut NetInfo| { &mut m.validConnectionCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"tcpInTraffic\",\n                |m: &NetInfo| { &m.tcpInTraffic },\n                |m: &mut NetInfo| { &mut m.tcpInTraffic },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"tcpOutTraffic\",\n                |m: &NetInfo| { &m.tcpOutTraffic },\n                |m: &mut NetInfo| { &mut m.tcpOutTraffic },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"disconnectionCount\",\n                |m: &NetInfo| { &m.disconnectionCount },\n                |m: &mut NetInfo| { &mut m.disconnectionCount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"disconnectionDetail\",\n                |m: &NetInfo| { &m.disconnectionDetail },\n                |m: &mut NetInfo| { &mut m.disconnectionDetail },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"udpInTraffic\",\n                |m: &NetInfo| { &m.udpInTraffic },\n                |m: &mut NetInfo| { &mut m.udpInTraffic },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RateInfo>(\n                \"udpOutTraffic\",\n                |m: &NetInfo| { &m.udpOutTraffic },\n                |m: &mut NetInfo| { &mut m.udpOutTraffic },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, net_info::LatencyInfo>(\n                \"latency\",\n                |m: &NetInfo| { &m.latency },\n                |m: &mut NetInfo| { &mut m.latency },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<NetInfo>(\n                \"MetricsInfo.NetInfo\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for NetInfo {\n        const NAME: &'static str = \"NetInfo\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.errorProtoCount = is.read_int32()?;\n                    },\n                    18 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.api)?;\n                    },\n                    24 => {\n                        self.connectionCount = is.read_int32()?;\n                    },\n                    32 => {\n                        self.validConnectionCount = is.read_int32()?;\n                    },\n                    42 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.tcpInTraffic)?;\n                    },\n                    50 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.tcpOutTraffic)?;\n                    },\n                    56 => {\n                        self.disconnectionCount = is.read_int32()?;\n                    },\n                    66 => {\n                        self.disconnectionDetail.push(is.read_message()?);\n                    },\n                    74 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.udpInTraffic)?;\n                    },\n                    82 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.udpOutTraffic)?;\n                    },\n                    90 => {\n                        ::protobuf::rt::read_singular_message_into_field(is, &mut self.latency)?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.errorProtoCount != 0 {\n                my_size += ::protobuf::rt::int32_size(1, self.errorProtoCount);\n            }\n            if let Some(v) = self.api.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if self.connectionCount != 0 {\n                my_size += ::protobuf::rt::int32_size(3, self.connectionCount);\n            }\n            if self.validConnectionCount != 0 {\n                my_size += ::protobuf::rt::int32_size(4, self.validConnectionCount);\n            }\n            if let Some(v) = self.tcpInTraffic.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if let Some(v) = self.tcpOutTraffic.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if self.disconnectionCount != 0 {\n                my_size += ::protobuf::rt::int32_size(7, self.disconnectionCount);\n            }\n            for value in &self.disconnectionDetail {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            if let Some(v) = self.udpInTraffic.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if let Some(v) = self.udpOutTraffic.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            if let Some(v) = self.latency.as_ref() {\n                let len = v.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.errorProtoCount != 0 {\n                os.write_int32(1, self.errorProtoCount)?;\n            }\n            if let Some(v) = self.api.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n            }\n            if self.connectionCount != 0 {\n                os.write_int32(3, self.connectionCount)?;\n            }\n            if self.validConnectionCount != 0 {\n                os.write_int32(4, self.validConnectionCount)?;\n            }\n            if let Some(v) = self.tcpInTraffic.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?;\n            }\n            if let Some(v) = self.tcpOutTraffic.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(6, v, os)?;\n            }\n            if self.disconnectionCount != 0 {\n                os.write_int32(7, self.disconnectionCount)?;\n            }\n            for v in &self.disconnectionDetail {\n                ::protobuf::rt::write_message_field_with_cached_size(8, v, os)?;\n            };\n            if let Some(v) = self.udpInTraffic.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(9, v, os)?;\n            }\n            if let Some(v) = self.udpOutTraffic.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?;\n            }\n            if let Some(v) = self.latency.as_ref() {\n                ::protobuf::rt::write_message_field_with_cached_size(11, v, os)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> NetInfo {\n            NetInfo::new()\n        }\n\n        fn clear(&mut self) {\n            self.errorProtoCount = 0;\n            self.api.clear();\n            self.connectionCount = 0;\n            self.validConnectionCount = 0;\n            self.tcpInTraffic.clear();\n            self.tcpOutTraffic.clear();\n            self.disconnectionCount = 0;\n            self.disconnectionDetail.clear();\n            self.udpInTraffic.clear();\n            self.udpOutTraffic.clear();\n            self.latency.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static NetInfo {\n            static instance: NetInfo = NetInfo {\n                errorProtoCount: 0,\n                api: ::protobuf::MessageField::none(),\n                connectionCount: 0,\n                validConnectionCount: 0,\n                tcpInTraffic: ::protobuf::MessageField::none(),\n                tcpOutTraffic: ::protobuf::MessageField::none(),\n                disconnectionCount: 0,\n                disconnectionDetail: ::std::vec::Vec::new(),\n                udpInTraffic: ::protobuf::MessageField::none(),\n                udpOutTraffic: ::protobuf::MessageField::none(),\n                latency: ::protobuf::MessageField::none(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for NetInfo {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NetInfo\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for NetInfo {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for NetInfo {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    /// Nested message and enums of message `NetInfo`\n    pub mod net_info {\n        // @@protoc_insertion_point(message:protocol.MetricsInfo.NetInfo.ApiInfo)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct ApiInfo {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.qps)\n            pub qps: ::protobuf::MessageField<super::RateInfo>,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.failQps)\n            pub failQps: ::protobuf::MessageField<super::RateInfo>,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.outTraffic)\n            pub outTraffic: ::protobuf::MessageField<super::RateInfo>,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.detail)\n            pub detail: ::std::vec::Vec<api_info::ApiDetailInfo>,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NetInfo.ApiInfo.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a ApiInfo {\n            fn default() -> &'a ApiInfo {\n                <ApiInfo as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl ApiInfo {\n            pub fn new() -> ApiInfo {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(4);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::RateInfo>(\n                    \"qps\",\n                    |m: &ApiInfo| { &m.qps },\n                    |m: &mut ApiInfo| { &mut m.qps },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::RateInfo>(\n                    \"failQps\",\n                    |m: &ApiInfo| { &m.failQps },\n                    |m: &mut ApiInfo| { &mut m.failQps },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::RateInfo>(\n                    \"outTraffic\",\n                    |m: &ApiInfo| { &m.outTraffic },\n                    |m: &mut ApiInfo| { &mut m.outTraffic },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                    \"detail\",\n                    |m: &ApiInfo| { &m.detail },\n                    |m: &mut ApiInfo| { &mut m.detail },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ApiInfo>(\n                    \"MetricsInfo.NetInfo.ApiInfo\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for ApiInfo {\n            const NAME: &'static str = \"ApiInfo\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        10 => {\n                            ::protobuf::rt::read_singular_message_into_field(is, &mut self.qps)?;\n                        },\n                        18 => {\n                            ::protobuf::rt::read_singular_message_into_field(is, &mut self.failQps)?;\n                        },\n                        26 => {\n                            ::protobuf::rt::read_singular_message_into_field(is, &mut self.outTraffic)?;\n                        },\n                        34 => {\n                            self.detail.push(is.read_message()?);\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if let Some(v) = self.qps.as_ref() {\n                    let len = v.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                }\n                if let Some(v) = self.failQps.as_ref() {\n                    let len = v.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                }\n                if let Some(v) = self.outTraffic.as_ref() {\n                    let len = v.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                }\n                for value in &self.detail {\n                    let len = value.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                };\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if let Some(v) = self.qps.as_ref() {\n                    ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n                }\n                if let Some(v) = self.failQps.as_ref() {\n                    ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n                }\n                if let Some(v) = self.outTraffic.as_ref() {\n                    ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n                }\n                for v in &self.detail {\n                    ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n                };\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> ApiInfo {\n                ApiInfo::new()\n            }\n\n            fn clear(&mut self) {\n                self.qps.clear();\n                self.failQps.clear();\n                self.outTraffic.clear();\n                self.detail.clear();\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static ApiInfo {\n                static instance: ApiInfo = ApiInfo {\n                    qps: ::protobuf::MessageField::none(),\n                    failQps: ::protobuf::MessageField::none(),\n                    outTraffic: ::protobuf::MessageField::none(),\n                    detail: ::std::vec::Vec::new(),\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for ApiInfo {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NetInfo.ApiInfo\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for ApiInfo {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for ApiInfo {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n\n        /// Nested message and enums of message `ApiInfo`\n        pub mod api_info {\n            // @@protoc_insertion_point(message:protocol.MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo)\n            #[derive(PartialEq,Clone,Default,Debug)]\n            pub struct ApiDetailInfo {\n                // message fields\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo.name)\n                pub name: ::std::string::String,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo.qps)\n                pub qps: ::protobuf::MessageField<super::super::RateInfo>,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo.failQps)\n                pub failQps: ::protobuf::MessageField<super::super::RateInfo>,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo.outTraffic)\n                pub outTraffic: ::protobuf::MessageField<super::super::RateInfo>,\n                // special fields\n                // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo.special_fields)\n                pub special_fields: ::protobuf::SpecialFields,\n            }\n\n            impl<'a> ::std::default::Default for &'a ApiDetailInfo {\n                fn default() -> &'a ApiDetailInfo {\n                    <ApiDetailInfo as ::protobuf::Message>::default_instance()\n                }\n            }\n\n            impl ApiDetailInfo {\n                pub fn new() -> ApiDetailInfo {\n                    ::std::default::Default::default()\n                }\n\n                pub(in super::super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                    let mut fields = ::std::vec::Vec::with_capacity(4);\n                    let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"name\",\n                        |m: &ApiDetailInfo| { &m.name },\n                        |m: &mut ApiDetailInfo| { &mut m.name },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::super::RateInfo>(\n                        \"qps\",\n                        |m: &ApiDetailInfo| { &m.qps },\n                        |m: &mut ApiDetailInfo| { &mut m.qps },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::super::RateInfo>(\n                        \"failQps\",\n                        |m: &ApiDetailInfo| { &m.failQps },\n                        |m: &mut ApiDetailInfo| { &mut m.failQps },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::super::RateInfo>(\n                        \"outTraffic\",\n                        |m: &ApiDetailInfo| { &m.outTraffic },\n                        |m: &mut ApiDetailInfo| { &mut m.outTraffic },\n                    ));\n                    ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ApiDetailInfo>(\n                        \"MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo\",\n                        fields,\n                        oneofs,\n                    )\n                }\n            }\n\n            impl ::protobuf::Message for ApiDetailInfo {\n                const NAME: &'static str = \"ApiDetailInfo\";\n\n                fn is_initialized(&self) -> bool {\n                    true\n                }\n\n                fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => {\n                                self.name = is.read_string()?;\n                            },\n                            18 => {\n                                ::protobuf::rt::read_singular_message_into_field(is, &mut self.qps)?;\n                            },\n                            26 => {\n                                ::protobuf::rt::read_singular_message_into_field(is, &mut self.failQps)?;\n                            },\n                            34 => {\n                                ::protobuf::rt::read_singular_message_into_field(is, &mut self.outTraffic)?;\n                            },\n                            tag => {\n                                ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                            },\n                        };\n                    }\n                    ::std::result::Result::Ok(())\n                }\n\n                // Compute sizes of nested messages\n                #[allow(unused_variables)]\n                fn compute_size(&self) -> u64 {\n                    let mut my_size = 0;\n                    if !self.name.is_empty() {\n                        my_size += ::protobuf::rt::string_size(1, &self.name);\n                    }\n                    if let Some(v) = self.qps.as_ref() {\n                        let len = v.compute_size();\n                        my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                    }\n                    if let Some(v) = self.failQps.as_ref() {\n                        let len = v.compute_size();\n                        my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                    }\n                    if let Some(v) = self.outTraffic.as_ref() {\n                        let len = v.compute_size();\n                        my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                    }\n                    my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                    self.special_fields.cached_size().set(my_size as u32);\n                    my_size\n                }\n\n                fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                    if !self.name.is_empty() {\n                        os.write_string(1, &self.name)?;\n                    }\n                    if let Some(v) = self.qps.as_ref() {\n                        ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n                    }\n                    if let Some(v) = self.failQps.as_ref() {\n                        ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n                    }\n                    if let Some(v) = self.outTraffic.as_ref() {\n                        ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n                    }\n                    os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                    ::std::result::Result::Ok(())\n                }\n\n                fn special_fields(&self) -> &::protobuf::SpecialFields {\n                    &self.special_fields\n                }\n\n                fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                    &mut self.special_fields\n                }\n\n                fn new() -> ApiDetailInfo {\n                    ApiDetailInfo::new()\n                }\n\n                fn clear(&mut self) {\n                    self.name.clear();\n                    self.qps.clear();\n                    self.failQps.clear();\n                    self.outTraffic.clear();\n                    self.special_fields.clear();\n                }\n\n                fn default_instance() -> &'static ApiDetailInfo {\n                    static instance: ApiDetailInfo = ApiDetailInfo {\n                        name: ::std::string::String::new(),\n                        qps: ::protobuf::MessageField::none(),\n                        failQps: ::protobuf::MessageField::none(),\n                        outTraffic: ::protobuf::MessageField::none(),\n                        special_fields: ::protobuf::SpecialFields::new(),\n                    };\n                    &instance\n                }\n            }\n\n            impl ::protobuf::MessageFull for ApiDetailInfo {\n                fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                    static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                    descriptor.get(|| super::super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NetInfo.ApiInfo.ApiDetailInfo\").unwrap()).clone()\n                }\n            }\n\n            impl ::std::fmt::Display for ApiDetailInfo {\n                fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                    ::protobuf::text_format::fmt(self, f)\n                }\n            }\n\n            impl ::protobuf::reflect::ProtobufValue for ApiDetailInfo {\n                type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n            }\n        }\n\n        // @@protoc_insertion_point(message:protocol.MetricsInfo.NetInfo.DisconnectionDetailInfo)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct DisconnectionDetailInfo {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.DisconnectionDetailInfo.reason)\n            pub reason: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.DisconnectionDetailInfo.count)\n            pub count: i32,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NetInfo.DisconnectionDetailInfo.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a DisconnectionDetailInfo {\n            fn default() -> &'a DisconnectionDetailInfo {\n                <DisconnectionDetailInfo as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl DisconnectionDetailInfo {\n            pub fn new() -> DisconnectionDetailInfo {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(2);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"reason\",\n                    |m: &DisconnectionDetailInfo| { &m.reason },\n                    |m: &mut DisconnectionDetailInfo| { &mut m.reason },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"count\",\n                    |m: &DisconnectionDetailInfo| { &m.count },\n                    |m: &mut DisconnectionDetailInfo| { &mut m.count },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DisconnectionDetailInfo>(\n                    \"MetricsInfo.NetInfo.DisconnectionDetailInfo\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for DisconnectionDetailInfo {\n            const NAME: &'static str = \"DisconnectionDetailInfo\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        10 => {\n                            self.reason = is.read_string()?;\n                        },\n                        16 => {\n                            self.count = is.read_int32()?;\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if !self.reason.is_empty() {\n                    my_size += ::protobuf::rt::string_size(1, &self.reason);\n                }\n                if self.count != 0 {\n                    my_size += ::protobuf::rt::int32_size(2, self.count);\n                }\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if !self.reason.is_empty() {\n                    os.write_string(1, &self.reason)?;\n                }\n                if self.count != 0 {\n                    os.write_int32(2, self.count)?;\n                }\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> DisconnectionDetailInfo {\n                DisconnectionDetailInfo::new()\n            }\n\n            fn clear(&mut self) {\n                self.reason.clear();\n                self.count = 0;\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static DisconnectionDetailInfo {\n                static instance: DisconnectionDetailInfo = DisconnectionDetailInfo {\n                    reason: ::std::string::String::new(),\n                    count: 0,\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for DisconnectionDetailInfo {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NetInfo.DisconnectionDetailInfo\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for DisconnectionDetailInfo {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for DisconnectionDetailInfo {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n\n        // @@protoc_insertion_point(message:protocol.MetricsInfo.NetInfo.LatencyInfo)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct LatencyInfo {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.top99)\n            pub top99: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.top95)\n            pub top95: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.top75)\n            pub top75: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.totalCount)\n            pub totalCount: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.delay1S)\n            pub delay1S: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.delay2S)\n            pub delay2S: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.delay3S)\n            pub delay3S: i32,\n            // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.detail)\n            pub detail: ::std::vec::Vec<latency_info::LatencyDetailInfo>,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NetInfo.LatencyInfo.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a LatencyInfo {\n            fn default() -> &'a LatencyInfo {\n                <LatencyInfo as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl LatencyInfo {\n            pub fn new() -> LatencyInfo {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(8);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"top99\",\n                    |m: &LatencyInfo| { &m.top99 },\n                    |m: &mut LatencyInfo| { &mut m.top99 },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"top95\",\n                    |m: &LatencyInfo| { &m.top95 },\n                    |m: &mut LatencyInfo| { &mut m.top95 },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"top75\",\n                    |m: &LatencyInfo| { &m.top75 },\n                    |m: &mut LatencyInfo| { &mut m.top75 },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"totalCount\",\n                    |m: &LatencyInfo| { &m.totalCount },\n                    |m: &mut LatencyInfo| { &mut m.totalCount },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"delay1S\",\n                    |m: &LatencyInfo| { &m.delay1S },\n                    |m: &mut LatencyInfo| { &mut m.delay1S },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"delay2S\",\n                    |m: &LatencyInfo| { &m.delay2S },\n                    |m: &mut LatencyInfo| { &mut m.delay2S },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"delay3S\",\n                    |m: &LatencyInfo| { &m.delay3S },\n                    |m: &mut LatencyInfo| { &mut m.delay3S },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                    \"detail\",\n                    |m: &LatencyInfo| { &m.detail },\n                    |m: &mut LatencyInfo| { &mut m.detail },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<LatencyInfo>(\n                    \"MetricsInfo.NetInfo.LatencyInfo\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for LatencyInfo {\n            const NAME: &'static str = \"LatencyInfo\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        8 => {\n                            self.top99 = is.read_int32()?;\n                        },\n                        16 => {\n                            self.top95 = is.read_int32()?;\n                        },\n                        24 => {\n                            self.top75 = is.read_int32()?;\n                        },\n                        32 => {\n                            self.totalCount = is.read_int32()?;\n                        },\n                        40 => {\n                            self.delay1S = is.read_int32()?;\n                        },\n                        48 => {\n                            self.delay2S = is.read_int32()?;\n                        },\n                        56 => {\n                            self.delay3S = is.read_int32()?;\n                        },\n                        66 => {\n                            self.detail.push(is.read_message()?);\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if self.top99 != 0 {\n                    my_size += ::protobuf::rt::int32_size(1, self.top99);\n                }\n                if self.top95 != 0 {\n                    my_size += ::protobuf::rt::int32_size(2, self.top95);\n                }\n                if self.top75 != 0 {\n                    my_size += ::protobuf::rt::int32_size(3, self.top75);\n                }\n                if self.totalCount != 0 {\n                    my_size += ::protobuf::rt::int32_size(4, self.totalCount);\n                }\n                if self.delay1S != 0 {\n                    my_size += ::protobuf::rt::int32_size(5, self.delay1S);\n                }\n                if self.delay2S != 0 {\n                    my_size += ::protobuf::rt::int32_size(6, self.delay2S);\n                }\n                if self.delay3S != 0 {\n                    my_size += ::protobuf::rt::int32_size(7, self.delay3S);\n                }\n                for value in &self.detail {\n                    let len = value.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                };\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if self.top99 != 0 {\n                    os.write_int32(1, self.top99)?;\n                }\n                if self.top95 != 0 {\n                    os.write_int32(2, self.top95)?;\n                }\n                if self.top75 != 0 {\n                    os.write_int32(3, self.top75)?;\n                }\n                if self.totalCount != 0 {\n                    os.write_int32(4, self.totalCount)?;\n                }\n                if self.delay1S != 0 {\n                    os.write_int32(5, self.delay1S)?;\n                }\n                if self.delay2S != 0 {\n                    os.write_int32(6, self.delay2S)?;\n                }\n                if self.delay3S != 0 {\n                    os.write_int32(7, self.delay3S)?;\n                }\n                for v in &self.detail {\n                    ::protobuf::rt::write_message_field_with_cached_size(8, v, os)?;\n                };\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> LatencyInfo {\n                LatencyInfo::new()\n            }\n\n            fn clear(&mut self) {\n                self.top99 = 0;\n                self.top95 = 0;\n                self.top75 = 0;\n                self.totalCount = 0;\n                self.delay1S = 0;\n                self.delay2S = 0;\n                self.delay3S = 0;\n                self.detail.clear();\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static LatencyInfo {\n                static instance: LatencyInfo = LatencyInfo {\n                    top99: 0,\n                    top95: 0,\n                    top75: 0,\n                    totalCount: 0,\n                    delay1S: 0,\n                    delay2S: 0,\n                    delay3S: 0,\n                    detail: ::std::vec::Vec::new(),\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for LatencyInfo {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NetInfo.LatencyInfo\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for LatencyInfo {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for LatencyInfo {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n\n        /// Nested message and enums of message `LatencyInfo`\n        pub mod latency_info {\n            // @@protoc_insertion_point(message:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo)\n            #[derive(PartialEq,Clone,Default,Debug)]\n            pub struct LatencyDetailInfo {\n                // message fields\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.witness)\n                pub witness: ::std::string::String,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.top99)\n                pub top99: i32,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.top95)\n                pub top95: i32,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.top75)\n                pub top75: i32,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.count)\n                pub count: i32,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.delay1S)\n                pub delay1S: i32,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.delay2S)\n                pub delay2S: i32,\n                // @@protoc_insertion_point(field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.delay3S)\n                pub delay3S: i32,\n                // special fields\n                // @@protoc_insertion_point(special_field:protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo.special_fields)\n                pub special_fields: ::protobuf::SpecialFields,\n            }\n\n            impl<'a> ::std::default::Default for &'a LatencyDetailInfo {\n                fn default() -> &'a LatencyDetailInfo {\n                    <LatencyDetailInfo as ::protobuf::Message>::default_instance()\n                }\n            }\n\n            impl LatencyDetailInfo {\n                pub fn new() -> LatencyDetailInfo {\n                    ::std::default::Default::default()\n                }\n\n                pub(in super::super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                    let mut fields = ::std::vec::Vec::with_capacity(8);\n                    let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"witness\",\n                        |m: &LatencyDetailInfo| { &m.witness },\n                        |m: &mut LatencyDetailInfo| { &mut m.witness },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"top99\",\n                        |m: &LatencyDetailInfo| { &m.top99 },\n                        |m: &mut LatencyDetailInfo| { &mut m.top99 },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"top95\",\n                        |m: &LatencyDetailInfo| { &m.top95 },\n                        |m: &mut LatencyDetailInfo| { &mut m.top95 },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"top75\",\n                        |m: &LatencyDetailInfo| { &m.top75 },\n                        |m: &mut LatencyDetailInfo| { &mut m.top75 },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"count\",\n                        |m: &LatencyDetailInfo| { &m.count },\n                        |m: &mut LatencyDetailInfo| { &mut m.count },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"delay1S\",\n                        |m: &LatencyDetailInfo| { &m.delay1S },\n                        |m: &mut LatencyDetailInfo| { &mut m.delay1S },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"delay2S\",\n                        |m: &LatencyDetailInfo| { &m.delay2S },\n                        |m: &mut LatencyDetailInfo| { &mut m.delay2S },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"delay3S\",\n                        |m: &LatencyDetailInfo| { &m.delay3S },\n                        |m: &mut LatencyDetailInfo| { &mut m.delay3S },\n                    ));\n                    ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<LatencyDetailInfo>(\n                        \"MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo\",\n                        fields,\n                        oneofs,\n                    )\n                }\n            }\n\n            impl ::protobuf::Message for LatencyDetailInfo {\n                const NAME: &'static str = \"LatencyDetailInfo\";\n\n                fn is_initialized(&self) -> bool {\n                    true\n                }\n\n                fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            10 => {\n                                self.witness = is.read_string()?;\n                            },\n                            16 => {\n                                self.top99 = is.read_int32()?;\n                            },\n                            24 => {\n                                self.top95 = is.read_int32()?;\n                            },\n                            32 => {\n                                self.top75 = is.read_int32()?;\n                            },\n                            40 => {\n                                self.count = is.read_int32()?;\n                            },\n                            48 => {\n                                self.delay1S = is.read_int32()?;\n                            },\n                            56 => {\n                                self.delay2S = is.read_int32()?;\n                            },\n                            64 => {\n                                self.delay3S = is.read_int32()?;\n                            },\n                            tag => {\n                                ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                            },\n                        };\n                    }\n                    ::std::result::Result::Ok(())\n                }\n\n                // Compute sizes of nested messages\n                #[allow(unused_variables)]\n                fn compute_size(&self) -> u64 {\n                    let mut my_size = 0;\n                    if !self.witness.is_empty() {\n                        my_size += ::protobuf::rt::string_size(1, &self.witness);\n                    }\n                    if self.top99 != 0 {\n                        my_size += ::protobuf::rt::int32_size(2, self.top99);\n                    }\n                    if self.top95 != 0 {\n                        my_size += ::protobuf::rt::int32_size(3, self.top95);\n                    }\n                    if self.top75 != 0 {\n                        my_size += ::protobuf::rt::int32_size(4, self.top75);\n                    }\n                    if self.count != 0 {\n                        my_size += ::protobuf::rt::int32_size(5, self.count);\n                    }\n                    if self.delay1S != 0 {\n                        my_size += ::protobuf::rt::int32_size(6, self.delay1S);\n                    }\n                    if self.delay2S != 0 {\n                        my_size += ::protobuf::rt::int32_size(7, self.delay2S);\n                    }\n                    if self.delay3S != 0 {\n                        my_size += ::protobuf::rt::int32_size(8, self.delay3S);\n                    }\n                    my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                    self.special_fields.cached_size().set(my_size as u32);\n                    my_size\n                }\n\n                fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                    if !self.witness.is_empty() {\n                        os.write_string(1, &self.witness)?;\n                    }\n                    if self.top99 != 0 {\n                        os.write_int32(2, self.top99)?;\n                    }\n                    if self.top95 != 0 {\n                        os.write_int32(3, self.top95)?;\n                    }\n                    if self.top75 != 0 {\n                        os.write_int32(4, self.top75)?;\n                    }\n                    if self.count != 0 {\n                        os.write_int32(5, self.count)?;\n                    }\n                    if self.delay1S != 0 {\n                        os.write_int32(6, self.delay1S)?;\n                    }\n                    if self.delay2S != 0 {\n                        os.write_int32(7, self.delay2S)?;\n                    }\n                    if self.delay3S != 0 {\n                        os.write_int32(8, self.delay3S)?;\n                    }\n                    os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                    ::std::result::Result::Ok(())\n                }\n\n                fn special_fields(&self) -> &::protobuf::SpecialFields {\n                    &self.special_fields\n                }\n\n                fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                    &mut self.special_fields\n                }\n\n                fn new() -> LatencyDetailInfo {\n                    LatencyDetailInfo::new()\n                }\n\n                fn clear(&mut self) {\n                    self.witness.clear();\n                    self.top99 = 0;\n                    self.top95 = 0;\n                    self.top75 = 0;\n                    self.count = 0;\n                    self.delay1S = 0;\n                    self.delay2S = 0;\n                    self.delay3S = 0;\n                    self.special_fields.clear();\n                }\n\n                fn default_instance() -> &'static LatencyDetailInfo {\n                    static instance: LatencyDetailInfo = LatencyDetailInfo {\n                        witness: ::std::string::String::new(),\n                        top99: 0,\n                        top95: 0,\n                        top75: 0,\n                        count: 0,\n                        delay1S: 0,\n                        delay2S: 0,\n                        delay3S: 0,\n                        special_fields: ::protobuf::SpecialFields::new(),\n                    };\n                    &instance\n                }\n            }\n\n            impl ::protobuf::MessageFull for LatencyDetailInfo {\n                fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                    static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                    descriptor.get(|| super::super::super::file_descriptor().message_by_package_relative_name(\"MetricsInfo.NetInfo.LatencyInfo.LatencyDetailInfo\").unwrap()).clone()\n                }\n            }\n\n            impl ::std::fmt::Display for LatencyDetailInfo {\n                fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                    ::protobuf::text_format::fmt(self, f)\n                }\n            }\n\n            impl ::protobuf::reflect::ProtobufValue for LatencyDetailInfo {\n                type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n            }\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.PBFTMessage)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct PBFTMessage {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.PBFTMessage.raw_data)\n    pub raw_data: ::protobuf::MessageField<pbftmessage::Raw>,\n    // @@protoc_insertion_point(field:protocol.PBFTMessage.signature)\n    pub signature: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.PBFTMessage.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a PBFTMessage {\n    fn default() -> &'a PBFTMessage {\n        <PBFTMessage as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl PBFTMessage {\n    pub fn new() -> PBFTMessage {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, pbftmessage::Raw>(\n            \"raw_data\",\n            |m: &PBFTMessage| { &m.raw_data },\n            |m: &mut PBFTMessage| { &mut m.raw_data },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"signature\",\n            |m: &PBFTMessage| { &m.signature },\n            |m: &mut PBFTMessage| { &mut m.signature },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<PBFTMessage>(\n            \"PBFTMessage\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for PBFTMessage {\n    const NAME: &'static str = \"PBFTMessage\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.raw_data)?;\n                },\n                18 => {\n                    self.signature = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.raw_data.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.signature.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.signature);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.raw_data.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if !self.signature.is_empty() {\n            os.write_bytes(2, &self.signature)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> PBFTMessage {\n        PBFTMessage::new()\n    }\n\n    fn clear(&mut self) {\n        self.raw_data.clear();\n        self.signature.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static PBFTMessage {\n        static instance: PBFTMessage = PBFTMessage {\n            raw_data: ::protobuf::MessageField::none(),\n            signature: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for PBFTMessage {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"PBFTMessage\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for PBFTMessage {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for PBFTMessage {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `PBFTMessage`\npub mod pbftmessage {\n    // @@protoc_insertion_point(message:protocol.PBFTMessage.Raw)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Raw {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.PBFTMessage.Raw.msg_type)\n        pub msg_type: ::protobuf::EnumOrUnknown<MsgType>,\n        // @@protoc_insertion_point(field:protocol.PBFTMessage.Raw.data_type)\n        pub data_type: ::protobuf::EnumOrUnknown<DataType>,\n        // @@protoc_insertion_point(field:protocol.PBFTMessage.Raw.view_n)\n        pub view_n: i64,\n        // @@protoc_insertion_point(field:protocol.PBFTMessage.Raw.epoch)\n        pub epoch: i64,\n        // @@protoc_insertion_point(field:protocol.PBFTMessage.Raw.data)\n        pub data: ::std::vec::Vec<u8>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.PBFTMessage.Raw.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Raw {\n        fn default() -> &'a Raw {\n            <Raw as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Raw {\n        pub fn new() -> Raw {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(5);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"msg_type\",\n                |m: &Raw| { &m.msg_type },\n                |m: &mut Raw| { &mut m.msg_type },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"data_type\",\n                |m: &Raw| { &m.data_type },\n                |m: &mut Raw| { &mut m.data_type },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"view_n\",\n                |m: &Raw| { &m.view_n },\n                |m: &mut Raw| { &mut m.view_n },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"epoch\",\n                |m: &Raw| { &m.epoch },\n                |m: &mut Raw| { &mut m.epoch },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"data\",\n                |m: &Raw| { &m.data },\n                |m: &mut Raw| { &mut m.data },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Raw>(\n                \"PBFTMessage.Raw\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Raw {\n        const NAME: &'static str = \"Raw\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.msg_type = is.read_enum_or_unknown()?;\n                    },\n                    16 => {\n                        self.data_type = is.read_enum_or_unknown()?;\n                    },\n                    24 => {\n                        self.view_n = is.read_int64()?;\n                    },\n                    32 => {\n                        self.epoch = is.read_int64()?;\n                    },\n                    42 => {\n                        self.data = is.read_bytes()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.msg_type != ::protobuf::EnumOrUnknown::new(MsgType::VIEW_CHANGE) {\n                my_size += ::protobuf::rt::int32_size(1, self.msg_type.value());\n            }\n            if self.data_type != ::protobuf::EnumOrUnknown::new(DataType::BLOCK) {\n                my_size += ::protobuf::rt::int32_size(2, self.data_type.value());\n            }\n            if self.view_n != 0 {\n                my_size += ::protobuf::rt::int64_size(3, self.view_n);\n            }\n            if self.epoch != 0 {\n                my_size += ::protobuf::rt::int64_size(4, self.epoch);\n            }\n            if !self.data.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(5, &self.data);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.msg_type != ::protobuf::EnumOrUnknown::new(MsgType::VIEW_CHANGE) {\n                os.write_enum(1, ::protobuf::EnumOrUnknown::value(&self.msg_type))?;\n            }\n            if self.data_type != ::protobuf::EnumOrUnknown::new(DataType::BLOCK) {\n                os.write_enum(2, ::protobuf::EnumOrUnknown::value(&self.data_type))?;\n            }\n            if self.view_n != 0 {\n                os.write_int64(3, self.view_n)?;\n            }\n            if self.epoch != 0 {\n                os.write_int64(4, self.epoch)?;\n            }\n            if !self.data.is_empty() {\n                os.write_bytes(5, &self.data)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Raw {\n            Raw::new()\n        }\n\n        fn clear(&mut self) {\n            self.msg_type = ::protobuf::EnumOrUnknown::new(MsgType::VIEW_CHANGE);\n            self.data_type = ::protobuf::EnumOrUnknown::new(DataType::BLOCK);\n            self.view_n = 0;\n            self.epoch = 0;\n            self.data.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Raw {\n            static instance: Raw = Raw {\n                msg_type: ::protobuf::EnumOrUnknown::from_i32(0),\n                data_type: ::protobuf::EnumOrUnknown::from_i32(0),\n                view_n: 0,\n                epoch: 0,\n                data: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Raw {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"PBFTMessage.Raw\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Raw {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Raw {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.PBFTMessage.MsgType)\n    pub enum MsgType {\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.MsgType.VIEW_CHANGE)\n        VIEW_CHANGE = 0,\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.MsgType.REQUEST)\n        REQUEST = 1,\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.MsgType.PREPREPARE)\n        PREPREPARE = 2,\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.MsgType.PREPARE)\n        PREPARE = 3,\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.MsgType.COMMIT)\n        COMMIT = 4,\n    }\n\n    impl ::protobuf::Enum for MsgType {\n        const NAME: &'static str = \"MsgType\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<MsgType> {\n            match value {\n                0 => ::std::option::Option::Some(MsgType::VIEW_CHANGE),\n                1 => ::std::option::Option::Some(MsgType::REQUEST),\n                2 => ::std::option::Option::Some(MsgType::PREPREPARE),\n                3 => ::std::option::Option::Some(MsgType::PREPARE),\n                4 => ::std::option::Option::Some(MsgType::COMMIT),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<MsgType> {\n            match str {\n                \"VIEW_CHANGE\" => ::std::option::Option::Some(MsgType::VIEW_CHANGE),\n                \"REQUEST\" => ::std::option::Option::Some(MsgType::REQUEST),\n                \"PREPREPARE\" => ::std::option::Option::Some(MsgType::PREPREPARE),\n                \"PREPARE\" => ::std::option::Option::Some(MsgType::PREPARE),\n                \"COMMIT\" => ::std::option::Option::Some(MsgType::COMMIT),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [MsgType] = &[\n            MsgType::VIEW_CHANGE,\n            MsgType::REQUEST,\n            MsgType::PREPREPARE,\n            MsgType::PREPARE,\n            MsgType::COMMIT,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for MsgType {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"PBFTMessage.MsgType\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for MsgType {\n        fn default() -> Self {\n            MsgType::VIEW_CHANGE\n        }\n    }\n\n    impl MsgType {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<MsgType>(\"PBFTMessage.MsgType\")\n        }\n    }\n\n    #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n    // @@protoc_insertion_point(enum:protocol.PBFTMessage.DataType)\n    pub enum DataType {\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.DataType.BLOCK)\n        BLOCK = 0,\n        // @@protoc_insertion_point(enum_value:protocol.PBFTMessage.DataType.SRL)\n        SRL = 1,\n    }\n\n    impl ::protobuf::Enum for DataType {\n        const NAME: &'static str = \"DataType\";\n\n        fn value(&self) -> i32 {\n            *self as i32\n        }\n\n        fn from_i32(value: i32) -> ::std::option::Option<DataType> {\n            match value {\n                0 => ::std::option::Option::Some(DataType::BLOCK),\n                1 => ::std::option::Option::Some(DataType::SRL),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        fn from_str(str: &str) -> ::std::option::Option<DataType> {\n            match str {\n                \"BLOCK\" => ::std::option::Option::Some(DataType::BLOCK),\n                \"SRL\" => ::std::option::Option::Some(DataType::SRL),\n                _ => ::std::option::Option::None\n            }\n        }\n\n        const VALUES: &'static [DataType] = &[\n            DataType::BLOCK,\n            DataType::SRL,\n        ];\n    }\n\n    impl ::protobuf::EnumFull for DataType {\n        fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().enum_by_package_relative_name(\"PBFTMessage.DataType\").unwrap()).clone()\n        }\n\n        fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n            let index = *self as usize;\n            Self::enum_descriptor().value_by_index(index)\n        }\n    }\n\n    impl ::std::default::Default for DataType {\n        fn default() -> Self {\n            DataType::BLOCK\n        }\n    }\n\n    impl DataType {\n        pub(in super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n            ::protobuf::reflect::GeneratedEnumDescriptorData::new::<DataType>(\"PBFTMessage.DataType\")\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.PBFTCommitResult)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct PBFTCommitResult {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.PBFTCommitResult.data)\n    pub data: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.PBFTCommitResult.signature)\n    pub signature: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.PBFTCommitResult.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a PBFTCommitResult {\n    fn default() -> &'a PBFTCommitResult {\n        <PBFTCommitResult as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl PBFTCommitResult {\n    pub fn new() -> PBFTCommitResult {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"data\",\n            |m: &PBFTCommitResult| { &m.data },\n            |m: &mut PBFTCommitResult| { &mut m.data },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"signature\",\n            |m: &PBFTCommitResult| { &m.signature },\n            |m: &mut PBFTCommitResult| { &mut m.signature },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<PBFTCommitResult>(\n            \"PBFTCommitResult\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for PBFTCommitResult {\n    const NAME: &'static str = \"PBFTCommitResult\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.data = is.read_bytes()?;\n                },\n                18 => {\n                    self.signature.push(is.read_bytes()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.data.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.data);\n        }\n        for value in &self.signature {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.data.is_empty() {\n            os.write_bytes(1, &self.data)?;\n        }\n        for v in &self.signature {\n            os.write_bytes(2, &v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> PBFTCommitResult {\n        PBFTCommitResult::new()\n    }\n\n    fn clear(&mut self) {\n        self.data.clear();\n        self.signature.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static PBFTCommitResult {\n        static instance: PBFTCommitResult = PBFTCommitResult {\n            data: ::std::vec::Vec::new(),\n            signature: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for PBFTCommitResult {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"PBFTCommitResult\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for PBFTCommitResult {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for PBFTCommitResult {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.SRL)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct SRL {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.SRL.srAddress)\n    pub srAddress: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.SRL.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a SRL {\n    fn default() -> &'a SRL {\n        <SRL as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl SRL {\n    pub fn new() -> SRL {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"srAddress\",\n            |m: &SRL| { &m.srAddress },\n            |m: &mut SRL| { &mut m.srAddress },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<SRL>(\n            \"SRL\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for SRL {\n    const NAME: &'static str = \"SRL\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.srAddress.push(is.read_bytes()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.srAddress {\n            my_size += ::protobuf::rt::bytes_size(1, &value);\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.srAddress {\n            os.write_bytes(1, &v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> SRL {\n        SRL::new()\n    }\n\n    fn clear(&mut self) {\n        self.srAddress.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static SRL {\n        static instance: SRL = SRL {\n            srAddress: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for SRL {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"SRL\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for SRL {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for SRL {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n// @@protoc_insertion_point(enum:protocol.AccountType)\npub enum AccountType {\n    // @@protoc_insertion_point(enum_value:protocol.AccountType.Normal)\n    Normal = 0,\n    // @@protoc_insertion_point(enum_value:protocol.AccountType.AssetIssue)\n    AssetIssue = 1,\n    // @@protoc_insertion_point(enum_value:protocol.AccountType.Contract)\n    Contract = 2,\n}\n\nimpl ::protobuf::Enum for AccountType {\n    const NAME: &'static str = \"AccountType\";\n\n    fn value(&self) -> i32 {\n        *self as i32\n    }\n\n    fn from_i32(value: i32) -> ::std::option::Option<AccountType> {\n        match value {\n            0 => ::std::option::Option::Some(AccountType::Normal),\n            1 => ::std::option::Option::Some(AccountType::AssetIssue),\n            2 => ::std::option::Option::Some(AccountType::Contract),\n            _ => ::std::option::Option::None\n        }\n    }\n\n    fn from_str(str: &str) -> ::std::option::Option<AccountType> {\n        match str {\n            \"Normal\" => ::std::option::Option::Some(AccountType::Normal),\n            \"AssetIssue\" => ::std::option::Option::Some(AccountType::AssetIssue),\n            \"Contract\" => ::std::option::Option::Some(AccountType::Contract),\n            _ => ::std::option::Option::None\n        }\n    }\n\n    const VALUES: &'static [AccountType] = &[\n        AccountType::Normal,\n        AccountType::AssetIssue,\n        AccountType::Contract,\n    ];\n}\n\nimpl ::protobuf::EnumFull for AccountType {\n    fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().enum_by_package_relative_name(\"AccountType\").unwrap()).clone()\n    }\n\n    fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n        let index = *self as usize;\n        Self::enum_descriptor().value_by_index(index)\n    }\n}\n\nimpl ::std::default::Default for AccountType {\n    fn default() -> Self {\n        AccountType::Normal\n    }\n}\n\nimpl AccountType {\n    fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n        ::protobuf::reflect::GeneratedEnumDescriptorData::new::<AccountType>(\"AccountType\")\n    }\n}\n\n#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n// @@protoc_insertion_point(enum:protocol.ReasonCode)\npub enum ReasonCode {\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.REQUESTED)\n    REQUESTED = 0,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.BAD_PROTOCOL)\n    BAD_PROTOCOL = 2,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.TOO_MANY_PEERS)\n    TOO_MANY_PEERS = 4,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.DUPLICATE_PEER)\n    DUPLICATE_PEER = 5,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.INCOMPATIBLE_PROTOCOL)\n    INCOMPATIBLE_PROTOCOL = 6,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.RANDOM_ELIMINATION)\n    RANDOM_ELIMINATION = 7,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.PEER_QUITING)\n    PEER_QUITING = 8,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.UNEXPECTED_IDENTITY)\n    UNEXPECTED_IDENTITY = 9,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.LOCAL_IDENTITY)\n    LOCAL_IDENTITY = 10,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.PING_TIMEOUT)\n    PING_TIMEOUT = 11,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.USER_REASON)\n    USER_REASON = 16,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.RESET)\n    RESET = 17,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.SYNC_FAIL)\n    SYNC_FAIL = 18,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.FETCH_FAIL)\n    FETCH_FAIL = 19,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.BAD_TX)\n    BAD_TX = 20,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.BAD_BLOCK)\n    BAD_BLOCK = 21,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.FORKED)\n    FORKED = 22,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.UNLINKABLE)\n    UNLINKABLE = 23,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.INCOMPATIBLE_VERSION)\n    INCOMPATIBLE_VERSION = 24,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.INCOMPATIBLE_CHAIN)\n    INCOMPATIBLE_CHAIN = 25,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.TIME_OUT)\n    TIME_OUT = 32,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.CONNECT_FAIL)\n    CONNECT_FAIL = 33,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.TOO_MANY_PEERS_WITH_SAME_IP)\n    TOO_MANY_PEERS_WITH_SAME_IP = 34,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.LIGHT_NODE_SYNC_FAIL)\n    LIGHT_NODE_SYNC_FAIL = 35,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.BELOW_THAN_ME)\n    BELOW_THAN_ME = 36,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.NOT_WITNESS)\n    NOT_WITNESS = 37,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.NO_SUCH_MESSAGE)\n    NO_SUCH_MESSAGE = 38,\n    // @@protoc_insertion_point(enum_value:protocol.ReasonCode.UNKNOWN)\n    UNKNOWN = 255,\n}\n\nimpl ::protobuf::Enum for ReasonCode {\n    const NAME: &'static str = \"ReasonCode\";\n\n    fn value(&self) -> i32 {\n        *self as i32\n    }\n\n    fn from_i32(value: i32) -> ::std::option::Option<ReasonCode> {\n        match value {\n            0 => ::std::option::Option::Some(ReasonCode::REQUESTED),\n            2 => ::std::option::Option::Some(ReasonCode::BAD_PROTOCOL),\n            4 => ::std::option::Option::Some(ReasonCode::TOO_MANY_PEERS),\n            5 => ::std::option::Option::Some(ReasonCode::DUPLICATE_PEER),\n            6 => ::std::option::Option::Some(ReasonCode::INCOMPATIBLE_PROTOCOL),\n            7 => ::std::option::Option::Some(ReasonCode::RANDOM_ELIMINATION),\n            8 => ::std::option::Option::Some(ReasonCode::PEER_QUITING),\n            9 => ::std::option::Option::Some(ReasonCode::UNEXPECTED_IDENTITY),\n            10 => ::std::option::Option::Some(ReasonCode::LOCAL_IDENTITY),\n            11 => ::std::option::Option::Some(ReasonCode::PING_TIMEOUT),\n            16 => ::std::option::Option::Some(ReasonCode::USER_REASON),\n            17 => ::std::option::Option::Some(ReasonCode::RESET),\n            18 => ::std::option::Option::Some(ReasonCode::SYNC_FAIL),\n            19 => ::std::option::Option::Some(ReasonCode::FETCH_FAIL),\n            20 => ::std::option::Option::Some(ReasonCode::BAD_TX),\n            21 => ::std::option::Option::Some(ReasonCode::BAD_BLOCK),\n            22 => ::std::option::Option::Some(ReasonCode::FORKED),\n            23 => ::std::option::Option::Some(ReasonCode::UNLINKABLE),\n            24 => ::std::option::Option::Some(ReasonCode::INCOMPATIBLE_VERSION),\n            25 => ::std::option::Option::Some(ReasonCode::INCOMPATIBLE_CHAIN),\n            32 => ::std::option::Option::Some(ReasonCode::TIME_OUT),\n            33 => ::std::option::Option::Some(ReasonCode::CONNECT_FAIL),\n            34 => ::std::option::Option::Some(ReasonCode::TOO_MANY_PEERS_WITH_SAME_IP),\n            35 => ::std::option::Option::Some(ReasonCode::LIGHT_NODE_SYNC_FAIL),\n            36 => ::std::option::Option::Some(ReasonCode::BELOW_THAN_ME),\n            37 => ::std::option::Option::Some(ReasonCode::NOT_WITNESS),\n            38 => ::std::option::Option::Some(ReasonCode::NO_SUCH_MESSAGE),\n            255 => ::std::option::Option::Some(ReasonCode::UNKNOWN),\n            _ => ::std::option::Option::None\n        }\n    }\n\n    fn from_str(str: &str) -> ::std::option::Option<ReasonCode> {\n        match str {\n            \"REQUESTED\" => ::std::option::Option::Some(ReasonCode::REQUESTED),\n            \"BAD_PROTOCOL\" => ::std::option::Option::Some(ReasonCode::BAD_PROTOCOL),\n            \"TOO_MANY_PEERS\" => ::std::option::Option::Some(ReasonCode::TOO_MANY_PEERS),\n            \"DUPLICATE_PEER\" => ::std::option::Option::Some(ReasonCode::DUPLICATE_PEER),\n            \"INCOMPATIBLE_PROTOCOL\" => ::std::option::Option::Some(ReasonCode::INCOMPATIBLE_PROTOCOL),\n            \"RANDOM_ELIMINATION\" => ::std::option::Option::Some(ReasonCode::RANDOM_ELIMINATION),\n            \"PEER_QUITING\" => ::std::option::Option::Some(ReasonCode::PEER_QUITING),\n            \"UNEXPECTED_IDENTITY\" => ::std::option::Option::Some(ReasonCode::UNEXPECTED_IDENTITY),\n            \"LOCAL_IDENTITY\" => ::std::option::Option::Some(ReasonCode::LOCAL_IDENTITY),\n            \"PING_TIMEOUT\" => ::std::option::Option::Some(ReasonCode::PING_TIMEOUT),\n            \"USER_REASON\" => ::std::option::Option::Some(ReasonCode::USER_REASON),\n            \"RESET\" => ::std::option::Option::Some(ReasonCode::RESET),\n            \"SYNC_FAIL\" => ::std::option::Option::Some(ReasonCode::SYNC_FAIL),\n            \"FETCH_FAIL\" => ::std::option::Option::Some(ReasonCode::FETCH_FAIL),\n            \"BAD_TX\" => ::std::option::Option::Some(ReasonCode::BAD_TX),\n            \"BAD_BLOCK\" => ::std::option::Option::Some(ReasonCode::BAD_BLOCK),\n            \"FORKED\" => ::std::option::Option::Some(ReasonCode::FORKED),\n            \"UNLINKABLE\" => ::std::option::Option::Some(ReasonCode::UNLINKABLE),\n            \"INCOMPATIBLE_VERSION\" => ::std::option::Option::Some(ReasonCode::INCOMPATIBLE_VERSION),\n            \"INCOMPATIBLE_CHAIN\" => ::std::option::Option::Some(ReasonCode::INCOMPATIBLE_CHAIN),\n            \"TIME_OUT\" => ::std::option::Option::Some(ReasonCode::TIME_OUT),\n            \"CONNECT_FAIL\" => ::std::option::Option::Some(ReasonCode::CONNECT_FAIL),\n            \"TOO_MANY_PEERS_WITH_SAME_IP\" => ::std::option::Option::Some(ReasonCode::TOO_MANY_PEERS_WITH_SAME_IP),\n            \"LIGHT_NODE_SYNC_FAIL\" => ::std::option::Option::Some(ReasonCode::LIGHT_NODE_SYNC_FAIL),\n            \"BELOW_THAN_ME\" => ::std::option::Option::Some(ReasonCode::BELOW_THAN_ME),\n            \"NOT_WITNESS\" => ::std::option::Option::Some(ReasonCode::NOT_WITNESS),\n            \"NO_SUCH_MESSAGE\" => ::std::option::Option::Some(ReasonCode::NO_SUCH_MESSAGE),\n            \"UNKNOWN\" => ::std::option::Option::Some(ReasonCode::UNKNOWN),\n            _ => ::std::option::Option::None\n        }\n    }\n\n    const VALUES: &'static [ReasonCode] = &[\n        ReasonCode::REQUESTED,\n        ReasonCode::BAD_PROTOCOL,\n        ReasonCode::TOO_MANY_PEERS,\n        ReasonCode::DUPLICATE_PEER,\n        ReasonCode::INCOMPATIBLE_PROTOCOL,\n        ReasonCode::RANDOM_ELIMINATION,\n        ReasonCode::PEER_QUITING,\n        ReasonCode::UNEXPECTED_IDENTITY,\n        ReasonCode::LOCAL_IDENTITY,\n        ReasonCode::PING_TIMEOUT,\n        ReasonCode::USER_REASON,\n        ReasonCode::RESET,\n        ReasonCode::SYNC_FAIL,\n        ReasonCode::FETCH_FAIL,\n        ReasonCode::BAD_TX,\n        ReasonCode::BAD_BLOCK,\n        ReasonCode::FORKED,\n        ReasonCode::UNLINKABLE,\n        ReasonCode::INCOMPATIBLE_VERSION,\n        ReasonCode::INCOMPATIBLE_CHAIN,\n        ReasonCode::TIME_OUT,\n        ReasonCode::CONNECT_FAIL,\n        ReasonCode::TOO_MANY_PEERS_WITH_SAME_IP,\n        ReasonCode::LIGHT_NODE_SYNC_FAIL,\n        ReasonCode::BELOW_THAN_ME,\n        ReasonCode::NOT_WITNESS,\n        ReasonCode::NO_SUCH_MESSAGE,\n        ReasonCode::UNKNOWN,\n    ];\n}\n\nimpl ::protobuf::EnumFull for ReasonCode {\n    fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().enum_by_package_relative_name(\"ReasonCode\").unwrap()).clone()\n    }\n\n    fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n        let index = match self {\n            ReasonCode::REQUESTED => 0,\n            ReasonCode::BAD_PROTOCOL => 1,\n            ReasonCode::TOO_MANY_PEERS => 2,\n            ReasonCode::DUPLICATE_PEER => 3,\n            ReasonCode::INCOMPATIBLE_PROTOCOL => 4,\n            ReasonCode::RANDOM_ELIMINATION => 5,\n            ReasonCode::PEER_QUITING => 6,\n            ReasonCode::UNEXPECTED_IDENTITY => 7,\n            ReasonCode::LOCAL_IDENTITY => 8,\n            ReasonCode::PING_TIMEOUT => 9,\n            ReasonCode::USER_REASON => 10,\n            ReasonCode::RESET => 11,\n            ReasonCode::SYNC_FAIL => 12,\n            ReasonCode::FETCH_FAIL => 13,\n            ReasonCode::BAD_TX => 14,\n            ReasonCode::BAD_BLOCK => 15,\n            ReasonCode::FORKED => 16,\n            ReasonCode::UNLINKABLE => 17,\n            ReasonCode::INCOMPATIBLE_VERSION => 18,\n            ReasonCode::INCOMPATIBLE_CHAIN => 19,\n            ReasonCode::TIME_OUT => 20,\n            ReasonCode::CONNECT_FAIL => 21,\n            ReasonCode::TOO_MANY_PEERS_WITH_SAME_IP => 22,\n            ReasonCode::LIGHT_NODE_SYNC_FAIL => 23,\n            ReasonCode::BELOW_THAN_ME => 24,\n            ReasonCode::NOT_WITNESS => 25,\n            ReasonCode::NO_SUCH_MESSAGE => 26,\n            ReasonCode::UNKNOWN => 27,\n        };\n        Self::enum_descriptor().value_by_index(index)\n    }\n}\n\nimpl ::std::default::Default for ReasonCode {\n    fn default() -> Self {\n        ReasonCode::REQUESTED\n    }\n}\n\nimpl ReasonCode {\n    fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n        ::protobuf::reflect::GeneratedEnumDescriptorData::new::<ReasonCode>(\"ReasonCode\")\n    }\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n\\x0fcore/Tron.proto\\x12\\x08protocol\\x1a\\x19google/protobuf/any.proto\\\n    \\x1a\\x13core/Discover.proto\\x1a\\x1acore/contract/common.proto\\\"9\\n\\tAcco\\\n    untId\\x12\\x12\\n\\x04name\\x18\\x01\\x20\\x01(\\x0cR\\x04name\\x12\\x18\\n\\x07addre\\\n    ss\\x18\\x02\\x20\\x01(\\x0cR\\x07address\\\"H\\n\\x04Vote\\x12!\\n\\x0cvote_address\\\n    \\x18\\x01\\x20\\x01(\\x0cR\\x0bvoteAddress\\x12\\x1d\\n\\nvote_count\\x18\\x02\\x20\\\n    \\x01(\\x03R\\tvoteCount\\\"\\xb4\\x03\\n\\x08Proposal\\x12\\x1f\\n\\x0bproposal_id\\\n    \\x18\\x01\\x20\\x01(\\x03R\\nproposalId\\x12)\\n\\x10proposer_address\\x18\\x02\\\n    \\x20\\x01(\\x0cR\\x0fproposerAddress\\x12B\\n\\nparameters\\x18\\x03\\x20\\x03(\\\n    \\x0b2\\\".protocol.Proposal.ParametersEntryR\\nparameters\\x12'\\n\\x0fexpirat\\\n    ion_time\\x18\\x04\\x20\\x01(\\x03R\\x0eexpirationTime\\x12\\x1f\\n\\x0bcreate_tim\\\n    e\\x18\\x05\\x20\\x01(\\x03R\\ncreateTime\\x12\\x1c\\n\\tapprovals\\x18\\x06\\x20\\x03\\\n    (\\x0cR\\tapprovals\\x12.\\n\\x05state\\x18\\x07\\x20\\x01(\\x0e2\\x18.protocol.Pro\\\n    posal.StateR\\x05state\\x1a=\\n\\x0fParametersEntry\\x12\\x10\\n\\x03key\\x18\\x01\\\n    \\x20\\x01(\\x03R\\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\x20\\x01(\\x03R\\x05value:\\\n    \\x028\\x01\\\"A\\n\\x05State\\x12\\x0b\\n\\x07PENDING\\x10\\0\\x12\\x0f\\n\\x0bDISAPPRO\\\n    VED\\x10\\x01\\x12\\x0c\\n\\x08APPROVED\\x10\\x02\\x12\\x0c\\n\\x08CANCELED\\x10\\x03\\\n    \\\"\\xa5\\x02\\n\\x08Exchange\\x12\\x1f\\n\\x0bexchange_id\\x18\\x01\\x20\\x01(\\x03R\\\n    \\nexchangeId\\x12'\\n\\x0fcreator_address\\x18\\x02\\x20\\x01(\\x0cR\\x0ecreatorA\\\n    ddress\\x12\\x1f\\n\\x0bcreate_time\\x18\\x03\\x20\\x01(\\x03R\\ncreateTime\\x12$\\n\\\n    \\x0efirst_token_id\\x18\\x06\\x20\\x01(\\x0cR\\x0cfirstTokenId\\x12.\\n\\x13first\\\n    _token_balance\\x18\\x07\\x20\\x01(\\x03R\\x11firstTokenBalance\\x12&\\n\\x0fseco\\\n    nd_token_id\\x18\\x08\\x20\\x01(\\x0cR\\rsecondTokenId\\x120\\n\\x14second_token_\\\n    balance\\x18\\t\\x20\\x01(\\x03R\\x12secondTokenBalance\\\"\\x98\\x04\\n\\x0bMarketO\\\n    rder\\x12\\x19\\n\\x08order_id\\x18\\x01\\x20\\x01(\\x0cR\\x07orderId\\x12#\\n\\rowne\\\n    r_address\\x18\\x02\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x1f\\n\\x0bcreate_time\\\n    \\x18\\x03\\x20\\x01(\\x03R\\ncreateTime\\x12\\\"\\n\\rsell_token_id\\x18\\x04\\x20\\\n    \\x01(\\x0cR\\x0bsellTokenId\\x12.\\n\\x13sell_token_quantity\\x18\\x05\\x20\\x01(\\\n    \\x03R\\x11sellTokenQuantity\\x12\\x20\\n\\x0cbuy_token_id\\x18\\x06\\x20\\x01(\\\n    \\x0cR\\nbuyTokenId\\x12,\\n\\x12buy_token_quantity\\x18\\x07\\x20\\x01(\\x03R\\x10\\\n    buyTokenQuantity\\x12;\\n\\x1asell_token_quantity_remain\\x18\\t\\x20\\x01(\\x03\\\n    R\\x17sellTokenQuantityRemain\\x12;\\n\\x1asell_token_quantity_return\\x18\\n\\\n    \\x20\\x01(\\x03R\\x17sellTokenQuantityReturn\\x121\\n\\x05state\\x18\\x0b\\x20\\\n    \\x01(\\x0e2\\x1b.protocol.MarketOrder.StateR\\x05state\\x12\\x12\\n\\x04prev\\\n    \\x18\\x0c\\x20\\x01(\\x0cR\\x04prev\\x12\\x12\\n\\x04next\\x18\\r\\x20\\x01(\\x0cR\\x04\\\n    next\\\"/\\n\\x05State\\x12\\n\\n\\x06ACTIVE\\x10\\0\\x12\\x0c\\n\\x08INACTIVE\\x10\\x01\\\n    \\x12\\x0c\\n\\x08CANCELED\\x10\\x02\\\"@\\n\\x0fMarketOrderList\\x12-\\n\\x06orders\\\n    \\x18\\x01\\x20\\x03(\\x0b2\\x15.protocol.MarketOrderR\\x06orders\\\"N\\n\\x13Marke\\\n    tOrderPairList\\x127\\n\\torderPair\\x18\\x01\\x20\\x03(\\x0b2\\x19.protocol.Mark\\\n    etOrderPairR\\torderPair\\\"W\\n\\x0fMarketOrderPair\\x12\\\"\\n\\rsell_token_id\\\n    \\x18\\x01\\x20\\x01(\\x0cR\\x0bsellTokenId\\x12\\x20\\n\\x0cbuy_token_id\\x18\\x02\\\n    \\x20\\x01(\\x0cR\\nbuyTokenId\\\"\\x88\\x01\\n\\x12MarketAccountOrder\\x12#\\n\\rown\\\n    er_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x16\\n\\x06orders\\x18\\\n    \\x02\\x20\\x03(\\x0cR\\x06orders\\x12\\x14\\n\\x05count\\x18\\x03\\x20\\x01(\\x03R\\\n    \\x05count\\x12\\x1f\\n\\x0btotal_count\\x18\\x04\\x20\\x01(\\x03R\\ntotalCount\\\"k\\\n    \\n\\x0bMarketPrice\\x12.\\n\\x13sell_token_quantity\\x18\\x01\\x20\\x01(\\x03R\\\n    \\x11sellTokenQuantity\\x12,\\n\\x12buy_token_quantity\\x18\\x02\\x20\\x01(\\x03R\\\n    \\x10buyTokenQuantity\\\"\\x86\\x01\\n\\x0fMarketPriceList\\x12\\\"\\n\\rsell_token_\\\n    id\\x18\\x01\\x20\\x01(\\x0cR\\x0bsellTokenId\\x12\\x20\\n\\x0cbuy_token_id\\x18\\\n    \\x02\\x20\\x01(\\x0cR\\nbuyTokenId\\x12-\\n\\x06prices\\x18\\x03\\x20\\x03(\\x0b2\\\n    \\x15.protocol.MarketPriceR\\x06prices\\\";\\n\\x11MarketOrderIdList\\x12\\x12\\n\\\n    \\x04head\\x18\\x01\\x20\\x01(\\x0cR\\x04head\\x12\\x12\\n\\x04tail\\x18\\x02\\x20\\x01\\\n    (\\x0cR\\x04tail\\\"\\x9d\\x01\\n\\x0fChainParameters\\x12P\\n\\x0echainParameter\\\n    \\x18\\x01\\x20\\x03(\\x0b2(.protocol.ChainParameters.ChainParameterR\\x0echai\\\n    nParameter\\x1a8\\n\\x0eChainParameter\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\\n    \\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\x20\\x01(\\x03R\\x05value\\\"\\xca\\x1e\\n\\\n    \\x07Account\\x12!\\n\\x0caccount_name\\x18\\x01\\x20\\x01(\\x0cR\\x0baccountName\\\n    \\x12)\\n\\x04type\\x18\\x02\\x20\\x01(\\x0e2\\x15.protocol.AccountTypeR\\x04type\\\n    \\x12\\x18\\n\\x07address\\x18\\x03\\x20\\x01(\\x0cR\\x07address\\x12\\x18\\n\\x07bala\\\n    nce\\x18\\x04\\x20\\x01(\\x03R\\x07balance\\x12$\\n\\x05votes\\x18\\x05\\x20\\x03(\\\n    \\x0b2\\x0e.protocol.VoteR\\x05votes\\x122\\n\\x05asset\\x18\\x06\\x20\\x03(\\x0b2\\\n    \\x1c.protocol.Account.AssetEntryR\\x05asset\\x128\\n\\x07assetV2\\x188\\x20\\\n    \\x03(\\x0b2\\x1e.protocol.Account.AssetV2EntryR\\x07assetV2\\x120\\n\\x06froze\\\n    n\\x18\\x07\\x20\\x03(\\x0b2\\x18.protocol.Account.FrozenR\\x06frozen\\x12\\x1b\\n\\\n    \\tnet_usage\\x18\\x08\\x20\\x01(\\x03R\\x08netUsage\\x12c\\n/acquired_delegated_\\\n    frozen_balance_for_bandwidth\\x18)\\x20\\x01(\\x03R*acquiredDelegatedFrozenB\\\n    alanceForBandwidth\\x12R\\n&delegated_frozen_balance_for_bandwidth\\x18*\\\n    \\x20\\x01(\\x03R\\\"delegatedFrozenBalanceForBandwidth\\x12$\\n\\x0eold_tron_po\\\n    wer\\x18.\\x20\\x01(\\x03R\\x0coldTronPower\\x127\\n\\ntron_power\\x18/\\x20\\x01(\\\n    \\x0b2\\x18.protocol.Account.FrozenR\\ttronPower\\x12'\\n\\x0fasset_optimized\\\n    \\x18<\\x20\\x01(\\x08R\\x0eassetOptimized\\x12\\x1f\\n\\x0bcreate_time\\x18\\t\\x20\\\n    \\x01(\\x03R\\ncreateTime\\x120\\n\\x14latest_opration_time\\x18\\n\\x20\\x01(\\x03\\\n    R\\x12latestOprationTime\\x12\\x1c\\n\\tallowance\\x18\\x0b\\x20\\x01(\\x03R\\tallo\\\n    wance\\x120\\n\\x14latest_withdraw_time\\x18\\x0c\\x20\\x01(\\x03R\\x12latestWith\\\n    drawTime\\x12\\x12\\n\\x04code\\x18\\r\\x20\\x01(\\x0cR\\x04code\\x12\\x1d\\n\\nis_wit\\\n    ness\\x18\\x0e\\x20\\x01(\\x08R\\tisWitness\\x12!\\n\\x0cis_committee\\x18\\x0f\\x20\\\n    \\x01(\\x08R\\x0bisCommittee\\x12=\\n\\rfrozen_supply\\x18\\x10\\x20\\x03(\\x0b2\\\n    \\x18.protocol.Account.FrozenR\\x0cfrozenSupply\\x12*\\n\\x11asset_issued_nam\\\n    e\\x18\\x11\\x20\\x01(\\x0cR\\x0fassetIssuedName\\x12&\\n\\x0fasset_issued_ID\\x18\\\n    9\\x20\\x01(\\x0cR\\rassetIssuedID\\x12n\\n\\x1blatest_asset_operation_time\\x18\\\n    \\x12\\x20\\x03(\\x0b2/.protocol.Account.LatestAssetOperationTimeEntryR\\x18l\\\n    atestAssetOperationTime\\x12t\\n\\x1dlatest_asset_operation_timeV2\\x18:\\x20\\\n    \\x03(\\x0b21.protocol.Account.LatestAssetOperationTimeV2EntryR\\x1alatestA\\\n    ssetOperationTimeV2\\x12$\\n\\x0efree_net_usage\\x18\\x13\\x20\\x01(\\x03R\\x0cfr\\\n    eeNetUsage\\x12Y\\n\\x14free_asset_net_usage\\x18\\x14\\x20\\x03(\\x0b2(.protoco\\\n    l.Account.FreeAssetNetUsageEntryR\\x11freeAssetNetUsage\\x12_\\n\\x16free_as\\\n    set_net_usageV2\\x18;\\x20\\x03(\\x0b2*.protocol.Account.FreeAssetNetUsageV2\\\n    EntryR\\x13freeAssetNetUsageV2\\x12.\\n\\x13latest_consume_time\\x18\\x15\\x20\\\n    \\x01(\\x03R\\x11latestConsumeTime\\x127\\n\\x18latest_consume_free_time\\x18\\\n    \\x16\\x20\\x01(\\x03R\\x15latestConsumeFreeTime\\x12\\x1d\\n\\naccount_id\\x18\\\n    \\x17\\x20\\x01(\\x0cR\\taccountId\\x12&\\n\\x0fnet_window_size\\x18\\x18\\x20\\x01(\\\n    \\x03R\\rnetWindowSize\\x120\\n\\x14net_window_optimized\\x18\\x19\\x20\\x01(\\x08\\\n    R\\x12netWindowOptimized\\x12L\\n\\x10account_resource\\x18\\x1a\\x20\\x01(\\x0b2\\\n    !.protocol.Account.AccountResourceR\\x0faccountResource\\x12\\x1a\\n\\x08code\\\n    Hash\\x18\\x1e\\x20\\x01(\\x0cR\\x08codeHash\\x12?\\n\\x10owner_permission\\x18\\\n    \\x1f\\x20\\x01(\\x0b2\\x14.protocol.PermissionR\\x0fownerPermission\\x12C\\n\\\n    \\x12witness_permission\\x18\\x20\\x20\\x01(\\x0b2\\x14.protocol.PermissionR\\\n    \\x11witnessPermission\\x12A\\n\\x11active_permission\\x18!\\x20\\x03(\\x0b2\\x14\\\n    .protocol.PermissionR\\x10activePermission\\x126\\n\\x08frozenV2\\x18\\\"\\x20\\\n    \\x03(\\x0b2\\x1a.protocol.Account.FreezeV2R\\x08frozenV2\\x12<\\n\\nunfrozenV2\\\n    \\x18#\\x20\\x03(\\x0b2\\x1c.protocol.Account.UnFreezeV2R\\nunfrozenV2\\x12V\\n(\\\n    delegated_frozenV2_balance_for_bandwidth\\x18$\\x20\\x01(\\x03R$delegatedFro\\\n    zenV2BalanceForBandwidth\\x12g\\n1acquired_delegated_frozenV2_balance_for_\\\n    bandwidth\\x18%\\x20\\x01(\\x03R,acquiredDelegatedFrozenV2BalanceForBandwidt\\\n    h\\x1aP\\n\\x06Frozen\\x12%\\n\\x0efrozen_balance\\x18\\x01\\x20\\x01(\\x03R\\rfroze\\\n    nBalance\\x12\\x1f\\n\\x0bexpire_time\\x18\\x02\\x20\\x01(\\x03R\\nexpireTime\\x1a8\\\n    \\n\\nAssetEntry\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05\\\n    value\\x18\\x02\\x20\\x01(\\x03R\\x05value:\\x028\\x01\\x1a:\\n\\x0cAssetV2Entry\\\n    \\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\\n    \\x20\\x01(\\x03R\\x05value:\\x028\\x01\\x1aK\\n\\x1dLatestAssetOperationTimeEntr\\\n    y\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\\n    \\x20\\x01(\\x03R\\x05value:\\x028\\x01\\x1aM\\n\\x1fLatestAssetOperationTimeV2En\\\n    try\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\\n    \\x02\\x20\\x01(\\x03R\\x05value:\\x028\\x01\\x1aD\\n\\x16FreeAssetNetUsageEntry\\\n    \\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\\n    \\x20\\x01(\\x03R\\x05value:\\x028\\x01\\x1aF\\n\\x18FreeAssetNetUsageV2Entry\\x12\\\n    \\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\x20\\\n    \\x01(\\x03R\\x05value:\\x028\\x01\\x1a\\xa0\\x06\\n\\x0fAccountResource\\x12!\\n\\\n    \\x0cenergy_usage\\x18\\x01\\x20\\x01(\\x03R\\x0benergyUsage\\x12S\\n\\x19frozen_b\\\n    alance_for_energy\\x18\\x02\\x20\\x01(\\x0b2\\x18.protocol.Account.FrozenR\\x16\\\n    frozenBalanceForEnergy\\x12B\\n\\x1elatest_consume_time_for_energy\\x18\\x03\\\n    \\x20\\x01(\\x03R\\x1alatestConsumeTimeForEnergy\\x12]\\n,acquired_delegated_f\\\n    rozen_balance_for_energy\\x18\\x04\\x20\\x01(\\x03R'acquiredDelegatedFrozenBa\\\n    lanceForEnergy\\x12L\\n#delegated_frozen_balance_for_energy\\x18\\x05\\x20\\\n    \\x01(\\x03R\\x1fdelegatedFrozenBalanceForEnergy\\x12#\\n\\rstorage_limit\\x18\\\n    \\x06\\x20\\x01(\\x03R\\x0cstorageLimit\\x12#\\n\\rstorage_usage\\x18\\x07\\x20\\x01\\\n    (\\x03R\\x0cstorageUsage\\x12?\\n\\x1clatest_exchange_storage_time\\x18\\x08\\\n    \\x20\\x01(\\x03R\\x19latestExchangeStorageTime\\x12,\\n\\x12energy_window_size\\\n    \\x18\\t\\x20\\x01(\\x03R\\x10energyWindowSize\\x12P\\n%delegated_frozenV2_balan\\\n    ce_for_energy\\x18\\n\\x20\\x01(\\x03R!delegatedFrozenV2BalanceForEnergy\\x12a\\\n    \\n.acquired_delegated_frozenV2_balance_for_energy\\x18\\x0b\\x20\\x01(\\x03R)\\\n    acquiredDelegatedFrozenV2BalanceForEnergy\\x126\\n\\x17energy_window_optimi\\\n    zed\\x18\\x0c\\x20\\x01(\\x08R\\x15energyWindowOptimized\\x1aN\\n\\x08FreezeV2\\\n    \\x12*\\n\\x04type\\x18\\x01\\x20\\x01(\\x0e2\\x16.protocol.ResourceCodeR\\x04type\\\n    \\x12\\x16\\n\\x06amount\\x18\\x02\\x20\\x01(\\x03R\\x06amount\\x1a\\x93\\x01\\n\\nUnFr\\\n    eezeV2\\x12*\\n\\x04type\\x18\\x01\\x20\\x01(\\x0e2\\x16.protocol.ResourceCodeR\\\n    \\x04type\\x12'\\n\\x0funfreeze_amount\\x18\\x03\\x20\\x01(\\x03R\\x0eunfreezeAmou\\\n    nt\\x120\\n\\x14unfreeze_expire_time\\x18\\x04\\x20\\x01(\\x03R\\x12unfreezeExpir\\\n    eTime\\\"7\\n\\x03Key\\x12\\x18\\n\\x07address\\x18\\x01\\x20\\x01(\\x0cR\\x07address\\\n    \\x12\\x16\\n\\x06weight\\x18\\x02\\x20\\x01(\\x03R\\x06weight\\\"\\xa3\\x02\\n\\x11Dele\\\n    gatedResource\\x12\\x12\\n\\x04from\\x18\\x01\\x20\\x01(\\x0cR\\x04from\\x12\\x0e\\n\\\n    \\x02to\\x18\\x02\\x20\\x01(\\x0cR\\x02to\\x12?\\n\\x1cfrozen_balance_for_bandwidt\\\n    h\\x18\\x03\\x20\\x01(\\x03R\\x19frozenBalanceForBandwidth\\x129\\n\\x19frozen_ba\\\n    lance_for_energy\\x18\\x04\\x20\\x01(\\x03R\\x16frozenBalanceForEnergy\\x129\\n\\\n    \\x19expire_time_for_bandwidth\\x18\\x05\\x20\\x01(\\x03R\\x16expireTimeForBand\\\n    width\\x123\\n\\x16expire_time_for_energy\\x18\\x06\\x20\\x01(\\x03R\\x13expireTi\\\n    meForEnergy\\\"c\\n\\tauthority\\x12-\\n\\x07account\\x18\\x01\\x20\\x01(\\x0b2\\x13.\\\n    protocol.AccountIdR\\x07account\\x12'\\n\\x0fpermission_name\\x18\\x02\\x20\\x01\\\n    (\\x0cR\\x0epermissionName\\\"\\xb2\\x02\\n\\nPermission\\x127\\n\\x04type\\x18\\x01\\\n    \\x20\\x01(\\x0e2#.protocol.Permission.PermissionTypeR\\x04type\\x12\\x0e\\n\\\n    \\x02id\\x18\\x02\\x20\\x01(\\x05R\\x02id\\x12'\\n\\x0fpermission_name\\x18\\x03\\x20\\\n    \\x01(\\tR\\x0epermissionName\\x12\\x1c\\n\\tthreshold\\x18\\x04\\x20\\x01(\\x03R\\tt\\\n    hreshold\\x12\\x1b\\n\\tparent_id\\x18\\x05\\x20\\x01(\\x05R\\x08parentId\\x12\\x1e\\\n    \\n\\noperations\\x18\\x06\\x20\\x01(\\x0cR\\noperations\\x12!\\n\\x04keys\\x18\\x07\\\n    \\x20\\x03(\\x0b2\\r.protocol.KeyR\\x04keys\\\"4\\n\\x0ePermissionType\\x12\\t\\n\\\n    \\x05Owner\\x10\\0\\x12\\x0b\\n\\x07Witness\\x10\\x01\\x12\\n\\n\\x06Active\\x10\\x02\\\"\\\n    \\x99\\x02\\n\\x07Witness\\x12\\x18\\n\\x07address\\x18\\x01\\x20\\x01(\\x0cR\\x07addr\\\n    ess\\x12\\x1c\\n\\tvoteCount\\x18\\x02\\x20\\x01(\\x03R\\tvoteCount\\x12\\x16\\n\\x06p\\\n    ubKey\\x18\\x03\\x20\\x01(\\x0cR\\x06pubKey\\x12\\x10\\n\\x03url\\x18\\x04\\x20\\x01(\\\n    \\tR\\x03url\\x12$\\n\\rtotalProduced\\x18\\x05\\x20\\x01(\\x03R\\rtotalProduced\\\n    \\x12\\x20\\n\\x0btotalMissed\\x18\\x06\\x20\\x01(\\x03R\\x0btotalMissed\\x12&\\n\\\n    \\x0elatestBlockNum\\x18\\x07\\x20\\x01(\\x03R\\x0elatestBlockNum\\x12$\\n\\rlates\\\n    tSlotNum\\x18\\x08\\x20\\x01(\\x03R\\rlatestSlotNum\\x12\\x16\\n\\x06isJobs\\x18\\t\\\n    \\x20\\x01(\\x08R\\x06isJobs\\\"{\\n\\x05Votes\\x12\\x18\\n\\x07address\\x18\\x01\\x20\\\n    \\x01(\\x0cR\\x07address\\x12+\\n\\told_votes\\x18\\x02\\x20\\x03(\\x0b2\\x0e.protoc\\\n    ol.VoteR\\x08oldVotes\\x12+\\n\\tnew_votes\\x18\\x03\\x20\\x03(\\x0b2\\x0e.protoco\\\n    l.VoteR\\x08newVotes\\\"@\\n\\x08TXOutput\\x12\\x14\\n\\x05value\\x18\\x01\\x20\\x01(\\\n    \\x03R\\x05value\\x12\\x1e\\n\\npubKeyHash\\x18\\x02\\x20\\x01(\\x0cR\\npubKeyHash\\\"\\\n    \\xa0\\x01\\n\\x07TXInput\\x120\\n\\x08raw_data\\x18\\x01\\x20\\x01(\\x0b2\\x15.proto\\\n    col.TXInput.rawR\\x07rawData\\x12\\x1c\\n\\tsignature\\x18\\x04\\x20\\x01(\\x0cR\\t\\\n    signature\\x1aE\\n\\x03raw\\x12\\x12\\n\\x04txID\\x18\\x01\\x20\\x01(\\x0cR\\x04txID\\\n    \\x12\\x12\\n\\x04vout\\x18\\x02\\x20\\x01(\\x03R\\x04vout\\x12\\x16\\n\\x06pubKey\\x18\\\n    \\x03\\x20\\x01(\\x0cR\\x06pubKey\\\"9\\n\\tTXOutputs\\x12,\\n\\x07outputs\\x18\\x01\\\n    \\x20\\x03(\\x0b2\\x12.protocol.TXOutputR\\x07outputs\\\"\\xde\\x02\\n\\x0fResource\\\n    Receipt\\x12!\\n\\x0cenergy_usage\\x18\\x01\\x20\\x01(\\x03R\\x0benergyUsage\\x12\\\n    \\x1d\\n\\nenergy_fee\\x18\\x02\\x20\\x01(\\x03R\\tenergyFee\\x12.\\n\\x13origin_ene\\\n    rgy_usage\\x18\\x03\\x20\\x01(\\x03R\\x11originEnergyUsage\\x12,\\n\\x12energy_us\\\n    age_total\\x18\\x04\\x20\\x01(\\x03R\\x10energyUsageTotal\\x12\\x1b\\n\\tnet_usage\\\n    \\x18\\x05\\x20\\x01(\\x03R\\x08netUsage\\x12\\x17\\n\\x07net_fee\\x18\\x06\\x20\\x01(\\\n    \\x03R\\x06netFee\\x12C\\n\\x06result\\x18\\x07\\x20\\x01(\\x0e2+.protocol.Transac\\\n    tion.Result.contractResultR\\x06result\\x120\\n\\x14energy_penalty_total\\x18\\\n    \\x08\\x20\\x01(\\x03R\\x12energyPenaltyTotal\\\"\\xb1\\x01\\n\\x11MarketOrderDetai\\\n    l\\x12\\\"\\n\\x0cmakerOrderId\\x18\\x01\\x20\\x01(\\x0cR\\x0cmakerOrderId\\x12\\\"\\n\\\n    \\x0ctakerOrderId\\x18\\x02\\x20\\x01(\\x0cR\\x0ctakerOrderId\\x12*\\n\\x10fillSel\\\n    lQuantity\\x18\\x03\\x20\\x01(\\x03R\\x10fillSellQuantity\\x12(\\n\\x0ffillBuyQua\\\n    ntity\\x18\\x04\\x20\\x01(\\x03R\\x0ffillBuyQuantity\\\"\\xdd\\x18\\n\\x0bTransactio\\\n    n\\x124\\n\\x08raw_data\\x18\\x01\\x20\\x01(\\x0b2\\x19.protocol.Transaction.rawR\\\n    \\x07rawData\\x12\\x1c\\n\\tsignature\\x18\\x02\\x20\\x03(\\x0cR\\tsignature\\x12.\\n\\\n    \\x03ret\\x18\\x05\\x20\\x03(\\x0b2\\x1c.protocol.Transaction.ResultR\\x03ret\\\n    \\x1a\\xef\\n\\n\\x08Contract\\x12?\\n\\x04type\\x18\\x01\\x20\\x01(\\x0e2+.protocol.\\\n    Transaction.Contract.ContractTypeR\\x04type\\x122\\n\\tparameter\\x18\\x02\\x20\\\n    \\x01(\\x0b2\\x14.google.protobuf.AnyR\\tparameter\\x12\\x1a\\n\\x08provider\\x18\\\n    \\x03\\x20\\x01(\\x0cR\\x08provider\\x12\\\"\\n\\x0cContractName\\x18\\x04\\x20\\x01(\\\n    \\x0cR\\x0cContractName\\x12#\\n\\rPermission_id\\x18\\x05\\x20\\x01(\\x05R\\x0cPer\\\n    missionId\\\"\\x88\\t\\n\\x0cContractType\\x12\\x19\\n\\x15AccountCreateContract\\\n    \\x10\\0\\x12\\x14\\n\\x10TransferContract\\x10\\x01\\x12\\x19\\n\\x15TransferAssetC\\\n    ontract\\x10\\x02\\x12\\x15\\n\\x11VoteAssetContract\\x10\\x03\\x12\\x17\\n\\x13Vote\\\n    WitnessContract\\x10\\x04\\x12\\x19\\n\\x15WitnessCreateContract\\x10\\x05\\x12\\\n    \\x16\\n\\x12AssetIssueContract\\x10\\x06\\x12\\x19\\n\\x15WitnessUpdateContract\\\n    \\x10\\x08\\x12!\\n\\x1dParticipateAssetIssueContract\\x10\\t\\x12\\x19\\n\\x15Acco\\\n    untUpdateContract\\x10\\n\\x12\\x19\\n\\x15FreezeBalanceContract\\x10\\x0b\\x12\\\n    \\x1b\\n\\x17UnfreezeBalanceContract\\x10\\x0c\\x12\\x1b\\n\\x17WithdrawBalanceCo\\\n    ntract\\x10\\r\\x12\\x19\\n\\x15UnfreezeAssetContract\\x10\\x0e\\x12\\x17\\n\\x13Upd\\\n    ateAssetContract\\x10\\x0f\\x12\\x1a\\n\\x16ProposalCreateContract\\x10\\x10\\x12\\\n    \\x1b\\n\\x17ProposalApproveContract\\x10\\x11\\x12\\x1a\\n\\x16ProposalDeleteCon\\\n    tract\\x10\\x12\\x12\\x18\\n\\x14SetAccountIdContract\\x10\\x13\\x12\\x12\\n\\x0eCus\\\n    tomContract\\x10\\x14\\x12\\x17\\n\\x13CreateSmartContract\\x10\\x1e\\x12\\x18\\n\\\n    \\x14TriggerSmartContract\\x10\\x1f\\x12\\x0f\\n\\x0bGetContract\\x10\\x20\\x12\\\n    \\x19\\n\\x15UpdateSettingContract\\x10!\\x12\\x1a\\n\\x16ExchangeCreateContract\\\n    \\x10)\\x12\\x1a\\n\\x16ExchangeInjectContract\\x10*\\x12\\x1c\\n\\x18ExchangeWith\\\n    drawContract\\x10+\\x12\\x1f\\n\\x1bExchangeTransactionContract\\x10,\\x12\\x1d\\\n    \\n\\x19UpdateEnergyLimitContract\\x10-\\x12#\\n\\x1fAccountPermissionUpdateCo\\\n    ntract\\x10.\\x12\\x14\\n\\x10ClearABIContract\\x100\\x12\\x1b\\n\\x17UpdateBroker\\\n    ageContract\\x101\\x12\\x1c\\n\\x18ShieldedTransferContract\\x103\\x12\\x1b\\n\\\n    \\x17MarketSellAssetContract\\x104\\x12\\x1d\\n\\x19MarketCancelOrderContract\\\n    \\x105\\x12\\x1b\\n\\x17FreezeBalanceV2Contract\\x106\\x12\\x1d\\n\\x19UnfreezeBal\\\n    anceV2Contract\\x107\\x12\\\"\\n\\x1eWithdrawExpireUnfreezeContract\\x108\\x12\\\n    \\x1c\\n\\x18DelegateResourceContract\\x109\\x12\\x1e\\n\\x1aUnDelegateResourceC\\\n    ontract\\x10:\\x12\\x1f\\n\\x1bCancelAllUnfreezeV2Contract\\x10;\\x1a\\xed\\t\\n\\\n    \\x06Result\\x12\\x10\\n\\x03fee\\x18\\x01\\x20\\x01(\\x03R\\x03fee\\x123\\n\\x03ret\\\n    \\x18\\x02\\x20\\x01(\\x0e2!.protocol.Transaction.Result.codeR\\x03ret\\x12M\\n\\\n    \\x0bcontractRet\\x18\\x03\\x20\\x01(\\x0e2+.protocol.Transaction.Result.contr\\\n    actResultR\\x0bcontractRet\\x12\\\"\\n\\x0cassetIssueID\\x18\\x0e\\x20\\x01(\\tR\\\n    \\x0cassetIssueID\\x12'\\n\\x0fwithdraw_amount\\x18\\x0f\\x20\\x01(\\x03R\\x0ewith\\\n    drawAmount\\x12'\\n\\x0funfreeze_amount\\x18\\x10\\x20\\x01(\\x03R\\x0eunfreezeAm\\\n    ount\\x128\\n\\x18exchange_received_amount\\x18\\x12\\x20\\x01(\\x03R\\x16exchang\\\n    eReceivedAmount\\x12C\\n\\x1eexchange_inject_another_amount\\x18\\x13\\x20\\x01\\\n    (\\x03R\\x1bexchangeInjectAnotherAmount\\x12G\\n\\x20exchange_withdraw_anothe\\\n    r_amount\\x18\\x14\\x20\\x01(\\x03R\\x1dexchangeWithdrawAnotherAmount\\x12\\x1f\\\n    \\n\\x0bexchange_id\\x18\\x15\\x20\\x01(\\x03R\\nexchangeId\\x128\\n\\x18shielded_t\\\n    ransaction_fee\\x18\\x16\\x20\\x01(\\x03R\\x16shieldedTransactionFee\\x12\\x18\\n\\\n    \\x07orderId\\x18\\x19\\x20\\x01(\\x0cR\\x07orderId\\x12?\\n\\x0corderDetails\\x18\\\n    \\x1a\\x20\\x03(\\x0b2\\x1b.protocol.MarketOrderDetailR\\x0corderDetails\\x124\\\n    \\n\\x16withdraw_expire_amount\\x18\\x1b\\x20\\x01(\\x03R\\x14withdrawExpireAmou\\\n    nt\\x12r\\n\\x18cancel_unfreezeV2_amount\\x18\\x1c\\x20\\x03(\\x0b28.protocol.Tr\\\n    ansaction.Result.CancelUnfreezeV2AmountEntryR\\x16cancelUnfreezeV2Amount\\\n    \\x1aI\\n\\x1bCancelUnfreezeV2AmountEntry\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\\n    \\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\x02\\x20\\x01(\\x03R\\x05value:\\x028\\x01\\\"\\\n    \\x1e\\n\\x04code\\x12\\n\\n\\x06SUCESS\\x10\\0\\x12\\n\\n\\x06FAILED\\x10\\x01\\\"\\xc3\\\n    \\x02\\n\\x0econtractResult\\x12\\x0b\\n\\x07DEFAULT\\x10\\0\\x12\\x0b\\n\\x07SUCCESS\\\n    \\x10\\x01\\x12\\n\\n\\x06REVERT\\x10\\x02\\x12\\x18\\n\\x14BAD_JUMP_DESTINATION\\x10\\\n    \\x03\\x12\\x11\\n\\rOUT_OF_MEMORY\\x10\\x04\\x12\\x18\\n\\x14PRECOMPILED_CONTRACT\\\n    \\x10\\x05\\x12\\x13\\n\\x0fSTACK_TOO_SMALL\\x10\\x06\\x12\\x13\\n\\x0fSTACK_TOO_LAR\\\n    GE\\x10\\x07\\x12\\x15\\n\\x11ILLEGAL_OPERATION\\x10\\x08\\x12\\x12\\n\\x0eSTACK_OVE\\\n    RFLOW\\x10\\t\\x12\\x11\\n\\rOUT_OF_ENERGY\\x10\\n\\x12\\x0f\\n\\x0bOUT_OF_TIME\\x10\\\n    \\x0b\\x12\\x17\\n\\x13JVM_STACK_OVER_FLOW\\x10\\x0c\\x12\\x0b\\n\\x07UNKNOWN\\x10\\r\\\n    \\x12\\x13\\n\\x0fTRANSFER_FAILED\\x10\\x0e\\x12\\x10\\n\\x0cINVALID_CODE\\x10\\x0f\\\n    \\x1a\\xe7\\x02\\n\\x03raw\\x12&\\n\\x0fref_block_bytes\\x18\\x01\\x20\\x01(\\x0cR\\rr\\\n    efBlockBytes\\x12\\\"\\n\\rref_block_num\\x18\\x03\\x20\\x01(\\x03R\\x0brefBlockNum\\\n    \\x12$\\n\\x0eref_block_hash\\x18\\x04\\x20\\x01(\\x0cR\\x0crefBlockHash\\x12\\x1e\\\n    \\n\\nexpiration\\x18\\x08\\x20\\x01(\\x03R\\nexpiration\\x12)\\n\\x05auths\\x18\\t\\\n    \\x20\\x03(\\x0b2\\x13.protocol.authorityR\\x05auths\\x12\\x12\\n\\x04data\\x18\\n\\\n    \\x20\\x01(\\x0cR\\x04data\\x12:\\n\\x08contract\\x18\\x0b\\x20\\x03(\\x0b2\\x1e.prot\\\n    ocol.Transaction.ContractR\\x08contract\\x12\\x18\\n\\x07scripts\\x18\\x0c\\x20\\\n    \\x01(\\x0cR\\x07scripts\\x12\\x1c\\n\\ttimestamp\\x18\\x0e\\x20\\x01(\\x03R\\ttimest\\\n    amp\\x12\\x1b\\n\\tfee_limit\\x18\\x12\\x20\\x01(\\x03R\\x08feeLimit\\\"\\xd5\\n\\n\\x0f\\\n    TransactionInfo\\x12\\x0e\\n\\x02id\\x18\\x01\\x20\\x01(\\x0cR\\x02id\\x12\\x10\\n\\\n    \\x03fee\\x18\\x02\\x20\\x01(\\x03R\\x03fee\\x12\\x20\\n\\x0bblockNumber\\x18\\x03\\\n    \\x20\\x01(\\x03R\\x0bblockNumber\\x12&\\n\\x0eblockTimeStamp\\x18\\x04\\x20\\x01(\\\n    \\x03R\\x0eblockTimeStamp\\x12&\\n\\x0econtractResult\\x18\\x05\\x20\\x03(\\x0cR\\\n    \\x0econtractResult\\x12)\\n\\x10contract_address\\x18\\x06\\x20\\x01(\\x0cR\\x0fc\\\n    ontractAddress\\x123\\n\\x07receipt\\x18\\x07\\x20\\x01(\\x0b2\\x19.protocol.Reso\\\n    urceReceiptR\\x07receipt\\x12/\\n\\x03log\\x18\\x08\\x20\\x03(\\x0b2\\x1d.protocol\\\n    .TransactionInfo.LogR\\x03log\\x126\\n\\x06result\\x18\\t\\x20\\x01(\\x0e2\\x1e.pr\\\n    otocol.TransactionInfo.codeR\\x06result\\x12\\x1e\\n\\nresMessage\\x18\\n\\x20\\\n    \\x01(\\x0cR\\nresMessage\\x12\\\"\\n\\x0cassetIssueID\\x18\\x0e\\x20\\x01(\\tR\\x0cas\\\n    setIssueID\\x12'\\n\\x0fwithdraw_amount\\x18\\x0f\\x20\\x01(\\x03R\\x0ewithdrawAm\\\n    ount\\x12'\\n\\x0funfreeze_amount\\x18\\x10\\x20\\x01(\\x03R\\x0eunfreezeAmount\\\n    \\x12R\\n\\x15internal_transactions\\x18\\x11\\x20\\x03(\\x0b2\\x1d.protocol.Inte\\\n    rnalTransactionR\\x14internalTransactions\\x128\\n\\x18exchange_received_amo\\\n    unt\\x18\\x12\\x20\\x01(\\x03R\\x16exchangeReceivedAmount\\x12C\\n\\x1eexchange_i\\\n    nject_another_amount\\x18\\x13\\x20\\x01(\\x03R\\x1bexchangeInjectAnotherAmoun\\\n    t\\x12G\\n\\x20exchange_withdraw_another_amount\\x18\\x14\\x20\\x01(\\x03R\\x1dex\\\n    changeWithdrawAnotherAmount\\x12\\x1f\\n\\x0bexchange_id\\x18\\x15\\x20\\x01(\\\n    \\x03R\\nexchangeId\\x128\\n\\x18shielded_transaction_fee\\x18\\x16\\x20\\x01(\\\n    \\x03R\\x16shieldedTransactionFee\\x12\\x18\\n\\x07orderId\\x18\\x19\\x20\\x01(\\\n    \\x0cR\\x07orderId\\x12?\\n\\x0corderDetails\\x18\\x1a\\x20\\x03(\\x0b2\\x1b.protoc\\\n    ol.MarketOrderDetailR\\x0corderDetails\\x12\\x1e\\n\\npackingFee\\x18\\x1b\\x20\\\n    \\x01(\\x03R\\npackingFee\\x124\\n\\x16withdraw_expire_amount\\x18\\x1c\\x20\\x01(\\\n    \\x03R\\x14withdrawExpireAmount\\x12o\\n\\x18cancel_unfreezeV2_amount\\x18\\x1d\\\n    \\x20\\x03(\\x0b25.protocol.TransactionInfo.CancelUnfreezeV2AmountEntryR\\\n    \\x16cancelUnfreezeV2Amount\\x1aK\\n\\x03Log\\x12\\x18\\n\\x07address\\x18\\x01\\\n    \\x20\\x01(\\x0cR\\x07address\\x12\\x16\\n\\x06topics\\x18\\x02\\x20\\x03(\\x0cR\\x06t\\\n    opics\\x12\\x12\\n\\x04data\\x18\\x03\\x20\\x01(\\x0cR\\x04data\\x1aI\\n\\x1bCancelUn\\\n    freezeV2AmountEntry\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\\n    \\n\\x05value\\x18\\x02\\x20\\x01(\\x03R\\x05value:\\x028\\x01\\\"\\x1e\\n\\x04code\\x12\\\n    \\n\\n\\x06SUCESS\\x10\\0\\x12\\n\\n\\x06FAILED\\x10\\x01\\\"\\x9f\\x01\\n\\x0eTransactio\\\n    nRet\\x12\\x20\\n\\x0bblockNumber\\x18\\x01\\x20\\x01(\\x03R\\x0bblockNumber\\x12&\\\n    \\n\\x0eblockTimeStamp\\x18\\x02\\x20\\x01(\\x03R\\x0eblockTimeStamp\\x12C\\n\\x0ft\\\n    ransactioninfo\\x18\\x03\\x20\\x03(\\x0b2\\x19.protocol.TransactionInfoR\\x0ftr\\\n    ansactioninfo\\\"I\\n\\x0cTransactions\\x129\\n\\x0ctransactions\\x18\\x01\\x20\\\n    \\x03(\\x0b2\\x15.protocol.TransactionR\\x0ctransactions\\\"\\xfc\\x02\\n\\x0bBloc\\\n    kHeader\\x124\\n\\x08raw_data\\x18\\x01\\x20\\x01(\\x0b2\\x19.protocol.BlockHeade\\\n    r.rawR\\x07rawData\\x12+\\n\\x11witness_signature\\x18\\x02\\x20\\x01(\\x0cR\\x10w\\\n    itnessSignature\\x1a\\x89\\x02\\n\\x03raw\\x12\\x1c\\n\\ttimestamp\\x18\\x01\\x20\\\n    \\x01(\\x03R\\ttimestamp\\x12\\x1e\\n\\ntxTrieRoot\\x18\\x02\\x20\\x01(\\x0cR\\ntxTri\\\n    eRoot\\x12\\x1e\\n\\nparentHash\\x18\\x03\\x20\\x01(\\x0cR\\nparentHash\\x12\\x16\\n\\\n    \\x06number\\x18\\x07\\x20\\x01(\\x03R\\x06number\\x12\\x1d\\n\\nwitness_id\\x18\\x08\\\n    \\x20\\x01(\\x03R\\twitnessId\\x12'\\n\\x0fwitness_address\\x18\\t\\x20\\x01(\\x0cR\\\n    \\x0ewitnessAddress\\x12\\x18\\n\\x07version\\x18\\n\\x20\\x01(\\x05R\\x07version\\\n    \\x12*\\n\\x10accountStateRoot\\x18\\x0b\\x20\\x01(\\x0cR\\x10accountStateRoot\\\"|\\\n    \\n\\x05Block\\x129\\n\\x0ctransactions\\x18\\x01\\x20\\x03(\\x0b2\\x15.protocol.Tr\\\n    ansactionR\\x0ctransactions\\x128\\n\\x0cblock_header\\x18\\x02\\x20\\x01(\\x0b2\\\n    \\x15.protocol.BlockHeaderR\\x0bblockHeader\\\"\\x9a\\x01\\n\\x0eChainInventory\\\n    \\x122\\n\\x03ids\\x18\\x01\\x20\\x03(\\x0b2\\x20.protocol.ChainInventory.BlockId\\\n    R\\x03ids\\x12\\x1d\\n\\nremain_num\\x18\\x02\\x20\\x01(\\x03R\\tremainNum\\x1a5\\n\\\n    \\x07BlockId\\x12\\x12\\n\\x04hash\\x18\\x01\\x20\\x01(\\x0cR\\x04hash\\x12\\x16\\n\\\n    \\x06number\\x18\\x02\\x20\\x01(\\x03R\\x06number\\\"\\xd8\\x01\\n\\x0eBlockInventory\\\n    \\x122\\n\\x03ids\\x18\\x01\\x20\\x03(\\x0b2\\x20.protocol.BlockInventory.BlockId\\\n    R\\x03ids\\x121\\n\\x04type\\x18\\x02\\x20\\x01(\\x0e2\\x1d.protocol.BlockInventor\\\n    y.TypeR\\x04type\\x1a5\\n\\x07BlockId\\x12\\x12\\n\\x04hash\\x18\\x01\\x20\\x01(\\x0c\\\n    R\\x04hash\\x12\\x16\\n\\x06number\\x18\\x02\\x20\\x01(\\x03R\\x06number\\\"(\\n\\x04Ty\\\n    pe\\x12\\x08\\n\\x04SYNC\\x10\\0\\x12\\x0b\\n\\x07ADVTISE\\x10\\x01\\x12\\t\\n\\x05FETCH\\\n    \\x10\\x02\\\"y\\n\\tInventory\\x125\\n\\x04type\\x18\\x01\\x20\\x01(\\x0e2!.protocol.\\\n    Inventory.InventoryTypeR\\x04type\\x12\\x10\\n\\x03ids\\x18\\x02\\x20\\x03(\\x0cR\\\n    \\x03ids\\\"#\\n\\rInventoryType\\x12\\x07\\n\\x03TRX\\x10\\0\\x12\\t\\n\\x05BLOCK\\x10\\\n    \\x01\\\"\\x8f\\x02\\n\\x05Items\\x12,\\n\\x04type\\x18\\x01\\x20\\x01(\\x0e2\\x18.proto\\\n    col.Items.ItemTypeR\\x04type\\x12'\\n\\x06blocks\\x18\\x02\\x20\\x03(\\x0b2\\x0f.p\\\n    rotocol.BlockR\\x06blocks\\x12:\\n\\rblock_headers\\x18\\x03\\x20\\x03(\\x0b2\\x15\\\n    .protocol.BlockHeaderR\\x0cblockHeaders\\x129\\n\\x0ctransactions\\x18\\x04\\\n    \\x20\\x03(\\x0b2\\x15.protocol.TransactionR\\x0ctransactions\\\"8\\n\\x08ItemTyp\\\n    e\\x12\\x07\\n\\x03ERR\\x10\\0\\x12\\x07\\n\\x03TRX\\x10\\x01\\x12\\t\\n\\x05BLOCK\\x10\\\n    \\x02\\x12\\x0f\\n\\x0bBLOCKHEADER\\x10\\x03\\\"J\\n\\x11DynamicProperties\\x125\\n\\\n    \\x17last_solidity_block_num\\x18\\x01\\x20\\x01(\\x03R\\x14lastSolidityBlockNu\\\n    m\\\"A\\n\\x11DisconnectMessage\\x12,\\n\\x06reason\\x18\\x01\\x20\\x01(\\x0e2\\x14.p\\\n    rotocol.ReasonCodeR\\x06reason\\\"\\xef\\x03\\n\\x0cHelloMessage\\x12&\\n\\x04from\\\n    \\x18\\x01\\x20\\x01(\\x0b2\\x12.protocol.EndpointR\\x04from\\x12\\x18\\n\\x07versi\\\n    on\\x18\\x02\\x20\\x01(\\x05R\\x07version\\x12\\x1c\\n\\ttimestamp\\x18\\x03\\x20\\x01\\\n    (\\x03R\\ttimestamp\\x12F\\n\\x0egenesisBlockId\\x18\\x04\\x20\\x01(\\x0b2\\x1e.pro\\\n    tocol.HelloMessage.BlockIdR\\x0egenesisBlockId\\x12B\\n\\x0csolidBlockId\\x18\\\n    \\x05\\x20\\x01(\\x0b2\\x1e.protocol.HelloMessage.BlockIdR\\x0csolidBlockId\\\n    \\x12@\\n\\x0bheadBlockId\\x18\\x06\\x20\\x01(\\x0b2\\x1e.protocol.HelloMessage.B\\\n    lockIdR\\x0bheadBlockId\\x12\\x18\\n\\x07address\\x18\\x07\\x20\\x01(\\x0cR\\x07add\\\n    ress\\x12\\x1c\\n\\tsignature\\x18\\x08\\x20\\x01(\\x0cR\\tsignature\\x12\\x1a\\n\\x08\\\n    nodeType\\x18\\t\\x20\\x01(\\x05R\\x08nodeType\\x12&\\n\\x0elowestBlockNum\\x18\\n\\\n    \\x20\\x01(\\x03R\\x0elowestBlockNum\\x1a5\\n\\x07BlockId\\x12\\x12\\n\\x04hash\\x18\\\n    \\x01\\x20\\x01(\\x0cR\\x04hash\\x12\\x16\\n\\x06number\\x18\\x02\\x20\\x01(\\x03R\\x06\\\n    number\\\"\\xe1\\x02\\n\\x13InternalTransaction\\x12\\x12\\n\\x04hash\\x18\\x01\\x20\\\n    \\x01(\\x0cR\\x04hash\\x12%\\n\\x0ecaller_address\\x18\\x02\\x20\\x01(\\x0cR\\rcalle\\\n    rAddress\\x12-\\n\\x12transferTo_address\\x18\\x03\\x20\\x01(\\x0cR\\x11transferT\\\n    oAddress\\x12Q\\n\\rcallValueInfo\\x18\\x04\\x20\\x03(\\x0b2+.protocol.InternalT\\\n    ransaction.CallValueInfoR\\rcallValueInfo\\x12\\x12\\n\\x04note\\x18\\x05\\x20\\\n    \\x01(\\x0cR\\x04note\\x12\\x1a\\n\\x08rejected\\x18\\x06\\x20\\x01(\\x08R\\x08reject\\\n    ed\\x12\\x14\\n\\x05extra\\x18\\x07\\x20\\x01(\\tR\\x05extra\\x1aG\\n\\rCallValueInfo\\\n    \\x12\\x1c\\n\\tcallValue\\x18\\x01\\x20\\x01(\\x03R\\tcallValue\\x12\\x18\\n\\x07toke\\\n    nId\\x18\\x02\\x20\\x01(\\tR\\x07tokenId\\\"\\x9b\\x01\\n\\x1dDelegatedResourceAccou\\\n    ntIndex\\x12\\x18\\n\\x07account\\x18\\x01\\x20\\x01(\\x0cR\\x07account\\x12\\\"\\n\\\n    \\x0cfromAccounts\\x18\\x02\\x20\\x03(\\x0cR\\x0cfromAccounts\\x12\\x1e\\n\\ntoAcco\\\n    unts\\x18\\x03\\x20\\x03(\\x0cR\\ntoAccounts\\x12\\x1c\\n\\ttimestamp\\x18\\x04\\x20\\\n    \\x01(\\x03R\\ttimestamp\\\"\\xbd\\x1a\\n\\x08NodeInfo\\x12\\\"\\n\\x0cbeginSyncNum\\\n    \\x18\\x01\\x20\\x01(\\x03R\\x0cbeginSyncNum\\x12\\x14\\n\\x05block\\x18\\x02\\x20\\\n    \\x01(\\tR\\x05block\\x12$\\n\\rsolidityBlock\\x18\\x03\\x20\\x01(\\tR\\rsolidityBlo\\\n    ck\\x120\\n\\x13currentConnectCount\\x18\\x04\\x20\\x01(\\x05R\\x13currentConnect\\\n    Count\\x12.\\n\\x12activeConnectCount\\x18\\x05\\x20\\x01(\\x05R\\x12activeConnec\\\n    tCount\\x120\\n\\x13passiveConnectCount\\x18\\x06\\x20\\x01(\\x05R\\x13passiveCon\\\n    nectCount\\x12\\x1c\\n\\ttotalFlow\\x18\\x07\\x20\\x01(\\x03R\\ttotalFlow\\x12?\\n\\\n    \\x0cpeerInfoList\\x18\\x08\\x20\\x03(\\x0b2\\x1b.protocol.NodeInfo.PeerInfoR\\\n    \\x0cpeerInfoList\\x12I\\n\\x0econfigNodeInfo\\x18\\t\\x20\\x01(\\x0b2!.protocol.\\\n    NodeInfo.ConfigNodeInfoR\\x0econfigNodeInfo\\x12@\\n\\x0bmachineInfo\\x18\\n\\\n    \\x20\\x01(\\x0b2\\x1e.protocol.NodeInfo.MachineInfoR\\x0bmachineInfo\\x12]\\n\\\n    \\x13cheatWitnessInfoMap\\x18\\x0b\\x20\\x03(\\x0b2+.protocol.NodeInfo.CheatWi\\\n    tnessInfoMapEntryR\\x13cheatWitnessInfoMap\\x1aF\\n\\x18CheatWitnessInfoMapE\\\n    ntry\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\tR\\x03key\\x12\\x14\\n\\x05value\\x18\\\n    \\x02\\x20\\x01(\\tR\\x05value:\\x028\\x01\\x1a\\xc8\\x07\\n\\x08PeerInfo\\x12$\\n\\rla\\\n    stSyncBlock\\x18\\x01\\x20\\x01(\\tR\\rlastSyncBlock\\x12\\x1c\\n\\tremainNum\\x18\\\n    \\x02\\x20\\x01(\\x03R\\tremainNum\\x120\\n\\x13lastBlockUpdateTime\\x18\\x03\\x20\\\n    \\x01(\\x03R\\x13lastBlockUpdateTime\\x12\\x1a\\n\\x08syncFlag\\x18\\x04\\x20\\x01(\\\n    \\x08R\\x08syncFlag\\x128\\n\\x17headBlockTimeWeBothHave\\x18\\x05\\x20\\x01(\\x03\\\n    R\\x17headBlockTimeWeBothHave\\x12*\\n\\x10needSyncFromPeer\\x18\\x06\\x20\\x01(\\\n    \\x08R\\x10needSyncFromPeer\\x12&\\n\\x0eneedSyncFromUs\\x18\\x07\\x20\\x01(\\x08R\\\n    \\x0eneedSyncFromUs\\x12\\x12\\n\\x04host\\x18\\x08\\x20\\x01(\\tR\\x04host\\x12\\x12\\\n    \\n\\x04port\\x18\\t\\x20\\x01(\\x05R\\x04port\\x12\\x16\\n\\x06nodeId\\x18\\n\\x20\\x01\\\n    (\\tR\\x06nodeId\\x12\\x20\\n\\x0bconnectTime\\x18\\x0b\\x20\\x01(\\x03R\\x0bconnect\\\n    Time\\x12\\x1e\\n\\navgLatency\\x18\\x0c\\x20\\x01(\\x01R\\navgLatency\\x12(\\n\\x0fs\\\n    yncToFetchSize\\x18\\r\\x20\\x01(\\x05R\\x0fsyncToFetchSize\\x126\\n\\x16syncToFe\\\n    tchSizePeekNum\\x18\\x0e\\x20\\x01(\\x03R\\x16syncToFetchSizePeekNum\\x126\\n\\\n    \\x16syncBlockRequestedSize\\x18\\x0f\\x20\\x01(\\x05R\\x16syncBlockRequestedSi\\\n    ze\\x12$\\n\\runFetchSynNum\\x18\\x10\\x20\\x01(\\x03R\\runFetchSynNum\\x12(\\n\\x0f\\\n    blockInPorcSize\\x18\\x11\\x20\\x01(\\x05R\\x0fblockInPorcSize\\x120\\n\\x13headB\\\n    lockWeBothHave\\x18\\x12\\x20\\x01(\\tR\\x13headBlockWeBothHave\\x12\\x1a\\n\\x08i\\\n    sActive\\x18\\x13\\x20\\x01(\\x08R\\x08isActive\\x12\\x14\\n\\x05score\\x18\\x14\\x20\\\n    \\x01(\\x05R\\x05score\\x12\\x1c\\n\\tnodeCount\\x18\\x15\\x20\\x01(\\x05R\\tnodeCoun\\\n    t\\x12\\x16\\n\\x06inFlow\\x18\\x16\\x20\\x01(\\x03R\\x06inFlow\\x12(\\n\\x0fdisconne\\\n    ctTimes\\x18\\x17\\x20\\x01(\\x05R\\x0fdisconnectTimes\\x124\\n\\x15localDisconne\\\n    ctReason\\x18\\x18\\x20\\x01(\\tR\\x15localDisconnectReason\\x126\\n\\x16remoteDi\\\n    sconnectReason\\x18\\x19\\x20\\x01(\\tR\\x16remoteDisconnectReason\\x1a\\xa2\\x06\\\n    \\n\\x0eConfigNodeInfo\\x12\\x20\\n\\x0bcodeVersion\\x18\\x01\\x20\\x01(\\tR\\x0bcod\\\n    eVersion\\x12\\x1e\\n\\np2pVersion\\x18\\x02\\x20\\x01(\\tR\\np2pVersion\\x12\\x1e\\n\\\n    \\nlistenPort\\x18\\x03\\x20\\x01(\\x05R\\nlistenPort\\x12&\\n\\x0ediscoverEnable\\\n    \\x18\\x04\\x20\\x01(\\x08R\\x0ediscoverEnable\\x12&\\n\\x0eactiveNodeSize\\x18\\\n    \\x05\\x20\\x01(\\x05R\\x0eactiveNodeSize\\x12(\\n\\x0fpassiveNodeSize\\x18\\x06\\\n    \\x20\\x01(\\x05R\\x0fpassiveNodeSize\\x12\\\"\\n\\x0csendNodeSize\\x18\\x07\\x20\\\n    \\x01(\\x05R\\x0csendNodeSize\\x12(\\n\\x0fmaxConnectCount\\x18\\x08\\x20\\x01(\\\n    \\x05R\\x0fmaxConnectCount\\x124\\n\\x15sameIpMaxConnectCount\\x18\\t\\x20\\x01(\\\n    \\x05R\\x15sameIpMaxConnectCount\\x12*\\n\\x10backupListenPort\\x18\\n\\x20\\x01(\\\n    \\x05R\\x10backupListenPort\\x12*\\n\\x10backupMemberSize\\x18\\x0b\\x20\\x01(\\\n    \\x05R\\x10backupMemberSize\\x12&\\n\\x0ebackupPriority\\x18\\x0c\\x20\\x01(\\x05R\\\n    \\x0ebackupPriority\\x12\\x1c\\n\\tdbVersion\\x18\\r\\x20\\x01(\\x05R\\tdbVersion\\\n    \\x122\\n\\x14minParticipationRate\\x18\\x0e\\x20\\x01(\\x05R\\x14minParticipatio\\\n    nRate\\x12(\\n\\x0fsupportConstant\\x18\\x0f\\x20\\x01(\\x08R\\x0fsupportConstant\\\n    \\x12\\\"\\n\\x0cminTimeRatio\\x18\\x10\\x20\\x01(\\x01R\\x0cminTimeRatio\\x12\\\"\\n\\\n    \\x0cmaxTimeRatio\\x18\\x11\\x20\\x01(\\x01R\\x0cmaxTimeRatio\\x12:\\n\\x18allowCr\\\n    eationOfContracts\\x18\\x12\\x20\\x01(\\x03R\\x18allowCreationOfContracts\\x120\\\n    \\n\\x13allowAdaptiveEnergy\\x18\\x13\\x20\\x01(\\x03R\\x13allowAdaptiveEnergy\\\n    \\x1a\\xb9\\x07\\n\\x0bMachineInfo\\x12\\x20\\n\\x0bthreadCount\\x18\\x01\\x20\\x01(\\\n    \\x05R\\x0bthreadCount\\x120\\n\\x13deadLockThreadCount\\x18\\x02\\x20\\x01(\\x05R\\\n    \\x13deadLockThreadCount\\x12\\x1a\\n\\x08cpuCount\\x18\\x03\\x20\\x01(\\x05R\\x08c\\\n    puCount\\x12\\x20\\n\\x0btotalMemory\\x18\\x04\\x20\\x01(\\x03R\\x0btotalMemory\\\n    \\x12\\x1e\\n\\nfreeMemory\\x18\\x05\\x20\\x01(\\x03R\\nfreeMemory\\x12\\x18\\n\\x07cp\\\n    uRate\\x18\\x06\\x20\\x01(\\x01R\\x07cpuRate\\x12\\x20\\n\\x0bjavaVersion\\x18\\x07\\\n    \\x20\\x01(\\tR\\x0bjavaVersion\\x12\\x16\\n\\x06osName\\x18\\x08\\x20\\x01(\\tR\\x06o\\\n    sName\\x12&\\n\\x0ejvmTotalMemory\\x18\\t\\x20\\x01(\\x03R\\x0ejvmTotalMemory\\x12\\\n    $\\n\\rjvmFreeMemory\\x18\\n\\x20\\x01(\\x03R\\rjvmFreeMemory\\x12&\\n\\x0eprocessC\\\n    puRate\\x18\\x0b\\x20\\x01(\\x01R\\x0eprocessCpuRate\\x12]\\n\\x12memoryDescInfoL\\\n    ist\\x18\\x0c\\x20\\x03(\\x0b2-.protocol.NodeInfo.MachineInfo.MemoryDescInfoR\\\n    \\x12memoryDescInfoList\\x12i\\n\\x16deadLockThreadInfoList\\x18\\r\\x20\\x03(\\\n    \\x0b21.protocol.NodeInfo.MachineInfo.DeadLockThreadInfoR\\x16deadLockThre\\\n    adInfoList\\x1a\\x8e\\x01\\n\\x0eMemoryDescInfo\\x12\\x12\\n\\x04name\\x18\\x01\\x20\\\n    \\x01(\\tR\\x04name\\x12\\x1a\\n\\x08initSize\\x18\\x02\\x20\\x01(\\x03R\\x08initSize\\\n    \\x12\\x18\\n\\x07useSize\\x18\\x03\\x20\\x01(\\x03R\\x07useSize\\x12\\x18\\n\\x07maxS\\\n    ize\\x18\\x04\\x20\\x01(\\x03R\\x07maxSize\\x12\\x18\\n\\x07useRate\\x18\\x05\\x20\\\n    \\x01(\\x01R\\x07useRate\\x1a\\xd2\\x01\\n\\x12DeadLockThreadInfo\\x12\\x12\\n\\x04n\\\n    ame\\x18\\x01\\x20\\x01(\\tR\\x04name\\x12\\x1a\\n\\x08lockName\\x18\\x02\\x20\\x01(\\t\\\n    R\\x08lockName\\x12\\x1c\\n\\tlockOwner\\x18\\x03\\x20\\x01(\\tR\\tlockOwner\\x12\\\n    \\x14\\n\\x05state\\x18\\x04\\x20\\x01(\\tR\\x05state\\x12\\x1c\\n\\tblockTime\\x18\\\n    \\x05\\x20\\x01(\\x03R\\tblockTime\\x12\\x1a\\n\\x08waitTime\\x18\\x06\\x20\\x01(\\x03\\\n    R\\x08waitTime\\x12\\x1e\\n\\nstackTrace\\x18\\x07\\x20\\x01(\\tR\\nstackTrace\\\"\\\n    \\xc0\\x18\\n\\x0bMetricsInfo\\x12\\x1a\\n\\x08interval\\x18\\x01\\x20\\x01(\\x03R\\\n    \\x08interval\\x122\\n\\x04node\\x18\\x02\\x20\\x01(\\x0b2\\x1e.protocol.MetricsIn\\\n    fo.NodeInfoR\\x04node\\x12D\\n\\nblockchain\\x18\\x03\\x20\\x01(\\x0b2$.protocol.\\\n    MetricsInfo.BlockChainInfoR\\nblockchain\\x12/\\n\\x03net\\x18\\x04\\x20\\x01(\\\n    \\x0b2\\x1d.protocol.MetricsInfo.NetInfoR\\x03net\\x1at\\n\\x08NodeInfo\\x12\\\n    \\x0e\\n\\x02ip\\x18\\x01\\x20\\x01(\\tR\\x02ip\\x12\\x1a\\n\\x08nodeType\\x18\\x02\\x20\\\n    \\x01(\\x05R\\x08nodeType\\x12\\x18\\n\\x07version\\x18\\x03\\x20\\x01(\\tR\\x07versi\\\n    on\\x12\\\"\\n\\x0cbackupStatus\\x18\\x04\\x20\\x01(\\x05R\\x0cbackupStatus\\x1a\\xee\\\n    \\x06\\n\\x0eBlockChainInfo\\x12\\\"\\n\\x0cheadBlockNum\\x18\\x01\\x20\\x01(\\x03R\\\n    \\x0cheadBlockNum\\x12.\\n\\x12headBlockTimestamp\\x18\\x02\\x20\\x01(\\x03R\\x12h\\\n    eadBlockTimestamp\\x12$\\n\\rheadBlockHash\\x18\\x03\\x20\\x01(\\tR\\rheadBlockHa\\\n    sh\\x12\\x1c\\n\\tforkCount\\x18\\x04\\x20\\x01(\\x05R\\tforkCount\\x12$\\n\\rfailFor\\\n    kCount\\x18\\x05\\x20\\x01(\\x05R\\rfailForkCount\\x12J\\n\\x10blockProcessTime\\\n    \\x18\\x06\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\x10blockProces\\\n    sTime\\x120\\n\\x03tps\\x18\\x07\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateI\\\n    nfoR\\x03tps\\x122\\n\\x14transactionCacheSize\\x18\\x08\\x20\\x01(\\x05R\\x14tran\\\n    sactionCacheSize\\x12L\\n\\x11missedTransaction\\x18\\t\\x20\\x01(\\x0b2\\x1e.pro\\\n    tocol.MetricsInfo.RateInfoR\\x11missedTransaction\\x12J\\n\\twitnesses\\x18\\n\\\n    \\x20\\x03(\\x0b2,.protocol.MetricsInfo.BlockChainInfo.WitnessR\\twitnesses\\\n    \\x120\\n\\x13failProcessBlockNum\\x18\\x0b\\x20\\x01(\\x03R\\x13failProcessBlock\\\n    Num\\x126\\n\\x16failProcessBlockReason\\x18\\x0c\\x20\\x01(\\tR\\x16failProcessB\\\n    lockReason\\x12O\\n\\ndupWitness\\x18\\r\\x20\\x03(\\x0b2/.protocol.MetricsInfo.\\\n    BlockChainInfo.DupWitnessR\\ndupWitness\\x1a=\\n\\x07Witness\\x12\\x18\\n\\x07ad\\\n    dress\\x18\\x01\\x20\\x01(\\tR\\x07address\\x12\\x18\\n\\x07version\\x18\\x02\\x20\\\n    \\x01(\\x05R\\x07version\\x1aX\\n\\nDupWitness\\x12\\x18\\n\\x07address\\x18\\x01\\\n    \\x20\\x01(\\tR\\x07address\\x12\\x1a\\n\\x08blockNum\\x18\\x02\\x20\\x01(\\x03R\\x08b\\\n    lockNum\\x12\\x14\\n\\x05count\\x18\\x03\\x20\\x01(\\x05R\\x05count\\x1a\\xb8\\x01\\n\\\n    \\x08RateInfo\\x12\\x14\\n\\x05count\\x18\\x01\\x20\\x01(\\x03R\\x05count\\x12\\x1a\\n\\\n    \\x08meanRate\\x18\\x02\\x20\\x01(\\x01R\\x08meanRate\\x12$\\n\\roneMinuteRate\\x18\\\n    \\x03\\x20\\x01(\\x01R\\roneMinuteRate\\x12&\\n\\x0efiveMinuteRate\\x18\\x04\\x20\\\n    \\x01(\\x01R\\x0efiveMinuteRate\\x12,\\n\\x11fifteenMinuteRate\\x18\\x05\\x20\\x01\\\n    (\\x01R\\x11fifteenMinuteRate\\x1a\\xc7\\r\\n\\x07NetInfo\\x12(\\n\\x0ferrorProtoC\\\n    ount\\x18\\x01\\x20\\x01(\\x05R\\x0ferrorProtoCount\\x127\\n\\x03api\\x18\\x02\\x20\\\n    \\x01(\\x0b2%.protocol.MetricsInfo.NetInfo.ApiInfoR\\x03api\\x12(\\n\\x0fconne\\\n    ctionCount\\x18\\x03\\x20\\x01(\\x05R\\x0fconnectionCount\\x122\\n\\x14validConne\\\n    ctionCount\\x18\\x04\\x20\\x01(\\x05R\\x14validConnectionCount\\x12B\\n\\x0ctcpIn\\\n    Traffic\\x18\\x05\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\x0ctcpI\\\n    nTraffic\\x12D\\n\\rtcpOutTraffic\\x18\\x06\\x20\\x01(\\x0b2\\x1e.protocol.Metric\\\n    sInfo.RateInfoR\\rtcpOutTraffic\\x12.\\n\\x12disconnectionCount\\x18\\x07\\x20\\\n    \\x01(\\x05R\\x12disconnectionCount\\x12g\\n\\x13disconnectionDetail\\x18\\x08\\\n    \\x20\\x03(\\x0b25.protocol.MetricsInfo.NetInfo.DisconnectionDetailInfoR\\\n    \\x13disconnectionDetail\\x12B\\n\\x0cudpInTraffic\\x18\\t\\x20\\x01(\\x0b2\\x1e.p\\\n    rotocol.MetricsInfo.RateInfoR\\x0cudpInTraffic\\x12D\\n\\rudpOutTraffic\\x18\\\n    \\n\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\rudpOutTraffic\\x12C\\\n    \\n\\x07latency\\x18\\x0b\\x20\\x01(\\x0b2).protocol.MetricsInfo.NetInfo.Latenc\\\n    yInfoR\\x07latency\\x1a\\xd4\\x03\\n\\x07ApiInfo\\x120\\n\\x03qps\\x18\\x01\\x20\\x01\\\n    (\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\x03qps\\x128\\n\\x07failQps\\x18\\\n    \\x02\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\x07failQps\\x12>\\n\\\n    \\noutTraffic\\x18\\x03\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\no\\\n    utTraffic\\x12K\\n\\x06detail\\x18\\x04\\x20\\x03(\\x0b23.protocol.MetricsInfo.N\\\n    etInfo.ApiInfo.ApiDetailInfoR\\x06detail\\x1a\\xcf\\x01\\n\\rApiDetailInfo\\x12\\\n    \\x12\\n\\x04name\\x18\\x01\\x20\\x01(\\tR\\x04name\\x120\\n\\x03qps\\x18\\x02\\x20\\x01\\\n    (\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\x03qps\\x128\\n\\x07failQps\\x18\\\n    \\x03\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\x07failQps\\x12>\\n\\\n    \\noutTraffic\\x18\\x04\\x20\\x01(\\x0b2\\x1e.protocol.MetricsInfo.RateInfoR\\no\\\n    utTraffic\\x1aG\\n\\x17DisconnectionDetailInfo\\x12\\x16\\n\\x06reason\\x18\\x01\\\n    \\x20\\x01(\\tR\\x06reason\\x12\\x14\\n\\x05count\\x18\\x02\\x20\\x01(\\x05R\\x05count\\\n    \\x1a\\xe8\\x03\\n\\x0bLatencyInfo\\x12\\x14\\n\\x05top99\\x18\\x01\\x20\\x01(\\x05R\\\n    \\x05top99\\x12\\x14\\n\\x05top95\\x18\\x02\\x20\\x01(\\x05R\\x05top95\\x12\\x14\\n\\\n    \\x05top75\\x18\\x03\\x20\\x01(\\x05R\\x05top75\\x12\\x1e\\n\\ntotalCount\\x18\\x04\\\n    \\x20\\x01(\\x05R\\ntotalCount\\x12\\x18\\n\\x07delay1S\\x18\\x05\\x20\\x01(\\x05R\\\n    \\x07delay1S\\x12\\x18\\n\\x07delay2S\\x18\\x06\\x20\\x01(\\x05R\\x07delay2S\\x12\\\n    \\x18\\n\\x07delay3S\\x18\\x07\\x20\\x01(\\x05R\\x07delay3S\\x12S\\n\\x06detail\\x18\\\n    \\x08\\x20\\x03(\\x0b2;.protocol.MetricsInfo.NetInfo.LatencyInfo.LatencyDeta\\\n    ilInfoR\\x06detail\\x1a\\xd3\\x01\\n\\x11LatencyDetailInfo\\x12\\x18\\n\\x07witnes\\\n    s\\x18\\x01\\x20\\x01(\\tR\\x07witness\\x12\\x14\\n\\x05top99\\x18\\x02\\x20\\x01(\\x05\\\n    R\\x05top99\\x12\\x14\\n\\x05top95\\x18\\x03\\x20\\x01(\\x05R\\x05top95\\x12\\x14\\n\\\n    \\x05top75\\x18\\x04\\x20\\x01(\\x05R\\x05top75\\x12\\x14\\n\\x05count\\x18\\x05\\x20\\\n    \\x01(\\x05R\\x05count\\x12\\x18\\n\\x07delay1S\\x18\\x06\\x20\\x01(\\x05R\\x07delay1\\\n    S\\x12\\x18\\n\\x07delay2S\\x18\\x07\\x20\\x01(\\x05R\\x07delay2S\\x12\\x18\\n\\x07del\\\n    ay3S\\x18\\x08\\x20\\x01(\\x05R\\x07delay3S\\\"\\x93\\x03\\n\\x0bPBFTMessage\\x124\\n\\\n    \\x08raw_data\\x18\\x01\\x20\\x01(\\x0b2\\x19.protocol.PBFTMessage.RawR\\x07rawD\\\n    ata\\x12\\x1c\\n\\tsignature\\x18\\x02\\x20\\x01(\\x0cR\\tsignature\\x1a\\xbd\\x01\\n\\\n    \\x03Raw\\x128\\n\\x08msg_type\\x18\\x01\\x20\\x01(\\x0e2\\x1d.protocol.PBFTMessag\\\n    e.MsgTypeR\\x07msgType\\x12;\\n\\tdata_type\\x18\\x02\\x20\\x01(\\x0e2\\x1e.protoc\\\n    ol.PBFTMessage.DataTypeR\\x08dataType\\x12\\x15\\n\\x06view_n\\x18\\x03\\x20\\x01\\\n    (\\x03R\\x05viewN\\x12\\x14\\n\\x05epoch\\x18\\x04\\x20\\x01(\\x03R\\x05epoch\\x12\\\n    \\x12\\n\\x04data\\x18\\x05\\x20\\x01(\\x0cR\\x04data\\\"P\\n\\x07MsgType\\x12\\x0f\\n\\\n    \\x0bVIEW_CHANGE\\x10\\0\\x12\\x0b\\n\\x07REQUEST\\x10\\x01\\x12\\x0e\\n\\nPREPREPARE\\\n    \\x10\\x02\\x12\\x0b\\n\\x07PREPARE\\x10\\x03\\x12\\n\\n\\x06COMMIT\\x10\\x04\\\"\\x1e\\n\\\n    \\x08DataType\\x12\\t\\n\\x05BLOCK\\x10\\0\\x12\\x07\\n\\x03SRL\\x10\\x01\\\"D\\n\\x10PBF\\\n    TCommitResult\\x12\\x12\\n\\x04data\\x18\\x01\\x20\\x01(\\x0cR\\x04data\\x12\\x1c\\n\\\n    \\tsignature\\x18\\x02\\x20\\x03(\\x0cR\\tsignature\\\"#\\n\\x03SRL\\x12\\x1c\\n\\tsrAd\\\n    dress\\x18\\x01\\x20\\x03(\\x0cR\\tsrAddress*7\\n\\x0bAccountType\\x12\\n\\n\\x06Nor\\\n    mal\\x10\\0\\x12\\x0e\\n\\nAssetIssue\\x10\\x01\\x12\\x0c\\n\\x08Contract\\x10\\x02*\\\n    \\x9f\\x04\\n\\nReasonCode\\x12\\r\\n\\tREQUESTED\\x10\\0\\x12\\x10\\n\\x0cBAD_PROTOCO\\\n    L\\x10\\x02\\x12\\x12\\n\\x0eTOO_MANY_PEERS\\x10\\x04\\x12\\x12\\n\\x0eDUPLICATE_PEE\\\n    R\\x10\\x05\\x12\\x19\\n\\x15INCOMPATIBLE_PROTOCOL\\x10\\x06\\x12\\x16\\n\\x12RANDOM\\\n    _ELIMINATION\\x10\\x07\\x12\\x10\\n\\x0cPEER_QUITING\\x10\\x08\\x12\\x17\\n\\x13UNEX\\\n    PECTED_IDENTITY\\x10\\t\\x12\\x12\\n\\x0eLOCAL_IDENTITY\\x10\\n\\x12\\x10\\n\\x0cPIN\\\n    G_TIMEOUT\\x10\\x0b\\x12\\x0f\\n\\x0bUSER_REASON\\x10\\x10\\x12\\t\\n\\x05RESET\\x10\\\n    \\x11\\x12\\r\\n\\tSYNC_FAIL\\x10\\x12\\x12\\x0e\\n\\nFETCH_FAIL\\x10\\x13\\x12\\n\\n\\\n    \\x06BAD_TX\\x10\\x14\\x12\\r\\n\\tBAD_BLOCK\\x10\\x15\\x12\\n\\n\\x06FORKED\\x10\\x16\\\n    \\x12\\x0e\\n\\nUNLINKABLE\\x10\\x17\\x12\\x18\\n\\x14INCOMPATIBLE_VERSION\\x10\\x18\\\n    \\x12\\x16\\n\\x12INCOMPATIBLE_CHAIN\\x10\\x19\\x12\\x0c\\n\\x08TIME_OUT\\x10\\x20\\\n    \\x12\\x10\\n\\x0cCONNECT_FAIL\\x10!\\x12\\x1f\\n\\x1bTOO_MANY_PEERS_WITH_SAME_IP\\\n    \\x10\\\"\\x12\\x18\\n\\x14LIGHT_NODE_SYNC_FAIL\\x10#\\x12\\x11\\n\\rBELOW_THAN_ME\\\n    \\x10$\\x12\\x0f\\n\\x0bNOT_WITNESS\\x10%\\x12\\x13\\n\\x0fNO_SUCH_MESSAGE\\x10&\\\n    \\x12\\x0c\\n\\x07UNKNOWN\\x10\\xff\\x01BF\\n\\x0forg.tron.protosB\\x08ProtocolZ)g\\\n    ithub.com/tronprotocol/grpc-gateway/coreJ\\x9c\\xb2\\x02\\n\\x07\\x12\\x05\\0\\0\\\n    \\xfa\\x06\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\t\\n\\x02\\x03\\0\\x12\\x03\\x02\\\n    \\0#\\n\\t\\n\\x02\\x03\\x01\\x12\\x03\\x03\\0\\x1d\\n\\t\\n\\x02\\x03\\x02\\x12\\x03\\x04\\0$\\\n    \\n\\x08\\n\\x01\\x02\\x12\\x03\\x06\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\t\\0(\\nH\\n\\x02\\\n    \\x08\\x01\\x12\\x03\\t\\0(\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\\n    \\x20that\\x20generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\n\\\n    \\0)\\n=\\n\\x02\\x08\\x08\\x12\\x03\\n\\0)\\\"2Specify\\x20the\\x20class\\x20name\\x20o\\\n    f\\x20the\\x20generated\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x0b\\0@\\n\\\n    \\t\\n\\x02\\x08\\x0b\\x12\\x03\\x0b\\0@\\n\\n\\n\\x02\\x05\\0\\x12\\x04\\r\\0\\x11\\x01\\n\\n\\\n    \\n\\x03\\x05\\0\\x01\\x12\\x03\\r\\x05\\x10\\n\\x0b\\n\\x04\\x05\\0\\x02\\0\\x12\\x03\\x0e\\\n    \\x02\\r\\n\\x0c\\n\\x05\\x05\\0\\x02\\0\\x01\\x12\\x03\\x0e\\x02\\x08\\n\\x0c\\n\\x05\\x05\\0\\\n    \\x02\\0\\x02\\x12\\x03\\x0e\\x0b\\x0c\\n\\x0b\\n\\x04\\x05\\0\\x02\\x01\\x12\\x03\\x0f\\x02\\\n    \\x11\\n\\x0c\\n\\x05\\x05\\0\\x02\\x01\\x01\\x12\\x03\\x0f\\x02\\x0c\\n\\x0c\\n\\x05\\x05\\0\\\n    \\x02\\x01\\x02\\x12\\x03\\x0f\\x0f\\x10\\n\\x0b\\n\\x04\\x05\\0\\x02\\x02\\x12\\x03\\x10\\\n    \\x02\\x0f\\n\\x0c\\n\\x05\\x05\\0\\x02\\x02\\x01\\x12\\x03\\x10\\x02\\n\\n\\x0c\\n\\x05\\x05\\\n    \\0\\x02\\x02\\x02\\x12\\x03\\x10\\r\\x0e\\nf\\n\\x02\\x04\\0\\x12\\x04\\x14\\0\\x17\\x01\\\n    \\x1aZ\\x20AccountId,\\x20(name,\\x20address)\\x20use\\x20name,\\x20(null,\\x20a\\\n    ddress)\\x20use\\x20address,\\x20(name,\\x20null)\\x20use\\x20name,\\n\\n\\n\\n\\\n    \\x03\\x04\\0\\x01\\x12\\x03\\x14\\x08\\x11\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\x15\\\n    \\x02\\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\x15\\x02\\x07\\n\\x0c\\n\\x05\\x04\\\n    \\0\\x02\\0\\x01\\x12\\x03\\x15\\x08\\x0c\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\x15\\\n    \\x0f\\x10\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\x16\\x02\\x14\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x01\\x05\\x12\\x03\\x16\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\\n    \\x16\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\x16\\x12\\x13\\n\\x1a\\n\\\n    \\x02\\x04\\x01\\x12\\x04\\x1a\\0\\x1f\\x01\\x1a\\x0e\\x20vote\\x20message\\n\\n\\n\\n\\\n    \\x03\\x04\\x01\\x01\\x12\\x03\\x1a\\x08\\x0c\\n$\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x1c\\\n    \\x02\\x19\\x1a\\x17\\x20the\\x20super\\x20rep\\x20address\\n\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\0\\x05\\x12\\x03\\x1c\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\x03\\x1c\\\n    \\x08\\x14\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x1c\\x17\\x18\\n.\\n\\x04\\x04\\\n    \\x01\\x02\\x01\\x12\\x03\\x1e\\x02\\x17\\x1a!\\x20the\\x20vote\\x20num\\x20to\\x20thi\\\n    s\\x20super\\x20rep.\\n\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\x03\\x1e\\x02\\x07\\\n    \\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03\\x1e\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\x01\\x03\\x12\\x03\\x1e\\x15\\x16\\n\\x16\\n\\x02\\x04\\x02\\x12\\x04\\\"\\00\\x01\\\n    \\x1a\\n\\x20Proposal\\n\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\\"\\x08\\x10\\n\\x0b\\n\\x04\\\n    \\x04\\x02\\x02\\0\\x12\\x03#\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x05\\x12\\x03#\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03#\\x08\\x13\\n\\x0c\\n\\x05\\x04\\\n    \\x02\\x02\\0\\x03\\x12\\x03#\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x01\\x12\\x03$\\x02\\\n    \\x1d\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\x12\\x03$\\x02\\x07\\n\\x0c\\n\\x05\\x04\\\n    \\x02\\x02\\x01\\x01\\x12\\x03$\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x03\\x12\\\n    \\x03$\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x02\\x12\\x03%\\x02#\\n\\x0c\\n\\x05\\x04\\\n    \\x02\\x02\\x02\\x06\\x12\\x03%\\x02\\x13\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x01\\x12\\\n    \\x03%\\x14\\x1e\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x03\\x12\\x03%!\\\"\\n\\x0b\\n\\x04\\\n    \\x04\\x02\\x02\\x03\\x12\\x03&\\x02\\x1c\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x03\\x05\\x12\\\n    \\x03&\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x03\\x01\\x12\\x03&\\x08\\x17\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\x03\\x03\\x12\\x03&\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x04\\\n    \\x12\\x03'\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x04\\x05\\x12\\x03'\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x02\\x02\\x04\\x01\\x12\\x03'\\x08\\x13\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x04\\\n    \\x03\\x12\\x03'\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x05\\x12\\x03(\\x02\\x1f\\n\\x0c\\\n    \\n\\x05\\x04\\x02\\x02\\x05\\x04\\x12\\x03(\\x02\\n\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x05\\\n    \\x05\\x12\\x03(\\x0b\\x10\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x05\\x01\\x12\\x03(\\x11\\x1a\\n\\\n    \\x0c\\n\\x05\\x04\\x02\\x02\\x05\\x03\\x12\\x03(\\x1d\\x1e\\n\\x0c\\n\\x04\\x04\\x02\\x04\\\n    \\0\\x12\\x04)\\x02.\\x03\\n\\x0c\\n\\x05\\x04\\x02\\x04\\0\\x01\\x12\\x03)\\x07\\x0c\\n\\r\\\n    \\n\\x06\\x04\\x02\\x04\\0\\x02\\0\\x12\\x03*\\x04\\x10\\n\\x0e\\n\\x07\\x04\\x02\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x03*\\x04\\x0b\\n\\x0e\\n\\x07\\x04\\x02\\x04\\0\\x02\\0\\x02\\x12\\x03*\\\n    \\x0e\\x0f\\n\\r\\n\\x06\\x04\\x02\\x04\\0\\x02\\x01\\x12\\x03+\\x04\\x14\\n\\x0e\\n\\x07\\\n    \\x04\\x02\\x04\\0\\x02\\x01\\x01\\x12\\x03+\\x04\\x0f\\n\\x0e\\n\\x07\\x04\\x02\\x04\\0\\\n    \\x02\\x01\\x02\\x12\\x03+\\x12\\x13\\n\\r\\n\\x06\\x04\\x02\\x04\\0\\x02\\x02\\x12\\x03,\\\n    \\x04\\x11\\n\\x0e\\n\\x07\\x04\\x02\\x04\\0\\x02\\x02\\x01\\x12\\x03,\\x04\\x0c\\n\\x0e\\n\\\n    \\x07\\x04\\x02\\x04\\0\\x02\\x02\\x02\\x12\\x03,\\x0f\\x10\\n\\r\\n\\x06\\x04\\x02\\x04\\0\\\n    \\x02\\x03\\x12\\x03-\\x04\\x11\\n\\x0e\\n\\x07\\x04\\x02\\x04\\0\\x02\\x03\\x01\\x12\\x03-\\\n    \\x04\\x0c\\n\\x0e\\n\\x07\\x04\\x02\\x04\\0\\x02\\x03\\x02\\x12\\x03-\\x0f\\x10\\n\\x0b\\n\\\n    \\x04\\x04\\x02\\x02\\x06\\x12\\x03/\\x02\\x12\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x06\\x06\\\n    \\x12\\x03/\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x06\\x01\\x12\\x03/\\x08\\r\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\x06\\x03\\x12\\x03/\\x10\\x11\\n\\x16\\n\\x02\\x04\\x03\\x12\\x043\\0\\\n    ;\\x01\\x1a\\n\\x20Exchange\\n\\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x033\\x08\\x10\\n\\x0b\\n\\\n    \\x04\\x04\\x03\\x02\\0\\x12\\x034\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x05\\x12\\\n    \\x034\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x01\\x12\\x034\\x08\\x13\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\0\\x03\\x12\\x034\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x01\\x12\\x035\\\n    \\x02\\x1c\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x05\\x12\\x035\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\x01\\x01\\x12\\x035\\x08\\x17\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x03\\\n    \\x12\\x035\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x02\\x12\\x036\\x02\\x18\\n\\x0c\\n\\\n    \\x05\\x04\\x03\\x02\\x02\\x05\\x12\\x036\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\\n    \\x01\\x12\\x036\\x08\\x13\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x03\\x12\\x036\\x16\\x17\\n\\\n    \\x0b\\n\\x04\\x04\\x03\\x02\\x03\\x12\\x037\\x02\\x1b\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\\n    \\x05\\x12\\x037\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x01\\x12\\x037\\x08\\x16\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x03\\x12\\x037\\x19\\x1a\\n\\x0b\\n\\x04\\x04\\x03\\x02\\\n    \\x04\\x12\\x038\\x02\\x20\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x05\\x12\\x038\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x01\\x12\\x038\\x08\\x1b\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x04\\x03\\x12\\x038\\x1e\\x1f\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x05\\x12\\x039\\x02\\x1c\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x05\\x05\\x12\\x039\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x05\\x01\\x12\\x039\\x08\\x17\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x05\\x03\\x12\\x039\\x1a\\\n    \\x1b\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x06\\x12\\x03:\\x02!\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x06\\x05\\x12\\x03:\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x06\\x01\\x12\\x03:\\x08\\\n    \\x1c\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x06\\x03\\x12\\x03:\\x1f\\x20\\n\\x14\\n\\x02\\x04\\\n    \\x04\\x12\\x04>\\0T\\x01\\x1a\\x08\\x20market\\n\\n\\n\\n\\x03\\x04\\x04\\x01\\x12\\x03>\\\n    \\x08\\x13\\n\\x0b\\n\\x04\\x04\\x04\\x02\\0\\x12\\x03?\\x04\\x17\\n\\x0c\\n\\x05\\x04\\x04\\\n    \\x02\\0\\x05\\x12\\x03?\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x01\\x12\\x03?\\n\\x12\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\0\\x03\\x12\\x03?\\x15\\x16\\n\\x0b\\n\\x04\\x04\\x04\\x02\\\n    \\x01\\x12\\x03@\\x04\\x1c\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x05\\x12\\x03@\\x04\\t\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x01\\x12\\x03@\\n\\x17\\n\\x0c\\n\\x05\\x04\\x04\\x02\\\n    \\x01\\x03\\x12\\x03@\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x02\\x12\\x03A\\x04\\x1a\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\x02\\x05\\x12\\x03A\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\\n    \\x02\\x01\\x12\\x03A\\n\\x15\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\x03\\x12\\x03A\\x18\\x19\\\n    \\n\\x0b\\n\\x04\\x04\\x04\\x02\\x03\\x12\\x03B\\x04\\x1c\\n\\x0c\\n\\x05\\x04\\x04\\x02\\\n    \\x03\\x05\\x12\\x03B\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x03\\x01\\x12\\x03B\\n\\x17\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\x03\\x03\\x12\\x03B\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\x04\\x02\\\n    \\x04\\x12\\x03C\\x04\\\"\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x04\\x05\\x12\\x03C\\x04\\t\\n\\x0c\\\n    \\n\\x05\\x04\\x04\\x02\\x04\\x01\\x12\\x03C\\n\\x1d\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x04\\\n    \\x03\\x12\\x03C\\x20!\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x05\\x12\\x03D\\x04\\x1b\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x05\\x05\\x12\\x03D\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x05\\x01\\\n    \\x12\\x03D\\n\\x16\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x05\\x03\\x12\\x03D\\x19\\x1a\\n\\x1d\\n\\\n    \\x04\\x04\\x04\\x02\\x06\\x12\\x03E\\x04!\\\"\\x10\\x20min\\x20to\\x20receive\\n\\n\\x0c\\\n    \\n\\x05\\x04\\x04\\x02\\x06\\x05\\x12\\x03E\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x06\\\n    \\x01\\x12\\x03E\\n\\x1c\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x06\\x03\\x12\\x03E\\x1f\\x20\\n\\\n    \\x0b\\n\\x04\\x04\\x04\\x02\\x07\\x12\\x03F\\x04)\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x07\\x05\\\n    \\x12\\x03F\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x07\\x01\\x12\\x03F\\n$\\n\\x0c\\n\\x05\\\n    \\x04\\x04\\x02\\x07\\x03\\x12\\x03F'(\\n\\xa8\\x01\\n\\x04\\x04\\x04\\x02\\x08\\x12\\x03I\\\n    \\x04*\\x1a\\x9a\\x01\\x20When\\x20state\\x20!=\\x20ACTIVE\\x20and\\x20sell_token_\\\n    quantity_return\\x20!=0,\\nit\\x20means\\x20that\\x20some\\x20sell\\x20tokens\\\n    \\x20are\\x20returned\\x20to\\x20the\\x20account\\x20due\\x20to\\x20insufficient\\\n    \\x20remaining\\x20amount\\n\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x08\\x05\\x12\\x03I\\x04\\t\\\n    \\n\\x0c\\n\\x05\\x04\\x04\\x02\\x08\\x01\\x12\\x03I\\n$\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x08\\\n    \\x03\\x12\\x03I')\\n\\x0c\\n\\x04\\x04\\x04\\x04\\0\\x12\\x04K\\x04O\\x05\\n\\x0c\\n\\x05\\\n    \\x04\\x04\\x04\\0\\x01\\x12\\x03K\\t\\x0e\\n\\r\\n\\x06\\x04\\x04\\x04\\0\\x02\\0\\x12\\x03L\\\n    \\x06\\x11\\n\\x0e\\n\\x07\\x04\\x04\\x04\\0\\x02\\0\\x01\\x12\\x03L\\x06\\x0c\\n\\x0e\\n\\\n    \\x07\\x04\\x04\\x04\\0\\x02\\0\\x02\\x12\\x03L\\x0f\\x10\\n\\r\\n\\x06\\x04\\x04\\x04\\0\\\n    \\x02\\x01\\x12\\x03M\\x06\\x13\\n\\x0e\\n\\x07\\x04\\x04\\x04\\0\\x02\\x01\\x01\\x12\\x03M\\\n    \\x06\\x0e\\n\\x0e\\n\\x07\\x04\\x04\\x04\\0\\x02\\x01\\x02\\x12\\x03M\\x11\\x12\\n\\r\\n\\\n    \\x06\\x04\\x04\\x04\\0\\x02\\x02\\x12\\x03N\\x06\\x13\\n\\x0e\\n\\x07\\x04\\x04\\x04\\0\\\n    \\x02\\x02\\x01\\x12\\x03N\\x06\\x0e\\n\\x0e\\n\\x07\\x04\\x04\\x04\\0\\x02\\x02\\x02\\x12\\\n    \\x03N\\x11\\x12\\n\\x0b\\n\\x04\\x04\\x04\\x02\\t\\x12\\x03P\\x04\\x15\\n\\x0c\\n\\x05\\x04\\\n    \\x04\\x02\\t\\x06\\x12\\x03P\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\t\\x01\\x12\\x03P\\n\\\n    \\x0f\\n\\x0c\\n\\x05\\x04\\x04\\x02\\t\\x03\\x12\\x03P\\x12\\x14\\n\\x0b\\n\\x04\\x04\\x04\\\n    \\x02\\n\\x12\\x03R\\x04\\x14\\n\\x0c\\n\\x05\\x04\\x04\\x02\\n\\x05\\x12\\x03R\\x04\\t\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\n\\x01\\x12\\x03R\\n\\x0e\\n\\x0c\\n\\x05\\x04\\x04\\x02\\n\\\n    \\x03\\x12\\x03R\\x11\\x13\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x0b\\x12\\x03S\\x04\\x14\\n\\x0c\\\n    \\n\\x05\\x04\\x04\\x02\\x0b\\x05\\x12\\x03S\\x04\\t\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x0b\\\n    \\x01\\x12\\x03S\\n\\x0e\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x0b\\x03\\x12\\x03S\\x11\\x13\\n\\n\\\n    \\n\\x02\\x04\\x05\\x12\\x04V\\0X\\x01\\n\\n\\n\\x03\\x04\\x05\\x01\\x12\\x03V\\x08\\x17\\n\\\n    \\x0b\\n\\x04\\x04\\x05\\x02\\0\\x12\\x03W\\x04$\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x04\\x12\\\n    \\x03W\\x04\\x0c\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x06\\x12\\x03W\\r\\x18\\n\\x0c\\n\\x05\\\n    \\x04\\x05\\x02\\0\\x01\\x12\\x03W\\x19\\x1f\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x03\\x12\\\n    \\x03W\\\"#\\n\\n\\n\\x02\\x04\\x06\\x12\\x04Z\\0\\\\\\x01\\n\\n\\n\\x03\\x04\\x06\\x01\\x12\\\n    \\x03Z\\x08\\x1b\\n\\x0b\\n\\x04\\x04\\x06\\x02\\0\\x12\\x03[\\x02)\\n\\x0c\\n\\x05\\x04\\\n    \\x06\\x02\\0\\x04\\x12\\x03[\\x02\\n\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x06\\x12\\x03[\\x0b\\\n    \\x1a\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x01\\x12\\x03[\\x1b$\\n\\x0c\\n\\x05\\x04\\x06\\x02\\\n    \\0\\x03\\x12\\x03['(\\n\\n\\n\\x02\\x04\\x07\\x12\\x04^\\0a\\x01\\n\\n\\n\\x03\\x04\\x07\\\n    \\x01\\x12\\x03^\\x08\\x17\\n\\x0b\\n\\x04\\x04\\x07\\x02\\0\\x12\\x03_\\x04\\x1c\\n\\x0c\\n\\\n    \\x05\\x04\\x07\\x02\\0\\x05\\x12\\x03_\\x04\\t\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x01\\x12\\\n    \\x03_\\n\\x17\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x03\\x12\\x03_\\x1a\\x1b\\n\\x0b\\n\\x04\\\n    \\x04\\x07\\x02\\x01\\x12\\x03`\\x04\\x1b\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x01\\x05\\x12\\\n    \\x03`\\x04\\t\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x01\\x01\\x12\\x03`\\n\\x16\\n\\x0c\\n\\x05\\\n    \\x04\\x07\\x02\\x01\\x03\\x12\\x03`\\x19\\x1a\\n\\n\\n\\x02\\x04\\x08\\x12\\x04c\\0h\\x01\\\n    \\n\\n\\n\\x03\\x04\\x08\\x01\\x12\\x03c\\x08\\x1a\\n\\x0b\\n\\x04\\x04\\x08\\x02\\0\\x12\\\n    \\x03d\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x08\\x02\\0\\x05\\x12\\x03d\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\x08\\x02\\0\\x01\\x12\\x03d\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x08\\x02\\0\\x03\\x12\\\n    \\x03d\\x18\\x19\\n\\x1c\\n\\x04\\x04\\x08\\x02\\x01\\x12\\x03e\\x02\\x1c\\\"\\x0f\\x20orde\\\n    r_id\\x20list\\n\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x01\\x04\\x12\\x03e\\x02\\n\\n\\x0c\\n\\\n    \\x05\\x04\\x08\\x02\\x01\\x05\\x12\\x03e\\x0b\\x10\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x01\\\n    \\x01\\x12\\x03e\\x11\\x17\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x01\\x03\\x12\\x03e\\x1a\\x1b\\n\\\n    \\x1b\\n\\x04\\x04\\x08\\x02\\x02\\x12\\x03f\\x02\\x12\\\"\\x0e\\x20active\\x20count\\n\\n\\\n    \\x0c\\n\\x05\\x04\\x08\\x02\\x02\\x05\\x12\\x03f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x08\\x02\\\n    \\x02\\x01\\x12\\x03f\\x08\\r\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x02\\x03\\x12\\x03f\\x10\\x11\\\n    \\n\\x0b\\n\\x04\\x04\\x08\\x02\\x03\\x12\\x03g\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x08\\x02\\\n    \\x03\\x05\\x12\\x03g\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x03\\x01\\x12\\x03g\\x08\\\n    \\x13\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x03\\x03\\x12\\x03g\\x16\\x17\\n\\n\\n\\x02\\x04\\t\\\n    \\x12\\x04j\\0m\\x01\\n\\n\\n\\x03\\x04\\t\\x01\\x12\\x03j\\x08\\x13\\n\\x0b\\n\\x04\\x04\\t\\\n    \\x02\\0\\x12\\x03k\\x02\\x20\\n\\x0c\\n\\x05\\x04\\t\\x02\\0\\x05\\x12\\x03k\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\t\\x02\\0\\x01\\x12\\x03k\\x08\\x1b\\n\\x0c\\n\\x05\\x04\\t\\x02\\0\\x03\\\n    \\x12\\x03k\\x1e\\x1f\\n\\x0b\\n\\x04\\x04\\t\\x02\\x01\\x12\\x03l\\x02\\x1f\\n\\x0c\\n\\x05\\\n    \\x04\\t\\x02\\x01\\x05\\x12\\x03l\\x02\\x07\\n\\x0c\\n\\x05\\x04\\t\\x02\\x01\\x01\\x12\\\n    \\x03l\\x08\\x1a\\n\\x0c\\n\\x05\\x04\\t\\x02\\x01\\x03\\x12\\x03l\\x1d\\x1e\\n\\n\\n\\x02\\\n    \\x04\\n\\x12\\x04o\\0s\\x01\\n\\n\\n\\x03\\x04\\n\\x01\\x12\\x03o\\x08\\x17\\n\\x0b\\n\\x04\\\n    \\x04\\n\\x02\\0\\x12\\x03p\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\x05\\x12\\x03p\\x02\\\n    \\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\x01\\x12\\x03p\\x08\\x15\\n\\x0c\\n\\x05\\x04\\n\\x02\\\n    \\0\\x03\\x12\\x03p\\x18\\x19\\n\\x0b\\n\\x04\\x04\\n\\x02\\x01\\x12\\x03q\\x02\\x19\\n\\x0c\\\n    \\n\\x05\\x04\\n\\x02\\x01\\x05\\x12\\x03q\\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\x01\\x01\\\n    \\x12\\x03q\\x08\\x14\\n\\x0c\\n\\x05\\x04\\n\\x02\\x01\\x03\\x12\\x03q\\x17\\x18\\n\\x0b\\n\\\n    \\x04\\x04\\n\\x02\\x02\\x12\\x03r\\x02\\\"\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x04\\x12\\x03r\\\n    \\x02\\n\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x06\\x12\\x03r\\x0b\\x16\\n\\x0c\\n\\x05\\x04\\n\\\n    \\x02\\x02\\x01\\x12\\x03r\\x17\\x1d\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x03\\x12\\x03r\\x20\\\n    !\\n\\n\\n\\x02\\x04\\x0b\\x12\\x04u\\0x\\x01\\n\\n\\n\\x03\\x04\\x0b\\x01\\x12\\x03u\\x08\\\n    \\x19\\n\\x0b\\n\\x04\\x04\\x0b\\x02\\0\\x12\\x03v\\x02\\x11\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\\n    \\0\\x05\\x12\\x03v\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\0\\x01\\x12\\x03v\\x08\\x0c\\n\\\n    \\x0c\\n\\x05\\x04\\x0b\\x02\\0\\x03\\x12\\x03v\\x0f\\x10\\n\\x0b\\n\\x04\\x04\\x0b\\x02\\\n    \\x01\\x12\\x03w\\x02\\x11\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\x01\\x05\\x12\\x03w\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x0b\\x02\\x01\\x01\\x12\\x03w\\x08\\x0c\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\\n    \\x01\\x03\\x12\\x03w\\x0f\\x10\\n\\x0b\\n\\x02\\x04\\x0c\\x12\\x05z\\0\\x80\\x01\\x01\\n\\n\\\n    \\n\\x03\\x04\\x0c\\x01\\x12\\x03z\\x08\\x17\\n\\x0b\\n\\x04\\x04\\x0c\\x02\\0\\x12\\x03{\\\n    \\x02-\\n\\x0c\\n\\x05\\x04\\x0c\\x02\\0\\x04\\x12\\x03{\\x02\\n\\n\\x0c\\n\\x05\\x04\\x0c\\\n    \\x02\\0\\x06\\x12\\x03{\\x0b\\x19\\n\\x0c\\n\\x05\\x04\\x0c\\x02\\0\\x01\\x12\\x03{\\x1a(\\\n    \\n\\x0c\\n\\x05\\x04\\x0c\\x02\\0\\x03\\x12\\x03{+,\\n\\x0c\\n\\x04\\x04\\x0c\\x03\\0\\x12\\\n    \\x04|\\x02\\x7f\\x03\\n\\x0c\\n\\x05\\x04\\x0c\\x03\\0\\x01\\x12\\x03|\\n\\x18\\n\\r\\n\\x06\\\n    \\x04\\x0c\\x03\\0\\x02\\0\\x12\\x03}\\x04\\x13\\n\\x0e\\n\\x07\\x04\\x0c\\x03\\0\\x02\\0\\\n    \\x05\\x12\\x03}\\x04\\n\\n\\x0e\\n\\x07\\x04\\x0c\\x03\\0\\x02\\0\\x01\\x12\\x03}\\x0b\\x0e\\\n    \\n\\x0e\\n\\x07\\x04\\x0c\\x03\\0\\x02\\0\\x03\\x12\\x03}\\x11\\x12\\n\\r\\n\\x06\\x04\\x0c\\\n    \\x03\\0\\x02\\x01\\x12\\x03~\\x04\\x14\\n\\x0e\\n\\x07\\x04\\x0c\\x03\\0\\x02\\x01\\x05\\\n    \\x12\\x03~\\x04\\t\\n\\x0e\\n\\x07\\x04\\x0c\\x03\\0\\x02\\x01\\x01\\x12\\x03~\\n\\x0f\\n\\\n    \\x0e\\n\\x07\\x04\\x0c\\x03\\0\\x02\\x01\\x03\\x12\\x03~\\x12\\x13\\n\\x17\\n\\x02\\x04\\r\\\n    \\x12\\x06\\x83\\x01\\0\\xf0\\x01\\x01\\x1a\\t\\x20Account\\x20\\n\\x0b\\n\\x03\\x04\\r\\\n    \\x01\\x12\\x04\\x83\\x01\\x08\\x0f\\n\\x20\\n\\x04\\x04\\r\\x03\\0\\x12\\x06\\x85\\x01\\x02\\\n    \\x88\\x01\\x03\\x1a\\x10\\x20frozen\\x20balance\\x20\\n\\r\\n\\x05\\x04\\r\\x03\\0\\x01\\\n    \\x12\\x04\\x85\\x01\\n\\x10\\n(\\n\\x06\\x04\\r\\x03\\0\\x02\\0\\x12\\x04\\x86\\x01\\x04\\\n    \\x1d\\\"\\x18\\x20the\\x20frozen\\x20trx\\x20balance\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\0\\\n    \\x02\\0\\x05\\x12\\x04\\x86\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\0\\x02\\0\\x01\\x12\\\n    \\x04\\x86\\x01\\n\\x18\\n\\x0f\\n\\x07\\x04\\r\\x03\\0\\x02\\0\\x03\\x12\\x04\\x86\\x01\\x1b\\\n    \\x1c\\n!\\n\\x06\\x04\\r\\x03\\0\\x02\\x01\\x12\\x04\\x87\\x01\\x04\\x1a\\\"\\x11\\x20the\\\n    \\x20expire\\x20time\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\0\\x02\\x01\\x05\\x12\\x04\\x87\\x01\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\0\\x02\\x01\\x01\\x12\\x04\\x87\\x01\\n\\x15\\n\\x0f\\n\\\n    \\x07\\x04\\r\\x03\\0\\x02\\x01\\x03\\x12\\x04\\x87\\x01\\x18\\x19\\n!\\n\\x04\\x04\\r\\x02\\\n    \\0\\x12\\x04\\x8a\\x01\\x02\\x19\\x1a\\x13\\x20account\\x20nick\\x20name\\n\\n\\r\\n\\\n    \\x05\\x04\\r\\x02\\0\\x05\\x12\\x04\\x8a\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\0\\x01\\\n    \\x12\\x04\\x8a\\x01\\x08\\x14\\n\\r\\n\\x05\\x04\\r\\x02\\0\\x03\\x12\\x04\\x8a\\x01\\x17\\\n    \\x18\\n\\x0c\\n\\x04\\x04\\r\\x02\\x01\\x12\\x04\\x8b\\x01\\x02\\x17\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x01\\x06\\x12\\x04\\x8b\\x01\\x02\\r\\n\\r\\n\\x05\\x04\\r\\x02\\x01\\x01\\x12\\x04\\\n    \\x8b\\x01\\x0e\\x12\\n\\r\\n\\x05\\x04\\r\\x02\\x01\\x03\\x12\\x04\\x8b\\x01\\x15\\x16\\n\\\"\\\n    \\n\\x04\\x04\\r\\x02\\x02\\x12\\x04\\x8d\\x01\\x02\\x14\\x1a\\x14\\x20the\\x20create\\\n    \\x20address\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x02\\x05\\x12\\x04\\x8d\\x01\\x02\\x07\\n\\r\\n\\\n    \\x05\\x04\\r\\x02\\x02\\x01\\x12\\x04\\x8d\\x01\\x08\\x0f\\n\\r\\n\\x05\\x04\\r\\x02\\x02\\\n    \\x03\\x12\\x04\\x8d\\x01\\x12\\x13\\n\\x1f\\n\\x04\\x04\\r\\x02\\x03\\x12\\x04\\x8f\\x01\\\n    \\x02\\x14\\x1a\\x11\\x20the\\x20trx\\x20balance\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x03\\x05\\\n    \\x12\\x04\\x8f\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x03\\x01\\x12\\x04\\x8f\\x01\\x08\\\n    \\x0f\\n\\r\\n\\x05\\x04\\r\\x02\\x03\\x03\\x12\\x04\\x8f\\x01\\x12\\x13\\n\\x19\\n\\x04\\x04\\\n    \\r\\x02\\x04\\x12\\x04\\x91\\x01\\x02\\x1a\\x1a\\x0b\\x20the\\x20votes\\n\\n\\r\\n\\x05\\\n    \\x04\\r\\x02\\x04\\x04\\x12\\x04\\x91\\x01\\x02\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x04\\x06\\x12\\\n    \\x04\\x91\\x01\\x0b\\x0f\\n\\r\\n\\x05\\x04\\r\\x02\\x04\\x01\\x12\\x04\\x91\\x01\\x10\\x15\\\n    \\n\\r\\n\\x05\\x04\\r\\x02\\x04\\x03\\x12\\x04\\x91\\x01\\x18\\x19\\n5\\n\\x04\\x04\\r\\x02\\\n    \\x05\\x12\\x04\\x93\\x01\\x02\\x1f\\x1a'\\x20the\\x20other\\x20asset\\x20owned\\x20b\\\n    y\\x20this\\x20account\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x05\\x06\\x12\\x04\\x93\\x01\\x02\\\n    \\x14\\n\\r\\n\\x05\\x04\\r\\x02\\x05\\x01\\x12\\x04\\x93\\x01\\x15\\x1a\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x05\\x03\\x12\\x04\\x93\\x01\\x1d\\x1e\\nF\\n\\x04\\x04\\r\\x02\\x06\\x12\\x04\\x96\\\n    \\x01\\x02\\\"\\x1a8\\x20the\\x20other\\x20asset\\x20owned\\x20by\\x20this\\x20accou\\\n    nt\\xef\\xbc\\x8ckey\\x20is\\x20assetId\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x06\\x06\\x12\\x04\\\n    \\x96\\x01\\x02\\x14\\n\\r\\n\\x05\\x04\\r\\x02\\x06\\x01\\x12\\x04\\x96\\x01\\x15\\x1c\\n\\r\\\n    \\n\\x05\\x04\\r\\x02\\x06\\x03\\x12\\x04\\x96\\x01\\x1f!\\n0\\n\\x04\\x04\\r\\x02\\x07\\x12\\\n    \\x04\\x99\\x01\\x02\\x1d\\x1a\\\"\\x20the\\x20frozen\\x20balance\\x20for\\x20bandwid\\\n    th\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x07\\x04\\x12\\x04\\x99\\x01\\x02\\n\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x07\\x06\\x12\\x04\\x99\\x01\\x0b\\x11\\n\\r\\n\\x05\\x04\\r\\x02\\x07\\x01\\x12\\x04\\\n    \\x99\\x01\\x12\\x18\\n\\r\\n\\x05\\x04\\r\\x02\\x07\\x03\\x12\\x04\\x99\\x01\\x1b\\x1c\\n*\\\n    \\n\\x04\\x04\\r\\x02\\x08\\x12\\x04\\x9b\\x01\\x02\\x16\\x1a\\x1c\\x20bandwidth,\\x20ge\\\n    t\\x20from\\x20frozen\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x08\\x05\\x12\\x04\\x9b\\x01\\x02\\\n    \\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x08\\x01\\x12\\x04\\x9b\\x01\\x08\\x11\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x08\\x03\\x12\\x04\\x9b\\x01\\x14\\x15\\nH\\n\\x04\\x04\\r\\x02\\t\\x12\\x04\\x9d\\\n    \\x01\\x02=\\x1a:Frozen\\x20balance\\x20provided\\x20by\\x20other\\x20accounts\\\n    \\x20to\\x20this\\x20account\\n\\n\\r\\n\\x05\\x04\\r\\x02\\t\\x05\\x12\\x04\\x9d\\x01\\\n    \\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\t\\x01\\x12\\x04\\x9d\\x01\\x087\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\t\\x03\\x12\\x04\\x9d\\x01:<\\n<\\n\\x04\\x04\\r\\x02\\n\\x12\\x04\\x9f\\x01\\x024\\\n    \\x1a.Freeze\\x20and\\x20provide\\x20balances\\x20to\\x20other\\x20accounts\\n\\n\\\n    \\r\\n\\x05\\x04\\r\\x02\\n\\x05\\x12\\x04\\x9f\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\n\\\n    \\x01\\x12\\x04\\x9f\\x01\\x08.\\n\\r\\n\\x05\\x04\\r\\x02\\n\\x03\\x12\\x04\\x9f\\x0113\\n\\\n    \\x0c\\n\\x04\\x04\\r\\x02\\x0b\\x12\\x04\\xa1\\x01\\x02\\x1c\\n\\r\\n\\x05\\x04\\r\\x02\\x0b\\\n    \\x05\\x12\\x04\\xa1\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x0b\\x01\\x12\\x04\\xa1\\x01\\\n    \\x08\\x16\\n\\r\\n\\x05\\x04\\r\\x02\\x0b\\x03\\x12\\x04\\xa1\\x01\\x19\\x1b\\n\\x0c\\n\\x04\\\n    \\x04\\r\\x02\\x0c\\x12\\x04\\xa2\\x01\\x02\\x19\\n\\r\\n\\x05\\x04\\r\\x02\\x0c\\x06\\x12\\\n    \\x04\\xa2\\x01\\x02\\x08\\n\\r\\n\\x05\\x04\\r\\x02\\x0c\\x01\\x12\\x04\\xa2\\x01\\t\\x13\\n\\\n    \\r\\n\\x05\\x04\\r\\x02\\x0c\\x03\\x12\\x04\\xa2\\x01\\x16\\x18\\n\\x0c\\n\\x04\\x04\\r\\x02\\\n    \\r\\x12\\x04\\xa4\\x01\\x02\\x1c\\n\\r\\n\\x05\\x04\\r\\x02\\r\\x05\\x12\\x04\\xa4\\x01\\x02\\\n    \\x06\\n\\r\\n\\x05\\x04\\r\\x02\\r\\x01\\x12\\x04\\xa4\\x01\\x07\\x16\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\r\\x03\\x12\\x04\\xa4\\x01\\x19\\x1b\\n(\\n\\x04\\x04\\r\\x02\\x0e\\x12\\x04\\xa7\\\n    \\x01\\x02\\x1b\\x1a\\x1a\\x20this\\x20account\\x20create\\x20time\\n\\n\\r\\n\\x05\\\n    \\x04\\r\\x02\\x0e\\x05\\x12\\x04\\xa7\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x0e\\x01\\\n    \\x12\\x04\\xa7\\x01\\x08\\x13\\n\\r\\n\\x05\\x04\\r\\x02\\x0e\\x03\\x12\\x04\\xa7\\x01\\x16\\\n    \\x1a\\nc\\n\\x04\\x04\\r\\x02\\x0f\\x12\\x04\\xa9\\x01\\x02\\\"\\x1aU\\x20this\\x20last\\\n    \\x20operation\\x20time,\\x20including\\x20transfer,\\x20voting\\x20and\\x20so\\\n    \\x20on.\\x20//FIXME\\x20fix\\x20grammar\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x0f\\x05\\x12\\\n    \\x04\\xa9\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x0f\\x01\\x12\\x04\\xa9\\x01\\x08\\x1c\\\n    \\n\\r\\n\\x05\\x04\\r\\x02\\x0f\\x03\\x12\\x04\\xa9\\x01\\x1f!\\n1\\n\\x04\\x04\\r\\x02\\x10\\\n    \\x12\\x04\\xab\\x01\\x02\\x19\\x1a#\\x20witness\\x20block\\x20producing\\x20allowa\\\n    nce\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x10\\x05\\x12\\x04\\xab\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\\n    \\r\\x02\\x10\\x01\\x12\\x04\\xab\\x01\\x08\\x11\\n\\r\\n\\x05\\x04\\r\\x02\\x10\\x03\\x12\\\n    \\x04\\xab\\x01\\x14\\x18\\n\\\"\\n\\x04\\x04\\r\\x02\\x11\\x12\\x04\\xad\\x01\\x02$\\x1a\\\n    \\x14\\x20last\\x20withdraw\\x20time\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x11\\x05\\x12\\x04\\\n    \\xad\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x11\\x01\\x12\\x04\\xad\\x01\\x08\\x1c\\n\\r\\\n    \\n\\x05\\x04\\r\\x02\\x11\\x03\\x12\\x04\\xad\\x01\\x1f#\\n\\x1f\\n\\x04\\x04\\r\\x02\\x12\\\n    \\x12\\x04\\xaf\\x01\\x02\\x12\\x1a\\x11\\x20not\\x20used\\x20so\\x20far\\n\\n\\r\\n\\x05\\\n    \\x04\\r\\x02\\x12\\x05\\x12\\x04\\xaf\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x12\\x01\\\n    \\x12\\x04\\xaf\\x01\\x08\\x0c\\n\\r\\n\\x05\\x04\\r\\x02\\x12\\x03\\x12\\x04\\xaf\\x01\\x0f\\\n    \\x11\\n\\x0c\\n\\x04\\x04\\r\\x02\\x13\\x12\\x04\\xb0\\x01\\x02\\x17\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x13\\x05\\x12\\x04\\xb0\\x01\\x02\\x06\\n\\r\\n\\x05\\x04\\r\\x02\\x13\\x01\\x12\\x04\\\n    \\xb0\\x01\\x07\\x11\\n\\r\\n\\x05\\x04\\r\\x02\\x13\\x03\\x12\\x04\\xb0\\x01\\x14\\x16\\n\\\n    \\x0c\\n\\x04\\x04\\r\\x02\\x14\\x12\\x04\\xb1\\x01\\x02\\x19\\n\\r\\n\\x05\\x04\\r\\x02\\x14\\\n    \\x05\\x12\\x04\\xb1\\x01\\x02\\x06\\n\\r\\n\\x05\\x04\\r\\x02\\x14\\x01\\x12\\x04\\xb1\\x01\\\n    \\x07\\x13\\n\\r\\n\\x05\\x04\\r\\x02\\x14\\x03\\x12\\x04\\xb1\\x01\\x16\\x18\\n.\\n\\x04\\\n    \\x04\\r\\x02\\x15\\x12\\x04\\xb3\\x01\\x02%\\x1a\\x20\\x20frozen\\x20asset(for\\x20as\\\n    set\\x20issuer)\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x15\\x04\\x12\\x04\\xb3\\x01\\x02\\n\\n\\r\\n\\\n    \\x05\\x04\\r\\x02\\x15\\x06\\x12\\x04\\xb3\\x01\\x0b\\x11\\n\\r\\n\\x05\\x04\\r\\x02\\x15\\\n    \\x01\\x12\\x04\\xb3\\x01\\x12\\x1f\\n\\r\\n\\x05\\x04\\r\\x02\\x15\\x03\\x12\\x04\\xb3\\x01\\\n    \\\"$\\n!\\n\\x04\\x04\\r\\x02\\x16\\x12\\x04\\xb5\\x01\\x02\\x1f\\x1a\\x13\\x20asset_issu\\\n    ed_name\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x16\\x05\\x12\\x04\\xb5\\x01\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\r\\x02\\x16\\x01\\x12\\x04\\xb5\\x01\\x08\\x19\\n\\r\\n\\x05\\x04\\r\\x02\\x16\\x03\\\n    \\x12\\x04\\xb5\\x01\\x1c\\x1e\\n\\x0c\\n\\x04\\x04\\r\\x02\\x17\\x12\\x04\\xb6\\x01\\x02\\\n    \\x1d\\n\\r\\n\\x05\\x04\\r\\x02\\x17\\x05\\x12\\x04\\xb6\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x17\\x01\\x12\\x04\\xb6\\x01\\x08\\x17\\n\\r\\n\\x05\\x04\\r\\x02\\x17\\x03\\x12\\x04\\\n    \\xb6\\x01\\x1a\\x1c\\n\\x0c\\n\\x04\\x04\\r\\x02\\x18\\x12\\x04\\xb7\\x01\\x026\\n\\r\\n\\\n    \\x05\\x04\\r\\x02\\x18\\x06\\x12\\x04\\xb7\\x01\\x02\\x14\\n\\r\\n\\x05\\x04\\r\\x02\\x18\\\n    \\x01\\x12\\x04\\xb7\\x01\\x150\\n\\r\\n\\x05\\x04\\r\\x02\\x18\\x03\\x12\\x04\\xb7\\x0135\\\n    \\n\\x0c\\n\\x04\\x04\\r\\x02\\x19\\x12\\x04\\xb8\\x01\\x028\\n\\r\\n\\x05\\x04\\r\\x02\\x19\\\n    \\x06\\x12\\x04\\xb8\\x01\\x02\\x14\\n\\r\\n\\x05\\x04\\r\\x02\\x19\\x01\\x12\\x04\\xb8\\x01\\\n    \\x152\\n\\r\\n\\x05\\x04\\r\\x02\\x19\\x03\\x12\\x04\\xb8\\x0157\\n\\x0c\\n\\x04\\x04\\r\\\n    \\x02\\x1a\\x12\\x04\\xb9\\x01\\x02\\x1c\\n\\r\\n\\x05\\x04\\r\\x02\\x1a\\x05\\x12\\x04\\xb9\\\n    \\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x1a\\x01\\x12\\x04\\xb9\\x01\\x08\\x16\\n\\r\\n\\\n    \\x05\\x04\\r\\x02\\x1a\\x03\\x12\\x04\\xb9\\x01\\x19\\x1b\\n\\x0c\\n\\x04\\x04\\r\\x02\\x1b\\\n    \\x12\\x04\\xba\\x01\\x02/\\n\\r\\n\\x05\\x04\\r\\x02\\x1b\\x06\\x12\\x04\\xba\\x01\\x02\\\n    \\x14\\n\\r\\n\\x05\\x04\\r\\x02\\x1b\\x01\\x12\\x04\\xba\\x01\\x15)\\n\\r\\n\\x05\\x04\\r\\\n    \\x02\\x1b\\x03\\x12\\x04\\xba\\x01,.\\n\\x0c\\n\\x04\\x04\\r\\x02\\x1c\\x12\\x04\\xbb\\x01\\\n    \\x021\\n\\r\\n\\x05\\x04\\r\\x02\\x1c\\x06\\x12\\x04\\xbb\\x01\\x02\\x14\\n\\r\\n\\x05\\x04\\\n    \\r\\x02\\x1c\\x01\\x12\\x04\\xbb\\x01\\x15+\\n\\r\\n\\x05\\x04\\r\\x02\\x1c\\x03\\x12\\x04\\\n    \\xbb\\x01.0\\n\\x0c\\n\\x04\\x04\\r\\x02\\x1d\\x12\\x04\\xbc\\x01\\x02!\\n\\r\\n\\x05\\x04\\\n    \\r\\x02\\x1d\\x05\\x12\\x04\\xbc\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x1d\\x01\\x12\\\n    \\x04\\xbc\\x01\\x08\\x1b\\n\\r\\n\\x05\\x04\\r\\x02\\x1d\\x03\\x12\\x04\\xbc\\x01\\x1e\\x20\\\n    \\n\\x0c\\n\\x04\\x04\\r\\x02\\x1e\\x12\\x04\\xbd\\x01\\x02&\\n\\r\\n\\x05\\x04\\r\\x02\\x1e\\\n    \\x05\\x12\\x04\\xbd\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x1e\\x01\\x12\\x04\\xbd\\x01\\\n    \\x08\\x20\\n\\r\\n\\x05\\x04\\r\\x02\\x1e\\x03\\x12\\x04\\xbd\\x01#%\\n>\\n\\x04\\x04\\r\\\n    \\x02\\x1f\\x12\\x04\\xc0\\x01\\x02\\x18\\x1a0\\x20the\\x20identity\\x20of\\x20this\\\n    \\x20account,\\x20case\\x20insensitive\\n\\n\\r\\n\\x05\\x04\\r\\x02\\x1f\\x05\\x12\\\n    \\x04\\xc0\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x1f\\x01\\x12\\x04\\xc0\\x01\\x08\\x12\\\n    \\n\\r\\n\\x05\\x04\\r\\x02\\x1f\\x03\\x12\\x04\\xc0\\x01\\x15\\x17\\n\\x0c\\n\\x04\\x04\\r\\\n    \\x02\\x20\\x12\\x04\\xc2\\x01\\x02\\x1d\\n\\r\\n\\x05\\x04\\r\\x02\\x20\\x05\\x12\\x04\\xc2\\\n    \\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02\\x20\\x01\\x12\\x04\\xc2\\x01\\x08\\x17\\n\\r\\n\\\n    \\x05\\x04\\r\\x02\\x20\\x03\\x12\\x04\\xc2\\x01\\x1a\\x1c\\n\\x0c\\n\\x04\\x04\\r\\x02!\\\n    \\x12\\x04\\xc3\\x01\\x02!\\n\\r\\n\\x05\\x04\\r\\x02!\\x05\\x12\\x04\\xc3\\x01\\x02\\x06\\n\\\n    \\r\\n\\x05\\x04\\r\\x02!\\x01\\x12\\x04\\xc3\\x01\\x07\\x1b\\n\\r\\n\\x05\\x04\\r\\x02!\\x03\\\n    \\x12\\x04\\xc3\\x01\\x1e\\x20\\n\\x0e\\n\\x04\\x04\\r\\x03\\x07\\x12\\x06\\xc5\\x01\\x02\\\n    \\xdb\\x01\\x03\\n\\r\\n\\x05\\x04\\r\\x03\\x07\\x01\\x12\\x04\\xc5\\x01\\n\\x19\\n2\\n\\x06\\\n    \\x04\\r\\x03\\x07\\x02\\0\\x12\\x04\\xc7\\x01\\x04\\x1b\\x1a\\\"\\x20energy\\x20resource\\\n    ,\\x20get\\x20from\\x20frozen\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\0\\x05\\x12\\x04\\\n    \\xc7\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\0\\x01\\x12\\x04\\xc7\\x01\\n\\x16\\\n    \\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\0\\x03\\x12\\x04\\xc7\\x01\\x19\\x1a\\n/\\n\\x06\\\n    \\x04\\r\\x03\\x07\\x02\\x01\\x12\\x04\\xc9\\x01\\x04)\\x1a\\x1f\\x20the\\x20frozen\\x20\\\n    balance\\x20for\\x20energy\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x01\\x06\\x12\\x04\\\n    \\xc9\\x01\\x04\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x01\\x01\\x12\\x04\\xc9\\x01\\x0b\\\n    $\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x01\\x03\\x12\\x04\\xc9\\x01'(\\n\\x0e\\n\\x06\\\n    \\x04\\r\\x03\\x07\\x02\\x02\\x12\\x04\\xca\\x01\\x04-\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\\n    \\x02\\x02\\x05\\x12\\x04\\xca\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x02\\x01\\\n    \\x12\\x04\\xca\\x01\\n(\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x02\\x03\\x12\\x04\\xca\\\n    \\x01+,\\nJ\\n\\x06\\x04\\r\\x03\\x07\\x02\\x03\\x12\\x04\\xcd\\x01\\x04;\\x1a:Frozen\\\n    \\x20balance\\x20provided\\x20by\\x20other\\x20accounts\\x20to\\x20this\\x20acco\\\n    unt\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x03\\x05\\x12\\x04\\xcd\\x01\\x04\\t\\n\\x0f\\\n    \\n\\x07\\x04\\r\\x03\\x07\\x02\\x03\\x01\\x12\\x04\\xcd\\x01\\n6\\n\\x0f\\n\\x07\\x04\\r\\\n    \\x03\\x07\\x02\\x03\\x03\\x12\\x04\\xcd\\x019:\\n;\\n\\x06\\x04\\r\\x03\\x07\\x02\\x04\\\n    \\x12\\x04\\xcf\\x01\\x042\\x1a+Frozen\\x20balances\\x20provided\\x20to\\x20other\\\n    \\x20accounts\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x04\\x05\\x12\\x04\\xcf\\x01\\x04\\\n    \\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x04\\x01\\x12\\x04\\xcf\\x01\\n-\\n\\x0f\\n\\x07\\\n    \\x04\\r\\x03\\x07\\x02\\x04\\x03\\x12\\x04\\xcf\\x0101\\n3\\n\\x06\\x04\\r\\x03\\x07\\x02\\\n    \\x05\\x12\\x04\\xd2\\x01\\x04\\x1c\\x1a#\\x20storage\\x20resource,\\x20get\\x20from\\\n    \\x20market\\n\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x05\\x05\\x12\\x04\\xd2\\x01\\x04\\t\\\n    \\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x05\\x01\\x12\\x04\\xd2\\x01\\n\\x17\\n\\x0f\\n\\x07\\\n    \\x04\\r\\x03\\x07\\x02\\x05\\x03\\x12\\x04\\xd2\\x01\\x1a\\x1b\\n\\x0e\\n\\x06\\x04\\r\\x03\\\n    \\x07\\x02\\x06\\x12\\x04\\xd3\\x01\\x04\\x1c\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x06\\\n    \\x05\\x12\\x04\\xd3\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x06\\x01\\x12\\x04\\\n    \\xd3\\x01\\n\\x17\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x06\\x03\\x12\\x04\\xd3\\x01\\x1a\\\n    \\x1b\\n\\x0e\\n\\x06\\x04\\r\\x03\\x07\\x02\\x07\\x12\\x04\\xd4\\x01\\x04+\\n\\x0f\\n\\x07\\\n    \\x04\\r\\x03\\x07\\x02\\x07\\x05\\x12\\x04\\xd4\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\\n    \\x07\\x02\\x07\\x01\\x12\\x04\\xd4\\x01\\n&\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x07\\\n    \\x03\\x12\\x04\\xd4\\x01)*\\n\\x0e\\n\\x06\\x04\\r\\x03\\x07\\x02\\x08\\x12\\x04\\xd6\\x01\\\n    \\x04!\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x08\\x05\\x12\\x04\\xd6\\x01\\x04\\t\\n\\x0f\\\n    \\n\\x07\\x04\\r\\x03\\x07\\x02\\x08\\x01\\x12\\x04\\xd6\\x01\\n\\x1c\\n\\x0f\\n\\x07\\x04\\r\\\n    \\x03\\x07\\x02\\x08\\x03\\x12\\x04\\xd6\\x01\\x1f\\x20\\n\\x0e\\n\\x06\\x04\\r\\x03\\x07\\\n    \\x02\\t\\x12\\x04\\xd8\\x01\\x045\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\t\\x05\\x12\\x04\\\n    \\xd8\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\t\\x01\\x12\\x04\\xd8\\x01\\n/\\n\\\n    \\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\t\\x03\\x12\\x04\\xd8\\x0124\\n\\x0e\\n\\x06\\x04\\r\\\n    \\x03\\x07\\x02\\n\\x12\\x04\\xd9\\x01\\x04>\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\n\\x05\\\n    \\x12\\x04\\xd9\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\n\\x01\\x12\\x04\\xd9\\\n    \\x01\\n8\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\n\\x03\\x12\\x04\\xd9\\x01;=\\n\\x0e\\n\\\n    \\x06\\x04\\r\\x03\\x07\\x02\\x0b\\x12\\x04\\xda\\x01\\x04&\\n\\x0f\\n\\x07\\x04\\r\\x03\\\n    \\x07\\x02\\x0b\\x05\\x12\\x04\\xda\\x01\\x04\\x08\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\\n    \\x0b\\x01\\x12\\x04\\xda\\x01\\t\\x20\\n\\x0f\\n\\x07\\x04\\r\\x03\\x07\\x02\\x0b\\x03\\x12\\\n    \\x04\\xda\\x01#%\\n\\x0c\\n\\x04\\x04\\r\\x02\\\"\\x12\\x04\\xdc\\x01\\x02(\\n\\r\\n\\x05\\\n    \\x04\\r\\x02\\\"\\x06\\x12\\x04\\xdc\\x01\\x02\\x11\\n\\r\\n\\x05\\x04\\r\\x02\\\"\\x01\\x12\\\n    \\x04\\xdc\\x01\\x12\\\"\\n\\r\\n\\x05\\x04\\r\\x02\\\"\\x03\\x12\\x04\\xdc\\x01%'\\n\\x0c\\n\\\n    \\x04\\x04\\r\\x02#\\x12\\x04\\xdd\\x01\\x02\\x16\\n\\r\\n\\x05\\x04\\r\\x02#\\x05\\x12\\x04\\\n    \\xdd\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02#\\x01\\x12\\x04\\xdd\\x01\\x08\\x10\\n\\r\\n\\\n    \\x05\\x04\\r\\x02#\\x03\\x12\\x04\\xdd\\x01\\x13\\x15\\n\\x0c\\n\\x04\\x04\\r\\x02$\\x12\\\n    \\x04\\xde\\x01\\x02#\\n\\r\\n\\x05\\x04\\r\\x02$\\x06\\x12\\x04\\xde\\x01\\x02\\x0c\\n\\r\\n\\\n    \\x05\\x04\\r\\x02$\\x01\\x12\\x04\\xde\\x01\\r\\x1d\\n\\r\\n\\x05\\x04\\r\\x02$\\x03\\x12\\\n    \\x04\\xde\\x01\\x20\\\"\\n\\x0c\\n\\x04\\x04\\r\\x02%\\x12\\x04\\xdf\\x01\\x02%\\n\\r\\n\\x05\\\n    \\x04\\r\\x02%\\x06\\x12\\x04\\xdf\\x01\\x02\\x0c\\n\\r\\n\\x05\\x04\\r\\x02%\\x01\\x12\\x04\\\n    \\xdf\\x01\\r\\x1f\\n\\r\\n\\x05\\x04\\r\\x02%\\x03\\x12\\x04\\xdf\\x01\\\"$\\n\\x0c\\n\\x04\\\n    \\x04\\r\\x02&\\x12\\x04\\xe0\\x01\\x02-\\n\\r\\n\\x05\\x04\\r\\x02&\\x04\\x12\\x04\\xe0\\\n    \\x01\\x02\\n\\n\\r\\n\\x05\\x04\\r\\x02&\\x06\\x12\\x04\\xe0\\x01\\x0b\\x15\\n\\r\\n\\x05\\\n    \\x04\\r\\x02&\\x01\\x12\\x04\\xe0\\x01\\x16'\\n\\r\\n\\x05\\x04\\r\\x02&\\x03\\x12\\x04\\\n    \\xe0\\x01*,\\n\\x0e\\n\\x04\\x04\\r\\x03\\x08\\x12\\x06\\xe2\\x01\\x02\\xe5\\x01\\x03\\n\\r\\\n    \\n\\x05\\x04\\r\\x03\\x08\\x01\\x12\\x04\\xe2\\x01\\n\\x12\\n\\x0e\\n\\x06\\x04\\r\\x03\\x08\\\n    \\x02\\0\\x12\\x04\\xe3\\x01\\x04\\x1a\\n\\x0f\\n\\x07\\x04\\r\\x03\\x08\\x02\\0\\x06\\x12\\\n    \\x04\\xe3\\x01\\x04\\x10\\n\\x0f\\n\\x07\\x04\\r\\x03\\x08\\x02\\0\\x01\\x12\\x04\\xe3\\x01\\\n    \\x11\\x15\\n\\x0f\\n\\x07\\x04\\r\\x03\\x08\\x02\\0\\x03\\x12\\x04\\xe3\\x01\\x18\\x19\\n\\\n    \\x0e\\n\\x06\\x04\\r\\x03\\x08\\x02\\x01\\x12\\x04\\xe4\\x01\\x04\\x15\\n\\x0f\\n\\x07\\x04\\\n    \\r\\x03\\x08\\x02\\x01\\x05\\x12\\x04\\xe4\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\x08\\\n    \\x02\\x01\\x01\\x12\\x04\\xe4\\x01\\n\\x10\\n\\x0f\\n\\x07\\x04\\r\\x03\\x08\\x02\\x01\\x03\\\n    \\x12\\x04\\xe4\\x01\\x13\\x14\\n\\x0e\\n\\x04\\x04\\r\\x03\\t\\x12\\x06\\xe6\\x01\\x02\\xea\\\n    \\x01\\x03\\n\\r\\n\\x05\\x04\\r\\x03\\t\\x01\\x12\\x04\\xe6\\x01\\n\\x14\\n\\x0e\\n\\x06\\x04\\\n    \\r\\x03\\t\\x02\\0\\x12\\x04\\xe7\\x01\\x04\\x1a\\n\\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\0\\x06\\\n    \\x12\\x04\\xe7\\x01\\x04\\x10\\n\\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\0\\x01\\x12\\x04\\xe7\\\n    \\x01\\x11\\x15\\n\\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\0\\x03\\x12\\x04\\xe7\\x01\\x18\\x19\\n\\\n    \\x0e\\n\\x06\\x04\\r\\x03\\t\\x02\\x01\\x12\\x04\\xe8\\x01\\x04\\x1e\\n\\x0f\\n\\x07\\x04\\r\\\n    \\x03\\t\\x02\\x01\\x05\\x12\\x04\\xe8\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\x01\\\n    \\x01\\x12\\x04\\xe8\\x01\\n\\x19\\n\\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\x01\\x03\\x12\\x04\\\n    \\xe8\\x01\\x1c\\x1d\\n\\x0e\\n\\x06\\x04\\r\\x03\\t\\x02\\x02\\x12\\x04\\xe9\\x01\\x04#\\n\\\n    \\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\x02\\x05\\x12\\x04\\xe9\\x01\\x04\\t\\n\\x0f\\n\\x07\\x04\\\n    \\r\\x03\\t\\x02\\x02\\x01\\x12\\x04\\xe9\\x01\\n\\x1e\\n\\x0f\\n\\x07\\x04\\r\\x03\\t\\x02\\\n    \\x02\\x03\\x12\\x04\\xe9\\x01!\\\"\\n\\x0c\\n\\x04\\x04\\r\\x02'\\x12\\x04\\xeb\\x01\\x02\\\"\\\n    \\n\\r\\n\\x05\\x04\\r\\x02'\\x04\\x12\\x04\\xeb\\x01\\x02\\n\\n\\r\\n\\x05\\x04\\r\\x02'\\x06\\\n    \\x12\\x04\\xeb\\x01\\x0b\\x13\\n\\r\\n\\x05\\x04\\r\\x02'\\x01\\x12\\x04\\xeb\\x01\\x14\\\n    \\x1c\\n\\r\\n\\x05\\x04\\r\\x02'\\x03\\x12\\x04\\xeb\\x01\\x1f!\\n\\x0c\\n\\x04\\x04\\r\\x02\\\n    (\\x12\\x04\\xec\\x01\\x02&\\n\\r\\n\\x05\\x04\\r\\x02(\\x04\\x12\\x04\\xec\\x01\\x02\\n\\n\\\n    \\r\\n\\x05\\x04\\r\\x02(\\x06\\x12\\x04\\xec\\x01\\x0b\\x15\\n\\r\\n\\x05\\x04\\r\\x02(\\x01\\\n    \\x12\\x04\\xec\\x01\\x16\\x20\\n\\r\\n\\x05\\x04\\r\\x02(\\x03\\x12\\x04\\xec\\x01#%\\n\\\n    \\x0c\\n\\x04\\x04\\r\\x02)\\x12\\x04\\xee\\x01\\x026\\n\\r\\n\\x05\\x04\\r\\x02)\\x05\\x12\\\n    \\x04\\xee\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\r\\x02)\\x01\\x12\\x04\\xee\\x01\\x080\\n\\r\\n\\\n    \\x05\\x04\\r\\x02)\\x03\\x12\\x04\\xee\\x0135\\n\\x0c\\n\\x04\\x04\\r\\x02*\\x12\\x04\\xef\\\n    \\x01\\x02?\\n\\r\\n\\x05\\x04\\r\\x02*\\x05\\x12\\x04\\xef\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\\n    \\r\\x02*\\x01\\x12\\x04\\xef\\x01\\x089\\n\\r\\n\\x05\\x04\\r\\x02*\\x03\\x12\\x04\\xef\\\n    \\x01<>\\n\\x0c\\n\\x02\\x04\\x0e\\x12\\x06\\xf2\\x01\\0\\xf5\\x01\\x01\\n\\x0b\\n\\x03\\x04\\\n    \\x0e\\x01\\x12\\x04\\xf2\\x01\\x08\\x0b\\n\\x0c\\n\\x04\\x04\\x0e\\x02\\0\\x12\\x04\\xf3\\\n    \\x01\\x02\\x14\\n\\r\\n\\x05\\x04\\x0e\\x02\\0\\x05\\x12\\x04\\xf3\\x01\\x02\\x07\\n\\r\\n\\\n    \\x05\\x04\\x0e\\x02\\0\\x01\\x12\\x04\\xf3\\x01\\x08\\x0f\\n\\r\\n\\x05\\x04\\x0e\\x02\\0\\\n    \\x03\\x12\\x04\\xf3\\x01\\x12\\x13\\n\\x0c\\n\\x04\\x04\\x0e\\x02\\x01\\x12\\x04\\xf4\\x01\\\n    \\x02\\x13\\n\\r\\n\\x05\\x04\\x0e\\x02\\x01\\x05\\x12\\x04\\xf4\\x01\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x0e\\x02\\x01\\x01\\x12\\x04\\xf4\\x01\\x08\\x0e\\n\\r\\n\\x05\\x04\\x0e\\x02\\x01\\\n    \\x03\\x12\\x04\\xf4\\x01\\x11\\x12\\n\\x0c\\n\\x02\\x04\\x0f\\x12\\x06\\xf7\\x01\\0\\xfe\\\n    \\x01\\x01\\n\\x0b\\n\\x03\\x04\\x0f\\x01\\x12\\x04\\xf7\\x01\\x08\\x19\\n\\x0c\\n\\x04\\x04\\\n    \\x0f\\x02\\0\\x12\\x04\\xf8\\x01\\x02\\x11\\n\\r\\n\\x05\\x04\\x0f\\x02\\0\\x05\\x12\\x04\\\n    \\xf8\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\x0f\\x02\\0\\x01\\x12\\x04\\xf8\\x01\\x08\\x0c\\n\\r\\\n    \\n\\x05\\x04\\x0f\\x02\\0\\x03\\x12\\x04\\xf8\\x01\\x0f\\x10\\n\\x0c\\n\\x04\\x04\\x0f\\x02\\\n    \\x01\\x12\\x04\\xf9\\x01\\x02\\x0f\\n\\r\\n\\x05\\x04\\x0f\\x02\\x01\\x05\\x12\\x04\\xf9\\\n    \\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\x0f\\x02\\x01\\x01\\x12\\x04\\xf9\\x01\\x08\\n\\n\\r\\n\\\n    \\x05\\x04\\x0f\\x02\\x01\\x03\\x12\\x04\\xf9\\x01\\r\\x0e\\n\\x0c\\n\\x04\\x04\\x0f\\x02\\\n    \\x02\\x12\\x04\\xfa\\x01\\x02)\\n\\r\\n\\x05\\x04\\x0f\\x02\\x02\\x05\\x12\\x04\\xfa\\x01\\\n    \\x02\\x07\\n\\r\\n\\x05\\x04\\x0f\\x02\\x02\\x01\\x12\\x04\\xfa\\x01\\x08$\\n\\r\\n\\x05\\\n    \\x04\\x0f\\x02\\x02\\x03\\x12\\x04\\xfa\\x01'(\\n\\x0c\\n\\x04\\x04\\x0f\\x02\\x03\\x12\\\n    \\x04\\xfb\\x01\\x02&\\n\\r\\n\\x05\\x04\\x0f\\x02\\x03\\x05\\x12\\x04\\xfb\\x01\\x02\\x07\\\n    \\n\\r\\n\\x05\\x04\\x0f\\x02\\x03\\x01\\x12\\x04\\xfb\\x01\\x08!\\n\\r\\n\\x05\\x04\\x0f\\\n    \\x02\\x03\\x03\\x12\\x04\\xfb\\x01$%\\n\\x0c\\n\\x04\\x04\\x0f\\x02\\x04\\x12\\x04\\xfc\\\n    \\x01\\x02&\\n\\r\\n\\x05\\x04\\x0f\\x02\\x04\\x05\\x12\\x04\\xfc\\x01\\x02\\x07\\n\\r\\n\\\n    \\x05\\x04\\x0f\\x02\\x04\\x01\\x12\\x04\\xfc\\x01\\x08!\\n\\r\\n\\x05\\x04\\x0f\\x02\\x04\\\n    \\x03\\x12\\x04\\xfc\\x01$%\\n\\x0c\\n\\x04\\x04\\x0f\\x02\\x05\\x12\\x04\\xfd\\x01\\x02#\\\n    \\n\\r\\n\\x05\\x04\\x0f\\x02\\x05\\x05\\x12\\x04\\xfd\\x01\\x02\\x07\\n\\r\\n\\x05\\x04\\x0f\\\n    \\x02\\x05\\x01\\x12\\x04\\xfd\\x01\\x08\\x1e\\n\\r\\n\\x05\\x04\\x0f\\x02\\x05\\x03\\x12\\\n    \\x04\\xfd\\x01!\\\"\\n\\x0c\\n\\x02\\x04\\x10\\x12\\x06\\x80\\x02\\0\\x83\\x02\\x01\\n\\x0b\\\n    \\n\\x03\\x04\\x10\\x01\\x12\\x04\\x80\\x02\\x08\\x11\\n\\x0c\\n\\x04\\x04\\x10\\x02\\0\\x12\\\n    \\x04\\x81\\x02\\x02\\x18\\n\\r\\n\\x05\\x04\\x10\\x02\\0\\x06\\x12\\x04\\x81\\x02\\x02\\x0b\\\n    \\n\\r\\n\\x05\\x04\\x10\\x02\\0\\x01\\x12\\x04\\x81\\x02\\x0c\\x13\\n\\r\\n\\x05\\x04\\x10\\\n    \\x02\\0\\x03\\x12\\x04\\x81\\x02\\x16\\x17\\n\\x0c\\n\\x04\\x04\\x10\\x02\\x01\\x12\\x04\\\n    \\x82\\x02\\x02\\x1c\\n\\r\\n\\x05\\x04\\x10\\x02\\x01\\x05\\x12\\x04\\x82\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x10\\x02\\x01\\x01\\x12\\x04\\x82\\x02\\x08\\x17\\n\\r\\n\\x05\\x04\\x10\\\n    \\x02\\x01\\x03\\x12\\x04\\x82\\x02\\x1a\\x1b\\n\\x0c\\n\\x02\\x04\\x11\\x12\\x06\\x85\\x02\\\n    \\0\\x92\\x02\\x01\\n\\x0b\\n\\x03\\x04\\x11\\x01\\x12\\x04\\x85\\x02\\x08\\x12\\n\\x0e\\n\\\n    \\x04\\x04\\x11\\x04\\0\\x12\\x06\\x86\\x02\\x02\\x8a\\x02\\x03\\n\\r\\n\\x05\\x04\\x11\\x04\\\n    \\0\\x01\\x12\\x04\\x86\\x02\\x07\\x15\\n\\x0e\\n\\x06\\x04\\x11\\x04\\0\\x02\\0\\x12\\x04\\\n    \\x87\\x02\\x04\\x0e\\n\\x0f\\n\\x07\\x04\\x11\\x04\\0\\x02\\0\\x01\\x12\\x04\\x87\\x02\\x04\\\n    \\t\\n\\x0f\\n\\x07\\x04\\x11\\x04\\0\\x02\\0\\x02\\x12\\x04\\x87\\x02\\x0c\\r\\n\\x0e\\n\\x06\\\n    \\x04\\x11\\x04\\0\\x02\\x01\\x12\\x04\\x88\\x02\\x04\\x10\\n\\x0f\\n\\x07\\x04\\x11\\x04\\0\\\n    \\x02\\x01\\x01\\x12\\x04\\x88\\x02\\x04\\x0b\\n\\x0f\\n\\x07\\x04\\x11\\x04\\0\\x02\\x01\\\n    \\x02\\x12\\x04\\x88\\x02\\x0e\\x0f\\n\\x0e\\n\\x06\\x04\\x11\\x04\\0\\x02\\x02\\x12\\x04\\\n    \\x89\\x02\\x04\\x0f\\n\\x0f\\n\\x07\\x04\\x11\\x04\\0\\x02\\x02\\x01\\x12\\x04\\x89\\x02\\\n    \\x04\\n\\n\\x0f\\n\\x07\\x04\\x11\\x04\\0\\x02\\x02\\x02\\x12\\x04\\x89\\x02\\r\\x0e\\n\\x0c\\\n    \\n\\x04\\x04\\x11\\x02\\0\\x12\\x04\\x8b\\x02\\x02\\x1a\\n\\r\\n\\x05\\x04\\x11\\x02\\0\\x06\\\n    \\x12\\x04\\x8b\\x02\\x02\\x10\\n\\r\\n\\x05\\x04\\x11\\x02\\0\\x01\\x12\\x04\\x8b\\x02\\x11\\\n    \\x15\\n\\r\\n\\x05\\x04\\x11\\x02\\0\\x03\\x12\\x04\\x8b\\x02\\x18\\x19\\n=\\n\\x04\\x04\\\n    \\x11\\x02\\x01\\x12\\x04\\x8c\\x02\\x02\\x0f\\\"/Owner\\x20id=0,\\x20Witness\\x20id=1\\\n    ,\\x20Active\\x20id\\x20start\\x20by\\x202\\n\\n\\r\\n\\x05\\x04\\x11\\x02\\x01\\x05\\\n    \\x12\\x04\\x8c\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x11\\x02\\x01\\x01\\x12\\x04\\x8c\\x02\\\n    \\x08\\n\\n\\r\\n\\x05\\x04\\x11\\x02\\x01\\x03\\x12\\x04\\x8c\\x02\\r\\x0e\\n\\x0c\\n\\x04\\\n    \\x04\\x11\\x02\\x02\\x12\\x04\\x8d\\x02\\x02\\x1d\\n\\r\\n\\x05\\x04\\x11\\x02\\x02\\x05\\\n    \\x12\\x04\\x8d\\x02\\x02\\x08\\n\\r\\n\\x05\\x04\\x11\\x02\\x02\\x01\\x12\\x04\\x8d\\x02\\t\\\n    \\x18\\n\\r\\n\\x05\\x04\\x11\\x02\\x02\\x03\\x12\\x04\\x8d\\x02\\x1b\\x1c\\n\\x0c\\n\\x04\\\n    \\x04\\x11\\x02\\x03\\x12\\x04\\x8e\\x02\\x02\\x16\\n\\r\\n\\x05\\x04\\x11\\x02\\x03\\x05\\\n    \\x12\\x04\\x8e\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x11\\x02\\x03\\x01\\x12\\x04\\x8e\\x02\\\n    \\x08\\x11\\n\\r\\n\\x05\\x04\\x11\\x02\\x03\\x03\\x12\\x04\\x8e\\x02\\x14\\x15\\n\\x0c\\n\\\n    \\x04\\x04\\x11\\x02\\x04\\x12\\x04\\x8f\\x02\\x02\\x16\\n\\r\\n\\x05\\x04\\x11\\x02\\x04\\\n    \\x05\\x12\\x04\\x8f\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x11\\x02\\x04\\x01\\x12\\x04\\x8f\\\n    \\x02\\x08\\x11\\n\\r\\n\\x05\\x04\\x11\\x02\\x04\\x03\\x12\\x04\\x8f\\x02\\x14\\x15\\n\\x1f\\\n    \\n\\x04\\x04\\x11\\x02\\x05\\x12\\x04\\x90\\x02\\x02\\x17\\\"\\x111\\x20bit\\x201\\x20con\\\n    tract\\n\\n\\r\\n\\x05\\x04\\x11\\x02\\x05\\x05\\x12\\x04\\x90\\x02\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x11\\x02\\x05\\x01\\x12\\x04\\x90\\x02\\x08\\x12\\n\\r\\n\\x05\\x04\\x11\\x02\\x05\\\n    \\x03\\x12\\x04\\x90\\x02\\x15\\x16\\n\\x0c\\n\\x04\\x04\\x11\\x02\\x06\\x12\\x04\\x91\\x02\\\n    \\x02\\x18\\n\\r\\n\\x05\\x04\\x11\\x02\\x06\\x04\\x12\\x04\\x91\\x02\\x02\\n\\n\\r\\n\\x05\\\n    \\x04\\x11\\x02\\x06\\x06\\x12\\x04\\x91\\x02\\x0b\\x0e\\n\\r\\n\\x05\\x04\\x11\\x02\\x06\\\n    \\x01\\x12\\x04\\x91\\x02\\x0f\\x13\\n\\r\\n\\x05\\x04\\x11\\x02\\x06\\x03\\x12\\x04\\x91\\\n    \\x02\\x16\\x17\\n\\x17\\n\\x02\\x04\\x12\\x12\\x06\\x95\\x02\\0\\x9f\\x02\\x01\\x1a\\t\\x20\\\n    Witness\\n\\n\\x0b\\n\\x03\\x04\\x12\\x01\\x12\\x04\\x95\\x02\\x08\\x0f\\n\\x0c\\n\\x04\\\n    \\x04\\x12\\x02\\0\\x12\\x04\\x96\\x02\\x02\\x14\\n\\r\\n\\x05\\x04\\x12\\x02\\0\\x05\\x12\\\n    \\x04\\x96\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\0\\x01\\x12\\x04\\x96\\x02\\x08\\x0f\\\n    \\n\\r\\n\\x05\\x04\\x12\\x02\\0\\x03\\x12\\x04\\x96\\x02\\x12\\x13\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x01\\x12\\x04\\x97\\x02\\x02\\x16\\n\\r\\n\\x05\\x04\\x12\\x02\\x01\\x05\\x12\\x04\\\n    \\x97\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\x01\\x01\\x12\\x04\\x97\\x02\\x08\\x11\\n\\\n    \\r\\n\\x05\\x04\\x12\\x02\\x01\\x03\\x12\\x04\\x97\\x02\\x14\\x15\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x02\\x12\\x04\\x98\\x02\\x02\\x13\\n\\r\\n\\x05\\x04\\x12\\x02\\x02\\x05\\x12\\x04\\\n    \\x98\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\x02\\x01\\x12\\x04\\x98\\x02\\x08\\x0e\\n\\\n    \\r\\n\\x05\\x04\\x12\\x02\\x02\\x03\\x12\\x04\\x98\\x02\\x11\\x12\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x03\\x12\\x04\\x99\\x02\\x02\\x11\\n\\r\\n\\x05\\x04\\x12\\x02\\x03\\x05\\x12\\x04\\\n    \\x99\\x02\\x02\\x08\\n\\r\\n\\x05\\x04\\x12\\x02\\x03\\x01\\x12\\x04\\x99\\x02\\t\\x0c\\n\\r\\\n    \\n\\x05\\x04\\x12\\x02\\x03\\x03\\x12\\x04\\x99\\x02\\x0f\\x10\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x04\\x12\\x04\\x9a\\x02\\x02\\x1a\\n\\r\\n\\x05\\x04\\x12\\x02\\x04\\x05\\x12\\x04\\\n    \\x9a\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\x04\\x01\\x12\\x04\\x9a\\x02\\x08\\x15\\n\\\n    \\r\\n\\x05\\x04\\x12\\x02\\x04\\x03\\x12\\x04\\x9a\\x02\\x18\\x19\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x05\\x12\\x04\\x9b\\x02\\x02\\x18\\n\\r\\n\\x05\\x04\\x12\\x02\\x05\\x05\\x12\\x04\\\n    \\x9b\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\x05\\x01\\x12\\x04\\x9b\\x02\\x08\\x13\\n\\\n    \\r\\n\\x05\\x04\\x12\\x02\\x05\\x03\\x12\\x04\\x9b\\x02\\x16\\x17\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x06\\x12\\x04\\x9c\\x02\\x02\\x1b\\n\\r\\n\\x05\\x04\\x12\\x02\\x06\\x05\\x12\\x04\\\n    \\x9c\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\x06\\x01\\x12\\x04\\x9c\\x02\\x08\\x16\\n\\\n    \\r\\n\\x05\\x04\\x12\\x02\\x06\\x03\\x12\\x04\\x9c\\x02\\x19\\x1a\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x07\\x12\\x04\\x9d\\x02\\x02\\x1a\\n\\r\\n\\x05\\x04\\x12\\x02\\x07\\x05\\x12\\x04\\\n    \\x9d\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x12\\x02\\x07\\x01\\x12\\x04\\x9d\\x02\\x08\\x15\\n\\\n    \\r\\n\\x05\\x04\\x12\\x02\\x07\\x03\\x12\\x04\\x9d\\x02\\x18\\x19\\n\\x0c\\n\\x04\\x04\\x12\\\n    \\x02\\x08\\x12\\x04\\x9e\\x02\\x02\\x12\\n\\r\\n\\x05\\x04\\x12\\x02\\x08\\x05\\x12\\x04\\\n    \\x9e\\x02\\x02\\x06\\n\\r\\n\\x05\\x04\\x12\\x02\\x08\\x01\\x12\\x04\\x9e\\x02\\x07\\r\\n\\r\\\n    \\n\\x05\\x04\\x12\\x02\\x08\\x03\\x12\\x04\\x9e\\x02\\x10\\x11\\n\\x1b\\n\\x02\\x04\\x13\\\n    \\x12\\x06\\xa2\\x02\\0\\xa6\\x02\\x01\\x1a\\r\\x20Vote\\x20Change\\n\\n\\x0b\\n\\x03\\x04\\\n    \\x13\\x01\\x12\\x04\\xa2\\x02\\x08\\r\\n\\x0c\\n\\x04\\x04\\x13\\x02\\0\\x12\\x04\\xa3\\x02\\\n    \\x02\\x14\\n\\r\\n\\x05\\x04\\x13\\x02\\0\\x05\\x12\\x04\\xa3\\x02\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x13\\x02\\0\\x01\\x12\\x04\\xa3\\x02\\x08\\x0f\\n\\r\\n\\x05\\x04\\x13\\x02\\0\\x03\\\n    \\x12\\x04\\xa3\\x02\\x12\\x13\\n\\x0c\\n\\x04\\x04\\x13\\x02\\x01\\x12\\x04\\xa4\\x02\\x02\\\n    \\x1e\\n\\r\\n\\x05\\x04\\x13\\x02\\x01\\x04\\x12\\x04\\xa4\\x02\\x02\\n\\n\\r\\n\\x05\\x04\\\n    \\x13\\x02\\x01\\x06\\x12\\x04\\xa4\\x02\\x0b\\x0f\\n\\r\\n\\x05\\x04\\x13\\x02\\x01\\x01\\\n    \\x12\\x04\\xa4\\x02\\x10\\x19\\n\\r\\n\\x05\\x04\\x13\\x02\\x01\\x03\\x12\\x04\\xa4\\x02\\\n    \\x1c\\x1d\\n\\x0c\\n\\x04\\x04\\x13\\x02\\x02\\x12\\x04\\xa5\\x02\\x02\\x1e\\n\\r\\n\\x05\\\n    \\x04\\x13\\x02\\x02\\x04\\x12\\x04\\xa5\\x02\\x02\\n\\n\\r\\n\\x05\\x04\\x13\\x02\\x02\\x06\\\n    \\x12\\x04\\xa5\\x02\\x0b\\x0f\\n\\r\\n\\x05\\x04\\x13\\x02\\x02\\x01\\x12\\x04\\xa5\\x02\\\n    \\x10\\x19\\n\\r\\n\\x05\\x04\\x13\\x02\\x02\\x03\\x12\\x04\\xa5\\x02\\x1c\\x1d\\n\\x1b\\n\\\n    \\x02\\x04\\x14\\x12\\x06\\xaa\\x02\\0\\xad\\x02\\x012\\r\\x20Transcation\\n\\n\\x0b\\n\\\n    \\x03\\x04\\x14\\x01\\x12\\x04\\xaa\\x02\\x08\\x10\\n\\x0c\\n\\x04\\x04\\x14\\x02\\0\\x12\\\n    \\x04\\xab\\x02\\x02\\x12\\n\\r\\n\\x05\\x04\\x14\\x02\\0\\x05\\x12\\x04\\xab\\x02\\x02\\x07\\\n    \\n\\r\\n\\x05\\x04\\x14\\x02\\0\\x01\\x12\\x04\\xab\\x02\\x08\\r\\n\\r\\n\\x05\\x04\\x14\\x02\\\n    \\0\\x03\\x12\\x04\\xab\\x02\\x10\\x11\\n\\x0c\\n\\x04\\x04\\x14\\x02\\x01\\x12\\x04\\xac\\\n    \\x02\\x02\\x17\\n\\r\\n\\x05\\x04\\x14\\x02\\x01\\x05\\x12\\x04\\xac\\x02\\x02\\x07\\n\\r\\n\\\n    \\x05\\x04\\x14\\x02\\x01\\x01\\x12\\x04\\xac\\x02\\x08\\x12\\n\\r\\n\\x05\\x04\\x14\\x02\\\n    \\x01\\x03\\x12\\x04\\xac\\x02\\x15\\x16\\n\\x0c\\n\\x02\\x04\\x15\\x12\\x06\\xaf\\x02\\0\\\n    \\xb7\\x02\\x01\\n\\x0b\\n\\x03\\x04\\x15\\x01\\x12\\x04\\xaf\\x02\\x08\\x0f\\n\\x0e\\n\\x04\\\n    \\x04\\x15\\x03\\0\\x12\\x06\\xb0\\x02\\x02\\xb4\\x02\\x03\\n\\r\\n\\x05\\x04\\x15\\x03\\0\\\n    \\x01\\x12\\x04\\xb0\\x02\\n\\r\\n\\x0e\\n\\x06\\x04\\x15\\x03\\0\\x02\\0\\x12\\x04\\xb1\\x02\\\n    \\x04\\x13\\n\\x0f\\n\\x07\\x04\\x15\\x03\\0\\x02\\0\\x05\\x12\\x04\\xb1\\x02\\x04\\t\\n\\x0f\\\n    \\n\\x07\\x04\\x15\\x03\\0\\x02\\0\\x01\\x12\\x04\\xb1\\x02\\n\\x0e\\n\\x0f\\n\\x07\\x04\\x15\\\n    \\x03\\0\\x02\\0\\x03\\x12\\x04\\xb1\\x02\\x11\\x12\\n\\x0e\\n\\x06\\x04\\x15\\x03\\0\\x02\\\n    \\x01\\x12\\x04\\xb2\\x02\\x04\\x13\\n\\x0f\\n\\x07\\x04\\x15\\x03\\0\\x02\\x01\\x05\\x12\\\n    \\x04\\xb2\\x02\\x04\\t\\n\\x0f\\n\\x07\\x04\\x15\\x03\\0\\x02\\x01\\x01\\x12\\x04\\xb2\\x02\\\n    \\n\\x0e\\n\\x0f\\n\\x07\\x04\\x15\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xb2\\x02\\x11\\x12\\n\\\n    \\x0e\\n\\x06\\x04\\x15\\x03\\0\\x02\\x02\\x12\\x04\\xb3\\x02\\x04\\x15\\n\\x0f\\n\\x07\\x04\\\n    \\x15\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xb3\\x02\\x04\\t\\n\\x0f\\n\\x07\\x04\\x15\\x03\\0\\\n    \\x02\\x02\\x01\\x12\\x04\\xb3\\x02\\n\\x10\\n\\x0f\\n\\x07\\x04\\x15\\x03\\0\\x02\\x02\\x03\\\n    \\x12\\x04\\xb3\\x02\\x13\\x14\\n\\x0c\\n\\x04\\x04\\x15\\x02\\0\\x12\\x04\\xb5\\x02\\x02\\\n    \\x13\\n\\r\\n\\x05\\x04\\x15\\x02\\0\\x06\\x12\\x04\\xb5\\x02\\x02\\x05\\n\\r\\n\\x05\\x04\\\n    \\x15\\x02\\0\\x01\\x12\\x04\\xb5\\x02\\x06\\x0e\\n\\r\\n\\x05\\x04\\x15\\x02\\0\\x03\\x12\\\n    \\x04\\xb5\\x02\\x11\\x12\\n\\x0c\\n\\x04\\x04\\x15\\x02\\x01\\x12\\x04\\xb6\\x02\\x02\\x16\\\n    \\n\\r\\n\\x05\\x04\\x15\\x02\\x01\\x05\\x12\\x04\\xb6\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x15\\\n    \\x02\\x01\\x01\\x12\\x04\\xb6\\x02\\x08\\x11\\n\\r\\n\\x05\\x04\\x15\\x02\\x01\\x03\\x12\\\n    \\x04\\xb6\\x02\\x14\\x15\\n\\x0c\\n\\x02\\x04\\x16\\x12\\x06\\xb9\\x02\\0\\xbb\\x02\\x01\\n\\\n    \\x0b\\n\\x03\\x04\\x16\\x01\\x12\\x04\\xb9\\x02\\x08\\x11\\n\\x0c\\n\\x04\\x04\\x16\\x02\\0\\\n    \\x12\\x04\\xba\\x02\\x02\\x20\\n\\r\\n\\x05\\x04\\x16\\x02\\0\\x04\\x12\\x04\\xba\\x02\\x02\\\n    \\n\\n\\r\\n\\x05\\x04\\x16\\x02\\0\\x06\\x12\\x04\\xba\\x02\\x0b\\x13\\n\\r\\n\\x05\\x04\\x16\\\n    \\x02\\0\\x01\\x12\\x04\\xba\\x02\\x14\\x1b\\n\\r\\n\\x05\\x04\\x16\\x02\\0\\x03\\x12\\x04\\\n    \\xba\\x02\\x1e\\x1f\\n\\x0c\\n\\x02\\x04\\x17\\x12\\x06\\xbd\\x02\\0\\xc6\\x02\\x01\\n\\x0b\\\n    \\n\\x03\\x04\\x17\\x01\\x12\\x04\\xbd\\x02\\x08\\x17\\n\\x0c\\n\\x04\\x04\\x17\\x02\\0\\x12\\\n    \\x04\\xbe\\x02\\x02\\x19\\n\\r\\n\\x05\\x04\\x17\\x02\\0\\x05\\x12\\x04\\xbe\\x02\\x02\\x07\\\n    \\n\\r\\n\\x05\\x04\\x17\\x02\\0\\x01\\x12\\x04\\xbe\\x02\\x08\\x14\\n\\r\\n\\x05\\x04\\x17\\\n    \\x02\\0\\x03\\x12\\x04\\xbe\\x02\\x17\\x18\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x01\\x12\\x04\\\n    \\xbf\\x02\\x02\\x17\\n\\r\\n\\x05\\x04\\x17\\x02\\x01\\x05\\x12\\x04\\xbf\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x17\\x02\\x01\\x01\\x12\\x04\\xbf\\x02\\x08\\x12\\n\\r\\n\\x05\\x04\\x17\\\n    \\x02\\x01\\x03\\x12\\x04\\xbf\\x02\\x15\\x16\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x02\\x12\\x04\\\n    \\xc0\\x02\\x02\\x20\\n\\r\\n\\x05\\x04\\x17\\x02\\x02\\x05\\x12\\x04\\xc0\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x17\\x02\\x02\\x01\\x12\\x04\\xc0\\x02\\x08\\x1b\\n\\r\\n\\x05\\x04\\x17\\\n    \\x02\\x02\\x03\\x12\\x04\\xc0\\x02\\x1e\\x1f\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x03\\x12\\x04\\\n    \\xc1\\x02\\x02\\x1f\\n\\r\\n\\x05\\x04\\x17\\x02\\x03\\x05\\x12\\x04\\xc1\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x17\\x02\\x03\\x01\\x12\\x04\\xc1\\x02\\x08\\x1a\\n\\r\\n\\x05\\x04\\x17\\\n    \\x02\\x03\\x03\\x12\\x04\\xc1\\x02\\x1d\\x1e\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x04\\x12\\x04\\\n    \\xc2\\x02\\x02\\x16\\n\\r\\n\\x05\\x04\\x17\\x02\\x04\\x05\\x12\\x04\\xc2\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x17\\x02\\x04\\x01\\x12\\x04\\xc2\\x02\\x08\\x11\\n\\r\\n\\x05\\x04\\x17\\\n    \\x02\\x04\\x03\\x12\\x04\\xc2\\x02\\x14\\x15\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x05\\x12\\x04\\\n    \\xc3\\x02\\x02\\x14\\n\\r\\n\\x05\\x04\\x17\\x02\\x05\\x05\\x12\\x04\\xc3\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x17\\x02\\x05\\x01\\x12\\x04\\xc3\\x02\\x08\\x0f\\n\\r\\n\\x05\\x04\\x17\\\n    \\x02\\x05\\x03\\x12\\x04\\xc3\\x02\\x12\\x13\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x06\\x12\\x04\\\n    \\xc4\\x02\\x02/\\n\\r\\n\\x05\\x04\\x17\\x02\\x06\\x06\\x12\\x04\\xc4\\x02\\x02#\\n\\r\\n\\\n    \\x05\\x04\\x17\\x02\\x06\\x01\\x12\\x04\\xc4\\x02$*\\n\\r\\n\\x05\\x04\\x17\\x02\\x06\\x03\\\n    \\x12\\x04\\xc4\\x02-.\\n\\x0c\\n\\x04\\x04\\x17\\x02\\x07\\x12\\x04\\xc5\\x02\\x02!\\n\\r\\\n    \\n\\x05\\x04\\x17\\x02\\x07\\x05\\x12\\x04\\xc5\\x02\\x02\\x07\\n\\r\\n\\x05\\x04\\x17\\x02\\\n    \\x07\\x01\\x12\\x04\\xc5\\x02\\x08\\x1c\\n\\r\\n\\x05\\x04\\x17\\x02\\x07\\x03\\x12\\x04\\\n    \\xc5\\x02\\x1f\\x20\\n\\x0c\\n\\x02\\x04\\x18\\x12\\x06\\xc8\\x02\\0\\xcd\\x02\\x01\\n\\x0b\\\n    \\n\\x03\\x04\\x18\\x01\\x12\\x04\\xc8\\x02\\x08\\x19\\n\\x0c\\n\\x04\\x04\\x18\\x02\\0\\x12\\\n    \\x04\\xc9\\x02\\x02\\x19\\n\\r\\n\\x05\\x04\\x18\\x02\\0\\x05\\x12\\x04\\xc9\\x02\\x02\\x07\\\n    \\n\\r\\n\\x05\\x04\\x18\\x02\\0\\x01\\x12\\x04\\xc9\\x02\\x08\\x14\\n\\r\\n\\x05\\x04\\x18\\\n    \\x02\\0\\x03\\x12\\x04\\xc9\\x02\\x17\\x18\\n\\x0c\\n\\x04\\x04\\x18\\x02\\x01\\x12\\x04\\\n    \\xca\\x02\\x02\\x19\\n\\r\\n\\x05\\x04\\x18\\x02\\x01\\x05\\x12\\x04\\xca\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x18\\x02\\x01\\x01\\x12\\x04\\xca\\x02\\x08\\x14\\n\\r\\n\\x05\\x04\\x18\\\n    \\x02\\x01\\x03\\x12\\x04\\xca\\x02\\x17\\x18\\n\\x0c\\n\\x04\\x04\\x18\\x02\\x02\\x12\\x04\\\n    \\xcb\\x02\\x02\\x1d\\n\\r\\n\\x05\\x04\\x18\\x02\\x02\\x05\\x12\\x04\\xcb\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x18\\x02\\x02\\x01\\x12\\x04\\xcb\\x02\\x08\\x18\\n\\r\\n\\x05\\x04\\x18\\\n    \\x02\\x02\\x03\\x12\\x04\\xcb\\x02\\x1b\\x1c\\n\\x0c\\n\\x04\\x04\\x18\\x02\\x03\\x12\\x04\\\n    \\xcc\\x02\\x02\\x1c\\n\\r\\n\\x05\\x04\\x18\\x02\\x03\\x05\\x12\\x04\\xcc\\x02\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04\\x18\\x02\\x03\\x01\\x12\\x04\\xcc\\x02\\x08\\x17\\n\\r\\n\\x05\\x04\\x18\\\n    \\x02\\x03\\x03\\x12\\x04\\xcc\\x02\\x1a\\x1b\\n\\x0c\\n\\x02\\x04\\x19\\x12\\x06\\xcf\\x02\\\n    \\0\\xc2\\x03\\x01\\n\\x0b\\n\\x03\\x04\\x19\\x01\\x12\\x04\\xcf\\x02\\x08\\x13\\n\\x0e\\n\\\n    \\x04\\x04\\x19\\x03\\0\\x12\\x06\\xd0\\x02\\x02\\x81\\x03\\x03\\n\\r\\n\\x05\\x04\\x19\\x03\\\n    \\0\\x01\\x12\\x04\\xd0\\x02\\n\\x12\\n\\x10\\n\\x06\\x04\\x19\\x03\\0\\x04\\0\\x12\\x06\\xd1\\\n    \\x02\\x04\\xfb\\x02\\x05\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x04\\0\\x01\\x12\\x04\\xd1\\x02\\\n    \\t\\x15\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\0\\x12\\x04\\xd2\\x02\\x06\\x20\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\0\\x01\\x12\\x04\\xd2\\x02\\x06\\x1b\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\0\\x02\\x12\\x04\\xd2\\x02\\x1e\\x1f\\n\\x10\\n\\x08\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\x01\\x12\\x04\\xd3\\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\\n    \\x04\\0\\x02\\x01\\x01\\x12\\x04\\xd3\\x02\\x06\\x16\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02\\x01\\x02\\x12\\x04\\xd3\\x02\\x19\\x1a\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\\n    \\x02\\x12\\x04\\xd4\\x02\\x06\\x20\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x02\\x01\\\n    \\x12\\x04\\xd4\\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x02\\x02\\x12\\\n    \\x04\\xd4\\x02\\x1e\\x1f\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x03\\x12\\x04\\xd5\\\n    \\x02\\x06\\x1c\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x03\\x01\\x12\\x04\\xd5\\x02\\\n    \\x06\\x17\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x03\\x02\\x12\\x04\\xd5\\x02\\x1a\\\n    \\x1b\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x04\\x12\\x04\\xd6\\x02\\x06\\x1e\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x04\\x01\\x12\\x04\\xd6\\x02\\x06\\x19\\n\\x11\\n\\\n    \\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x04\\x02\\x12\\x04\\xd6\\x02\\x1c\\x1d\\n\\x10\\n\\x08\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x05\\x12\\x04\\xd7\\x02\\x06\\x20\\n\\x11\\n\\t\\x04\\x19\\\n    \\x03\\0\\x04\\0\\x02\\x05\\x01\\x12\\x04\\xd7\\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\\n    \\x04\\0\\x02\\x05\\x02\\x12\\x04\\xd7\\x02\\x1e\\x1f\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\\n    \\0\\x02\\x06\\x12\\x04\\xd8\\x02\\x06\\x1d\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x06\\\n    \\x01\\x12\\x04\\xd8\\x02\\x06\\x18\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x06\\x02\\\n    \\x12\\x04\\xd8\\x02\\x1b\\x1c\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x07\\x12\\x04\\\n    \\xd9\\x02\\x06\\x20\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x07\\x01\\x12\\x04\\xd9\\\n    \\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x07\\x02\\x12\\x04\\xd9\\x02\\\n    \\x1e\\x1f\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x08\\x12\\x04\\xda\\x02\\x06(\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x08\\x01\\x12\\x04\\xda\\x02\\x06#\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x08\\x02\\x12\\x04\\xda\\x02&'\\n\\x10\\n\\x08\\x04\\x19\\\n    \\x03\\0\\x04\\0\\x02\\t\\x12\\x04\\xdb\\x02\\x06!\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02\\t\\x01\\x12\\x04\\xdb\\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\t\\\n    \\x02\\x12\\x04\\xdb\\x02\\x1e\\x20\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\n\\x12\\\n    \\x04\\xdc\\x02\\x06!\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\n\\x01\\x12\\x04\\xdc\\\n    \\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\n\\x02\\x12\\x04\\xdc\\x02\\x1e\\\n    \\x20\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x0b\\x12\\x04\\xdd\\x02\\x06#\\n\\x11\\\n    \\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x0b\\x01\\x12\\x04\\xdd\\x02\\x06\\x1d\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x0b\\x02\\x12\\x04\\xdd\\x02\\x20\\\"\\n\\x10\\n\\x08\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\x0c\\x12\\x04\\xde\\x02\\x06#\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\\n    \\x04\\0\\x02\\x0c\\x01\\x12\\x04\\xde\\x02\\x06\\x1d\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02\\x0c\\x02\\x12\\x04\\xde\\x02\\x20\\\"\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\r\\\n    \\x12\\x04\\xdf\\x02\\x06!\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\r\\x01\\x12\\x04\\\n    \\xdf\\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\r\\x02\\x12\\x04\\xdf\\x02\\\n    \\x1e\\x20\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x0e\\x12\\x04\\xe0\\x02\\x06\\x1f\\\n    \\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x0e\\x01\\x12\\x04\\xe0\\x02\\x06\\x19\\n\\x11\\\n    \\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x0e\\x02\\x12\\x04\\xe0\\x02\\x1c\\x1e\\n\\x10\\n\\x08\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x0f\\x12\\x04\\xe1\\x02\\x06\\\"\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02\\x0f\\x01\\x12\\x04\\xe1\\x02\\x06\\x1c\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\\n    \\0\\x02\\x0f\\x02\\x12\\x04\\xe1\\x02\\x1f!\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\\n    \\x10\\x12\\x04\\xe2\\x02\\x06#\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x10\\x01\\x12\\\n    \\x04\\xe2\\x02\\x06\\x1d\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x10\\x02\\x12\\x04\\\n    \\xe2\\x02\\x20\\\"\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x11\\x12\\x04\\xe3\\x02\\\n    \\x06\\\"\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x11\\x01\\x12\\x04\\xe3\\x02\\x06\\x1c\\\n    \\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x11\\x02\\x12\\x04\\xe3\\x02\\x1f!\\n\\x10\\n\\\n    \\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x12\\x12\\x04\\xe4\\x02\\x06\\x20\\n\\x11\\n\\t\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\x12\\x01\\x12\\x04\\xe4\\x02\\x06\\x1a\\n\\x11\\n\\t\\x04\\x19\\\n    \\x03\\0\\x04\\0\\x02\\x12\\x02\\x12\\x04\\xe4\\x02\\x1d\\x1f\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02\\x13\\x12\\x04\\xe5\\x02\\x06\\x1a\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02\\x13\\x01\\x12\\x04\\xe5\\x02\\x06\\x14\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\\n    \\x13\\x02\\x12\\x04\\xe5\\x02\\x17\\x19\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x14\\\n    \\x12\\x04\\xe6\\x02\\x06\\x1f\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x14\\x01\\x12\\\n    \\x04\\xe6\\x02\\x06\\x19\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x14\\x02\\x12\\x04\\\n    \\xe6\\x02\\x1c\\x1e\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x15\\x12\\x04\\xe7\\x02\\\n    \\x06\\x20\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x15\\x01\\x12\\x04\\xe7\\x02\\x06\\\n    \\x1a\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x15\\x02\\x12\\x04\\xe7\\x02\\x1d\\x1f\\n\\\n    \\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x16\\x12\\x04\\xe8\\x02\\x06\\x17\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x16\\x01\\x12\\x04\\xe8\\x02\\x06\\x11\\n\\x11\\n\\t\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\x16\\x02\\x12\\x04\\xe8\\x02\\x14\\x16\\n\\x10\\n\\x08\\x04\\x19\\\n    \\x03\\0\\x04\\0\\x02\\x17\\x12\\x04\\xe9\\x02\\x06!\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02\\x17\\x01\\x12\\x04\\xe9\\x02\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\\n    \\x17\\x02\\x12\\x04\\xe9\\x02\\x1e\\x20\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x18\\\n    \\x12\\x04\\xea\\x02\\x06\\\"\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x18\\x01\\x12\\x04\\\n    \\xea\\x02\\x06\\x1c\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x18\\x02\\x12\\x04\\xea\\\n    \\x02\\x1f!\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x19\\x12\\x04\\xeb\\x02\\x06\\\"\\\n    \\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x19\\x01\\x12\\x04\\xeb\\x02\\x06\\x1c\\n\\x11\\\n    \\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x19\\x02\\x12\\x04\\xeb\\x02\\x1f!\\n\\x10\\n\\x08\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x1a\\x12\\x04\\xec\\x02\\x06$\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02\\x1a\\x01\\x12\\x04\\xec\\x02\\x06\\x1e\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\\n    \\0\\x02\\x1a\\x02\\x12\\x04\\xec\\x02!#\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1b\\\n    \\x12\\x04\\xed\\x02\\x06'\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1b\\x01\\x12\\x04\\\n    \\xed\\x02\\x06!\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1b\\x02\\x12\\x04\\xed\\x02$\\\n    &\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1c\\x12\\x04\\xee\\x02\\x06%\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x1c\\x01\\x12\\x04\\xee\\x02\\x06\\x1f\\n\\x11\\n\\t\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\x1c\\x02\\x12\\x04\\xee\\x02\\\"$\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02\\x1d\\x12\\x04\\xef\\x02\\x06+\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\\n    \\x1d\\x01\\x12\\x04\\xef\\x02\\x06%\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1d\\x02\\\n    \\x12\\x04\\xef\\x02(*\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1e\\x12\\x04\\xf0\\\n    \\x02\\x06\\x1c\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1e\\x01\\x12\\x04\\xf0\\x02\\\n    \\x06\\x16\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1e\\x02\\x12\\x04\\xf0\\x02\\x19\\\n    \\x1b\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1f\\x12\\x04\\xf1\\x02\\x06#\\n\\x11\\\n    \\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02\\x1f\\x01\\x12\\x04\\xf1\\x02\\x06\\x1d\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02\\x1f\\x02\\x12\\x04\\xf1\\x02\\x20\\\"\\n\\x10\\n\\x08\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\x20\\x12\\x04\\xf2\\x02\\x06$\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\\n    \\x04\\0\\x02\\x20\\x01\\x12\\x04\\xf2\\x02\\x06\\x1e\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02\\x20\\x02\\x12\\x04\\xf2\\x02!#\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02!\\x12\\\n    \\x04\\xf3\\x02\\x06#\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02!\\x01\\x12\\x04\\xf3\\x02\\\n    \\x06\\x1d\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02!\\x02\\x12\\x04\\xf3\\x02\\x20\\\"\\n\\\n    \\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02\\\"\\x12\\x04\\xf4\\x02\\x06%\\n\\x11\\n\\t\\x04\\\n    \\x19\\x03\\0\\x04\\0\\x02\\\"\\x01\\x12\\x04\\xf4\\x02\\x06\\x1f\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02\\\"\\x02\\x12\\x04\\xf4\\x02\\\"$\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\\n    \\x02#\\x12\\x04\\xf5\\x02\\x06#\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02#\\x01\\x12\\\n    \\x04\\xf5\\x02\\x06\\x1d\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02#\\x02\\x12\\x04\\xf5\\\n    \\x02\\x20\\\"\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02$\\x12\\x04\\xf6\\x02\\x06%\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02$\\x01\\x12\\x04\\xf6\\x02\\x06\\x1f\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02$\\x02\\x12\\x04\\xf6\\x02\\\"$\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02%\\x12\\x04\\xf7\\x02\\x06*\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02%\\\n    \\x01\\x12\\x04\\xf7\\x02\\x06$\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02%\\x02\\x12\\x04\\\n    \\xf7\\x02')\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02&\\x12\\x04\\xf8\\x02\\x06$\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02&\\x01\\x12\\x04\\xf8\\x02\\x06\\x1e\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02&\\x02\\x12\\x04\\xf8\\x02!#\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\0\\x04\\0\\x02'\\x12\\x04\\xf9\\x02\\x06&\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02'\\\n    \\x01\\x12\\x04\\xf9\\x02\\x06\\x20\\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02'\\x02\\x12\\\n    \\x04\\xf9\\x02#%\\n\\x10\\n\\x08\\x04\\x19\\x03\\0\\x04\\0\\x02(\\x12\\x04\\xfa\\x02\\x06'\\\n    \\n\\x11\\n\\t\\x04\\x19\\x03\\0\\x04\\0\\x02(\\x01\\x12\\x04\\xfa\\x02\\x06!\\n\\x11\\n\\t\\\n    \\x04\\x19\\x03\\0\\x04\\0\\x02(\\x02\\x12\\x04\\xfa\\x02$&\\n\\x0e\\n\\x06\\x04\\x19\\x03\\\n    \\0\\x02\\0\\x12\\x04\\xfc\\x02\\x04\\x1a\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\0\\x06\\x12\\\n    \\x04\\xfc\\x02\\x04\\x10\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\0\\x01\\x12\\x04\\xfc\\x02\\\n    \\x11\\x15\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\0\\x03\\x12\\x04\\xfc\\x02\\x18\\x19\\n\\\n    \\x0e\\n\\x06\\x04\\x19\\x03\\0\\x02\\x01\\x12\\x04\\xfd\\x02\\x04&\\n\\x0f\\n\\x07\\x04\\\n    \\x19\\x03\\0\\x02\\x01\\x06\\x12\\x04\\xfd\\x02\\x04\\x17\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\\n    \\x02\\x01\\x01\\x12\\x04\\xfd\\x02\\x18!\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\x01\\x03\\\n    \\x12\\x04\\xfd\\x02$%\\n\\x0e\\n\\x06\\x04\\x19\\x03\\0\\x02\\x02\\x12\\x04\\xfe\\x02\\x04\\\n    \\x17\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xfe\\x02\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04\\x19\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xfe\\x02\\n\\x12\\n\\x0f\\n\\x07\\x04\\x19\\\n    \\x03\\0\\x02\\x02\\x03\\x12\\x04\\xfe\\x02\\x15\\x16\\n\\x0e\\n\\x06\\x04\\x19\\x03\\0\\x02\\\n    \\x03\\x12\\x04\\xff\\x02\\x04\\x1b\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\x03\\x05\\x12\\\n    \\x04\\xff\\x02\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xff\\x02\\\n    \\n\\x16\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\x03\\x03\\x12\\x04\\xff\\x02\\x19\\x1a\\n\\\n    \\x0e\\n\\x06\\x04\\x19\\x03\\0\\x02\\x04\\x12\\x04\\x80\\x03\\x04\\x1c\\n\\x0f\\n\\x07\\x04\\\n    \\x19\\x03\\0\\x02\\x04\\x05\\x12\\x04\\x80\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\\n    \\x02\\x04\\x01\\x12\\x04\\x80\\x03\\n\\x17\\n\\x0f\\n\\x07\\x04\\x19\\x03\\0\\x02\\x04\\x03\\\n    \\x12\\x04\\x80\\x03\\x1a\\x1b\\n\\x0e\\n\\x04\\x04\\x19\\x03\\x01\\x12\\x06\\x83\\x03\\x02\\\n    \\xac\\x03\\x03\\n\\r\\n\\x05\\x04\\x19\\x03\\x01\\x01\\x12\\x04\\x83\\x03\\n\\x10\\n\\x10\\n\\\n    \\x06\\x04\\x19\\x03\\x01\\x04\\0\\x12\\x06\\x84\\x03\\x04\\x87\\x03\\x05\\n\\x0f\\n\\x07\\\n    \\x04\\x19\\x03\\x01\\x04\\0\\x01\\x12\\x04\\x84\\x03\\t\\r\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\x01\\x04\\0\\x02\\0\\x12\\x04\\x85\\x03\\x06\\x11\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x04\\x85\\x03\\x06\\x0c\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\0\\x02\\0\\\n    \\x02\\x12\\x04\\x85\\x03\\x0f\\x10\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\0\\x02\\x01\\\n    \\x12\\x04\\x86\\x03\\x06\\x11\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\0\\x02\\x01\\x01\\x12\\\n    \\x04\\x86\\x03\\x06\\x0c\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\0\\x02\\x01\\x02\\x12\\x04\\\n    \\x86\\x03\\x0f\\x10\\n\\x10\\n\\x06\\x04\\x19\\x03\\x01\\x04\\x01\\x12\\x06\\x88\\x03\\x04\\\n    \\x99\\x03\\x05\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x04\\x01\\x01\\x12\\x04\\x88\\x03\\t\\\n    \\x17\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\0\\x12\\x04\\x89\\x03\\x06\\x12\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\0\\x01\\x12\\x04\\x89\\x03\\x06\\r\\n\\x11\\n\\\n    \\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\0\\x02\\x12\\x04\\x89\\x03\\x10\\x11\\n\\x10\\n\\x08\\\n    \\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x01\\x12\\x04\\x8a\\x03\\x06\\x12\\n\\x11\\n\\t\\x04\\\n    \\x19\\x03\\x01\\x04\\x01\\x02\\x01\\x01\\x12\\x04\\x8a\\x03\\x06\\r\\n\\x11\\n\\t\\x04\\x19\\\n    \\x03\\x01\\x04\\x01\\x02\\x01\\x02\\x12\\x04\\x8a\\x03\\x10\\x11\\n\\x10\\n\\x08\\x04\\x19\\\n    \\x03\\x01\\x04\\x01\\x02\\x02\\x12\\x04\\x8b\\x03\\x06\\x11\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\x01\\x04\\x01\\x02\\x02\\x01\\x12\\x04\\x8b\\x03\\x06\\x0c\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\x01\\x04\\x01\\x02\\x02\\x02\\x12\\x04\\x8b\\x03\\x0f\\x10\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\x01\\x04\\x01\\x02\\x03\\x12\\x04\\x8c\\x03\\x06\\x1f\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\\n    \\x04\\x01\\x02\\x03\\x01\\x12\\x04\\x8c\\x03\\x06\\x1a\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\\n    \\x04\\x01\\x02\\x03\\x02\\x12\\x04\\x8c\\x03\\x1d\\x1e\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\\n    \\x04\\x01\\x02\\x04\\x12\\x04\\x8d\\x03\\x06\\x18\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\\n    \\x01\\x02\\x04\\x01\\x12\\x04\\x8d\\x03\\x06\\x13\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\\n    \\x01\\x02\\x04\\x02\\x12\\x04\\x8d\\x03\\x16\\x17\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\\n    \\x01\\x02\\x05\\x12\\x04\\x8e\\x03\\x06\\x1f\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\\n    \\x02\\x05\\x01\\x12\\x04\\x8e\\x03\\x06\\x1a\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\\n    \\x02\\x05\\x02\\x12\\x04\\x8e\\x03\\x1d\\x1e\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\\n    \\x02\\x06\\x12\\x04\\x8f\\x03\\x06\\x1a\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\\n    \\x06\\x01\\x12\\x04\\x8f\\x03\\x06\\x15\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\\n    \\x06\\x02\\x12\\x04\\x8f\\x03\\x18\\x19\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\\n    \\x07\\x12\\x04\\x90\\x03\\x06\\x1a\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x07\\\n    \\x01\\x12\\x04\\x90\\x03\\x06\\x15\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x07\\\n    \\x02\\x12\\x04\\x90\\x03\\x18\\x19\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x08\\\n    \\x12\\x04\\x91\\x03\\x06\\x1c\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x08\\x01\\\n    \\x12\\x04\\x91\\x03\\x06\\x17\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x08\\x02\\\n    \\x12\\x04\\x91\\x03\\x1a\\x1b\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\t\\x12\\\n    \\x04\\x92\\x03\\x06\\x19\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\t\\x01\\x12\\x04\\\n    \\x92\\x03\\x06\\x14\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\t\\x02\\x12\\x04\\x92\\\n    \\x03\\x17\\x18\\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\n\\x12\\x04\\x93\\x03\\\n    \\x06\\x19\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\n\\x01\\x12\\x04\\x93\\x03\\x06\\\n    \\x13\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\n\\x02\\x12\\x04\\x93\\x03\\x16\\x18\\\n    \\n\\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x0b\\x12\\x04\\x94\\x03\\x06\\x17\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x0b\\x01\\x12\\x04\\x94\\x03\\x06\\x11\\n\\\n    \\x11\\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x0b\\x02\\x12\\x04\\x94\\x03\\x14\\x16\\n\\\n    \\x10\\n\\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x0c\\x12\\x04\\x95\\x03\\x06\\x1f\\n\\x11\\\n    \\n\\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x0c\\x01\\x12\\x04\\x95\\x03\\x06\\x19\\n\\x11\\n\\\n    \\t\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\x0c\\x02\\x12\\x04\\x95\\x03\\x1c\\x1e\\n\\x10\\n\\\n    \\x08\\x04\\x19\\x03\\x01\\x04\\x01\\x02\\r\\x12\\x04\\x96\\x03\\x06\\x13\\n\\x11\\n\\t\\x04\\\n    \\x19\\x03\\x01\\x04\\x01\\x02\\r\\x01\\x12\\x04\\x96\\x03\\x06\\r\\n\\x11\\n\\t\\x04\\x19\\\n    \\x03\\x01\\x04\\x01\\x02\\r\\x02\\x12\\x04\\x96\\x03\\x10\\x12\\n\\x10\\n\\x08\\x04\\x19\\\n    \\x03\\x01\\x04\\x01\\x02\\x0e\\x12\\x04\\x97\\x03\\x06\\x1b\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\x01\\x04\\x01\\x02\\x0e\\x01\\x12\\x04\\x97\\x03\\x06\\x15\\n\\x11\\n\\t\\x04\\x19\\x03\\\n    \\x01\\x04\\x01\\x02\\x0e\\x02\\x12\\x04\\x97\\x03\\x18\\x1a\\n\\x10\\n\\x08\\x04\\x19\\x03\\\n    \\x01\\x04\\x01\\x02\\x0f\\x12\\x04\\x98\\x03\\x06\\x18\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\\n    \\x04\\x01\\x02\\x0f\\x01\\x12\\x04\\x98\\x03\\x06\\x12\\n\\x11\\n\\t\\x04\\x19\\x03\\x01\\\n    \\x04\\x01\\x02\\x0f\\x02\\x12\\x04\\x98\\x03\\x15\\x17\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\\n    \\x02\\0\\x12\\x04\\x9a\\x03\\x04\\x12\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\0\\x05\\x12\\\n    \\x04\\x9a\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\0\\x01\\x12\\x04\\x9a\\x03\\\n    \\n\\r\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\0\\x03\\x12\\x04\\x9a\\x03\\x10\\x11\\n\\x0e\\\n    \\n\\x06\\x04\\x19\\x03\\x01\\x02\\x01\\x12\\x04\\x9b\\x03\\x04\\x11\\n\\x0f\\n\\x07\\x04\\\n    \\x19\\x03\\x01\\x02\\x01\\x06\\x12\\x04\\x9b\\x03\\x04\\x08\\n\\x0f\\n\\x07\\x04\\x19\\x03\\\n    \\x01\\x02\\x01\\x01\\x12\\x04\\x9b\\x03\\t\\x0c\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\\n    \\x01\\x03\\x12\\x04\\x9b\\x03\\x0f\\x10\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x02\\x12\\\n    \\x04\\x9c\\x03\\x04#\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x02\\x06\\x12\\x04\\x9c\\\n    \\x03\\x04\\x12\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x02\\x01\\x12\\x04\\x9c\\x03\\x13\\\n    \\x1e\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x02\\x03\\x12\\x04\\x9c\\x03!\\\"\\n\\x0e\\n\\\n    \\x06\\x04\\x19\\x03\\x01\\x02\\x03\\x12\\x04\\x9e\\x03\\x04\\x1d\\n\\x0f\\n\\x07\\x04\\x19\\\n    \\x03\\x01\\x02\\x03\\x05\\x12\\x04\\x9e\\x03\\x04\\n\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\\n    \\x02\\x03\\x01\\x12\\x04\\x9e\\x03\\x0b\\x17\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x03\\\n    \\x03\\x12\\x04\\x9e\\x03\\x1a\\x1c\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x04\\x12\\x04\\\n    \\x9f\\x03\\x04\\x1f\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x04\\x05\\x12\\x04\\x9f\\x03\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x04\\x01\\x12\\x04\\x9f\\x03\\n\\x19\\n\\\n    \\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x04\\x03\\x12\\x04\\x9f\\x03\\x1c\\x1e\\n\\x0e\\n\\\n    \\x06\\x04\\x19\\x03\\x01\\x02\\x05\\x12\\x04\\xa0\\x03\\x04\\x1f\\n\\x0f\\n\\x07\\x04\\x19\\\n    \\x03\\x01\\x02\\x05\\x05\\x12\\x04\\xa0\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\\n    \\x02\\x05\\x01\\x12\\x04\\xa0\\x03\\n\\x19\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x05\\\n    \\x03\\x12\\x04\\xa0\\x03\\x1c\\x1e\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x06\\x12\\x04\\\n    \\xa1\\x03\\x04(\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x06\\x05\\x12\\x04\\xa1\\x03\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x06\\x01\\x12\\x04\\xa1\\x03\\n\\\"\\n\\x0f\\\n    \\n\\x07\\x04\\x19\\x03\\x01\\x02\\x06\\x03\\x12\\x04\\xa1\\x03%'\\n\\x0e\\n\\x06\\x04\\x19\\\n    \\x03\\x01\\x02\\x07\\x12\\x04\\xa2\\x03\\x04.\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\\n    \\x07\\x05\\x12\\x04\\xa2\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x07\\x01\\\n    \\x12\\x04\\xa2\\x03\\n(\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x07\\x03\\x12\\x04\\xa2\\\n    \\x03+-\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x08\\x12\\x04\\xa3\\x03\\x040\\n\\x0f\\n\\\n    \\x07\\x04\\x19\\x03\\x01\\x02\\x08\\x05\\x12\\x04\\xa3\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\\n    \\x19\\x03\\x01\\x02\\x08\\x01\\x12\\x04\\xa3\\x03\\n*\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\\n    \\x02\\x08\\x03\\x12\\x04\\xa3\\x03-/\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\t\\x12\\x04\\\n    \\xa4\\x03\\x04\\x1b\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\t\\x05\\x12\\x04\\xa4\\x03\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\t\\x01\\x12\\x04\\xa4\\x03\\n\\x15\\n\\x0f\\\n    \\n\\x07\\x04\\x19\\x03\\x01\\x02\\t\\x03\\x12\\x04\\xa4\\x03\\x18\\x1a\\n\\x0e\\n\\x06\\x04\\\n    \\x19\\x03\\x01\\x02\\n\\x12\\x04\\xa5\\x03\\x04(\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\\n    \\n\\x05\\x12\\x04\\xa5\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\n\\x01\\x12\\\n    \\x04\\xa5\\x03\\n\\\"\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\n\\x03\\x12\\x04\\xa5\\x03%'\\\n    \\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x0b\\x12\\x04\\xa8\\x03\\x04\\x17\\n\\x0f\\n\\x07\\\n    \\x04\\x19\\x03\\x01\\x02\\x0b\\x05\\x12\\x04\\xa8\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\\n    \\x03\\x01\\x02\\x0b\\x01\\x12\\x04\\xa8\\x03\\n\\x11\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\\n    \\x02\\x0b\\x03\\x12\\x04\\xa8\\x03\\x14\\x16\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x0c\\\n    \\x12\\x04\\xa9\\x03\\x041\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x0c\\x04\\x12\\x04\\\n    \\xa9\\x03\\x04\\x0c\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x0c\\x06\\x12\\x04\\xa9\\x03\\\n    \\r\\x1e\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x0c\\x01\\x12\\x04\\xa9\\x03\\x1f+\\n\\\n    \\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\x0c\\x03\\x12\\x04\\xa9\\x03.0\\n\\x0e\\n\\x06\\x04\\\n    \\x19\\x03\\x01\\x02\\r\\x12\\x04\\xaa\\x03\\x04&\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\\n    \\r\\x05\\x12\\x04\\xaa\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\r\\x01\\x12\\\n    \\x04\\xaa\\x03\\n\\x20\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\x02\\r\\x03\\x12\\x04\\xaa\\x03\\\n    #%\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x01\\x02\\x0e\\x12\\x04\\xab\\x03\\x045\\n\\x0f\\n\\x07\\\n    \\x04\\x19\\x03\\x01\\x02\\x0e\\x06\\x12\\x04\\xab\\x03\\x04\\x16\\n\\x0f\\n\\x07\\x04\\x19\\\n    \\x03\\x01\\x02\\x0e\\x01\\x12\\x04\\xab\\x03\\x17/\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x01\\\n    \\x02\\x0e\\x03\\x12\\x04\\xab\\x0324\\n\\x0e\\n\\x04\\x04\\x19\\x03\\x02\\x12\\x06\\xae\\\n    \\x03\\x02\\xbc\\x03\\x03\\n\\r\\n\\x05\\x04\\x19\\x03\\x02\\x01\\x12\\x04\\xae\\x03\\n\\r\\n\\\n    \\x0e\\n\\x06\\x04\\x19\\x03\\x02\\x02\\0\\x12\\x04\\xaf\\x03\\x04\\x1e\\n\\x0f\\n\\x07\\x04\\\n    \\x19\\x03\\x02\\x02\\0\\x05\\x12\\x04\\xaf\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\\n    \\x02\\0\\x01\\x12\\x04\\xaf\\x03\\n\\x19\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\0\\x03\\\n    \\x12\\x04\\xaf\\x03\\x1c\\x1d\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x02\\x02\\x01\\x12\\x04\\xb0\\\n    \\x03\\x04\\x1c\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x01\\x05\\x12\\x04\\xb0\\x03\\x04\\\n    \\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x01\\x01\\x12\\x04\\xb0\\x03\\n\\x17\\n\\x0f\\n\\\n    \\x07\\x04\\x19\\x03\\x02\\x02\\x01\\x03\\x12\\x04\\xb0\\x03\\x1a\\x1b\\n\\x0e\\n\\x06\\x04\\\n    \\x19\\x03\\x02\\x02\\x02\\x12\\x04\\xb1\\x03\\x04\\x1d\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\\n    \\x02\\x02\\x05\\x12\\x04\\xb1\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x02\\\n    \\x01\\x12\\x04\\xb1\\x03\\n\\x18\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x02\\x03\\x12\\\n    \\x04\\xb1\\x03\\x1b\\x1c\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x02\\x02\\x03\\x12\\x04\\xb2\\x03\\\n    \\x04\\x19\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x03\\x05\\x12\\x04\\xb2\\x03\\x04\\t\\n\\\n    \\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x03\\x01\\x12\\x04\\xb2\\x03\\n\\x14\\n\\x0f\\n\\x07\\\n    \\x04\\x19\\x03\\x02\\x02\\x03\\x03\\x12\\x04\\xb2\\x03\\x17\\x18\\n\\x0e\\n\\x06\\x04\\x19\\\n    \\x03\\x02\\x02\\x04\\x12\\x04\\xb3\\x03\\x04!\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\\n    \\x04\\x04\\x12\\x04\\xb3\\x03\\x04\\x0c\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x04\\x06\\\n    \\x12\\x04\\xb3\\x03\\r\\x16\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x04\\x01\\x12\\x04\\\n    \\xb3\\x03\\x17\\x1c\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x04\\x03\\x12\\x04\\xb3\\x03\\\n    \\x1f\\x20\\n\\x1f\\n\\x06\\x04\\x19\\x03\\x02\\x02\\x05\\x12\\x04\\xb5\\x03\\x04\\x14\\x1a\\\n    \\x0f\\x20data\\x20not\\x20used\\n\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x05\\x05\\\n    \\x12\\x04\\xb5\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x05\\x01\\x12\\x04\\\n    \\xb5\\x03\\n\\x0e\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x05\\x03\\x12\\x04\\xb5\\x03\\\n    \\x11\\x13\\nI\\n\\x06\\x04\\x19\\x03\\x02\\x02\\x06\\x12\\x04\\xb7\\x03\\x04$\\x1a9only\\\n    \\x20support\\x20size\\x20=\\x201,\\x20\\x20repeated\\x20list\\x20here\\x20for\\\n    \\x20extension\\n\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x06\\x04\\x12\\x04\\xb7\\x03\\\n    \\x04\\x0c\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x06\\x06\\x12\\x04\\xb7\\x03\\r\\x15\\n\\\n    \\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x06\\x01\\x12\\x04\\xb7\\x03\\x16\\x1e\\n\\x0f\\n\\\n    \\x07\\x04\\x19\\x03\\x02\\x02\\x06\\x03\\x12\\x04\\xb7\\x03!#\\n\\\"\\n\\x06\\x04\\x19\\x03\\\n    \\x02\\x02\\x07\\x12\\x04\\xb9\\x03\\x04\\x17\\x1a\\x12\\x20scripts\\x20not\\x20used\\n\\\n    \\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x07\\x05\\x12\\x04\\xb9\\x03\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04\\x19\\x03\\x02\\x02\\x07\\x01\\x12\\x04\\xb9\\x03\\n\\x11\\n\\x0f\\n\\x07\\x04\\\n    \\x19\\x03\\x02\\x02\\x07\\x03\\x12\\x04\\xb9\\x03\\x14\\x16\\n\\x0e\\n\\x06\\x04\\x19\\x03\\\n    \\x02\\x02\\x08\\x12\\x04\\xba\\x03\\x04\\x19\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x08\\\n    \\x05\\x12\\x04\\xba\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x08\\x01\\x12\\\n    \\x04\\xba\\x03\\n\\x13\\n\\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\x08\\x03\\x12\\x04\\xba\\\n    \\x03\\x16\\x18\\n\\x0e\\n\\x06\\x04\\x19\\x03\\x02\\x02\\t\\x12\\x04\\xbb\\x03\\x04\\x19\\n\\\n    \\x0f\\n\\x07\\x04\\x19\\x03\\x02\\x02\\t\\x05\\x12\\x04\\xbb\\x03\\x04\\t\\n\\x0f\\n\\x07\\\n    \\x04\\x19\\x03\\x02\\x02\\t\\x01\\x12\\x04\\xbb\\x03\\n\\x13\\n\\x0f\\n\\x07\\x04\\x19\\x03\\\n    \\x02\\x02\\t\\x03\\x12\\x04\\xbb\\x03\\x16\\x18\\n\\x0c\\n\\x04\\x04\\x19\\x02\\0\\x12\\x04\\\n    \\xbe\\x03\\x02\\x13\\n\\r\\n\\x05\\x04\\x19\\x02\\0\\x06\\x12\\x04\\xbe\\x03\\x02\\x05\\n\\r\\\n    \\n\\x05\\x04\\x19\\x02\\0\\x01\\x12\\x04\\xbe\\x03\\x06\\x0e\\n\\r\\n\\x05\\x04\\x19\\x02\\0\\\n    \\x03\\x12\\x04\\xbe\\x03\\x11\\x12\\nQ\\n\\x04\\x04\\x19\\x02\\x01\\x12\\x04\\xc0\\x03\\\n    \\x02\\x1f\\x1aC\\x20only\\x20support\\x20size\\x20=\\x201,\\x20\\x20repeated\\x20l\\\n    ist\\x20here\\x20for\\x20muti-sig\\x20extension\\n\\n\\r\\n\\x05\\x04\\x19\\x02\\x01\\\n    \\x04\\x12\\x04\\xc0\\x03\\x02\\n\\n\\r\\n\\x05\\x04\\x19\\x02\\x01\\x05\\x12\\x04\\xc0\\x03\\\n    \\x0b\\x10\\n\\r\\n\\x05\\x04\\x19\\x02\\x01\\x01\\x12\\x04\\xc0\\x03\\x11\\x1a\\n\\r\\n\\x05\\\n    \\x04\\x19\\x02\\x01\\x03\\x12\\x04\\xc0\\x03\\x1d\\x1e\\n\\x0c\\n\\x04\\x04\\x19\\x02\\x02\\\n    \\x12\\x04\\xc1\\x03\\x02\\x1a\\n\\r\\n\\x05\\x04\\x19\\x02\\x02\\x04\\x12\\x04\\xc1\\x03\\\n    \\x02\\n\\n\\r\\n\\x05\\x04\\x19\\x02\\x02\\x06\\x12\\x04\\xc1\\x03\\x0b\\x11\\n\\r\\n\\x05\\\n    \\x04\\x19\\x02\\x02\\x01\\x12\\x04\\xc1\\x03\\x12\\x15\\n\\r\\n\\x05\\x04\\x19\\x02\\x02\\\n    \\x03\\x12\\x04\\xc1\\x03\\x18\\x19\\n\\x0c\\n\\x02\\x04\\x1a\\x12\\x06\\xc4\\x03\\0\\xe9\\\n    \\x03\\x01\\n\\x0b\\n\\x03\\x04\\x1a\\x01\\x12\\x04\\xc4\\x03\\x08\\x17\\n\\x0e\\n\\x04\\x04\\\n    \\x1a\\x04\\0\\x12\\x06\\xc5\\x03\\x02\\xc8\\x03\\x03\\n\\r\\n\\x05\\x04\\x1a\\x04\\0\\x01\\\n    \\x12\\x04\\xc5\\x03\\x07\\x0b\\n\\x0e\\n\\x06\\x04\\x1a\\x04\\0\\x02\\0\\x12\\x04\\xc6\\x03\\\n    \\x04\\x0f\\n\\x0f\\n\\x07\\x04\\x1a\\x04\\0\\x02\\0\\x01\\x12\\x04\\xc6\\x03\\x04\\n\\n\\x0f\\\n    \\n\\x07\\x04\\x1a\\x04\\0\\x02\\0\\x02\\x12\\x04\\xc6\\x03\\r\\x0e\\n\\x0e\\n\\x06\\x04\\x1a\\\n    \\x04\\0\\x02\\x01\\x12\\x04\\xc7\\x03\\x04\\x0f\\n\\x0f\\n\\x07\\x04\\x1a\\x04\\0\\x02\\x01\\\n    \\x01\\x12\\x04\\xc7\\x03\\x04\\n\\n\\x0f\\n\\x07\\x04\\x1a\\x04\\0\\x02\\x01\\x02\\x12\\x04\\\n    \\xc7\\x03\\r\\x0e\\n\\x0e\\n\\x04\\x04\\x1a\\x03\\0\\x12\\x06\\xc9\\x03\\x02\\xcd\\x03\\x03\\\n    \\n\\r\\n\\x05\\x04\\x1a\\x03\\0\\x01\\x12\\x04\\xc9\\x03\\n\\r\\n\\x0e\\n\\x06\\x04\\x1a\\x03\\\n    \\0\\x02\\0\\x12\\x04\\xca\\x03\\x04\\x16\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\0\\x05\\x12\\\n    \\x04\\xca\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\0\\x01\\x12\\x04\\xca\\x03\\n\\\n    \\x11\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\0\\x03\\x12\\x04\\xca\\x03\\x14\\x15\\n\\x0e\\n\\\n    \\x06\\x04\\x1a\\x03\\0\\x02\\x01\\x12\\x04\\xcb\\x03\\x04\\x1e\\n\\x0f\\n\\x07\\x04\\x1a\\\n    \\x03\\0\\x02\\x01\\x04\\x12\\x04\\xcb\\x03\\x04\\x0c\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\\n    \\x01\\x05\\x12\\x04\\xcb\\x03\\r\\x12\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\x01\\x01\\x12\\\n    \\x04\\xcb\\x03\\x13\\x19\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xcb\\\n    \\x03\\x1c\\x1d\\n\\x0e\\n\\x06\\x04\\x1a\\x03\\0\\x02\\x02\\x12\\x04\\xcc\\x03\\x04\\x13\\n\\\n    \\x0f\\n\\x07\\x04\\x1a\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xcc\\x03\\x04\\t\\n\\x0f\\n\\x07\\\n    \\x04\\x1a\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xcc\\x03\\n\\x0e\\n\\x0f\\n\\x07\\x04\\x1a\\x03\\\n    \\0\\x02\\x02\\x03\\x12\\x04\\xcc\\x03\\x11\\x12\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\0\\x12\\x04\\\n    \\xce\\x03\\x02\\x0f\\n\\r\\n\\x05\\x04\\x1a\\x02\\0\\x05\\x12\\x04\\xce\\x03\\x02\\x07\\n\\r\\\n    \\n\\x05\\x04\\x1a\\x02\\0\\x01\\x12\\x04\\xce\\x03\\x08\\n\\n\\r\\n\\x05\\x04\\x1a\\x02\\0\\\n    \\x03\\x12\\x04\\xce\\x03\\r\\x0e\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x01\\x12\\x04\\xcf\\x03\\\n    \\x02\\x10\\n\\r\\n\\x05\\x04\\x1a\\x02\\x01\\x05\\x12\\x04\\xcf\\x03\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x1a\\x02\\x01\\x01\\x12\\x04\\xcf\\x03\\x08\\x0b\\n\\r\\n\\x05\\x04\\x1a\\x02\\x01\\\n    \\x03\\x12\\x04\\xcf\\x03\\x0e\\x0f\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x02\\x12\\x04\\xd0\\x03\\\n    \\x02\\x18\\n\\r\\n\\x05\\x04\\x1a\\x02\\x02\\x05\\x12\\x04\\xd0\\x03\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x1a\\x02\\x02\\x01\\x12\\x04\\xd0\\x03\\x08\\x13\\n\\r\\n\\x05\\x04\\x1a\\x02\\x02\\\n    \\x03\\x12\\x04\\xd0\\x03\\x16\\x17\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x03\\x12\\x04\\xd1\\x03\\\n    \\x02\\x1b\\n\\r\\n\\x05\\x04\\x1a\\x02\\x03\\x05\\x12\\x04\\xd1\\x03\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x1a\\x02\\x03\\x01\\x12\\x04\\xd1\\x03\\x08\\x16\\n\\r\\n\\x05\\x04\\x1a\\x02\\x03\\\n    \\x03\\x12\\x04\\xd1\\x03\\x19\\x1a\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x04\\x12\\x04\\xd2\\x03\\\n    \\x02$\\n\\r\\n\\x05\\x04\\x1a\\x02\\x04\\x04\\x12\\x04\\xd2\\x03\\x02\\n\\n\\r\\n\\x05\\x04\\\n    \\x1a\\x02\\x04\\x05\\x12\\x04\\xd2\\x03\\x0b\\x10\\n\\r\\n\\x05\\x04\\x1a\\x02\\x04\\x01\\\n    \\x12\\x04\\xd2\\x03\\x11\\x1f\\n\\r\\n\\x05\\x04\\x1a\\x02\\x04\\x03\\x12\\x04\\xd2\\x03\\\"\\\n    #\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x05\\x12\\x04\\xd3\\x03\\x02\\x1d\\n\\r\\n\\x05\\x04\\x1a\\\n    \\x02\\x05\\x05\\x12\\x04\\xd3\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x05\\x01\\x12\\\n    \\x04\\xd3\\x03\\x08\\x18\\n\\r\\n\\x05\\x04\\x1a\\x02\\x05\\x03\\x12\\x04\\xd3\\x03\\x1b\\\n    \\x1c\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x06\\x12\\x04\\xd4\\x03\\x02\\x1e\\n\\r\\n\\x05\\x04\\\n    \\x1a\\x02\\x06\\x06\\x12\\x04\\xd4\\x03\\x02\\x11\\n\\r\\n\\x05\\x04\\x1a\\x02\\x06\\x01\\\n    \\x12\\x04\\xd4\\x03\\x12\\x19\\n\\r\\n\\x05\\x04\\x1a\\x02\\x06\\x03\\x12\\x04\\xd4\\x03\\\n    \\x1c\\x1d\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x07\\x12\\x04\\xd5\\x03\\x02\\x17\\n\\r\\n\\x05\\\n    \\x04\\x1a\\x02\\x07\\x04\\x12\\x04\\xd5\\x03\\x02\\n\\n\\r\\n\\x05\\x04\\x1a\\x02\\x07\\x06\\\n    \\x12\\x04\\xd5\\x03\\x0b\\x0e\\n\\r\\n\\x05\\x04\\x1a\\x02\\x07\\x01\\x12\\x04\\xd5\\x03\\\n    \\x0f\\x12\\n\\r\\n\\x05\\x04\\x1a\\x02\\x07\\x03\\x12\\x04\\xd5\\x03\\x15\\x16\\n\\x0c\\n\\\n    \\x04\\x04\\x1a\\x02\\x08\\x12\\x04\\xd6\\x03\\x02\\x12\\n\\r\\n\\x05\\x04\\x1a\\x02\\x08\\\n    \\x06\\x12\\x04\\xd6\\x03\\x02\\x06\\n\\r\\n\\x05\\x04\\x1a\\x02\\x08\\x01\\x12\\x04\\xd6\\\n    \\x03\\x07\\r\\n\\r\\n\\x05\\x04\\x1a\\x02\\x08\\x03\\x12\\x04\\xd6\\x03\\x10\\x11\\n\\x0c\\n\\\n    \\x04\\x04\\x1a\\x02\\t\\x12\\x04\\xd7\\x03\\x02\\x18\\n\\r\\n\\x05\\x04\\x1a\\x02\\t\\x05\\\n    \\x12\\x04\\xd7\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\t\\x01\\x12\\x04\\xd7\\x03\\x08\\\n    \\x12\\n\\r\\n\\x05\\x04\\x1a\\x02\\t\\x03\\x12\\x04\\xd7\\x03\\x15\\x17\\n\\x0c\\n\\x04\\x04\\\n    \\x1a\\x02\\n\\x12\\x04\\xd9\\x03\\x02\\x1b\\n\\r\\n\\x05\\x04\\x1a\\x02\\n\\x05\\x12\\x04\\\n    \\xd9\\x03\\x02\\x08\\n\\r\\n\\x05\\x04\\x1a\\x02\\n\\x01\\x12\\x04\\xd9\\x03\\t\\x15\\n\\r\\n\\\n    \\x05\\x04\\x1a\\x02\\n\\x03\\x12\\x04\\xd9\\x03\\x18\\x1a\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\\n    \\x0b\\x12\\x04\\xda\\x03\\x02\\x1d\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0b\\x05\\x12\\x04\\xda\\\n    \\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0b\\x01\\x12\\x04\\xda\\x03\\x08\\x17\\n\\r\\n\\\n    \\x05\\x04\\x1a\\x02\\x0b\\x03\\x12\\x04\\xda\\x03\\x1a\\x1c\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\\n    \\x0c\\x12\\x04\\xdb\\x03\\x02\\x1d\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0c\\x05\\x12\\x04\\xdb\\\n    \\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0c\\x01\\x12\\x04\\xdb\\x03\\x08\\x17\\n\\r\\n\\\n    \\x05\\x04\\x1a\\x02\\x0c\\x03\\x12\\x04\\xdb\\x03\\x1a\\x1c\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\\n    \\r\\x12\\x04\\xdc\\x03\\x02:\\n\\r\\n\\x05\\x04\\x1a\\x02\\r\\x04\\x12\\x04\\xdc\\x03\\x02\\\n    \\n\\n\\r\\n\\x05\\x04\\x1a\\x02\\r\\x06\\x12\\x04\\xdc\\x03\\x0b\\x1e\\n\\r\\n\\x05\\x04\\x1a\\\n    \\x02\\r\\x01\\x12\\x04\\xdc\\x03\\x1f4\\n\\r\\n\\x05\\x04\\x1a\\x02\\r\\x03\\x12\\x04\\xdc\\\n    \\x0379\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x0e\\x12\\x04\\xdd\\x03\\x02&\\n\\r\\n\\x05\\x04\\\n    \\x1a\\x02\\x0e\\x05\\x12\\x04\\xdd\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0e\\x01\\\n    \\x12\\x04\\xdd\\x03\\x08\\x20\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0e\\x03\\x12\\x04\\xdd\\x03#%\\\n    \\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x0f\\x12\\x04\\xde\\x03\\x02,\\n\\r\\n\\x05\\x04\\x1a\\x02\\\n    \\x0f\\x05\\x12\\x04\\xde\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0f\\x01\\x12\\x04\\\n    \\xde\\x03\\x08&\\n\\r\\n\\x05\\x04\\x1a\\x02\\x0f\\x03\\x12\\x04\\xde\\x03)+\\n\\x0c\\n\\\n    \\x04\\x04\\x1a\\x02\\x10\\x12\\x04\\xdf\\x03\\x02.\\n\\r\\n\\x05\\x04\\x1a\\x02\\x10\\x05\\\n    \\x12\\x04\\xdf\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x10\\x01\\x12\\x04\\xdf\\x03\\\n    \\x08(\\n\\r\\n\\x05\\x04\\x1a\\x02\\x10\\x03\\x12\\x04\\xdf\\x03+-\\n\\x0c\\n\\x04\\x04\\\n    \\x1a\\x02\\x11\\x12\\x04\\xe0\\x03\\x02\\x19\\n\\r\\n\\x05\\x04\\x1a\\x02\\x11\\x05\\x12\\\n    \\x04\\xe0\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x11\\x01\\x12\\x04\\xe0\\x03\\x08\\\n    \\x13\\n\\r\\n\\x05\\x04\\x1a\\x02\\x11\\x03\\x12\\x04\\xe0\\x03\\x16\\x18\\n\\x0c\\n\\x04\\\n    \\x04\\x1a\\x02\\x12\\x12\\x04\\xe1\\x03\\x02&\\n\\r\\n\\x05\\x04\\x1a\\x02\\x12\\x05\\x12\\\n    \\x04\\xe1\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x12\\x01\\x12\\x04\\xe1\\x03\\x08\\\n    \\x20\\n\\r\\n\\x05\\x04\\x1a\\x02\\x12\\x03\\x12\\x04\\xe1\\x03#%\\n\\x0c\\n\\x04\\x04\\x1a\\\n    \\x02\\x13\\x12\\x04\\xe3\\x03\\x02\\x15\\n\\r\\n\\x05\\x04\\x1a\\x02\\x13\\x05\\x12\\x04\\\n    \\xe3\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\x1a\\x02\\x13\\x01\\x12\\x04\\xe3\\x03\\x08\\x0f\\n\\\n    \\r\\n\\x05\\x04\\x1a\\x02\\x13\\x03\\x12\\x04\\xe3\\x03\\x12\\x14\\n\\x0c\\n\\x04\\x04\\x1a\\\n    \\x02\\x14\\x12\\x04\\xe4\\x03\\x02/\\n\\r\\n\\x05\\x04\\x1a\\x02\\x14\\x04\\x12\\x04\\xe4\\\n    \\x03\\x02\\n\\n\\r\\n\\x05\\x04\\x1a\\x02\\x14\\x06\\x12\\x04\\xe4\\x03\\x0b\\x1c\\n\\r\\n\\\n    \\x05\\x04\\x1a\\x02\\x14\\x01\\x12\\x04\\xe4\\x03\\x1d)\\n\\r\\n\\x05\\x04\\x1a\\x02\\x14\\\n    \\x03\\x12\\x04\\xe4\\x03,.\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x15\\x12\\x04\\xe5\\x03\\x02\\\n    \\x18\\n\\r\\n\\x05\\x04\\x1a\\x02\\x15\\x05\\x12\\x04\\xe5\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\\n    \\x1a\\x02\\x15\\x01\\x12\\x04\\xe5\\x03\\x08\\x12\\n\\r\\n\\x05\\x04\\x1a\\x02\\x15\\x03\\\n    \\x12\\x04\\xe5\\x03\\x15\\x17\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x16\\x12\\x04\\xe7\\x03\\x02\\\n    $\\n\\r\\n\\x05\\x04\\x1a\\x02\\x16\\x05\\x12\\x04\\xe7\\x03\\x02\\x07\\n\\r\\n\\x05\\x04\\\n    \\x1a\\x02\\x16\\x01\\x12\\x04\\xe7\\x03\\x08\\x1e\\n\\r\\n\\x05\\x04\\x1a\\x02\\x16\\x03\\\n    \\x12\\x04\\xe7\\x03!#\\n\\x0c\\n\\x04\\x04\\x1a\\x02\\x17\\x12\\x04\\xe8\\x03\\x023\\n\\r\\\n    \\n\\x05\\x04\\x1a\\x02\\x17\\x06\\x12\\x04\\xe8\\x03\\x02\\x14\\n\\r\\n\\x05\\x04\\x1a\\x02\\\n    \\x17\\x01\\x12\\x04\\xe8\\x03\\x15-\\n\\r\\n\\x05\\x04\\x1a\\x02\\x17\\x03\\x12\\x04\\xe8\\\n    \\x0302\\n\\x0c\\n\\x02\\x04\\x1b\\x12\\x06\\xeb\\x03\\0\\xef\\x03\\x01\\n\\x0b\\n\\x03\\x04\\\n    \\x1b\\x01\\x12\\x04\\xeb\\x03\\x08\\x16\\n\\x0c\\n\\x04\\x04\\x1b\\x02\\0\\x12\\x04\\xec\\\n    \\x03\\x02\\x18\\n\\r\\n\\x05\\x04\\x1b\\x02\\0\\x05\\x12\\x04\\xec\\x03\\x02\\x07\\n\\r\\n\\\n    \\x05\\x04\\x1b\\x02\\0\\x01\\x12\\x04\\xec\\x03\\x08\\x13\\n\\r\\n\\x05\\x04\\x1b\\x02\\0\\\n    \\x03\\x12\\x04\\xec\\x03\\x16\\x17\\n\\x0c\\n\\x04\\x04\\x1b\\x02\\x01\\x12\\x04\\xed\\x03\\\n    \\x02\\x1b\\n\\r\\n\\x05\\x04\\x1b\\x02\\x01\\x05\\x12\\x04\\xed\\x03\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x1b\\x02\\x01\\x01\\x12\\x04\\xed\\x03\\x08\\x16\\n\\r\\n\\x05\\x04\\x1b\\x02\\x01\\\n    \\x03\\x12\\x04\\xed\\x03\\x19\\x1a\\n\\x0c\\n\\x04\\x04\\x1b\\x02\\x02\\x12\\x04\\xee\\x03\\\n    \\x02/\\n\\r\\n\\x05\\x04\\x1b\\x02\\x02\\x04\\x12\\x04\\xee\\x03\\x02\\n\\n\\r\\n\\x05\\x04\\\n    \\x1b\\x02\\x02\\x06\\x12\\x04\\xee\\x03\\x0b\\x1a\\n\\r\\n\\x05\\x04\\x1b\\x02\\x02\\x01\\\n    \\x12\\x04\\xee\\x03\\x1b*\\n\\r\\n\\x05\\x04\\x1b\\x02\\x02\\x03\\x12\\x04\\xee\\x03-.\\n\\\n    \\x0c\\n\\x02\\x04\\x1c\\x12\\x06\\xf1\\x03\\0\\xf3\\x03\\x01\\n\\x0b\\n\\x03\\x04\\x1c\\x01\\\n    \\x12\\x04\\xf1\\x03\\x08\\x14\\n\\x0c\\n\\x04\\x04\\x1c\\x02\\0\\x12\\x04\\xf2\\x03\\x02(\\\n    \\n\\r\\n\\x05\\x04\\x1c\\x02\\0\\x04\\x12\\x04\\xf2\\x03\\x02\\n\\n\\r\\n\\x05\\x04\\x1c\\x02\\\n    \\0\\x06\\x12\\x04\\xf2\\x03\\x0b\\x16\\n\\r\\n\\x05\\x04\\x1c\\x02\\0\\x01\\x12\\x04\\xf2\\\n    \\x03\\x17#\\n\\r\\n\\x05\\x04\\x1c\\x02\\0\\x03\\x12\\x04\\xf2\\x03&'\\n\\x0c\\n\\x02\\x04\\\n    \\x1d\\x12\\x06\\xf5\\x03\\0\\x84\\x04\\x01\\n\\x0b\\n\\x03\\x04\\x1d\\x01\\x12\\x04\\xf5\\\n    \\x03\\x08\\x13\\n\\x0e\\n\\x04\\x04\\x1d\\x03\\0\\x12\\x06\\xf6\\x03\\x02\\x81\\x04\\x03\\n\\\n    \\r\\n\\x05\\x04\\x1d\\x03\\0\\x01\\x12\\x04\\xf6\\x03\\n\\r\\n\\x0e\\n\\x06\\x04\\x1d\\x03\\0\\\n    \\x02\\0\\x12\\x04\\xf7\\x03\\x04\\x18\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\0\\x05\\x12\\\n    \\x04\\xf7\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\0\\x01\\x12\\x04\\xf7\\x03\\n\\\n    \\x13\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\0\\x03\\x12\\x04\\xf7\\x03\\x16\\x17\\n\\x0e\\n\\\n    \\x06\\x04\\x1d\\x03\\0\\x02\\x01\\x12\\x04\\xf8\\x03\\x04\\x19\\n\\x0f\\n\\x07\\x04\\x1d\\\n    \\x03\\0\\x02\\x01\\x05\\x12\\x04\\xf8\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\\n    \\x01\\x01\\x12\\x04\\xf8\\x03\\n\\x14\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x01\\x03\\x12\\\n    \\x04\\xf8\\x03\\x17\\x18\\n\\x0e\\n\\x06\\x04\\x1d\\x03\\0\\x02\\x02\\x12\\x04\\xf9\\x03\\\n    \\x04\\x19\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xf9\\x03\\x04\\t\\n\\\n    \\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xf9\\x03\\n\\x14\\n\\x0f\\n\\x07\\\n    \\x04\\x1d\\x03\\0\\x02\\x02\\x03\\x12\\x04\\xf9\\x03\\x17\\x18\\n7\\n\\x06\\x04\\x1d\\x03\\\n    \\0\\x02\\x03\\x12\\x04\\xfc\\x03\\x04\\x15\\x1a'bytes\\x20nonce\\x20=\\x205;\\nbytes\\\n    \\x20difficulty\\x20=\\x206;\\n\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x03\\x05\\x12\\\n    \\x04\\xfc\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xfc\\x03\\\n    \\n\\x10\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x03\\x03\\x12\\x04\\xfc\\x03\\x13\\x14\\n\\\n    \\x0e\\n\\x06\\x04\\x1d\\x03\\0\\x02\\x04\\x12\\x04\\xfd\\x03\\x04\\x19\\n\\x0f\\n\\x07\\x04\\\n    \\x1d\\x03\\0\\x02\\x04\\x05\\x12\\x04\\xfd\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\\n    \\x02\\x04\\x01\\x12\\x04\\xfd\\x03\\n\\x14\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x04\\x03\\\n    \\x12\\x04\\xfd\\x03\\x17\\x18\\n\\x0e\\n\\x06\\x04\\x1d\\x03\\0\\x02\\x05\\x12\\x04\\xfe\\\n    \\x03\\x04\\x1e\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x05\\x05\\x12\\x04\\xfe\\x03\\x04\\t\\\n    \\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x05\\x01\\x12\\x04\\xfe\\x03\\n\\x19\\n\\x0f\\n\\x07\\\n    \\x04\\x1d\\x03\\0\\x02\\x05\\x03\\x12\\x04\\xfe\\x03\\x1c\\x1d\\n\\x0e\\n\\x06\\x04\\x1d\\\n    \\x03\\0\\x02\\x06\\x12\\x04\\xff\\x03\\x04\\x17\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x06\\\n    \\x05\\x12\\x04\\xff\\x03\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x06\\x01\\x12\\x04\\\n    \\xff\\x03\\n\\x11\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\x06\\x03\\x12\\x04\\xff\\x03\\x14\\\n    \\x16\\n\\x0e\\n\\x06\\x04\\x1d\\x03\\0\\x02\\x07\\x12\\x04\\x80\\x04\\x04\\x20\\n\\x0f\\n\\\n    \\x07\\x04\\x1d\\x03\\0\\x02\\x07\\x05\\x12\\x04\\x80\\x04\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1d\\\n    \\x03\\0\\x02\\x07\\x01\\x12\\x04\\x80\\x04\\n\\x1a\\n\\x0f\\n\\x07\\x04\\x1d\\x03\\0\\x02\\\n    \\x07\\x03\\x12\\x04\\x80\\x04\\x1d\\x1f\\n\\x0c\\n\\x04\\x04\\x1d\\x02\\0\\x12\\x04\\x82\\\n    \\x04\\x02\\x13\\n\\r\\n\\x05\\x04\\x1d\\x02\\0\\x06\\x12\\x04\\x82\\x04\\x02\\x05\\n\\r\\n\\\n    \\x05\\x04\\x1d\\x02\\0\\x01\\x12\\x04\\x82\\x04\\x06\\x0e\\n\\r\\n\\x05\\x04\\x1d\\x02\\0\\\n    \\x03\\x12\\x04\\x82\\x04\\x11\\x12\\n\\x0c\\n\\x04\\x04\\x1d\\x02\\x01\\x12\\x04\\x83\\x04\\\n    \\x02\\x1e\\n\\r\\n\\x05\\x04\\x1d\\x02\\x01\\x05\\x12\\x04\\x83\\x04\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04\\x1d\\x02\\x01\\x01\\x12\\x04\\x83\\x04\\x08\\x19\\n\\r\\n\\x05\\x04\\x1d\\x02\\x01\\\n    \\x03\\x12\\x04\\x83\\x04\\x1c\\x1d\\n\\x15\\n\\x02\\x04\\x1e\\x12\\x06\\x87\\x04\\0\\x8a\\\n    \\x04\\x01\\x1a\\x07\\x20block\\n\\n\\x0b\\n\\x03\\x04\\x1e\\x01\\x12\\x04\\x87\\x04\\x08\\\n    \\r\\n\\x0c\\n\\x04\\x04\\x1e\\x02\\0\\x12\\x04\\x88\\x04\\x02(\\n\\r\\n\\x05\\x04\\x1e\\x02\\\n    \\0\\x04\\x12\\x04\\x88\\x04\\x02\\n\\n\\r\\n\\x05\\x04\\x1e\\x02\\0\\x06\\x12\\x04\\x88\\x04\\\n    \\x0b\\x16\\n\\r\\n\\x05\\x04\\x1e\\x02\\0\\x01\\x12\\x04\\x88\\x04\\x17#\\n\\r\\n\\x05\\x04\\\n    \\x1e\\x02\\0\\x03\\x12\\x04\\x88\\x04&'\\n\\x0c\\n\\x04\\x04\\x1e\\x02\\x01\\x12\\x04\\x89\\\n    \\x04\\x02\\x1f\\n\\r\\n\\x05\\x04\\x1e\\x02\\x01\\x06\\x12\\x04\\x89\\x04\\x02\\r\\n\\r\\n\\\n    \\x05\\x04\\x1e\\x02\\x01\\x01\\x12\\x04\\x89\\x04\\x0e\\x1a\\n\\r\\n\\x05\\x04\\x1e\\x02\\\n    \\x01\\x03\\x12\\x04\\x89\\x04\\x1d\\x1e\\n\\x0c\\n\\x02\\x04\\x1f\\x12\\x06\\x8c\\x04\\0\\\n    \\x93\\x04\\x01\\n\\x0b\\n\\x03\\x04\\x1f\\x01\\x12\\x04\\x8c\\x04\\x08\\x16\\n\\x0e\\n\\x04\\\n    \\x04\\x1f\\x03\\0\\x12\\x06\\x8d\\x04\\x02\\x90\\x04\\x03\\n\\r\\n\\x05\\x04\\x1f\\x03\\0\\\n    \\x01\\x12\\x04\\x8d\\x04\\n\\x11\\n\\x0e\\n\\x06\\x04\\x1f\\x03\\0\\x02\\0\\x12\\x04\\x8e\\\n    \\x04\\x04\\x13\\n\\x0f\\n\\x07\\x04\\x1f\\x03\\0\\x02\\0\\x05\\x12\\x04\\x8e\\x04\\x04\\t\\n\\\n    \\x0f\\n\\x07\\x04\\x1f\\x03\\0\\x02\\0\\x01\\x12\\x04\\x8e\\x04\\n\\x0e\\n\\x0f\\n\\x07\\x04\\\n    \\x1f\\x03\\0\\x02\\0\\x03\\x12\\x04\\x8e\\x04\\x11\\x12\\n\\x0e\\n\\x06\\x04\\x1f\\x03\\0\\\n    \\x02\\x01\\x12\\x04\\x8f\\x04\\x04\\x15\\n\\x0f\\n\\x07\\x04\\x1f\\x03\\0\\x02\\x01\\x05\\\n    \\x12\\x04\\x8f\\x04\\x04\\t\\n\\x0f\\n\\x07\\x04\\x1f\\x03\\0\\x02\\x01\\x01\\x12\\x04\\x8f\\\n    \\x04\\n\\x10\\n\\x0f\\n\\x07\\x04\\x1f\\x03\\0\\x02\\x01\\x03\\x12\\x04\\x8f\\x04\\x13\\x14\\\n    \\n\\x0c\\n\\x04\\x04\\x1f\\x02\\0\\x12\\x04\\x91\\x04\\x02\\x1b\\n\\r\\n\\x05\\x04\\x1f\\x02\\\n    \\0\\x04\\x12\\x04\\x91\\x04\\x02\\n\\n\\r\\n\\x05\\x04\\x1f\\x02\\0\\x06\\x12\\x04\\x91\\x04\\\n    \\x0b\\x12\\n\\r\\n\\x05\\x04\\x1f\\x02\\0\\x01\\x12\\x04\\x91\\x04\\x13\\x16\\n\\r\\n\\x05\\\n    \\x04\\x1f\\x02\\0\\x03\\x12\\x04\\x91\\x04\\x19\\x1a\\n\\x0c\\n\\x04\\x04\\x1f\\x02\\x01\\\n    \\x12\\x04\\x92\\x04\\x02\\x17\\n\\r\\n\\x05\\x04\\x1f\\x02\\x01\\x05\\x12\\x04\\x92\\x04\\\n    \\x02\\x07\\n\\r\\n\\x05\\x04\\x1f\\x02\\x01\\x01\\x12\\x04\\x92\\x04\\x08\\x12\\n\\r\\n\\x05\\\n    \\x04\\x1f\\x02\\x01\\x03\\x12\\x04\\x92\\x04\\x15\\x16\\n\\x19\\n\\x02\\x04\\x20\\x12\\x06\\\n    \\x96\\x04\\0\\xa3\\x04\\x01\\x1a\\x0b\\x20Inventory\\n\\n\\x0b\\n\\x03\\x04\\x20\\x01\\\n    \\x12\\x04\\x96\\x04\\x08\\x16\\n\\x0e\\n\\x04\\x04\\x20\\x04\\0\\x12\\x06\\x97\\x04\\x02\\\n    \\x9b\\x04\\x03\\n\\r\\n\\x05\\x04\\x20\\x04\\0\\x01\\x12\\x04\\x97\\x04\\x07\\x0b\\n\\x0e\\n\\\n    \\x06\\x04\\x20\\x04\\0\\x02\\0\\x12\\x04\\x98\\x04\\x04\\r\\n\\x0f\\n\\x07\\x04\\x20\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x04\\x98\\x04\\x04\\x08\\n\\x0f\\n\\x07\\x04\\x20\\x04\\0\\x02\\0\\x02\\\n    \\x12\\x04\\x98\\x04\\x0b\\x0c\\n\\x0e\\n\\x06\\x04\\x20\\x04\\0\\x02\\x01\\x12\\x04\\x99\\\n    \\x04\\x04\\x10\\n\\x0f\\n\\x07\\x04\\x20\\x04\\0\\x02\\x01\\x01\\x12\\x04\\x99\\x04\\x04\\\n    \\x0b\\n\\x0f\\n\\x07\\x04\\x20\\x04\\0\\x02\\x01\\x02\\x12\\x04\\x99\\x04\\x0e\\x0f\\n\\x0e\\\n    \\n\\x06\\x04\\x20\\x04\\0\\x02\\x02\\x12\\x04\\x9a\\x04\\x04\\x0e\\n\\x0f\\n\\x07\\x04\\x20\\\n    \\x04\\0\\x02\\x02\\x01\\x12\\x04\\x9a\\x04\\x04\\t\\n\\x0f\\n\\x07\\x04\\x20\\x04\\0\\x02\\\n    \\x02\\x02\\x12\\x04\\x9a\\x04\\x0c\\r\\n\\x0e\\n\\x04\\x04\\x20\\x03\\0\\x12\\x06\\x9d\\x04\\\n    \\x02\\xa0\\x04\\x03\\n\\r\\n\\x05\\x04\\x20\\x03\\0\\x01\\x12\\x04\\x9d\\x04\\n\\x11\\n\\x0e\\\n    \\n\\x06\\x04\\x20\\x03\\0\\x02\\0\\x12\\x04\\x9e\\x04\\x04\\x13\\n\\x0f\\n\\x07\\x04\\x20\\\n    \\x03\\0\\x02\\0\\x05\\x12\\x04\\x9e\\x04\\x04\\t\\n\\x0f\\n\\x07\\x04\\x20\\x03\\0\\x02\\0\\\n    \\x01\\x12\\x04\\x9e\\x04\\n\\x0e\\n\\x0f\\n\\x07\\x04\\x20\\x03\\0\\x02\\0\\x03\\x12\\x04\\\n    \\x9e\\x04\\x11\\x12\\n\\x0e\\n\\x06\\x04\\x20\\x03\\0\\x02\\x01\\x12\\x04\\x9f\\x04\\x04\\\n    \\x15\\n\\x0f\\n\\x07\\x04\\x20\\x03\\0\\x02\\x01\\x05\\x12\\x04\\x9f\\x04\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04\\x20\\x03\\0\\x02\\x01\\x01\\x12\\x04\\x9f\\x04\\n\\x10\\n\\x0f\\n\\x07\\x04\\x20\\\n    \\x03\\0\\x02\\x01\\x03\\x12\\x04\\x9f\\x04\\x13\\x14\\n\\x0c\\n\\x04\\x04\\x20\\x02\\0\\x12\\\n    \\x04\\xa1\\x04\\x02\\x1b\\n\\r\\n\\x05\\x04\\x20\\x02\\0\\x04\\x12\\x04\\xa1\\x04\\x02\\n\\n\\\n    \\r\\n\\x05\\x04\\x20\\x02\\0\\x06\\x12\\x04\\xa1\\x04\\x0b\\x12\\n\\r\\n\\x05\\x04\\x20\\x02\\\n    \\0\\x01\\x12\\x04\\xa1\\x04\\x13\\x16\\n\\r\\n\\x05\\x04\\x20\\x02\\0\\x03\\x12\\x04\\xa1\\\n    \\x04\\x19\\x1a\\n\\x0c\\n\\x04\\x04\\x20\\x02\\x01\\x12\\x04\\xa2\\x04\\x02\\x10\\n\\r\\n\\\n    \\x05\\x04\\x20\\x02\\x01\\x06\\x12\\x04\\xa2\\x04\\x02\\x06\\n\\r\\n\\x05\\x04\\x20\\x02\\\n    \\x01\\x01\\x12\\x04\\xa2\\x04\\x07\\x0b\\n\\r\\n\\x05\\x04\\x20\\x02\\x01\\x03\\x12\\x04\\\n    \\xa2\\x04\\x0e\\x0f\\n\\x0c\\n\\x02\\x04!\\x12\\x06\\xa5\\x04\\0\\xac\\x04\\x01\\n\\x0b\\n\\\n    \\x03\\x04!\\x01\\x12\\x04\\xa5\\x04\\x08\\x11\\n\\x0e\\n\\x04\\x04!\\x04\\0\\x12\\x06\\xa6\\\n    \\x04\\x02\\xa9\\x04\\x03\\n\\r\\n\\x05\\x04!\\x04\\0\\x01\\x12\\x04\\xa6\\x04\\x07\\x14\\n\\\n    \\x0e\\n\\x06\\x04!\\x04\\0\\x02\\0\\x12\\x04\\xa7\\x04\\x04\\x0c\\n\\x0f\\n\\x07\\x04!\\x04\\\n    \\0\\x02\\0\\x01\\x12\\x04\\xa7\\x04\\x04\\x07\\n\\x0f\\n\\x07\\x04!\\x04\\0\\x02\\0\\x02\\\n    \\x12\\x04\\xa7\\x04\\n\\x0b\\n\\x0e\\n\\x06\\x04!\\x04\\0\\x02\\x01\\x12\\x04\\xa8\\x04\\\n    \\x04\\x0e\\n\\x0f\\n\\x07\\x04!\\x04\\0\\x02\\x01\\x01\\x12\\x04\\xa8\\x04\\x04\\t\\n\\x0f\\\n    \\n\\x07\\x04!\\x04\\0\\x02\\x01\\x02\\x12\\x04\\xa8\\x04\\x0c\\r\\n\\x0c\\n\\x04\\x04!\\x02\\\n    \\0\\x12\\x04\\xaa\\x04\\x02\\x19\\n\\r\\n\\x05\\x04!\\x02\\0\\x06\\x12\\x04\\xaa\\x04\\x02\\\n    \\x0f\\n\\r\\n\\x05\\x04!\\x02\\0\\x01\\x12\\x04\\xaa\\x04\\x10\\x14\\n\\r\\n\\x05\\x04!\\x02\\\n    \\0\\x03\\x12\\x04\\xaa\\x04\\x17\\x18\\n\\x0c\\n\\x04\\x04!\\x02\\x01\\x12\\x04\\xab\\x04\\\n    \\x02\\x19\\n\\r\\n\\x05\\x04!\\x02\\x01\\x04\\x12\\x04\\xab\\x04\\x02\\n\\n\\r\\n\\x05\\x04!\\\n    \\x02\\x01\\x05\\x12\\x04\\xab\\x04\\x0b\\x10\\n\\r\\n\\x05\\x04!\\x02\\x01\\x01\\x12\\x04\\\n    \\xab\\x04\\x11\\x14\\n\\r\\n\\x05\\x04!\\x02\\x01\\x03\\x12\\x04\\xab\\x04\\x17\\x18\\n\\\n    \\x0c\\n\\x02\\x04\\\"\\x12\\x06\\xae\\x04\\0\\xba\\x04\\x01\\n\\x0b\\n\\x03\\x04\\\"\\x01\\x12\\\n    \\x04\\xae\\x04\\x08\\r\\n\\x0e\\n\\x04\\x04\\\"\\x04\\0\\x12\\x06\\xaf\\x04\\x02\\xb4\\x04\\\n    \\x03\\n\\r\\n\\x05\\x04\\\"\\x04\\0\\x01\\x12\\x04\\xaf\\x04\\x07\\x0f\\n\\x0e\\n\\x06\\x04\\\"\\\n    \\x04\\0\\x02\\0\\x12\\x04\\xb0\\x04\\x04\\x0c\\n\\x0f\\n\\x07\\x04\\\"\\x04\\0\\x02\\0\\x01\\\n    \\x12\\x04\\xb0\\x04\\x04\\x07\\n\\x0f\\n\\x07\\x04\\\"\\x04\\0\\x02\\0\\x02\\x12\\x04\\xb0\\\n    \\x04\\n\\x0b\\n\\x0e\\n\\x06\\x04\\\"\\x04\\0\\x02\\x01\\x12\\x04\\xb1\\x04\\x04\\x0c\\n\\x0f\\\n    \\n\\x07\\x04\\\"\\x04\\0\\x02\\x01\\x01\\x12\\x04\\xb1\\x04\\x04\\x07\\n\\x0f\\n\\x07\\x04\\\"\\\n    \\x04\\0\\x02\\x01\\x02\\x12\\x04\\xb1\\x04\\n\\x0b\\n\\x0e\\n\\x06\\x04\\\"\\x04\\0\\x02\\x02\\\n    \\x12\\x04\\xb2\\x04\\x04\\x0e\\n\\x0f\\n\\x07\\x04\\\"\\x04\\0\\x02\\x02\\x01\\x12\\x04\\xb2\\\n    \\x04\\x04\\t\\n\\x0f\\n\\x07\\x04\\\"\\x04\\0\\x02\\x02\\x02\\x12\\x04\\xb2\\x04\\x0c\\r\\n\\\n    \\x0e\\n\\x06\\x04\\\"\\x04\\0\\x02\\x03\\x12\\x04\\xb3\\x04\\x04\\x14\\n\\x0f\\n\\x07\\x04\\\"\\\n    \\x04\\0\\x02\\x03\\x01\\x12\\x04\\xb3\\x04\\x04\\x0f\\n\\x0f\\n\\x07\\x04\\\"\\x04\\0\\x02\\\n    \\x03\\x02\\x12\\x04\\xb3\\x04\\x12\\x13\\n\\x0c\\n\\x04\\x04\\\"\\x02\\0\\x12\\x04\\xb6\\x04\\\n    \\x02\\x14\\n\\r\\n\\x05\\x04\\\"\\x02\\0\\x06\\x12\\x04\\xb6\\x04\\x02\\n\\n\\r\\n\\x05\\x04\\\"\\\n    \\x02\\0\\x01\\x12\\x04\\xb6\\x04\\x0b\\x0f\\n\\r\\n\\x05\\x04\\\"\\x02\\0\\x03\\x12\\x04\\xb6\\\n    \\x04\\x12\\x13\\n\\x0c\\n\\x04\\x04\\\"\\x02\\x01\\x12\\x04\\xb7\\x04\\x02\\x1c\\n\\r\\n\\x05\\\n    \\x04\\\"\\x02\\x01\\x04\\x12\\x04\\xb7\\x04\\x02\\n\\n\\r\\n\\x05\\x04\\\"\\x02\\x01\\x06\\x12\\\n    \\x04\\xb7\\x04\\x0b\\x10\\n\\r\\n\\x05\\x04\\\"\\x02\\x01\\x01\\x12\\x04\\xb7\\x04\\x11\\x17\\\n    \\n\\r\\n\\x05\\x04\\\"\\x02\\x01\\x03\\x12\\x04\\xb7\\x04\\x1a\\x1b\\n\\x0c\\n\\x04\\x04\\\"\\\n    \\x02\\x02\\x12\\x04\\xb8\\x04\\x02)\\n\\r\\n\\x05\\x04\\\"\\x02\\x02\\x04\\x12\\x04\\xb8\\\n    \\x04\\x02\\n\\n\\r\\n\\x05\\x04\\\"\\x02\\x02\\x06\\x12\\x04\\xb8\\x04\\x0b\\x16\\n\\r\\n\\x05\\\n    \\x04\\\"\\x02\\x02\\x01\\x12\\x04\\xb8\\x04\\x17$\\n\\r\\n\\x05\\x04\\\"\\x02\\x02\\x03\\x12\\\n    \\x04\\xb8\\x04'(\\n\\x0c\\n\\x04\\x04\\\"\\x02\\x03\\x12\\x04\\xb9\\x04\\x02(\\n\\r\\n\\x05\\\n    \\x04\\\"\\x02\\x03\\x04\\x12\\x04\\xb9\\x04\\x02\\n\\n\\r\\n\\x05\\x04\\\"\\x02\\x03\\x06\\x12\\\n    \\x04\\xb9\\x04\\x0b\\x16\\n\\r\\n\\x05\\x04\\\"\\x02\\x03\\x01\\x12\\x04\\xb9\\x04\\x17#\\n\\\n    \\r\\n\\x05\\x04\\\"\\x02\\x03\\x03\\x12\\x04\\xb9\\x04&'\\n!\\n\\x02\\x04#\\x12\\x06\\xbd\\\n    \\x04\\0\\xbf\\x04\\x01\\x1a\\x13\\x20DynamicProperties\\n\\n\\x0b\\n\\x03\\x04#\\x01\\\n    \\x12\\x04\\xbd\\x04\\x08\\x19\\n\\x0c\\n\\x04\\x04#\\x02\\0\\x12\\x04\\xbe\\x04\\x02$\\n\\r\\\n    \\n\\x05\\x04#\\x02\\0\\x05\\x12\\x04\\xbe\\x04\\x02\\x07\\n\\r\\n\\x05\\x04#\\x02\\0\\x01\\\n    \\x12\\x04\\xbe\\x04\\x08\\x1f\\n\\r\\n\\x05\\x04#\\x02\\0\\x03\\x12\\x04\\xbe\\x04\\\"#\\n\\\n    \\x0c\\n\\x02\\x05\\x01\\x12\\x06\\xc1\\x04\\0\\xde\\x04\\x01\\n\\x0b\\n\\x03\\x05\\x01\\x01\\\n    \\x12\\x04\\xc1\\x04\\x05\\x0f\\n\\x0c\\n\\x04\\x05\\x01\\x02\\0\\x12\\x04\\xc2\\x04\\x02\\\n    \\x13\\n\\r\\n\\x05\\x05\\x01\\x02\\0\\x01\\x12\\x04\\xc2\\x04\\x02\\x0b\\n\\r\\n\\x05\\x05\\\n    \\x01\\x02\\0\\x02\\x12\\x04\\xc2\\x04\\x0e\\x12\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x01\\x12\\\n    \\x04\\xc3\\x04\\x02\\x16\\n\\r\\n\\x05\\x05\\x01\\x02\\x01\\x01\\x12\\x04\\xc3\\x04\\x02\\\n    \\x0e\\n\\r\\n\\x05\\x05\\x01\\x02\\x01\\x02\\x12\\x04\\xc3\\x04\\x11\\x15\\n\\x0c\\n\\x04\\\n    \\x05\\x01\\x02\\x02\\x12\\x04\\xc4\\x04\\x02\\x18\\n\\r\\n\\x05\\x05\\x01\\x02\\x02\\x01\\\n    \\x12\\x04\\xc4\\x04\\x02\\x10\\n\\r\\n\\x05\\x05\\x01\\x02\\x02\\x02\\x12\\x04\\xc4\\x04\\\n    \\x13\\x17\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x03\\x12\\x04\\xc5\\x04\\x02\\x18\\n\\r\\n\\x05\\\n    \\x05\\x01\\x02\\x03\\x01\\x12\\x04\\xc5\\x04\\x02\\x10\\n\\r\\n\\x05\\x05\\x01\\x02\\x03\\\n    \\x02\\x12\\x04\\xc5\\x04\\x13\\x17\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x04\\x12\\x04\\xc6\\x04\\\n    \\x02\\x1f\\n\\r\\n\\x05\\x05\\x01\\x02\\x04\\x01\\x12\\x04\\xc6\\x04\\x02\\x17\\n\\r\\n\\x05\\\n    \\x05\\x01\\x02\\x04\\x02\\x12\\x04\\xc6\\x04\\x1a\\x1e\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x05\\\n    \\x12\\x04\\xc7\\x04\\x02\\x1c\\n\\r\\n\\x05\\x05\\x01\\x02\\x05\\x01\\x12\\x04\\xc7\\x04\\\n    \\x02\\x14\\n\\r\\n\\x05\\x05\\x01\\x02\\x05\\x02\\x12\\x04\\xc7\\x04\\x17\\x1b\\n\\x0c\\n\\\n    \\x04\\x05\\x01\\x02\\x06\\x12\\x04\\xc8\\x04\\x02\\x16\\n\\r\\n\\x05\\x05\\x01\\x02\\x06\\\n    \\x01\\x12\\x04\\xc8\\x04\\x02\\x0e\\n\\r\\n\\x05\\x05\\x01\\x02\\x06\\x02\\x12\\x04\\xc8\\\n    \\x04\\x11\\x15\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x07\\x12\\x04\\xc9\\x04\\x02\\x1d\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\x07\\x01\\x12\\x04\\xc9\\x04\\x02\\x15\\n\\r\\n\\x05\\x05\\x01\\x02\\\n    \\x07\\x02\\x12\\x04\\xc9\\x04\\x18\\x1c\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x08\\x12\\x04\\xca\\\n    \\x04\\x02\\x18\\n\\r\\n\\x05\\x05\\x01\\x02\\x08\\x01\\x12\\x04\\xca\\x04\\x02\\x10\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\x08\\x02\\x12\\x04\\xca\\x04\\x13\\x17\\n\\x0c\\n\\x04\\x05\\x01\\x02\\\n    \\t\\x12\\x04\\xcb\\x04\\x02\\x16\\n\\r\\n\\x05\\x05\\x01\\x02\\t\\x01\\x12\\x04\\xcb\\x04\\\n    \\x02\\x0e\\n\\r\\n\\x05\\x05\\x01\\x02\\t\\x02\\x12\\x04\\xcb\\x04\\x11\\x15\\n\\x0c\\n\\x04\\\n    \\x05\\x01\\x02\\n\\x12\\x04\\xcc\\x04\\x02\\x15\\n\\r\\n\\x05\\x05\\x01\\x02\\n\\x01\\x12\\\n    \\x04\\xcc\\x04\\x02\\r\\n\\r\\n\\x05\\x05\\x01\\x02\\n\\x02\\x12\\x04\\xcc\\x04\\x10\\x14\\n\\\n    \\x0c\\n\\x04\\x05\\x01\\x02\\x0b\\x12\\x04\\xcd\\x04\\x02\\x0f\\n\\r\\n\\x05\\x05\\x01\\x02\\\n    \\x0b\\x01\\x12\\x04\\xcd\\x04\\x02\\x07\\n\\r\\n\\x05\\x05\\x01\\x02\\x0b\\x02\\x12\\x04\\\n    \\xcd\\x04\\n\\x0e\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x0c\\x12\\x04\\xce\\x04\\x02\\x13\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\x0c\\x01\\x12\\x04\\xce\\x04\\x02\\x0b\\n\\r\\n\\x05\\x05\\x01\\x02\\\n    \\x0c\\x02\\x12\\x04\\xce\\x04\\x0e\\x12\\n\\x0c\\n\\x04\\x05\\x01\\x02\\r\\x12\\x04\\xcf\\\n    \\x04\\x02\\x14\\n\\r\\n\\x05\\x05\\x01\\x02\\r\\x01\\x12\\x04\\xcf\\x04\\x02\\x0c\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\r\\x02\\x12\\x04\\xcf\\x04\\x0f\\x13\\n\\x0c\\n\\x04\\x05\\x01\\x02\\\n    \\x0e\\x12\\x04\\xd0\\x04\\x02\\x10\\n\\r\\n\\x05\\x05\\x01\\x02\\x0e\\x01\\x12\\x04\\xd0\\\n    \\x04\\x02\\x08\\n\\r\\n\\x05\\x05\\x01\\x02\\x0e\\x02\\x12\\x04\\xd0\\x04\\x0b\\x0f\\n\\x0c\\\n    \\n\\x04\\x05\\x01\\x02\\x0f\\x12\\x04\\xd1\\x04\\x02\\x13\\n\\r\\n\\x05\\x05\\x01\\x02\\x0f\\\n    \\x01\\x12\\x04\\xd1\\x04\\x02\\x0b\\n\\r\\n\\x05\\x05\\x01\\x02\\x0f\\x02\\x12\\x04\\xd1\\\n    \\x04\\x0e\\x12\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x10\\x12\\x04\\xd2\\x04\\x02\\x10\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\x10\\x01\\x12\\x04\\xd2\\x04\\x02\\x08\\n\\r\\n\\x05\\x05\\x01\\x02\\\n    \\x10\\x02\\x12\\x04\\xd2\\x04\\x0b\\x0f\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x11\\x12\\x04\\xd3\\\n    \\x04\\x02\\x14\\n\\r\\n\\x05\\x05\\x01\\x02\\x11\\x01\\x12\\x04\\xd3\\x04\\x02\\x0c\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\x11\\x02\\x12\\x04\\xd3\\x04\\x0f\\x13\\n\\x0c\\n\\x04\\x05\\x01\\x02\\\n    \\x12\\x12\\x04\\xd4\\x04\\x02\\x1e\\n\\r\\n\\x05\\x05\\x01\\x02\\x12\\x01\\x12\\x04\\xd4\\\n    \\x04\\x02\\x16\\n\\r\\n\\x05\\x05\\x01\\x02\\x12\\x02\\x12\\x04\\xd4\\x04\\x19\\x1d\\n\\x0c\\\n    \\n\\x04\\x05\\x01\\x02\\x13\\x12\\x04\\xd5\\x04\\x02\\x1c\\n\\r\\n\\x05\\x05\\x01\\x02\\x13\\\n    \\x01\\x12\\x04\\xd5\\x04\\x02\\x14\\n\\r\\n\\x05\\x05\\x01\\x02\\x13\\x02\\x12\\x04\\xd5\\\n    \\x04\\x17\\x1b\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x14\\x12\\x04\\xd6\\x04\\x02\\x12\\n\\r\\n\\\n    \\x05\\x05\\x01\\x02\\x14\\x01\\x12\\x04\\xd6\\x04\\x02\\n\\n\\r\\n\\x05\\x05\\x01\\x02\\x14\\\n    \\x02\\x12\\x04\\xd6\\x04\\r\\x11\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x15\\x12\\x04\\xd7\\x04\\\n    \\x02\\x16\\n\\r\\n\\x05\\x05\\x01\\x02\\x15\\x01\\x12\\x04\\xd7\\x04\\x02\\x0e\\n\\r\\n\\x05\\\n    \\x05\\x01\\x02\\x15\\x02\\x12\\x04\\xd7\\x04\\x11\\x15\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x16\\\n    \\x12\\x04\\xd8\\x04\\x02%\\n\\r\\n\\x05\\x05\\x01\\x02\\x16\\x01\\x12\\x04\\xd8\\x04\\x02\\\n    \\x1d\\n\\r\\n\\x05\\x05\\x01\\x02\\x16\\x02\\x12\\x04\\xd8\\x04\\x20$\\n\\x0c\\n\\x04\\x05\\\n    \\x01\\x02\\x17\\x12\\x04\\xd9\\x04\\x02\\x1e\\n\\r\\n\\x05\\x05\\x01\\x02\\x17\\x01\\x12\\\n    \\x04\\xd9\\x04\\x02\\x16\\n\\r\\n\\x05\\x05\\x01\\x02\\x17\\x02\\x12\\x04\\xd9\\x04\\x19\\\n    \\x1d\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x18\\x12\\x04\\xda\\x04\\x02\\x17\\n\\r\\n\\x05\\x05\\\n    \\x01\\x02\\x18\\x01\\x12\\x04\\xda\\x04\\x02\\x0f\\n\\r\\n\\x05\\x05\\x01\\x02\\x18\\x02\\\n    \\x12\\x04\\xda\\x04\\x12\\x16\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x19\\x12\\x04\\xdb\\x04\\x02\\\n    \\x15\\n\\r\\n\\x05\\x05\\x01\\x02\\x19\\x01\\x12\\x04\\xdb\\x04\\x02\\r\\n\\r\\n\\x05\\x05\\\n    \\x01\\x02\\x19\\x02\\x12\\x04\\xdb\\x04\\x10\\x14\\n\\x0c\\n\\x04\\x05\\x01\\x02\\x1a\\x12\\\n    \\x04\\xdc\\x04\\x02\\x19\\n\\r\\n\\x05\\x05\\x01\\x02\\x1a\\x01\\x12\\x04\\xdc\\x04\\x02\\\n    \\x11\\n\\r\\n\\x05\\x05\\x01\\x02\\x1a\\x02\\x12\\x04\\xdc\\x04\\x14\\x18\\n\\x0c\\n\\x04\\\n    \\x05\\x01\\x02\\x1b\\x12\\x04\\xdd\\x04\\x02\\x11\\n\\r\\n\\x05\\x05\\x01\\x02\\x1b\\x01\\\n    \\x12\\x04\\xdd\\x04\\x02\\t\\n\\r\\n\\x05\\x05\\x01\\x02\\x1b\\x02\\x12\\x04\\xdd\\x04\\x0c\\\n    \\x10\\n\\x0c\\n\\x02\\x04$\\x12\\x06\\xe0\\x04\\0\\xe2\\x04\\x01\\n\\x0b\\n\\x03\\x04$\\x01\\\n    \\x12\\x04\\xe0\\x04\\x08\\x19\\n\\x0c\\n\\x04\\x04$\\x02\\0\\x12\\x04\\xe1\\x04\\x02\\x18\\\n    \\n\\r\\n\\x05\\x04$\\x02\\0\\x06\\x12\\x04\\xe1\\x04\\x02\\x0c\\n\\r\\n\\x05\\x04$\\x02\\0\\\n    \\x01\\x12\\x04\\xe1\\x04\\r\\x13\\n\\r\\n\\x05\\x04$\\x02\\0\\x03\\x12\\x04\\xe1\\x04\\x16\\\n    \\x17\\n\\x0c\\n\\x02\\x04%\\x12\\x06\\xe4\\x04\\0\\xf4\\x04\\x01\\n\\x0b\\n\\x03\\x04%\\x01\\\n    \\x12\\x04\\xe4\\x04\\x08\\x14\\n\\x0e\\n\\x04\\x04%\\x03\\0\\x12\\x06\\xe5\\x04\\x02\\xe8\\\n    \\x04\\x03\\n\\r\\n\\x05\\x04%\\x03\\0\\x01\\x12\\x04\\xe5\\x04\\n\\x11\\n\\x0e\\n\\x06\\x04%\\\n    \\x03\\0\\x02\\0\\x12\\x04\\xe6\\x04\\x04\\x13\\n\\x0f\\n\\x07\\x04%\\x03\\0\\x02\\0\\x05\\\n    \\x12\\x04\\xe6\\x04\\x04\\t\\n\\x0f\\n\\x07\\x04%\\x03\\0\\x02\\0\\x01\\x12\\x04\\xe6\\x04\\\n    \\n\\x0e\\n\\x0f\\n\\x07\\x04%\\x03\\0\\x02\\0\\x03\\x12\\x04\\xe6\\x04\\x11\\x12\\n\\x0e\\n\\\n    \\x06\\x04%\\x03\\0\\x02\\x01\\x12\\x04\\xe7\\x04\\x04\\x15\\n\\x0f\\n\\x07\\x04%\\x03\\0\\\n    \\x02\\x01\\x05\\x12\\x04\\xe7\\x04\\x04\\t\\n\\x0f\\n\\x07\\x04%\\x03\\0\\x02\\x01\\x01\\\n    \\x12\\x04\\xe7\\x04\\n\\x10\\n\\x0f\\n\\x07\\x04%\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xe7\\\n    \\x04\\x13\\x14\\n\\x0c\\n\\x04\\x04%\\x02\\0\\x12\\x04\\xea\\x04\\x02\\x14\\n\\r\\n\\x05\\\n    \\x04%\\x02\\0\\x06\\x12\\x04\\xea\\x04\\x02\\n\\n\\r\\n\\x05\\x04%\\x02\\0\\x01\\x12\\x04\\\n    \\xea\\x04\\x0b\\x0f\\n\\r\\n\\x05\\x04%\\x02\\0\\x03\\x12\\x04\\xea\\x04\\x12\\x13\\n\\x0c\\\n    \\n\\x04\\x04%\\x02\\x01\\x12\\x04\\xeb\\x04\\x02\\x14\\n\\r\\n\\x05\\x04%\\x02\\x01\\x05\\\n    \\x12\\x04\\xeb\\x04\\x02\\x07\\n\\r\\n\\x05\\x04%\\x02\\x01\\x01\\x12\\x04\\xeb\\x04\\x08\\\n    \\x0f\\n\\r\\n\\x05\\x04%\\x02\\x01\\x03\\x12\\x04\\xeb\\x04\\x12\\x13\\n\\x0c\\n\\x04\\x04%\\\n    \\x02\\x02\\x12\\x04\\xec\\x04\\x02\\x16\\n\\r\\n\\x05\\x04%\\x02\\x02\\x05\\x12\\x04\\xec\\\n    \\x04\\x02\\x07\\n\\r\\n\\x05\\x04%\\x02\\x02\\x01\\x12\\x04\\xec\\x04\\x08\\x11\\n\\r\\n\\\n    \\x05\\x04%\\x02\\x02\\x03\\x12\\x04\\xec\\x04\\x14\\x15\\n\\x0c\\n\\x04\\x04%\\x02\\x03\\\n    \\x12\\x04\\xed\\x04\\x02\\x1d\\n\\r\\n\\x05\\x04%\\x02\\x03\\x06\\x12\\x04\\xed\\x04\\x02\\\n    \\t\\n\\r\\n\\x05\\x04%\\x02\\x03\\x01\\x12\\x04\\xed\\x04\\n\\x18\\n\\r\\n\\x05\\x04%\\x02\\\n    \\x03\\x03\\x12\\x04\\xed\\x04\\x1b\\x1c\\n\\x0c\\n\\x04\\x04%\\x02\\x04\\x12\\x04\\xee\\\n    \\x04\\x02\\x1b\\n\\r\\n\\x05\\x04%\\x02\\x04\\x06\\x12\\x04\\xee\\x04\\x02\\t\\n\\r\\n\\x05\\\n    \\x04%\\x02\\x04\\x01\\x12\\x04\\xee\\x04\\n\\x16\\n\\r\\n\\x05\\x04%\\x02\\x04\\x03\\x12\\\n    \\x04\\xee\\x04\\x19\\x1a\\n\\x0c\\n\\x04\\x04%\\x02\\x05\\x12\\x04\\xef\\x04\\x02\\x1a\\n\\\n    \\r\\n\\x05\\x04%\\x02\\x05\\x06\\x12\\x04\\xef\\x04\\x02\\t\\n\\r\\n\\x05\\x04%\\x02\\x05\\\n    \\x01\\x12\\x04\\xef\\x04\\n\\x15\\n\\r\\n\\x05\\x04%\\x02\\x05\\x03\\x12\\x04\\xef\\x04\\\n    \\x18\\x19\\n\\x0c\\n\\x04\\x04%\\x02\\x06\\x12\\x04\\xf0\\x04\\x02\\x14\\n\\r\\n\\x05\\x04%\\\n    \\x02\\x06\\x05\\x12\\x04\\xf0\\x04\\x02\\x07\\n\\r\\n\\x05\\x04%\\x02\\x06\\x01\\x12\\x04\\\n    \\xf0\\x04\\x08\\x0f\\n\\r\\n\\x05\\x04%\\x02\\x06\\x03\\x12\\x04\\xf0\\x04\\x12\\x13\\n\\\n    \\x0c\\n\\x04\\x04%\\x02\\x07\\x12\\x04\\xf1\\x04\\x02\\x16\\n\\r\\n\\x05\\x04%\\x02\\x07\\\n    \\x05\\x12\\x04\\xf1\\x04\\x02\\x07\\n\\r\\n\\x05\\x04%\\x02\\x07\\x01\\x12\\x04\\xf1\\x04\\\n    \\x08\\x11\\n\\r\\n\\x05\\x04%\\x02\\x07\\x03\\x12\\x04\\xf1\\x04\\x14\\x15\\n\\x0c\\n\\x04\\\n    \\x04%\\x02\\x08\\x12\\x04\\xf2\\x04\\x02\\x15\\n\\r\\n\\x05\\x04%\\x02\\x08\\x05\\x12\\x04\\\n    \\xf2\\x04\\x02\\x07\\n\\r\\n\\x05\\x04%\\x02\\x08\\x01\\x12\\x04\\xf2\\x04\\x08\\x10\\n\\r\\\n    \\n\\x05\\x04%\\x02\\x08\\x03\\x12\\x04\\xf2\\x04\\x13\\x14\\n\\x0c\\n\\x04\\x04%\\x02\\t\\\n    \\x12\\x04\\xf3\\x04\\x02\\x1c\\n\\r\\n\\x05\\x04%\\x02\\t\\x05\\x12\\x04\\xf3\\x04\\x02\\\n    \\x07\\n\\r\\n\\x05\\x04%\\x02\\t\\x01\\x12\\x04\\xf3\\x04\\x08\\x16\\n\\r\\n\\x05\\x04%\\x02\\\n    \\t\\x03\\x12\\x04\\xf3\\x04\\x19\\x1b\\n\\x0c\\n\\x02\\x04&\\x12\\x06\\xf6\\x04\\0\\x88\\\n    \\x05\\x01\\n\\x0b\\n\\x03\\x04&\\x01\\x12\\x04\\xf6\\x04\\x08\\x1b\\nv\\n\\x04\\x04&\\x02\\\n    \\0\\x12\\x04\\xf9\\x04\\x02\\x11\\x1ah\\x20internalTransaction\\x20identity,\\x20t\\\n    he\\x20root\\x20InternalTransaction\\x20hash\\n\\x20should\\x20equals\\x20to\\\n    \\x20root\\x20transaction\\x20id.\\n\\n\\r\\n\\x05\\x04&\\x02\\0\\x05\\x12\\x04\\xf9\\\n    \\x04\\x02\\x07\\n\\r\\n\\x05\\x04&\\x02\\0\\x01\\x12\\x04\\xf9\\x04\\x08\\x0c\\n\\r\\n\\x05\\\n    \\x04&\\x02\\0\\x03\\x12\\x04\\xf9\\x04\\x0f\\x10\\n=\\n\\x04\\x04&\\x02\\x01\\x12\\x04\\\n    \\xfb\\x04\\x02\\x1b\\x1a/\\x20the\\x20one\\x20send\\x20trx\\x20(TBD:\\x20or\\x20tok\\\n    en)\\x20via\\x20function\\n\\n\\r\\n\\x05\\x04&\\x02\\x01\\x05\\x12\\x04\\xfb\\x04\\x02\\\n    \\x07\\n\\r\\n\\x05\\x04&\\x02\\x01\\x01\\x12\\x04\\xfb\\x04\\x08\\x16\\n\\r\\n\\x05\\x04&\\\n    \\x02\\x01\\x03\\x12\\x04\\xfb\\x04\\x19\\x1a\\n@\\n\\x04\\x04&\\x02\\x02\\x12\\x04\\xfd\\\n    \\x04\\x02\\x1f\\x1a2\\x20the\\x20one\\x20recieve\\x20trx\\x20(TBD:\\x20or\\x20toke\\\n    n)\\x20via\\x20function\\n\\n\\r\\n\\x05\\x04&\\x02\\x02\\x05\\x12\\x04\\xfd\\x04\\x02\\\n    \\x07\\n\\r\\n\\x05\\x04&\\x02\\x02\\x01\\x12\\x04\\xfd\\x04\\x08\\x1a\\n\\r\\n\\x05\\x04&\\\n    \\x02\\x02\\x03\\x12\\x04\\xfd\\x04\\x1d\\x1e\\n\\x0e\\n\\x04\\x04&\\x03\\0\\x12\\x06\\xfe\\\n    \\x04\\x02\\x83\\x05\\x03\\n\\r\\n\\x05\\x04&\\x03\\0\\x01\\x12\\x04\\xfe\\x04\\n\\x17\\n+\\n\\\n    \\x06\\x04&\\x03\\0\\x02\\0\\x12\\x04\\x80\\x05\\x04\\x18\\x1a\\x1b\\x20trx\\x20(TBD:\\\n    \\x20or\\x20token)\\x20value\\n\\n\\x0f\\n\\x07\\x04&\\x03\\0\\x02\\0\\x05\\x12\\x04\\x80\\\n    \\x05\\x04\\t\\n\\x0f\\n\\x07\\x04&\\x03\\0\\x02\\0\\x01\\x12\\x04\\x80\\x05\\n\\x13\\n\\x0f\\\n    \\n\\x07\\x04&\\x03\\0\\x02\\0\\x03\\x12\\x04\\x80\\x05\\x16\\x17\\n5\\n\\x06\\x04&\\x03\\0\\\n    \\x02\\x01\\x12\\x04\\x82\\x05\\x04\\x17\\x1a%\\x20TBD:\\x20tokenName,\\x20trx\\x20sh\\\n    ould\\x20be\\x20empty\\n\\n\\x0f\\n\\x07\\x04&\\x03\\0\\x02\\x01\\x05\\x12\\x04\\x82\\x05\\\n    \\x04\\n\\n\\x0f\\n\\x07\\x04&\\x03\\0\\x02\\x01\\x01\\x12\\x04\\x82\\x05\\x0b\\x12\\n\\x0f\\\n    \\n\\x07\\x04&\\x03\\0\\x02\\x01\\x03\\x12\\x04\\x82\\x05\\x15\\x16\\n\\x0c\\n\\x04\\x04&\\\n    \\x02\\x03\\x12\\x04\\x84\\x05\\x02+\\n\\r\\n\\x05\\x04&\\x02\\x03\\x04\\x12\\x04\\x84\\x05\\\n    \\x02\\n\\n\\r\\n\\x05\\x04&\\x02\\x03\\x06\\x12\\x04\\x84\\x05\\x0b\\x18\\n\\r\\n\\x05\\x04&\\\n    \\x02\\x03\\x01\\x12\\x04\\x84\\x05\\x19&\\n\\r\\n\\x05\\x04&\\x02\\x03\\x03\\x12\\x04\\x84\\\n    \\x05)*\\n\\x0c\\n\\x04\\x04&\\x02\\x04\\x12\\x04\\x85\\x05\\x02\\x11\\n\\r\\n\\x05\\x04&\\\n    \\x02\\x04\\x05\\x12\\x04\\x85\\x05\\x02\\x07\\n\\r\\n\\x05\\x04&\\x02\\x04\\x01\\x12\\x04\\\n    \\x85\\x05\\x08\\x0c\\n\\r\\n\\x05\\x04&\\x02\\x04\\x03\\x12\\x04\\x85\\x05\\x0f\\x10\\n\\\n    \\x0c\\n\\x04\\x04&\\x02\\x05\\x12\\x04\\x86\\x05\\x02\\x14\\n\\r\\n\\x05\\x04&\\x02\\x05\\\n    \\x05\\x12\\x04\\x86\\x05\\x02\\x06\\n\\r\\n\\x05\\x04&\\x02\\x05\\x01\\x12\\x04\\x86\\x05\\\n    \\x07\\x0f\\n\\r\\n\\x05\\x04&\\x02\\x05\\x03\\x12\\x04\\x86\\x05\\x12\\x13\\n\\x0c\\n\\x04\\\n    \\x04&\\x02\\x06\\x12\\x04\\x87\\x05\\x02\\x13\\n\\r\\n\\x05\\x04&\\x02\\x06\\x05\\x12\\x04\\\n    \\x87\\x05\\x02\\x08\\n\\r\\n\\x05\\x04&\\x02\\x06\\x01\\x12\\x04\\x87\\x05\\t\\x0e\\n\\r\\n\\\n    \\x05\\x04&\\x02\\x06\\x03\\x12\\x04\\x87\\x05\\x11\\x12\\n\\x0c\\n\\x02\\x04'\\x12\\x06\\\n    \\x8a\\x05\\0\\x8f\\x05\\x01\\n\\x0b\\n\\x03\\x04'\\x01\\x12\\x04\\x8a\\x05\\x08%\\n\\x0c\\n\\\n    \\x04\\x04'\\x02\\0\\x12\\x04\\x8b\\x05\\x02\\x14\\n\\r\\n\\x05\\x04'\\x02\\0\\x05\\x12\\x04\\\n    \\x8b\\x05\\x02\\x07\\n\\r\\n\\x05\\x04'\\x02\\0\\x01\\x12\\x04\\x8b\\x05\\x08\\x0f\\n\\r\\n\\\n    \\x05\\x04'\\x02\\0\\x03\\x12\\x04\\x8b\\x05\\x12\\x13\\n\\x0c\\n\\x04\\x04'\\x02\\x01\\x12\\\n    \\x04\\x8c\\x05\\x02\\\"\\n\\r\\n\\x05\\x04'\\x02\\x01\\x04\\x12\\x04\\x8c\\x05\\x02\\n\\n\\r\\\n    \\n\\x05\\x04'\\x02\\x01\\x05\\x12\\x04\\x8c\\x05\\x0b\\x10\\n\\r\\n\\x05\\x04'\\x02\\x01\\\n    \\x01\\x12\\x04\\x8c\\x05\\x11\\x1d\\n\\r\\n\\x05\\x04'\\x02\\x01\\x03\\x12\\x04\\x8c\\x05\\\n    \\x20!\\n\\x0c\\n\\x04\\x04'\\x02\\x02\\x12\\x04\\x8d\\x05\\x02\\x20\\n\\r\\n\\x05\\x04'\\\n    \\x02\\x02\\x04\\x12\\x04\\x8d\\x05\\x02\\n\\n\\r\\n\\x05\\x04'\\x02\\x02\\x05\\x12\\x04\\\n    \\x8d\\x05\\x0b\\x10\\n\\r\\n\\x05\\x04'\\x02\\x02\\x01\\x12\\x04\\x8d\\x05\\x11\\x1b\\n\\r\\\n    \\n\\x05\\x04'\\x02\\x02\\x03\\x12\\x04\\x8d\\x05\\x1e\\x1f\\n\\x0c\\n\\x04\\x04'\\x02\\x03\\\n    \\x12\\x04\\x8e\\x05\\x02\\x16\\n\\r\\n\\x05\\x04'\\x02\\x03\\x05\\x12\\x04\\x8e\\x05\\x02\\\n    \\x07\\n\\r\\n\\x05\\x04'\\x02\\x03\\x01\\x12\\x04\\x8e\\x05\\x08\\x11\\n\\r\\n\\x05\\x04'\\\n    \\x02\\x03\\x03\\x12\\x04\\x8e\\x05\\x14\\x15\\n\\x0c\\n\\x02\\x04(\\x12\\x06\\x91\\x05\\0\\\n    \\xf2\\x05\\x01\\n\\x0b\\n\\x03\\x04(\\x01\\x12\\x04\\x91\\x05\\x08\\x10\\n\\x0c\\n\\x04\\\n    \\x04(\\x02\\0\\x12\\x04\\x92\\x05\\x02\\x19\\n\\r\\n\\x05\\x04(\\x02\\0\\x05\\x12\\x04\\x92\\\n    \\x05\\x02\\x07\\n\\r\\n\\x05\\x04(\\x02\\0\\x01\\x12\\x04\\x92\\x05\\x08\\x14\\n\\r\\n\\x05\\\n    \\x04(\\x02\\0\\x03\\x12\\x04\\x92\\x05\\x17\\x18\\n\\x0c\\n\\x04\\x04(\\x02\\x01\\x12\\x04\\\n    \\x93\\x05\\x02\\x13\\n\\r\\n\\x05\\x04(\\x02\\x01\\x05\\x12\\x04\\x93\\x05\\x02\\x08\\n\\r\\\n    \\n\\x05\\x04(\\x02\\x01\\x01\\x12\\x04\\x93\\x05\\t\\x0e\\n\\r\\n\\x05\\x04(\\x02\\x01\\x03\\\n    \\x12\\x04\\x93\\x05\\x11\\x12\\n\\x0c\\n\\x04\\x04(\\x02\\x02\\x12\\x04\\x94\\x05\\x02\\\n    \\x1b\\n\\r\\n\\x05\\x04(\\x02\\x02\\x05\\x12\\x04\\x94\\x05\\x02\\x08\\n\\r\\n\\x05\\x04(\\\n    \\x02\\x02\\x01\\x12\\x04\\x94\\x05\\t\\x16\\n\\r\\n\\x05\\x04(\\x02\\x02\\x03\\x12\\x04\\\n    \\x94\\x05\\x19\\x1a\\n\\\"\\n\\x04\\x04(\\x02\\x03\\x12\\x04\\x96\\x05\\x02\\x20\\x1a\\x14c\\\n    onnect\\x20information\\n\\n\\r\\n\\x05\\x04(\\x02\\x03\\x05\\x12\\x04\\x96\\x05\\x02\\\n    \\x07\\n\\r\\n\\x05\\x04(\\x02\\x03\\x01\\x12\\x04\\x96\\x05\\x08\\x1b\\n\\r\\n\\x05\\x04(\\\n    \\x02\\x03\\x03\\x12\\x04\\x96\\x05\\x1e\\x1f\\n\\x0c\\n\\x04\\x04(\\x02\\x04\\x12\\x04\\\n    \\x97\\x05\\x02\\x1f\\n\\r\\n\\x05\\x04(\\x02\\x04\\x05\\x12\\x04\\x97\\x05\\x02\\x07\\n\\r\\\n    \\n\\x05\\x04(\\x02\\x04\\x01\\x12\\x04\\x97\\x05\\x08\\x1a\\n\\r\\n\\x05\\x04(\\x02\\x04\\\n    \\x03\\x12\\x04\\x97\\x05\\x1d\\x1e\\n\\x0c\\n\\x04\\x04(\\x02\\x05\\x12\\x04\\x98\\x05\\\n    \\x02\\x20\\n\\r\\n\\x05\\x04(\\x02\\x05\\x05\\x12\\x04\\x98\\x05\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04(\\x02\\x05\\x01\\x12\\x04\\x98\\x05\\x08\\x1b\\n\\r\\n\\x05\\x04(\\x02\\x05\\x03\\x12\\\n    \\x04\\x98\\x05\\x1e\\x1f\\n\\x0c\\n\\x04\\x04(\\x02\\x06\\x12\\x04\\x99\\x05\\x02\\x16\\n\\\n    \\r\\n\\x05\\x04(\\x02\\x06\\x05\\x12\\x04\\x99\\x05\\x02\\x07\\n\\r\\n\\x05\\x04(\\x02\\x06\\\n    \\x01\\x12\\x04\\x99\\x05\\x08\\x11\\n\\r\\n\\x05\\x04(\\x02\\x06\\x03\\x12\\x04\\x99\\x05\\\n    \\x14\\x15\\n\\x0c\\n\\x04\\x04(\\x02\\x07\\x12\\x04\\x9a\\x05\\x02%\\n\\r\\n\\x05\\x04(\\\n    \\x02\\x07\\x04\\x12\\x04\\x9a\\x05\\x02\\n\\n\\r\\n\\x05\\x04(\\x02\\x07\\x06\\x12\\x04\\\n    \\x9a\\x05\\x0b\\x13\\n\\r\\n\\x05\\x04(\\x02\\x07\\x01\\x12\\x04\\x9a\\x05\\x14\\x20\\n\\r\\\n    \\n\\x05\\x04(\\x02\\x07\\x03\\x12\\x04\\x9a\\x05#$\\n\\x0c\\n\\x04\\x04(\\x02\\x08\\x12\\\n    \\x04\\x9b\\x05\\x02$\\n\\r\\n\\x05\\x04(\\x02\\x08\\x06\\x12\\x04\\x9b\\x05\\x02\\x10\\n\\r\\\n    \\n\\x05\\x04(\\x02\\x08\\x01\\x12\\x04\\x9b\\x05\\x11\\x1f\\n\\r\\n\\x05\\x04(\\x02\\x08\\\n    \\x03\\x12\\x04\\x9b\\x05\\\"#\\n\\x0c\\n\\x04\\x04(\\x02\\t\\x12\\x04\\x9c\\x05\\x02\\x1f\\n\\\n    \\r\\n\\x05\\x04(\\x02\\t\\x06\\x12\\x04\\x9c\\x05\\x02\\r\\n\\r\\n\\x05\\x04(\\x02\\t\\x01\\\n    \\x12\\x04\\x9c\\x05\\x0e\\x19\\n\\r\\n\\x05\\x04(\\x02\\t\\x03\\x12\\x04\\x9c\\x05\\x1c\\\n    \\x1e\\n\\x0c\\n\\x04\\x04(\\x02\\n\\x12\\x04\\x9d\\x05\\x02/\\n\\r\\n\\x05\\x04(\\x02\\n\\\n    \\x06\\x12\\x04\\x9d\\x05\\x02\\x15\\n\\r\\n\\x05\\x04(\\x02\\n\\x01\\x12\\x04\\x9d\\x05\\\n    \\x16)\\n\\r\\n\\x05\\x04(\\x02\\n\\x03\\x12\\x04\\x9d\\x05,.\\n\\x0e\\n\\x04\\x04(\\x03\\\n    \\x01\\x12\\x06\\x9f\\x05\\x02\\xb9\\x05\\x03\\n\\r\\n\\x05\\x04(\\x03\\x01\\x01\\x12\\x04\\\n    \\x9f\\x05\\n\\x12\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\0\\x12\\x04\\xa0\\x05\\x04\\x1d\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\0\\x05\\x12\\x04\\xa0\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x01\\x02\\0\\x01\\x12\\x04\\xa0\\x05\\x0b\\x18\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\\n    \\0\\x03\\x12\\x04\\xa0\\x05\\x1b\\x1c\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x01\\x12\\x04\\\n    \\xa1\\x05\\x04\\x18\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x01\\x05\\x12\\x04\\xa1\\x05\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x01\\x01\\x12\\x04\\xa1\\x05\\n\\x13\\n\\x0f\\\n    \\n\\x07\\x04(\\x03\\x01\\x02\\x01\\x03\\x12\\x04\\xa1\\x05\\x16\\x17\\n\\x0e\\n\\x06\\x04(\\\n    \\x03\\x01\\x02\\x02\\x12\\x04\\xa2\\x05\\x04\\\"\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x02\\\n    \\x05\\x12\\x04\\xa2\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x02\\x01\\x12\\x04\\\n    \\xa2\\x05\\n\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x02\\x03\\x12\\x04\\xa2\\x05\\x20!\\\n    \\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x03\\x12\\x04\\xa3\\x05\\x04\\x16\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x01\\x02\\x03\\x05\\x12\\x04\\xa3\\x05\\x04\\x08\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\x03\\x01\\x12\\x04\\xa3\\x05\\t\\x11\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x03\\\n    \\x03\\x12\\x04\\xa3\\x05\\x14\\x15\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x04\\x12\\x04\\\n    \\xa4\\x05\\x04&\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x04\\x05\\x12\\x04\\xa4\\x05\\x04\\t\\\n    \\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x04\\x01\\x12\\x04\\xa4\\x05\\n!\\n\\x0f\\n\\x07\\x04\\\n    (\\x03\\x01\\x02\\x04\\x03\\x12\\x04\\xa4\\x05$%\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x05\\\n    \\x12\\x04\\xa5\\x05\\x04\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x05\\x05\\x12\\x04\\\n    \\xa5\\x05\\x04\\x08\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x05\\x01\\x12\\x04\\xa5\\x05\\t\\\n    \\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x05\\x03\\x12\\x04\\xa5\\x05\\x1c\\x1d\\n\\x0e\\\n    \\n\\x06\\x04(\\x03\\x01\\x02\\x06\\x12\\x04\\xa6\\x05\\x04\\x1c\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\x06\\x05\\x12\\x04\\xa6\\x05\\x04\\x08\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\\n    \\x06\\x01\\x12\\x04\\xa6\\x05\\t\\x17\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x06\\x03\\x12\\\n    \\x04\\xa6\\x05\\x1a\\x1b\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x07\\x12\\x04\\xa7\\x05\\\n    \\x04\\x14\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x07\\x05\\x12\\x04\\xa7\\x05\\x04\\n\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x07\\x01\\x12\\x04\\xa7\\x05\\x0b\\x0f\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x01\\x02\\x07\\x03\\x12\\x04\\xa7\\x05\\x12\\x13\\n\\x0e\\n\\x06\\x04(\\x03\\\n    \\x01\\x02\\x08\\x12\\x04\\xa8\\x05\\x04\\x13\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x08\\\n    \\x05\\x12\\x04\\xa8\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x08\\x01\\x12\\x04\\\n    \\xa8\\x05\\n\\x0e\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x08\\x03\\x12\\x04\\xa8\\x05\\x11\\\n    \\x12\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\t\\x12\\x04\\xa9\\x05\\x04\\x17\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x01\\x02\\t\\x05\\x12\\x04\\xa9\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\\n    \\x02\\t\\x01\\x12\\x04\\xa9\\x05\\x0b\\x11\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\t\\x03\\\n    \\x12\\x04\\xa9\\x05\\x14\\x16\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\n\\x12\\x04\\xaa\\x05\\\n    \\x04\\x1b\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\n\\x05\\x12\\x04\\xaa\\x05\\x04\\t\\n\\x0f\\\n    \\n\\x07\\x04(\\x03\\x01\\x02\\n\\x01\\x12\\x04\\xaa\\x05\\n\\x15\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\n\\x03\\x12\\x04\\xaa\\x05\\x18\\x1a\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x0b\\\n    \\x12\\x04\\xab\\x05\\x04\\x1b\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0b\\x05\\x12\\x04\\\n    \\xab\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0b\\x01\\x12\\x04\\xab\\x05\\x0b\\\n    \\x15\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0b\\x03\\x12\\x04\\xab\\x05\\x18\\x1a\\n\\x0e\\\n    \\n\\x06\\x04(\\x03\\x01\\x02\\x0c\\x12\\x04\\xac\\x05\\x04\\x1f\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\x0c\\x05\\x12\\x04\\xac\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0c\\\n    \\x01\\x12\\x04\\xac\\x05\\n\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0c\\x03\\x12\\x04\\\n    \\xac\\x05\\x1c\\x1e\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\r\\x12\\x04\\xad\\x05\\x04&\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\r\\x05\\x12\\x04\\xad\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x01\\x02\\r\\x01\\x12\\x04\\xad\\x05\\n\\x20\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\r\\\n    \\x03\\x12\\x04\\xad\\x05#%\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x0e\\x12\\x04\\xae\\x05\\\n    \\x04&\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0e\\x05\\x12\\x04\\xae\\x05\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04(\\x03\\x01\\x02\\x0e\\x01\\x12\\x04\\xae\\x05\\n\\x20\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\x0e\\x03\\x12\\x04\\xae\\x05#%\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x0f\\x12\\\n    \\x04\\xaf\\x05\\x04\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0f\\x05\\x12\\x04\\xaf\\\n    \\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0f\\x01\\x12\\x04\\xaf\\x05\\n\\x17\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x0f\\x03\\x12\\x04\\xaf\\x05\\x1a\\x1c\\n\\x0e\\n\\x06\\\n    \\x04(\\x03\\x01\\x02\\x10\\x12\\x04\\xb0\\x05\\x04\\x1f\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\\n    \\x02\\x10\\x05\\x12\\x04\\xb0\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x10\\x01\\\n    \\x12\\x04\\xb0\\x05\\n\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x10\\x03\\x12\\x04\\xb0\\\n    \\x05\\x1c\\x1e\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x11\\x12\\x04\\xb1\\x05\\x04$\\n\\x0f\\\n    \\n\\x07\\x04(\\x03\\x01\\x02\\x11\\x05\\x12\\x04\\xb1\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x01\\x02\\x11\\x01\\x12\\x04\\xb1\\x05\\x0b\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\\n    \\x02\\x11\\x03\\x12\\x04\\xb1\\x05!#\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x12\\x12\\x04\\\n    \\xb2\\x05\\x04\\x17\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x12\\x05\\x12\\x04\\xb2\\x05\\\n    \\x04\\x08\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x12\\x01\\x12\\x04\\xb2\\x05\\t\\x11\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x12\\x03\\x12\\x04\\xb2\\x05\\x14\\x16\\n\\x0e\\n\\x06\\\n    \\x04(\\x03\\x01\\x02\\x13\\x12\\x04\\xb3\\x05\\x04\\x15\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\\n    \\x02\\x13\\x05\\x12\\x04\\xb3\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x13\\x01\\\n    \\x12\\x04\\xb3\\x05\\n\\x0f\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x13\\x03\\x12\\x04\\xb3\\\n    \\x05\\x12\\x14\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x14\\x12\\x04\\xb4\\x05\\x04\\x19\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x14\\x05\\x12\\x04\\xb4\\x05\\x04\\t\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x01\\x02\\x14\\x01\\x12\\x04\\xb4\\x05\\n\\x13\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\\n    \\x02\\x14\\x03\\x12\\x04\\xb4\\x05\\x16\\x18\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x15\\\n    \\x12\\x04\\xb5\\x05\\x04\\x16\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x15\\x05\\x12\\x04\\\n    \\xb5\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x15\\x01\\x12\\x04\\xb5\\x05\\n\\\n    \\x10\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x15\\x03\\x12\\x04\\xb5\\x05\\x13\\x15\\n\\x0e\\\n    \\n\\x06\\x04(\\x03\\x01\\x02\\x16\\x12\\x04\\xb6\\x05\\x04\\x1f\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\x16\\x05\\x12\\x04\\xb6\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x16\\\n    \\x01\\x12\\x04\\xb6\\x05\\n\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x16\\x03\\x12\\x04\\\n    \\xb6\\x05\\x1c\\x1e\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x17\\x12\\x04\\xb7\\x05\\x04&\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x17\\x05\\x12\\x04\\xb7\\x05\\x04\\n\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x01\\x02\\x17\\x01\\x12\\x04\\xb7\\x05\\x0b\\x20\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x01\\x02\\x17\\x03\\x12\\x04\\xb7\\x05#%\\n\\x0e\\n\\x06\\x04(\\x03\\x01\\x02\\x18\\x12\\\n    \\x04\\xb8\\x05\\x04'\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x18\\x05\\x12\\x04\\xb8\\x05\\\n    \\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x01\\x02\\x18\\x01\\x12\\x04\\xb8\\x05\\x0b!\\n\\x0f\\n\\\n    \\x07\\x04(\\x03\\x01\\x02\\x18\\x03\\x12\\x04\\xb8\\x05$&\\n\\x0e\\n\\x04\\x04(\\x03\\x02\\\n    \\x12\\x06\\xbb\\x05\\x02\\xcf\\x05\\x03\\n\\r\\n\\x05\\x04(\\x03\\x02\\x01\\x12\\x04\\xbb\\\n    \\x05\\n\\x18\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\0\\x12\\x04\\xbc\\x05\\x04\\x1b\\n\\x0f\\\n    \\n\\x07\\x04(\\x03\\x02\\x02\\0\\x05\\x12\\x04\\xbc\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x02\\x02\\0\\x01\\x12\\x04\\xbc\\x05\\x0b\\x16\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\0\\\n    \\x03\\x12\\x04\\xbc\\x05\\x19\\x1a\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x01\\x12\\x04\\\n    \\xbd\\x05\\x04\\x1a\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x01\\x05\\x12\\x04\\xbd\\x05\\\n    \\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x01\\x01\\x12\\x04\\xbd\\x05\\x0b\\x15\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x01\\x03\\x12\\x04\\xbd\\x05\\x18\\x19\\n\\x0e\\n\\x06\\\n    \\x04(\\x03\\x02\\x02\\x02\\x12\\x04\\xbe\\x05\\x04\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\\n    \\x02\\x02\\x05\\x12\\x04\\xbe\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x02\\x01\\\n    \\x12\\x04\\xbe\\x05\\n\\x14\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x02\\x03\\x12\\x04\\xbe\\\n    \\x05\\x17\\x18\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x03\\x12\\x04\\xbf\\x05\\x04\\x1c\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x03\\x05\\x12\\x04\\xbf\\x05\\x04\\x08\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x02\\x02\\x03\\x01\\x12\\x04\\xbf\\x05\\t\\x17\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\\n    \\x02\\x03\\x03\\x12\\x04\\xbf\\x05\\x1a\\x1b\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x04\\\n    \\x12\\x04\\xc0\\x05\\x04\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x04\\x05\\x12\\x04\\\n    \\xc0\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x04\\x01\\x12\\x04\\xc0\\x05\\n\\\n    \\x18\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x04\\x03\\x12\\x04\\xc0\\x05\\x1b\\x1c\\n\\x0e\\\n    \\n\\x06\\x04(\\x03\\x02\\x02\\x05\\x12\\x04\\xc1\\x05\\x04\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x02\\x02\\x05\\x05\\x12\\x04\\xc1\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x05\\\n    \\x01\\x12\\x04\\xc1\\x05\\n\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x05\\x03\\x12\\x04\\\n    \\xc1\\x05\\x1c\\x1d\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x06\\x12\\x04\\xc2\\x05\\x04\\\n    \\x1b\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x06\\x05\\x12\\x04\\xc2\\x05\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04(\\x03\\x02\\x02\\x06\\x01\\x12\\x04\\xc2\\x05\\n\\x16\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x02\\x02\\x06\\x03\\x12\\x04\\xc2\\x05\\x19\\x1a\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\\n    \\x07\\x12\\x04\\xc3\\x05\\x04\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x07\\x05\\x12\\\n    \\x04\\xc3\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x07\\x01\\x12\\x04\\xc3\\x05\\\n    \\n\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x07\\x03\\x12\\x04\\xc3\\x05\\x1c\\x1d\\n\\\n    \\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x08\\x12\\x04\\xc4\\x05\\x04$\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x02\\x02\\x08\\x05\\x12\\x04\\xc4\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\\n    \\x08\\x01\\x12\\x04\\xc4\\x05\\n\\x1f\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x08\\x03\\x12\\\n    \\x04\\xc4\\x05\\\"#\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\t\\x12\\x04\\xc5\\x05\\x04\\x20\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\t\\x05\\x12\\x04\\xc5\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x02\\x02\\t\\x01\\x12\\x04\\xc5\\x05\\n\\x1a\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\t\\\n    \\x03\\x12\\x04\\xc5\\x05\\x1d\\x1f\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\n\\x12\\x04\\xc6\\\n    \\x05\\x04\\x20\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\n\\x05\\x12\\x04\\xc6\\x05\\x04\\t\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\n\\x01\\x12\\x04\\xc6\\x05\\n\\x1a\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x02\\x02\\n\\x03\\x12\\x04\\xc6\\x05\\x1d\\x1f\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\\n    \\x0b\\x12\\x04\\xc7\\x05\\x04\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0b\\x05\\x12\\\n    \\x04\\xc7\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0b\\x01\\x12\\x04\\xc7\\x05\\\n    \\n\\x18\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0b\\x03\\x12\\x04\\xc7\\x05\\x1b\\x1d\\n\\\n    \\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x0c\\x12\\x04\\xc8\\x05\\x04\\x19\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x02\\x02\\x0c\\x05\\x12\\x04\\xc8\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\\n    \\x0c\\x01\\x12\\x04\\xc8\\x05\\n\\x13\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0c\\x03\\x12\\\n    \\x04\\xc8\\x05\\x16\\x18\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\r\\x12\\x04\\xc9\\x05\\x04$\\\n    \\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\r\\x05\\x12\\x04\\xc9\\x05\\x04\\t\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x02\\x02\\r\\x01\\x12\\x04\\xc9\\x05\\n\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\\n    \\x02\\r\\x03\\x12\\x04\\xc9\\x05!#\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x0e\\x12\\x04\\\n    \\xca\\x05\\x04\\x1e\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0e\\x05\\x12\\x04\\xca\\x05\\\n    \\x04\\x08\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0e\\x01\\x12\\x04\\xca\\x05\\t\\x18\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0e\\x03\\x12\\x04\\xca\\x05\\x1b\\x1d\\n\\x0e\\n\\x06\\\n    \\x04(\\x03\\x02\\x02\\x0f\\x12\\x04\\xcb\\x05\\x04\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\\n    \\x02\\x0f\\x05\\x12\\x04\\xcb\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0f\\x01\\\n    \\x12\\x04\\xcb\\x05\\x0b\\x17\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x0f\\x03\\x12\\x04\\\n    \\xcb\\x05\\x1a\\x1c\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\x02\\x10\\x12\\x04\\xcc\\x05\\x04\\\n    \\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x10\\x05\\x12\\x04\\xcc\\x05\\x04\\n\\n\\x0f\\n\\\n    \\x07\\x04(\\x03\\x02\\x02\\x10\\x01\\x12\\x04\\xcc\\x05\\x0b\\x17\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x02\\x02\\x10\\x03\\x12\\x04\\xcc\\x05\\x1a\\x1c\\n\\x0e\\n\\x06\\x04(\\x03\\x02\\\n    \\x02\\x11\\x12\\x04\\xcd\\x05\\x04(\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x11\\x05\\x12\\\n    \\x04\\xcd\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x11\\x01\\x12\\x04\\xcd\\x05\\\n    \\n\\\"\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x11\\x03\\x12\\x04\\xcd\\x05%'\\n\\x0e\\n\\x06\\\n    \\x04(\\x03\\x02\\x02\\x12\\x12\\x04\\xce\\x05\\x04#\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\\n    \\x12\\x05\\x12\\x04\\xce\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x12\\x01\\x12\\\n    \\x04\\xce\\x05\\n\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x02\\x02\\x12\\x03\\x12\\x04\\xce\\x05\\\n    \\x20\\\"\\n\\x0e\\n\\x04\\x04(\\x03\\x03\\x12\\x06\\xd1\\x05\\x02\\xf1\\x05\\x03\\n\\r\\n\\\n    \\x05\\x04(\\x03\\x03\\x01\\x12\\x04\\xd1\\x05\\n\\x15\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\\n    \\0\\x12\\x04\\xd2\\x05\\x04\\x1a\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\0\\x05\\x12\\x04\\\n    \\xd2\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\0\\x01\\x12\\x04\\xd2\\x05\\n\\x15\\\n    \\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\0\\x03\\x12\\x04\\xd2\\x05\\x18\\x19\\n\\x0e\\n\\x06\\\n    \\x04(\\x03\\x03\\x02\\x01\\x12\\x04\\xd3\\x05\\x04\\\"\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\\n    \\x01\\x05\\x12\\x04\\xd3\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x01\\x01\\x12\\\n    \\x04\\xd3\\x05\\n\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x01\\x03\\x12\\x04\\xd3\\x05\\\n    \\x20!\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x02\\x12\\x04\\xd4\\x05\\x04\\x17\\n\\x0f\\n\\\n    \\x07\\x04(\\x03\\x03\\x02\\x02\\x05\\x12\\x04\\xd4\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x03\\x02\\x02\\x01\\x12\\x04\\xd4\\x05\\n\\x12\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x02\\\n    \\x03\\x12\\x04\\xd4\\x05\\x15\\x16\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x03\\x12\\x04\\\n    \\xd5\\x05\\x04\\x1a\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x03\\x05\\x12\\x04\\xd5\\x05\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x03\\x01\\x12\\x04\\xd5\\x05\\n\\x15\\n\\x0f\\\n    \\n\\x07\\x04(\\x03\\x03\\x02\\x03\\x03\\x12\\x04\\xd5\\x05\\x18\\x19\\n\\x0e\\n\\x06\\x04(\\\n    \\x03\\x03\\x02\\x04\\x12\\x04\\xd6\\x05\\x04\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\\n    \\x04\\x05\\x12\\x04\\xd6\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x04\\x01\\x12\\\n    \\x04\\xd6\\x05\\n\\x14\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x04\\x03\\x12\\x04\\xd6\\x05\\\n    \\x17\\x18\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x05\\x12\\x04\\xd7\\x05\\x04\\x17\\n\\x0f\\\n    \\n\\x07\\x04(\\x03\\x03\\x02\\x05\\x05\\x12\\x04\\xd7\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x03\\x02\\x05\\x01\\x12\\x04\\xd7\\x05\\x0b\\x12\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\\n    \\x02\\x05\\x03\\x12\\x04\\xd7\\x05\\x15\\x16\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x06\\\n    \\x12\\x04\\xd8\\x05\\x04\\x1b\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x06\\x05\\x12\\x04\\\n    \\xd8\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x06\\x01\\x12\\x04\\xd8\\x05\\x0b\\\n    \\x16\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x06\\x03\\x12\\x04\\xd8\\x05\\x19\\x1a\\n\\x0e\\\n    \\n\\x06\\x04(\\x03\\x03\\x02\\x07\\x12\\x04\\xd9\\x05\\x04\\x16\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x03\\x02\\x07\\x05\\x12\\x04\\xd9\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x07\\\n    \\x01\\x12\\x04\\xd9\\x05\\x0b\\x11\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x07\\x03\\x12\\\n    \\x04\\xd9\\x05\\x14\\x15\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x08\\x12\\x04\\xda\\x05\\\n    \\x04\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x08\\x05\\x12\\x04\\xda\\x05\\x04\\t\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x08\\x01\\x12\\x04\\xda\\x05\\n\\x18\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x03\\x02\\x08\\x03\\x12\\x04\\xda\\x05\\x1b\\x1c\\n\\x0e\\n\\x06\\x04(\\x03\\\n    \\x03\\x02\\t\\x12\\x04\\xdb\\x05\\x04\\x1d\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\t\\x05\\\n    \\x12\\x04\\xdb\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\t\\x01\\x12\\x04\\xdb\\\n    \\x05\\n\\x17\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\t\\x03\\x12\\x04\\xdb\\x05\\x1a\\x1c\\n\\\n    \\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\n\\x12\\x04\\xdc\\x05\\x04\\x1f\\n\\x0f\\n\\x07\\x04(\\\n    \\x03\\x03\\x02\\n\\x05\\x12\\x04\\xdc\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\n\\\n    \\x01\\x12\\x04\\xdc\\x05\\x0b\\x19\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\n\\x03\\x12\\x04\\\n    \\xdc\\x05\\x1c\\x1e\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x0b\\x12\\x04\\xdd\\x05\\x044\\n\\\n    \\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x0b\\x04\\x12\\x04\\xdd\\x05\\x04\\x0c\\n\\x0f\\n\\x07\\\n    \\x04(\\x03\\x03\\x02\\x0b\\x06\\x12\\x04\\xdd\\x05\\r\\x1b\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\\n    \\x02\\x0b\\x01\\x12\\x04\\xdd\\x05\\x1c.\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x0b\\x03\\\n    \\x12\\x04\\xdd\\x0513\\n\\x0e\\n\\x06\\x04(\\x03\\x03\\x02\\x0c\\x12\\x04\\xde\\x05\\x04<\\\n    \\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x0c\\x04\\x12\\x04\\xde\\x05\\x04\\x0c\\n\\x0f\\n\\\n    \\x07\\x04(\\x03\\x03\\x02\\x0c\\x06\\x12\\x04\\xde\\x05\\r\\x1f\\n\\x0f\\n\\x07\\x04(\\x03\\\n    \\x03\\x02\\x0c\\x01\\x12\\x04\\xde\\x05\\x206\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x02\\x0c\\\n    \\x03\\x12\\x04\\xde\\x059;\\n\\x10\\n\\x06\\x04(\\x03\\x03\\x03\\0\\x12\\x06\\xe0\\x05\\\n    \\x04\\xe6\\x05\\x05\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x03\\0\\x01\\x12\\x04\\xe0\\x05\\x0c\\\n    \\x1a\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\0\\x02\\0\\x12\\x04\\xe1\\x05\\x06\\x16\\n\\x11\\\n    \\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\0\\x05\\x12\\x04\\xe1\\x05\\x06\\x0c\\n\\x11\\n\\t\\x04(\\\n    \\x03\\x03\\x03\\0\\x02\\0\\x01\\x12\\x04\\xe1\\x05\\r\\x11\\n\\x11\\n\\t\\x04(\\x03\\x03\\\n    \\x03\\0\\x02\\0\\x03\\x12\\x04\\xe1\\x05\\x14\\x15\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\0\\\n    \\x02\\x01\\x12\\x04\\xe2\\x05\\x06\\x19\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x01\\\n    \\x05\\x12\\x04\\xe2\\x05\\x06\\x0b\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x01\\x01\\\n    \\x12\\x04\\xe2\\x05\\x0c\\x14\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x01\\x03\\x12\\\n    \\x04\\xe2\\x05\\x17\\x18\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\0\\x02\\x02\\x12\\x04\\xe3\\\n    \\x05\\x06\\x18\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xe3\\x05\\\n    \\x06\\x0b\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xe3\\x05\\x0c\\\n    \\x13\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x02\\x03\\x12\\x04\\xe3\\x05\\x16\\x17\\n\\\n    \\x10\\n\\x08\\x04(\\x03\\x03\\x03\\0\\x02\\x03\\x12\\x04\\xe4\\x05\\x06\\x18\\n\\x11\\n\\t\\\n    \\x04(\\x03\\x03\\x03\\0\\x02\\x03\\x05\\x12\\x04\\xe4\\x05\\x06\\x0b\\n\\x11\\n\\t\\x04(\\\n    \\x03\\x03\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xe4\\x05\\x0c\\x13\\n\\x11\\n\\t\\x04(\\x03\\\n    \\x03\\x03\\0\\x02\\x03\\x03\\x12\\x04\\xe4\\x05\\x16\\x17\\n\\x10\\n\\x08\\x04(\\x03\\x03\\\n    \\x03\\0\\x02\\x04\\x12\\x04\\xe5\\x05\\x06\\x19\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\\n    \\x04\\x05\\x12\\x04\\xe5\\x05\\x06\\x0c\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x04\\\n    \\x01\\x12\\x04\\xe5\\x05\\r\\x14\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\0\\x02\\x04\\x03\\x12\\\n    \\x04\\xe5\\x05\\x17\\x18\\n\\x10\\n\\x06\\x04(\\x03\\x03\\x03\\x01\\x12\\x06\\xe8\\x05\\\n    \\x04\\xf0\\x05\\x05\\n\\x0f\\n\\x07\\x04(\\x03\\x03\\x03\\x01\\x01\\x12\\x04\\xe8\\x05\\\n    \\x0c\\x1e\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\x01\\x02\\0\\x12\\x04\\xe9\\x05\\x06\\x16\\\n    \\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\0\\x05\\x12\\x04\\xe9\\x05\\x06\\x0c\\n\\x11\\\n    \\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\0\\x01\\x12\\x04\\xe9\\x05\\r\\x11\\n\\x11\\n\\t\\x04(\\\n    \\x03\\x03\\x03\\x01\\x02\\0\\x03\\x12\\x04\\xe9\\x05\\x14\\x15\\n\\x10\\n\\x08\\x04(\\x03\\\n    \\x03\\x03\\x01\\x02\\x01\\x12\\x04\\xea\\x05\\x06\\x1a\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\\n    \\x01\\x02\\x01\\x05\\x12\\x04\\xea\\x05\\x06\\x0c\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\\n    \\x02\\x01\\x01\\x12\\x04\\xea\\x05\\r\\x15\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\\n    \\x01\\x03\\x12\\x04\\xea\\x05\\x18\\x19\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\x01\\x02\\\n    \\x02\\x12\\x04\\xeb\\x05\\x06\\x1b\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x02\\x05\\\n    \\x12\\x04\\xeb\\x05\\x06\\x0c\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x02\\x01\\x12\\\n    \\x04\\xeb\\x05\\r\\x16\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x02\\x03\\x12\\x04\\\n    \\xeb\\x05\\x19\\x1a\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\x01\\x02\\x03\\x12\\x04\\xec\\\n    \\x05\\x06\\x17\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x03\\x05\\x12\\x04\\xec\\x05\\\n    \\x06\\x0c\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x03\\x01\\x12\\x04\\xec\\x05\\r\\\n    \\x12\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x03\\x03\\x12\\x04\\xec\\x05\\x15\\x16\\\n    \\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\x01\\x02\\x04\\x12\\x04\\xed\\x05\\x06\\x1a\\n\\x11\\\n    \\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x04\\x05\\x12\\x04\\xed\\x05\\x06\\x0b\\n\\x11\\n\\t\\\n    \\x04(\\x03\\x03\\x03\\x01\\x02\\x04\\x01\\x12\\x04\\xed\\x05\\x0c\\x15\\n\\x11\\n\\t\\x04(\\\n    \\x03\\x03\\x03\\x01\\x02\\x04\\x03\\x12\\x04\\xed\\x05\\x18\\x19\\n\\x10\\n\\x08\\x04(\\\n    \\x03\\x03\\x03\\x01\\x02\\x05\\x12\\x04\\xee\\x05\\x06\\x19\\n\\x11\\n\\t\\x04(\\x03\\x03\\\n    \\x03\\x01\\x02\\x05\\x05\\x12\\x04\\xee\\x05\\x06\\x0b\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\\n    \\x01\\x02\\x05\\x01\\x12\\x04\\xee\\x05\\x0c\\x14\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\\n    \\x02\\x05\\x03\\x12\\x04\\xee\\x05\\x17\\x18\\n\\x10\\n\\x08\\x04(\\x03\\x03\\x03\\x01\\\n    \\x02\\x06\\x12\\x04\\xef\\x05\\x06\\x1c\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x06\\\n    \\x05\\x12\\x04\\xef\\x05\\x06\\x0c\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x06\\x01\\\n    \\x12\\x04\\xef\\x05\\r\\x17\\n\\x11\\n\\t\\x04(\\x03\\x03\\x03\\x01\\x02\\x06\\x03\\x12\\\n    \\x04\\xef\\x05\\x1a\\x1b\\n\\x0c\\n\\x02\\x04)\\x12\\x06\\xf4\\x05\\0\\xda\\x06\\x01\\n\\\n    \\x0b\\n\\x03\\x04)\\x01\\x12\\x04\\xf4\\x05\\x08\\x13\\n\\x0c\\n\\x04\\x04)\\x02\\0\\x12\\\n    \\x04\\xf5\\x05\\x02\\x15\\n\\r\\n\\x05\\x04)\\x02\\0\\x05\\x12\\x04\\xf5\\x05\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04)\\x02\\0\\x01\\x12\\x04\\xf5\\x05\\x08\\x10\\n\\r\\n\\x05\\x04)\\x02\\0\\x03\\\n    \\x12\\x04\\xf5\\x05\\x13\\x14\\n\\x0c\\n\\x04\\x04)\\x02\\x01\\x12\\x04\\xf6\\x05\\x02\\\n    \\x14\\n\\r\\n\\x05\\x04)\\x02\\x01\\x06\\x12\\x04\\xf6\\x05\\x02\\n\\n\\r\\n\\x05\\x04)\\x02\\\n    \\x01\\x01\\x12\\x04\\xf6\\x05\\x0b\\x0f\\n\\r\\n\\x05\\x04)\\x02\\x01\\x03\\x12\\x04\\xf6\\\n    \\x05\\x12\\x13\\n\\x0c\\n\\x04\\x04)\\x02\\x02\\x12\\x04\\xf7\\x05\\x02\\x20\\n\\r\\n\\x05\\\n    \\x04)\\x02\\x02\\x06\\x12\\x04\\xf7\\x05\\x02\\x10\\n\\r\\n\\x05\\x04)\\x02\\x02\\x01\\x12\\\n    \\x04\\xf7\\x05\\x11\\x1b\\n\\r\\n\\x05\\x04)\\x02\\x02\\x03\\x12\\x04\\xf7\\x05\\x1e\\x1f\\\n    \\n\\x0c\\n\\x04\\x04)\\x02\\x03\\x12\\x04\\xf8\\x05\\x02\\x12\\n\\r\\n\\x05\\x04)\\x02\\x03\\\n    \\x06\\x12\\x04\\xf8\\x05\\x02\\t\\n\\r\\n\\x05\\x04)\\x02\\x03\\x01\\x12\\x04\\xf8\\x05\\n\\\n    \\r\\n\\r\\n\\x05\\x04)\\x02\\x03\\x03\\x12\\x04\\xf8\\x05\\x10\\x11\\n\\x0e\\n\\x04\\x04)\\\n    \\x03\\0\\x12\\x06\\xfa\\x05\\x02\\xff\\x05\\x03\\n\\r\\n\\x05\\x04)\\x03\\0\\x01\\x12\\x04\\\n    \\xfa\\x05\\n\\x12\\n\\x0e\\n\\x06\\x04)\\x03\\0\\x02\\0\\x12\\x04\\xfb\\x05\\x04\\x12\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\0\\x02\\0\\x05\\x12\\x04\\xfb\\x05\\x04\\n\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\0\\x02\\0\\x01\\x12\\x04\\xfb\\x05\\x0b\\r\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\0\\x03\\\n    \\x12\\x04\\xfb\\x05\\x10\\x11\\n\\x0e\\n\\x06\\x04)\\x03\\0\\x02\\x01\\x12\\x04\\xfc\\x05\\\n    \\x04\\x17\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\x01\\x05\\x12\\x04\\xfc\\x05\\x04\\t\\n\\x0f\\\n    \\n\\x07\\x04)\\x03\\0\\x02\\x01\\x01\\x12\\x04\\xfc\\x05\\n\\x12\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\0\\x02\\x01\\x03\\x12\\x04\\xfc\\x05\\x15\\x16\\n\\x0e\\n\\x06\\x04)\\x03\\0\\x02\\x02\\\n    \\x12\\x04\\xfd\\x05\\x04\\x17\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xfd\\\n    \\x05\\x04\\n\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xfd\\x05\\x0b\\x12\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\0\\x02\\x02\\x03\\x12\\x04\\xfd\\x05\\x15\\x16\\n\\x0e\\n\\x06\\\n    \\x04)\\x03\\0\\x02\\x03\\x12\\x04\\xfe\\x05\\x04\\x1b\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\\n    \\x03\\x05\\x12\\x04\\xfe\\x05\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\x03\\x01\\x12\\\n    \\x04\\xfe\\x05\\n\\x16\\n\\x0f\\n\\x07\\x04)\\x03\\0\\x02\\x03\\x03\\x12\\x04\\xfe\\x05\\\n    \\x19\\x1a\\n\\x0e\\n\\x04\\x04)\\x03\\x01\\x12\\x06\\x81\\x06\\x02\\x9a\\x06\\x03\\n\\r\\n\\\n    \\x05\\x04)\\x03\\x01\\x01\\x12\\x04\\x81\\x06\\n\\x18\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\\n    \\0\\x12\\x04\\x82\\x06\\x04\\x1b\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\0\\x05\\x12\\x04\\\n    \\x82\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\0\\x01\\x12\\x04\\x82\\x06\\n\\x16\\\n    \\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\0\\x03\\x12\\x04\\x82\\x06\\x19\\x1a\\n\\x0e\\n\\x06\\\n    \\x04)\\x03\\x01\\x02\\x01\\x12\\x04\\x83\\x06\\x04!\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\\n    \\x01\\x05\\x12\\x04\\x83\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x01\\x01\\x12\\\n    \\x04\\x83\\x06\\n\\x1c\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x01\\x03\\x12\\x04\\x83\\x06\\\n    \\x1f\\x20\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\x02\\x12\\x04\\x84\\x06\\x04\\x1d\\n\\x0f\\\n    \\n\\x07\\x04)\\x03\\x01\\x02\\x02\\x05\\x12\\x04\\x84\\x06\\x04\\n\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x01\\x02\\x02\\x01\\x12\\x04\\x84\\x06\\x0b\\x18\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\\n    \\x02\\x02\\x03\\x12\\x04\\x84\\x06\\x1b\\x1c\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\x03\\\n    \\x12\\x04\\x85\\x06\\x04\\x18\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x03\\x05\\x12\\x04\\\n    \\x85\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x03\\x01\\x12\\x04\\x85\\x06\\n\\\n    \\x13\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x03\\x03\\x12\\x04\\x85\\x06\\x16\\x17\\n\\x0e\\\n    \\n\\x06\\x04)\\x03\\x01\\x02\\x04\\x12\\x04\\x86\\x06\\x04\\x1c\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x01\\x02\\x04\\x05\\x12\\x04\\x86\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x04\\\n    \\x01\\x12\\x04\\x86\\x06\\n\\x17\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x04\\x03\\x12\\x04\\\n    \\x86\\x06\\x1a\\x1b\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\x05\\x12\\x04\\x87\\x06\\x04\\\"\\\n    \\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x05\\x06\\x12\\x04\\x87\\x06\\x04\\x0c\\n\\x0f\\n\\\n    \\x07\\x04)\\x03\\x01\\x02\\x05\\x01\\x12\\x04\\x87\\x06\\r\\x1d\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x01\\x02\\x05\\x03\\x12\\x04\\x87\\x06\\x20!\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\x06\\\n    \\x12\\x04\\x88\\x06\\x04\\x15\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x06\\x06\\x12\\x04\\\n    \\x88\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x06\\x01\\x12\\x04\\x88\\x06\\r\\\n    \\x10\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x06\\x03\\x12\\x04\\x88\\x06\\x13\\x14\\n\\x0e\\\n    \\n\\x06\\x04)\\x03\\x01\\x02\\x07\\x12\\x04\\x89\\x06\\x04#\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x01\\x02\\x07\\x05\\x12\\x04\\x89\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x07\\\n    \\x01\\x12\\x04\\x89\\x06\\n\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x07\\x03\\x12\\x04\\\n    \\x89\\x06!\\\"\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\x08\\x12\\x04\\x8a\\x06\\x04#\\n\\x0f\\\n    \\n\\x07\\x04)\\x03\\x01\\x02\\x08\\x06\\x12\\x04\\x8a\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x01\\x02\\x08\\x01\\x12\\x04\\x8a\\x06\\r\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\\n    \\x08\\x03\\x12\\x04\\x8a\\x06!\\\"\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\t\\x12\\x04\\x8b\\\n    \\x06\\x04$\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\t\\x04\\x12\\x04\\x8b\\x06\\x04\\x0c\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\t\\x06\\x12\\x04\\x8b\\x06\\r\\x14\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x01\\x02\\t\\x01\\x12\\x04\\x8b\\x06\\x15\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\\n    \\t\\x03\\x12\\x04\\x8b\\x06!#\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\n\\x12\\x04\\x8c\\x06\\\n    \\x04#\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\n\\x05\\x12\\x04\\x8c\\x06\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04)\\x03\\x01\\x02\\n\\x01\\x12\\x04\\x8c\\x06\\n\\x1d\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x01\\x02\\n\\x03\\x12\\x04\\x8c\\x06\\x20\\\"\\n\\x0e\\n\\x06\\x04)\\x03\\x01\\x02\\x0b\\\n    \\x12\\x04\\x8d\\x06\\x04'\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0b\\x05\\x12\\x04\\x8d\\\n    \\x06\\x04\\n\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0b\\x01\\x12\\x04\\x8d\\x06\\x0b!\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0b\\x03\\x12\\x04\\x8d\\x06$&\\n\\x0e\\n\\x06\\x04)\\\n    \\x03\\x01\\x02\\x0c\\x12\\x04\\x8e\\x06\\x04(\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0c\\\n    \\x04\\x12\\x04\\x8e\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0c\\x06\\x12\\\n    \\x04\\x8e\\x06\\r\\x17\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0c\\x01\\x12\\x04\\x8e\\x06\\\n    \\x18\\\"\\n\\x0f\\n\\x07\\x04)\\x03\\x01\\x02\\x0c\\x03\\x12\\x04\\x8e\\x06%'\\n\\x10\\n\\\n    \\x06\\x04)\\x03\\x01\\x03\\0\\x12\\x06\\x90\\x06\\x04\\x93\\x06\\x05\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x01\\x03\\0\\x01\\x12\\x04\\x90\\x06\\x0c\\x13\\n\\x10\\n\\x08\\x04)\\x03\\x01\\x03\\\n    \\0\\x02\\0\\x12\\x04\\x91\\x06\\x06\\x19\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\0\\x02\\0\\x05\\\n    \\x12\\x04\\x91\\x06\\x06\\x0c\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\0\\x02\\0\\x01\\x12\\x04\\\n    \\x91\\x06\\r\\x14\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\0\\x02\\0\\x03\\x12\\x04\\x91\\x06\\\n    \\x17\\x18\\n\\x10\\n\\x08\\x04)\\x03\\x01\\x03\\0\\x02\\x01\\x12\\x04\\x92\\x06\\x06\\x18\\\n    \\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\0\\x02\\x01\\x05\\x12\\x04\\x92\\x06\\x06\\x0b\\n\\x11\\\n    \\n\\t\\x04)\\x03\\x01\\x03\\0\\x02\\x01\\x01\\x12\\x04\\x92\\x06\\x0c\\x13\\n\\x11\\n\\t\\\n    \\x04)\\x03\\x01\\x03\\0\\x02\\x01\\x03\\x12\\x04\\x92\\x06\\x16\\x17\\n\\x10\\n\\x06\\x04)\\\n    \\x03\\x01\\x03\\x01\\x12\\x06\\x95\\x06\\x04\\x99\\x06\\x05\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x01\\x03\\x01\\x01\\x12\\x04\\x95\\x06\\x0c\\x16\\n\\x10\\n\\x08\\x04)\\x03\\x01\\x03\\\n    \\x01\\x02\\0\\x12\\x04\\x96\\x06\\x06\\x19\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\0\\\n    \\x05\\x12\\x04\\x96\\x06\\x06\\x0c\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\0\\x01\\\n    \\x12\\x04\\x96\\x06\\r\\x14\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\0\\x03\\x12\\x04\\\n    \\x96\\x06\\x17\\x18\\n\\x10\\n\\x08\\x04)\\x03\\x01\\x03\\x01\\x02\\x01\\x12\\x04\\x97\\\n    \\x06\\x06\\x19\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\x01\\x05\\x12\\x04\\x97\\x06\\\n    \\x06\\x0b\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\x01\\x01\\x12\\x04\\x97\\x06\\x0c\\\n    \\x14\\n\\x11\\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\x01\\x03\\x12\\x04\\x97\\x06\\x17\\x18\\\n    \\n\\x10\\n\\x08\\x04)\\x03\\x01\\x03\\x01\\x02\\x02\\x12\\x04\\x98\\x06\\x06\\x16\\n\\x11\\\n    \\n\\t\\x04)\\x03\\x01\\x03\\x01\\x02\\x02\\x05\\x12\\x04\\x98\\x06\\x06\\x0b\\n\\x11\\n\\t\\\n    \\x04)\\x03\\x01\\x03\\x01\\x02\\x02\\x01\\x12\\x04\\x98\\x06\\x0c\\x11\\n\\x11\\n\\t\\x04)\\\n    \\x03\\x01\\x03\\x01\\x02\\x02\\x03\\x12\\x04\\x98\\x06\\x14\\x15\\n\\x0e\\n\\x04\\x04)\\\n    \\x03\\x02\\x12\\x06\\x9c\\x06\\x02\\xa2\\x06\\x03\\n\\r\\n\\x05\\x04)\\x03\\x02\\x01\\x12\\\n    \\x04\\x9c\\x06\\n\\x12\\n\\x0e\\n\\x06\\x04)\\x03\\x02\\x02\\0\\x12\\x04\\x9d\\x06\\x04\\\n    \\x14\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\0\\x05\\x12\\x04\\x9d\\x06\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04)\\x03\\x02\\x02\\0\\x01\\x12\\x04\\x9d\\x06\\n\\x0f\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x02\\x02\\0\\x03\\x12\\x04\\x9d\\x06\\x12\\x13\\n\\x0e\\n\\x06\\x04)\\x03\\x02\\x02\\x01\\\n    \\x12\\x04\\x9e\\x06\\x04\\x18\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x01\\x05\\x12\\x04\\\n    \\x9e\\x06\\x04\\n\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x01\\x01\\x12\\x04\\x9e\\x06\\x0b\\\n    \\x13\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x01\\x03\\x12\\x04\\x9e\\x06\\x16\\x17\\n\\x0e\\\n    \\n\\x06\\x04)\\x03\\x02\\x02\\x02\\x12\\x04\\x9f\\x06\\x04\\x1d\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x02\\x02\\x02\\x05\\x12\\x04\\x9f\\x06\\x04\\n\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x02\\\n    \\x01\\x12\\x04\\x9f\\x06\\x0b\\x18\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x02\\x03\\x12\\\n    \\x04\\x9f\\x06\\x1b\\x1c\\n\\x0e\\n\\x06\\x04)\\x03\\x02\\x02\\x03\\x12\\x04\\xa0\\x06\\\n    \\x04\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x03\\x05\\x12\\x04\\xa0\\x06\\x04\\n\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x03\\x01\\x12\\x04\\xa0\\x06\\x0b\\x19\\n\\x0f\\n\\x07\\\n    \\x04)\\x03\\x02\\x02\\x03\\x03\\x12\\x04\\xa0\\x06\\x1c\\x1d\\n\\x0e\\n\\x06\\x04)\\x03\\\n    \\x02\\x02\\x04\\x12\\x04\\xa1\\x06\\x04!\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x04\\x05\\\n    \\x12\\x04\\xa1\\x06\\x04\\n\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x04\\x01\\x12\\x04\\xa1\\\n    \\x06\\x0b\\x1c\\n\\x0f\\n\\x07\\x04)\\x03\\x02\\x02\\x04\\x03\\x12\\x04\\xa1\\x06\\x1f\\\n    \\x20\\n\\x0e\\n\\x04\\x04)\\x03\\x03\\x12\\x06\\xa4\\x06\\x02\\xd9\\x06\\x03\\n\\r\\n\\x05\\\n    \\x04)\\x03\\x03\\x01\\x12\\x04\\xa4\\x06\\n\\x11\\n\\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\0\\\n    \\x12\\x04\\xa5\\x06\\x04\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\0\\x05\\x12\\x04\\xa5\\\n    \\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\0\\x01\\x12\\x04\\xa5\\x06\\n\\x19\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\0\\x03\\x12\\x04\\xa5\\x06\\x1c\\x1d\\n\\x0e\\n\\x06\\\n    \\x04)\\x03\\x03\\x02\\x01\\x12\\x04\\xa6\\x06\\x04\\x14\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\\n    \\x02\\x01\\x06\\x12\\x04\\xa6\\x06\\x04\\x0b\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x01\\\n    \\x01\\x12\\x04\\xa6\\x06\\x0c\\x0f\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x01\\x03\\x12\\\n    \\x04\\xa6\\x06\\x12\\x13\\n\\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\x02\\x12\\x04\\xa7\\x06\\\n    \\x04\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x02\\x05\\x12\\x04\\xa7\\x06\\x04\\t\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x02\\x01\\x12\\x04\\xa7\\x06\\n\\x19\\n\\x0f\\n\\x07\\\n    \\x04)\\x03\\x03\\x02\\x02\\x03\\x12\\x04\\xa7\\x06\\x1c\\x1d\\n\\x0e\\n\\x06\\x04)\\x03\\\n    \\x03\\x02\\x03\\x12\\x04\\xa8\\x06\\x04#\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x03\\x05\\\n    \\x12\\x04\\xa8\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x03\\x01\\x12\\x04\\xa8\\\n    \\x06\\n\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x03\\x03\\x12\\x04\\xa8\\x06!\\\"\\n\\x0e\\\n    \\n\\x06\\x04)\\x03\\x03\\x02\\x04\\x12\\x04\\xa9\\x06\\x04\\x1e\\n\\x0f\\n\\x07\\x04)\\x03\\\n    \\x03\\x02\\x04\\x06\\x12\\x04\\xa9\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\\n    \\x04\\x01\\x12\\x04\\xa9\\x06\\r\\x19\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x04\\x03\\x12\\\n    \\x04\\xa9\\x06\\x1c\\x1d\\n\\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\x05\\x12\\x04\\xaa\\x06\\\n    \\x04\\x1f\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x05\\x06\\x12\\x04\\xaa\\x06\\x04\\x0c\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x05\\x01\\x12\\x04\\xaa\\x06\\r\\x1a\\n\\x0f\\n\\x07\\\n    \\x04)\\x03\\x03\\x02\\x05\\x03\\x12\\x04\\xaa\\x06\\x1d\\x1e\\n\\x0e\\n\\x06\\x04)\\x03\\\n    \\x03\\x02\\x06\\x12\\x04\\xab\\x06\\x04!\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x06\\x05\\\n    \\x12\\x04\\xab\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x06\\x01\\x12\\x04\\xab\\\n    \\x06\\n\\x1c\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x06\\x03\\x12\\x04\\xab\\x06\\x1f\\x20\\\n    \\n\\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\x07\\x12\\x04\\xac\\x06\\x04=\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x03\\x02\\x07\\x04\\x12\\x04\\xac\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\\n    \\x02\\x07\\x06\\x12\\x04\\xac\\x06\\r$\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x07\\x01\\x12\\\n    \\x04\\xac\\x06%8\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x07\\x03\\x12\\x04\\xac\\x06;<\\n\\\n    \\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\x08\\x12\\x04\\xad\\x06\\x04\\x1e\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x03\\x02\\x08\\x06\\x12\\x04\\xad\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\\n    \\x02\\x08\\x01\\x12\\x04\\xad\\x06\\r\\x19\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\x08\\x03\\\n    \\x12\\x04\\xad\\x06\\x1c\\x1d\\n\\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\t\\x12\\x04\\xae\\x06\\\n    \\x04\\x20\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\t\\x06\\x12\\x04\\xae\\x06\\x04\\x0c\\n\\\n    \\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\t\\x01\\x12\\x04\\xae\\x06\\r\\x1a\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x03\\x02\\t\\x03\\x12\\x04\\xae\\x06\\x1d\\x1f\\n\\x0e\\n\\x06\\x04)\\x03\\x03\\x02\\\n    \\n\\x12\\x04\\xaf\\x06\\x04\\x1d\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\n\\x06\\x12\\x04\\\n    \\xaf\\x06\\x04\\x0f\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\n\\x01\\x12\\x04\\xaf\\x06\\x10\\\n    \\x17\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x02\\n\\x03\\x12\\x04\\xaf\\x06\\x1a\\x1c\\n\\x10\\n\\\n    \\x06\\x04)\\x03\\x03\\x03\\0\\x12\\x06\\xb1\\x06\\x04\\xbd\\x06\\x05\\n\\x0f\\n\\x07\\x04)\\\n    \\x03\\x03\\x03\\0\\x01\\x12\\x04\\xb1\\x06\\x0c\\x13\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\\n    \\0\\x02\\0\\x12\\x04\\xb2\\x06\\x06\\x17\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\0\\x06\\\n    \\x12\\x04\\xb2\\x06\\x06\\x0e\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\0\\x01\\x12\\x04\\\n    \\xb2\\x06\\x0f\\x12\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\0\\x03\\x12\\x04\\xb2\\x06\\\n    \\x15\\x16\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\0\\x02\\x01\\x12\\x04\\xb3\\x06\\x06\\x1b\\\n    \\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\x01\\x06\\x12\\x04\\xb3\\x06\\x06\\x0e\\n\\x11\\\n    \\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\x01\\x01\\x12\\x04\\xb3\\x06\\x0f\\x16\\n\\x11\\n\\t\\\n    \\x04)\\x03\\x03\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xb3\\x06\\x19\\x1a\\n\\x10\\n\\x08\\x04)\\\n    \\x03\\x03\\x03\\0\\x02\\x02\\x12\\x04\\xb4\\x06\\x06\\x1e\\n\\x11\\n\\t\\x04)\\x03\\x03\\\n    \\x03\\0\\x02\\x02\\x06\\x12\\x04\\xb4\\x06\\x06\\x0e\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\\n    \\x02\\x02\\x01\\x12\\x04\\xb4\\x06\\x0f\\x19\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\\n    \\x02\\x03\\x12\\x04\\xb4\\x06\\x1c\\x1d\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\0\\x02\\x03\\\n    \\x12\\x04\\xb5\\x06\\x06(\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\x03\\x04\\x12\\x04\\\n    \\xb5\\x06\\x06\\x0e\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\x03\\x06\\x12\\x04\\xb5\\\n    \\x06\\x0f\\x1c\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xb5\\x06\\\n    \\x1d#\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\0\\x02\\x03\\x03\\x12\\x04\\xb5\\x06&'\\n\\x12\\n\\\n    \\x08\\x04)\\x03\\x03\\x03\\0\\x03\\0\\x12\\x06\\xb7\\x06\\x06\\xbc\\x06\\x07\\n\\x11\\n\\t\\\n    \\x04)\\x03\\x03\\x03\\0\\x03\\0\\x01\\x12\\x04\\xb7\\x06\\x0e\\x1b\\n\\x12\\n\\n\\x04)\\x03\\\n    \\x03\\x03\\0\\x03\\0\\x02\\0\\x12\\x04\\xb8\\x06\\x08\\x18\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\\n    \\x03\\0\\x03\\0\\x02\\0\\x05\\x12\\x04\\xb8\\x06\\x08\\x0e\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\\n    \\x03\\0\\x03\\0\\x02\\0\\x01\\x12\\x04\\xb8\\x06\\x0f\\x13\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\\n    \\x03\\0\\x03\\0\\x02\\0\\x03\\x12\\x04\\xb8\\x06\\x16\\x17\\n\\x12\\n\\n\\x04)\\x03\\x03\\\n    \\x03\\0\\x03\\0\\x02\\x01\\x12\\x04\\xb9\\x06\\x08\\x19\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\\n    \\x03\\0\\x03\\0\\x02\\x01\\x06\\x12\\x04\\xb9\\x06\\x08\\x10\\n\\x13\\n\\x0b\\x04)\\x03\\\n    \\x03\\x03\\0\\x03\\0\\x02\\x01\\x01\\x12\\x04\\xb9\\x06\\x11\\x14\\n\\x13\\n\\x0b\\x04)\\\n    \\x03\\x03\\x03\\0\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xb9\\x06\\x17\\x18\\n\\x12\\n\\n\\x04)\\\n    \\x03\\x03\\x03\\0\\x03\\0\\x02\\x02\\x12\\x04\\xba\\x06\\x08\\x1d\\n\\x13\\n\\x0b\\x04)\\\n    \\x03\\x03\\x03\\0\\x03\\0\\x02\\x02\\x06\\x12\\x04\\xba\\x06\\x08\\x10\\n\\x13\\n\\x0b\\x04\\\n    )\\x03\\x03\\x03\\0\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xba\\x06\\x11\\x18\\n\\x13\\n\\x0b\\\n    \\x04)\\x03\\x03\\x03\\0\\x03\\0\\x02\\x02\\x03\\x12\\x04\\xba\\x06\\x1b\\x1c\\n\\x12\\n\\n\\\n    \\x04)\\x03\\x03\\x03\\0\\x03\\0\\x02\\x03\\x12\\x04\\xbb\\x06\\x08\\x20\\n\\x13\\n\\x0b\\\n    \\x04)\\x03\\x03\\x03\\0\\x03\\0\\x02\\x03\\x06\\x12\\x04\\xbb\\x06\\x08\\x10\\n\\x13\\n\\\n    \\x0b\\x04)\\x03\\x03\\x03\\0\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xbb\\x06\\x11\\x1b\\n\\x13\\\n    \\n\\x0b\\x04)\\x03\\x03\\x03\\0\\x03\\0\\x02\\x03\\x03\\x12\\x04\\xbb\\x06\\x1e\\x1f\\n\\\n    \\x10\\n\\x06\\x04)\\x03\\x03\\x03\\x01\\x12\\x06\\xbf\\x06\\x04\\xc2\\x06\\x05\\n\\x0f\\n\\\n    \\x07\\x04)\\x03\\x03\\x03\\x01\\x01\\x12\\x04\\xbf\\x06\\x0c#\\n\\x10\\n\\x08\\x04)\\x03\\\n    \\x03\\x03\\x01\\x02\\0\\x12\\x04\\xc0\\x06\\x06\\x18\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\\n    \\x01\\x02\\0\\x05\\x12\\x04\\xc0\\x06\\x06\\x0c\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x01\\\n    \\x02\\0\\x01\\x12\\x04\\xc0\\x06\\r\\x13\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x01\\x02\\0\\\n    \\x03\\x12\\x04\\xc0\\x06\\x16\\x17\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x01\\x02\\x01\\\n    \\x12\\x04\\xc1\\x06\\x06\\x16\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x01\\x02\\x01\\x05\\x12\\\n    \\x04\\xc1\\x06\\x06\\x0b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x01\\x02\\x01\\x01\\x12\\x04\\\n    \\xc1\\x06\\x0c\\x11\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x01\\x02\\x01\\x03\\x12\\x04\\xc1\\\n    \\x06\\x14\\x15\\n\\x10\\n\\x06\\x04)\\x03\\x03\\x03\\x02\\x12\\x06\\xc4\\x06\\x04\\xd8\\\n    \\x06\\x05\\n\\x0f\\n\\x07\\x04)\\x03\\x03\\x03\\x02\\x01\\x12\\x04\\xc4\\x06\\x0c\\x17\\n\\\n    \\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x02\\x02\\0\\x12\\x04\\xc5\\x06\\x06\\x16\\n\\x11\\n\\t\\\n    \\x04)\\x03\\x03\\x03\\x02\\x02\\0\\x05\\x12\\x04\\xc5\\x06\\x06\\x0b\\n\\x11\\n\\t\\x04)\\\n    \\x03\\x03\\x03\\x02\\x02\\0\\x01\\x12\\x04\\xc5\\x06\\x0c\\x11\\n\\x11\\n\\t\\x04)\\x03\\\n    \\x03\\x03\\x02\\x02\\0\\x03\\x12\\x04\\xc5\\x06\\x14\\x15\\n\\x10\\n\\x08\\x04)\\x03\\x03\\\n    \\x03\\x02\\x02\\x01\\x12\\x04\\xc6\\x06\\x06\\x16\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\\n    \\x02\\x01\\x05\\x12\\x04\\xc6\\x06\\x06\\x0b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\\n    \\x01\\x01\\x12\\x04\\xc6\\x06\\x0c\\x11\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x01\\\n    \\x03\\x12\\x04\\xc6\\x06\\x14\\x15\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x02\\x02\\x02\\\n    \\x12\\x04\\xc7\\x06\\x06\\x16\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x02\\x05\\x12\\\n    \\x04\\xc7\\x06\\x06\\x0b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x02\\x01\\x12\\x04\\\n    \\xc7\\x06\\x0c\\x11\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x02\\x03\\x12\\x04\\xc7\\\n    \\x06\\x14\\x15\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x02\\x02\\x03\\x12\\x04\\xc8\\x06\\\n    \\x06\\x1b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x03\\x05\\x12\\x04\\xc8\\x06\\x06\\\n    \\x0b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x03\\x01\\x12\\x04\\xc8\\x06\\x0c\\x16\\\n    \\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x03\\x03\\x12\\x04\\xc8\\x06\\x19\\x1a\\n\\\n    \\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x02\\x02\\x04\\x12\\x04\\xc9\\x06\\x06\\x18\\n\\x11\\n\\\n    \\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x04\\x05\\x12\\x04\\xc9\\x06\\x06\\x0b\\n\\x11\\n\\t\\\n    \\x04)\\x03\\x03\\x03\\x02\\x02\\x04\\x01\\x12\\x04\\xc9\\x06\\x0c\\x13\\n\\x11\\n\\t\\x04)\\\n    \\x03\\x03\\x03\\x02\\x02\\x04\\x03\\x12\\x04\\xc9\\x06\\x16\\x17\\n\\x10\\n\\x08\\x04)\\\n    \\x03\\x03\\x03\\x02\\x02\\x05\\x12\\x04\\xca\\x06\\x06\\x18\\n\\x11\\n\\t\\x04)\\x03\\x03\\\n    \\x03\\x02\\x02\\x05\\x05\\x12\\x04\\xca\\x06\\x06\\x0b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\\n    \\x02\\x02\\x05\\x01\\x12\\x04\\xca\\x06\\x0c\\x13\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\\n    \\x02\\x05\\x03\\x12\\x04\\xca\\x06\\x16\\x17\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x02\\\n    \\x02\\x06\\x12\\x04\\xcb\\x06\\x06\\x18\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x06\\\n    \\x05\\x12\\x04\\xcb\\x06\\x06\\x0b\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x06\\x01\\\n    \\x12\\x04\\xcb\\x06\\x0c\\x13\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x06\\x03\\x12\\\n    \\x04\\xcb\\x06\\x16\\x17\\n\\x10\\n\\x08\\x04)\\x03\\x03\\x03\\x02\\x02\\x07\\x12\\x04\\\n    \\xcc\\x06\\x06,\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x07\\x04\\x12\\x04\\xcc\\x06\\\n    \\x06\\x0e\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x07\\x06\\x12\\x04\\xcc\\x06\\x0f\\\n    \\x20\\n\\x11\\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x07\\x01\\x12\\x04\\xcc\\x06!'\\n\\x11\\\n    \\n\\t\\x04)\\x03\\x03\\x03\\x02\\x02\\x07\\x03\\x12\\x04\\xcc\\x06*+\\n\\x12\\n\\x08\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x12\\x06\\xce\\x06\\x06\\xd7\\x06\\x07\\n\\x11\\n\\t\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x01\\x12\\x04\\xce\\x06\\x0e\\x1f\\n\\x12\\n\\n\\x04)\\x03\\\n    \\x03\\x03\\x02\\x03\\0\\x02\\0\\x12\\x04\\xcf\\x06\\x08\\x1b\\n\\x13\\n\\x0b\\x04)\\x03\\\n    \\x03\\x03\\x02\\x03\\0\\x02\\0\\x05\\x12\\x04\\xcf\\x06\\x08\\x0e\\n\\x13\\n\\x0b\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x02\\0\\x01\\x12\\x04\\xcf\\x06\\x0f\\x16\\n\\x13\\n\\x0b\\x04\\\n    )\\x03\\x03\\x03\\x02\\x03\\0\\x02\\0\\x03\\x12\\x04\\xcf\\x06\\x19\\x1a\\n\\x12\\n\\n\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x02\\x01\\x12\\x04\\xd0\\x06\\x08\\x18\\n\\x13\\n\\x0b\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x02\\x01\\x05\\x12\\x04\\xd0\\x06\\x08\\r\\n\\x13\\n\\x0b\\x04\\\n    )\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x01\\x01\\x12\\x04\\xd0\\x06\\x0e\\x13\\n\\x13\\n\\x0b\\\n    \\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xd0\\x06\\x16\\x17\\n\\x12\\n\\\n    \\n\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x02\\x12\\x04\\xd1\\x06\\x08\\x18\\n\\x13\\n\\\n    \\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xd1\\x06\\x08\\r\\n\\x13\\\n    \\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x02\\x01\\x12\\x04\\xd1\\x06\\x0e\\x13\\n\\\n    \\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x02\\x03\\x12\\x04\\xd1\\x06\\x16\\\n    \\x17\\n\\x12\\n\\n\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x03\\x12\\x04\\xd2\\x06\\x08\\\n    \\x18\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x03\\x05\\x12\\x04\\xd2\\x06\\\n    \\x08\\r\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xd2\\\n    \\x06\\x0e\\x13\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x03\\x03\\x12\\x04\\\n    \\xd2\\x06\\x16\\x17\\n\\x12\\n\\n\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x04\\x12\\x04\\\n    \\xd3\\x06\\x08\\x18\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x04\\x05\\x12\\\n    \\x04\\xd3\\x06\\x08\\r\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x04\\x01\\\n    \\x12\\x04\\xd3\\x06\\x0e\\x13\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x04\\\n    \\x03\\x12\\x04\\xd3\\x06\\x16\\x17\\n\\x12\\n\\n\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\\n    \\x05\\x12\\x04\\xd4\\x06\\x08\\x1a\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\\n    \\x05\\x05\\x12\\x04\\xd4\\x06\\x08\\r\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\x03\\0\\\n    \\x02\\x05\\x01\\x12\\x04\\xd4\\x06\\x0e\\x15\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\x02\\\n    \\x03\\0\\x02\\x05\\x03\\x12\\x04\\xd4\\x06\\x18\\x19\\n\\x12\\n\\n\\x04)\\x03\\x03\\x03\\\n    \\x02\\x03\\0\\x02\\x06\\x12\\x04\\xd5\\x06\\x08\\x1a\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\x03\\\n    \\x02\\x03\\0\\x02\\x06\\x05\\x12\\x04\\xd5\\x06\\x08\\r\\n\\x13\\n\\x0b\\x04)\\x03\\x03\\\n    \\x03\\x02\\x03\\0\\x02\\x06\\x01\\x12\\x04\\xd5\\x06\\x0e\\x15\\n\\x13\\n\\x0b\\x04)\\x03\\\n    \\x03\\x03\\x02\\x03\\0\\x02\\x06\\x03\\x12\\x04\\xd5\\x06\\x18\\x19\\n\\x12\\n\\n\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x02\\x07\\x12\\x04\\xd6\\x06\\x08\\x1a\\n\\x13\\n\\x0b\\x04)\\\n    \\x03\\x03\\x03\\x02\\x03\\0\\x02\\x07\\x05\\x12\\x04\\xd6\\x06\\x08\\r\\n\\x13\\n\\x0b\\x04\\\n    )\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x07\\x01\\x12\\x04\\xd6\\x06\\x0e\\x15\\n\\x13\\n\\x0b\\\n    \\x04)\\x03\\x03\\x03\\x02\\x03\\0\\x02\\x07\\x03\\x12\\x04\\xd6\\x06\\x18\\x19\\n\\x0c\\n\\\n    \\x02\\x04*\\x12\\x06\\xdc\\x06\\0\\xf1\\x06\\x01\\n\\x0b\\n\\x03\\x04*\\x01\\x12\\x04\\xdc\\\n    \\x06\\x08\\x13\\n\\x0e\\n\\x04\\x04*\\x04\\0\\x12\\x06\\xdd\\x06\\x02\\xe3\\x06\\x03\\n\\r\\\n    \\n\\x05\\x04*\\x04\\0\\x01\\x12\\x04\\xdd\\x06\\x07\\x0e\\n\\x0e\\n\\x06\\x04*\\x04\\0\\x02\\\n    \\0\\x12\\x04\\xde\\x06\\x04\\x14\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\0\\x01\\x12\\x04\\xde\\\n    \\x06\\x04\\x0f\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\0\\x02\\x12\\x04\\xde\\x06\\x12\\x13\\n\\\n    \\x0e\\n\\x06\\x04*\\x04\\0\\x02\\x01\\x12\\x04\\xdf\\x06\\x04\\x10\\n\\x0f\\n\\x07\\x04*\\\n    \\x04\\0\\x02\\x01\\x01\\x12\\x04\\xdf\\x06\\x04\\x0b\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\\n    \\x01\\x02\\x12\\x04\\xdf\\x06\\x0e\\x0f\\n\\x0e\\n\\x06\\x04*\\x04\\0\\x02\\x02\\x12\\x04\\\n    \\xe0\\x06\\x04\\x13\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\x02\\x01\\x12\\x04\\xe0\\x06\\x04\\\n    \\x0e\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\x02\\x02\\x12\\x04\\xe0\\x06\\x11\\x12\\n\\x0e\\n\\\n    \\x06\\x04*\\x04\\0\\x02\\x03\\x12\\x04\\xe1\\x06\\x04\\x10\\n\\x0f\\n\\x07\\x04*\\x04\\0\\\n    \\x02\\x03\\x01\\x12\\x04\\xe1\\x06\\x04\\x0b\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\x03\\x02\\\n    \\x12\\x04\\xe1\\x06\\x0e\\x0f\\n\\x0e\\n\\x06\\x04*\\x04\\0\\x02\\x04\\x12\\x04\\xe2\\x06\\\n    \\x04\\x0f\\n\\x0f\\n\\x07\\x04*\\x04\\0\\x02\\x04\\x01\\x12\\x04\\xe2\\x06\\x04\\n\\n\\x0f\\\n    \\n\\x07\\x04*\\x04\\0\\x02\\x04\\x02\\x12\\x04\\xe2\\x06\\r\\x0e\\n\\x0e\\n\\x04\\x04*\\x04\\\n    \\x01\\x12\\x06\\xe4\\x06\\x02\\xe7\\x06\\x03\\n\\r\\n\\x05\\x04*\\x04\\x01\\x01\\x12\\x04\\\n    \\xe4\\x06\\x07\\x0f\\n\\x0e\\n\\x06\\x04*\\x04\\x01\\x02\\0\\x12\\x04\\xe5\\x06\\x04\\x0e\\\n    \\n\\x0f\\n\\x07\\x04*\\x04\\x01\\x02\\0\\x01\\x12\\x04\\xe5\\x06\\x04\\t\\n\\x0f\\n\\x07\\\n    \\x04*\\x04\\x01\\x02\\0\\x02\\x12\\x04\\xe5\\x06\\x0c\\r\\n\\x0e\\n\\x06\\x04*\\x04\\x01\\\n    \\x02\\x01\\x12\\x04\\xe6\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04*\\x04\\x01\\x02\\x01\\x01\\\n    \\x12\\x04\\xe6\\x06\\x04\\x07\\n\\x0f\\n\\x07\\x04*\\x04\\x01\\x02\\x01\\x02\\x12\\x04\\\n    \\xe6\\x06\\n\\x0b\\n\\x0e\\n\\x04\\x04*\\x03\\0\\x12\\x06\\xe8\\x06\\x02\\xee\\x06\\x03\\n\\\n    \\r\\n\\x05\\x04*\\x03\\0\\x01\\x12\\x04\\xe8\\x06\\n\\r\\n\\x0e\\n\\x06\\x04*\\x03\\0\\x02\\0\\\n    \\x12\\x04\\xe9\\x06\\x04\\x19\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\0\\x06\\x12\\x04\\xe9\\\n    \\x06\\x04\\x0b\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\0\\x01\\x12\\x04\\xe9\\x06\\x0c\\x14\\n\\\n    \\x0f\\n\\x07\\x04*\\x03\\0\\x02\\0\\x03\\x12\\x04\\xe9\\x06\\x17\\x18\\n\\x0e\\n\\x06\\x04*\\\n    \\x03\\0\\x02\\x01\\x12\\x04\\xea\\x06\\x04\\x1b\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x01\\\n    \\x06\\x12\\x04\\xea\\x06\\x04\\x0c\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x01\\x01\\x12\\x04\\\n    \\xea\\x06\\r\\x16\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x01\\x03\\x12\\x04\\xea\\x06\\x19\\\n    \\x1a\\n\\x0e\\n\\x06\\x04*\\x03\\0\\x02\\x02\\x12\\x04\\xeb\\x06\\x04\\x15\\n\\x0f\\n\\x07\\\n    \\x04*\\x03\\0\\x02\\x02\\x05\\x12\\x04\\xeb\\x06\\x04\\t\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\\n    \\x02\\x01\\x12\\x04\\xeb\\x06\\n\\x10\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x02\\x03\\x12\\\n    \\x04\\xeb\\x06\\x13\\x14\\n\\x0e\\n\\x06\\x04*\\x03\\0\\x02\\x03\\x12\\x04\\xec\\x06\\x04\\\n    \\x14\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x03\\x05\\x12\\x04\\xec\\x06\\x04\\t\\n\\x0f\\n\\\n    \\x07\\x04*\\x03\\0\\x02\\x03\\x01\\x12\\x04\\xec\\x06\\n\\x0f\\n\\x0f\\n\\x07\\x04*\\x03\\0\\\n    \\x02\\x03\\x03\\x12\\x04\\xec\\x06\\x12\\x13\\n\\x0e\\n\\x06\\x04*\\x03\\0\\x02\\x04\\x12\\\n    \\x04\\xed\\x06\\x04\\x13\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x04\\x05\\x12\\x04\\xed\\x06\\\n    \\x04\\t\\n\\x0f\\n\\x07\\x04*\\x03\\0\\x02\\x04\\x01\\x12\\x04\\xed\\x06\\n\\x0e\\n\\x0f\\n\\\n    \\x07\\x04*\\x03\\0\\x02\\x04\\x03\\x12\\x04\\xed\\x06\\x11\\x12\\n\\x0c\\n\\x04\\x04*\\x02\\\n    \\0\\x12\\x04\\xef\\x06\\x02\\x13\\n\\r\\n\\x05\\x04*\\x02\\0\\x06\\x12\\x04\\xef\\x06\\x02\\\n    \\x05\\n\\r\\n\\x05\\x04*\\x02\\0\\x01\\x12\\x04\\xef\\x06\\x06\\x0e\\n\\r\\n\\x05\\x04*\\x02\\\n    \\0\\x03\\x12\\x04\\xef\\x06\\x11\\x12\\n\\x0c\\n\\x04\\x04*\\x02\\x01\\x12\\x04\\xf0\\x06\\\n    \\x02\\x16\\n\\r\\n\\x05\\x04*\\x02\\x01\\x05\\x12\\x04\\xf0\\x06\\x02\\x07\\n\\r\\n\\x05\\\n    \\x04*\\x02\\x01\\x01\\x12\\x04\\xf0\\x06\\x08\\x11\\n\\r\\n\\x05\\x04*\\x02\\x01\\x03\\x12\\\n    \\x04\\xf0\\x06\\x14\\x15\\n\\x0c\\n\\x02\\x04+\\x12\\x06\\xf3\\x06\\0\\xf6\\x06\\x01\\n\\\n    \\x0b\\n\\x03\\x04+\\x01\\x12\\x04\\xf3\\x06\\x08\\x18\\n\\x0c\\n\\x04\\x04+\\x02\\0\\x12\\\n    \\x04\\xf4\\x06\\x02\\x11\\n\\r\\n\\x05\\x04+\\x02\\0\\x05\\x12\\x04\\xf4\\x06\\x02\\x07\\n\\\n    \\r\\n\\x05\\x04+\\x02\\0\\x01\\x12\\x04\\xf4\\x06\\x08\\x0c\\n\\r\\n\\x05\\x04+\\x02\\0\\x03\\\n    \\x12\\x04\\xf4\\x06\\x0f\\x10\\n\\x0c\\n\\x04\\x04+\\x02\\x01\\x12\\x04\\xf5\\x06\\x02\\\n    \\x1f\\n\\r\\n\\x05\\x04+\\x02\\x01\\x04\\x12\\x04\\xf5\\x06\\x02\\n\\n\\r\\n\\x05\\x04+\\x02\\\n    \\x01\\x05\\x12\\x04\\xf5\\x06\\x0b\\x10\\n\\r\\n\\x05\\x04+\\x02\\x01\\x01\\x12\\x04\\xf5\\\n    \\x06\\x11\\x1a\\n\\r\\n\\x05\\x04+\\x02\\x01\\x03\\x12\\x04\\xf5\\x06\\x1d\\x1e\\n\\x0c\\n\\\n    \\x02\\x04,\\x12\\x06\\xf8\\x06\\0\\xfa\\x06\\x01\\n\\x0b\\n\\x03\\x04,\\x01\\x12\\x04\\xf8\\\n    \\x06\\x08\\x0b\\n\\x0c\\n\\x04\\x04,\\x02\\0\\x12\\x04\\xf9\\x06\\x02\\x1f\\n\\r\\n\\x05\\\n    \\x04,\\x02\\0\\x04\\x12\\x04\\xf9\\x06\\x02\\n\\n\\r\\n\\x05\\x04,\\x02\\0\\x05\\x12\\x04\\\n    \\xf9\\x06\\x0b\\x10\\n\\r\\n\\x05\\x04,\\x02\\0\\x01\\x12\\x04\\xf9\\x06\\x11\\x1a\\n\\r\\n\\\n    \\x05\\x04,\\x02\\0\\x03\\x12\\x04\\xf9\\x06\\x1d\\x1eb\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(3);\n            deps.push(::protobuf::well_known_types::any::file_descriptor().clone());\n            deps.push(super::Discover::file_descriptor().clone());\n            deps.push(super::common::file_descriptor().clone());\n            let mut messages = ::std::vec::Vec::with_capacity(77);\n            messages.push(AccountId::generated_message_descriptor_data());\n            messages.push(Vote::generated_message_descriptor_data());\n            messages.push(Proposal::generated_message_descriptor_data());\n            messages.push(Exchange::generated_message_descriptor_data());\n            messages.push(MarketOrder::generated_message_descriptor_data());\n            messages.push(MarketOrderList::generated_message_descriptor_data());\n            messages.push(MarketOrderPairList::generated_message_descriptor_data());\n            messages.push(MarketOrderPair::generated_message_descriptor_data());\n            messages.push(MarketAccountOrder::generated_message_descriptor_data());\n            messages.push(MarketPrice::generated_message_descriptor_data());\n            messages.push(MarketPriceList::generated_message_descriptor_data());\n            messages.push(MarketOrderIdList::generated_message_descriptor_data());\n            messages.push(ChainParameters::generated_message_descriptor_data());\n            messages.push(Account::generated_message_descriptor_data());\n            messages.push(Key::generated_message_descriptor_data());\n            messages.push(DelegatedResource::generated_message_descriptor_data());\n            messages.push(Authority::generated_message_descriptor_data());\n            messages.push(Permission::generated_message_descriptor_data());\n            messages.push(Witness::generated_message_descriptor_data());\n            messages.push(Votes::generated_message_descriptor_data());\n            messages.push(TXOutput::generated_message_descriptor_data());\n            messages.push(TXInput::generated_message_descriptor_data());\n            messages.push(TXOutputs::generated_message_descriptor_data());\n            messages.push(ResourceReceipt::generated_message_descriptor_data());\n            messages.push(MarketOrderDetail::generated_message_descriptor_data());\n            messages.push(Transaction::generated_message_descriptor_data());\n            messages.push(TransactionInfo::generated_message_descriptor_data());\n            messages.push(TransactionRet::generated_message_descriptor_data());\n            messages.push(Transactions::generated_message_descriptor_data());\n            messages.push(BlockHeader::generated_message_descriptor_data());\n            messages.push(Block::generated_message_descriptor_data());\n            messages.push(ChainInventory::generated_message_descriptor_data());\n            messages.push(BlockInventory::generated_message_descriptor_data());\n            messages.push(Inventory::generated_message_descriptor_data());\n            messages.push(Items::generated_message_descriptor_data());\n            messages.push(DynamicProperties::generated_message_descriptor_data());\n            messages.push(DisconnectMessage::generated_message_descriptor_data());\n            messages.push(HelloMessage::generated_message_descriptor_data());\n            messages.push(InternalTransaction::generated_message_descriptor_data());\n            messages.push(DelegatedResourceAccountIndex::generated_message_descriptor_data());\n            messages.push(NodeInfo::generated_message_descriptor_data());\n            messages.push(MetricsInfo::generated_message_descriptor_data());\n            messages.push(PBFTMessage::generated_message_descriptor_data());\n            messages.push(PBFTCommitResult::generated_message_descriptor_data());\n            messages.push(SRL::generated_message_descriptor_data());\n            messages.push(chain_parameters::ChainParameter::generated_message_descriptor_data());\n            messages.push(account::Frozen::generated_message_descriptor_data());\n            messages.push(account::AccountResource::generated_message_descriptor_data());\n            messages.push(account::FreezeV2::generated_message_descriptor_data());\n            messages.push(account::UnFreezeV2::generated_message_descriptor_data());\n            messages.push(txinput::Raw::generated_message_descriptor_data());\n            messages.push(transaction::Contract::generated_message_descriptor_data());\n            messages.push(transaction::Result::generated_message_descriptor_data());\n            messages.push(transaction::Raw::generated_message_descriptor_data());\n            messages.push(transaction_info::Log::generated_message_descriptor_data());\n            messages.push(block_header::Raw::generated_message_descriptor_data());\n            messages.push(chain_inventory::BlockId::generated_message_descriptor_data());\n            messages.push(block_inventory::BlockId::generated_message_descriptor_data());\n            messages.push(hello_message::BlockId::generated_message_descriptor_data());\n            messages.push(internal_transaction::CallValueInfo::generated_message_descriptor_data());\n            messages.push(node_info::PeerInfo::generated_message_descriptor_data());\n            messages.push(node_info::ConfigNodeInfo::generated_message_descriptor_data());\n            messages.push(node_info::MachineInfo::generated_message_descriptor_data());\n            messages.push(node_info::machine_info::MemoryDescInfo::generated_message_descriptor_data());\n            messages.push(node_info::machine_info::DeadLockThreadInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::NodeInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::BlockChainInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::RateInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::NetInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::block_chain_info::Witness::generated_message_descriptor_data());\n            messages.push(metrics_info::block_chain_info::DupWitness::generated_message_descriptor_data());\n            messages.push(metrics_info::net_info::ApiInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::net_info::DisconnectionDetailInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::net_info::LatencyInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::net_info::api_info::ApiDetailInfo::generated_message_descriptor_data());\n            messages.push(metrics_info::net_info::latency_info::LatencyDetailInfo::generated_message_descriptor_data());\n            messages.push(pbftmessage::Raw::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(14);\n            enums.push(AccountType::generated_enum_descriptor_data());\n            enums.push(ReasonCode::generated_enum_descriptor_data());\n            enums.push(proposal::State::generated_enum_descriptor_data());\n            enums.push(market_order::State::generated_enum_descriptor_data());\n            enums.push(permission::PermissionType::generated_enum_descriptor_data());\n            enums.push(transaction::contract::ContractType::generated_enum_descriptor_data());\n            enums.push(transaction::result::Code::generated_enum_descriptor_data());\n            enums.push(transaction::result::ContractResult::generated_enum_descriptor_data());\n            enums.push(transaction_info::Code::generated_enum_descriptor_data());\n            enums.push(block_inventory::Type::generated_enum_descriptor_data());\n            enums.push(inventory::InventoryType::generated_enum_descriptor_data());\n            enums.push(items::ItemType::generated_enum_descriptor_data());\n            enums.push(pbftmessage::MsgType::generated_enum_descriptor_data());\n            enums.push(pbftmessage::DataType::generated_enum_descriptor_data());\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/account_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/account_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.AccountCreateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountCreateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountCreateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AccountCreateContract.account_address)\n    pub account_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AccountCreateContract.type)\n    pub type_: ::protobuf::EnumOrUnknown<super::Tron::AccountType>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountCreateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountCreateContract {\n    fn default() -> &'a AccountCreateContract {\n        <AccountCreateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountCreateContract {\n    pub fn new() -> AccountCreateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &AccountCreateContract| { &m.owner_address },\n            |m: &mut AccountCreateContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"account_address\",\n            |m: &AccountCreateContract| { &m.account_address },\n            |m: &mut AccountCreateContract| { &mut m.account_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &AccountCreateContract| { &m.type_ },\n            |m: &mut AccountCreateContract| { &mut m.type_ },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountCreateContract>(\n            \"AccountCreateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountCreateContract {\n    const NAME: &'static str = \"AccountCreateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.account_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.type_ = is.read_enum_or_unknown()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.account_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.account_address);\n        }\n        if self.type_ != ::protobuf::EnumOrUnknown::new(super::Tron::AccountType::Normal) {\n            my_size += ::protobuf::rt::int32_size(3, self.type_.value());\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.account_address.is_empty() {\n            os.write_bytes(2, &self.account_address)?;\n        }\n        if self.type_ != ::protobuf::EnumOrUnknown::new(super::Tron::AccountType::Normal) {\n            os.write_enum(3, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountCreateContract {\n        AccountCreateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.account_address.clear();\n        self.type_ = ::protobuf::EnumOrUnknown::new(super::Tron::AccountType::Normal);\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountCreateContract {\n        static instance: AccountCreateContract = AccountCreateContract {\n            owner_address: ::std::vec::Vec::new(),\n            account_address: ::std::vec::Vec::new(),\n            type_: ::protobuf::EnumOrUnknown::from_i32(0),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountCreateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountCreateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountCreateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountCreateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n///  Update account name. Account name is not unique now.\n// @@protoc_insertion_point(message:protocol.AccountUpdateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountUpdateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountUpdateContract.account_name)\n    pub account_name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AccountUpdateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountUpdateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountUpdateContract {\n    fn default() -> &'a AccountUpdateContract {\n        <AccountUpdateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountUpdateContract {\n    pub fn new() -> AccountUpdateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"account_name\",\n            |m: &AccountUpdateContract| { &m.account_name },\n            |m: &mut AccountUpdateContract| { &mut m.account_name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &AccountUpdateContract| { &m.owner_address },\n            |m: &mut AccountUpdateContract| { &mut m.owner_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountUpdateContract>(\n            \"AccountUpdateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountUpdateContract {\n    const NAME: &'static str = \"AccountUpdateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.account_name = is.read_bytes()?;\n                },\n                18 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.account_name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.account_name);\n        }\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.owner_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.account_name.is_empty() {\n            os.write_bytes(1, &self.account_name)?;\n        }\n        if !self.owner_address.is_empty() {\n            os.write_bytes(2, &self.owner_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountUpdateContract {\n        AccountUpdateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.account_name.clear();\n        self.owner_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountUpdateContract {\n        static instance: AccountUpdateContract = AccountUpdateContract {\n            account_name: ::std::vec::Vec::new(),\n            owner_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountUpdateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountUpdateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountUpdateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountUpdateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n///  Set account id if the account has no id. Account id is unique and case insensitive.\n// @@protoc_insertion_point(message:protocol.SetAccountIdContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct SetAccountIdContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.SetAccountIdContract.account_id)\n    pub account_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SetAccountIdContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.SetAccountIdContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a SetAccountIdContract {\n    fn default() -> &'a SetAccountIdContract {\n        <SetAccountIdContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl SetAccountIdContract {\n    pub fn new() -> SetAccountIdContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"account_id\",\n            |m: &SetAccountIdContract| { &m.account_id },\n            |m: &mut SetAccountIdContract| { &mut m.account_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &SetAccountIdContract| { &m.owner_address },\n            |m: &mut SetAccountIdContract| { &mut m.owner_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<SetAccountIdContract>(\n            \"SetAccountIdContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for SetAccountIdContract {\n    const NAME: &'static str = \"SetAccountIdContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.account_id = is.read_bytes()?;\n                },\n                18 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.account_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.account_id);\n        }\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.owner_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.account_id.is_empty() {\n            os.write_bytes(1, &self.account_id)?;\n        }\n        if !self.owner_address.is_empty() {\n            os.write_bytes(2, &self.owner_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> SetAccountIdContract {\n        SetAccountIdContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.account_id.clear();\n        self.owner_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static SetAccountIdContract {\n        static instance: SetAccountIdContract = SetAccountIdContract {\n            account_id: ::std::vec::Vec::new(),\n            owner_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for SetAccountIdContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"SetAccountIdContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for SetAccountIdContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for SetAccountIdContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.AccountPermissionUpdateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountPermissionUpdateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountPermissionUpdateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AccountPermissionUpdateContract.owner)\n    pub owner: ::protobuf::MessageField<super::Tron::Permission>,\n    // @@protoc_insertion_point(field:protocol.AccountPermissionUpdateContract.witness)\n    pub witness: ::protobuf::MessageField<super::Tron::Permission>,\n    // @@protoc_insertion_point(field:protocol.AccountPermissionUpdateContract.actives)\n    pub actives: ::std::vec::Vec<super::Tron::Permission>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountPermissionUpdateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountPermissionUpdateContract {\n    fn default() -> &'a AccountPermissionUpdateContract {\n        <AccountPermissionUpdateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountPermissionUpdateContract {\n    pub fn new() -> AccountPermissionUpdateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &AccountPermissionUpdateContract| { &m.owner_address },\n            |m: &mut AccountPermissionUpdateContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::Tron::Permission>(\n            \"owner\",\n            |m: &AccountPermissionUpdateContract| { &m.owner },\n            |m: &mut AccountPermissionUpdateContract| { &mut m.owner },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::Tron::Permission>(\n            \"witness\",\n            |m: &AccountPermissionUpdateContract| { &m.witness },\n            |m: &mut AccountPermissionUpdateContract| { &mut m.witness },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"actives\",\n            |m: &AccountPermissionUpdateContract| { &m.actives },\n            |m: &mut AccountPermissionUpdateContract| { &mut m.actives },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountPermissionUpdateContract>(\n            \"AccountPermissionUpdateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountPermissionUpdateContract {\n    const NAME: &'static str = \"AccountPermissionUpdateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.owner)?;\n                },\n                26 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.witness)?;\n                },\n                34 => {\n                    self.actives.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if let Some(v) = self.owner.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.witness.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.actives {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if let Some(v) = self.owner.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        if let Some(v) = self.witness.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        }\n        for v in &self.actives {\n            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountPermissionUpdateContract {\n        AccountPermissionUpdateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.owner.clear();\n        self.witness.clear();\n        self.actives.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountPermissionUpdateContract {\n        static instance: AccountPermissionUpdateContract = AccountPermissionUpdateContract {\n            owner_address: ::std::vec::Vec::new(),\n            owner: ::protobuf::MessageField::none(),\n            witness: ::protobuf::MessageField::none(),\n            actives: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountPermissionUpdateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountPermissionUpdateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountPermissionUpdateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountPermissionUpdateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n$core/contract/account_contract.proto\\x12\\x08protocol\\x1a\\x0fcore/Tron\\\n    .proto\\\"\\x90\\x01\\n\\x15AccountCreateContract\\x12#\\n\\rowner_address\\x18\\\n    \\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12'\\n\\x0faccount_address\\x18\\x02\\x20\\\n    \\x01(\\x0cR\\x0eaccountAddress\\x12)\\n\\x04type\\x18\\x03\\x20\\x01(\\x0e2\\x15.pr\\\n    otocol.AccountTypeR\\x04type\\\"_\\n\\x15AccountUpdateContract\\x12!\\n\\x0cacco\\\n    unt_name\\x18\\x01\\x20\\x01(\\x0cR\\x0baccountName\\x12#\\n\\rowner_address\\x18\\\n    \\x02\\x20\\x01(\\x0cR\\x0cownerAddress\\\"Z\\n\\x14SetAccountIdContract\\x12\\x1d\\\n    \\n\\naccount_id\\x18\\x01\\x20\\x01(\\x0cR\\taccountId\\x12#\\n\\rowner_address\\\n    \\x18\\x02\\x20\\x01(\\x0cR\\x0cownerAddress\\\"\\xd2\\x01\\n\\x1fAccountPermissionU\\\n    pdateContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddres\\\n    s\\x12*\\n\\x05owner\\x18\\x02\\x20\\x01(\\x0b2\\x14.protocol.PermissionR\\x05owne\\\n    r\\x12.\\n\\x07witness\\x18\\x03\\x20\\x01(\\x0b2\\x14.protocol.PermissionR\\x07wi\\\n    tness\\x12.\\n\\x07actives\\x18\\x04\\x20\\x03(\\x0b2\\x14.protocol.PermissionR\\\n    \\x07activesBE\\n\\x18org.tron.protos.contractZ)github.com/tronprotocol/grp\\\n    c-gateway/coreJ\\xf2\\r\\n\\x06\\x12\\x04\\x0f\\00\\x01\\n\\xf4\\x04\\n\\x01\\x0c\\x12\\\n    \\x03\\x0f\\0\\x122\\xe9\\x04\\n\\x20java-tron\\x20is\\x20free\\x20software:\\x20you\\\n    \\x20can\\x20redistribute\\x20it\\x20and/or\\x20modify\\n\\x20it\\x20under\\x20th\\\n    e\\x20terms\\x20of\\x20the\\x20GNU\\x20General\\x20Public\\x20License\\x20as\\x20\\\n    published\\x20by\\n\\x20the\\x20Free\\x20Software\\x20Foundation,\\x20either\\\n    \\x20version\\x203\\x20of\\x20the\\x20License,\\x20or\\n\\x20(at\\x20your\\x20opti\\\n    on)\\x20any\\x20later\\x20version.\\n\\n\\x20java-tron\\x20is\\x20distributed\\\n    \\x20in\\x20the\\x20hope\\x20that\\x20it\\x20will\\x20be\\x20useful,\\n\\x20but\\\n    \\x20WITHOUT\\x20ANY\\x20WARRANTY;\\x20without\\x20even\\x20the\\x20implied\\x20\\\n    warranty\\x20of\\n\\x20MERCHANTABILITY\\x20or\\x20FITNESS\\x20FOR\\x20A\\x20PART\\\n    ICULAR\\x20PURPOSE.\\x20\\x20See\\x20the\\n\\x20GNU\\x20General\\x20Public\\x20Li\\\n    cense\\x20for\\x20more\\x20details.\\n\\n\\x20You\\x20should\\x20have\\x20receive\\\n    d\\x20a\\x20copy\\x20of\\x20the\\x20GNU\\x20General\\x20Public\\x20License\\n\\x20\\\n    along\\x20with\\x20this\\x20program.\\x20\\x20If\\x20not,\\x20see\\x20<http://ww\\\n    w.gnu.org/licenses/>.\\n\\n\\x08\\n\\x01\\x02\\x12\\x03\\x11\\0\\x11\\n\\x08\\n\\x01\\\n    \\x08\\x12\\x03\\x13\\01\\nH\\n\\x02\\x08\\x01\\x12\\x03\\x13\\01\\\"=Specify\\x20the\\x20\\\n    name\\x20of\\x20the\\x20package\\x20that\\x20generated\\x20the\\x20Java\\x20file\\\n    \\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x15\\0@\\ni\\n\\x02\\x08\\x0b\\x12\\x03\\x15\\0@\\x1a^op\\\n    tion\\x20java_outer_classname\\x20=\\x20\\\"Contract\\\";\\x20//Specify\\x20the\\\n    \\x20class\\x20name\\x20of\\x20the\\x20generated\\x20Java\\x20file\\n\\n\\t\\n\\x02\\\n    \\x03\\0\\x12\\x03\\x17\\0\\x19\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x19\\0\\x1d\\x01\\n\\n\\n\\x03\\\n    \\x04\\0\\x01\\x12\\x03\\x19\\x08\\x1d\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\x1a\\x02\\\n    \\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\x1a\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x03\\x1a\\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\x1a\\\n    \\x18\\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\x1b\\x02\\x1c\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x01\\x05\\x12\\x03\\x1b\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\\n    \\x1b\\x08\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\x1b\\x1a\\x1b\\n\\x0b\\n\\\n    \\x04\\x04\\0\\x02\\x02\\x12\\x03\\x1c\\x02\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x06\\x12\\\n    \\x03\\x1c\\x02\\r\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\x1c\\x0e\\x12\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x02\\x03\\x12\\x03\\x1c\\x15\\x16\\nB\\n\\x02\\x04\\x01\\x12\\x04\\x20\\\n    \\0#\\x01\\x1a6\\x20Update\\x20account\\x20name.\\x20Account\\x20name\\x20is\\x20n\\\n    ot\\x20unique\\x20now.\\n\\n\\n\\n\\x03\\x04\\x01\\x01\\x12\\x03\\x20\\x08\\x1d\\n\\x0b\\n\\\n    \\x04\\x04\\x01\\x02\\0\\x12\\x03!\\x02\\x19\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x05\\x12\\\n    \\x03!\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\x03!\\x08\\x14\\n\\x0c\\n\\x05\\\n    \\x04\\x01\\x02\\0\\x03\\x12\\x03!\\x17\\x18\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x01\\x12\\x03\\\n    \\\"\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\x03\\\"\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\x01\\x02\\x01\\x01\\x12\\x03\\\"\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\\n    \\x12\\x03\\\"\\x18\\x19\\na\\n\\x02\\x04\\x02\\x12\\x04&\\0)\\x01\\x1aU\\x20Set\\x20accou\\\n    nt\\x20id\\x20if\\x20the\\x20account\\x20has\\x20no\\x20id.\\x20Account\\x20id\\\n    \\x20is\\x20unique\\x20and\\x20case\\x20insensitive.\\n\\n\\n\\n\\x03\\x04\\x02\\x01\\\n    \\x12\\x03&\\x08\\x1c\\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03'\\x02\\x17\\n\\x0c\\n\\x05\\\n    \\x04\\x02\\x02\\0\\x05\\x12\\x03'\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\\n    \\x03'\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\x12\\x03'\\x15\\x16\\n\\x0b\\n\\x04\\\n    \\x04\\x02\\x02\\x01\\x12\\x03(\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\x12\\\n    \\x03(\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03(\\x08\\x15\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\x01\\x03\\x12\\x03(\\x18\\x19\\n\\n\\n\\x02\\x04\\x03\\x12\\x04+\\00\\\n    \\x01\\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x03+\\x08'\\n\\x0b\\n\\x04\\x04\\x03\\x02\\0\\x12\\\n    \\x03,\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x05\\x12\\x03,\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\0\\x01\\x12\\x03,\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\\n    \\x03,\\x18\\x19\\n!\\n\\x04\\x04\\x03\\x02\\x01\\x12\\x03-\\x02\\x17\\\"\\x14Empty\\x20is\\\n    \\x20invalidate\\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x06\\x12\\x03-\\x02\\x0c\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x03-\\r\\x12\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\\n    \\x03\\x12\\x03-\\x15\\x16\\n\\x1a\\n\\x04\\x04\\x03\\x02\\x02\\x12\\x03.\\x02\\x19\\\"\\rCa\\\n    n\\x20be\\x20empty\\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x06\\x12\\x03.\\x02\\x0c\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x01\\x12\\x03.\\r\\x14\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x02\\x03\\x12\\x03.\\x17\\x18\\n!\\n\\x04\\x04\\x03\\x02\\x03\\x12\\x03/\\x02\\\"\\\"\\x14E\\\n    mpty\\x20is\\x20invalidate\\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x04\\x12\\x03/\\x02\\\n    \\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x06\\x12\\x03/\\x0b\\x15\\n\\x0c\\n\\x05\\x04\\x03\\\n    \\x02\\x03\\x01\\x12\\x03/\\x16\\x1d\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x03\\x12\\x03/\\\n    \\x20!b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(1);\n            deps.push(super::Tron::file_descriptor().clone());\n            let mut messages = ::std::vec::Vec::with_capacity(4);\n            messages.push(AccountCreateContract::generated_message_descriptor_data());\n            messages.push(AccountUpdateContract::generated_message_descriptor_data());\n            messages.push(SetAccountIdContract::generated_message_descriptor_data());\n            messages.push(AccountPermissionUpdateContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/asset_issue_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/asset_issue_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.AssetIssueContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AssetIssueContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.id)\n    pub id: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.name)\n    pub name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.abbr)\n    pub abbr: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.total_supply)\n    pub total_supply: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.frozen_supply)\n    pub frozen_supply: ::std::vec::Vec<asset_issue_contract::FrozenSupply>,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.trx_num)\n    pub trx_num: i32,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.precision)\n    pub precision: i32,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.num)\n    pub num: i32,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.start_time)\n    pub start_time: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.end_time)\n    pub end_time: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.order)\n    pub order: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.vote_score)\n    pub vote_score: i32,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.description)\n    pub description: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.url)\n    pub url: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.free_asset_net_limit)\n    pub free_asset_net_limit: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.public_free_asset_net_limit)\n    pub public_free_asset_net_limit: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.public_free_asset_net_usage)\n    pub public_free_asset_net_usage: i64,\n    // @@protoc_insertion_point(field:protocol.AssetIssueContract.public_latest_free_net_time)\n    pub public_latest_free_net_time: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AssetIssueContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AssetIssueContract {\n    fn default() -> &'a AssetIssueContract {\n        <AssetIssueContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AssetIssueContract {\n    pub fn new() -> AssetIssueContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(19);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"id\",\n            |m: &AssetIssueContract| { &m.id },\n            |m: &mut AssetIssueContract| { &mut m.id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &AssetIssueContract| { &m.owner_address },\n            |m: &mut AssetIssueContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"name\",\n            |m: &AssetIssueContract| { &m.name },\n            |m: &mut AssetIssueContract| { &mut m.name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"abbr\",\n            |m: &AssetIssueContract| { &m.abbr },\n            |m: &mut AssetIssueContract| { &mut m.abbr },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"total_supply\",\n            |m: &AssetIssueContract| { &m.total_supply },\n            |m: &mut AssetIssueContract| { &mut m.total_supply },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"frozen_supply\",\n            |m: &AssetIssueContract| { &m.frozen_supply },\n            |m: &mut AssetIssueContract| { &mut m.frozen_supply },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"trx_num\",\n            |m: &AssetIssueContract| { &m.trx_num },\n            |m: &mut AssetIssueContract| { &mut m.trx_num },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"precision\",\n            |m: &AssetIssueContract| { &m.precision },\n            |m: &mut AssetIssueContract| { &mut m.precision },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"num\",\n            |m: &AssetIssueContract| { &m.num },\n            |m: &mut AssetIssueContract| { &mut m.num },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"start_time\",\n            |m: &AssetIssueContract| { &m.start_time },\n            |m: &mut AssetIssueContract| { &mut m.start_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"end_time\",\n            |m: &AssetIssueContract| { &m.end_time },\n            |m: &mut AssetIssueContract| { &mut m.end_time },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"order\",\n            |m: &AssetIssueContract| { &m.order },\n            |m: &mut AssetIssueContract| { &mut m.order },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"vote_score\",\n            |m: &AssetIssueContract| { &m.vote_score },\n            |m: &mut AssetIssueContract| { &mut m.vote_score },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"description\",\n            |m: &AssetIssueContract| { &m.description },\n            |m: &mut AssetIssueContract| { &mut m.description },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"url\",\n            |m: &AssetIssueContract| { &m.url },\n            |m: &mut AssetIssueContract| { &mut m.url },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"free_asset_net_limit\",\n            |m: &AssetIssueContract| { &m.free_asset_net_limit },\n            |m: &mut AssetIssueContract| { &mut m.free_asset_net_limit },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"public_free_asset_net_limit\",\n            |m: &AssetIssueContract| { &m.public_free_asset_net_limit },\n            |m: &mut AssetIssueContract| { &mut m.public_free_asset_net_limit },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"public_free_asset_net_usage\",\n            |m: &AssetIssueContract| { &m.public_free_asset_net_usage },\n            |m: &mut AssetIssueContract| { &mut m.public_free_asset_net_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"public_latest_free_net_time\",\n            |m: &AssetIssueContract| { &m.public_latest_free_net_time },\n            |m: &mut AssetIssueContract| { &mut m.public_latest_free_net_time },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AssetIssueContract>(\n            \"AssetIssueContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AssetIssueContract {\n    const NAME: &'static str = \"AssetIssueContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                330 => {\n                    self.id = is.read_string()?;\n                },\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.name = is.read_bytes()?;\n                },\n                26 => {\n                    self.abbr = is.read_bytes()?;\n                },\n                32 => {\n                    self.total_supply = is.read_int64()?;\n                },\n                42 => {\n                    self.frozen_supply.push(is.read_message()?);\n                },\n                48 => {\n                    self.trx_num = is.read_int32()?;\n                },\n                56 => {\n                    self.precision = is.read_int32()?;\n                },\n                64 => {\n                    self.num = is.read_int32()?;\n                },\n                72 => {\n                    self.start_time = is.read_int64()?;\n                },\n                80 => {\n                    self.end_time = is.read_int64()?;\n                },\n                88 => {\n                    self.order = is.read_int64()?;\n                },\n                128 => {\n                    self.vote_score = is.read_int32()?;\n                },\n                162 => {\n                    self.description = is.read_bytes()?;\n                },\n                170 => {\n                    self.url = is.read_bytes()?;\n                },\n                176 => {\n                    self.free_asset_net_limit = is.read_int64()?;\n                },\n                184 => {\n                    self.public_free_asset_net_limit = is.read_int64()?;\n                },\n                192 => {\n                    self.public_free_asset_net_usage = is.read_int64()?;\n                },\n                200 => {\n                    self.public_latest_free_net_time = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.id.is_empty() {\n            my_size += ::protobuf::rt::string_size(41, &self.id);\n        }\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.name);\n        }\n        if !self.abbr.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.abbr);\n        }\n        if self.total_supply != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.total_supply);\n        }\n        for value in &self.frozen_supply {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.trx_num != 0 {\n            my_size += ::protobuf::rt::int32_size(6, self.trx_num);\n        }\n        if self.precision != 0 {\n            my_size += ::protobuf::rt::int32_size(7, self.precision);\n        }\n        if self.num != 0 {\n            my_size += ::protobuf::rt::int32_size(8, self.num);\n        }\n        if self.start_time != 0 {\n            my_size += ::protobuf::rt::int64_size(9, self.start_time);\n        }\n        if self.end_time != 0 {\n            my_size += ::protobuf::rt::int64_size(10, self.end_time);\n        }\n        if self.order != 0 {\n            my_size += ::protobuf::rt::int64_size(11, self.order);\n        }\n        if self.vote_score != 0 {\n            my_size += ::protobuf::rt::int32_size(16, self.vote_score);\n        }\n        if !self.description.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(20, &self.description);\n        }\n        if !self.url.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(21, &self.url);\n        }\n        if self.free_asset_net_limit != 0 {\n            my_size += ::protobuf::rt::int64_size(22, self.free_asset_net_limit);\n        }\n        if self.public_free_asset_net_limit != 0 {\n            my_size += ::protobuf::rt::int64_size(23, self.public_free_asset_net_limit);\n        }\n        if self.public_free_asset_net_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(24, self.public_free_asset_net_usage);\n        }\n        if self.public_latest_free_net_time != 0 {\n            my_size += ::protobuf::rt::int64_size(25, self.public_latest_free_net_time);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.id.is_empty() {\n            os.write_string(41, &self.id)?;\n        }\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.name.is_empty() {\n            os.write_bytes(2, &self.name)?;\n        }\n        if !self.abbr.is_empty() {\n            os.write_bytes(3, &self.abbr)?;\n        }\n        if self.total_supply != 0 {\n            os.write_int64(4, self.total_supply)?;\n        }\n        for v in &self.frozen_supply {\n            ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?;\n        };\n        if self.trx_num != 0 {\n            os.write_int32(6, self.trx_num)?;\n        }\n        if self.precision != 0 {\n            os.write_int32(7, self.precision)?;\n        }\n        if self.num != 0 {\n            os.write_int32(8, self.num)?;\n        }\n        if self.start_time != 0 {\n            os.write_int64(9, self.start_time)?;\n        }\n        if self.end_time != 0 {\n            os.write_int64(10, self.end_time)?;\n        }\n        if self.order != 0 {\n            os.write_int64(11, self.order)?;\n        }\n        if self.vote_score != 0 {\n            os.write_int32(16, self.vote_score)?;\n        }\n        if !self.description.is_empty() {\n            os.write_bytes(20, &self.description)?;\n        }\n        if !self.url.is_empty() {\n            os.write_bytes(21, &self.url)?;\n        }\n        if self.free_asset_net_limit != 0 {\n            os.write_int64(22, self.free_asset_net_limit)?;\n        }\n        if self.public_free_asset_net_limit != 0 {\n            os.write_int64(23, self.public_free_asset_net_limit)?;\n        }\n        if self.public_free_asset_net_usage != 0 {\n            os.write_int64(24, self.public_free_asset_net_usage)?;\n        }\n        if self.public_latest_free_net_time != 0 {\n            os.write_int64(25, self.public_latest_free_net_time)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AssetIssueContract {\n        AssetIssueContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.id.clear();\n        self.owner_address.clear();\n        self.name.clear();\n        self.abbr.clear();\n        self.total_supply = 0;\n        self.frozen_supply.clear();\n        self.trx_num = 0;\n        self.precision = 0;\n        self.num = 0;\n        self.start_time = 0;\n        self.end_time = 0;\n        self.order = 0;\n        self.vote_score = 0;\n        self.description.clear();\n        self.url.clear();\n        self.free_asset_net_limit = 0;\n        self.public_free_asset_net_limit = 0;\n        self.public_free_asset_net_usage = 0;\n        self.public_latest_free_net_time = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AssetIssueContract {\n        static instance: AssetIssueContract = AssetIssueContract {\n            id: ::std::string::String::new(),\n            owner_address: ::std::vec::Vec::new(),\n            name: ::std::vec::Vec::new(),\n            abbr: ::std::vec::Vec::new(),\n            total_supply: 0,\n            frozen_supply: ::std::vec::Vec::new(),\n            trx_num: 0,\n            precision: 0,\n            num: 0,\n            start_time: 0,\n            end_time: 0,\n            order: 0,\n            vote_score: 0,\n            description: ::std::vec::Vec::new(),\n            url: ::std::vec::Vec::new(),\n            free_asset_net_limit: 0,\n            public_free_asset_net_limit: 0,\n            public_free_asset_net_usage: 0,\n            public_latest_free_net_time: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AssetIssueContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AssetIssueContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AssetIssueContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AssetIssueContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `AssetIssueContract`\npub mod asset_issue_contract {\n    // @@protoc_insertion_point(message:protocol.AssetIssueContract.FrozenSupply)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct FrozenSupply {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.AssetIssueContract.FrozenSupply.frozen_amount)\n        pub frozen_amount: i64,\n        // @@protoc_insertion_point(field:protocol.AssetIssueContract.FrozenSupply.frozen_days)\n        pub frozen_days: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.AssetIssueContract.FrozenSupply.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a FrozenSupply {\n        fn default() -> &'a FrozenSupply {\n            <FrozenSupply as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl FrozenSupply {\n        pub fn new() -> FrozenSupply {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"frozen_amount\",\n                |m: &FrozenSupply| { &m.frozen_amount },\n                |m: &mut FrozenSupply| { &mut m.frozen_amount },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"frozen_days\",\n                |m: &FrozenSupply| { &m.frozen_days },\n                |m: &mut FrozenSupply| { &mut m.frozen_days },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<FrozenSupply>(\n                \"AssetIssueContract.FrozenSupply\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for FrozenSupply {\n        const NAME: &'static str = \"FrozenSupply\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.frozen_amount = is.read_int64()?;\n                    },\n                    16 => {\n                        self.frozen_days = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.frozen_amount != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.frozen_amount);\n            }\n            if self.frozen_days != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.frozen_days);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.frozen_amount != 0 {\n                os.write_int64(1, self.frozen_amount)?;\n            }\n            if self.frozen_days != 0 {\n                os.write_int64(2, self.frozen_days)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> FrozenSupply {\n            FrozenSupply::new()\n        }\n\n        fn clear(&mut self) {\n            self.frozen_amount = 0;\n            self.frozen_days = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static FrozenSupply {\n            static instance: FrozenSupply = FrozenSupply {\n                frozen_amount: 0,\n                frozen_days: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for FrozenSupply {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"AssetIssueContract.FrozenSupply\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for FrozenSupply {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for FrozenSupply {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.TransferAssetContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TransferAssetContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TransferAssetContract.asset_name)\n    pub asset_name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransferAssetContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransferAssetContract.to_address)\n    pub to_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransferAssetContract.amount)\n    pub amount: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TransferAssetContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TransferAssetContract {\n    fn default() -> &'a TransferAssetContract {\n        <TransferAssetContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TransferAssetContract {\n    pub fn new() -> TransferAssetContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"asset_name\",\n            |m: &TransferAssetContract| { &m.asset_name },\n            |m: &mut TransferAssetContract| { &mut m.asset_name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &TransferAssetContract| { &m.owner_address },\n            |m: &mut TransferAssetContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"to_address\",\n            |m: &TransferAssetContract| { &m.to_address },\n            |m: &mut TransferAssetContract| { &mut m.to_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"amount\",\n            |m: &TransferAssetContract| { &m.amount },\n            |m: &mut TransferAssetContract| { &mut m.amount },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TransferAssetContract>(\n            \"TransferAssetContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TransferAssetContract {\n    const NAME: &'static str = \"TransferAssetContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.asset_name = is.read_bytes()?;\n                },\n                18 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                26 => {\n                    self.to_address = is.read_bytes()?;\n                },\n                32 => {\n                    self.amount = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.asset_name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.asset_name);\n        }\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.owner_address);\n        }\n        if !self.to_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.to_address);\n        }\n        if self.amount != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.amount);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.asset_name.is_empty() {\n            os.write_bytes(1, &self.asset_name)?;\n        }\n        if !self.owner_address.is_empty() {\n            os.write_bytes(2, &self.owner_address)?;\n        }\n        if !self.to_address.is_empty() {\n            os.write_bytes(3, &self.to_address)?;\n        }\n        if self.amount != 0 {\n            os.write_int64(4, self.amount)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TransferAssetContract {\n        TransferAssetContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.asset_name.clear();\n        self.owner_address.clear();\n        self.to_address.clear();\n        self.amount = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TransferAssetContract {\n        static instance: TransferAssetContract = TransferAssetContract {\n            asset_name: ::std::vec::Vec::new(),\n            owner_address: ::std::vec::Vec::new(),\n            to_address: ::std::vec::Vec::new(),\n            amount: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TransferAssetContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TransferAssetContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TransferAssetContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TransferAssetContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UnfreezeAssetContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UnfreezeAssetContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UnfreezeAssetContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UnfreezeAssetContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UnfreezeAssetContract {\n    fn default() -> &'a UnfreezeAssetContract {\n        <UnfreezeAssetContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UnfreezeAssetContract {\n    pub fn new() -> UnfreezeAssetContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UnfreezeAssetContract| { &m.owner_address },\n            |m: &mut UnfreezeAssetContract| { &mut m.owner_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UnfreezeAssetContract>(\n            \"UnfreezeAssetContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UnfreezeAssetContract {\n    const NAME: &'static str = \"UnfreezeAssetContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UnfreezeAssetContract {\n        UnfreezeAssetContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UnfreezeAssetContract {\n        static instance: UnfreezeAssetContract = UnfreezeAssetContract {\n            owner_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UnfreezeAssetContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UnfreezeAssetContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UnfreezeAssetContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UnfreezeAssetContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UpdateAssetContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UpdateAssetContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UpdateAssetContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateAssetContract.description)\n    pub description: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateAssetContract.url)\n    pub url: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateAssetContract.new_limit)\n    pub new_limit: i64,\n    // @@protoc_insertion_point(field:protocol.UpdateAssetContract.new_public_limit)\n    pub new_public_limit: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UpdateAssetContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UpdateAssetContract {\n    fn default() -> &'a UpdateAssetContract {\n        <UpdateAssetContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UpdateAssetContract {\n    pub fn new() -> UpdateAssetContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(5);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UpdateAssetContract| { &m.owner_address },\n            |m: &mut UpdateAssetContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"description\",\n            |m: &UpdateAssetContract| { &m.description },\n            |m: &mut UpdateAssetContract| { &mut m.description },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"url\",\n            |m: &UpdateAssetContract| { &m.url },\n            |m: &mut UpdateAssetContract| { &mut m.url },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"new_limit\",\n            |m: &UpdateAssetContract| { &m.new_limit },\n            |m: &mut UpdateAssetContract| { &mut m.new_limit },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"new_public_limit\",\n            |m: &UpdateAssetContract| { &m.new_public_limit },\n            |m: &mut UpdateAssetContract| { &mut m.new_public_limit },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UpdateAssetContract>(\n            \"UpdateAssetContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UpdateAssetContract {\n    const NAME: &'static str = \"UpdateAssetContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.description = is.read_bytes()?;\n                },\n                26 => {\n                    self.url = is.read_bytes()?;\n                },\n                32 => {\n                    self.new_limit = is.read_int64()?;\n                },\n                40 => {\n                    self.new_public_limit = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.description.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.description);\n        }\n        if !self.url.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.url);\n        }\n        if self.new_limit != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.new_limit);\n        }\n        if self.new_public_limit != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.new_public_limit);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.description.is_empty() {\n            os.write_bytes(2, &self.description)?;\n        }\n        if !self.url.is_empty() {\n            os.write_bytes(3, &self.url)?;\n        }\n        if self.new_limit != 0 {\n            os.write_int64(4, self.new_limit)?;\n        }\n        if self.new_public_limit != 0 {\n            os.write_int64(5, self.new_public_limit)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UpdateAssetContract {\n        UpdateAssetContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.description.clear();\n        self.url.clear();\n        self.new_limit = 0;\n        self.new_public_limit = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UpdateAssetContract {\n        static instance: UpdateAssetContract = UpdateAssetContract {\n            owner_address: ::std::vec::Vec::new(),\n            description: ::std::vec::Vec::new(),\n            url: ::std::vec::Vec::new(),\n            new_limit: 0,\n            new_public_limit: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UpdateAssetContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UpdateAssetContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UpdateAssetContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UpdateAssetContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ParticipateAssetIssueContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ParticipateAssetIssueContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ParticipateAssetIssueContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ParticipateAssetIssueContract.to_address)\n    pub to_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ParticipateAssetIssueContract.asset_name)\n    pub asset_name: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ParticipateAssetIssueContract.amount)\n    pub amount: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ParticipateAssetIssueContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ParticipateAssetIssueContract {\n    fn default() -> &'a ParticipateAssetIssueContract {\n        <ParticipateAssetIssueContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ParticipateAssetIssueContract {\n    pub fn new() -> ParticipateAssetIssueContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ParticipateAssetIssueContract| { &m.owner_address },\n            |m: &mut ParticipateAssetIssueContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"to_address\",\n            |m: &ParticipateAssetIssueContract| { &m.to_address },\n            |m: &mut ParticipateAssetIssueContract| { &mut m.to_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"asset_name\",\n            |m: &ParticipateAssetIssueContract| { &m.asset_name },\n            |m: &mut ParticipateAssetIssueContract| { &mut m.asset_name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"amount\",\n            |m: &ParticipateAssetIssueContract| { &m.amount },\n            |m: &mut ParticipateAssetIssueContract| { &mut m.amount },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ParticipateAssetIssueContract>(\n            \"ParticipateAssetIssueContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ParticipateAssetIssueContract {\n    const NAME: &'static str = \"ParticipateAssetIssueContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.to_address = is.read_bytes()?;\n                },\n                26 => {\n                    self.asset_name = is.read_bytes()?;\n                },\n                32 => {\n                    self.amount = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.to_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.to_address);\n        }\n        if !self.asset_name.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.asset_name);\n        }\n        if self.amount != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.amount);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.to_address.is_empty() {\n            os.write_bytes(2, &self.to_address)?;\n        }\n        if !self.asset_name.is_empty() {\n            os.write_bytes(3, &self.asset_name)?;\n        }\n        if self.amount != 0 {\n            os.write_int64(4, self.amount)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ParticipateAssetIssueContract {\n        ParticipateAssetIssueContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.to_address.clear();\n        self.asset_name.clear();\n        self.amount = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ParticipateAssetIssueContract {\n        static instance: ParticipateAssetIssueContract = ParticipateAssetIssueContract {\n            owner_address: ::std::vec::Vec::new(),\n            to_address: ::std::vec::Vec::new(),\n            asset_name: ::std::vec::Vec::new(),\n            amount: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ParticipateAssetIssueContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ParticipateAssetIssueContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ParticipateAssetIssueContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ParticipateAssetIssueContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n(core/contract/asset_issue_contract.proto\\x12\\x08protocol\\\"\\x91\\x06\\n\\\n    \\x12AssetIssueContract\\x12\\x0e\\n\\x02id\\x18)\\x20\\x01(\\tR\\x02id\\x12#\\n\\row\\\n    ner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x12\\n\\x04name\\x18\\\n    \\x02\\x20\\x01(\\x0cR\\x04name\\x12\\x12\\n\\x04abbr\\x18\\x03\\x20\\x01(\\x0cR\\x04ab\\\n    br\\x12!\\n\\x0ctotal_supply\\x18\\x04\\x20\\x01(\\x03R\\x0btotalSupply\\x12N\\n\\rf\\\n    rozen_supply\\x18\\x05\\x20\\x03(\\x0b2).protocol.AssetIssueContract.FrozenSu\\\n    pplyR\\x0cfrozenSupply\\x12\\x17\\n\\x07trx_num\\x18\\x06\\x20\\x01(\\x05R\\x06trxN\\\n    um\\x12\\x1c\\n\\tprecision\\x18\\x07\\x20\\x01(\\x05R\\tprecision\\x12\\x10\\n\\x03nu\\\n    m\\x18\\x08\\x20\\x01(\\x05R\\x03num\\x12\\x1d\\n\\nstart_time\\x18\\t\\x20\\x01(\\x03R\\\n    \\tstartTime\\x12\\x19\\n\\x08end_time\\x18\\n\\x20\\x01(\\x03R\\x07endTime\\x12\\x14\\\n    \\n\\x05order\\x18\\x0b\\x20\\x01(\\x03R\\x05order\\x12\\x1d\\n\\nvote_score\\x18\\x10\\\n    \\x20\\x01(\\x05R\\tvoteScore\\x12\\x20\\n\\x0bdescription\\x18\\x14\\x20\\x01(\\x0cR\\\n    \\x0bdescription\\x12\\x10\\n\\x03url\\x18\\x15\\x20\\x01(\\x0cR\\x03url\\x12/\\n\\x14\\\n    free_asset_net_limit\\x18\\x16\\x20\\x01(\\x03R\\x11freeAssetNetLimit\\x12<\\n\\\n    \\x1bpublic_free_asset_net_limit\\x18\\x17\\x20\\x01(\\x03R\\x17publicFreeAsset\\\n    NetLimit\\x12<\\n\\x1bpublic_free_asset_net_usage\\x18\\x18\\x20\\x01(\\x03R\\x17\\\n    publicFreeAssetNetUsage\\x12<\\n\\x1bpublic_latest_free_net_time\\x18\\x19\\\n    \\x20\\x01(\\x03R\\x17publicLatestFreeNetTime\\x1aT\\n\\x0cFrozenSupply\\x12#\\n\\\n    \\rfrozen_amount\\x18\\x01\\x20\\x01(\\x03R\\x0cfrozenAmount\\x12\\x1f\\n\\x0bfroze\\\n    n_days\\x18\\x02\\x20\\x01(\\x03R\\nfrozenDays\\\"\\x92\\x01\\n\\x15TransferAssetCon\\\n    tract\\x12\\x1d\\n\\nasset_name\\x18\\x01\\x20\\x01(\\x0cR\\tassetName\\x12#\\n\\rown\\\n    er_address\\x18\\x02\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x1d\\n\\nto_address\\\n    \\x18\\x03\\x20\\x01(\\x0cR\\ttoAddress\\x12\\x16\\n\\x06amount\\x18\\x04\\x20\\x01(\\\n    \\x03R\\x06amount\\\"<\\n\\x15UnfreezeAssetContract\\x12#\\n\\rowner_address\\x18\\\n    \\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\\"\\xb5\\x01\\n\\x13UpdateAssetContract\\\n    \\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x20\\n\\\n    \\x0bdescription\\x18\\x02\\x20\\x01(\\x0cR\\x0bdescription\\x12\\x10\\n\\x03url\\\n    \\x18\\x03\\x20\\x01(\\x0cR\\x03url\\x12\\x1b\\n\\tnew_limit\\x18\\x04\\x20\\x01(\\x03R\\\n    \\x08newLimit\\x12(\\n\\x10new_public_limit\\x18\\x05\\x20\\x01(\\x03R\\x0enewPubl\\\n    icLimit\\\"\\x9a\\x01\\n\\x1dParticipateAssetIssueContract\\x12#\\n\\rowner_addre\\\n    ss\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x1d\\n\\nto_address\\x18\\x02\\\n    \\x20\\x01(\\x0cR\\ttoAddress\\x12\\x1d\\n\\nasset_name\\x18\\x03\\x20\\x01(\\x0cR\\ta\\\n    ssetName\\x12\\x16\\n\\x06amount\\x18\\x04\\x20\\x01(\\x03R\\x06amountBE\\n\\x18org.\\\n    tron.protos.contractZ)github.com/tronprotocol/grpc-gateway/coreJ\\xf2\\x14\\\n    \\n\\x06\\x12\\x04\\0\\0;\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\\n    \\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\\n    \\x03\\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20that\\x20\\\n    generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\ns\\n\\\n    \\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\x1ahoption\\x20java_outer_classname\\x20=\\x20\\\n    \\\"AssetIssueContract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\x20th\\\n    e\\x20generated\\x20Java\\x20file\\n\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x08\\0!\\x01\\n\\n\\\n    \\n\\x03\\x04\\0\\x01\\x12\\x03\\x08\\x08\\x1a\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\t\\\n    \\x02\\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\t\\x02\\x08\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x03\\t\\t\\x0b\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\t\\x0e\\x10\\\n    \\n\\x0c\\n\\x04\\x04\\0\\x03\\0\\x12\\x04\\x0b\\x02\\x0e\\x03\\n\\x0c\\n\\x05\\x04\\0\\x03\\0\\\n    \\x01\\x12\\x03\\x0b\\n\\x16\\n\\r\\n\\x06\\x04\\0\\x03\\0\\x02\\0\\x12\\x03\\x0c\\x04\\x1c\\n\\\n    \\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\0\\x05\\x12\\x03\\x0c\\x04\\t\\n\\x0e\\n\\x07\\x04\\0\\x03\\\n    \\0\\x02\\0\\x01\\x12\\x03\\x0c\\n\\x17\\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\0\\x03\\x12\\x03\\\n    \\x0c\\x1a\\x1b\\n\\r\\n\\x06\\x04\\0\\x03\\0\\x02\\x01\\x12\\x03\\r\\x04\\x1a\\n\\x0e\\n\\x07\\\n    \\x04\\0\\x03\\0\\x02\\x01\\x05\\x12\\x03\\r\\x04\\t\\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\x01\\\n    \\x01\\x12\\x03\\r\\n\\x15\\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\x01\\x03\\x12\\x03\\r\\x18\\\n    \\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\x0f\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x01\\x05\\x12\\x03\\x0f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\x0f\\\n    \\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\x0f\\x18\\x19\\n\\x0b\\n\\x04\\\n    \\x04\\0\\x02\\x02\\x12\\x03\\x10\\x02\\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x05\\x12\\x03\\\n    \\x10\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\x10\\x08\\x0c\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x02\\x03\\x12\\x03\\x10\\x0f\\x10\\n\\x0b\\n\\x04\\x04\\0\\x02\\x03\\x12\\\n    \\x03\\x11\\x02\\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x05\\x12\\x03\\x11\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\0\\x02\\x03\\x01\\x12\\x03\\x11\\x08\\x0c\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\\n    \\x03\\x12\\x03\\x11\\x0f\\x10\\n\\x0b\\n\\x04\\x04\\0\\x02\\x04\\x12\\x03\\x12\\x02\\x19\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x04\\x05\\x12\\x03\\x12\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x04\\x01\\x12\\x03\\x12\\x08\\x14\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x03\\x12\\x03\\x12\\\n    \\x17\\x18\\n\\x0b\\n\\x04\\x04\\0\\x02\\x05\\x12\\x03\\x13\\x02*\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x05\\x04\\x12\\x03\\x13\\x02\\n\\n\\x0c\\n\\x05\\x04\\0\\x02\\x05\\x06\\x12\\x03\\x13\\\n    \\x0b\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\x05\\x01\\x12\\x03\\x13\\x18%\\n\\x0c\\n\\x05\\x04\\\n    \\0\\x02\\x05\\x03\\x12\\x03\\x13()\\n\\x0b\\n\\x04\\x04\\0\\x02\\x06\\x12\\x03\\x14\\x02\\\n    \\x14\\n\\x0c\\n\\x05\\x04\\0\\x02\\x06\\x05\\x12\\x03\\x14\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x06\\x01\\x12\\x03\\x14\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\0\\x02\\x06\\x03\\x12\\x03\\\n    \\x14\\x12\\x13\\n\\x0b\\n\\x04\\x04\\0\\x02\\x07\\x12\\x03\\x15\\x02\\x16\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\x07\\x05\\x12\\x03\\x15\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x07\\x01\\x12\\\n    \\x03\\x15\\x08\\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\x07\\x03\\x12\\x03\\x15\\x14\\x15\\n\\x0b\\\n    \\n\\x04\\x04\\0\\x02\\x08\\x12\\x03\\x16\\x02\\x10\\n\\x0c\\n\\x05\\x04\\0\\x02\\x08\\x05\\\n    \\x12\\x03\\x16\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x08\\x01\\x12\\x03\\x16\\x08\\x0b\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x08\\x03\\x12\\x03\\x16\\x0e\\x0f\\n\\x0b\\n\\x04\\x04\\0\\x02\\t\\\n    \\x12\\x03\\x17\\x02\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\t\\x05\\x12\\x03\\x17\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\t\\x01\\x12\\x03\\x17\\x08\\x12\\n\\x0c\\n\\x05\\x04\\0\\x02\\t\\\n    \\x03\\x12\\x03\\x17\\x15\\x16\\n\\x0b\\n\\x04\\x04\\0\\x02\\n\\x12\\x03\\x18\\x02\\x16\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\n\\x05\\x12\\x03\\x18\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\n\\\n    \\x01\\x12\\x03\\x18\\x08\\x10\\n\\x0c\\n\\x05\\x04\\0\\x02\\n\\x03\\x12\\x03\\x18\\x13\\x15\\\n    \\n\\x16\\n\\x04\\x04\\0\\x02\\x0b\\x12\\x03\\x19\\x02\\x13\\\"\\t\\x20useless\\n\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x0b\\x05\\x12\\x03\\x19\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0b\\x01\\\n    \\x12\\x03\\x19\\x08\\r\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0b\\x03\\x12\\x03\\x19\\x10\\x12\\n\\\n    \\x0b\\n\\x04\\x04\\0\\x02\\x0c\\x12\\x03\\x1a\\x02\\x18\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0c\\\n    \\x05\\x12\\x03\\x1a\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0c\\x01\\x12\\x03\\x1a\\x08\\\n    \\x12\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0c\\x03\\x12\\x03\\x1a\\x15\\x17\\n\\x0b\\n\\x04\\x04\\0\\\n    \\x02\\r\\x12\\x03\\x1b\\x02\\x19\\n\\x0c\\n\\x05\\x04\\0\\x02\\r\\x05\\x12\\x03\\x1b\\x02\\\n    \\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\r\\x01\\x12\\x03\\x1b\\x08\\x13\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\r\\x03\\x12\\x03\\x1b\\x16\\x18\\n\\x0b\\n\\x04\\x04\\0\\x02\\x0e\\x12\\x03\\x1c\\x02\\\n    \\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0e\\x05\\x12\\x03\\x1c\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x0e\\x01\\x12\\x03\\x1c\\x08\\x0b\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0e\\x03\\x12\\x03\\\n    \\x1c\\x0e\\x10\\n\\x0b\\n\\x04\\x04\\0\\x02\\x0f\\x12\\x03\\x1d\\x02\\\"\\n\\x0c\\n\\x05\\x04\\\n    \\0\\x02\\x0f\\x05\\x12\\x03\\x1d\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0f\\x01\\x12\\x03\\\n    \\x1d\\x08\\x1c\\n\\x0c\\n\\x05\\x04\\0\\x02\\x0f\\x03\\x12\\x03\\x1d\\x1f!\\n\\x0b\\n\\x04\\\n    \\x04\\0\\x02\\x10\\x12\\x03\\x1e\\x02)\\n\\x0c\\n\\x05\\x04\\0\\x02\\x10\\x05\\x12\\x03\\\n    \\x1e\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x10\\x01\\x12\\x03\\x1e\\x08#\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\x10\\x03\\x12\\x03\\x1e&(\\n\\x0b\\n\\x04\\x04\\0\\x02\\x11\\x12\\x03\\x1f\\\n    \\x02)\\n\\x0c\\n\\x05\\x04\\0\\x02\\x11\\x05\\x12\\x03\\x1f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\\n    \\0\\x02\\x11\\x01\\x12\\x03\\x1f\\x08#\\n\\x0c\\n\\x05\\x04\\0\\x02\\x11\\x03\\x12\\x03\\\n    \\x1f&(\\n\\x0b\\n\\x04\\x04\\0\\x02\\x12\\x12\\x03\\x20\\x02)\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x12\\x05\\x12\\x03\\x20\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x12\\x01\\x12\\x03\\x20\\\n    \\x08#\\n\\x0c\\n\\x05\\x04\\0\\x02\\x12\\x03\\x12\\x03\\x20&(\\n\\n\\n\\x02\\x04\\x01\\x12\\\n    \\x04#\\0(\\x01\\n\\n\\n\\x03\\x04\\x01\\x01\\x12\\x03#\\x08\\x1d\\n\\x9f\\x01\\n\\x04\\x04\\\n    \\x01\\x02\\0\\x12\\x03$\\x02\\x17\\\"\\x91\\x01\\x20this\\x20field\\x20is\\x20token\\\n    \\x20name\\x20before\\x20the\\x20proposal\\x20ALLOW_SAME_TOKEN_NAME\\x20is\\x20\\\n    active,\\x20otherwise\\x20it\\x20is\\x20token\\x20id\\x20and\\x20token\\x20is\\\n    \\x20should\\x20be\\x20in\\x20string\\x20format.\\n\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\\n    \\x05\\x12\\x03$\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\x03$\\x08\\x12\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03$\\x15\\x16\\n\\x0b\\n\\x04\\x04\\x01\\x02\\\n    \\x01\\x12\\x03%\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\x03%\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03%\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\\n    \\x01\\x03\\x12\\x03%\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x02\\x12\\x03&\\x02\\x17\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x05\\x12\\x03&\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\\n    \\x02\\x01\\x12\\x03&\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x03\\x12\\x03&\\x15\\\n    \\x16\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x03\\x12\\x03'\\x02\\x13\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\x03\\x05\\x12\\x03'\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x03\\x01\\x12\\x03'\\\n    \\x08\\x0e\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x03\\x03\\x12\\x03'\\x11\\x12\\n\\n\\n\\x02\\x04\\\n    \\x02\\x12\\x04*\\0,\\x01\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03*\\x08\\x1d\\n\\x0b\\n\\x04\\\n    \\x04\\x02\\x02\\0\\x12\\x03+\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x05\\x12\\x03+\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03+\\x08\\x15\\n\\x0c\\n\\x05\\x04\\\n    \\x02\\x02\\0\\x03\\x12\\x03+\\x18\\x19\\n\\n\\n\\x02\\x04\\x03\\x12\\x04.\\04\\x01\\n\\n\\n\\\n    \\x03\\x04\\x03\\x01\\x12\\x03.\\x08\\x1b\\n\\x0b\\n\\x04\\x04\\x03\\x02\\0\\x12\\x03/\\x02\\\n    \\x1a\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x05\\x12\\x03/\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\\n    \\x02\\0\\x01\\x12\\x03/\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\x03/\\x18\\\n    \\x19\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x01\\x12\\x030\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x03\\\n    \\x02\\x01\\x05\\x12\\x030\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x030\\\n    \\x08\\x13\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x03\\x12\\x030\\x16\\x17\\n\\x0b\\n\\x04\\\n    \\x04\\x03\\x02\\x02\\x12\\x031\\x02\\x10\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x05\\x12\\\n    \\x031\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x01\\x12\\x031\\x08\\x0b\\n\\x0c\\n\\\n    \\x05\\x04\\x03\\x02\\x02\\x03\\x12\\x031\\x0e\\x0f\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x03\\\n    \\x12\\x032\\x02\\x16\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x05\\x12\\x032\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\x03\\x01\\x12\\x032\\x08\\x11\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\\n    \\x03\\x12\\x032\\x14\\x15\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x04\\x12\\x033\\x02\\x1d\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\x04\\x05\\x12\\x033\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\\n    \\x01\\x12\\x033\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x03\\x12\\x033\\x1b\\x1c\\n\\\n    \\n\\n\\x02\\x04\\x04\\x12\\x046\\0;\\x01\\n\\n\\n\\x03\\x04\\x04\\x01\\x12\\x036\\x08%\\n\\\n    \\x0b\\n\\x04\\x04\\x04\\x02\\0\\x12\\x037\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x05\\\n    \\x12\\x037\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x01\\x12\\x037\\x08\\x15\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\0\\x03\\x12\\x037\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x01\\x12\\\n    \\x038\\x02\\x17\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x05\\x12\\x038\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x01\\x01\\x12\\x038\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\\n    \\x03\\x12\\x038\\x15\\x16\\n\\x9f\\x01\\n\\x04\\x04\\x04\\x02\\x02\\x12\\x039\\x02\\x17\\\"\\\n    \\x91\\x01\\x20this\\x20field\\x20is\\x20token\\x20name\\x20before\\x20the\\x20pro\\\n    posal\\x20ALLOW_SAME_TOKEN_NAME\\x20is\\x20active,\\x20otherwise\\x20it\\x20is\\\n    \\x20token\\x20id\\x20and\\x20token\\x20is\\x20should\\x20be\\x20in\\x20string\\\n    \\x20format.\\n\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\x05\\x12\\x039\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x02\\x01\\x12\\x039\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\\n    \\x03\\x12\\x039\\x15\\x16\\n\\\"\\n\\x04\\x04\\x04\\x02\\x03\\x12\\x03:\\x02\\x13\\\"\\x15\\\n    \\x20the\\x20amount\\x20of\\x20drops\\n\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x03\\x05\\x12\\\n    \\x03:\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x03\\x01\\x12\\x03:\\x08\\x0e\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x03\\x03\\x12\\x03:\\x11\\x12b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(6);\n            messages.push(AssetIssueContract::generated_message_descriptor_data());\n            messages.push(TransferAssetContract::generated_message_descriptor_data());\n            messages.push(UnfreezeAssetContract::generated_message_descriptor_data());\n            messages.push(UpdateAssetContract::generated_message_descriptor_data());\n            messages.push(ParticipateAssetIssueContract::generated_message_descriptor_data());\n            messages.push(asset_issue_contract::FrozenSupply::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/balance_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/balance_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.FreezeBalanceContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct FreezeBalanceContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceContract.frozen_balance)\n    pub frozen_balance: i64,\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceContract.frozen_duration)\n    pub frozen_duration: i64,\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceContract.resource)\n    pub resource: ::protobuf::EnumOrUnknown<super::common::ResourceCode>,\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceContract.receiver_address)\n    pub receiver_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.FreezeBalanceContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a FreezeBalanceContract {\n    fn default() -> &'a FreezeBalanceContract {\n        <FreezeBalanceContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl FreezeBalanceContract {\n    pub fn new() -> FreezeBalanceContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(5);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &FreezeBalanceContract| { &m.owner_address },\n            |m: &mut FreezeBalanceContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"frozen_balance\",\n            |m: &FreezeBalanceContract| { &m.frozen_balance },\n            |m: &mut FreezeBalanceContract| { &mut m.frozen_balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"frozen_duration\",\n            |m: &FreezeBalanceContract| { &m.frozen_duration },\n            |m: &mut FreezeBalanceContract| { &mut m.frozen_duration },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resource\",\n            |m: &FreezeBalanceContract| { &m.resource },\n            |m: &mut FreezeBalanceContract| { &mut m.resource },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"receiver_address\",\n            |m: &FreezeBalanceContract| { &m.receiver_address },\n            |m: &mut FreezeBalanceContract| { &mut m.receiver_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<FreezeBalanceContract>(\n            \"FreezeBalanceContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for FreezeBalanceContract {\n    const NAME: &'static str = \"FreezeBalanceContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.frozen_balance = is.read_int64()?;\n                },\n                24 => {\n                    self.frozen_duration = is.read_int64()?;\n                },\n                80 => {\n                    self.resource = is.read_enum_or_unknown()?;\n                },\n                122 => {\n                    self.receiver_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.frozen_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.frozen_balance);\n        }\n        if self.frozen_duration != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.frozen_duration);\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            my_size += ::protobuf::rt::int32_size(10, self.resource.value());\n        }\n        if !self.receiver_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(15, &self.receiver_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.frozen_balance != 0 {\n            os.write_int64(2, self.frozen_balance)?;\n        }\n        if self.frozen_duration != 0 {\n            os.write_int64(3, self.frozen_duration)?;\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            os.write_enum(10, ::protobuf::EnumOrUnknown::value(&self.resource))?;\n        }\n        if !self.receiver_address.is_empty() {\n            os.write_bytes(15, &self.receiver_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> FreezeBalanceContract {\n        FreezeBalanceContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.frozen_balance = 0;\n        self.frozen_duration = 0;\n        self.resource = ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH);\n        self.receiver_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static FreezeBalanceContract {\n        static instance: FreezeBalanceContract = FreezeBalanceContract {\n            owner_address: ::std::vec::Vec::new(),\n            frozen_balance: 0,\n            frozen_duration: 0,\n            resource: ::protobuf::EnumOrUnknown::from_i32(0),\n            receiver_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for FreezeBalanceContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"FreezeBalanceContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for FreezeBalanceContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for FreezeBalanceContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UnfreezeBalanceContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UnfreezeBalanceContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UnfreezeBalanceContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UnfreezeBalanceContract.resource)\n    pub resource: ::protobuf::EnumOrUnknown<super::common::ResourceCode>,\n    // @@protoc_insertion_point(field:protocol.UnfreezeBalanceContract.receiver_address)\n    pub receiver_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UnfreezeBalanceContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UnfreezeBalanceContract {\n    fn default() -> &'a UnfreezeBalanceContract {\n        <UnfreezeBalanceContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UnfreezeBalanceContract {\n    pub fn new() -> UnfreezeBalanceContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UnfreezeBalanceContract| { &m.owner_address },\n            |m: &mut UnfreezeBalanceContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resource\",\n            |m: &UnfreezeBalanceContract| { &m.resource },\n            |m: &mut UnfreezeBalanceContract| { &mut m.resource },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"receiver_address\",\n            |m: &UnfreezeBalanceContract| { &m.receiver_address },\n            |m: &mut UnfreezeBalanceContract| { &mut m.receiver_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UnfreezeBalanceContract>(\n            \"UnfreezeBalanceContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UnfreezeBalanceContract {\n    const NAME: &'static str = \"UnfreezeBalanceContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                80 => {\n                    self.resource = is.read_enum_or_unknown()?;\n                },\n                122 => {\n                    self.receiver_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            my_size += ::protobuf::rt::int32_size(10, self.resource.value());\n        }\n        if !self.receiver_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(15, &self.receiver_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            os.write_enum(10, ::protobuf::EnumOrUnknown::value(&self.resource))?;\n        }\n        if !self.receiver_address.is_empty() {\n            os.write_bytes(15, &self.receiver_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UnfreezeBalanceContract {\n        UnfreezeBalanceContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.resource = ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH);\n        self.receiver_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UnfreezeBalanceContract {\n        static instance: UnfreezeBalanceContract = UnfreezeBalanceContract {\n            owner_address: ::std::vec::Vec::new(),\n            resource: ::protobuf::EnumOrUnknown::from_i32(0),\n            receiver_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UnfreezeBalanceContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UnfreezeBalanceContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UnfreezeBalanceContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UnfreezeBalanceContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.WithdrawBalanceContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct WithdrawBalanceContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.WithdrawBalanceContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.WithdrawBalanceContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a WithdrawBalanceContract {\n    fn default() -> &'a WithdrawBalanceContract {\n        <WithdrawBalanceContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl WithdrawBalanceContract {\n    pub fn new() -> WithdrawBalanceContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &WithdrawBalanceContract| { &m.owner_address },\n            |m: &mut WithdrawBalanceContract| { &mut m.owner_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WithdrawBalanceContract>(\n            \"WithdrawBalanceContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for WithdrawBalanceContract {\n    const NAME: &'static str = \"WithdrawBalanceContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> WithdrawBalanceContract {\n        WithdrawBalanceContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static WithdrawBalanceContract {\n        static instance: WithdrawBalanceContract = WithdrawBalanceContract {\n            owner_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for WithdrawBalanceContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"WithdrawBalanceContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for WithdrawBalanceContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for WithdrawBalanceContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.TransferContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TransferContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TransferContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransferContract.to_address)\n    pub to_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransferContract.amount)\n    pub amount: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TransferContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TransferContract {\n    fn default() -> &'a TransferContract {\n        <TransferContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TransferContract {\n    pub fn new() -> TransferContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &TransferContract| { &m.owner_address },\n            |m: &mut TransferContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"to_address\",\n            |m: &TransferContract| { &m.to_address },\n            |m: &mut TransferContract| { &mut m.to_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"amount\",\n            |m: &TransferContract| { &m.amount },\n            |m: &mut TransferContract| { &mut m.amount },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TransferContract>(\n            \"TransferContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TransferContract {\n    const NAME: &'static str = \"TransferContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.to_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.amount = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.to_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.to_address);\n        }\n        if self.amount != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.amount);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.to_address.is_empty() {\n            os.write_bytes(2, &self.to_address)?;\n        }\n        if self.amount != 0 {\n            os.write_int64(3, self.amount)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TransferContract {\n        TransferContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.to_address.clear();\n        self.amount = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TransferContract {\n        static instance: TransferContract = TransferContract {\n            owner_address: ::std::vec::Vec::new(),\n            to_address: ::std::vec::Vec::new(),\n            amount: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TransferContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TransferContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TransferContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TransferContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.TransactionBalanceTrace)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TransactionBalanceTrace {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.transaction_identifier)\n    pub transaction_identifier: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.operation)\n    pub operation: ::std::vec::Vec<transaction_balance_trace::Operation>,\n    // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.type)\n    pub type_: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.status)\n    pub status: ::std::string::String,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TransactionBalanceTrace.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TransactionBalanceTrace {\n    fn default() -> &'a TransactionBalanceTrace {\n        <TransactionBalanceTrace as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TransactionBalanceTrace {\n    pub fn new() -> TransactionBalanceTrace {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"transaction_identifier\",\n            |m: &TransactionBalanceTrace| { &m.transaction_identifier },\n            |m: &mut TransactionBalanceTrace| { &mut m.transaction_identifier },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"operation\",\n            |m: &TransactionBalanceTrace| { &m.operation },\n            |m: &mut TransactionBalanceTrace| { &mut m.operation },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"type\",\n            |m: &TransactionBalanceTrace| { &m.type_ },\n            |m: &mut TransactionBalanceTrace| { &mut m.type_ },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"status\",\n            |m: &TransactionBalanceTrace| { &m.status },\n            |m: &mut TransactionBalanceTrace| { &mut m.status },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TransactionBalanceTrace>(\n            \"TransactionBalanceTrace\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TransactionBalanceTrace {\n    const NAME: &'static str = \"TransactionBalanceTrace\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.transaction_identifier = is.read_bytes()?;\n                },\n                18 => {\n                    self.operation.push(is.read_message()?);\n                },\n                26 => {\n                    self.type_ = is.read_string()?;\n                },\n                34 => {\n                    self.status = is.read_string()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.transaction_identifier.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.transaction_identifier);\n        }\n        for value in &self.operation {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if !self.type_.is_empty() {\n            my_size += ::protobuf::rt::string_size(3, &self.type_);\n        }\n        if !self.status.is_empty() {\n            my_size += ::protobuf::rt::string_size(4, &self.status);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.transaction_identifier.is_empty() {\n            os.write_bytes(1, &self.transaction_identifier)?;\n        }\n        for v in &self.operation {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        };\n        if !self.type_.is_empty() {\n            os.write_string(3, &self.type_)?;\n        }\n        if !self.status.is_empty() {\n            os.write_string(4, &self.status)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TransactionBalanceTrace {\n        TransactionBalanceTrace::new()\n    }\n\n    fn clear(&mut self) {\n        self.transaction_identifier.clear();\n        self.operation.clear();\n        self.type_.clear();\n        self.status.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TransactionBalanceTrace {\n        static instance: TransactionBalanceTrace = TransactionBalanceTrace {\n            transaction_identifier: ::std::vec::Vec::new(),\n            operation: ::std::vec::Vec::new(),\n            type_: ::std::string::String::new(),\n            status: ::std::string::String::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TransactionBalanceTrace {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TransactionBalanceTrace\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TransactionBalanceTrace {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TransactionBalanceTrace {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `TransactionBalanceTrace`\npub mod transaction_balance_trace {\n    // @@protoc_insertion_point(message:protocol.TransactionBalanceTrace.Operation)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Operation {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.Operation.operation_identifier)\n        pub operation_identifier: i64,\n        // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.Operation.address)\n        pub address: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.TransactionBalanceTrace.Operation.amount)\n        pub amount: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.TransactionBalanceTrace.Operation.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Operation {\n        fn default() -> &'a Operation {\n            <Operation as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Operation {\n        pub fn new() -> Operation {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(3);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"operation_identifier\",\n                |m: &Operation| { &m.operation_identifier },\n                |m: &mut Operation| { &mut m.operation_identifier },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"address\",\n                |m: &Operation| { &m.address },\n                |m: &mut Operation| { &mut m.address },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"amount\",\n                |m: &Operation| { &m.amount },\n                |m: &mut Operation| { &mut m.amount },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Operation>(\n                \"TransactionBalanceTrace.Operation\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Operation {\n        const NAME: &'static str = \"Operation\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    8 => {\n                        self.operation_identifier = is.read_int64()?;\n                    },\n                    18 => {\n                        self.address = is.read_bytes()?;\n                    },\n                    24 => {\n                        self.amount = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if self.operation_identifier != 0 {\n                my_size += ::protobuf::rt::int64_size(1, self.operation_identifier);\n            }\n            if !self.address.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(2, &self.address);\n            }\n            if self.amount != 0 {\n                my_size += ::protobuf::rt::int64_size(3, self.amount);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if self.operation_identifier != 0 {\n                os.write_int64(1, self.operation_identifier)?;\n            }\n            if !self.address.is_empty() {\n                os.write_bytes(2, &self.address)?;\n            }\n            if self.amount != 0 {\n                os.write_int64(3, self.amount)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Operation {\n            Operation::new()\n        }\n\n        fn clear(&mut self) {\n            self.operation_identifier = 0;\n            self.address.clear();\n            self.amount = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Operation {\n            static instance: Operation = Operation {\n                operation_identifier: 0,\n                address: ::std::vec::Vec::new(),\n                amount: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Operation {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"TransactionBalanceTrace.Operation\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Operation {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Operation {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.BlockBalanceTrace)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct BlockBalanceTrace {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.BlockBalanceTrace.block_identifier)\n    pub block_identifier: ::protobuf::MessageField<block_balance_trace::BlockIdentifier>,\n    // @@protoc_insertion_point(field:protocol.BlockBalanceTrace.timestamp)\n    pub timestamp: i64,\n    // @@protoc_insertion_point(field:protocol.BlockBalanceTrace.transaction_balance_trace)\n    pub transaction_balance_trace: ::std::vec::Vec<TransactionBalanceTrace>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.BlockBalanceTrace.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a BlockBalanceTrace {\n    fn default() -> &'a BlockBalanceTrace {\n        <BlockBalanceTrace as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl BlockBalanceTrace {\n    pub fn new() -> BlockBalanceTrace {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, block_balance_trace::BlockIdentifier>(\n            \"block_identifier\",\n            |m: &BlockBalanceTrace| { &m.block_identifier },\n            |m: &mut BlockBalanceTrace| { &mut m.block_identifier },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"timestamp\",\n            |m: &BlockBalanceTrace| { &m.timestamp },\n            |m: &mut BlockBalanceTrace| { &mut m.timestamp },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"transaction_balance_trace\",\n            |m: &BlockBalanceTrace| { &m.transaction_balance_trace },\n            |m: &mut BlockBalanceTrace| { &mut m.transaction_balance_trace },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockBalanceTrace>(\n            \"BlockBalanceTrace\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for BlockBalanceTrace {\n    const NAME: &'static str = \"BlockBalanceTrace\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.block_identifier)?;\n                },\n                16 => {\n                    self.timestamp = is.read_int64()?;\n                },\n                26 => {\n                    self.transaction_balance_trace.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.block_identifier.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.timestamp != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.timestamp);\n        }\n        for value in &self.transaction_balance_trace {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.block_identifier.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if self.timestamp != 0 {\n            os.write_int64(2, self.timestamp)?;\n        }\n        for v in &self.transaction_balance_trace {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> BlockBalanceTrace {\n        BlockBalanceTrace::new()\n    }\n\n    fn clear(&mut self) {\n        self.block_identifier.clear();\n        self.timestamp = 0;\n        self.transaction_balance_trace.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static BlockBalanceTrace {\n        static instance: BlockBalanceTrace = BlockBalanceTrace {\n            block_identifier: ::protobuf::MessageField::none(),\n            timestamp: 0,\n            transaction_balance_trace: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for BlockBalanceTrace {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"BlockBalanceTrace\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for BlockBalanceTrace {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for BlockBalanceTrace {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `BlockBalanceTrace`\npub mod block_balance_trace {\n    // @@protoc_insertion_point(message:protocol.BlockBalanceTrace.BlockIdentifier)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct BlockIdentifier {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.BlockBalanceTrace.BlockIdentifier.hash)\n        pub hash: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.BlockBalanceTrace.BlockIdentifier.number)\n        pub number: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.BlockBalanceTrace.BlockIdentifier.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a BlockIdentifier {\n        fn default() -> &'a BlockIdentifier {\n            <BlockIdentifier as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl BlockIdentifier {\n        pub fn new() -> BlockIdentifier {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"hash\",\n                |m: &BlockIdentifier| { &m.hash },\n                |m: &mut BlockIdentifier| { &mut m.hash },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"number\",\n                |m: &BlockIdentifier| { &m.number },\n                |m: &mut BlockIdentifier| { &mut m.number },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BlockIdentifier>(\n                \"BlockBalanceTrace.BlockIdentifier\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for BlockIdentifier {\n        const NAME: &'static str = \"BlockIdentifier\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.hash = is.read_bytes()?;\n                    },\n                    16 => {\n                        self.number = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.hash.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.hash);\n            }\n            if self.number != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.number);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.hash.is_empty() {\n                os.write_bytes(1, &self.hash)?;\n            }\n            if self.number != 0 {\n                os.write_int64(2, self.number)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> BlockIdentifier {\n            BlockIdentifier::new()\n        }\n\n        fn clear(&mut self) {\n            self.hash.clear();\n            self.number = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static BlockIdentifier {\n            static instance: BlockIdentifier = BlockIdentifier {\n                hash: ::std::vec::Vec::new(),\n                number: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for BlockIdentifier {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"BlockBalanceTrace.BlockIdentifier\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for BlockIdentifier {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for BlockIdentifier {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.AccountTrace)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountTrace {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountTrace.balance)\n    pub balance: i64,\n    // @@protoc_insertion_point(field:protocol.AccountTrace.placeholder)\n    pub placeholder: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountTrace.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountTrace {\n    fn default() -> &'a AccountTrace {\n        <AccountTrace as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountTrace {\n    pub fn new() -> AccountTrace {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"balance\",\n            |m: &AccountTrace| { &m.balance },\n            |m: &mut AccountTrace| { &mut m.balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"placeholder\",\n            |m: &AccountTrace| { &m.placeholder },\n            |m: &mut AccountTrace| { &mut m.placeholder },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountTrace>(\n            \"AccountTrace\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountTrace {\n    const NAME: &'static str = \"AccountTrace\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.balance = is.read_int64()?;\n                },\n                792 => {\n                    self.placeholder = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.balance != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.balance);\n        }\n        if self.placeholder != 0 {\n            my_size += ::protobuf::rt::int64_size(99, self.placeholder);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.balance != 0 {\n            os.write_int64(1, self.balance)?;\n        }\n        if self.placeholder != 0 {\n            os.write_int64(99, self.placeholder)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountTrace {\n        AccountTrace::new()\n    }\n\n    fn clear(&mut self) {\n        self.balance = 0;\n        self.placeholder = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountTrace {\n        static instance: AccountTrace = AccountTrace {\n            balance: 0,\n            placeholder: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountTrace {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountTrace\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountTrace {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountTrace {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.AccountIdentifier)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountIdentifier {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountIdentifier.address)\n    pub address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountIdentifier.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountIdentifier {\n    fn default() -> &'a AccountIdentifier {\n        <AccountIdentifier as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountIdentifier {\n    pub fn new() -> AccountIdentifier {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"address\",\n            |m: &AccountIdentifier| { &m.address },\n            |m: &mut AccountIdentifier| { &mut m.address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountIdentifier>(\n            \"AccountIdentifier\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountIdentifier {\n    const NAME: &'static str = \"AccountIdentifier\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.address.is_empty() {\n            os.write_bytes(1, &self.address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountIdentifier {\n        AccountIdentifier::new()\n    }\n\n    fn clear(&mut self) {\n        self.address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountIdentifier {\n        static instance: AccountIdentifier = AccountIdentifier {\n            address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountIdentifier {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountIdentifier\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountIdentifier {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountIdentifier {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.AccountBalanceRequest)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountBalanceRequest {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountBalanceRequest.account_identifier)\n    pub account_identifier: ::protobuf::MessageField<AccountIdentifier>,\n    // @@protoc_insertion_point(field:protocol.AccountBalanceRequest.block_identifier)\n    pub block_identifier: ::protobuf::MessageField<block_balance_trace::BlockIdentifier>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountBalanceRequest.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountBalanceRequest {\n    fn default() -> &'a AccountBalanceRequest {\n        <AccountBalanceRequest as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountBalanceRequest {\n    pub fn new() -> AccountBalanceRequest {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, AccountIdentifier>(\n            \"account_identifier\",\n            |m: &AccountBalanceRequest| { &m.account_identifier },\n            |m: &mut AccountBalanceRequest| { &mut m.account_identifier },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, block_balance_trace::BlockIdentifier>(\n            \"block_identifier\",\n            |m: &AccountBalanceRequest| { &m.block_identifier },\n            |m: &mut AccountBalanceRequest| { &mut m.block_identifier },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountBalanceRequest>(\n            \"AccountBalanceRequest\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountBalanceRequest {\n    const NAME: &'static str = \"AccountBalanceRequest\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.account_identifier)?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.block_identifier)?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.account_identifier.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.block_identifier.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.account_identifier.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if let Some(v) = self.block_identifier.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountBalanceRequest {\n        AccountBalanceRequest::new()\n    }\n\n    fn clear(&mut self) {\n        self.account_identifier.clear();\n        self.block_identifier.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountBalanceRequest {\n        static instance: AccountBalanceRequest = AccountBalanceRequest {\n            account_identifier: ::protobuf::MessageField::none(),\n            block_identifier: ::protobuf::MessageField::none(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountBalanceRequest {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountBalanceRequest\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountBalanceRequest {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountBalanceRequest {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.AccountBalanceResponse)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AccountBalanceResponse {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AccountBalanceResponse.balance)\n    pub balance: i64,\n    // @@protoc_insertion_point(field:protocol.AccountBalanceResponse.block_identifier)\n    pub block_identifier: ::protobuf::MessageField<block_balance_trace::BlockIdentifier>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AccountBalanceResponse.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AccountBalanceResponse {\n    fn default() -> &'a AccountBalanceResponse {\n        <AccountBalanceResponse as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AccountBalanceResponse {\n    pub fn new() -> AccountBalanceResponse {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"balance\",\n            |m: &AccountBalanceResponse| { &m.balance },\n            |m: &mut AccountBalanceResponse| { &mut m.balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, block_balance_trace::BlockIdentifier>(\n            \"block_identifier\",\n            |m: &AccountBalanceResponse| { &m.block_identifier },\n            |m: &mut AccountBalanceResponse| { &mut m.block_identifier },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AccountBalanceResponse>(\n            \"AccountBalanceResponse\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AccountBalanceResponse {\n    const NAME: &'static str = \"AccountBalanceResponse\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.balance = is.read_int64()?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.block_identifier)?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.balance != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.balance);\n        }\n        if let Some(v) = self.block_identifier.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.balance != 0 {\n            os.write_int64(1, self.balance)?;\n        }\n        if let Some(v) = self.block_identifier.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AccountBalanceResponse {\n        AccountBalanceResponse::new()\n    }\n\n    fn clear(&mut self) {\n        self.balance = 0;\n        self.block_identifier.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AccountBalanceResponse {\n        static instance: AccountBalanceResponse = AccountBalanceResponse {\n            balance: 0,\n            block_identifier: ::protobuf::MessageField::none(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AccountBalanceResponse {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AccountBalanceResponse\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AccountBalanceResponse {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AccountBalanceResponse {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.FreezeBalanceV2Contract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct FreezeBalanceV2Contract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceV2Contract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceV2Contract.frozen_balance)\n    pub frozen_balance: i64,\n    // @@protoc_insertion_point(field:protocol.FreezeBalanceV2Contract.resource)\n    pub resource: ::protobuf::EnumOrUnknown<super::common::ResourceCode>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.FreezeBalanceV2Contract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a FreezeBalanceV2Contract {\n    fn default() -> &'a FreezeBalanceV2Contract {\n        <FreezeBalanceV2Contract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl FreezeBalanceV2Contract {\n    pub fn new() -> FreezeBalanceV2Contract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &FreezeBalanceV2Contract| { &m.owner_address },\n            |m: &mut FreezeBalanceV2Contract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"frozen_balance\",\n            |m: &FreezeBalanceV2Contract| { &m.frozen_balance },\n            |m: &mut FreezeBalanceV2Contract| { &mut m.frozen_balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resource\",\n            |m: &FreezeBalanceV2Contract| { &m.resource },\n            |m: &mut FreezeBalanceV2Contract| { &mut m.resource },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<FreezeBalanceV2Contract>(\n            \"FreezeBalanceV2Contract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for FreezeBalanceV2Contract {\n    const NAME: &'static str = \"FreezeBalanceV2Contract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.frozen_balance = is.read_int64()?;\n                },\n                24 => {\n                    self.resource = is.read_enum_or_unknown()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.frozen_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.frozen_balance);\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            my_size += ::protobuf::rt::int32_size(3, self.resource.value());\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.frozen_balance != 0 {\n            os.write_int64(2, self.frozen_balance)?;\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            os.write_enum(3, ::protobuf::EnumOrUnknown::value(&self.resource))?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> FreezeBalanceV2Contract {\n        FreezeBalanceV2Contract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.frozen_balance = 0;\n        self.resource = ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH);\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static FreezeBalanceV2Contract {\n        static instance: FreezeBalanceV2Contract = FreezeBalanceV2Contract {\n            owner_address: ::std::vec::Vec::new(),\n            frozen_balance: 0,\n            resource: ::protobuf::EnumOrUnknown::from_i32(0),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for FreezeBalanceV2Contract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"FreezeBalanceV2Contract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for FreezeBalanceV2Contract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for FreezeBalanceV2Contract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UnfreezeBalanceV2Contract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UnfreezeBalanceV2Contract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UnfreezeBalanceV2Contract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UnfreezeBalanceV2Contract.unfreeze_balance)\n    pub unfreeze_balance: i64,\n    // @@protoc_insertion_point(field:protocol.UnfreezeBalanceV2Contract.resource)\n    pub resource: ::protobuf::EnumOrUnknown<super::common::ResourceCode>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UnfreezeBalanceV2Contract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UnfreezeBalanceV2Contract {\n    fn default() -> &'a UnfreezeBalanceV2Contract {\n        <UnfreezeBalanceV2Contract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UnfreezeBalanceV2Contract {\n    pub fn new() -> UnfreezeBalanceV2Contract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UnfreezeBalanceV2Contract| { &m.owner_address },\n            |m: &mut UnfreezeBalanceV2Contract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"unfreeze_balance\",\n            |m: &UnfreezeBalanceV2Contract| { &m.unfreeze_balance },\n            |m: &mut UnfreezeBalanceV2Contract| { &mut m.unfreeze_balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resource\",\n            |m: &UnfreezeBalanceV2Contract| { &m.resource },\n            |m: &mut UnfreezeBalanceV2Contract| { &mut m.resource },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UnfreezeBalanceV2Contract>(\n            \"UnfreezeBalanceV2Contract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UnfreezeBalanceV2Contract {\n    const NAME: &'static str = \"UnfreezeBalanceV2Contract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.unfreeze_balance = is.read_int64()?;\n                },\n                24 => {\n                    self.resource = is.read_enum_or_unknown()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.unfreeze_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.unfreeze_balance);\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            my_size += ::protobuf::rt::int32_size(3, self.resource.value());\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.unfreeze_balance != 0 {\n            os.write_int64(2, self.unfreeze_balance)?;\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            os.write_enum(3, ::protobuf::EnumOrUnknown::value(&self.resource))?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UnfreezeBalanceV2Contract {\n        UnfreezeBalanceV2Contract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.unfreeze_balance = 0;\n        self.resource = ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH);\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UnfreezeBalanceV2Contract {\n        static instance: UnfreezeBalanceV2Contract = UnfreezeBalanceV2Contract {\n            owner_address: ::std::vec::Vec::new(),\n            unfreeze_balance: 0,\n            resource: ::protobuf::EnumOrUnknown::from_i32(0),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UnfreezeBalanceV2Contract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UnfreezeBalanceV2Contract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UnfreezeBalanceV2Contract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UnfreezeBalanceV2Contract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.WithdrawExpireUnfreezeContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct WithdrawExpireUnfreezeContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.WithdrawExpireUnfreezeContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.WithdrawExpireUnfreezeContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a WithdrawExpireUnfreezeContract {\n    fn default() -> &'a WithdrawExpireUnfreezeContract {\n        <WithdrawExpireUnfreezeContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl WithdrawExpireUnfreezeContract {\n    pub fn new() -> WithdrawExpireUnfreezeContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &WithdrawExpireUnfreezeContract| { &m.owner_address },\n            |m: &mut WithdrawExpireUnfreezeContract| { &mut m.owner_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WithdrawExpireUnfreezeContract>(\n            \"WithdrawExpireUnfreezeContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for WithdrawExpireUnfreezeContract {\n    const NAME: &'static str = \"WithdrawExpireUnfreezeContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> WithdrawExpireUnfreezeContract {\n        WithdrawExpireUnfreezeContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static WithdrawExpireUnfreezeContract {\n        static instance: WithdrawExpireUnfreezeContract = WithdrawExpireUnfreezeContract {\n            owner_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for WithdrawExpireUnfreezeContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"WithdrawExpireUnfreezeContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for WithdrawExpireUnfreezeContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for WithdrawExpireUnfreezeContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.DelegateResourceContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct DelegateResourceContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.DelegateResourceContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.DelegateResourceContract.resource)\n    pub resource: ::protobuf::EnumOrUnknown<super::common::ResourceCode>,\n    // @@protoc_insertion_point(field:protocol.DelegateResourceContract.balance)\n    pub balance: i64,\n    // @@protoc_insertion_point(field:protocol.DelegateResourceContract.receiver_address)\n    pub receiver_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.DelegateResourceContract.lock)\n    pub lock: bool,\n    // @@protoc_insertion_point(field:protocol.DelegateResourceContract.lock_period)\n    pub lock_period: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.DelegateResourceContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a DelegateResourceContract {\n    fn default() -> &'a DelegateResourceContract {\n        <DelegateResourceContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl DelegateResourceContract {\n    pub fn new() -> DelegateResourceContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(6);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &DelegateResourceContract| { &m.owner_address },\n            |m: &mut DelegateResourceContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resource\",\n            |m: &DelegateResourceContract| { &m.resource },\n            |m: &mut DelegateResourceContract| { &mut m.resource },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"balance\",\n            |m: &DelegateResourceContract| { &m.balance },\n            |m: &mut DelegateResourceContract| { &mut m.balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"receiver_address\",\n            |m: &DelegateResourceContract| { &m.receiver_address },\n            |m: &mut DelegateResourceContract| { &mut m.receiver_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"lock\",\n            |m: &DelegateResourceContract| { &m.lock },\n            |m: &mut DelegateResourceContract| { &mut m.lock },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"lock_period\",\n            |m: &DelegateResourceContract| { &m.lock_period },\n            |m: &mut DelegateResourceContract| { &mut m.lock_period },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<DelegateResourceContract>(\n            \"DelegateResourceContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for DelegateResourceContract {\n    const NAME: &'static str = \"DelegateResourceContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.resource = is.read_enum_or_unknown()?;\n                },\n                24 => {\n                    self.balance = is.read_int64()?;\n                },\n                34 => {\n                    self.receiver_address = is.read_bytes()?;\n                },\n                40 => {\n                    self.lock = is.read_bool()?;\n                },\n                48 => {\n                    self.lock_period = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            my_size += ::protobuf::rt::int32_size(2, self.resource.value());\n        }\n        if self.balance != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.balance);\n        }\n        if !self.receiver_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.receiver_address);\n        }\n        if self.lock != false {\n            my_size += 1 + 1;\n        }\n        if self.lock_period != 0 {\n            my_size += ::protobuf::rt::int64_size(6, self.lock_period);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            os.write_enum(2, ::protobuf::EnumOrUnknown::value(&self.resource))?;\n        }\n        if self.balance != 0 {\n            os.write_int64(3, self.balance)?;\n        }\n        if !self.receiver_address.is_empty() {\n            os.write_bytes(4, &self.receiver_address)?;\n        }\n        if self.lock != false {\n            os.write_bool(5, self.lock)?;\n        }\n        if self.lock_period != 0 {\n            os.write_int64(6, self.lock_period)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> DelegateResourceContract {\n        DelegateResourceContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.resource = ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH);\n        self.balance = 0;\n        self.receiver_address.clear();\n        self.lock = false;\n        self.lock_period = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static DelegateResourceContract {\n        static instance: DelegateResourceContract = DelegateResourceContract {\n            owner_address: ::std::vec::Vec::new(),\n            resource: ::protobuf::EnumOrUnknown::from_i32(0),\n            balance: 0,\n            receiver_address: ::std::vec::Vec::new(),\n            lock: false,\n            lock_period: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for DelegateResourceContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"DelegateResourceContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for DelegateResourceContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for DelegateResourceContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UnDelegateResourceContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UnDelegateResourceContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UnDelegateResourceContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UnDelegateResourceContract.resource)\n    pub resource: ::protobuf::EnumOrUnknown<super::common::ResourceCode>,\n    // @@protoc_insertion_point(field:protocol.UnDelegateResourceContract.balance)\n    pub balance: i64,\n    // @@protoc_insertion_point(field:protocol.UnDelegateResourceContract.receiver_address)\n    pub receiver_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UnDelegateResourceContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UnDelegateResourceContract {\n    fn default() -> &'a UnDelegateResourceContract {\n        <UnDelegateResourceContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UnDelegateResourceContract {\n    pub fn new() -> UnDelegateResourceContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UnDelegateResourceContract| { &m.owner_address },\n            |m: &mut UnDelegateResourceContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"resource\",\n            |m: &UnDelegateResourceContract| { &m.resource },\n            |m: &mut UnDelegateResourceContract| { &mut m.resource },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"balance\",\n            |m: &UnDelegateResourceContract| { &m.balance },\n            |m: &mut UnDelegateResourceContract| { &mut m.balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"receiver_address\",\n            |m: &UnDelegateResourceContract| { &m.receiver_address },\n            |m: &mut UnDelegateResourceContract| { &mut m.receiver_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UnDelegateResourceContract>(\n            \"UnDelegateResourceContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UnDelegateResourceContract {\n    const NAME: &'static str = \"UnDelegateResourceContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.resource = is.read_enum_or_unknown()?;\n                },\n                24 => {\n                    self.balance = is.read_int64()?;\n                },\n                34 => {\n                    self.receiver_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            my_size += ::protobuf::rt::int32_size(2, self.resource.value());\n        }\n        if self.balance != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.balance);\n        }\n        if !self.receiver_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.receiver_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.resource != ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH) {\n            os.write_enum(2, ::protobuf::EnumOrUnknown::value(&self.resource))?;\n        }\n        if self.balance != 0 {\n            os.write_int64(3, self.balance)?;\n        }\n        if !self.receiver_address.is_empty() {\n            os.write_bytes(4, &self.receiver_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UnDelegateResourceContract {\n        UnDelegateResourceContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.resource = ::protobuf::EnumOrUnknown::new(super::common::ResourceCode::BANDWIDTH);\n        self.balance = 0;\n        self.receiver_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UnDelegateResourceContract {\n        static instance: UnDelegateResourceContract = UnDelegateResourceContract {\n            owner_address: ::std::vec::Vec::new(),\n            resource: ::protobuf::EnumOrUnknown::from_i32(0),\n            balance: 0,\n            receiver_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UnDelegateResourceContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UnDelegateResourceContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UnDelegateResourceContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UnDelegateResourceContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.CancelAllUnfreezeV2Contract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct CancelAllUnfreezeV2Contract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.CancelAllUnfreezeV2Contract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.CancelAllUnfreezeV2Contract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a CancelAllUnfreezeV2Contract {\n    fn default() -> &'a CancelAllUnfreezeV2Contract {\n        <CancelAllUnfreezeV2Contract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl CancelAllUnfreezeV2Contract {\n    pub fn new() -> CancelAllUnfreezeV2Contract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &CancelAllUnfreezeV2Contract| { &m.owner_address },\n            |m: &mut CancelAllUnfreezeV2Contract| { &mut m.owner_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<CancelAllUnfreezeV2Contract>(\n            \"CancelAllUnfreezeV2Contract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for CancelAllUnfreezeV2Contract {\n    const NAME: &'static str = \"CancelAllUnfreezeV2Contract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> CancelAllUnfreezeV2Contract {\n        CancelAllUnfreezeV2Contract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static CancelAllUnfreezeV2Contract {\n        static instance: CancelAllUnfreezeV2Contract = CancelAllUnfreezeV2Contract {\n            owner_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for CancelAllUnfreezeV2Contract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"CancelAllUnfreezeV2Contract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for CancelAllUnfreezeV2Contract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for CancelAllUnfreezeV2Contract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n$core/contract/balance_contract.proto\\x12\\x08protocol\\x1a\\x1acore/cont\\\n    ract/common.proto\\\"\\xeb\\x01\\n\\x15FreezeBalanceContract\\x12#\\n\\rowner_add\\\n    ress\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12%\\n\\x0efrozen_balance\\x18\\\n    \\x02\\x20\\x01(\\x03R\\rfrozenBalance\\x12'\\n\\x0ffrozen_duration\\x18\\x03\\x20\\\n    \\x01(\\x03R\\x0efrozenDuration\\x122\\n\\x08resource\\x18\\n\\x20\\x01(\\x0e2\\x16.\\\n    protocol.ResourceCodeR\\x08resource\\x12)\\n\\x10receiver_address\\x18\\x0f\\\n    \\x20\\x01(\\x0cR\\x0freceiverAddress\\\"\\x9d\\x01\\n\\x17UnfreezeBalanceContract\\\n    \\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x122\\n\\x08r\\\n    esource\\x18\\n\\x20\\x01(\\x0e2\\x16.protocol.ResourceCodeR\\x08resource\\x12)\\\n    \\n\\x10receiver_address\\x18\\x0f\\x20\\x01(\\x0cR\\x0freceiverAddress\\\">\\n\\x17\\\n    WithdrawBalanceContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0co\\\n    wnerAddress\\\"n\\n\\x10TransferContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\\n    \\x01(\\x0cR\\x0cownerAddress\\x12\\x1d\\n\\nto_address\\x18\\x02\\x20\\x01(\\x0cR\\t\\\n    toAddress\\x12\\x16\\n\\x06amount\\x18\\x03\\x20\\x01(\\x03R\\x06amount\\\"\\xb9\\x02\\\n    \\n\\x17TransactionBalanceTrace\\x125\\n\\x16transaction_identifier\\x18\\x01\\\n    \\x20\\x01(\\x0cR\\x15transactionIdentifier\\x12I\\n\\toperation\\x18\\x02\\x20\\\n    \\x03(\\x0b2+.protocol.TransactionBalanceTrace.OperationR\\toperation\\x12\\\n    \\x12\\n\\x04type\\x18\\x03\\x20\\x01(\\tR\\x04type\\x12\\x16\\n\\x06status\\x18\\x04\\\n    \\x20\\x01(\\tR\\x06status\\x1ap\\n\\tOperation\\x121\\n\\x14operation_identifier\\\n    \\x18\\x01\\x20\\x01(\\x03R\\x13operationIdentifier\\x12\\x18\\n\\x07address\\x18\\\n    \\x02\\x20\\x01(\\x0cR\\x07address\\x12\\x16\\n\\x06amount\\x18\\x03\\x20\\x01(\\x03R\\\n    \\x06amount\\\"\\xa7\\x02\\n\\x11BlockBalanceTrace\\x12V\\n\\x10block_identifier\\\n    \\x18\\x01\\x20\\x01(\\x0b2+.protocol.BlockBalanceTrace.BlockIdentifierR\\x0fb\\\n    lockIdentifier\\x12\\x1c\\n\\ttimestamp\\x18\\x02\\x20\\x01(\\x03R\\ttimestamp\\x12\\\n    ]\\n\\x19transaction_balance_trace\\x18\\x03\\x20\\x03(\\x0b2!.protocol.Transac\\\n    tionBalanceTraceR\\x17transactionBalanceTrace\\x1a=\\n\\x0fBlockIdentifier\\\n    \\x12\\x12\\n\\x04hash\\x18\\x01\\x20\\x01(\\x0cR\\x04hash\\x12\\x16\\n\\x06number\\x18\\\n    \\x02\\x20\\x01(\\x03R\\x06number\\\"J\\n\\x0cAccountTrace\\x12\\x18\\n\\x07balance\\\n    \\x18\\x01\\x20\\x01(\\x03R\\x07balance\\x12\\x20\\n\\x0bplaceholder\\x18c\\x20\\x01(\\\n    \\x03R\\x0bplaceholder\\\"-\\n\\x11AccountIdentifier\\x12\\x18\\n\\x07address\\x18\\\n    \\x01\\x20\\x01(\\x0cR\\x07address\\\"\\xbb\\x01\\n\\x15AccountBalanceRequest\\x12J\\\n    \\n\\x12account_identifier\\x18\\x01\\x20\\x01(\\x0b2\\x1b.protocol.AccountIdent\\\n    ifierR\\x11accountIdentifier\\x12V\\n\\x10block_identifier\\x18\\x02\\x20\\x01(\\\n    \\x0b2+.protocol.BlockBalanceTrace.BlockIdentifierR\\x0fblockIdentifier\\\"\\\n    \\x8a\\x01\\n\\x16AccountBalanceResponse\\x12\\x18\\n\\x07balance\\x18\\x01\\x20\\\n    \\x01(\\x03R\\x07balance\\x12V\\n\\x10block_identifier\\x18\\x02\\x20\\x01(\\x0b2+.\\\n    protocol.BlockBalanceTrace.BlockIdentifierR\\x0fblockIdentifier\\\"\\x99\\x01\\\n    \\n\\x17FreezeBalanceV2Contract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0c\\\n    R\\x0cownerAddress\\x12%\\n\\x0efrozen_balance\\x18\\x02\\x20\\x01(\\x03R\\rfrozen\\\n    Balance\\x122\\n\\x08resource\\x18\\x03\\x20\\x01(\\x0e2\\x16.protocol.ResourceCo\\\n    deR\\x08resource\\\"\\x9f\\x01\\n\\x19UnfreezeBalanceV2Contract\\x12#\\n\\rowner_a\\\n    ddress\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12)\\n\\x10unfreeze_balance\\\n    \\x18\\x02\\x20\\x01(\\x03R\\x0funfreezeBalance\\x122\\n\\x08resource\\x18\\x03\\x20\\\n    \\x01(\\x0e2\\x16.protocol.ResourceCodeR\\x08resource\\\"E\\n\\x1eWithdrawExpire\\\n    UnfreezeContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAdd\\\n    ress\\\"\\xed\\x01\\n\\x18DelegateResourceContract\\x12#\\n\\rowner_address\\x18\\\n    \\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x122\\n\\x08resource\\x18\\x02\\x20\\x01(\\\n    \\x0e2\\x16.protocol.ResourceCodeR\\x08resource\\x12\\x18\\n\\x07balance\\x18\\\n    \\x03\\x20\\x01(\\x03R\\x07balance\\x12)\\n\\x10receiver_address\\x18\\x04\\x20\\x01\\\n    (\\x0cR\\x0freceiverAddress\\x12\\x12\\n\\x04lock\\x18\\x05\\x20\\x01(\\x08R\\x04loc\\\n    k\\x12\\x1f\\n\\x0block_period\\x18\\x06\\x20\\x01(\\x03R\\nlockPeriod\\\"\\xba\\x01\\n\\\n    \\x1aUnDelegateResourceContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\\n    \\x0cR\\x0cownerAddress\\x122\\n\\x08resource\\x18\\x02\\x20\\x01(\\x0e2\\x16.proto\\\n    col.ResourceCodeR\\x08resource\\x12\\x18\\n\\x07balance\\x18\\x03\\x20\\x01(\\x03R\\\n    \\x07balance\\x12)\\n\\x10receiver_address\\x18\\x04\\x20\\x01(\\x0cR\\x0freceiver\\\n    Address\\\"B\\n\\x1bCancelAllUnfreezeV2Contract\\x12#\\n\\rowner_address\\x18\\\n    \\x01\\x20\\x01(\\x0cR\\x0cownerAddressBE\\n\\x18org.tron.protos.contractZ)gith\\\n    ub.com/tronprotocol/grpc-gateway/coreJ\\xb1\\x1b\\n\\x06\\x12\\x04\\0\\0u\\x01\\n\\\n    \\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\\n    \\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\x03\\x04\\01\\\"=Specify\\x20the\\\n    \\x20name\\x20of\\x20the\\x20package\\x20that\\x20generated\\x20the\\x20Java\\x20\\\n    file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\nv\\n\\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\\n    \\x1akoption\\x20java_outer_classname\\x20=\\x20\\\"FreezeBalanceContract\\\";\\\n    \\x20//Specify\\x20the\\x20class\\x20name\\x20of\\x20the\\x20generated\\x20Java\\\n    \\x20file\\n\\n\\t\\n\\x02\\x03\\0\\x12\\x03\\x08\\0$\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\n\\0\\\n    \\x11\\x01\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\n\\x08\\x1d\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\\n    \\x12\\x03\\x0b\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\x0b\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\0\\x01\\x12\\x03\\x0b\\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\\n    \\x03\\x12\\x03\\x0b\\x18\\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\x0c\\x02\\x1b\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x01\\x05\\x12\\x03\\x0c\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x01\\x01\\x12\\x03\\x0c\\x08\\x16\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\x0c\\\n    \\x19\\x1a\\n\\x0b\\n\\x04\\x04\\0\\x02\\x02\\x12\\x03\\r\\x02\\x1c\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x02\\x05\\x12\\x03\\r\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\r\\\n    \\x08\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x03\\x12\\x03\\r\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\\n    \\0\\x02\\x03\\x12\\x03\\x0f\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x06\\x12\\x03\\x0f\\\n    \\x02\\x0e\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x01\\x12\\x03\\x0f\\x0f\\x17\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\x03\\x03\\x12\\x03\\x0f\\x1a\\x1c\\n\\x0b\\n\\x04\\x04\\0\\x02\\x04\\x12\\x03\\\n    \\x10\\x02\\x1e\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x05\\x12\\x03\\x10\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x04\\x01\\x12\\x03\\x10\\x08\\x18\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x03\\\n    \\x12\\x03\\x10\\x1b\\x1d\\n\\n\\n\\x02\\x04\\x01\\x12\\x04\\x14\\0\\x19\\x01\\n\\n\\n\\x03\\\n    \\x04\\x01\\x01\\x12\\x03\\x14\\x08\\x1f\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x15\\\n    \\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x05\\x12\\x03\\x15\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\x01\\x02\\0\\x01\\x12\\x03\\x15\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\\n    \\x03\\x15\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x01\\x12\\x03\\x17\\x02\\x1d\\n\\x0c\\n\\\n    \\x05\\x04\\x01\\x02\\x01\\x06\\x12\\x03\\x17\\x02\\x0e\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\\n    \\x01\\x12\\x03\\x17\\x0f\\x17\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\x17\\x1a\\\n    \\x1c\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x02\\x12\\x03\\x18\\x02\\x1e\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\x02\\x05\\x12\\x03\\x18\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x01\\x12\\x03\\\n    \\x18\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x03\\x12\\x03\\x18\\x1b\\x1d\\n\\n\\n\\\n    \\x02\\x04\\x02\\x12\\x04\\x1b\\0\\x1d\\x01\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\x1b\\x08\\\n    \\x1f\\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03\\x1c\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\\n    \\x02\\0\\x05\\x12\\x03\\x1c\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\x1c\\\n    \\x08\\x15\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\x12\\x03\\x1c\\x18\\x19\\n\\n\\n\\x02\\x04\\\n    \\x03\\x12\\x04\\x1f\\0#\\x01\\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x03\\x1f\\x08\\x18\\n\\x0b\\\n    \\n\\x04\\x04\\x03\\x02\\0\\x12\\x03\\x20\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x05\\\n    \\x12\\x03\\x20\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x01\\x12\\x03\\x20\\x08\\x15\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\x03\\x20\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x03\\x02\\\n    \\x01\\x12\\x03!\\x02\\x17\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x05\\x12\\x03!\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x03!\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x01\\x03\\x12\\x03!\\x15\\x16\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x02\\x12\\x03\\\"\\x02\\x13\\\n    \\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x05\\x12\\x03\\\"\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\\n    \\x02\\x02\\x01\\x12\\x03\\\"\\x08\\x0e\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x03\\x12\\x03\\\"\\\n    \\x11\\x12\\n\\n\\n\\x02\\x04\\x04\\x12\\x04%\\00\\x01\\n\\n\\n\\x03\\x04\\x04\\x01\\x12\\x03\\\n    %\\x08\\x1f\\n\\x0c\\n\\x04\\x04\\x04\\x03\\0\\x12\\x04&\\x02*\\x03\\n\\x0c\\n\\x05\\x04\\\n    \\x04\\x03\\0\\x01\\x12\\x03&\\n\\x13\\n\\r\\n\\x06\\x04\\x04\\x03\\0\\x02\\0\\x12\\x03'\\x04\\\n    #\\n\\x0e\\n\\x07\\x04\\x04\\x03\\0\\x02\\0\\x05\\x12\\x03'\\x04\\t\\n\\x0e\\n\\x07\\x04\\x04\\\n    \\x03\\0\\x02\\0\\x01\\x12\\x03'\\n\\x1e\\n\\x0e\\n\\x07\\x04\\x04\\x03\\0\\x02\\0\\x03\\x12\\\n    \\x03'!\\\"\\n\\r\\n\\x06\\x04\\x04\\x03\\0\\x02\\x01\\x12\\x03(\\x04\\x16\\n\\x0e\\n\\x07\\\n    \\x04\\x04\\x03\\0\\x02\\x01\\x05\\x12\\x03(\\x04\\t\\n\\x0e\\n\\x07\\x04\\x04\\x03\\0\\x02\\\n    \\x01\\x01\\x12\\x03(\\n\\x11\\n\\x0e\\n\\x07\\x04\\x04\\x03\\0\\x02\\x01\\x03\\x12\\x03(\\\n    \\x14\\x15\\n\\r\\n\\x06\\x04\\x04\\x03\\0\\x02\\x02\\x12\\x03)\\x04\\x15\\n\\x0e\\n\\x07\\\n    \\x04\\x04\\x03\\0\\x02\\x02\\x05\\x12\\x03)\\x04\\t\\n\\x0e\\n\\x07\\x04\\x04\\x03\\0\\x02\\\n    \\x02\\x01\\x12\\x03)\\n\\x10\\n\\x0e\\n\\x07\\x04\\x04\\x03\\0\\x02\\x02\\x03\\x12\\x03)\\\n    \\x13\\x14\\n\\x0b\\n\\x04\\x04\\x04\\x02\\0\\x12\\x03,\\x02#\\n\\x0c\\n\\x05\\x04\\x04\\x02\\\n    \\0\\x05\\x12\\x03,\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x01\\x12\\x03,\\x08\\x1e\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\0\\x03\\x12\\x03,!\\\"\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x01\\x12\\\n    \\x03-\\x02#\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x04\\x12\\x03-\\x02\\n\\n\\x0c\\n\\x05\\\n    \\x04\\x04\\x02\\x01\\x06\\x12\\x03-\\x0b\\x14\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x01\\\n    \\x12\\x03-\\x15\\x1e\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x03\\x12\\x03-!\\\"\\n\\x0b\\n\\\n    \\x04\\x04\\x04\\x02\\x02\\x12\\x03.\\x02\\x12\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\x05\\\n    \\x12\\x03.\\x02\\x08\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x02\\x01\\x12\\x03.\\t\\r\\n\\x0c\\n\\\n    \\x05\\x04\\x04\\x02\\x02\\x03\\x12\\x03.\\x10\\x11\\n\\x0b\\n\\x04\\x04\\x04\\x02\\x03\\\n    \\x12\\x03/\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x03\\x05\\x12\\x03/\\x02\\x08\\n\\x0c\\\n    \\n\\x05\\x04\\x04\\x02\\x03\\x01\\x12\\x03/\\t\\x0f\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x03\\\n    \\x03\\x12\\x03/\\x12\\x13\\n\\n\\n\\x02\\x04\\x05\\x12\\x044\\0>\\x01\\n\\n\\n\\x03\\x04\\\n    \\x05\\x01\\x12\\x034\\x08\\x19\\n\\x0c\\n\\x04\\x04\\x05\\x03\\0\\x12\\x045\\x028\\x03\\n\\\n    \\x0c\\n\\x05\\x04\\x05\\x03\\0\\x01\\x12\\x035\\n\\x19\\n\\r\\n\\x06\\x04\\x05\\x03\\0\\x02\\\n    \\0\\x12\\x036\\x04\\x13\\n\\x0e\\n\\x07\\x04\\x05\\x03\\0\\x02\\0\\x05\\x12\\x036\\x04\\t\\n\\\n    \\x0e\\n\\x07\\x04\\x05\\x03\\0\\x02\\0\\x01\\x12\\x036\\n\\x0e\\n\\x0e\\n\\x07\\x04\\x05\\\n    \\x03\\0\\x02\\0\\x03\\x12\\x036\\x11\\x12\\n\\r\\n\\x06\\x04\\x05\\x03\\0\\x02\\x01\\x12\\\n    \\x037\\x04\\x15\\n\\x0e\\n\\x07\\x04\\x05\\x03\\0\\x02\\x01\\x05\\x12\\x037\\x04\\t\\n\\x0e\\\n    \\n\\x07\\x04\\x05\\x03\\0\\x02\\x01\\x01\\x12\\x037\\n\\x10\\n\\x0e\\n\\x07\\x04\\x05\\x03\\\n    \\0\\x02\\x01\\x03\\x12\\x037\\x13\\x14\\n\\x0b\\n\\x04\\x04\\x05\\x02\\0\\x12\\x03:\\x02'\\\n    \\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x06\\x12\\x03:\\x02\\x11\\n\\x0c\\n\\x05\\x04\\x05\\x02\\\n    \\0\\x01\\x12\\x03:\\x12\\\"\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x03\\x12\\x03:%&\\n\\x0b\\n\\\n    \\x04\\x04\\x05\\x02\\x01\\x12\\x03;\\x02\\x16\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\x05\\\n    \\x12\\x03;\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\x01\\x12\\x03;\\x08\\x11\\n\\x0c\\\n    \\n\\x05\\x04\\x05\\x02\\x01\\x03\\x12\\x03;\\x14\\x15\\n<\\n\\x04\\x04\\x05\\x02\\x02\\x12\\\n    \\x03<\\x02A\\\"/\\x20\\x20BlockIdentifier\\x20parent_block_identifier\\x20=\\x20\\\n    4;\\n\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x04\\x12\\x03<\\x02\\n\\n\\x0c\\n\\x05\\x04\\x05\\\n    \\x02\\x02\\x06\\x12\\x03<\\x0b\\\"\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x01\\x12\\x03<#<\\n\\\n    \\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x03\\x12\\x03<?@\\n\\n\\n\\x02\\x04\\x06\\x12\\x04@\\0C\\\n    \\x01\\n\\n\\n\\x03\\x04\\x06\\x01\\x12\\x03@\\x08\\x14\\n\\x0b\\n\\x04\\x04\\x06\\x02\\0\\\n    \\x12\\x03A\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x05\\x12\\x03A\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x06\\x02\\0\\x01\\x12\\x03A\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x03\\\n    \\x12\\x03A\\x12\\x13\\n\\x0b\\n\\x04\\x04\\x06\\x02\\x01\\x12\\x03B\\x02\\x19\\n\\x0c\\n\\\n    \\x05\\x04\\x06\\x02\\x01\\x05\\x12\\x03B\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x01\\\n    \\x01\\x12\\x03B\\x08\\x13\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x01\\x03\\x12\\x03B\\x16\\x18\\n\\\n    \\n\\n\\x02\\x04\\x07\\x12\\x04E\\0G\\x01\\n\\n\\n\\x03\\x04\\x07\\x01\\x12\\x03E\\x08\\x19\\\n    \\n\\x0b\\n\\x04\\x04\\x07\\x02\\0\\x12\\x03F\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\\n    \\x05\\x12\\x03F\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x01\\x12\\x03F\\x08\\x0f\\n\\\n    \\x0c\\n\\x05\\x04\\x07\\x02\\0\\x03\\x12\\x03F\\x12\\x13\\n\\n\\n\\x02\\x04\\x08\\x12\\x04I\\\n    \\0L\\x01\\n\\n\\n\\x03\\x04\\x08\\x01\\x12\\x03I\\x08\\x1d\\n\\x0b\\n\\x04\\x04\\x08\\x02\\0\\\n    \\x12\\x03J\\x02+\\n\\x0c\\n\\x05\\x04\\x08\\x02\\0\\x06\\x12\\x03J\\x02\\x13\\n\\x0c\\n\\\n    \\x05\\x04\\x08\\x02\\0\\x01\\x12\\x03J\\x14&\\n\\x0c\\n\\x05\\x04\\x08\\x02\\0\\x03\\x12\\\n    \\x03J)*\\n\\x0b\\n\\x04\\x04\\x08\\x02\\x01\\x12\\x03K\\x029\\n\\x0c\\n\\x05\\x04\\x08\\\n    \\x02\\x01\\x06\\x12\\x03K\\x02#\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x01\\x01\\x12\\x03K$4\\n\\\n    \\x0c\\n\\x05\\x04\\x08\\x02\\x01\\x03\\x12\\x03K78\\n\\n\\n\\x02\\x04\\t\\x12\\x04N\\0Q\\\n    \\x01\\n\\n\\n\\x03\\x04\\t\\x01\\x12\\x03N\\x08\\x1e\\n\\x0b\\n\\x04\\x04\\t\\x02\\0\\x12\\\n    \\x03O\\x02\\x14\\n\\x0c\\n\\x05\\x04\\t\\x02\\0\\x05\\x12\\x03O\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\t\\x02\\0\\x01\\x12\\x03O\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\t\\x02\\0\\x03\\x12\\x03O\\\n    \\x12\\x13\\n\\x0b\\n\\x04\\x04\\t\\x02\\x01\\x12\\x03P\\x029\\n\\x0c\\n\\x05\\x04\\t\\x02\\\n    \\x01\\x06\\x12\\x03P\\x02#\\n\\x0c\\n\\x05\\x04\\t\\x02\\x01\\x01\\x12\\x03P$4\\n\\x0c\\n\\\n    \\x05\\x04\\t\\x02\\x01\\x03\\x12\\x03P78\\n\\n\\n\\x02\\x04\\n\\x12\\x04S\\0W\\x01\\n\\n\\n\\\n    \\x03\\x04\\n\\x01\\x12\\x03S\\x08\\x1f\\n\\x0b\\n\\x04\\x04\\n\\x02\\0\\x12\\x03T\\x02\\x1a\\\n    \\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\x05\\x12\\x03T\\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\\n    \\x01\\x12\\x03T\\x08\\x15\\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\x03\\x12\\x03T\\x18\\x19\\n\\x0b\\\n    \\n\\x04\\x04\\n\\x02\\x01\\x12\\x03U\\x02\\x1b\\n\\x0c\\n\\x05\\x04\\n\\x02\\x01\\x05\\x12\\\n    \\x03U\\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\x01\\x01\\x12\\x03U\\x08\\x16\\n\\x0c\\n\\x05\\\n    \\x04\\n\\x02\\x01\\x03\\x12\\x03U\\x19\\x1a\\n\\x0b\\n\\x04\\x04\\n\\x02\\x02\\x12\\x03V\\\n    \\x02\\x1c\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x06\\x12\\x03V\\x02\\x0e\\n\\x0c\\n\\x05\\x04\\\n    \\n\\x02\\x02\\x01\\x12\\x03V\\x0f\\x17\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x03\\x12\\x03V\\\n    \\x1a\\x1b\\n\\n\\n\\x02\\x04\\x0b\\x12\\x04Y\\0]\\x01\\n\\n\\n\\x03\\x04\\x0b\\x01\\x12\\x03\\\n    Y\\x08!\\n\\x0b\\n\\x04\\x04\\x0b\\x02\\0\\x12\\x03Z\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x0b\\\n    \\x02\\0\\x05\\x12\\x03Z\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\0\\x01\\x12\\x03Z\\x08\\\n    \\x15\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\0\\x03\\x12\\x03Z\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x0b\\\n    \\x02\\x01\\x12\\x03[\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\x01\\x05\\x12\\x03[\\x02\\\n    \\x07\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\x01\\x01\\x12\\x03[\\x08\\x18\\n\\x0c\\n\\x05\\x04\\\n    \\x0b\\x02\\x01\\x03\\x12\\x03[\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\x0b\\x02\\x02\\x12\\x03\\\\\\\n    \\x02\\x1c\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\x02\\x06\\x12\\x03\\\\\\x02\\x0e\\n\\x0c\\n\\x05\\\n    \\x04\\x0b\\x02\\x02\\x01\\x12\\x03\\\\\\x0f\\x17\\n\\x0c\\n\\x05\\x04\\x0b\\x02\\x02\\x03\\\n    \\x12\\x03\\\\\\x1a\\x1b\\n\\n\\n\\x02\\x04\\x0c\\x12\\x04_\\0a\\x01\\n\\n\\n\\x03\\x04\\x0c\\\n    \\x01\\x12\\x03_\\x08&\\n\\x0b\\n\\x04\\x04\\x0c\\x02\\0\\x12\\x03`\\x02\\x1a\\n\\x0c\\n\\\n    \\x05\\x04\\x0c\\x02\\0\\x05\\x12\\x03`\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x0c\\x02\\0\\x01\\\n    \\x12\\x03`\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x0c\\x02\\0\\x03\\x12\\x03`\\x18\\x19\\n\\n\\n\\\n    \\x02\\x04\\r\\x12\\x04c\\0j\\x01\\n\\n\\n\\x03\\x04\\r\\x01\\x12\\x03c\\x08\\x20\\n\\x0b\\n\\\n    \\x04\\x04\\r\\x02\\0\\x12\\x03d\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\r\\x02\\0\\x05\\x12\\x03d\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\r\\x02\\0\\x01\\x12\\x03d\\x08\\x15\\n\\x0c\\n\\x05\\x04\\r\\\n    \\x02\\0\\x03\\x12\\x03d\\x18\\x19\\n\\x0b\\n\\x04\\x04\\r\\x02\\x01\\x12\\x03e\\x02\\x1c\\n\\\n    \\x0c\\n\\x05\\x04\\r\\x02\\x01\\x06\\x12\\x03e\\x02\\x0e\\n\\x0c\\n\\x05\\x04\\r\\x02\\x01\\\n    \\x01\\x12\\x03e\\x0f\\x17\\n\\x0c\\n\\x05\\x04\\r\\x02\\x01\\x03\\x12\\x03e\\x1a\\x1b\\n\\\n    \\x0b\\n\\x04\\x04\\r\\x02\\x02\\x12\\x03f\\x02\\x14\\n\\x0c\\n\\x05\\x04\\r\\x02\\x02\\x05\\\n    \\x12\\x03f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\r\\x02\\x02\\x01\\x12\\x03f\\x08\\x0f\\n\\x0c\\n\\\n    \\x05\\x04\\r\\x02\\x02\\x03\\x12\\x03f\\x12\\x13\\n\\x0b\\n\\x04\\x04\\r\\x02\\x03\\x12\\\n    \\x03g\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\r\\x02\\x03\\x05\\x12\\x03g\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\r\\x02\\x03\\x01\\x12\\x03g\\x08\\x18\\n\\x0c\\n\\x05\\x04\\r\\x02\\x03\\x03\\x12\\\n    \\x03g\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\r\\x02\\x04\\x12\\x03h\\x02\\x11\\n\\x0c\\n\\x05\\x04\\\n    \\r\\x02\\x04\\x05\\x12\\x03h\\x02\\x06\\n\\x0c\\n\\x05\\x04\\r\\x02\\x04\\x01\\x12\\x03h\\\n    \\x08\\x0c\\n\\x0c\\n\\x05\\x04\\r\\x02\\x04\\x03\\x12\\x03h\\x0f\\x10\\n\\x0b\\n\\x04\\x04\\\n    \\r\\x02\\x05\\x12\\x03i\\x02\\x18\\n\\x0c\\n\\x05\\x04\\r\\x02\\x05\\x05\\x12\\x03i\\x02\\\n    \\x07\\n\\x0c\\n\\x05\\x04\\r\\x02\\x05\\x01\\x12\\x03i\\x08\\x13\\n\\x0c\\n\\x05\\x04\\r\\\n    \\x02\\x05\\x03\\x12\\x03i\\x16\\x17\\n\\n\\n\\x02\\x04\\x0e\\x12\\x04l\\0q\\x01\\n\\n\\n\\\n    \\x03\\x04\\x0e\\x01\\x12\\x03l\\x08\\\"\\n\\x0b\\n\\x04\\x04\\x0e\\x02\\0\\x12\\x03m\\x02\\\n    \\x1a\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\0\\x05\\x12\\x03m\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x0e\\\n    \\x02\\0\\x01\\x12\\x03m\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\0\\x03\\x12\\x03m\\x18\\\n    \\x19\\n\\x0b\\n\\x04\\x04\\x0e\\x02\\x01\\x12\\x03n\\x02\\x1c\\n\\x0c\\n\\x05\\x04\\x0e\\\n    \\x02\\x01\\x06\\x12\\x03n\\x02\\x0e\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\x01\\x01\\x12\\x03n\\\n    \\x0f\\x17\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\x01\\x03\\x12\\x03n\\x1a\\x1b\\n\\x0b\\n\\x04\\\n    \\x04\\x0e\\x02\\x02\\x12\\x03o\\x02\\x14\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\x02\\x05\\x12\\\n    \\x03o\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\x02\\x01\\x12\\x03o\\x08\\x0f\\n\\x0c\\n\\\n    \\x05\\x04\\x0e\\x02\\x02\\x03\\x12\\x03o\\x12\\x13\\n\\x0b\\n\\x04\\x04\\x0e\\x02\\x03\\\n    \\x12\\x03p\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\x03\\x05\\x12\\x03p\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x0e\\x02\\x03\\x01\\x12\\x03p\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x0e\\x02\\x03\\\n    \\x03\\x12\\x03p\\x1b\\x1c\\n\\n\\n\\x02\\x04\\x0f\\x12\\x04s\\0u\\x01\\n\\n\\n\\x03\\x04\\\n    \\x0f\\x01\\x12\\x03s\\x08#\\n\\x0b\\n\\x04\\x04\\x0f\\x02\\0\\x12\\x03t\\x02\\x1a\\n\\x0c\\\n    \\n\\x05\\x04\\x0f\\x02\\0\\x05\\x12\\x03t\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x0f\\x02\\0\\x01\\\n    \\x12\\x03t\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x0f\\x02\\0\\x03\\x12\\x03t\\x18\\x19b\\x06pro\\\n    to3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(1);\n            deps.push(super::common::file_descriptor().clone());\n            let mut messages = ::std::vec::Vec::with_capacity(18);\n            messages.push(FreezeBalanceContract::generated_message_descriptor_data());\n            messages.push(UnfreezeBalanceContract::generated_message_descriptor_data());\n            messages.push(WithdrawBalanceContract::generated_message_descriptor_data());\n            messages.push(TransferContract::generated_message_descriptor_data());\n            messages.push(TransactionBalanceTrace::generated_message_descriptor_data());\n            messages.push(BlockBalanceTrace::generated_message_descriptor_data());\n            messages.push(AccountTrace::generated_message_descriptor_data());\n            messages.push(AccountIdentifier::generated_message_descriptor_data());\n            messages.push(AccountBalanceRequest::generated_message_descriptor_data());\n            messages.push(AccountBalanceResponse::generated_message_descriptor_data());\n            messages.push(FreezeBalanceV2Contract::generated_message_descriptor_data());\n            messages.push(UnfreezeBalanceV2Contract::generated_message_descriptor_data());\n            messages.push(WithdrawExpireUnfreezeContract::generated_message_descriptor_data());\n            messages.push(DelegateResourceContract::generated_message_descriptor_data());\n            messages.push(UnDelegateResourceContract::generated_message_descriptor_data());\n            messages.push(CancelAllUnfreezeV2Contract::generated_message_descriptor_data());\n            messages.push(transaction_balance_trace::Operation::generated_message_descriptor_data());\n            messages.push(block_balance_trace::BlockIdentifier::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/common.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/common.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n// @@protoc_insertion_point(enum:protocol.ResourceCode)\npub enum ResourceCode {\n    // @@protoc_insertion_point(enum_value:protocol.ResourceCode.BANDWIDTH)\n    BANDWIDTH = 0,\n    // @@protoc_insertion_point(enum_value:protocol.ResourceCode.ENERGY)\n    ENERGY = 1,\n    // @@protoc_insertion_point(enum_value:protocol.ResourceCode.TRON_POWER)\n    TRON_POWER = 2,\n}\n\nimpl ::protobuf::Enum for ResourceCode {\n    const NAME: &'static str = \"ResourceCode\";\n\n    fn value(&self) -> i32 {\n        *self as i32\n    }\n\n    fn from_i32(value: i32) -> ::std::option::Option<ResourceCode> {\n        match value {\n            0 => ::std::option::Option::Some(ResourceCode::BANDWIDTH),\n            1 => ::std::option::Option::Some(ResourceCode::ENERGY),\n            2 => ::std::option::Option::Some(ResourceCode::TRON_POWER),\n            _ => ::std::option::Option::None\n        }\n    }\n\n    fn from_str(str: &str) -> ::std::option::Option<ResourceCode> {\n        match str {\n            \"BANDWIDTH\" => ::std::option::Option::Some(ResourceCode::BANDWIDTH),\n            \"ENERGY\" => ::std::option::Option::Some(ResourceCode::ENERGY),\n            \"TRON_POWER\" => ::std::option::Option::Some(ResourceCode::TRON_POWER),\n            _ => ::std::option::Option::None\n        }\n    }\n\n    const VALUES: &'static [ResourceCode] = &[\n        ResourceCode::BANDWIDTH,\n        ResourceCode::ENERGY,\n        ResourceCode::TRON_POWER,\n    ];\n}\n\nimpl ::protobuf::EnumFull for ResourceCode {\n    fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().enum_by_package_relative_name(\"ResourceCode\").unwrap()).clone()\n    }\n\n    fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n        let index = *self as usize;\n        Self::enum_descriptor().value_by_index(index)\n    }\n}\n\nimpl ::std::default::Default for ResourceCode {\n    fn default() -> Self {\n        ResourceCode::BANDWIDTH\n    }\n}\n\nimpl ResourceCode {\n    fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n        ::protobuf::reflect::GeneratedEnumDescriptorData::new::<ResourceCode>(\"ResourceCode\")\n    }\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n\\x1acore/contract/common.proto\\x12\\x08protocol*9\\n\\x0cResourceCode\\x12\\\n    \\r\\n\\tBANDWIDTH\\x10\\0\\x12\\n\\n\\x06ENERGY\\x10\\x01\\x12\\x0e\\n\\nTRON_POWER\\\n    \\x10\\x02BE\\n\\x18org.tron.protos.contractZ)github.com/tronprotocol/grpc-g\\\n    ateway/coreJ\\xf6\\x02\\n\\x06\\x12\\x04\\0\\0\\x0c\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\\n    \\0\\x12\\n\\x08\\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\\n    \\nH\\n\\x02\\x08\\x01\\x12\\x03\\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\\n    \\x20package\\x20that\\x20generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\\n    \\x08\\x12\\x03\\x06\\0@\\ng\\n\\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\x1a\\\\option\\x20java_\\\n    outer_classname\\x20=\\x20\\\"common\\\";\\x20//Specify\\x20the\\x20class\\x20name\\\n    \\x20of\\x20the\\x20generated\\x20Java\\x20file\\n\\n\\n\\n\\x02\\x05\\0\\x12\\x04\\x08\\\n    \\0\\x0c\\x01\\n\\n\\n\\x03\\x05\\0\\x01\\x12\\x03\\x08\\x05\\x11\\n\\x0b\\n\\x04\\x05\\0\\x02\\\n    \\0\\x12\\x03\\t\\x02\\x13\\n\\x0c\\n\\x05\\x05\\0\\x02\\0\\x01\\x12\\x03\\t\\x02\\x0b\\n\\x0c\\\n    \\n\\x05\\x05\\0\\x02\\0\\x02\\x12\\x03\\t\\x0e\\x12\\n\\x0b\\n\\x04\\x05\\0\\x02\\x01\\x12\\\n    \\x03\\n\\x02\\x10\\n\\x0c\\n\\x05\\x05\\0\\x02\\x01\\x01\\x12\\x03\\n\\x02\\x08\\n\\x0c\\n\\\n    \\x05\\x05\\0\\x02\\x01\\x02\\x12\\x03\\n\\x0b\\x0f\\n\\x0b\\n\\x04\\x05\\0\\x02\\x02\\x12\\\n    \\x03\\x0b\\x02\\x14\\n\\x0c\\n\\x05\\x05\\0\\x02\\x02\\x01\\x12\\x03\\x0b\\x02\\x0c\\n\\x0c\\\n    \\n\\x05\\x05\\0\\x02\\x02\\x02\\x12\\x03\\x0b\\x0f\\x13b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(0);\n            let mut enums = ::std::vec::Vec::with_capacity(1);\n            enums.push(ResourceCode::generated_enum_descriptor_data());\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/exchange_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/exchange_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.ExchangeCreateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ExchangeCreateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ExchangeCreateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeCreateContract.first_token_id)\n    pub first_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeCreateContract.first_token_balance)\n    pub first_token_balance: i64,\n    // @@protoc_insertion_point(field:protocol.ExchangeCreateContract.second_token_id)\n    pub second_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeCreateContract.second_token_balance)\n    pub second_token_balance: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ExchangeCreateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ExchangeCreateContract {\n    fn default() -> &'a ExchangeCreateContract {\n        <ExchangeCreateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ExchangeCreateContract {\n    pub fn new() -> ExchangeCreateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(5);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ExchangeCreateContract| { &m.owner_address },\n            |m: &mut ExchangeCreateContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"first_token_id\",\n            |m: &ExchangeCreateContract| { &m.first_token_id },\n            |m: &mut ExchangeCreateContract| { &mut m.first_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"first_token_balance\",\n            |m: &ExchangeCreateContract| { &m.first_token_balance },\n            |m: &mut ExchangeCreateContract| { &mut m.first_token_balance },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"second_token_id\",\n            |m: &ExchangeCreateContract| { &m.second_token_id },\n            |m: &mut ExchangeCreateContract| { &mut m.second_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"second_token_balance\",\n            |m: &ExchangeCreateContract| { &m.second_token_balance },\n            |m: &mut ExchangeCreateContract| { &mut m.second_token_balance },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ExchangeCreateContract>(\n            \"ExchangeCreateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ExchangeCreateContract {\n    const NAME: &'static str = \"ExchangeCreateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.first_token_id = is.read_bytes()?;\n                },\n                24 => {\n                    self.first_token_balance = is.read_int64()?;\n                },\n                34 => {\n                    self.second_token_id = is.read_bytes()?;\n                },\n                40 => {\n                    self.second_token_balance = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.first_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.first_token_id);\n        }\n        if self.first_token_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.first_token_balance);\n        }\n        if !self.second_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.second_token_id);\n        }\n        if self.second_token_balance != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.second_token_balance);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.first_token_id.is_empty() {\n            os.write_bytes(2, &self.first_token_id)?;\n        }\n        if self.first_token_balance != 0 {\n            os.write_int64(3, self.first_token_balance)?;\n        }\n        if !self.second_token_id.is_empty() {\n            os.write_bytes(4, &self.second_token_id)?;\n        }\n        if self.second_token_balance != 0 {\n            os.write_int64(5, self.second_token_balance)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ExchangeCreateContract {\n        ExchangeCreateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.first_token_id.clear();\n        self.first_token_balance = 0;\n        self.second_token_id.clear();\n        self.second_token_balance = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ExchangeCreateContract {\n        static instance: ExchangeCreateContract = ExchangeCreateContract {\n            owner_address: ::std::vec::Vec::new(),\n            first_token_id: ::std::vec::Vec::new(),\n            first_token_balance: 0,\n            second_token_id: ::std::vec::Vec::new(),\n            second_token_balance: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ExchangeCreateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ExchangeCreateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ExchangeCreateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ExchangeCreateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ExchangeInjectContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ExchangeInjectContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ExchangeInjectContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeInjectContract.exchange_id)\n    pub exchange_id: i64,\n    // @@protoc_insertion_point(field:protocol.ExchangeInjectContract.token_id)\n    pub token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeInjectContract.quant)\n    pub quant: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ExchangeInjectContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ExchangeInjectContract {\n    fn default() -> &'a ExchangeInjectContract {\n        <ExchangeInjectContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ExchangeInjectContract {\n    pub fn new() -> ExchangeInjectContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ExchangeInjectContract| { &m.owner_address },\n            |m: &mut ExchangeInjectContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_id\",\n            |m: &ExchangeInjectContract| { &m.exchange_id },\n            |m: &mut ExchangeInjectContract| { &mut m.exchange_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"token_id\",\n            |m: &ExchangeInjectContract| { &m.token_id },\n            |m: &mut ExchangeInjectContract| { &mut m.token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"quant\",\n            |m: &ExchangeInjectContract| { &m.quant },\n            |m: &mut ExchangeInjectContract| { &mut m.quant },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ExchangeInjectContract>(\n            \"ExchangeInjectContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ExchangeInjectContract {\n    const NAME: &'static str = \"ExchangeInjectContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.exchange_id = is.read_int64()?;\n                },\n                26 => {\n                    self.token_id = is.read_bytes()?;\n                },\n                32 => {\n                    self.quant = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.exchange_id != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.exchange_id);\n        }\n        if !self.token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.token_id);\n        }\n        if self.quant != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.quant);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.exchange_id != 0 {\n            os.write_int64(2, self.exchange_id)?;\n        }\n        if !self.token_id.is_empty() {\n            os.write_bytes(3, &self.token_id)?;\n        }\n        if self.quant != 0 {\n            os.write_int64(4, self.quant)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ExchangeInjectContract {\n        ExchangeInjectContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.exchange_id = 0;\n        self.token_id.clear();\n        self.quant = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ExchangeInjectContract {\n        static instance: ExchangeInjectContract = ExchangeInjectContract {\n            owner_address: ::std::vec::Vec::new(),\n            exchange_id: 0,\n            token_id: ::std::vec::Vec::new(),\n            quant: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ExchangeInjectContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ExchangeInjectContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ExchangeInjectContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ExchangeInjectContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ExchangeWithdrawContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ExchangeWithdrawContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ExchangeWithdrawContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeWithdrawContract.exchange_id)\n    pub exchange_id: i64,\n    // @@protoc_insertion_point(field:protocol.ExchangeWithdrawContract.token_id)\n    pub token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeWithdrawContract.quant)\n    pub quant: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ExchangeWithdrawContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ExchangeWithdrawContract {\n    fn default() -> &'a ExchangeWithdrawContract {\n        <ExchangeWithdrawContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ExchangeWithdrawContract {\n    pub fn new() -> ExchangeWithdrawContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ExchangeWithdrawContract| { &m.owner_address },\n            |m: &mut ExchangeWithdrawContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_id\",\n            |m: &ExchangeWithdrawContract| { &m.exchange_id },\n            |m: &mut ExchangeWithdrawContract| { &mut m.exchange_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"token_id\",\n            |m: &ExchangeWithdrawContract| { &m.token_id },\n            |m: &mut ExchangeWithdrawContract| { &mut m.token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"quant\",\n            |m: &ExchangeWithdrawContract| { &m.quant },\n            |m: &mut ExchangeWithdrawContract| { &mut m.quant },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ExchangeWithdrawContract>(\n            \"ExchangeWithdrawContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ExchangeWithdrawContract {\n    const NAME: &'static str = \"ExchangeWithdrawContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.exchange_id = is.read_int64()?;\n                },\n                26 => {\n                    self.token_id = is.read_bytes()?;\n                },\n                32 => {\n                    self.quant = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.exchange_id != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.exchange_id);\n        }\n        if !self.token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.token_id);\n        }\n        if self.quant != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.quant);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.exchange_id != 0 {\n            os.write_int64(2, self.exchange_id)?;\n        }\n        if !self.token_id.is_empty() {\n            os.write_bytes(3, &self.token_id)?;\n        }\n        if self.quant != 0 {\n            os.write_int64(4, self.quant)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ExchangeWithdrawContract {\n        ExchangeWithdrawContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.exchange_id = 0;\n        self.token_id.clear();\n        self.quant = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ExchangeWithdrawContract {\n        static instance: ExchangeWithdrawContract = ExchangeWithdrawContract {\n            owner_address: ::std::vec::Vec::new(),\n            exchange_id: 0,\n            token_id: ::std::vec::Vec::new(),\n            quant: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ExchangeWithdrawContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ExchangeWithdrawContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ExchangeWithdrawContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ExchangeWithdrawContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ExchangeTransactionContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ExchangeTransactionContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ExchangeTransactionContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeTransactionContract.exchange_id)\n    pub exchange_id: i64,\n    // @@protoc_insertion_point(field:protocol.ExchangeTransactionContract.token_id)\n    pub token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ExchangeTransactionContract.quant)\n    pub quant: i64,\n    // @@protoc_insertion_point(field:protocol.ExchangeTransactionContract.expected)\n    pub expected: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ExchangeTransactionContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ExchangeTransactionContract {\n    fn default() -> &'a ExchangeTransactionContract {\n        <ExchangeTransactionContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ExchangeTransactionContract {\n    pub fn new() -> ExchangeTransactionContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(5);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ExchangeTransactionContract| { &m.owner_address },\n            |m: &mut ExchangeTransactionContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"exchange_id\",\n            |m: &ExchangeTransactionContract| { &m.exchange_id },\n            |m: &mut ExchangeTransactionContract| { &mut m.exchange_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"token_id\",\n            |m: &ExchangeTransactionContract| { &m.token_id },\n            |m: &mut ExchangeTransactionContract| { &mut m.token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"quant\",\n            |m: &ExchangeTransactionContract| { &m.quant },\n            |m: &mut ExchangeTransactionContract| { &mut m.quant },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"expected\",\n            |m: &ExchangeTransactionContract| { &m.expected },\n            |m: &mut ExchangeTransactionContract| { &mut m.expected },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ExchangeTransactionContract>(\n            \"ExchangeTransactionContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ExchangeTransactionContract {\n    const NAME: &'static str = \"ExchangeTransactionContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.exchange_id = is.read_int64()?;\n                },\n                26 => {\n                    self.token_id = is.read_bytes()?;\n                },\n                32 => {\n                    self.quant = is.read_int64()?;\n                },\n                40 => {\n                    self.expected = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.exchange_id != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.exchange_id);\n        }\n        if !self.token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.token_id);\n        }\n        if self.quant != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.quant);\n        }\n        if self.expected != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.expected);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.exchange_id != 0 {\n            os.write_int64(2, self.exchange_id)?;\n        }\n        if !self.token_id.is_empty() {\n            os.write_bytes(3, &self.token_id)?;\n        }\n        if self.quant != 0 {\n            os.write_int64(4, self.quant)?;\n        }\n        if self.expected != 0 {\n            os.write_int64(5, self.expected)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ExchangeTransactionContract {\n        ExchangeTransactionContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.exchange_id = 0;\n        self.token_id.clear();\n        self.quant = 0;\n        self.expected = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ExchangeTransactionContract {\n        static instance: ExchangeTransactionContract = ExchangeTransactionContract {\n            owner_address: ::std::vec::Vec::new(),\n            exchange_id: 0,\n            token_id: ::std::vec::Vec::new(),\n            quant: 0,\n            expected: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ExchangeTransactionContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ExchangeTransactionContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ExchangeTransactionContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ExchangeTransactionContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n%core/contract/exchange_contract.proto\\x12\\x08protocol\\\"\\xed\\x01\\n\\x16\\\n    ExchangeCreateContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cow\\\n    nerAddress\\x12$\\n\\x0efirst_token_id\\x18\\x02\\x20\\x01(\\x0cR\\x0cfirstTokenI\\\n    d\\x12.\\n\\x13first_token_balance\\x18\\x03\\x20\\x01(\\x03R\\x11firstTokenBalan\\\n    ce\\x12&\\n\\x0fsecond_token_id\\x18\\x04\\x20\\x01(\\x0cR\\rsecondTokenId\\x120\\n\\\n    \\x14second_token_balance\\x18\\x05\\x20\\x01(\\x03R\\x12secondTokenBalance\\\"\\\n    \\x8f\\x01\\n\\x16ExchangeInjectContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\\n    \\x01(\\x0cR\\x0cownerAddress\\x12\\x1f\\n\\x0bexchange_id\\x18\\x02\\x20\\x01(\\x03\\\n    R\\nexchangeId\\x12\\x19\\n\\x08token_id\\x18\\x03\\x20\\x01(\\x0cR\\x07tokenId\\x12\\\n    \\x14\\n\\x05quant\\x18\\x04\\x20\\x01(\\x03R\\x05quant\\\"\\x91\\x01\\n\\x18ExchangeWi\\\n    thdrawContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddre\\\n    ss\\x12\\x1f\\n\\x0bexchange_id\\x18\\x02\\x20\\x01(\\x03R\\nexchangeId\\x12\\x19\\n\\\n    \\x08token_id\\x18\\x03\\x20\\x01(\\x0cR\\x07tokenId\\x12\\x14\\n\\x05quant\\x18\\x04\\\n    \\x20\\x01(\\x03R\\x05quant\\\"\\xb0\\x01\\n\\x1bExchangeTransactionContract\\x12#\\\n    \\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x1f\\n\\x0bexc\\\n    hange_id\\x18\\x02\\x20\\x01(\\x03R\\nexchangeId\\x12\\x19\\n\\x08token_id\\x18\\x03\\\n    \\x20\\x01(\\x0cR\\x07tokenId\\x12\\x14\\n\\x05quant\\x18\\x04\\x20\\x01(\\x03R\\x05qu\\\n    ant\\x12\\x1a\\n\\x08expected\\x18\\x05\\x20\\x01(\\x03R\\x08expectedBE\\n\\x18org.t\\\n    ron.protos.contractZ)github.com/tronprotocol/grpc-gateway/coreJ\\xb1\\n\\n\\\n    \\x06\\x12\\x04\\0\\0$\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\\n    \\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\\n    \\x03\\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20that\\x20\\\n    generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\nw\\n\\\n    \\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\x1aloption\\x20java_outer_classname\\x20=\\x20\\\n    \\\"ExchangeCreateContract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\\n    \\x20the\\x20generated\\x20Java\\x20file\\n\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x08\\0\\x0e\\\n    \\x01\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\x08\\x08\\x1e\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\\n    \\x03\\t\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\t\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\0\\x01\\x12\\x03\\t\\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\t\\\n    \\x18\\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\n\\x02\\x1b\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x01\\x05\\x12\\x03\\n\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\n\\\n    \\x08\\x16\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\n\\x19\\x1a\\n\\x0b\\n\\x04\\x04\\\n    \\0\\x02\\x02\\x12\\x03\\x0b\\x02\\x20\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x05\\x12\\x03\\x0b\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\x0b\\x08\\x1b\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\x02\\x03\\x12\\x03\\x0b\\x1e\\x1f\\n\\x0b\\n\\x04\\x04\\0\\x02\\x03\\x12\\x03\\\n    \\x0c\\x02\\x1c\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x05\\x12\\x03\\x0c\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x03\\x01\\x12\\x03\\x0c\\x08\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x03\\\n    \\x12\\x03\\x0c\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\0\\x02\\x04\\x12\\x03\\r\\x02!\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x04\\x05\\x12\\x03\\r\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x01\\\n    \\x12\\x03\\r\\x08\\x1c\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x03\\x12\\x03\\r\\x1f\\x20\\n\\n\\n\\\n    \\x02\\x04\\x01\\x12\\x04\\x10\\0\\x15\\x01\\n\\n\\n\\x03\\x04\\x01\\x01\\x12\\x03\\x10\\x08\\\n    \\x1e\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x11\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\0\\x05\\x12\\x03\\x11\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\x03\\x11\\\n    \\x08\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x11\\x18\\x19\\n\\x0b\\n\\x04\\\n    \\x04\\x01\\x02\\x01\\x12\\x03\\x12\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\\n    \\x03\\x12\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03\\x12\\x08\\x13\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\x12\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x01\\\n    \\x02\\x02\\x12\\x03\\x13\\x02\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x05\\x12\\x03\\x13\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x01\\x12\\x03\\x13\\x08\\x10\\n\\x0c\\n\\x05\\\n    \\x04\\x01\\x02\\x02\\x03\\x12\\x03\\x13\\x13\\x14\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x03\\x12\\\n    \\x03\\x14\\x02\\x12\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x03\\x05\\x12\\x03\\x14\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\x03\\x01\\x12\\x03\\x14\\x08\\r\\n\\x0c\\n\\x05\\x04\\x01\\x02\\\n    \\x03\\x03\\x12\\x03\\x14\\x10\\x11\\n\\n\\n\\x02\\x04\\x02\\x12\\x04\\x17\\0\\x1c\\x01\\n\\n\\\n    \\n\\x03\\x04\\x02\\x01\\x12\\x03\\x17\\x08\\x20\\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03\\\n    \\x18\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x05\\x12\\x03\\x18\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\x18\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\\n    \\x12\\x03\\x18\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x01\\x12\\x03\\x19\\x02\\x18\\n\\\n    \\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\x12\\x03\\x19\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\\n    \\x02\\x01\\x01\\x12\\x03\\x19\\x08\\x13\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x03\\x12\\x03\\\n    \\x19\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x02\\x12\\x03\\x1a\\x02\\x15\\n\\x0c\\n\\x05\\\n    \\x04\\x02\\x02\\x02\\x05\\x12\\x03\\x1a\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x01\\\n    \\x12\\x03\\x1a\\x08\\x10\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x03\\x12\\x03\\x1a\\x13\\x14\\\n    \\n\\x0b\\n\\x04\\x04\\x02\\x02\\x03\\x12\\x03\\x1b\\x02\\x12\\n\\x0c\\n\\x05\\x04\\x02\\x02\\\n    \\x03\\x05\\x12\\x03\\x1b\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x03\\x01\\x12\\x03\\x1b\\\n    \\x08\\r\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x03\\x03\\x12\\x03\\x1b\\x10\\x11\\n\\n\\n\\x02\\x04\\\n    \\x03\\x12\\x04\\x1e\\0$\\x01\\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x03\\x1e\\x08#\\n\\x0b\\n\\\n    \\x04\\x04\\x03\\x02\\0\\x12\\x03\\x1f\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x05\\x12\\\n    \\x03\\x1f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x01\\x12\\x03\\x1f\\x08\\x15\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\x03\\x1f\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x01\\\n    \\x12\\x03\\x20\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x05\\x12\\x03\\x20\\x02\\x07\\\n    \\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x03\\x20\\x08\\x13\\n\\x0c\\n\\x05\\x04\\x03\\\n    \\x02\\x01\\x03\\x12\\x03\\x20\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x02\\x12\\x03!\\\n    \\x02\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x05\\x12\\x03!\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\x02\\x01\\x12\\x03!\\x08\\x10\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x03\\\n    \\x12\\x03!\\x13\\x14\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x03\\x12\\x03\\\"\\x02\\x12\\n\\x0c\\n\\\n    \\x05\\x04\\x03\\x02\\x03\\x05\\x12\\x03\\\"\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\\n    \\x01\\x12\\x03\\\"\\x08\\r\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x03\\x12\\x03\\\"\\x10\\x11\\n\\\n    \\x0b\\n\\x04\\x04\\x03\\x02\\x04\\x12\\x03#\\x02\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\\n    \\x05\\x12\\x03#\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x01\\x12\\x03#\\x08\\x10\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x03\\x12\\x03#\\x13\\x14b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(4);\n            messages.push(ExchangeCreateContract::generated_message_descriptor_data());\n            messages.push(ExchangeInjectContract::generated_message_descriptor_data());\n            messages.push(ExchangeWithdrawContract::generated_message_descriptor_data());\n            messages.push(ExchangeTransactionContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/market_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/market_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.MarketSellAssetContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketSellAssetContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketSellAssetContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketSellAssetContract.sell_token_id)\n    pub sell_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketSellAssetContract.sell_token_quantity)\n    pub sell_token_quantity: i64,\n    // @@protoc_insertion_point(field:protocol.MarketSellAssetContract.buy_token_id)\n    pub buy_token_id: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketSellAssetContract.buy_token_quantity)\n    pub buy_token_quantity: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketSellAssetContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketSellAssetContract {\n    fn default() -> &'a MarketSellAssetContract {\n        <MarketSellAssetContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketSellAssetContract {\n    pub fn new() -> MarketSellAssetContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(5);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &MarketSellAssetContract| { &m.owner_address },\n            |m: &mut MarketSellAssetContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_id\",\n            |m: &MarketSellAssetContract| { &m.sell_token_id },\n            |m: &mut MarketSellAssetContract| { &mut m.sell_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"sell_token_quantity\",\n            |m: &MarketSellAssetContract| { &m.sell_token_quantity },\n            |m: &mut MarketSellAssetContract| { &mut m.sell_token_quantity },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_id\",\n            |m: &MarketSellAssetContract| { &m.buy_token_id },\n            |m: &mut MarketSellAssetContract| { &mut m.buy_token_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"buy_token_quantity\",\n            |m: &MarketSellAssetContract| { &m.buy_token_quantity },\n            |m: &mut MarketSellAssetContract| { &mut m.buy_token_quantity },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketSellAssetContract>(\n            \"MarketSellAssetContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketSellAssetContract {\n    const NAME: &'static str = \"MarketSellAssetContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.sell_token_id = is.read_bytes()?;\n                },\n                24 => {\n                    self.sell_token_quantity = is.read_int64()?;\n                },\n                34 => {\n                    self.buy_token_id = is.read_bytes()?;\n                },\n                40 => {\n                    self.buy_token_quantity = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.sell_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.sell_token_id);\n        }\n        if self.sell_token_quantity != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.sell_token_quantity);\n        }\n        if !self.buy_token_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.buy_token_id);\n        }\n        if self.buy_token_quantity != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.buy_token_quantity);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.sell_token_id.is_empty() {\n            os.write_bytes(2, &self.sell_token_id)?;\n        }\n        if self.sell_token_quantity != 0 {\n            os.write_int64(3, self.sell_token_quantity)?;\n        }\n        if !self.buy_token_id.is_empty() {\n            os.write_bytes(4, &self.buy_token_id)?;\n        }\n        if self.buy_token_quantity != 0 {\n            os.write_int64(5, self.buy_token_quantity)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketSellAssetContract {\n        MarketSellAssetContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.sell_token_id.clear();\n        self.sell_token_quantity = 0;\n        self.buy_token_id.clear();\n        self.buy_token_quantity = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketSellAssetContract {\n        static instance: MarketSellAssetContract = MarketSellAssetContract {\n            owner_address: ::std::vec::Vec::new(),\n            sell_token_id: ::std::vec::Vec::new(),\n            sell_token_quantity: 0,\n            buy_token_id: ::std::vec::Vec::new(),\n            buy_token_quantity: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketSellAssetContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketSellAssetContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketSellAssetContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketSellAssetContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MarketCancelOrderContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MarketCancelOrderContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MarketCancelOrderContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.MarketCancelOrderContract.order_id)\n    pub order_id: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MarketCancelOrderContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MarketCancelOrderContract {\n    fn default() -> &'a MarketCancelOrderContract {\n        <MarketCancelOrderContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MarketCancelOrderContract {\n    pub fn new() -> MarketCancelOrderContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &MarketCancelOrderContract| { &m.owner_address },\n            |m: &mut MarketCancelOrderContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"order_id\",\n            |m: &MarketCancelOrderContract| { &m.order_id },\n            |m: &mut MarketCancelOrderContract| { &mut m.order_id },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MarketCancelOrderContract>(\n            \"MarketCancelOrderContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MarketCancelOrderContract {\n    const NAME: &'static str = \"MarketCancelOrderContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.order_id = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.order_id.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.order_id);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.order_id.is_empty() {\n            os.write_bytes(2, &self.order_id)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MarketCancelOrderContract {\n        MarketCancelOrderContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.order_id.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MarketCancelOrderContract {\n        static instance: MarketCancelOrderContract = MarketCancelOrderContract {\n            owner_address: ::std::vec::Vec::new(),\n            order_id: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MarketCancelOrderContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MarketCancelOrderContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MarketCancelOrderContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MarketCancelOrderContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n#core/contract/market_contract.proto\\x12\\x08protocol\\\"\\xe2\\x01\\n\\x17Ma\\\n    rketSellAssetContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cown\\\n    erAddress\\x12\\\"\\n\\rsell_token_id\\x18\\x02\\x20\\x01(\\x0cR\\x0bsellTokenId\\\n    \\x12.\\n\\x13sell_token_quantity\\x18\\x03\\x20\\x01(\\x03R\\x11sellTokenQuantit\\\n    y\\x12\\x20\\n\\x0cbuy_token_id\\x18\\x04\\x20\\x01(\\x0cR\\nbuyTokenId\\x12,\\n\\x12\\\n    buy_token_quantity\\x18\\x05\\x20\\x01(\\x03R\\x10buyTokenQuantity\\\"[\\n\\x19Mar\\\n    ketCancelOrderContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cow\\\n    nerAddress\\x12\\x19\\n\\x08order_id\\x18\\x02\\x20\\x01(\\x0cR\\x07orderIdBE\\n\\\n    \\x18org.tron.protos.contractZ)github.com/tronprotocol/grpc-gateway/coreJ\\\n    \\xc8\\x04\\n\\x06\\x12\\x04\\0\\0\\x12\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\\n    \\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\\n    \\x01\\x12\\x03\\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20\\\n    that\\x20generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x05\\0\\\n    @\\n\\t\\n\\x02\\x08\\x0b\\x12\\x03\\x05\\0@\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x07\\0\\r\\x01\\n\\\n    \\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\x07\\x08\\x1f\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\\n    \\x08\\x04\\x1c\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\x08\\x04\\t\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\0\\x01\\x12\\x03\\x08\\n\\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\\n    \\x08\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\t\\x04\\x1c\\n\\x0c\\n\\x05\\x04\\\n    \\0\\x02\\x01\\x05\\x12\\x03\\t\\x04\\t\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\t\\n\\\n    \\x17\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\t\\x1a\\x1b\\n\\x0b\\n\\x04\\x04\\0\\\n    \\x02\\x02\\x12\\x03\\n\\x04\\\"\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x05\\x12\\x03\\n\\x04\\t\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\n\\n\\x1d\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\\n    \\x03\\x12\\x03\\n\\x20!\\n\\x0b\\n\\x04\\x04\\0\\x02\\x03\\x12\\x03\\x0b\\x04\\x1b\\n\\x0c\\\n    \\n\\x05\\x04\\0\\x02\\x03\\x05\\x12\\x03\\x0b\\x04\\t\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x01\\\n    \\x12\\x03\\x0b\\n\\x16\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x03\\x12\\x03\\x0b\\x19\\x1a\\n\\\n    \\x1d\\n\\x04\\x04\\0\\x02\\x04\\x12\\x03\\x0c\\x04!\\\"\\x10\\x20min\\x20to\\x20receive\\\n    \\n\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x05\\x12\\x03\\x0c\\x04\\t\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x04\\x01\\x12\\x03\\x0c\\n\\x1c\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x03\\x12\\x03\\x0c\\x1f\\\n    \\x20\\n\\n\\n\\x02\\x04\\x01\\x12\\x04\\x0f\\0\\x12\\x01\\n\\n\\n\\x03\\x04\\x01\\x01\\x12\\\n    \\x03\\x0f\\x08!\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x10\\x04\\x1c\\n\\x0c\\n\\x05\\\n    \\x04\\x01\\x02\\0\\x05\\x12\\x03\\x10\\x04\\t\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\\n    \\x03\\x10\\n\\x17\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x10\\x1a\\x1b\\n\\x0b\\n\\\n    \\x04\\x04\\x01\\x02\\x01\\x12\\x03\\x11\\x04\\x17\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\\n    \\x12\\x03\\x11\\x04\\t\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03\\x11\\n\\x12\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\x11\\x15\\x16b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(2);\n            messages.push(MarketSellAssetContract::generated_message_descriptor_data());\n            messages.push(MarketCancelOrderContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/mod.rs",
    "content": "// @generated\n\npub mod Discover;\npub mod Tron;\n\npub mod account_contract;\npub mod asset_issue_contract;\npub mod balance_contract;\npub mod common;\npub mod exchange_contract;\npub mod market_contract;\npub mod proposal_contract;\npub mod shield_contract;\npub mod smart_contract;\npub mod storage_contract;\npub mod vote_asset_contract;\npub mod witness_contract;\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/proposal_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/proposal_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.ProposalApproveContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ProposalApproveContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ProposalApproveContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ProposalApproveContract.proposal_id)\n    pub proposal_id: i64,\n    // @@protoc_insertion_point(field:protocol.ProposalApproveContract.is_add_approval)\n    pub is_add_approval: bool,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ProposalApproveContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ProposalApproveContract {\n    fn default() -> &'a ProposalApproveContract {\n        <ProposalApproveContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ProposalApproveContract {\n    pub fn new() -> ProposalApproveContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ProposalApproveContract| { &m.owner_address },\n            |m: &mut ProposalApproveContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"proposal_id\",\n            |m: &ProposalApproveContract| { &m.proposal_id },\n            |m: &mut ProposalApproveContract| { &mut m.proposal_id },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"is_add_approval\",\n            |m: &ProposalApproveContract| { &m.is_add_approval },\n            |m: &mut ProposalApproveContract| { &mut m.is_add_approval },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ProposalApproveContract>(\n            \"ProposalApproveContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ProposalApproveContract {\n    const NAME: &'static str = \"ProposalApproveContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.proposal_id = is.read_int64()?;\n                },\n                24 => {\n                    self.is_add_approval = is.read_bool()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.proposal_id != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.proposal_id);\n        }\n        if self.is_add_approval != false {\n            my_size += 1 + 1;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.proposal_id != 0 {\n            os.write_int64(2, self.proposal_id)?;\n        }\n        if self.is_add_approval != false {\n            os.write_bool(3, self.is_add_approval)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ProposalApproveContract {\n        ProposalApproveContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.proposal_id = 0;\n        self.is_add_approval = false;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ProposalApproveContract {\n        static instance: ProposalApproveContract = ProposalApproveContract {\n            owner_address: ::std::vec::Vec::new(),\n            proposal_id: 0,\n            is_add_approval: false,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ProposalApproveContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ProposalApproveContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ProposalApproveContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ProposalApproveContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ProposalCreateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ProposalCreateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ProposalCreateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ProposalCreateContract.parameters)\n    pub parameters: ::std::collections::HashMap<i64, i64>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ProposalCreateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ProposalCreateContract {\n    fn default() -> &'a ProposalCreateContract {\n        <ProposalCreateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ProposalCreateContract {\n    pub fn new() -> ProposalCreateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ProposalCreateContract| { &m.owner_address },\n            |m: &mut ProposalCreateContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_map_simpler_accessor::<_, _, _>(\n            \"parameters\",\n            |m: &ProposalCreateContract| { &m.parameters },\n            |m: &mut ProposalCreateContract| { &mut m.parameters },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ProposalCreateContract>(\n            \"ProposalCreateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ProposalCreateContract {\n    const NAME: &'static str = \"ProposalCreateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    let len = is.read_raw_varint32()?;\n                    let old_limit = is.push_limit(len as u64)?;\n                    let mut key = ::std::default::Default::default();\n                    let mut value = ::std::default::Default::default();\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            8 => key = is.read_int64()?,\n                            16 => value = is.read_int64()?,\n                            _ => ::protobuf::rt::skip_field_for_tag(tag, is)?,\n                        };\n                    }\n                    is.pop_limit(old_limit);\n                    self.parameters.insert(key, value);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        for (k, v) in &self.parameters {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::int64_size(1, *k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        for (k, v) in &self.parameters {\n            let mut entry_size = 0;\n            entry_size += ::protobuf::rt::int64_size(1, *k);\n            entry_size += ::protobuf::rt::int64_size(2, *v);\n            os.write_raw_varint32(18)?; // Tag.\n            os.write_raw_varint32(entry_size as u32)?;\n            os.write_int64(1, *k)?;\n            os.write_int64(2, *v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ProposalCreateContract {\n        ProposalCreateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.parameters.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ProposalCreateContract {\n        static instance: ::protobuf::rt::Lazy<ProposalCreateContract> = ::protobuf::rt::Lazy::new();\n        instance.get(ProposalCreateContract::new)\n    }\n}\n\nimpl ::protobuf::MessageFull for ProposalCreateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ProposalCreateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ProposalCreateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ProposalCreateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ProposalDeleteContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ProposalDeleteContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ProposalDeleteContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ProposalDeleteContract.proposal_id)\n    pub proposal_id: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ProposalDeleteContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ProposalDeleteContract {\n    fn default() -> &'a ProposalDeleteContract {\n        <ProposalDeleteContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ProposalDeleteContract {\n    pub fn new() -> ProposalDeleteContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ProposalDeleteContract| { &m.owner_address },\n            |m: &mut ProposalDeleteContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"proposal_id\",\n            |m: &ProposalDeleteContract| { &m.proposal_id },\n            |m: &mut ProposalDeleteContract| { &mut m.proposal_id },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ProposalDeleteContract>(\n            \"ProposalDeleteContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ProposalDeleteContract {\n    const NAME: &'static str = \"ProposalDeleteContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.proposal_id = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.proposal_id != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.proposal_id);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.proposal_id != 0 {\n            os.write_int64(2, self.proposal_id)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ProposalDeleteContract {\n        ProposalDeleteContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.proposal_id = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ProposalDeleteContract {\n        static instance: ProposalDeleteContract = ProposalDeleteContract {\n            owner_address: ::std::vec::Vec::new(),\n            proposal_id: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ProposalDeleteContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ProposalDeleteContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ProposalDeleteContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ProposalDeleteContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n%core/contract/proposal_contract.proto\\x12\\x08protocol\\\"\\x87\\x01\\n\\x17\\\n    ProposalApproveContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0co\\\n    wnerAddress\\x12\\x1f\\n\\x0bproposal_id\\x18\\x02\\x20\\x01(\\x03R\\nproposalId\\\n    \\x12&\\n\\x0fis_add_approval\\x18\\x03\\x20\\x01(\\x08R\\risAddApproval\\\"\\xce\\\n    \\x01\\n\\x16ProposalCreateContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\\n    \\x0cR\\x0cownerAddress\\x12P\\n\\nparameters\\x18\\x02\\x20\\x03(\\x0b20.protocol\\\n    .ProposalCreateContract.ParametersEntryR\\nparameters\\x1a=\\n\\x0fParameter\\\n    sEntry\\x12\\x10\\n\\x03key\\x18\\x01\\x20\\x01(\\x03R\\x03key\\x12\\x14\\n\\x05value\\\n    \\x18\\x02\\x20\\x01(\\x03R\\x05value:\\x028\\x01\\\"^\\n\\x16ProposalDeleteContract\\\n    \\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\x1f\\n\\\n    \\x0bproposal_id\\x18\\x02\\x20\\x01(\\x03R\\nproposalIdBE\\n\\x18org.tron.protos\\\n    .contractZ)github.com/tronprotocol/grpc-gateway/coreJ\\xd7\\x05\\n\\x06\\x12\\\n    \\x04\\0\\0\\x16\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\x12\\x03\\\n    \\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\x03\\x04\\0\\\n    1\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20that\\x20generated\\\n    \\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\nx\\n\\x02\\x08\\\n    \\x0b\\x12\\x03\\x06\\0@\\x1amoption\\x20java_outer_classname\\x20=\\x20\\\"Proposa\\\n    lApproveContract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\x20the\\\n    \\x20generated\\x20Java\\x20file\\n\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x08\\0\\x0c\\x01\\n\\\n    \\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\x08\\x08\\x1f\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\t\\\n    \\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\t\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x03\\t\\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\t\\x18\\\n    \\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\n\\x02\\x18\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x01\\x05\\x12\\x03\\n\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\n\\x08\\\n    \\x13\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\n\\x16\\x17\\n%\\n\\x04\\x04\\0\\x02\\\n    \\x02\\x12\\x03\\x0b\\x02\\x1b\\\"\\x18\\x20add\\x20or\\x20remove\\x20approval\\n\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x02\\x05\\x12\\x03\\x0b\\x02\\x06\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x02\\x01\\x12\\x03\\x0b\\x07\\x16\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x03\\x12\\x03\\x0b\\\n    \\x19\\x1a\\n\\n\\n\\x02\\x04\\x01\\x12\\x04\\x0e\\0\\x11\\x01\\n\\n\\n\\x03\\x04\\x01\\x01\\\n    \\x12\\x03\\x0e\\x08\\x1e\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x0f\\x02\\x1a\\n\\x0c\\\n    \\n\\x05\\x04\\x01\\x02\\0\\x05\\x12\\x03\\x0f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\\n    \\x01\\x12\\x03\\x0f\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x0f\\x18\\\n    \\x19\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x01\\x12\\x03\\x10\\x02#\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\x01\\x06\\x12\\x03\\x10\\x02\\x13\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03\\\n    \\x10\\x14\\x1e\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\x10!\\\"\\n\\n\\n\\x02\\\n    \\x04\\x02\\x12\\x04\\x13\\0\\x16\\x01\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\x13\\x08\\x1e\\\n    \\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03\\x14\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\\n    \\x05\\x12\\x03\\x14\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\x14\\x08\\\n    \\x15\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\x12\\x03\\x14\\x18\\x19\\n\\x0b\\n\\x04\\x04\\\n    \\x02\\x02\\x01\\x12\\x03\\x15\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\x12\\x03\\\n    \\x15\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03\\x15\\x08\\x13\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\x01\\x03\\x12\\x03\\x15\\x16\\x17b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(3);\n            messages.push(ProposalApproveContract::generated_message_descriptor_data());\n            messages.push(ProposalCreateContract::generated_message_descriptor_data());\n            messages.push(ProposalDeleteContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/shield_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/shield_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.AuthenticationPath)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct AuthenticationPath {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.AuthenticationPath.value)\n    pub value: ::std::vec::Vec<bool>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.AuthenticationPath.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a AuthenticationPath {\n    fn default() -> &'a AuthenticationPath {\n        <AuthenticationPath as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl AuthenticationPath {\n    pub fn new() -> AuthenticationPath {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"value\",\n            |m: &AuthenticationPath| { &m.value },\n            |m: &mut AuthenticationPath| { &mut m.value },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<AuthenticationPath>(\n            \"AuthenticationPath\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for AuthenticationPath {\n    const NAME: &'static str = \"AuthenticationPath\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    is.read_repeated_packed_bool_into(&mut self.value)?;\n                },\n                8 => {\n                    self.value.push(is.read_bool()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        my_size += 2 * self.value.len() as u64;\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.value {\n            os.write_bool(1, *v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> AuthenticationPath {\n        AuthenticationPath::new()\n    }\n\n    fn clear(&mut self) {\n        self.value.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static AuthenticationPath {\n        static instance: AuthenticationPath = AuthenticationPath {\n            value: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for AuthenticationPath {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"AuthenticationPath\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for AuthenticationPath {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for AuthenticationPath {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.MerklePath)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct MerklePath {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.MerklePath.authentication_paths)\n    pub authentication_paths: ::std::vec::Vec<AuthenticationPath>,\n    // @@protoc_insertion_point(field:protocol.MerklePath.index)\n    pub index: ::std::vec::Vec<bool>,\n    // @@protoc_insertion_point(field:protocol.MerklePath.rt)\n    pub rt: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.MerklePath.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a MerklePath {\n    fn default() -> &'a MerklePath {\n        <MerklePath as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl MerklePath {\n    pub fn new() -> MerklePath {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"authentication_paths\",\n            |m: &MerklePath| { &m.authentication_paths },\n            |m: &mut MerklePath| { &mut m.authentication_paths },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"index\",\n            |m: &MerklePath| { &m.index },\n            |m: &mut MerklePath| { &mut m.index },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"rt\",\n            |m: &MerklePath| { &m.rt },\n            |m: &mut MerklePath| { &mut m.rt },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<MerklePath>(\n            \"MerklePath\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for MerklePath {\n    const NAME: &'static str = \"MerklePath\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.authentication_paths.push(is.read_message()?);\n                },\n                18 => {\n                    is.read_repeated_packed_bool_into(&mut self.index)?;\n                },\n                16 => {\n                    self.index.push(is.read_bool()?);\n                },\n                26 => {\n                    self.rt = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.authentication_paths {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += 2 * self.index.len() as u64;\n        if !self.rt.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.rt);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.authentication_paths {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        for v in &self.index {\n            os.write_bool(2, *v)?;\n        };\n        if !self.rt.is_empty() {\n            os.write_bytes(3, &self.rt)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> MerklePath {\n        MerklePath::new()\n    }\n\n    fn clear(&mut self) {\n        self.authentication_paths.clear();\n        self.index.clear();\n        self.rt.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static MerklePath {\n        static instance: MerklePath = MerklePath {\n            authentication_paths: ::std::vec::Vec::new(),\n            index: ::std::vec::Vec::new(),\n            rt: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for MerklePath {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"MerklePath\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for MerklePath {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for MerklePath {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.OutputPoint)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct OutputPoint {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.OutputPoint.hash)\n    pub hash: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.OutputPoint.index)\n    pub index: i32,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.OutputPoint.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a OutputPoint {\n    fn default() -> &'a OutputPoint {\n        <OutputPoint as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl OutputPoint {\n    pub fn new() -> OutputPoint {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"hash\",\n            |m: &OutputPoint| { &m.hash },\n            |m: &mut OutputPoint| { &mut m.hash },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"index\",\n            |m: &OutputPoint| { &m.index },\n            |m: &mut OutputPoint| { &mut m.index },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<OutputPoint>(\n            \"OutputPoint\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for OutputPoint {\n    const NAME: &'static str = \"OutputPoint\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.hash = is.read_bytes()?;\n                },\n                16 => {\n                    self.index = is.read_int32()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.hash.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.hash);\n        }\n        if self.index != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.index);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.hash.is_empty() {\n            os.write_bytes(1, &self.hash)?;\n        }\n        if self.index != 0 {\n            os.write_int32(2, self.index)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> OutputPoint {\n        OutputPoint::new()\n    }\n\n    fn clear(&mut self) {\n        self.hash.clear();\n        self.index = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static OutputPoint {\n        static instance: OutputPoint = OutputPoint {\n            hash: ::std::vec::Vec::new(),\n            index: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for OutputPoint {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"OutputPoint\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for OutputPoint {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for OutputPoint {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.OutputPointInfo)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct OutputPointInfo {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.OutputPointInfo.out_points)\n    pub out_points: ::std::vec::Vec<OutputPoint>,\n    // @@protoc_insertion_point(field:protocol.OutputPointInfo.block_num)\n    pub block_num: i32,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.OutputPointInfo.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a OutputPointInfo {\n    fn default() -> &'a OutputPointInfo {\n        <OutputPointInfo as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl OutputPointInfo {\n    pub fn new() -> OutputPointInfo {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"out_points\",\n            |m: &OutputPointInfo| { &m.out_points },\n            |m: &mut OutputPointInfo| { &mut m.out_points },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"block_num\",\n            |m: &OutputPointInfo| { &m.block_num },\n            |m: &mut OutputPointInfo| { &mut m.block_num },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<OutputPointInfo>(\n            \"OutputPointInfo\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for OutputPointInfo {\n    const NAME: &'static str = \"OutputPointInfo\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.out_points.push(is.read_message()?);\n                },\n                16 => {\n                    self.block_num = is.read_int32()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.out_points {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.block_num != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.block_num);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.out_points {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        if self.block_num != 0 {\n            os.write_int32(2, self.block_num)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> OutputPointInfo {\n        OutputPointInfo::new()\n    }\n\n    fn clear(&mut self) {\n        self.out_points.clear();\n        self.block_num = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static OutputPointInfo {\n        static instance: OutputPointInfo = OutputPointInfo {\n            out_points: ::std::vec::Vec::new(),\n            block_num: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for OutputPointInfo {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"OutputPointInfo\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for OutputPointInfo {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for OutputPointInfo {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.PedersenHash)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct PedersenHash {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.PedersenHash.content)\n    pub content: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.PedersenHash.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a PedersenHash {\n    fn default() -> &'a PedersenHash {\n        <PedersenHash as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl PedersenHash {\n    pub fn new() -> PedersenHash {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(1);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"content\",\n            |m: &PedersenHash| { &m.content },\n            |m: &mut PedersenHash| { &mut m.content },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<PedersenHash>(\n            \"PedersenHash\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for PedersenHash {\n    const NAME: &'static str = \"PedersenHash\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.content = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.content.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.content);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.content.is_empty() {\n            os.write_bytes(1, &self.content)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> PedersenHash {\n        PedersenHash::new()\n    }\n\n    fn clear(&mut self) {\n        self.content.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static PedersenHash {\n        static instance: PedersenHash = PedersenHash {\n            content: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for PedersenHash {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"PedersenHash\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for PedersenHash {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for PedersenHash {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.IncrementalMerkleTree)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct IncrementalMerkleTree {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleTree.left)\n    pub left: ::protobuf::MessageField<PedersenHash>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleTree.right)\n    pub right: ::protobuf::MessageField<PedersenHash>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleTree.parents)\n    pub parents: ::std::vec::Vec<PedersenHash>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.IncrementalMerkleTree.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a IncrementalMerkleTree {\n    fn default() -> &'a IncrementalMerkleTree {\n        <IncrementalMerkleTree as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl IncrementalMerkleTree {\n    pub fn new() -> IncrementalMerkleTree {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, PedersenHash>(\n            \"left\",\n            |m: &IncrementalMerkleTree| { &m.left },\n            |m: &mut IncrementalMerkleTree| { &mut m.left },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, PedersenHash>(\n            \"right\",\n            |m: &IncrementalMerkleTree| { &m.right },\n            |m: &mut IncrementalMerkleTree| { &mut m.right },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"parents\",\n            |m: &IncrementalMerkleTree| { &m.parents },\n            |m: &mut IncrementalMerkleTree| { &mut m.parents },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<IncrementalMerkleTree>(\n            \"IncrementalMerkleTree\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for IncrementalMerkleTree {\n    const NAME: &'static str = \"IncrementalMerkleTree\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.left)?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.right)?;\n                },\n                26 => {\n                    self.parents.push(is.read_message()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.left.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if let Some(v) = self.right.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.parents {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.left.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if let Some(v) = self.right.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        for v in &self.parents {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> IncrementalMerkleTree {\n        IncrementalMerkleTree::new()\n    }\n\n    fn clear(&mut self) {\n        self.left.clear();\n        self.right.clear();\n        self.parents.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static IncrementalMerkleTree {\n        static instance: IncrementalMerkleTree = IncrementalMerkleTree {\n            left: ::protobuf::MessageField::none(),\n            right: ::protobuf::MessageField::none(),\n            parents: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for IncrementalMerkleTree {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"IncrementalMerkleTree\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for IncrementalMerkleTree {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for IncrementalMerkleTree {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.IncrementalMerkleVoucher)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct IncrementalMerkleVoucher {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucher.tree)\n    pub tree: ::protobuf::MessageField<IncrementalMerkleTree>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucher.filled)\n    pub filled: ::std::vec::Vec<PedersenHash>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucher.cursor)\n    pub cursor: ::protobuf::MessageField<IncrementalMerkleTree>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucher.cursor_depth)\n    pub cursor_depth: i64,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucher.rt)\n    pub rt: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucher.output_point)\n    pub output_point: ::protobuf::MessageField<OutputPoint>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.IncrementalMerkleVoucher.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a IncrementalMerkleVoucher {\n    fn default() -> &'a IncrementalMerkleVoucher {\n        <IncrementalMerkleVoucher as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl IncrementalMerkleVoucher {\n    pub fn new() -> IncrementalMerkleVoucher {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(6);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, IncrementalMerkleTree>(\n            \"tree\",\n            |m: &IncrementalMerkleVoucher| { &m.tree },\n            |m: &mut IncrementalMerkleVoucher| { &mut m.tree },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"filled\",\n            |m: &IncrementalMerkleVoucher| { &m.filled },\n            |m: &mut IncrementalMerkleVoucher| { &mut m.filled },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, IncrementalMerkleTree>(\n            \"cursor\",\n            |m: &IncrementalMerkleVoucher| { &m.cursor },\n            |m: &mut IncrementalMerkleVoucher| { &mut m.cursor },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"cursor_depth\",\n            |m: &IncrementalMerkleVoucher| { &m.cursor_depth },\n            |m: &mut IncrementalMerkleVoucher| { &mut m.cursor_depth },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"rt\",\n            |m: &IncrementalMerkleVoucher| { &m.rt },\n            |m: &mut IncrementalMerkleVoucher| { &mut m.rt },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, OutputPoint>(\n            \"output_point\",\n            |m: &IncrementalMerkleVoucher| { &m.output_point },\n            |m: &mut IncrementalMerkleVoucher| { &mut m.output_point },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<IncrementalMerkleVoucher>(\n            \"IncrementalMerkleVoucher\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for IncrementalMerkleVoucher {\n    const NAME: &'static str = \"IncrementalMerkleVoucher\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.tree)?;\n                },\n                18 => {\n                    self.filled.push(is.read_message()?);\n                },\n                26 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.cursor)?;\n                },\n                32 => {\n                    self.cursor_depth = is.read_int64()?;\n                },\n                42 => {\n                    self.rt = is.read_bytes()?;\n                },\n                82 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.output_point)?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.tree.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        for value in &self.filled {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if let Some(v) = self.cursor.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.cursor_depth != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.cursor_depth);\n        }\n        if !self.rt.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(5, &self.rt);\n        }\n        if let Some(v) = self.output_point.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.tree.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        for v in &self.filled {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        };\n        if let Some(v) = self.cursor.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        }\n        if self.cursor_depth != 0 {\n            os.write_int64(4, self.cursor_depth)?;\n        }\n        if !self.rt.is_empty() {\n            os.write_bytes(5, &self.rt)?;\n        }\n        if let Some(v) = self.output_point.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> IncrementalMerkleVoucher {\n        IncrementalMerkleVoucher::new()\n    }\n\n    fn clear(&mut self) {\n        self.tree.clear();\n        self.filled.clear();\n        self.cursor.clear();\n        self.cursor_depth = 0;\n        self.rt.clear();\n        self.output_point.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static IncrementalMerkleVoucher {\n        static instance: IncrementalMerkleVoucher = IncrementalMerkleVoucher {\n            tree: ::protobuf::MessageField::none(),\n            filled: ::std::vec::Vec::new(),\n            cursor: ::protobuf::MessageField::none(),\n            cursor_depth: 0,\n            rt: ::std::vec::Vec::new(),\n            output_point: ::protobuf::MessageField::none(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for IncrementalMerkleVoucher {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"IncrementalMerkleVoucher\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for IncrementalMerkleVoucher {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for IncrementalMerkleVoucher {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.IncrementalMerkleVoucherInfo)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct IncrementalMerkleVoucherInfo {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucherInfo.vouchers)\n    pub vouchers: ::std::vec::Vec<IncrementalMerkleVoucher>,\n    // @@protoc_insertion_point(field:protocol.IncrementalMerkleVoucherInfo.paths)\n    pub paths: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.IncrementalMerkleVoucherInfo.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a IncrementalMerkleVoucherInfo {\n    fn default() -> &'a IncrementalMerkleVoucherInfo {\n        <IncrementalMerkleVoucherInfo as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl IncrementalMerkleVoucherInfo {\n    pub fn new() -> IncrementalMerkleVoucherInfo {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"vouchers\",\n            |m: &IncrementalMerkleVoucherInfo| { &m.vouchers },\n            |m: &mut IncrementalMerkleVoucherInfo| { &mut m.vouchers },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"paths\",\n            |m: &IncrementalMerkleVoucherInfo| { &m.paths },\n            |m: &mut IncrementalMerkleVoucherInfo| { &mut m.paths },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<IncrementalMerkleVoucherInfo>(\n            \"IncrementalMerkleVoucherInfo\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for IncrementalMerkleVoucherInfo {\n    const NAME: &'static str = \"IncrementalMerkleVoucherInfo\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.vouchers.push(is.read_message()?);\n                },\n                18 => {\n                    self.paths.push(is.read_bytes()?);\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        for value in &self.vouchers {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.paths {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        for v in &self.vouchers {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        };\n        for v in &self.paths {\n            os.write_bytes(2, &v)?;\n        };\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> IncrementalMerkleVoucherInfo {\n        IncrementalMerkleVoucherInfo::new()\n    }\n\n    fn clear(&mut self) {\n        self.vouchers.clear();\n        self.paths.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static IncrementalMerkleVoucherInfo {\n        static instance: IncrementalMerkleVoucherInfo = IncrementalMerkleVoucherInfo {\n            vouchers: ::std::vec::Vec::new(),\n            paths: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for IncrementalMerkleVoucherInfo {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"IncrementalMerkleVoucherInfo\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for IncrementalMerkleVoucherInfo {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for IncrementalMerkleVoucherInfo {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.SpendDescription)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct SpendDescription {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.SpendDescription.value_commitment)\n    pub value_commitment: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SpendDescription.anchor)\n    pub anchor: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SpendDescription.nullifier)\n    pub nullifier: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SpendDescription.rk)\n    pub rk: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SpendDescription.zkproof)\n    pub zkproof: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SpendDescription.spend_authority_signature)\n    pub spend_authority_signature: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.SpendDescription.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a SpendDescription {\n    fn default() -> &'a SpendDescription {\n        <SpendDescription as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl SpendDescription {\n    pub fn new() -> SpendDescription {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(6);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"value_commitment\",\n            |m: &SpendDescription| { &m.value_commitment },\n            |m: &mut SpendDescription| { &mut m.value_commitment },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"anchor\",\n            |m: &SpendDescription| { &m.anchor },\n            |m: &mut SpendDescription| { &mut m.anchor },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"nullifier\",\n            |m: &SpendDescription| { &m.nullifier },\n            |m: &mut SpendDescription| { &mut m.nullifier },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"rk\",\n            |m: &SpendDescription| { &m.rk },\n            |m: &mut SpendDescription| { &mut m.rk },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"zkproof\",\n            |m: &SpendDescription| { &m.zkproof },\n            |m: &mut SpendDescription| { &mut m.zkproof },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"spend_authority_signature\",\n            |m: &SpendDescription| { &m.spend_authority_signature },\n            |m: &mut SpendDescription| { &mut m.spend_authority_signature },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<SpendDescription>(\n            \"SpendDescription\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for SpendDescription {\n    const NAME: &'static str = \"SpendDescription\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.value_commitment = is.read_bytes()?;\n                },\n                18 => {\n                    self.anchor = is.read_bytes()?;\n                },\n                26 => {\n                    self.nullifier = is.read_bytes()?;\n                },\n                34 => {\n                    self.rk = is.read_bytes()?;\n                },\n                42 => {\n                    self.zkproof = is.read_bytes()?;\n                },\n                50 => {\n                    self.spend_authority_signature = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.value_commitment.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.value_commitment);\n        }\n        if !self.anchor.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.anchor);\n        }\n        if !self.nullifier.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.nullifier);\n        }\n        if !self.rk.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.rk);\n        }\n        if !self.zkproof.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(5, &self.zkproof);\n        }\n        if !self.spend_authority_signature.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.spend_authority_signature);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.value_commitment.is_empty() {\n            os.write_bytes(1, &self.value_commitment)?;\n        }\n        if !self.anchor.is_empty() {\n            os.write_bytes(2, &self.anchor)?;\n        }\n        if !self.nullifier.is_empty() {\n            os.write_bytes(3, &self.nullifier)?;\n        }\n        if !self.rk.is_empty() {\n            os.write_bytes(4, &self.rk)?;\n        }\n        if !self.zkproof.is_empty() {\n            os.write_bytes(5, &self.zkproof)?;\n        }\n        if !self.spend_authority_signature.is_empty() {\n            os.write_bytes(6, &self.spend_authority_signature)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> SpendDescription {\n        SpendDescription::new()\n    }\n\n    fn clear(&mut self) {\n        self.value_commitment.clear();\n        self.anchor.clear();\n        self.nullifier.clear();\n        self.rk.clear();\n        self.zkproof.clear();\n        self.spend_authority_signature.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static SpendDescription {\n        static instance: SpendDescription = SpendDescription {\n            value_commitment: ::std::vec::Vec::new(),\n            anchor: ::std::vec::Vec::new(),\n            nullifier: ::std::vec::Vec::new(),\n            rk: ::std::vec::Vec::new(),\n            zkproof: ::std::vec::Vec::new(),\n            spend_authority_signature: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for SpendDescription {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"SpendDescription\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for SpendDescription {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for SpendDescription {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ReceiveDescription)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ReceiveDescription {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ReceiveDescription.value_commitment)\n    pub value_commitment: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ReceiveDescription.note_commitment)\n    pub note_commitment: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ReceiveDescription.epk)\n    pub epk: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ReceiveDescription.c_enc)\n    pub c_enc: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ReceiveDescription.c_out)\n    pub c_out: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ReceiveDescription.zkproof)\n    pub zkproof: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ReceiveDescription.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ReceiveDescription {\n    fn default() -> &'a ReceiveDescription {\n        <ReceiveDescription as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ReceiveDescription {\n    pub fn new() -> ReceiveDescription {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(6);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"value_commitment\",\n            |m: &ReceiveDescription| { &m.value_commitment },\n            |m: &mut ReceiveDescription| { &mut m.value_commitment },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"note_commitment\",\n            |m: &ReceiveDescription| { &m.note_commitment },\n            |m: &mut ReceiveDescription| { &mut m.note_commitment },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"epk\",\n            |m: &ReceiveDescription| { &m.epk },\n            |m: &mut ReceiveDescription| { &mut m.epk },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"c_enc\",\n            |m: &ReceiveDescription| { &m.c_enc },\n            |m: &mut ReceiveDescription| { &mut m.c_enc },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"c_out\",\n            |m: &ReceiveDescription| { &m.c_out },\n            |m: &mut ReceiveDescription| { &mut m.c_out },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"zkproof\",\n            |m: &ReceiveDescription| { &m.zkproof },\n            |m: &mut ReceiveDescription| { &mut m.zkproof },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ReceiveDescription>(\n            \"ReceiveDescription\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ReceiveDescription {\n    const NAME: &'static str = \"ReceiveDescription\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.value_commitment = is.read_bytes()?;\n                },\n                18 => {\n                    self.note_commitment = is.read_bytes()?;\n                },\n                26 => {\n                    self.epk = is.read_bytes()?;\n                },\n                34 => {\n                    self.c_enc = is.read_bytes()?;\n                },\n                42 => {\n                    self.c_out = is.read_bytes()?;\n                },\n                50 => {\n                    self.zkproof = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.value_commitment.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.value_commitment);\n        }\n        if !self.note_commitment.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.note_commitment);\n        }\n        if !self.epk.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(3, &self.epk);\n        }\n        if !self.c_enc.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.c_enc);\n        }\n        if !self.c_out.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(5, &self.c_out);\n        }\n        if !self.zkproof.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.zkproof);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.value_commitment.is_empty() {\n            os.write_bytes(1, &self.value_commitment)?;\n        }\n        if !self.note_commitment.is_empty() {\n            os.write_bytes(2, &self.note_commitment)?;\n        }\n        if !self.epk.is_empty() {\n            os.write_bytes(3, &self.epk)?;\n        }\n        if !self.c_enc.is_empty() {\n            os.write_bytes(4, &self.c_enc)?;\n        }\n        if !self.c_out.is_empty() {\n            os.write_bytes(5, &self.c_out)?;\n        }\n        if !self.zkproof.is_empty() {\n            os.write_bytes(6, &self.zkproof)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ReceiveDescription {\n        ReceiveDescription::new()\n    }\n\n    fn clear(&mut self) {\n        self.value_commitment.clear();\n        self.note_commitment.clear();\n        self.epk.clear();\n        self.c_enc.clear();\n        self.c_out.clear();\n        self.zkproof.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ReceiveDescription {\n        static instance: ReceiveDescription = ReceiveDescription {\n            value_commitment: ::std::vec::Vec::new(),\n            note_commitment: ::std::vec::Vec::new(),\n            epk: ::std::vec::Vec::new(),\n            c_enc: ::std::vec::Vec::new(),\n            c_out: ::std::vec::Vec::new(),\n            zkproof: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ReceiveDescription {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ReceiveDescription\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ReceiveDescription {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ReceiveDescription {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ShieldedTransferContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ShieldedTransferContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.transparent_from_address)\n    pub transparent_from_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.from_amount)\n    pub from_amount: i64,\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.spend_description)\n    pub spend_description: ::std::vec::Vec<SpendDescription>,\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.receive_description)\n    pub receive_description: ::std::vec::Vec<ReceiveDescription>,\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.binding_signature)\n    pub binding_signature: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.transparent_to_address)\n    pub transparent_to_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ShieldedTransferContract.to_amount)\n    pub to_amount: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ShieldedTransferContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ShieldedTransferContract {\n    fn default() -> &'a ShieldedTransferContract {\n        <ShieldedTransferContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ShieldedTransferContract {\n    pub fn new() -> ShieldedTransferContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(7);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"transparent_from_address\",\n            |m: &ShieldedTransferContract| { &m.transparent_from_address },\n            |m: &mut ShieldedTransferContract| { &mut m.transparent_from_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"from_amount\",\n            |m: &ShieldedTransferContract| { &m.from_amount },\n            |m: &mut ShieldedTransferContract| { &mut m.from_amount },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"spend_description\",\n            |m: &ShieldedTransferContract| { &m.spend_description },\n            |m: &mut ShieldedTransferContract| { &mut m.spend_description },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"receive_description\",\n            |m: &ShieldedTransferContract| { &m.receive_description },\n            |m: &mut ShieldedTransferContract| { &mut m.receive_description },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"binding_signature\",\n            |m: &ShieldedTransferContract| { &m.binding_signature },\n            |m: &mut ShieldedTransferContract| { &mut m.binding_signature },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"transparent_to_address\",\n            |m: &ShieldedTransferContract| { &m.transparent_to_address },\n            |m: &mut ShieldedTransferContract| { &mut m.transparent_to_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"to_amount\",\n            |m: &ShieldedTransferContract| { &m.to_amount },\n            |m: &mut ShieldedTransferContract| { &mut m.to_amount },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ShieldedTransferContract>(\n            \"ShieldedTransferContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ShieldedTransferContract {\n    const NAME: &'static str = \"ShieldedTransferContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.transparent_from_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.from_amount = is.read_int64()?;\n                },\n                26 => {\n                    self.spend_description.push(is.read_message()?);\n                },\n                34 => {\n                    self.receive_description.push(is.read_message()?);\n                },\n                42 => {\n                    self.binding_signature = is.read_bytes()?;\n                },\n                50 => {\n                    self.transparent_to_address = is.read_bytes()?;\n                },\n                56 => {\n                    self.to_amount = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.transparent_from_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.transparent_from_address);\n        }\n        if self.from_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.from_amount);\n        }\n        for value in &self.spend_description {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        for value in &self.receive_description {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if !self.binding_signature.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(5, &self.binding_signature);\n        }\n        if !self.transparent_to_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(6, &self.transparent_to_address);\n        }\n        if self.to_amount != 0 {\n            my_size += ::protobuf::rt::int64_size(7, self.to_amount);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.transparent_from_address.is_empty() {\n            os.write_bytes(1, &self.transparent_from_address)?;\n        }\n        if self.from_amount != 0 {\n            os.write_int64(2, self.from_amount)?;\n        }\n        for v in &self.spend_description {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        };\n        for v in &self.receive_description {\n            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n        };\n        if !self.binding_signature.is_empty() {\n            os.write_bytes(5, &self.binding_signature)?;\n        }\n        if !self.transparent_to_address.is_empty() {\n            os.write_bytes(6, &self.transparent_to_address)?;\n        }\n        if self.to_amount != 0 {\n            os.write_int64(7, self.to_amount)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ShieldedTransferContract {\n        ShieldedTransferContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.transparent_from_address.clear();\n        self.from_amount = 0;\n        self.spend_description.clear();\n        self.receive_description.clear();\n        self.binding_signature.clear();\n        self.transparent_to_address.clear();\n        self.to_amount = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ShieldedTransferContract {\n        static instance: ShieldedTransferContract = ShieldedTransferContract {\n            transparent_from_address: ::std::vec::Vec::new(),\n            from_amount: 0,\n            spend_description: ::std::vec::Vec::new(),\n            receive_description: ::std::vec::Vec::new(),\n            binding_signature: ::std::vec::Vec::new(),\n            transparent_to_address: ::std::vec::Vec::new(),\n            to_amount: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ShieldedTransferContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ShieldedTransferContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ShieldedTransferContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ShieldedTransferContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n#core/contract/shield_contract.proto\\x12\\x08protocol\\\"*\\n\\x12Authentic\\\n    ationPath\\x12\\x14\\n\\x05value\\x18\\x01\\x20\\x03(\\x08R\\x05value\\\"\\x83\\x01\\n\\\n    \\nMerklePath\\x12O\\n\\x14authentication_paths\\x18\\x01\\x20\\x03(\\x0b2\\x1c.pr\\\n    otocol.AuthenticationPathR\\x13authenticationPaths\\x12\\x14\\n\\x05index\\x18\\\n    \\x02\\x20\\x03(\\x08R\\x05index\\x12\\x0e\\n\\x02rt\\x18\\x03\\x20\\x01(\\x0cR\\x02rt\\\n    \\\"7\\n\\x0bOutputPoint\\x12\\x12\\n\\x04hash\\x18\\x01\\x20\\x01(\\x0cR\\x04hash\\x12\\\n    \\x14\\n\\x05index\\x18\\x02\\x20\\x01(\\x05R\\x05index\\\"d\\n\\x0fOutputPointInfo\\\n    \\x124\\n\\nout_points\\x18\\x01\\x20\\x03(\\x0b2\\x15.protocol.OutputPointR\\tout\\\n    Points\\x12\\x1b\\n\\tblock_num\\x18\\x02\\x20\\x01(\\x05R\\x08blockNum\\\"(\\n\\x0cPe\\\n    dersenHash\\x12\\x18\\n\\x07content\\x18\\x01\\x20\\x01(\\x0cR\\x07content\\\"\\xa3\\\n    \\x01\\n\\x15IncrementalMerkleTree\\x12*\\n\\x04left\\x18\\x01\\x20\\x01(\\x0b2\\x16\\\n    .protocol.PedersenHashR\\x04left\\x12,\\n\\x05right\\x18\\x02\\x20\\x01(\\x0b2\\\n    \\x16.protocol.PedersenHashR\\x05right\\x120\\n\\x07parents\\x18\\x03\\x20\\x03(\\\n    \\x0b2\\x16.protocol.PedersenHashR\\x07parents\\\"\\xa5\\x02\\n\\x18IncrementalMe\\\n    rkleVoucher\\x123\\n\\x04tree\\x18\\x01\\x20\\x01(\\x0b2\\x1f.protocol.Incrementa\\\n    lMerkleTreeR\\x04tree\\x12.\\n\\x06filled\\x18\\x02\\x20\\x03(\\x0b2\\x16.protocol\\\n    .PedersenHashR\\x06filled\\x127\\n\\x06cursor\\x18\\x03\\x20\\x01(\\x0b2\\x1f.prot\\\n    ocol.IncrementalMerkleTreeR\\x06cursor\\x12!\\n\\x0ccursor_depth\\x18\\x04\\x20\\\n    \\x01(\\x03R\\x0bcursorDepth\\x12\\x0e\\n\\x02rt\\x18\\x05\\x20\\x01(\\x0cR\\x02rt\\\n    \\x128\\n\\x0coutput_point\\x18\\n\\x20\\x01(\\x0b2\\x15.protocol.OutputPointR\\\n    \\x0boutputPoint\\\"t\\n\\x1cIncrementalMerkleVoucherInfo\\x12>\\n\\x08vouchers\\\n    \\x18\\x01\\x20\\x03(\\x0b2\\\".protocol.IncrementalMerkleVoucherR\\x08vouchers\\\n    \\x12\\x14\\n\\x05paths\\x18\\x02\\x20\\x03(\\x0cR\\x05paths\\\"\\xd9\\x01\\n\\x10SpendD\\\n    escription\\x12)\\n\\x10value_commitment\\x18\\x01\\x20\\x01(\\x0cR\\x0fvalueComm\\\n    itment\\x12\\x16\\n\\x06anchor\\x18\\x02\\x20\\x01(\\x0cR\\x06anchor\\x12\\x1c\\n\\tnu\\\n    llifier\\x18\\x03\\x20\\x01(\\x0cR\\tnullifier\\x12\\x0e\\n\\x02rk\\x18\\x04\\x20\\x01\\\n    (\\x0cR\\x02rk\\x12\\x18\\n\\x07zkproof\\x18\\x05\\x20\\x01(\\x0cR\\x07zkproof\\x12:\\\n    \\n\\x19spend_authority_signature\\x18\\x06\\x20\\x01(\\x0cR\\x17spendAuthorityS\\\n    ignature\\\"\\xbe\\x01\\n\\x12ReceiveDescription\\x12)\\n\\x10value_commitment\\\n    \\x18\\x01\\x20\\x01(\\x0cR\\x0fvalueCommitment\\x12'\\n\\x0fnote_commitment\\x18\\\n    \\x02\\x20\\x01(\\x0cR\\x0enoteCommitment\\x12\\x10\\n\\x03epk\\x18\\x03\\x20\\x01(\\\n    \\x0cR\\x03epk\\x12\\x13\\n\\x05c_enc\\x18\\x04\\x20\\x01(\\x0cR\\x04cEnc\\x12\\x13\\n\\\n    \\x05c_out\\x18\\x05\\x20\\x01(\\x0cR\\x04cOut\\x12\\x18\\n\\x07zkproof\\x18\\x06\\x20\\\n    \\x01(\\x0cR\\x07zkproof\\\"\\x8d\\x03\\n\\x18ShieldedTransferContract\\x128\\n\\x18\\\n    transparent_from_address\\x18\\x01\\x20\\x01(\\x0cR\\x16transparentFromAddress\\\n    \\x12\\x1f\\n\\x0bfrom_amount\\x18\\x02\\x20\\x01(\\x03R\\nfromAmount\\x12G\\n\\x11sp\\\n    end_description\\x18\\x03\\x20\\x03(\\x0b2\\x1a.protocol.SpendDescriptionR\\x10\\\n    spendDescription\\x12M\\n\\x13receive_description\\x18\\x04\\x20\\x03(\\x0b2\\x1c\\\n    .protocol.ReceiveDescriptionR\\x12receiveDescription\\x12+\\n\\x11binding_si\\\n    gnature\\x18\\x05\\x20\\x01(\\x0cR\\x10bindingSignature\\x124\\n\\x16transparent_\\\n    to_address\\x18\\x06\\x20\\x01(\\x0cR\\x14transparentToAddress\\x12\\x1b\\n\\tto_a\\\n    mount\\x18\\x07\\x20\\x01(\\x03R\\x08toAmountBE\\n\\x18org.tron.protos.contractZ\\\n    )github.com/tronprotocol/grpc-gateway/coreJ\\xa5\\x18\\n\\x06\\x12\\x04\\0\\0P\\\n    \\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\\n    \\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\x03\\x04\\01\\\"=Specify\\\n    \\x20the\\x20name\\x20of\\x20the\\x20package\\x20that\\x20generated\\x20the\\x20J\\\n    ava\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\ny\\n\\x02\\x08\\x0b\\x12\\x03\\\n    \\x06\\0@\\x1anoption\\x20java_outer_classname\\x20=\\x20\\\"ShieldedTransferCon\\\n    tract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\x20the\\x20generated\\\n    \\x20Java\\x20file\\n\\n&\\n\\x02\\x04\\0\\x12\\x04\\n\\0\\x0c\\x012\\x1a\\x20for\\x20shi\\\n    elded\\x20transaction\\n\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\n\\x08\\x1a\\n\\x0b\\n\\x04\\\n    \\x04\\0\\x02\\0\\x12\\x03\\x0b\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x04\\x12\\x03\\x0b\\\n    \\x02\\n\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\x0b\\x0b\\x0f\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x03\\x0b\\x10\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\x0b\\\n    \\x18\\x19\\n\\n\\n\\x02\\x04\\x01\\x12\\x04\\x0e\\0\\x12\\x01\\n\\n\\n\\x03\\x04\\x01\\x01\\\n    \\x12\\x03\\x0e\\x08\\x12\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x0f\\x027\\n\\x0c\\n\\\n    \\x05\\x04\\x01\\x02\\0\\x04\\x12\\x03\\x0f\\x02\\n\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x06\\\n    \\x12\\x03\\x0f\\x0b\\x1d\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\x03\\x0f\\x1e2\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x0f56\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x01\\\n    \\x12\\x03\\x10\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x04\\x12\\x03\\x10\\x02\\n\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\x03\\x10\\x0b\\x0f\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\x01\\x01\\x12\\x03\\x10\\x10\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\\n    \\x10\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x02\\x12\\x03\\x11\\x02\\x0f\\n\\x0c\\n\\x05\\\n    \\x04\\x01\\x02\\x02\\x05\\x12\\x03\\x11\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x01\\\n    \\x12\\x03\\x11\\x08\\n\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x03\\x12\\x03\\x11\\r\\x0e\\n\\n\\\n    \\n\\x02\\x04\\x02\\x12\\x04\\x14\\0\\x17\\x01\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\x14\\\n    \\x08\\x13\\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03\\x15\\x02\\x11\\n\\x0c\\n\\x05\\x04\\\n    \\x02\\x02\\0\\x05\\x12\\x03\\x15\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\\n    \\x15\\x08\\x0c\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\x12\\x03\\x15\\x0f\\x10\\n\\x0b\\n\\\n    \\x04\\x04\\x02\\x02\\x01\\x12\\x03\\x16\\x02\\x12\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\\n    \\x12\\x03\\x16\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03\\x16\\x08\\r\\n\\\n    \\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x03\\x12\\x03\\x16\\x10\\x11\\n\\n\\n\\x02\\x04\\x03\\x12\\\n    \\x04\\x19\\0\\x1c\\x01\\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x03\\x19\\x08\\x17\\n\\x0b\\n\\x04\\\n    \\x04\\x03\\x02\\0\\x12\\x03\\x1a\\x02&\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x04\\x12\\x03\\\n    \\x1a\\x02\\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x06\\x12\\x03\\x1a\\x0b\\x16\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\0\\x01\\x12\\x03\\x1a\\x17!\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\\n    \\x03\\x1a$%\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x01\\x12\\x03\\x1b\\x02\\x16\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\x01\\x05\\x12\\x03\\x1b\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\\n    \\x12\\x03\\x1b\\x08\\x11\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x03\\x12\\x03\\x1b\\x14\\x15\\\n    \\n\\n\\n\\x02\\x04\\x04\\x12\\x04\\x1e\\0\\x20\\x01\\n\\n\\n\\x03\\x04\\x04\\x01\\x12\\x03\\\n    \\x1e\\x08\\x14\\n\\x0b\\n\\x04\\x04\\x04\\x02\\0\\x12\\x03\\x1f\\x02\\x14\\n\\x0c\\n\\x05\\\n    \\x04\\x04\\x02\\0\\x05\\x12\\x03\\x1f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x01\\x12\\\n    \\x03\\x1f\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x03\\x12\\x03\\x1f\\x12\\x13\\n\\n\\n\\\n    \\x02\\x04\\x05\\x12\\x04\\\"\\0&\\x01\\n\\n\\n\\x03\\x04\\x05\\x01\\x12\\x03\\\"\\x08\\x1d\\n\\\n    \\x0b\\n\\x04\\x04\\x05\\x02\\0\\x12\\x03#\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x06\\\n    \\x12\\x03#\\x02\\x0e\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x01\\x12\\x03#\\x0f\\x13\\n\\x0c\\n\\\n    \\x05\\x04\\x05\\x02\\0\\x03\\x12\\x03#\\x16\\x17\\n\\x0b\\n\\x04\\x04\\x05\\x02\\x01\\x12\\\n    \\x03$\\x02\\x19\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\x06\\x12\\x03$\\x02\\x0e\\n\\x0c\\n\\\n    \\x05\\x04\\x05\\x02\\x01\\x01\\x12\\x03$\\x0f\\x14\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\\n    \\x03\\x12\\x03$\\x17\\x18\\n\\x0b\\n\\x04\\x04\\x05\\x02\\x02\\x12\\x03%\\x02$\\n\\x0c\\n\\\n    \\x05\\x04\\x05\\x02\\x02\\x04\\x12\\x03%\\x02\\n\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x06\\\n    \\x12\\x03%\\x0b\\x17\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x01\\x12\\x03%\\x18\\x1f\\n\\x0c\\\n    \\n\\x05\\x04\\x05\\x02\\x02\\x03\\x12\\x03%\\\"#\\n\\n\\n\\x02\\x04\\x06\\x12\\x04(\\0/\\x01\\\n    \\n\\n\\n\\x03\\x04\\x06\\x01\\x12\\x03(\\x08\\x20\\n\\x0b\\n\\x04\\x04\\x06\\x02\\0\\x12\\\n    \\x03)\\x02!\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x06\\x12\\x03)\\x02\\x17\\n\\x0c\\n\\x05\\\n    \\x04\\x06\\x02\\0\\x01\\x12\\x03)\\x18\\x1c\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x03\\x12\\\n    \\x03)\\x1f\\x20\\n\\x0b\\n\\x04\\x04\\x06\\x02\\x01\\x12\\x03*\\x02#\\n\\x0c\\n\\x05\\x04\\\n    \\x06\\x02\\x01\\x04\\x12\\x03*\\x02\\n\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x01\\x06\\x12\\x03*\\\n    \\x0b\\x17\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x01\\x01\\x12\\x03*\\x18\\x1e\\n\\x0c\\n\\x05\\\n    \\x04\\x06\\x02\\x01\\x03\\x12\\x03*!\\\"\\n\\x0b\\n\\x04\\x04\\x06\\x02\\x02\\x12\\x03+\\\n    \\x02#\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x02\\x06\\x12\\x03+\\x02\\x17\\n\\x0c\\n\\x05\\x04\\\n    \\x06\\x02\\x02\\x01\\x12\\x03+\\x18\\x1e\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x02\\x03\\x12\\\n    \\x03+!\\\"\\n\\x0b\\n\\x04\\x04\\x06\\x02\\x03\\x12\\x03,\\x02\\x19\\n\\x0c\\n\\x05\\x04\\\n    \\x06\\x02\\x03\\x05\\x12\\x03,\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x03\\x01\\x12\\\n    \\x03,\\x08\\x14\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x03\\x03\\x12\\x03,\\x17\\x18\\n\\x0b\\n\\\n    \\x04\\x04\\x06\\x02\\x04\\x12\\x03-\\x02\\x0f\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x04\\x05\\\n    \\x12\\x03-\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x04\\x01\\x12\\x03-\\x08\\n\\n\\x0c\\n\\\n    \\x05\\x04\\x06\\x02\\x04\\x03\\x12\\x03-\\r\\x0e\\n\\x0b\\n\\x04\\x04\\x06\\x02\\x05\\x12\\\n    \\x03.\\x02\\x20\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x05\\x06\\x12\\x03.\\x02\\r\\n\\x0c\\n\\x05\\\n    \\x04\\x06\\x02\\x05\\x01\\x12\\x03.\\x0e\\x1a\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x05\\x03\\\n    \\x12\\x03.\\x1d\\x1f\\n\\n\\n\\x02\\x04\\x07\\x12\\x041\\04\\x01\\n\\n\\n\\x03\\x04\\x07\\\n    \\x01\\x12\\x031\\x08$\\n\\x0b\\n\\x04\\x04\\x07\\x02\\0\\x12\\x032\\x021\\n\\x0c\\n\\x05\\\n    \\x04\\x07\\x02\\0\\x04\\x12\\x032\\x02\\n\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x06\\x12\\x032\\\n    \\x0b#\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x01\\x12\\x032$,\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\\n    \\x03\\x12\\x032/0\\n\\x0b\\n\\x04\\x04\\x07\\x02\\x01\\x12\\x033\\x02\\x1b\\n\\x0c\\n\\x05\\\n    \\x04\\x07\\x02\\x01\\x04\\x12\\x033\\x02\\n\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x01\\x05\\x12\\\n    \\x033\\x0b\\x10\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x01\\x01\\x12\\x033\\x11\\x16\\n\\x0c\\n\\\n    \\x05\\x04\\x07\\x02\\x01\\x03\\x12\\x033\\x19\\x1a\\n\\n\\n\\x02\\x04\\x08\\x12\\x046\\0=\\\n    \\x01\\n\\n\\n\\x03\\x04\\x08\\x01\\x12\\x036\\x08\\x18\\n\\x0b\\n\\x04\\x04\\x08\\x02\\0\\\n    \\x12\\x037\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x08\\x02\\0\\x05\\x12\\x037\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x08\\x02\\0\\x01\\x12\\x037\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x08\\x02\\0\\x03\\\n    \\x12\\x037\\x1b\\x1c\\n\\x1a\\n\\x04\\x04\\x08\\x02\\x01\\x12\\x038\\x02\\x13\\\"\\r\\x20me\\\n    rkle\\x20root\\n\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x01\\x05\\x12\\x038\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\x08\\x02\\x01\\x01\\x12\\x038\\x08\\x0e\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x01\\\n    \\x03\\x12\\x038\\x11\\x12\\n*\\n\\x04\\x04\\x08\\x02\\x02\\x12\\x039\\x02\\x16\\\"\\x1d\\\n    \\x20used\\x20for\\x20check\\x20double\\x20spend\\n\\n\\x0c\\n\\x05\\x04\\x08\\x02\\\n    \\x02\\x05\\x12\\x039\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x02\\x01\\x12\\x039\\x08\\\n    \\x11\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x02\\x03\\x12\\x039\\x14\\x15\\n7\\n\\x04\\x04\\x08\\\n    \\x02\\x03\\x12\\x03:\\x02\\x0f\\\"*\\x20used\\x20for\\x20check\\x20spend\\x20authori\\\n    ty\\x20signature\\n\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x03\\x05\\x12\\x03:\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x08\\x02\\x03\\x01\\x12\\x03:\\x08\\n\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x03\\\n    \\x03\\x12\\x03:\\r\\x0e\\n\\x0b\\n\\x04\\x04\\x08\\x02\\x04\\x12\\x03;\\x02\\x14\\n\\x0c\\n\\\n    \\x05\\x04\\x08\\x02\\x04\\x05\\x12\\x03;\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x04\\\n    \\x01\\x12\\x03;\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x04\\x03\\x12\\x03;\\x12\\x13\\n\\\n    \\x0b\\n\\x04\\x04\\x08\\x02\\x05\\x12\\x03<\\x02&\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x05\\x05\\\n    \\x12\\x03<\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x08\\x02\\x05\\x01\\x12\\x03<\\x08!\\n\\x0c\\n\\\n    \\x05\\x04\\x08\\x02\\x05\\x03\\x12\\x03<$%\\n\\n\\n\\x02\\x04\\t\\x12\\x04?\\0F\\x01\\n\\n\\\n    \\n\\x03\\x04\\t\\x01\\x12\\x03?\\x08\\x1a\\n\\x0b\\n\\x04\\x04\\t\\x02\\0\\x12\\x03@\\x02\\\n    \\x1d\\n\\x0c\\n\\x05\\x04\\t\\x02\\0\\x05\\x12\\x03@\\x02\\x07\\n\\x0c\\n\\x05\\x04\\t\\x02\\\n    \\0\\x01\\x12\\x03@\\x08\\x18\\n\\x0c\\n\\x05\\x04\\t\\x02\\0\\x03\\x12\\x03@\\x1b\\x1c\\n\\\n    \\x0b\\n\\x04\\x04\\t\\x02\\x01\\x12\\x03A\\x02\\x1c\\n\\x0c\\n\\x05\\x04\\t\\x02\\x01\\x05\\\n    \\x12\\x03A\\x02\\x07\\n\\x0c\\n\\x05\\x04\\t\\x02\\x01\\x01\\x12\\x03A\\x08\\x17\\n\\x0c\\n\\\n    \\x05\\x04\\t\\x02\\x01\\x03\\x12\\x03A\\x1a\\x1b\\n\\x1d\\n\\x04\\x04\\t\\x02\\x02\\x12\\\n    \\x03B\\x02\\x10\\\"\\x10\\x20for\\x20Encryption\\n\\n\\x0c\\n\\x05\\x04\\t\\x02\\x02\\x05\\\n    \\x12\\x03B\\x02\\x07\\n\\x0c\\n\\x05\\x04\\t\\x02\\x02\\x01\\x12\\x03B\\x08\\x0b\\n\\x0c\\n\\\n    \\x05\\x04\\t\\x02\\x02\\x03\\x12\\x03B\\x0e\\x0f\\n;\\n\\x04\\x04\\t\\x02\\x03\\x12\\x03C\\\n    \\x02\\x12\\\".\\x20Encryption\\x20for\\x20incoming,\\x20decrypt\\x20it\\x20with\\\n    \\x20ivk\\n\\n\\x0c\\n\\x05\\x04\\t\\x02\\x03\\x05\\x12\\x03C\\x02\\x07\\n\\x0c\\n\\x05\\x04\\\n    \\t\\x02\\x03\\x01\\x12\\x03C\\x08\\r\\n\\x0c\\n\\x05\\x04\\t\\x02\\x03\\x03\\x12\\x03C\\x10\\\n    \\x11\\n8\\n\\x04\\x04\\t\\x02\\x04\\x12\\x03D\\x02\\x12\\\"+\\x20Encryption\\x20for\\x20\\\n    audit,\\x20decrypt\\x20it\\x20with\\x20ovk\\n\\n\\x0c\\n\\x05\\x04\\t\\x02\\x04\\x05\\\n    \\x12\\x03D\\x02\\x07\\n\\x0c\\n\\x05\\x04\\t\\x02\\x04\\x01\\x12\\x03D\\x08\\r\\n\\x0c\\n\\\n    \\x05\\x04\\t\\x02\\x04\\x03\\x12\\x03D\\x10\\x11\\n\\x0b\\n\\x04\\x04\\t\\x02\\x05\\x12\\\n    \\x03E\\x02\\x14\\n\\x0c\\n\\x05\\x04\\t\\x02\\x05\\x05\\x12\\x03E\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\t\\x02\\x05\\x01\\x12\\x03E\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\t\\x02\\x05\\x03\\x12\\\n    \\x03E\\x12\\x13\\n\\n\\n\\x02\\x04\\n\\x12\\x04H\\0P\\x01\\n\\n\\n\\x03\\x04\\n\\x01\\x12\\\n    \\x03H\\x08\\x20\\n\\\"\\n\\x04\\x04\\n\\x02\\0\\x12\\x03I\\x02%\\\"\\x15\\x20transparent\\\n    \\x20address\\n\\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\x05\\x12\\x03I\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\n\\x02\\0\\x01\\x12\\x03I\\x08\\x20\\n\\x0c\\n\\x05\\x04\\n\\x02\\0\\x03\\x12\\x03I#$\\\n    \\n\\x0b\\n\\x04\\x04\\n\\x02\\x01\\x12\\x03J\\x02\\x18\\n\\x0c\\n\\x05\\x04\\n\\x02\\x01\\\n    \\x05\\x12\\x03J\\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\x01\\x01\\x12\\x03J\\x08\\x13\\n\\\n    \\x0c\\n\\x05\\x04\\n\\x02\\x01\\x03\\x12\\x03J\\x16\\x17\\n\\x0b\\n\\x04\\x04\\n\\x02\\x02\\\n    \\x12\\x03K\\x022\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x04\\x12\\x03K\\x02\\n\\n\\x0c\\n\\x05\\\n    \\x04\\n\\x02\\x02\\x06\\x12\\x03K\\x0b\\x1b\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x01\\x12\\\n    \\x03K\\x1c-\\n\\x0c\\n\\x05\\x04\\n\\x02\\x02\\x03\\x12\\x03K01\\n\\x0b\\n\\x04\\x04\\n\\\n    \\x02\\x03\\x12\\x03L\\x026\\n\\x0c\\n\\x05\\x04\\n\\x02\\x03\\x04\\x12\\x03L\\x02\\n\\n\\\n    \\x0c\\n\\x05\\x04\\n\\x02\\x03\\x06\\x12\\x03L\\x0b\\x1d\\n\\x0c\\n\\x05\\x04\\n\\x02\\x03\\\n    \\x01\\x12\\x03L\\x1e1\\n\\x0c\\n\\x05\\x04\\n\\x02\\x03\\x03\\x12\\x03L45\\n\\x0b\\n\\x04\\\n    \\x04\\n\\x02\\x04\\x12\\x03M\\x02\\x1e\\n\\x0c\\n\\x05\\x04\\n\\x02\\x04\\x05\\x12\\x03M\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\x04\\x01\\x12\\x03M\\x08\\x19\\n\\x0c\\n\\x05\\x04\\\n    \\n\\x02\\x04\\x03\\x12\\x03M\\x1c\\x1d\\n\\\"\\n\\x04\\x04\\n\\x02\\x05\\x12\\x03N\\x02#\\\"\\\n    \\x15\\x20transparent\\x20address\\n\\n\\x0c\\n\\x05\\x04\\n\\x02\\x05\\x05\\x12\\x03N\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\x05\\x01\\x12\\x03N\\x08\\x1e\\n\\x0c\\n\\x05\\x04\\\n    \\n\\x02\\x05\\x03\\x12\\x03N!\\\"\\n3\\n\\x04\\x04\\n\\x02\\x06\\x12\\x03O\\x02\\x16\\\"&\\\n    \\x20the\\x20amount\\x20to\\x20transparent\\x20to_address\\n\\n\\x0c\\n\\x05\\x04\\n\\\n    \\x02\\x06\\x05\\x12\\x03O\\x02\\x07\\n\\x0c\\n\\x05\\x04\\n\\x02\\x06\\x01\\x12\\x03O\\x08\\\n    \\x11\\n\\x0c\\n\\x05\\x04\\n\\x02\\x06\\x03\\x12\\x03O\\x14\\x15b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(11);\n            messages.push(AuthenticationPath::generated_message_descriptor_data());\n            messages.push(MerklePath::generated_message_descriptor_data());\n            messages.push(OutputPoint::generated_message_descriptor_data());\n            messages.push(OutputPointInfo::generated_message_descriptor_data());\n            messages.push(PedersenHash::generated_message_descriptor_data());\n            messages.push(IncrementalMerkleTree::generated_message_descriptor_data());\n            messages.push(IncrementalMerkleVoucher::generated_message_descriptor_data());\n            messages.push(IncrementalMerkleVoucherInfo::generated_message_descriptor_data());\n            messages.push(SpendDescription::generated_message_descriptor_data());\n            messages.push(ReceiveDescription::generated_message_descriptor_data());\n            messages.push(ShieldedTransferContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/smart_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/smart_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.SmartContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct SmartContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.SmartContract.origin_address)\n    pub origin_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SmartContract.contract_address)\n    pub contract_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SmartContract.abi)\n    pub abi: ::protobuf::MessageField<smart_contract::ABI>,\n    // @@protoc_insertion_point(field:protocol.SmartContract.bytecode)\n    pub bytecode: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SmartContract.call_value)\n    pub call_value: i64,\n    // @@protoc_insertion_point(field:protocol.SmartContract.consume_user_resource_percent)\n    pub consume_user_resource_percent: i64,\n    // @@protoc_insertion_point(field:protocol.SmartContract.name)\n    pub name: ::std::string::String,\n    // @@protoc_insertion_point(field:protocol.SmartContract.origin_energy_limit)\n    pub origin_energy_limit: i64,\n    // @@protoc_insertion_point(field:protocol.SmartContract.code_hash)\n    pub code_hash: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SmartContract.trx_hash)\n    pub trx_hash: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SmartContract.version)\n    pub version: i32,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.SmartContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a SmartContract {\n    fn default() -> &'a SmartContract {\n        <SmartContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl SmartContract {\n    pub fn new() -> SmartContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(11);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"origin_address\",\n            |m: &SmartContract| { &m.origin_address },\n            |m: &mut SmartContract| { &mut m.origin_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"contract_address\",\n            |m: &SmartContract| { &m.contract_address },\n            |m: &mut SmartContract| { &mut m.contract_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, smart_contract::ABI>(\n            \"abi\",\n            |m: &SmartContract| { &m.abi },\n            |m: &mut SmartContract| { &mut m.abi },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"bytecode\",\n            |m: &SmartContract| { &m.bytecode },\n            |m: &mut SmartContract| { &mut m.bytecode },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"call_value\",\n            |m: &SmartContract| { &m.call_value },\n            |m: &mut SmartContract| { &mut m.call_value },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"consume_user_resource_percent\",\n            |m: &SmartContract| { &m.consume_user_resource_percent },\n            |m: &mut SmartContract| { &mut m.consume_user_resource_percent },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"name\",\n            |m: &SmartContract| { &m.name },\n            |m: &mut SmartContract| { &mut m.name },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"origin_energy_limit\",\n            |m: &SmartContract| { &m.origin_energy_limit },\n            |m: &mut SmartContract| { &mut m.origin_energy_limit },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"code_hash\",\n            |m: &SmartContract| { &m.code_hash },\n            |m: &mut SmartContract| { &mut m.code_hash },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"trx_hash\",\n            |m: &SmartContract| { &m.trx_hash },\n            |m: &mut SmartContract| { &mut m.trx_hash },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"version\",\n            |m: &SmartContract| { &m.version },\n            |m: &mut SmartContract| { &mut m.version },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<SmartContract>(\n            \"SmartContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for SmartContract {\n    const NAME: &'static str = \"SmartContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.origin_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.contract_address = is.read_bytes()?;\n                },\n                26 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.abi)?;\n                },\n                34 => {\n                    self.bytecode = is.read_bytes()?;\n                },\n                40 => {\n                    self.call_value = is.read_int64()?;\n                },\n                48 => {\n                    self.consume_user_resource_percent = is.read_int64()?;\n                },\n                58 => {\n                    self.name = is.read_string()?;\n                },\n                64 => {\n                    self.origin_energy_limit = is.read_int64()?;\n                },\n                74 => {\n                    self.code_hash = is.read_bytes()?;\n                },\n                82 => {\n                    self.trx_hash = is.read_bytes()?;\n                },\n                88 => {\n                    self.version = is.read_int32()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.origin_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.origin_address);\n        }\n        if !self.contract_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.contract_address);\n        }\n        if let Some(v) = self.abi.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.bytecode.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.bytecode);\n        }\n        if self.call_value != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.call_value);\n        }\n        if self.consume_user_resource_percent != 0 {\n            my_size += ::protobuf::rt::int64_size(6, self.consume_user_resource_percent);\n        }\n        if !self.name.is_empty() {\n            my_size += ::protobuf::rt::string_size(7, &self.name);\n        }\n        if self.origin_energy_limit != 0 {\n            my_size += ::protobuf::rt::int64_size(8, self.origin_energy_limit);\n        }\n        if !self.code_hash.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(9, &self.code_hash);\n        }\n        if !self.trx_hash.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(10, &self.trx_hash);\n        }\n        if self.version != 0 {\n            my_size += ::protobuf::rt::int32_size(11, self.version);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.origin_address.is_empty() {\n            os.write_bytes(1, &self.origin_address)?;\n        }\n        if !self.contract_address.is_empty() {\n            os.write_bytes(2, &self.contract_address)?;\n        }\n        if let Some(v) = self.abi.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        }\n        if !self.bytecode.is_empty() {\n            os.write_bytes(4, &self.bytecode)?;\n        }\n        if self.call_value != 0 {\n            os.write_int64(5, self.call_value)?;\n        }\n        if self.consume_user_resource_percent != 0 {\n            os.write_int64(6, self.consume_user_resource_percent)?;\n        }\n        if !self.name.is_empty() {\n            os.write_string(7, &self.name)?;\n        }\n        if self.origin_energy_limit != 0 {\n            os.write_int64(8, self.origin_energy_limit)?;\n        }\n        if !self.code_hash.is_empty() {\n            os.write_bytes(9, &self.code_hash)?;\n        }\n        if !self.trx_hash.is_empty() {\n            os.write_bytes(10, &self.trx_hash)?;\n        }\n        if self.version != 0 {\n            os.write_int32(11, self.version)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> SmartContract {\n        SmartContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.origin_address.clear();\n        self.contract_address.clear();\n        self.abi.clear();\n        self.bytecode.clear();\n        self.call_value = 0;\n        self.consume_user_resource_percent = 0;\n        self.name.clear();\n        self.origin_energy_limit = 0;\n        self.code_hash.clear();\n        self.trx_hash.clear();\n        self.version = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static SmartContract {\n        static instance: SmartContract = SmartContract {\n            origin_address: ::std::vec::Vec::new(),\n            contract_address: ::std::vec::Vec::new(),\n            abi: ::protobuf::MessageField::none(),\n            bytecode: ::std::vec::Vec::new(),\n            call_value: 0,\n            consume_user_resource_percent: 0,\n            name: ::std::string::String::new(),\n            origin_energy_limit: 0,\n            code_hash: ::std::vec::Vec::new(),\n            trx_hash: ::std::vec::Vec::new(),\n            version: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for SmartContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"SmartContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for SmartContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for SmartContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `SmartContract`\npub mod smart_contract {\n    // @@protoc_insertion_point(message:protocol.SmartContract.ABI)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct ABI {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.SmartContract.ABI.entrys)\n        pub entrys: ::std::vec::Vec<abi::Entry>,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.SmartContract.ABI.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a ABI {\n        fn default() -> &'a ABI {\n            <ABI as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl ABI {\n        pub fn new() -> ABI {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(1);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                \"entrys\",\n                |m: &ABI| { &m.entrys },\n                |m: &mut ABI| { &mut m.entrys },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ABI>(\n                \"SmartContract.ABI\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for ABI {\n        const NAME: &'static str = \"ABI\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.entrys.push(is.read_message()?);\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            for value in &self.entrys {\n                let len = value.compute_size();\n                my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n            };\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            for v in &self.entrys {\n                ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n            };\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> ABI {\n            ABI::new()\n        }\n\n        fn clear(&mut self) {\n            self.entrys.clear();\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static ABI {\n            static instance: ABI = ABI {\n                entrys: ::std::vec::Vec::new(),\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for ABI {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"SmartContract.ABI\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for ABI {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for ABI {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n\n    /// Nested message and enums of message `ABI`\n    pub mod abi {\n        // @@protoc_insertion_point(message:protocol.SmartContract.ABI.Entry)\n        #[derive(PartialEq,Clone,Default,Debug)]\n        pub struct Entry {\n            // message fields\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.anonymous)\n            pub anonymous: bool,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.constant)\n            pub constant: bool,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.name)\n            pub name: ::std::string::String,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.inputs)\n            pub inputs: ::std::vec::Vec<entry::Param>,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.outputs)\n            pub outputs: ::std::vec::Vec<entry::Param>,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.type)\n            pub type_: ::protobuf::EnumOrUnknown<entry::EntryType>,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.payable)\n            pub payable: bool,\n            // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.stateMutability)\n            pub stateMutability: ::protobuf::EnumOrUnknown<entry::StateMutabilityType>,\n            // special fields\n            // @@protoc_insertion_point(special_field:protocol.SmartContract.ABI.Entry.special_fields)\n            pub special_fields: ::protobuf::SpecialFields,\n        }\n\n        impl<'a> ::std::default::Default for &'a Entry {\n            fn default() -> &'a Entry {\n                <Entry as ::protobuf::Message>::default_instance()\n            }\n        }\n\n        impl Entry {\n            pub fn new() -> Entry {\n                ::std::default::Default::default()\n            }\n\n            pub(in super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                let mut fields = ::std::vec::Vec::with_capacity(8);\n                let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"anonymous\",\n                    |m: &Entry| { &m.anonymous },\n                    |m: &mut Entry| { &mut m.anonymous },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"constant\",\n                    |m: &Entry| { &m.constant },\n                    |m: &mut Entry| { &mut m.constant },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"name\",\n                    |m: &Entry| { &m.name },\n                    |m: &mut Entry| { &mut m.name },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                    \"inputs\",\n                    |m: &Entry| { &m.inputs },\n                    |m: &mut Entry| { &mut m.inputs },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n                    \"outputs\",\n                    |m: &Entry| { &m.outputs },\n                    |m: &mut Entry| { &mut m.outputs },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"type\",\n                    |m: &Entry| { &m.type_ },\n                    |m: &mut Entry| { &mut m.type_ },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"payable\",\n                    |m: &Entry| { &m.payable },\n                    |m: &mut Entry| { &mut m.payable },\n                ));\n                fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                    \"stateMutability\",\n                    |m: &Entry| { &m.stateMutability },\n                    |m: &mut Entry| { &mut m.stateMutability },\n                ));\n                ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Entry>(\n                    \"SmartContract.ABI.Entry\",\n                    fields,\n                    oneofs,\n                )\n            }\n        }\n\n        impl ::protobuf::Message for Entry {\n            const NAME: &'static str = \"Entry\";\n\n            fn is_initialized(&self) -> bool {\n                true\n            }\n\n            fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                while let Some(tag) = is.read_raw_tag_or_eof()? {\n                    match tag {\n                        8 => {\n                            self.anonymous = is.read_bool()?;\n                        },\n                        16 => {\n                            self.constant = is.read_bool()?;\n                        },\n                        26 => {\n                            self.name = is.read_string()?;\n                        },\n                        34 => {\n                            self.inputs.push(is.read_message()?);\n                        },\n                        42 => {\n                            self.outputs.push(is.read_message()?);\n                        },\n                        48 => {\n                            self.type_ = is.read_enum_or_unknown()?;\n                        },\n                        56 => {\n                            self.payable = is.read_bool()?;\n                        },\n                        64 => {\n                            self.stateMutability = is.read_enum_or_unknown()?;\n                        },\n                        tag => {\n                            ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                        },\n                    };\n                }\n                ::std::result::Result::Ok(())\n            }\n\n            // Compute sizes of nested messages\n            #[allow(unused_variables)]\n            fn compute_size(&self) -> u64 {\n                let mut my_size = 0;\n                if self.anonymous != false {\n                    my_size += 1 + 1;\n                }\n                if self.constant != false {\n                    my_size += 1 + 1;\n                }\n                if !self.name.is_empty() {\n                    my_size += ::protobuf::rt::string_size(3, &self.name);\n                }\n                for value in &self.inputs {\n                    let len = value.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                };\n                for value in &self.outputs {\n                    let len = value.compute_size();\n                    my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n                };\n                if self.type_ != ::protobuf::EnumOrUnknown::new(entry::EntryType::UnknownEntryType) {\n                    my_size += ::protobuf::rt::int32_size(6, self.type_.value());\n                }\n                if self.payable != false {\n                    my_size += 1 + 1;\n                }\n                if self.stateMutability != ::protobuf::EnumOrUnknown::new(entry::StateMutabilityType::UnknownMutabilityType) {\n                    my_size += ::protobuf::rt::int32_size(8, self.stateMutability.value());\n                }\n                my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                self.special_fields.cached_size().set(my_size as u32);\n                my_size\n            }\n\n            fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                if self.anonymous != false {\n                    os.write_bool(1, self.anonymous)?;\n                }\n                if self.constant != false {\n                    os.write_bool(2, self.constant)?;\n                }\n                if !self.name.is_empty() {\n                    os.write_string(3, &self.name)?;\n                }\n                for v in &self.inputs {\n                    ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;\n                };\n                for v in &self.outputs {\n                    ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?;\n                };\n                if self.type_ != ::protobuf::EnumOrUnknown::new(entry::EntryType::UnknownEntryType) {\n                    os.write_enum(6, ::protobuf::EnumOrUnknown::value(&self.type_))?;\n                }\n                if self.payable != false {\n                    os.write_bool(7, self.payable)?;\n                }\n                if self.stateMutability != ::protobuf::EnumOrUnknown::new(entry::StateMutabilityType::UnknownMutabilityType) {\n                    os.write_enum(8, ::protobuf::EnumOrUnknown::value(&self.stateMutability))?;\n                }\n                os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                ::std::result::Result::Ok(())\n            }\n\n            fn special_fields(&self) -> &::protobuf::SpecialFields {\n                &self.special_fields\n            }\n\n            fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                &mut self.special_fields\n            }\n\n            fn new() -> Entry {\n                Entry::new()\n            }\n\n            fn clear(&mut self) {\n                self.anonymous = false;\n                self.constant = false;\n                self.name.clear();\n                self.inputs.clear();\n                self.outputs.clear();\n                self.type_ = ::protobuf::EnumOrUnknown::new(entry::EntryType::UnknownEntryType);\n                self.payable = false;\n                self.stateMutability = ::protobuf::EnumOrUnknown::new(entry::StateMutabilityType::UnknownMutabilityType);\n                self.special_fields.clear();\n            }\n\n            fn default_instance() -> &'static Entry {\n                static instance: Entry = Entry {\n                    anonymous: false,\n                    constant: false,\n                    name: ::std::string::String::new(),\n                    inputs: ::std::vec::Vec::new(),\n                    outputs: ::std::vec::Vec::new(),\n                    type_: ::protobuf::EnumOrUnknown::from_i32(0),\n                    payable: false,\n                    stateMutability: ::protobuf::EnumOrUnknown::from_i32(0),\n                    special_fields: ::protobuf::SpecialFields::new(),\n                };\n                &instance\n            }\n        }\n\n        impl ::protobuf::MessageFull for Entry {\n            fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                descriptor.get(|| super::super::file_descriptor().message_by_package_relative_name(\"SmartContract.ABI.Entry\").unwrap()).clone()\n            }\n        }\n\n        impl ::std::fmt::Display for Entry {\n            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                ::protobuf::text_format::fmt(self, f)\n            }\n        }\n\n        impl ::protobuf::reflect::ProtobufValue for Entry {\n            type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n        }\n\n        /// Nested message and enums of message `Entry`\n        pub mod entry {\n            // @@protoc_insertion_point(message:protocol.SmartContract.ABI.Entry.Param)\n            #[derive(PartialEq,Clone,Default,Debug)]\n            pub struct Param {\n                // message fields\n                // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.Param.indexed)\n                pub indexed: bool,\n                // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.Param.name)\n                pub name: ::std::string::String,\n                // @@protoc_insertion_point(field:protocol.SmartContract.ABI.Entry.Param.type)\n                pub type_: ::std::string::String,\n                // special fields\n                // @@protoc_insertion_point(special_field:protocol.SmartContract.ABI.Entry.Param.special_fields)\n                pub special_fields: ::protobuf::SpecialFields,\n            }\n\n            impl<'a> ::std::default::Default for &'a Param {\n                fn default() -> &'a Param {\n                    <Param as ::protobuf::Message>::default_instance()\n                }\n            }\n\n            impl Param {\n                pub fn new() -> Param {\n                    ::std::default::Default::default()\n                }\n\n                pub(in super::super::super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n                    let mut fields = ::std::vec::Vec::with_capacity(3);\n                    let mut oneofs = ::std::vec::Vec::with_capacity(0);\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"indexed\",\n                        |m: &Param| { &m.indexed },\n                        |m: &mut Param| { &mut m.indexed },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"name\",\n                        |m: &Param| { &m.name },\n                        |m: &mut Param| { &mut m.name },\n                    ));\n                    fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                        \"type\",\n                        |m: &Param| { &m.type_ },\n                        |m: &mut Param| { &mut m.type_ },\n                    ));\n                    ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Param>(\n                        \"SmartContract.ABI.Entry.Param\",\n                        fields,\n                        oneofs,\n                    )\n                }\n            }\n\n            impl ::protobuf::Message for Param {\n                const NAME: &'static str = \"Param\";\n\n                fn is_initialized(&self) -> bool {\n                    true\n                }\n\n                fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n                    while let Some(tag) = is.read_raw_tag_or_eof()? {\n                        match tag {\n                            8 => {\n                                self.indexed = is.read_bool()?;\n                            },\n                            18 => {\n                                self.name = is.read_string()?;\n                            },\n                            26 => {\n                                self.type_ = is.read_string()?;\n                            },\n                            tag => {\n                                ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                            },\n                        };\n                    }\n                    ::std::result::Result::Ok(())\n                }\n\n                // Compute sizes of nested messages\n                #[allow(unused_variables)]\n                fn compute_size(&self) -> u64 {\n                    let mut my_size = 0;\n                    if self.indexed != false {\n                        my_size += 1 + 1;\n                    }\n                    if !self.name.is_empty() {\n                        my_size += ::protobuf::rt::string_size(2, &self.name);\n                    }\n                    if !self.type_.is_empty() {\n                        my_size += ::protobuf::rt::string_size(3, &self.type_);\n                    }\n                    my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n                    self.special_fields.cached_size().set(my_size as u32);\n                    my_size\n                }\n\n                fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n                    if self.indexed != false {\n                        os.write_bool(1, self.indexed)?;\n                    }\n                    if !self.name.is_empty() {\n                        os.write_string(2, &self.name)?;\n                    }\n                    if !self.type_.is_empty() {\n                        os.write_string(3, &self.type_)?;\n                    }\n                    os.write_unknown_fields(self.special_fields.unknown_fields())?;\n                    ::std::result::Result::Ok(())\n                }\n\n                fn special_fields(&self) -> &::protobuf::SpecialFields {\n                    &self.special_fields\n                }\n\n                fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n                    &mut self.special_fields\n                }\n\n                fn new() -> Param {\n                    Param::new()\n                }\n\n                fn clear(&mut self) {\n                    self.indexed = false;\n                    self.name.clear();\n                    self.type_.clear();\n                    self.special_fields.clear();\n                }\n\n                fn default_instance() -> &'static Param {\n                    static instance: Param = Param {\n                        indexed: false,\n                        name: ::std::string::String::new(),\n                        type_: ::std::string::String::new(),\n                        special_fields: ::protobuf::SpecialFields::new(),\n                    };\n                    &instance\n                }\n            }\n\n            impl ::protobuf::MessageFull for Param {\n                fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n                    static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n                    descriptor.get(|| super::super::super::file_descriptor().message_by_package_relative_name(\"SmartContract.ABI.Entry.Param\").unwrap()).clone()\n                }\n            }\n\n            impl ::std::fmt::Display for Param {\n                fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n                    ::protobuf::text_format::fmt(self, f)\n                }\n            }\n\n            impl ::protobuf::reflect::ProtobufValue for Param {\n                type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n            }\n\n            #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n            // @@protoc_insertion_point(enum:protocol.SmartContract.ABI.Entry.EntryType)\n            pub enum EntryType {\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.UnknownEntryType)\n                UnknownEntryType = 0,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.Constructor)\n                Constructor = 1,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.Function)\n                Function = 2,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.Event)\n                Event = 3,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.Fallback)\n                Fallback = 4,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.Receive)\n                Receive = 5,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.EntryType.Error)\n                Error = 6,\n            }\n\n            impl ::protobuf::Enum for EntryType {\n                const NAME: &'static str = \"EntryType\";\n\n                fn value(&self) -> i32 {\n                    *self as i32\n                }\n\n                fn from_i32(value: i32) -> ::std::option::Option<EntryType> {\n                    match value {\n                        0 => ::std::option::Option::Some(EntryType::UnknownEntryType),\n                        1 => ::std::option::Option::Some(EntryType::Constructor),\n                        2 => ::std::option::Option::Some(EntryType::Function),\n                        3 => ::std::option::Option::Some(EntryType::Event),\n                        4 => ::std::option::Option::Some(EntryType::Fallback),\n                        5 => ::std::option::Option::Some(EntryType::Receive),\n                        6 => ::std::option::Option::Some(EntryType::Error),\n                        _ => ::std::option::Option::None\n                    }\n                }\n\n                fn from_str(str: &str) -> ::std::option::Option<EntryType> {\n                    match str {\n                        \"UnknownEntryType\" => ::std::option::Option::Some(EntryType::UnknownEntryType),\n                        \"Constructor\" => ::std::option::Option::Some(EntryType::Constructor),\n                        \"Function\" => ::std::option::Option::Some(EntryType::Function),\n                        \"Event\" => ::std::option::Option::Some(EntryType::Event),\n                        \"Fallback\" => ::std::option::Option::Some(EntryType::Fallback),\n                        \"Receive\" => ::std::option::Option::Some(EntryType::Receive),\n                        \"Error\" => ::std::option::Option::Some(EntryType::Error),\n                        _ => ::std::option::Option::None\n                    }\n                }\n\n                const VALUES: &'static [EntryType] = &[\n                    EntryType::UnknownEntryType,\n                    EntryType::Constructor,\n                    EntryType::Function,\n                    EntryType::Event,\n                    EntryType::Fallback,\n                    EntryType::Receive,\n                    EntryType::Error,\n                ];\n            }\n\n            impl ::protobuf::EnumFull for EntryType {\n                fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n                    static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n                    descriptor.get(|| super::super::super::file_descriptor().enum_by_package_relative_name(\"SmartContract.ABI.Entry.EntryType\").unwrap()).clone()\n                }\n\n                fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n                    let index = *self as usize;\n                    Self::enum_descriptor().value_by_index(index)\n                }\n            }\n\n            impl ::std::default::Default for EntryType {\n                fn default() -> Self {\n                    EntryType::UnknownEntryType\n                }\n            }\n\n            impl EntryType {\n                pub(in super::super::super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n                    ::protobuf::reflect::GeneratedEnumDescriptorData::new::<EntryType>(\"SmartContract.ABI.Entry.EntryType\")\n                }\n            }\n\n            #[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)]\n            // @@protoc_insertion_point(enum:protocol.SmartContract.ABI.Entry.StateMutabilityType)\n            pub enum StateMutabilityType {\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.StateMutabilityType.UnknownMutabilityType)\n                UnknownMutabilityType = 0,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.StateMutabilityType.Pure)\n                Pure = 1,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.StateMutabilityType.View)\n                View = 2,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.StateMutabilityType.Nonpayable)\n                Nonpayable = 3,\n                // @@protoc_insertion_point(enum_value:protocol.SmartContract.ABI.Entry.StateMutabilityType.Payable)\n                Payable = 4,\n            }\n\n            impl ::protobuf::Enum for StateMutabilityType {\n                const NAME: &'static str = \"StateMutabilityType\";\n\n                fn value(&self) -> i32 {\n                    *self as i32\n                }\n\n                fn from_i32(value: i32) -> ::std::option::Option<StateMutabilityType> {\n                    match value {\n                        0 => ::std::option::Option::Some(StateMutabilityType::UnknownMutabilityType),\n                        1 => ::std::option::Option::Some(StateMutabilityType::Pure),\n                        2 => ::std::option::Option::Some(StateMutabilityType::View),\n                        3 => ::std::option::Option::Some(StateMutabilityType::Nonpayable),\n                        4 => ::std::option::Option::Some(StateMutabilityType::Payable),\n                        _ => ::std::option::Option::None\n                    }\n                }\n\n                fn from_str(str: &str) -> ::std::option::Option<StateMutabilityType> {\n                    match str {\n                        \"UnknownMutabilityType\" => ::std::option::Option::Some(StateMutabilityType::UnknownMutabilityType),\n                        \"Pure\" => ::std::option::Option::Some(StateMutabilityType::Pure),\n                        \"View\" => ::std::option::Option::Some(StateMutabilityType::View),\n                        \"Nonpayable\" => ::std::option::Option::Some(StateMutabilityType::Nonpayable),\n                        \"Payable\" => ::std::option::Option::Some(StateMutabilityType::Payable),\n                        _ => ::std::option::Option::None\n                    }\n                }\n\n                const VALUES: &'static [StateMutabilityType] = &[\n                    StateMutabilityType::UnknownMutabilityType,\n                    StateMutabilityType::Pure,\n                    StateMutabilityType::View,\n                    StateMutabilityType::Nonpayable,\n                    StateMutabilityType::Payable,\n                ];\n            }\n\n            impl ::protobuf::EnumFull for StateMutabilityType {\n                fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor {\n                    static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new();\n                    descriptor.get(|| super::super::super::file_descriptor().enum_by_package_relative_name(\"SmartContract.ABI.Entry.StateMutabilityType\").unwrap()).clone()\n                }\n\n                fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor {\n                    let index = *self as usize;\n                    Self::enum_descriptor().value_by_index(index)\n                }\n            }\n\n            impl ::std::default::Default for StateMutabilityType {\n                fn default() -> Self {\n                    StateMutabilityType::UnknownMutabilityType\n                }\n            }\n\n            impl StateMutabilityType {\n                pub(in super::super::super) fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData {\n                    ::protobuf::reflect::GeneratedEnumDescriptorData::new::<StateMutabilityType>(\"SmartContract.ABI.Entry.StateMutabilityType\")\n                }\n            }\n        }\n    }\n}\n\n// @@protoc_insertion_point(message:protocol.ContractState)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ContractState {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ContractState.energy_usage)\n    pub energy_usage: i64,\n    // @@protoc_insertion_point(field:protocol.ContractState.energy_factor)\n    pub energy_factor: i64,\n    // @@protoc_insertion_point(field:protocol.ContractState.update_cycle)\n    pub update_cycle: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ContractState.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ContractState {\n    fn default() -> &'a ContractState {\n        <ContractState as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ContractState {\n    pub fn new() -> ContractState {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"energy_usage\",\n            |m: &ContractState| { &m.energy_usage },\n            |m: &mut ContractState| { &mut m.energy_usage },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"energy_factor\",\n            |m: &ContractState| { &m.energy_factor },\n            |m: &mut ContractState| { &mut m.energy_factor },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"update_cycle\",\n            |m: &ContractState| { &m.update_cycle },\n            |m: &mut ContractState| { &mut m.update_cycle },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ContractState>(\n            \"ContractState\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ContractState {\n    const NAME: &'static str = \"ContractState\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                8 => {\n                    self.energy_usage = is.read_int64()?;\n                },\n                16 => {\n                    self.energy_factor = is.read_int64()?;\n                },\n                24 => {\n                    self.update_cycle = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if self.energy_usage != 0 {\n            my_size += ::protobuf::rt::int64_size(1, self.energy_usage);\n        }\n        if self.energy_factor != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.energy_factor);\n        }\n        if self.update_cycle != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.update_cycle);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if self.energy_usage != 0 {\n            os.write_int64(1, self.energy_usage)?;\n        }\n        if self.energy_factor != 0 {\n            os.write_int64(2, self.energy_factor)?;\n        }\n        if self.update_cycle != 0 {\n            os.write_int64(3, self.update_cycle)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ContractState {\n        ContractState::new()\n    }\n\n    fn clear(&mut self) {\n        self.energy_usage = 0;\n        self.energy_factor = 0;\n        self.update_cycle = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ContractState {\n        static instance: ContractState = ContractState {\n            energy_usage: 0,\n            energy_factor: 0,\n            update_cycle: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ContractState {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ContractState\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ContractState {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ContractState {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.CreateSmartContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct CreateSmartContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.CreateSmartContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.CreateSmartContract.new_contract)\n    pub new_contract: ::protobuf::MessageField<SmartContract>,\n    // @@protoc_insertion_point(field:protocol.CreateSmartContract.call_token_value)\n    pub call_token_value: i64,\n    // @@protoc_insertion_point(field:protocol.CreateSmartContract.token_id)\n    pub token_id: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.CreateSmartContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a CreateSmartContract {\n    fn default() -> &'a CreateSmartContract {\n        <CreateSmartContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl CreateSmartContract {\n    pub fn new() -> CreateSmartContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &CreateSmartContract| { &m.owner_address },\n            |m: &mut CreateSmartContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, SmartContract>(\n            \"new_contract\",\n            |m: &CreateSmartContract| { &m.new_contract },\n            |m: &mut CreateSmartContract| { &mut m.new_contract },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"call_token_value\",\n            |m: &CreateSmartContract| { &m.call_token_value },\n            |m: &mut CreateSmartContract| { &mut m.call_token_value },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"token_id\",\n            |m: &CreateSmartContract| { &m.token_id },\n            |m: &mut CreateSmartContract| { &mut m.token_id },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<CreateSmartContract>(\n            \"CreateSmartContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for CreateSmartContract {\n    const NAME: &'static str = \"CreateSmartContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.new_contract)?;\n                },\n                24 => {\n                    self.call_token_value = is.read_int64()?;\n                },\n                32 => {\n                    self.token_id = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if let Some(v) = self.new_contract.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if self.call_token_value != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.call_token_value);\n        }\n        if self.token_id != 0 {\n            my_size += ::protobuf::rt::int64_size(4, self.token_id);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if let Some(v) = self.new_contract.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        }\n        if self.call_token_value != 0 {\n            os.write_int64(3, self.call_token_value)?;\n        }\n        if self.token_id != 0 {\n            os.write_int64(4, self.token_id)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> CreateSmartContract {\n        CreateSmartContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.new_contract.clear();\n        self.call_token_value = 0;\n        self.token_id = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static CreateSmartContract {\n        static instance: CreateSmartContract = CreateSmartContract {\n            owner_address: ::std::vec::Vec::new(),\n            new_contract: ::protobuf::MessageField::none(),\n            call_token_value: 0,\n            token_id: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for CreateSmartContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"CreateSmartContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for CreateSmartContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for CreateSmartContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.TriggerSmartContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct TriggerSmartContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.TriggerSmartContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TriggerSmartContract.contract_address)\n    pub contract_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TriggerSmartContract.call_value)\n    pub call_value: i64,\n    // @@protoc_insertion_point(field:protocol.TriggerSmartContract.data)\n    pub data: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.TriggerSmartContract.call_token_value)\n    pub call_token_value: i64,\n    // @@protoc_insertion_point(field:protocol.TriggerSmartContract.token_id)\n    pub token_id: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.TriggerSmartContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a TriggerSmartContract {\n    fn default() -> &'a TriggerSmartContract {\n        <TriggerSmartContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl TriggerSmartContract {\n    pub fn new() -> TriggerSmartContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(6);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &TriggerSmartContract| { &m.owner_address },\n            |m: &mut TriggerSmartContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"contract_address\",\n            |m: &TriggerSmartContract| { &m.contract_address },\n            |m: &mut TriggerSmartContract| { &mut m.contract_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"call_value\",\n            |m: &TriggerSmartContract| { &m.call_value },\n            |m: &mut TriggerSmartContract| { &mut m.call_value },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"data\",\n            |m: &TriggerSmartContract| { &m.data },\n            |m: &mut TriggerSmartContract| { &mut m.data },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"call_token_value\",\n            |m: &TriggerSmartContract| { &m.call_token_value },\n            |m: &mut TriggerSmartContract| { &mut m.call_token_value },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"token_id\",\n            |m: &TriggerSmartContract| { &m.token_id },\n            |m: &mut TriggerSmartContract| { &mut m.token_id },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<TriggerSmartContract>(\n            \"TriggerSmartContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for TriggerSmartContract {\n    const NAME: &'static str = \"TriggerSmartContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.contract_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.call_value = is.read_int64()?;\n                },\n                34 => {\n                    self.data = is.read_bytes()?;\n                },\n                40 => {\n                    self.call_token_value = is.read_int64()?;\n                },\n                48 => {\n                    self.token_id = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.contract_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.contract_address);\n        }\n        if self.call_value != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.call_value);\n        }\n        if !self.data.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(4, &self.data);\n        }\n        if self.call_token_value != 0 {\n            my_size += ::protobuf::rt::int64_size(5, self.call_token_value);\n        }\n        if self.token_id != 0 {\n            my_size += ::protobuf::rt::int64_size(6, self.token_id);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.contract_address.is_empty() {\n            os.write_bytes(2, &self.contract_address)?;\n        }\n        if self.call_value != 0 {\n            os.write_int64(3, self.call_value)?;\n        }\n        if !self.data.is_empty() {\n            os.write_bytes(4, &self.data)?;\n        }\n        if self.call_token_value != 0 {\n            os.write_int64(5, self.call_token_value)?;\n        }\n        if self.token_id != 0 {\n            os.write_int64(6, self.token_id)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> TriggerSmartContract {\n        TriggerSmartContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.contract_address.clear();\n        self.call_value = 0;\n        self.data.clear();\n        self.call_token_value = 0;\n        self.token_id = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static TriggerSmartContract {\n        static instance: TriggerSmartContract = TriggerSmartContract {\n            owner_address: ::std::vec::Vec::new(),\n            contract_address: ::std::vec::Vec::new(),\n            call_value: 0,\n            data: ::std::vec::Vec::new(),\n            call_token_value: 0,\n            token_id: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for TriggerSmartContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"TriggerSmartContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for TriggerSmartContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for TriggerSmartContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.ClearABIContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct ClearABIContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.ClearABIContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.ClearABIContract.contract_address)\n    pub contract_address: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.ClearABIContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a ClearABIContract {\n    fn default() -> &'a ClearABIContract {\n        <ClearABIContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl ClearABIContract {\n    pub fn new() -> ClearABIContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &ClearABIContract| { &m.owner_address },\n            |m: &mut ClearABIContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"contract_address\",\n            |m: &ClearABIContract| { &m.contract_address },\n            |m: &mut ClearABIContract| { &mut m.contract_address },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<ClearABIContract>(\n            \"ClearABIContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for ClearABIContract {\n    const NAME: &'static str = \"ClearABIContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.contract_address = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.contract_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.contract_address);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.contract_address.is_empty() {\n            os.write_bytes(2, &self.contract_address)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> ClearABIContract {\n        ClearABIContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.contract_address.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static ClearABIContract {\n        static instance: ClearABIContract = ClearABIContract {\n            owner_address: ::std::vec::Vec::new(),\n            contract_address: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for ClearABIContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"ClearABIContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for ClearABIContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for ClearABIContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UpdateSettingContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UpdateSettingContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UpdateSettingContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateSettingContract.contract_address)\n    pub contract_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateSettingContract.consume_user_resource_percent)\n    pub consume_user_resource_percent: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UpdateSettingContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UpdateSettingContract {\n    fn default() -> &'a UpdateSettingContract {\n        <UpdateSettingContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UpdateSettingContract {\n    pub fn new() -> UpdateSettingContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UpdateSettingContract| { &m.owner_address },\n            |m: &mut UpdateSettingContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"contract_address\",\n            |m: &UpdateSettingContract| { &m.contract_address },\n            |m: &mut UpdateSettingContract| { &mut m.contract_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"consume_user_resource_percent\",\n            |m: &UpdateSettingContract| { &m.consume_user_resource_percent },\n            |m: &mut UpdateSettingContract| { &mut m.consume_user_resource_percent },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UpdateSettingContract>(\n            \"UpdateSettingContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UpdateSettingContract {\n    const NAME: &'static str = \"UpdateSettingContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.contract_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.consume_user_resource_percent = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.contract_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.contract_address);\n        }\n        if self.consume_user_resource_percent != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.consume_user_resource_percent);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.contract_address.is_empty() {\n            os.write_bytes(2, &self.contract_address)?;\n        }\n        if self.consume_user_resource_percent != 0 {\n            os.write_int64(3, self.consume_user_resource_percent)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UpdateSettingContract {\n        UpdateSettingContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.contract_address.clear();\n        self.consume_user_resource_percent = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UpdateSettingContract {\n        static instance: UpdateSettingContract = UpdateSettingContract {\n            owner_address: ::std::vec::Vec::new(),\n            contract_address: ::std::vec::Vec::new(),\n            consume_user_resource_percent: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UpdateSettingContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UpdateSettingContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UpdateSettingContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UpdateSettingContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UpdateEnergyLimitContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UpdateEnergyLimitContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UpdateEnergyLimitContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateEnergyLimitContract.contract_address)\n    pub contract_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateEnergyLimitContract.origin_energy_limit)\n    pub origin_energy_limit: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UpdateEnergyLimitContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UpdateEnergyLimitContract {\n    fn default() -> &'a UpdateEnergyLimitContract {\n        <UpdateEnergyLimitContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UpdateEnergyLimitContract {\n    pub fn new() -> UpdateEnergyLimitContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UpdateEnergyLimitContract| { &m.owner_address },\n            |m: &mut UpdateEnergyLimitContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"contract_address\",\n            |m: &UpdateEnergyLimitContract| { &m.contract_address },\n            |m: &mut UpdateEnergyLimitContract| { &mut m.contract_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"origin_energy_limit\",\n            |m: &UpdateEnergyLimitContract| { &m.origin_energy_limit },\n            |m: &mut UpdateEnergyLimitContract| { &mut m.origin_energy_limit },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UpdateEnergyLimitContract>(\n            \"UpdateEnergyLimitContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UpdateEnergyLimitContract {\n    const NAME: &'static str = \"UpdateEnergyLimitContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.contract_address = is.read_bytes()?;\n                },\n                24 => {\n                    self.origin_energy_limit = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.contract_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.contract_address);\n        }\n        if self.origin_energy_limit != 0 {\n            my_size += ::protobuf::rt::int64_size(3, self.origin_energy_limit);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.contract_address.is_empty() {\n            os.write_bytes(2, &self.contract_address)?;\n        }\n        if self.origin_energy_limit != 0 {\n            os.write_int64(3, self.origin_energy_limit)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UpdateEnergyLimitContract {\n        UpdateEnergyLimitContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.contract_address.clear();\n        self.origin_energy_limit = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UpdateEnergyLimitContract {\n        static instance: UpdateEnergyLimitContract = UpdateEnergyLimitContract {\n            owner_address: ::std::vec::Vec::new(),\n            contract_address: ::std::vec::Vec::new(),\n            origin_energy_limit: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UpdateEnergyLimitContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UpdateEnergyLimitContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UpdateEnergyLimitContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UpdateEnergyLimitContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.SmartContractDataWrapper)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct SmartContractDataWrapper {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.SmartContractDataWrapper.smart_contract)\n    pub smart_contract: ::protobuf::MessageField<SmartContract>,\n    // @@protoc_insertion_point(field:protocol.SmartContractDataWrapper.runtimecode)\n    pub runtimecode: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SmartContractDataWrapper.contract_state)\n    pub contract_state: ::protobuf::MessageField<ContractState>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.SmartContractDataWrapper.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a SmartContractDataWrapper {\n    fn default() -> &'a SmartContractDataWrapper {\n        <SmartContractDataWrapper as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl SmartContractDataWrapper {\n    pub fn new() -> SmartContractDataWrapper {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, SmartContract>(\n            \"smart_contract\",\n            |m: &SmartContractDataWrapper| { &m.smart_contract },\n            |m: &mut SmartContractDataWrapper| { &mut m.smart_contract },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"runtimecode\",\n            |m: &SmartContractDataWrapper| { &m.runtimecode },\n            |m: &mut SmartContractDataWrapper| { &mut m.runtimecode },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ContractState>(\n            \"contract_state\",\n            |m: &SmartContractDataWrapper| { &m.contract_state },\n            |m: &mut SmartContractDataWrapper| { &mut m.contract_state },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<SmartContractDataWrapper>(\n            \"SmartContractDataWrapper\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for SmartContractDataWrapper {\n    const NAME: &'static str = \"SmartContractDataWrapper\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.smart_contract)?;\n                },\n                18 => {\n                    self.runtimecode = is.read_bytes()?;\n                },\n                26 => {\n                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.contract_state)?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if let Some(v) = self.smart_contract.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        if !self.runtimecode.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.runtimecode);\n        }\n        if let Some(v) = self.contract_state.as_ref() {\n            let len = v.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if let Some(v) = self.smart_contract.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;\n        }\n        if !self.runtimecode.is_empty() {\n            os.write_bytes(2, &self.runtimecode)?;\n        }\n        if let Some(v) = self.contract_state.as_ref() {\n            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> SmartContractDataWrapper {\n        SmartContractDataWrapper::new()\n    }\n\n    fn clear(&mut self) {\n        self.smart_contract.clear();\n        self.runtimecode.clear();\n        self.contract_state.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static SmartContractDataWrapper {\n        static instance: SmartContractDataWrapper = SmartContractDataWrapper {\n            smart_contract: ::protobuf::MessageField::none(),\n            runtimecode: ::std::vec::Vec::new(),\n            contract_state: ::protobuf::MessageField::none(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for SmartContractDataWrapper {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"SmartContractDataWrapper\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for SmartContractDataWrapper {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for SmartContractDataWrapper {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n\\\"core/contract/smart_contract.proto\\x12\\x08protocol\\x1a\\x0fcore/Tron.\\\n    proto\\\"\\xa0\\t\\n\\rSmartContract\\x12%\\n\\x0eorigin_address\\x18\\x01\\x20\\x01(\\\n    \\x0cR\\roriginAddress\\x12)\\n\\x10contract_address\\x18\\x02\\x20\\x01(\\x0cR\\\n    \\x0fcontractAddress\\x12-\\n\\x03abi\\x18\\x03\\x20\\x01(\\x0b2\\x1b.protocol.Sma\\\n    rtContract.ABIR\\x03abi\\x12\\x1a\\n\\x08bytecode\\x18\\x04\\x20\\x01(\\x0cR\\x08by\\\n    tecode\\x12\\x1d\\n\\ncall_value\\x18\\x05\\x20\\x01(\\x03R\\tcallValue\\x12A\\n\\x1d\\\n    consume_user_resource_percent\\x18\\x06\\x20\\x01(\\x03R\\x1aconsumeUserResour\\\n    cePercent\\x12\\x12\\n\\x04name\\x18\\x07\\x20\\x01(\\tR\\x04name\\x12.\\n\\x13origin\\\n    _energy_limit\\x18\\x08\\x20\\x01(\\x03R\\x11originEnergyLimit\\x12\\x1b\\n\\tcode\\\n    _hash\\x18\\t\\x20\\x01(\\x0cR\\x08codeHash\\x12\\x19\\n\\x08trx_hash\\x18\\n\\x20\\\n    \\x01(\\x0cR\\x07trxHash\\x12\\x18\\n\\x07version\\x18\\x0b\\x20\\x01(\\x05R\\x07vers\\\n    ion\\x1a\\xf9\\x05\\n\\x03ABI\\x129\\n\\x06entrys\\x18\\x01\\x20\\x03(\\x0b2!.protoco\\\n    l.SmartContract.ABI.EntryR\\x06entrys\\x1a\\xb6\\x05\\n\\x05Entry\\x12\\x1c\\n\\ta\\\n    nonymous\\x18\\x01\\x20\\x01(\\x08R\\tanonymous\\x12\\x1a\\n\\x08constant\\x18\\x02\\\n    \\x20\\x01(\\x08R\\x08constant\\x12\\x12\\n\\x04name\\x18\\x03\\x20\\x01(\\tR\\x04name\\\n    \\x12?\\n\\x06inputs\\x18\\x04\\x20\\x03(\\x0b2'.protocol.SmartContract.ABI.Entr\\\n    y.ParamR\\x06inputs\\x12A\\n\\x07outputs\\x18\\x05\\x20\\x03(\\x0b2'.protocol.Sma\\\n    rtContract.ABI.Entry.ParamR\\x07outputs\\x12?\\n\\x04type\\x18\\x06\\x20\\x01(\\\n    \\x0e2+.protocol.SmartContract.ABI.Entry.EntryTypeR\\x04type\\x12\\x18\\n\\x07\\\n    payable\\x18\\x07\\x20\\x01(\\x08R\\x07payable\\x12_\\n\\x0fstateMutability\\x18\\\n    \\x08\\x20\\x01(\\x0e25.protocol.SmartContract.ABI.Entry.StateMutabilityType\\\n    R\\x0fstateMutability\\x1aI\\n\\x05Param\\x12\\x18\\n\\x07indexed\\x18\\x01\\x20\\\n    \\x01(\\x08R\\x07indexed\\x12\\x12\\n\\x04name\\x18\\x02\\x20\\x01(\\tR\\x04name\\x12\\\n    \\x12\\n\\x04type\\x18\\x03\\x20\\x01(\\tR\\x04type\\\"q\\n\\tEntryType\\x12\\x14\\n\\x10\\\n    UnknownEntryType\\x10\\0\\x12\\x0f\\n\\x0bConstructor\\x10\\x01\\x12\\x0c\\n\\x08Fun\\\n    ction\\x10\\x02\\x12\\t\\n\\x05Event\\x10\\x03\\x12\\x0c\\n\\x08Fallback\\x10\\x04\\x12\\\n    \\x0b\\n\\x07Receive\\x10\\x05\\x12\\t\\n\\x05Error\\x10\\x06\\\"a\\n\\x13StateMutabili\\\n    tyType\\x12\\x19\\n\\x15UnknownMutabilityType\\x10\\0\\x12\\x08\\n\\x04Pure\\x10\\\n    \\x01\\x12\\x08\\n\\x04View\\x10\\x02\\x12\\x0e\\n\\nNonpayable\\x10\\x03\\x12\\x0b\\n\\\n    \\x07Payable\\x10\\x04\\\"z\\n\\rContractState\\x12!\\n\\x0cenergy_usage\\x18\\x01\\\n    \\x20\\x01(\\x03R\\x0benergyUsage\\x12#\\n\\renergy_factor\\x18\\x02\\x20\\x01(\\x03\\\n    R\\x0cenergyFactor\\x12!\\n\\x0cupdate_cycle\\x18\\x03\\x20\\x01(\\x03R\\x0bupdate\\\n    Cycle\\\"\\xbb\\x01\\n\\x13CreateSmartContract\\x12#\\n\\rowner_address\\x18\\x01\\\n    \\x20\\x01(\\x0cR\\x0cownerAddress\\x12:\\n\\x0cnew_contract\\x18\\x02\\x20\\x01(\\\n    \\x0b2\\x17.protocol.SmartContractR\\x0bnewContract\\x12(\\n\\x10call_token_va\\\n    lue\\x18\\x03\\x20\\x01(\\x03R\\x0ecallTokenValue\\x12\\x19\\n\\x08token_id\\x18\\\n    \\x04\\x20\\x01(\\x03R\\x07tokenId\\\"\\xde\\x01\\n\\x14TriggerSmartContract\\x12#\\n\\\n    \\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12)\\n\\x10contract\\\n    _address\\x18\\x02\\x20\\x01(\\x0cR\\x0fcontractAddress\\x12\\x1d\\n\\ncall_value\\\n    \\x18\\x03\\x20\\x01(\\x03R\\tcallValue\\x12\\x12\\n\\x04data\\x18\\x04\\x20\\x01(\\x0c\\\n    R\\x04data\\x12(\\n\\x10call_token_value\\x18\\x05\\x20\\x01(\\x03R\\x0ecallTokenV\\\n    alue\\x12\\x19\\n\\x08token_id\\x18\\x06\\x20\\x01(\\x03R\\x07tokenId\\\"b\\n\\x10Clea\\\n    rABIContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\\n    \\x12)\\n\\x10contract_address\\x18\\x02\\x20\\x01(\\x0cR\\x0fcontractAddress\\\"\\\n    \\xaa\\x01\\n\\x15UpdateSettingContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\\n    \\x01(\\x0cR\\x0cownerAddress\\x12)\\n\\x10contract_address\\x18\\x02\\x20\\x01(\\\n    \\x0cR\\x0fcontractAddress\\x12A\\n\\x1dconsume_user_resource_percent\\x18\\x03\\\n    \\x20\\x01(\\x03R\\x1aconsumeUserResourcePercent\\\"\\x9b\\x01\\n\\x19UpdateEnergy\\\n    LimitContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddres\\\n    s\\x12)\\n\\x10contract_address\\x18\\x02\\x20\\x01(\\x0cR\\x0fcontractAddress\\\n    \\x12.\\n\\x13origin_energy_limit\\x18\\x03\\x20\\x01(\\x03R\\x11originEnergyLimi\\\n    t\\\"\\xbc\\x01\\n\\x18SmartContractDataWrapper\\x12>\\n\\x0esmart_contract\\x18\\\n    \\x01\\x20\\x01(\\x0b2\\x17.protocol.SmartContractR\\rsmartContract\\x12\\x20\\n\\\n    \\x0bruntimecode\\x18\\x02\\x20\\x01(\\x0cR\\x0bruntimecode\\x12>\\n\\x0econtract_\\\n    state\\x18\\x03\\x20\\x01(\\x0b2\\x17.protocol.ContractStateR\\rcontractStateBE\\\n    \\n\\x18org.tron.protos.contractZ)github.com/tronprotocol/grpc-gateway/cor\\\n    eJ\\xde\\x20\\n\\x06\\x12\\x04\\0\\0g\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\\n    \\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\\n    \\x01\\x12\\x03\\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20\\\n    that\\x20generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0\\\n    @\\nt\\n\\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\x1aioption\\x20java_outer_classname\\x20\\\n    =\\x20\\\"CreateSmartContract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\\n    \\x20the\\x20generated\\x20Java\\x20file\\n\\n\\t\\n\\x02\\x03\\0\\x12\\x03\\x08\\0\\x19\\\n    \\n\\n\\n\\x02\\x04\\0\\x12\\x04\\n\\0:\\x01\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\n\\x08\\x15\\\n    \\n\\x0c\\n\\x04\\x04\\0\\x03\\0\\x12\\x04\\x0b\\x02.\\x03\\n\\x0c\\n\\x05\\x04\\0\\x03\\0\\\n    \\x01\\x12\\x03\\x0b\\n\\r\\n\\x0e\\n\\x06\\x04\\0\\x03\\0\\x03\\0\\x12\\x04\\x0c\\x04,\\x05\\\n    \\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\x03\\0\\x01\\x12\\x03\\x0c\\x0c\\x11\\n\\x10\\n\\x08\\x04\\0\\\n    \\x03\\0\\x03\\0\\x04\\0\\x12\\x04\\r\\x06\\x15\\x07\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x04\\\n    \\0\\x01\\x12\\x03\\r\\x0b\\x14\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\0\\x12\\x03\\\n    \\x0e\\x08\\x1d\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\0\\x01\\x12\\x03\\x0e\\\n    \\x08\\x18\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\0\\x02\\x12\\x03\\x0e\\x1b\\\n    \\x1c\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x01\\x12\\x03\\x0f\\x08\\x18\\n\\x12\\\n    \\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x01\\x01\\x12\\x03\\x0f\\x08\\x13\\n\\x12\\n\\\n    \\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x01\\x02\\x12\\x03\\x0f\\x16\\x17\\n\\x11\\n\\n\\\n    \\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x02\\x12\\x03\\x10\\x08\\x15\\n\\x12\\n\\x0b\\x04\\0\\\n    \\x03\\0\\x03\\0\\x04\\0\\x02\\x02\\x01\\x12\\x03\\x10\\x08\\x10\\n\\x12\\n\\x0b\\x04\\0\\x03\\\n    \\0\\x03\\0\\x04\\0\\x02\\x02\\x02\\x12\\x03\\x10\\x13\\x14\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\\n    \\0\\x04\\0\\x02\\x03\\x12\\x03\\x11\\x08\\x12\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\\n    \\x02\\x03\\x01\\x12\\x03\\x11\\x08\\r\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\\n    \\x03\\x02\\x12\\x03\\x11\\x10\\x11\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x04\\\n    \\x12\\x03\\x12\\x08\\x15\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x04\\x01\\x12\\\n    \\x03\\x12\\x08\\x10\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x04\\x02\\x12\\x03\\\n    \\x12\\x13\\x14\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x05\\x12\\x03\\x13\\x08\\\n    \\x14\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x05\\x01\\x12\\x03\\x13\\x08\\x0f\\\n    \\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x05\\x02\\x12\\x03\\x13\\x12\\x13\\n\\\n    \\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x06\\x12\\x03\\x14\\x08\\x12\\n\\x12\\n\\x0b\\\n    \\x04\\0\\x03\\0\\x03\\0\\x04\\0\\x02\\x06\\x01\\x12\\x03\\x14\\x08\\r\\n\\x12\\n\\x0b\\x04\\0\\\n    \\x03\\0\\x03\\0\\x04\\0\\x02\\x06\\x02\\x12\\x03\\x14\\x10\\x11\\n\\x10\\n\\x08\\x04\\0\\x03\\\n    \\0\\x03\\0\\x03\\0\\x12\\x04\\x16\\x06\\x1b\\x07\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\\n    \\x01\\x12\\x03\\x16\\x0e\\x13\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\0\\x12\\x03\\\n    \\x17\\x08\\x19\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\0\\x05\\x12\\x03\\x17\\\n    \\x08\\x0c\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\0\\x01\\x12\\x03\\x17\\r\\x14\\\n    \\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\0\\x03\\x12\\x03\\x17\\x17\\x18\\n\\x11\\\n    \\n\\n\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\x01\\x12\\x03\\x18\\x08\\x18\\n\\x12\\n\\x0b\\x04\\\n    \\0\\x03\\0\\x03\\0\\x03\\0\\x02\\x01\\x05\\x12\\x03\\x18\\x08\\x0e\\n\\x12\\n\\x0b\\x04\\0\\\n    \\x03\\0\\x03\\0\\x03\\0\\x02\\x01\\x01\\x12\\x03\\x18\\x0f\\x13\\n\\x12\\n\\x0b\\x04\\0\\x03\\\n    \\0\\x03\\0\\x03\\0\\x02\\x01\\x03\\x12\\x03\\x18\\x16\\x17\\n+\\n\\n\\x04\\0\\x03\\0\\x03\\0\\\n    \\x03\\0\\x02\\x02\\x12\\x03\\x19\\x08\\x18\\\"\\x18\\x20SolidityType\\x20type\\x20=\\\n    \\x203;\\n\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\x02\\x05\\x12\\x03\\x19\\x08\\\n    \\x0e\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\x02\\x01\\x12\\x03\\x19\\x0f\\x13\\\n    \\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x03\\0\\x02\\x02\\x03\\x12\\x03\\x19\\x16\\x17\\n\\\n    \\x10\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x12\\x04\\x1c\\x06\\\"\\x07\\n\\x10\\n\\t\\x04\\\n    \\0\\x03\\0\\x03\\0\\x04\\x01\\x01\\x12\\x03\\x1c\\x0b\\x1e\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\\n    \\0\\x04\\x01\\x02\\0\\x12\\x03\\x1d\\x08\\\"\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\\n    \\x02\\0\\x01\\x12\\x03\\x1d\\x08\\x1d\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\\n    \\0\\x02\\x12\\x03\\x1d\\x20!\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x01\\x12\\\n    \\x03\\x1e\\x08\\x11\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x01\\x01\\x12\\\n    \\x03\\x1e\\x08\\x0c\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x01\\x02\\x12\\\n    \\x03\\x1e\\x0f\\x10\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x02\\x12\\x03\\x1f\\\n    \\x08\\x11\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x02\\x01\\x12\\x03\\x1f\\\n    \\x08\\x0c\\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x02\\x02\\x12\\x03\\x1f\\\n    \\x0f\\x10\\n\\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x03\\x12\\x03\\x20\\x08\\x17\\\n    \\n\\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x03\\x01\\x12\\x03\\x20\\x08\\x12\\n\\\n    \\x12\\n\\x0b\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x03\\x02\\x12\\x03\\x20\\x15\\x16\\n\\\n    \\x11\\n\\n\\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x04\\x12\\x03!\\x08\\x14\\n\\x12\\n\\x0b\\\n    \\x04\\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x04\\x01\\x12\\x03!\\x08\\x0f\\n\\x12\\n\\x0b\\x04\\\n    \\0\\x03\\0\\x03\\0\\x04\\x01\\x02\\x04\\x02\\x12\\x03!\\x12\\x13\\n\\x0f\\n\\x08\\x04\\0\\\n    \\x03\\0\\x03\\0\\x02\\0\\x12\\x03$\\x06\\x19\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\0\\\n    \\x05\\x12\\x03$\\x06\\n\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\0\\x01\\x12\\x03$\\x0b\\\n    \\x14\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\0\\x03\\x12\\x03$\\x17\\x18\\n\\x0f\\n\\x08\\\n    \\x04\\0\\x03\\0\\x03\\0\\x02\\x01\\x12\\x03%\\x06\\x18\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\\n    \\x02\\x01\\x05\\x12\\x03%\\x06\\n\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x01\\x01\\x12\\\n    \\x03%\\x0b\\x13\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x01\\x03\\x12\\x03%\\x16\\x17\\n\\\n    \\x0f\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\x02\\x02\\x12\\x03&\\x06\\x16\\n\\x10\\n\\t\\x04\\0\\\n    \\x03\\0\\x03\\0\\x02\\x02\\x05\\x12\\x03&\\x06\\x0c\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\\n    \\x02\\x02\\x01\\x12\\x03&\\r\\x11\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x02\\x03\\x12\\\n    \\x03&\\x14\\x15\\n\\x0f\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\x02\\x03\\x12\\x03'\\x06\\x20\\n\\\n    \\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x03\\x04\\x12\\x03'\\x06\\x0e\\n\\x10\\n\\t\\x04\\0\\\n    \\x03\\0\\x03\\0\\x02\\x03\\x06\\x12\\x03'\\x0f\\x14\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\\n    \\x02\\x03\\x01\\x12\\x03'\\x15\\x1b\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x03\\x03\\\n    \\x12\\x03'\\x1e\\x1f\\n\\x0f\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\x02\\x04\\x12\\x03(\\x06!\\n\\\n    \\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x04\\x04\\x12\\x03(\\x06\\x0e\\n\\x10\\n\\t\\x04\\0\\\n    \\x03\\0\\x03\\0\\x02\\x04\\x06\\x12\\x03(\\x0f\\x14\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\\n    \\x02\\x04\\x01\\x12\\x03(\\x15\\x1c\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x04\\x03\\\n    \\x12\\x03(\\x1f\\x20\\n\\x0f\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\x02\\x05\\x12\\x03)\\x06\\x19\\\n    \\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x05\\x06\\x12\\x03)\\x06\\x0f\\n\\x10\\n\\t\\x04\\\n    \\0\\x03\\0\\x03\\0\\x02\\x05\\x01\\x12\\x03)\\x10\\x14\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\\n    \\x02\\x05\\x03\\x12\\x03)\\x17\\x18\\n\\x0f\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\x02\\x06\\x12\\\n    \\x03*\\x06\\x17\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x06\\x05\\x12\\x03*\\x06\\n\\n\\\n    \\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x06\\x01\\x12\\x03*\\x0b\\x12\\n\\x10\\n\\t\\x04\\0\\\n    \\x03\\0\\x03\\0\\x02\\x06\\x03\\x12\\x03*\\x15\\x16\\n\\x0f\\n\\x08\\x04\\0\\x03\\0\\x03\\0\\\n    \\x02\\x07\\x12\\x03+\\x06.\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x07\\x06\\x12\\x03+\\\n    \\x06\\x19\\n\\x10\\n\\t\\x04\\0\\x03\\0\\x03\\0\\x02\\x07\\x01\\x12\\x03+\\x1a)\\n\\x10\\n\\t\\\n    \\x04\\0\\x03\\0\\x03\\0\\x02\\x07\\x03\\x12\\x03+,-\\n\\r\\n\\x06\\x04\\0\\x03\\0\\x02\\0\\\n    \\x12\\x03-\\x04\\x1e\\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\0\\x04\\x12\\x03-\\x04\\x0c\\n\\\n    \\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\0\\x06\\x12\\x03-\\r\\x12\\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\\n    \\x02\\0\\x01\\x12\\x03-\\x13\\x19\\n\\x0e\\n\\x07\\x04\\0\\x03\\0\\x02\\0\\x03\\x12\\x03-\\\n    \\x1c\\x1d\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03/\\x02\\x1b\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\0\\x05\\x12\\x03/\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x01\\x12\\x03/\\x08\\x16\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03/\\x19\\x1a\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\\n    \\x12\\x030\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x05\\x12\\x030\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x01\\x01\\x12\\x030\\x08\\x18\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\\n    \\x12\\x030\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\0\\x02\\x02\\x12\\x031\\x02\\x0e\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\x02\\x06\\x12\\x031\\x02\\x05\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\\n    \\x031\\x06\\t\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x03\\x12\\x031\\x0c\\r\\n\\x0b\\n\\x04\\x04\\\n    \\0\\x02\\x03\\x12\\x032\\x02\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x05\\x12\\x032\\x02\\\n    \\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x01\\x12\\x032\\x08\\x10\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x03\\x03\\x12\\x032\\x13\\x14\\n\\x0b\\n\\x04\\x04\\0\\x02\\x04\\x12\\x033\\x02\\x17\\\n    \\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x05\\x12\\x033\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\x04\\x01\\x12\\x033\\x08\\x12\\n\\x0c\\n\\x05\\x04\\0\\x02\\x04\\x03\\x12\\x033\\x15\\x16\\\n    \\n\\x0b\\n\\x04\\x04\\0\\x02\\x05\\x12\\x034\\x02*\\n\\x0c\\n\\x05\\x04\\0\\x02\\x05\\x05\\\n    \\x12\\x034\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x05\\x01\\x12\\x034\\x08%\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x05\\x03\\x12\\x034()\\n\\x0b\\n\\x04\\x04\\0\\x02\\x06\\x12\\x035\\x02\\\n    \\x12\\n\\x0c\\n\\x05\\x04\\0\\x02\\x06\\x05\\x12\\x035\\x02\\x08\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x06\\x01\\x12\\x035\\t\\r\\n\\x0c\\n\\x05\\x04\\0\\x02\\x06\\x03\\x12\\x035\\x10\\x11\\\n    \\n\\x0b\\n\\x04\\x04\\0\\x02\\x07\\x12\\x036\\x02\\x20\\n\\x0c\\n\\x05\\x04\\0\\x02\\x07\\\n    \\x05\\x12\\x036\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x07\\x01\\x12\\x036\\x08\\x1b\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x07\\x03\\x12\\x036\\x1e\\x1f\\n\\x0b\\n\\x04\\x04\\0\\x02\\x08\\\n    \\x12\\x037\\x02\\x16\\n\\x0c\\n\\x05\\x04\\0\\x02\\x08\\x05\\x12\\x037\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x08\\x01\\x12\\x037\\x08\\x11\\n\\x0c\\n\\x05\\x04\\0\\x02\\x08\\x03\\\n    \\x12\\x037\\x14\\x15\\n\\x0b\\n\\x04\\x04\\0\\x02\\t\\x12\\x038\\x02\\x16\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\t\\x05\\x12\\x038\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\t\\x01\\x12\\x038\\\n    \\x08\\x10\\n\\x0c\\n\\x05\\x04\\0\\x02\\t\\x03\\x12\\x038\\x13\\x15\\n\\x0b\\n\\x04\\x04\\0\\\n    \\x02\\n\\x12\\x039\\x02\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\n\\x05\\x12\\x039\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\n\\x01\\x12\\x039\\x08\\x0f\\n\\x0c\\n\\x05\\x04\\0\\x02\\n\\x03\\\n    \\x12\\x039\\x12\\x14\\n\\n\\n\\x02\\x04\\x01\\x12\\x04<\\0@\\x01\\n\\n\\n\\x03\\x04\\x01\\\n    \\x01\\x12\\x03<\\x08\\x15\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03=\\x02\\x19\\n\\x0c\\n\\\n    \\x05\\x04\\x01\\x02\\0\\x05\\x12\\x03=\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\\n    \\x12\\x03=\\x08\\x14\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03=\\x17\\x18\\n\\x0b\\n\\\n    \\x04\\x04\\x01\\x02\\x01\\x12\\x03>\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\\n    \\x12\\x03>\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03>\\x08\\x15\\n\\x0c\\\n    \\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03>\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x02\\\n    \\x12\\x03?\\x02\\x19\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\x05\\x12\\x03?\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x01\\x02\\x02\\x01\\x12\\x03?\\x08\\x14\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x02\\\n    \\x03\\x12\\x03?\\x17\\x18\\n\\n\\n\\x02\\x04\\x02\\x12\\x04B\\0G\\x01\\n\\n\\n\\x03\\x04\\\n    \\x02\\x01\\x12\\x03B\\x08\\x1b\\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03C\\x02\\x1a\\n\\\n    \\x0c\\n\\x05\\x04\\x02\\x02\\0\\x05\\x12\\x03C\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\\n    \\x01\\x12\\x03C\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\x12\\x03C\\x18\\x19\\n\\\n    \\x0b\\n\\x04\\x04\\x02\\x02\\x01\\x12\\x03D\\x02!\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x06\\\n    \\x12\\x03D\\x02\\x0f\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03D\\x10\\x1c\\n\\x0c\\\n    \\n\\x05\\x04\\x02\\x02\\x01\\x03\\x12\\x03D\\x1f\\x20\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x02\\\n    \\x12\\x03E\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x05\\x12\\x03E\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x02\\x02\\x02\\x01\\x12\\x03E\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\\n    \\x03\\x12\\x03E\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x03\\x12\\x03F\\x02\\x15\\n\\x0c\\\n    \\n\\x05\\x04\\x02\\x02\\x03\\x05\\x12\\x03F\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x03\\\n    \\x01\\x12\\x03F\\x08\\x10\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x03\\x03\\x12\\x03F\\x13\\x14\\n\\\n    \\n\\n\\x02\\x04\\x03\\x12\\x04I\\0P\\x01\\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x03I\\x08\\x1c\\\n    \\n\\x0b\\n\\x04\\x04\\x03\\x02\\0\\x12\\x03J\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\\n    \\x05\\x12\\x03J\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x01\\x12\\x03J\\x08\\x15\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\0\\x03\\x12\\x03J\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x03\\x02\\\n    \\x01\\x12\\x03K\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x05\\x12\\x03K\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x03K\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x01\\x03\\x12\\x03K\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x02\\x12\\x03L\\x02\\x17\\n\\\n    \\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x05\\x12\\x03L\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\\n    \\x02\\x01\\x12\\x03L\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x02\\x03\\x12\\x03L\\x15\\\n    \\x16\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x03\\x12\\x03M\\x02\\x11\\n\\x0c\\n\\x05\\x04\\x03\\\n    \\x02\\x03\\x05\\x12\\x03M\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x01\\x12\\x03M\\\n    \\x08\\x0c\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x03\\x03\\x12\\x03M\\x0f\\x10\\n\\x0b\\n\\x04\\\n    \\x04\\x03\\x02\\x04\\x12\\x03N\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x05\\x12\\\n    \\x03N\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x04\\x01\\x12\\x03N\\x08\\x18\\n\\x0c\\n\\\n    \\x05\\x04\\x03\\x02\\x04\\x03\\x12\\x03N\\x1b\\x1c\\n\\x0b\\n\\x04\\x04\\x03\\x02\\x05\\\n    \\x12\\x03O\\x02\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x05\\x05\\x12\\x03O\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\x05\\x01\\x12\\x03O\\x08\\x10\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x05\\\n    \\x03\\x12\\x03O\\x13\\x14\\n\\n\\n\\x02\\x04\\x04\\x12\\x04R\\0U\\x01\\n\\n\\n\\x03\\x04\\\n    \\x04\\x01\\x12\\x03R\\x08\\x18\\n\\x0b\\n\\x04\\x04\\x04\\x02\\0\\x12\\x03S\\x02\\x1a\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\0\\x05\\x12\\x03S\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\\n    \\x01\\x12\\x03S\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x04\\x02\\0\\x03\\x12\\x03S\\x18\\x19\\n\\\n    \\x0b\\n\\x04\\x04\\x04\\x02\\x01\\x12\\x03T\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\\n    \\x05\\x12\\x03T\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x01\\x12\\x03T\\x08\\x18\\n\\\n    \\x0c\\n\\x05\\x04\\x04\\x02\\x01\\x03\\x12\\x03T\\x1b\\x1c\\n\\n\\n\\x02\\x04\\x05\\x12\\\n    \\x04W\\0[\\x01\\n\\n\\n\\x03\\x04\\x05\\x01\\x12\\x03W\\x08\\x1d\\n\\x0b\\n\\x04\\x04\\x05\\\n    \\x02\\0\\x12\\x03X\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\x05\\x12\\x03X\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x05\\x02\\0\\x01\\x12\\x03X\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x05\\x02\\0\\\n    \\x03\\x12\\x03X\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x05\\x02\\x01\\x12\\x03Y\\x02\\x1d\\n\\x0c\\\n    \\n\\x05\\x04\\x05\\x02\\x01\\x05\\x12\\x03Y\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\\n    \\x01\\x12\\x03Y\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x01\\x03\\x12\\x03Y\\x1b\\x1c\\n\\\n    \\x0b\\n\\x04\\x04\\x05\\x02\\x02\\x12\\x03Z\\x02*\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x05\\\n    \\x12\\x03Z\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x05\\x02\\x02\\x01\\x12\\x03Z\\x08%\\n\\x0c\\n\\\n    \\x05\\x04\\x05\\x02\\x02\\x03\\x12\\x03Z()\\n\\n\\n\\x02\\x04\\x06\\x12\\x04]\\0a\\x01\\n\\\n    \\n\\n\\x03\\x04\\x06\\x01\\x12\\x03]\\x08!\\n\\x0b\\n\\x04\\x04\\x06\\x02\\0\\x12\\x03^\\\n    \\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x05\\x12\\x03^\\x02\\x07\\n\\x0c\\n\\x05\\x04\\\n    \\x06\\x02\\0\\x01\\x12\\x03^\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x06\\x02\\0\\x03\\x12\\x03^\\\n    \\x18\\x19\\n\\x0b\\n\\x04\\x04\\x06\\x02\\x01\\x12\\x03_\\x02\\x1d\\n\\x0c\\n\\x05\\x04\\\n    \\x06\\x02\\x01\\x05\\x12\\x03_\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x01\\x01\\x12\\\n    \\x03_\\x08\\x18\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x01\\x03\\x12\\x03_\\x1b\\x1c\\n\\x0b\\n\\\n    \\x04\\x04\\x06\\x02\\x02\\x12\\x03`\\x02\\x20\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x02\\x05\\\n    \\x12\\x03`\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x06\\x02\\x02\\x01\\x12\\x03`\\x08\\x1b\\n\\x0c\\\n    \\n\\x05\\x04\\x06\\x02\\x02\\x03\\x12\\x03`\\x1e\\x1f\\n\\n\\n\\x02\\x04\\x07\\x12\\x04c\\0\\\n    g\\x01\\n\\n\\n\\x03\\x04\\x07\\x01\\x12\\x03c\\x08\\x20\\n\\x0b\\n\\x04\\x04\\x07\\x02\\0\\\n    \\x12\\x03d\\x02#\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x06\\x12\\x03d\\x02\\x0f\\n\\x0c\\n\\\n    \\x05\\x04\\x07\\x02\\0\\x01\\x12\\x03d\\x10\\x1e\\n\\x0c\\n\\x05\\x04\\x07\\x02\\0\\x03\\\n    \\x12\\x03d!\\\"\\n\\x0b\\n\\x04\\x04\\x07\\x02\\x01\\x12\\x03e\\x02\\x18\\n\\x0c\\n\\x05\\\n    \\x04\\x07\\x02\\x01\\x05\\x12\\x03e\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x01\\x01\\\n    \\x12\\x03e\\x08\\x13\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x01\\x03\\x12\\x03e\\x16\\x17\\n\\x0b\\\n    \\n\\x04\\x04\\x07\\x02\\x02\\x12\\x03f\\x02#\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x02\\x06\\x12\\\n    \\x03f\\x02\\x0f\\n\\x0c\\n\\x05\\x04\\x07\\x02\\x02\\x01\\x12\\x03f\\x10\\x1e\\n\\x0c\\n\\\n    \\x05\\x04\\x07\\x02\\x02\\x03\\x12\\x03f!\\\"b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(1);\n            deps.push(super::Tron::file_descriptor().clone());\n            let mut messages = ::std::vec::Vec::with_capacity(11);\n            messages.push(SmartContract::generated_message_descriptor_data());\n            messages.push(ContractState::generated_message_descriptor_data());\n            messages.push(CreateSmartContract::generated_message_descriptor_data());\n            messages.push(TriggerSmartContract::generated_message_descriptor_data());\n            messages.push(ClearABIContract::generated_message_descriptor_data());\n            messages.push(UpdateSettingContract::generated_message_descriptor_data());\n            messages.push(UpdateEnergyLimitContract::generated_message_descriptor_data());\n            messages.push(SmartContractDataWrapper::generated_message_descriptor_data());\n            messages.push(smart_contract::ABI::generated_message_descriptor_data());\n            messages.push(smart_contract::abi::Entry::generated_message_descriptor_data());\n            messages.push(smart_contract::abi::entry::Param::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(2);\n            enums.push(smart_contract::abi::entry::EntryType::generated_enum_descriptor_data());\n            enums.push(smart_contract::abi::entry::StateMutabilityType::generated_enum_descriptor_data());\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/storage_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/storage_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.BuyStorageBytesContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct BuyStorageBytesContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.BuyStorageBytesContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.BuyStorageBytesContract.bytes)\n    pub bytes: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.BuyStorageBytesContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a BuyStorageBytesContract {\n    fn default() -> &'a BuyStorageBytesContract {\n        <BuyStorageBytesContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl BuyStorageBytesContract {\n    pub fn new() -> BuyStorageBytesContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &BuyStorageBytesContract| { &m.owner_address },\n            |m: &mut BuyStorageBytesContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"bytes\",\n            |m: &BuyStorageBytesContract| { &m.bytes },\n            |m: &mut BuyStorageBytesContract| { &mut m.bytes },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BuyStorageBytesContract>(\n            \"BuyStorageBytesContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for BuyStorageBytesContract {\n    const NAME: &'static str = \"BuyStorageBytesContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.bytes = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.bytes != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.bytes);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.bytes != 0 {\n            os.write_int64(2, self.bytes)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> BuyStorageBytesContract {\n        BuyStorageBytesContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.bytes = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static BuyStorageBytesContract {\n        static instance: BuyStorageBytesContract = BuyStorageBytesContract {\n            owner_address: ::std::vec::Vec::new(),\n            bytes: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for BuyStorageBytesContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"BuyStorageBytesContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for BuyStorageBytesContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for BuyStorageBytesContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.BuyStorageContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct BuyStorageContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.BuyStorageContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.BuyStorageContract.quant)\n    pub quant: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.BuyStorageContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a BuyStorageContract {\n    fn default() -> &'a BuyStorageContract {\n        <BuyStorageContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl BuyStorageContract {\n    pub fn new() -> BuyStorageContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &BuyStorageContract| { &m.owner_address },\n            |m: &mut BuyStorageContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"quant\",\n            |m: &BuyStorageContract| { &m.quant },\n            |m: &mut BuyStorageContract| { &mut m.quant },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<BuyStorageContract>(\n            \"BuyStorageContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for BuyStorageContract {\n    const NAME: &'static str = \"BuyStorageContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.quant = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.quant != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.quant);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.quant != 0 {\n            os.write_int64(2, self.quant)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> BuyStorageContract {\n        BuyStorageContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.quant = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static BuyStorageContract {\n        static instance: BuyStorageContract = BuyStorageContract {\n            owner_address: ::std::vec::Vec::new(),\n            quant: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for BuyStorageContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"BuyStorageContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for BuyStorageContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for BuyStorageContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.SellStorageContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct SellStorageContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.SellStorageContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.SellStorageContract.storage_bytes)\n    pub storage_bytes: i64,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.SellStorageContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a SellStorageContract {\n    fn default() -> &'a SellStorageContract {\n        <SellStorageContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl SellStorageContract {\n    pub fn new() -> SellStorageContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &SellStorageContract| { &m.owner_address },\n            |m: &mut SellStorageContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"storage_bytes\",\n            |m: &SellStorageContract| { &m.storage_bytes },\n            |m: &mut SellStorageContract| { &mut m.storage_bytes },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<SellStorageContract>(\n            \"SellStorageContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for SellStorageContract {\n    const NAME: &'static str = \"SellStorageContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.storage_bytes = is.read_int64()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.storage_bytes != 0 {\n            my_size += ::protobuf::rt::int64_size(2, self.storage_bytes);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.storage_bytes != 0 {\n            os.write_int64(2, self.storage_bytes)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> SellStorageContract {\n        SellStorageContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.storage_bytes = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static SellStorageContract {\n        static instance: SellStorageContract = SellStorageContract {\n            owner_address: ::std::vec::Vec::new(),\n            storage_bytes: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for SellStorageContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"SellStorageContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for SellStorageContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for SellStorageContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.UpdateBrokerageContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct UpdateBrokerageContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.UpdateBrokerageContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.UpdateBrokerageContract.brokerage)\n    pub brokerage: i32,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.UpdateBrokerageContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a UpdateBrokerageContract {\n    fn default() -> &'a UpdateBrokerageContract {\n        <UpdateBrokerageContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl UpdateBrokerageContract {\n    pub fn new() -> UpdateBrokerageContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &UpdateBrokerageContract| { &m.owner_address },\n            |m: &mut UpdateBrokerageContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"brokerage\",\n            |m: &UpdateBrokerageContract| { &m.brokerage },\n            |m: &mut UpdateBrokerageContract| { &mut m.brokerage },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<UpdateBrokerageContract>(\n            \"UpdateBrokerageContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for UpdateBrokerageContract {\n    const NAME: &'static str = \"UpdateBrokerageContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                16 => {\n                    self.brokerage = is.read_int32()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if self.brokerage != 0 {\n            my_size += ::protobuf::rt::int32_size(2, self.brokerage);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if self.brokerage != 0 {\n            os.write_int32(2, self.brokerage)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> UpdateBrokerageContract {\n        UpdateBrokerageContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.brokerage = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static UpdateBrokerageContract {\n        static instance: UpdateBrokerageContract = UpdateBrokerageContract {\n            owner_address: ::std::vec::Vec::new(),\n            brokerage: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for UpdateBrokerageContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"UpdateBrokerageContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for UpdateBrokerageContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for UpdateBrokerageContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n$core/contract/storage_contract.proto\\x12\\x08protocol\\\"T\\n\\x17BuyStora\\\n    geBytesContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddr\\\n    ess\\x12\\x14\\n\\x05bytes\\x18\\x02\\x20\\x01(\\x03R\\x05bytes\\\"O\\n\\x12BuyStorage\\\n    Contract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\\n    \\x14\\n\\x05quant\\x18\\x02\\x20\\x01(\\x03R\\x05quant\\\"_\\n\\x13SellStorageContra\\\n    ct\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12#\\n\\rs\\\n    torage_bytes\\x18\\x02\\x20\\x01(\\x03R\\x0cstorageBytes\\\"\\\\\\n\\x17UpdateBroker\\\n    ageContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\\n    \\x12\\x1c\\n\\tbrokerage\\x18\\x02\\x20\\x01(\\x05R\\tbrokerageBE\\n\\x18org.tron.p\\\n    rotos.contractZ)github.com/tronprotocol/grpc-gateway/coreJ\\xd8\\x06\\n\\x06\\\n    \\x12\\x04\\0\\0\\x1a\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\x12\\\n    \\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\x03\\\n    \\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20that\\x20gene\\\n    rated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\nx\\n\\x02\\\n    \\x08\\x0b\\x12\\x03\\x06\\0@\\x1amoption\\x20java_outer_classname\\x20=\\x20\\\"Buy\\\n    StorageBytesContract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\x20th\\\n    e\\x20generated\\x20Java\\x20file\\n\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x08\\0\\x0b\\x01\\n\\\n    \\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\x08\\x08\\x1f\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\t\\\n    \\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\t\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\0\\x01\\x12\\x03\\t\\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\t\\x18\\\n    \\x19\\n$\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\n\\x02\\x12\\\"\\x17\\x20storage\\x20bytes\\\n    \\x20for\\x20buy\\n\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x05\\x12\\x03\\n\\x02\\x07\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\n\\x08\\r\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\\n    \\x03\\n\\x10\\x11\\n\\n\\n\\x02\\x04\\x01\\x12\\x04\\r\\0\\x10\\x01\\n\\n\\n\\x03\\x04\\x01\\\n    \\x01\\x12\\x03\\r\\x08\\x1a\\n\\x0b\\n\\x04\\x04\\x01\\x02\\0\\x12\\x03\\x0e\\x02\\x1a\\n\\\n    \\x0c\\n\\x05\\x04\\x01\\x02\\0\\x05\\x12\\x03\\x0e\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\\n    \\0\\x01\\x12\\x03\\x0e\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x0e\\x18\\\n    \\x19\\n1\\n\\x04\\x04\\x01\\x02\\x01\\x12\\x03\\x0f\\x02\\x12\\\"$\\x20trx\\x20quantity\\\n    \\x20for\\x20buy\\x20storage\\x20(sun)\\n\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\\n    \\x03\\x0f\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03\\x0f\\x08\\r\\n\\x0c\\\n    \\n\\x05\\x04\\x01\\x02\\x01\\x03\\x12\\x03\\x0f\\x10\\x11\\n\\n\\n\\x02\\x04\\x02\\x12\\x04\\\n    \\x12\\0\\x15\\x01\\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\x12\\x08\\x1b\\n\\x0b\\n\\x04\\x04\\\n    \\x02\\x02\\0\\x12\\x03\\x13\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x05\\x12\\x03\\x13\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\x13\\x08\\x15\\n\\x0c\\n\\x05\\\n    \\x04\\x02\\x02\\0\\x03\\x12\\x03\\x13\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x01\\x12\\\n    \\x03\\x14\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x05\\x12\\x03\\x14\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03\\x14\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x02\\\n    \\x02\\x01\\x03\\x12\\x03\\x14\\x18\\x19\\n\\n\\n\\x02\\x04\\x03\\x12\\x04\\x17\\0\\x1a\\x01\\\n    \\n\\n\\n\\x03\\x04\\x03\\x01\\x12\\x03\\x17\\x08\\x1f\\n\\x0b\\n\\x04\\x04\\x03\\x02\\0\\x12\\\n    \\x03\\x18\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\x05\\x12\\x03\\x18\\x02\\x07\\n\\x0c\\\n    \\n\\x05\\x04\\x03\\x02\\0\\x01\\x12\\x03\\x18\\x08\\x15\\n\\x0c\\n\\x05\\x04\\x03\\x02\\0\\\n    \\x03\\x12\\x03\\x18\\x18\\x19\\n\\x18\\n\\x04\\x04\\x03\\x02\\x01\\x12\\x03\\x19\\x02\\x16\\\n    \\\"\\x0b\\x201\\x20mean\\x201%\\n\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x05\\x12\\x03\\x19\\\n    \\x02\\x07\\n\\x0c\\n\\x05\\x04\\x03\\x02\\x01\\x01\\x12\\x03\\x19\\x08\\x11\\n\\x0c\\n\\x05\\\n    \\x04\\x03\\x02\\x01\\x03\\x12\\x03\\x19\\x14\\x15b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(4);\n            messages.push(BuyStorageBytesContract::generated_message_descriptor_data());\n            messages.push(BuyStorageContract::generated_message_descriptor_data());\n            messages.push(SellStorageContract::generated_message_descriptor_data());\n            messages.push(UpdateBrokerageContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/vote_asset_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/vote_asset_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.VoteAssetContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct VoteAssetContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.VoteAssetContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.VoteAssetContract.vote_address)\n    pub vote_address: ::std::vec::Vec<::std::vec::Vec<u8>>,\n    // @@protoc_insertion_point(field:protocol.VoteAssetContract.support)\n    pub support: bool,\n    // @@protoc_insertion_point(field:protocol.VoteAssetContract.count)\n    pub count: i32,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.VoteAssetContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a VoteAssetContract {\n    fn default() -> &'a VoteAssetContract {\n        <VoteAssetContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl VoteAssetContract {\n    pub fn new() -> VoteAssetContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(4);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &VoteAssetContract| { &m.owner_address },\n            |m: &mut VoteAssetContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"vote_address\",\n            |m: &VoteAssetContract| { &m.vote_address },\n            |m: &mut VoteAssetContract| { &mut m.vote_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"support\",\n            |m: &VoteAssetContract| { &m.support },\n            |m: &mut VoteAssetContract| { &mut m.support },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"count\",\n            |m: &VoteAssetContract| { &m.count },\n            |m: &mut VoteAssetContract| { &mut m.count },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<VoteAssetContract>(\n            \"VoteAssetContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for VoteAssetContract {\n    const NAME: &'static str = \"VoteAssetContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.vote_address.push(is.read_bytes()?);\n                },\n                24 => {\n                    self.support = is.read_bool()?;\n                },\n                40 => {\n                    self.count = is.read_int32()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        for value in &self.vote_address {\n            my_size += ::protobuf::rt::bytes_size(2, &value);\n        };\n        if self.support != false {\n            my_size += 1 + 1;\n        }\n        if self.count != 0 {\n            my_size += ::protobuf::rt::int32_size(5, self.count);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        for v in &self.vote_address {\n            os.write_bytes(2, &v)?;\n        };\n        if self.support != false {\n            os.write_bool(3, self.support)?;\n        }\n        if self.count != 0 {\n            os.write_int32(5, self.count)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> VoteAssetContract {\n        VoteAssetContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.vote_address.clear();\n        self.support = false;\n        self.count = 0;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static VoteAssetContract {\n        static instance: VoteAssetContract = VoteAssetContract {\n            owner_address: ::std::vec::Vec::new(),\n            vote_address: ::std::vec::Vec::new(),\n            support: false,\n            count: 0,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for VoteAssetContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"VoteAssetContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for VoteAssetContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for VoteAssetContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n'core/contract/vote_asset_contract.proto\\x12\\x08protocol\\\"\\x8b\\x01\\n\\\n    \\x11VoteAssetContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cown\\\n    erAddress\\x12!\\n\\x0cvote_address\\x18\\x02\\x20\\x03(\\x0cR\\x0bvoteAddress\\\n    \\x12\\x18\\n\\x07support\\x18\\x03\\x20\\x01(\\x08R\\x07support\\x12\\x14\\n\\x05coun\\\n    t\\x18\\x05\\x20\\x01(\\x05R\\x05countBE\\n\\x18org.tron.protos.contractZ)github\\\n    .com/tronprotocol/grpc-gateway/coreJ\\xf0\\x03\\n\\x06\\x12\\x04\\0\\0\\r\\x01\\n\\\n    \\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\\n    \\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\x03\\x04\\01\\\"=Specify\\x20the\\\n    \\x20name\\x20of\\x20the\\x20package\\x20that\\x20generated\\x20the\\x20Java\\x20\\\n    file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\nr\\n\\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\\n    \\x1agoption\\x20java_outer_classname\\x20=\\x20\\\"VoteAssetContract\\\";\\x20//\\\n    Specify\\x20the\\x20class\\x20name\\x20of\\x20the\\x20generated\\x20Java\\x20fil\\\n    e\\n\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x08\\0\\r\\x01\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\x08\\\n    \\x08\\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\x03\\t\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\\n    \\0\\x05\\x12\\x03\\t\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x01\\x12\\x03\\t\\x08\\x15\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\t\\x18\\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\\n    \\x12\\x03\\n\\x02\\\"\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x04\\x12\\x03\\n\\x02\\n\\n\\x0c\\n\\\n    \\x05\\x04\\0\\x02\\x01\\x05\\x12\\x03\\n\\x0b\\x10\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\\n    \\x12\\x03\\n\\x11\\x1d\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\n\\x20!\\n\\x0b\\n\\\n    \\x04\\x04\\0\\x02\\x02\\x12\\x03\\x0b\\x02\\x13\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x05\\x12\\\n    \\x03\\x0b\\x02\\x06\\n\\x0c\\n\\x05\\x04\\0\\x02\\x02\\x01\\x12\\x03\\x0b\\x07\\x0e\\n\\x0c\\\n    \\n\\x05\\x04\\0\\x02\\x02\\x03\\x12\\x03\\x0b\\x11\\x12\\n\\x0b\\n\\x04\\x04\\0\\x02\\x03\\\n    \\x12\\x03\\x0c\\x02\\x12\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\x05\\x12\\x03\\x0c\\x02\\x07\\n\\\n    \\x0c\\n\\x05\\x04\\0\\x02\\x03\\x01\\x12\\x03\\x0c\\x08\\r\\n\\x0c\\n\\x05\\x04\\0\\x02\\x03\\\n    \\x03\\x12\\x03\\x0c\\x10\\x11b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(1);\n            messages.push(VoteAssetContract::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/protocol/witness_contract.rs",
    "content": "// This file is generated by rust-protobuf 3.3.0. Do not edit\n// .proto file is parsed by protoc --rust-out=...\n// @generated\n\n// https://github.com/rust-lang/rust-clippy/issues/702\n#![allow(unknown_lints)]\n#![allow(clippy::all)]\n\n#![allow(unused_attributes)]\n#![cfg_attr(rustfmt, rustfmt::skip)]\n\n#![allow(dead_code)]\n#![allow(missing_docs)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n#![allow(non_upper_case_globals)]\n#![allow(trivial_casts)]\n#![allow(unused_results)]\n#![allow(unused_mut)]\n\n//! Generated file from `core/contract/witness_contract.proto`\n\n/// Generated files are compatible only with the same version\n/// of protobuf runtime.\nconst _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_7_2;\n\n// @@protoc_insertion_point(message:protocol.WitnessCreateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct WitnessCreateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.WitnessCreateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.WitnessCreateContract.url)\n    pub url: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.WitnessCreateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a WitnessCreateContract {\n    fn default() -> &'a WitnessCreateContract {\n        <WitnessCreateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl WitnessCreateContract {\n    pub fn new() -> WitnessCreateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &WitnessCreateContract| { &m.owner_address },\n            |m: &mut WitnessCreateContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"url\",\n            |m: &WitnessCreateContract| { &m.url },\n            |m: &mut WitnessCreateContract| { &mut m.url },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WitnessCreateContract>(\n            \"WitnessCreateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for WitnessCreateContract {\n    const NAME: &'static str = \"WitnessCreateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.url = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.url.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(2, &self.url);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.url.is_empty() {\n            os.write_bytes(2, &self.url)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> WitnessCreateContract {\n        WitnessCreateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.url.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static WitnessCreateContract {\n        static instance: WitnessCreateContract = WitnessCreateContract {\n            owner_address: ::std::vec::Vec::new(),\n            url: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for WitnessCreateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"WitnessCreateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for WitnessCreateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for WitnessCreateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.WitnessUpdateContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct WitnessUpdateContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.WitnessUpdateContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.WitnessUpdateContract.update_url)\n    pub update_url: ::std::vec::Vec<u8>,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.WitnessUpdateContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a WitnessUpdateContract {\n    fn default() -> &'a WitnessUpdateContract {\n        <WitnessUpdateContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl WitnessUpdateContract {\n    pub fn new() -> WitnessUpdateContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(2);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &WitnessUpdateContract| { &m.owner_address },\n            |m: &mut WitnessUpdateContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"update_url\",\n            |m: &WitnessUpdateContract| { &m.update_url },\n            |m: &mut WitnessUpdateContract| { &mut m.update_url },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<WitnessUpdateContract>(\n            \"WitnessUpdateContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for WitnessUpdateContract {\n    const NAME: &'static str = \"WitnessUpdateContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                98 => {\n                    self.update_url = is.read_bytes()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        if !self.update_url.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(12, &self.update_url);\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        if !self.update_url.is_empty() {\n            os.write_bytes(12, &self.update_url)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> WitnessUpdateContract {\n        WitnessUpdateContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.update_url.clear();\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static WitnessUpdateContract {\n        static instance: WitnessUpdateContract = WitnessUpdateContract {\n            owner_address: ::std::vec::Vec::new(),\n            update_url: ::std::vec::Vec::new(),\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for WitnessUpdateContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"WitnessUpdateContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for WitnessUpdateContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for WitnessUpdateContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n// @@protoc_insertion_point(message:protocol.VoteWitnessContract)\n#[derive(PartialEq,Clone,Default,Debug)]\npub struct VoteWitnessContract {\n    // message fields\n    // @@protoc_insertion_point(field:protocol.VoteWitnessContract.owner_address)\n    pub owner_address: ::std::vec::Vec<u8>,\n    // @@protoc_insertion_point(field:protocol.VoteWitnessContract.votes)\n    pub votes: ::std::vec::Vec<vote_witness_contract::Vote>,\n    // @@protoc_insertion_point(field:protocol.VoteWitnessContract.support)\n    pub support: bool,\n    // special fields\n    // @@protoc_insertion_point(special_field:protocol.VoteWitnessContract.special_fields)\n    pub special_fields: ::protobuf::SpecialFields,\n}\n\nimpl<'a> ::std::default::Default for &'a VoteWitnessContract {\n    fn default() -> &'a VoteWitnessContract {\n        <VoteWitnessContract as ::protobuf::Message>::default_instance()\n    }\n}\n\nimpl VoteWitnessContract {\n    pub fn new() -> VoteWitnessContract {\n        ::std::default::Default::default()\n    }\n\n    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n        let mut fields = ::std::vec::Vec::with_capacity(3);\n        let mut oneofs = ::std::vec::Vec::with_capacity(0);\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"owner_address\",\n            |m: &VoteWitnessContract| { &m.owner_address },\n            |m: &mut VoteWitnessContract| { &mut m.owner_address },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(\n            \"votes\",\n            |m: &VoteWitnessContract| { &m.votes },\n            |m: &mut VoteWitnessContract| { &mut m.votes },\n        ));\n        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n            \"support\",\n            |m: &VoteWitnessContract| { &m.support },\n            |m: &mut VoteWitnessContract| { &mut m.support },\n        ));\n        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<VoteWitnessContract>(\n            \"VoteWitnessContract\",\n            fields,\n            oneofs,\n        )\n    }\n}\n\nimpl ::protobuf::Message for VoteWitnessContract {\n    const NAME: &'static str = \"VoteWitnessContract\";\n\n    fn is_initialized(&self) -> bool {\n        true\n    }\n\n    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n        while let Some(tag) = is.read_raw_tag_or_eof()? {\n            match tag {\n                10 => {\n                    self.owner_address = is.read_bytes()?;\n                },\n                18 => {\n                    self.votes.push(is.read_message()?);\n                },\n                24 => {\n                    self.support = is.read_bool()?;\n                },\n                tag => {\n                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                },\n            };\n        }\n        ::std::result::Result::Ok(())\n    }\n\n    // Compute sizes of nested messages\n    #[allow(unused_variables)]\n    fn compute_size(&self) -> u64 {\n        let mut my_size = 0;\n        if !self.owner_address.is_empty() {\n            my_size += ::protobuf::rt::bytes_size(1, &self.owner_address);\n        }\n        for value in &self.votes {\n            let len = value.compute_size();\n            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;\n        };\n        if self.support != false {\n            my_size += 1 + 1;\n        }\n        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n        self.special_fields.cached_size().set(my_size as u32);\n        my_size\n    }\n\n    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n        if !self.owner_address.is_empty() {\n            os.write_bytes(1, &self.owner_address)?;\n        }\n        for v in &self.votes {\n            ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?;\n        };\n        if self.support != false {\n            os.write_bool(3, self.support)?;\n        }\n        os.write_unknown_fields(self.special_fields.unknown_fields())?;\n        ::std::result::Result::Ok(())\n    }\n\n    fn special_fields(&self) -> &::protobuf::SpecialFields {\n        &self.special_fields\n    }\n\n    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n        &mut self.special_fields\n    }\n\n    fn new() -> VoteWitnessContract {\n        VoteWitnessContract::new()\n    }\n\n    fn clear(&mut self) {\n        self.owner_address.clear();\n        self.votes.clear();\n        self.support = false;\n        self.special_fields.clear();\n    }\n\n    fn default_instance() -> &'static VoteWitnessContract {\n        static instance: VoteWitnessContract = VoteWitnessContract {\n            owner_address: ::std::vec::Vec::new(),\n            votes: ::std::vec::Vec::new(),\n            support: false,\n            special_fields: ::protobuf::SpecialFields::new(),\n        };\n        &instance\n    }\n}\n\nimpl ::protobuf::MessageFull for VoteWitnessContract {\n    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n        descriptor.get(|| file_descriptor().message_by_package_relative_name(\"VoteWitnessContract\").unwrap()).clone()\n    }\n}\n\nimpl ::std::fmt::Display for VoteWitnessContract {\n    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n        ::protobuf::text_format::fmt(self, f)\n    }\n}\n\nimpl ::protobuf::reflect::ProtobufValue for VoteWitnessContract {\n    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n}\n\n/// Nested message and enums of message `VoteWitnessContract`\npub mod vote_witness_contract {\n    // @@protoc_insertion_point(message:protocol.VoteWitnessContract.Vote)\n    #[derive(PartialEq,Clone,Default,Debug)]\n    pub struct Vote {\n        // message fields\n        // @@protoc_insertion_point(field:protocol.VoteWitnessContract.Vote.vote_address)\n        pub vote_address: ::std::vec::Vec<u8>,\n        // @@protoc_insertion_point(field:protocol.VoteWitnessContract.Vote.vote_count)\n        pub vote_count: i64,\n        // special fields\n        // @@protoc_insertion_point(special_field:protocol.VoteWitnessContract.Vote.special_fields)\n        pub special_fields: ::protobuf::SpecialFields,\n    }\n\n    impl<'a> ::std::default::Default for &'a Vote {\n        fn default() -> &'a Vote {\n            <Vote as ::protobuf::Message>::default_instance()\n        }\n    }\n\n    impl Vote {\n        pub fn new() -> Vote {\n            ::std::default::Default::default()\n        }\n\n        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {\n            let mut fields = ::std::vec::Vec::with_capacity(2);\n            let mut oneofs = ::std::vec::Vec::with_capacity(0);\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"vote_address\",\n                |m: &Vote| { &m.vote_address },\n                |m: &mut Vote| { &mut m.vote_address },\n            ));\n            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(\n                \"vote_count\",\n                |m: &Vote| { &m.vote_count },\n                |m: &mut Vote| { &mut m.vote_count },\n            ));\n            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Vote>(\n                \"VoteWitnessContract.Vote\",\n                fields,\n                oneofs,\n            )\n        }\n    }\n\n    impl ::protobuf::Message for Vote {\n        const NAME: &'static str = \"Vote\";\n\n        fn is_initialized(&self) -> bool {\n            true\n        }\n\n        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {\n            while let Some(tag) = is.read_raw_tag_or_eof()? {\n                match tag {\n                    10 => {\n                        self.vote_address = is.read_bytes()?;\n                    },\n                    16 => {\n                        self.vote_count = is.read_int64()?;\n                    },\n                    tag => {\n                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;\n                    },\n                };\n            }\n            ::std::result::Result::Ok(())\n        }\n\n        // Compute sizes of nested messages\n        #[allow(unused_variables)]\n        fn compute_size(&self) -> u64 {\n            let mut my_size = 0;\n            if !self.vote_address.is_empty() {\n                my_size += ::protobuf::rt::bytes_size(1, &self.vote_address);\n            }\n            if self.vote_count != 0 {\n                my_size += ::protobuf::rt::int64_size(2, self.vote_count);\n            }\n            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());\n            self.special_fields.cached_size().set(my_size as u32);\n            my_size\n        }\n\n        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {\n            if !self.vote_address.is_empty() {\n                os.write_bytes(1, &self.vote_address)?;\n            }\n            if self.vote_count != 0 {\n                os.write_int64(2, self.vote_count)?;\n            }\n            os.write_unknown_fields(self.special_fields.unknown_fields())?;\n            ::std::result::Result::Ok(())\n        }\n\n        fn special_fields(&self) -> &::protobuf::SpecialFields {\n            &self.special_fields\n        }\n\n        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {\n            &mut self.special_fields\n        }\n\n        fn new() -> Vote {\n            Vote::new()\n        }\n\n        fn clear(&mut self) {\n            self.vote_address.clear();\n            self.vote_count = 0;\n            self.special_fields.clear();\n        }\n\n        fn default_instance() -> &'static Vote {\n            static instance: Vote = Vote {\n                vote_address: ::std::vec::Vec::new(),\n                vote_count: 0,\n                special_fields: ::protobuf::SpecialFields::new(),\n            };\n            &instance\n        }\n    }\n\n    impl ::protobuf::MessageFull for Vote {\n        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {\n            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();\n            descriptor.get(|| super::file_descriptor().message_by_package_relative_name(\"VoteWitnessContract.Vote\").unwrap()).clone()\n        }\n    }\n\n    impl ::std::fmt::Display for Vote {\n        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {\n            ::protobuf::text_format::fmt(self, f)\n        }\n    }\n\n    impl ::protobuf::reflect::ProtobufValue for Vote {\n        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;\n    }\n}\n\nstatic file_descriptor_proto_data: &'static [u8] = b\"\\\n    \\n$core/contract/witness_contract.proto\\x12\\x08protocol\\\"N\\n\\x15WitnessC\\\n    reateContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddres\\\n    s\\x12\\x10\\n\\x03url\\x18\\x02\\x20\\x01(\\x0cR\\x03url\\\"[\\n\\x15WitnessUpdateCon\\\n    tract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddress\\x12\\\n    \\x1d\\n\\nupdate_url\\x18\\x0c\\x20\\x01(\\x0cR\\tupdateUrl\\\"\\xd8\\x01\\n\\x13VoteW\\\n    itnessContract\\x12#\\n\\rowner_address\\x18\\x01\\x20\\x01(\\x0cR\\x0cownerAddre\\\n    ss\\x128\\n\\x05votes\\x18\\x02\\x20\\x03(\\x0b2\\\".protocol.VoteWitnessContract.\\\n    VoteR\\x05votes\\x12\\x18\\n\\x07support\\x18\\x03\\x20\\x01(\\x08R\\x07support\\x1a\\\n    H\\n\\x04Vote\\x12!\\n\\x0cvote_address\\x18\\x01\\x20\\x01(\\x0cR\\x0bvoteAddress\\\n    \\x12\\x1d\\n\\nvote_count\\x18\\x02\\x20\\x01(\\x03R\\tvoteCountBE\\n\\x18org.tron.\\\n    protos.contractZ)github.com/tronprotocol/grpc-gateway/coreJ\\xe3\\x06\\n\\\n    \\x06\\x12\\x04\\0\\0\\x1a\\x01\\n\\x08\\n\\x01\\x0c\\x12\\x03\\0\\0\\x12\\n\\x08\\n\\x01\\x02\\\n    \\x12\\x03\\x02\\0\\x11\\n\\x08\\n\\x01\\x08\\x12\\x03\\x04\\01\\nH\\n\\x02\\x08\\x01\\x12\\\n    \\x03\\x04\\01\\\"=Specify\\x20the\\x20name\\x20of\\x20the\\x20package\\x20that\\x20\\\n    generated\\x20the\\x20Java\\x20file\\n\\n\\x08\\n\\x01\\x08\\x12\\x03\\x06\\0@\\nv\\n\\\n    \\x02\\x08\\x0b\\x12\\x03\\x06\\0@\\x1akoption\\x20java_outer_classname\\x20=\\x20\\\n    \\\"WitnessCreateContract\\\";\\x20//Specify\\x20the\\x20class\\x20name\\x20of\\\n    \\x20the\\x20generated\\x20Java\\x20file\\n\\n\\n\\n\\x02\\x04\\0\\x12\\x04\\x08\\0\\x0b\\\n    \\x01\\n\\n\\n\\x03\\x04\\0\\x01\\x12\\x03\\x08\\x08\\x1d\\n\\x0b\\n\\x04\\x04\\0\\x02\\0\\x12\\\n    \\x03\\t\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x05\\x12\\x03\\t\\x02\\x07\\n\\x0c\\n\\x05\\\n    \\x04\\0\\x02\\0\\x01\\x12\\x03\\t\\x08\\x15\\n\\x0c\\n\\x05\\x04\\0\\x02\\0\\x03\\x12\\x03\\t\\\n    \\x18\\x19\\n\\x0b\\n\\x04\\x04\\0\\x02\\x01\\x12\\x03\\n\\x02\\x10\\n\\x0c\\n\\x05\\x04\\0\\\n    \\x02\\x01\\x05\\x12\\x03\\n\\x02\\x07\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x01\\x12\\x03\\n\\\n    \\x08\\x0b\\n\\x0c\\n\\x05\\x04\\0\\x02\\x01\\x03\\x12\\x03\\n\\x0e\\x0f\\n\\n\\n\\x02\\x04\\\n    \\x01\\x12\\x04\\r\\0\\x10\\x01\\n\\n\\n\\x03\\x04\\x01\\x01\\x12\\x03\\r\\x08\\x1d\\n\\x0b\\n\\\n    \\x04\\x04\\x01\\x02\\0\\x12\\x03\\x0e\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x05\\x12\\\n    \\x03\\x0e\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x01\\x02\\0\\x01\\x12\\x03\\x0e\\x08\\x15\\n\\x0c\\\n    \\n\\x05\\x04\\x01\\x02\\0\\x03\\x12\\x03\\x0e\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x01\\x02\\x01\\\n    \\x12\\x03\\x0f\\x02\\x18\\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x05\\x12\\x03\\x0f\\x02\\x07\\\n    \\n\\x0c\\n\\x05\\x04\\x01\\x02\\x01\\x01\\x12\\x03\\x0f\\x08\\x12\\n\\x0c\\n\\x05\\x04\\x01\\\n    \\x02\\x01\\x03\\x12\\x03\\x0f\\x15\\x17\\n\\n\\n\\x02\\x04\\x02\\x12\\x04\\x12\\0\\x1a\\x01\\\n    \\n\\n\\n\\x03\\x04\\x02\\x01\\x12\\x03\\x12\\x08\\x1b\\n\\x0c\\n\\x04\\x04\\x02\\x03\\0\\x12\\\n    \\x04\\x13\\x02\\x16\\x03\\n\\x0c\\n\\x05\\x04\\x02\\x03\\0\\x01\\x12\\x03\\x13\\n\\x0e\\n\\r\\\n    \\n\\x06\\x04\\x02\\x03\\0\\x02\\0\\x12\\x03\\x14\\x04\\x1b\\n\\x0e\\n\\x07\\x04\\x02\\x03\\0\\\n    \\x02\\0\\x05\\x12\\x03\\x14\\x04\\t\\n\\x0e\\n\\x07\\x04\\x02\\x03\\0\\x02\\0\\x01\\x12\\x03\\\n    \\x14\\n\\x16\\n\\x0e\\n\\x07\\x04\\x02\\x03\\0\\x02\\0\\x03\\x12\\x03\\x14\\x19\\x1a\\n\\r\\n\\\n    \\x06\\x04\\x02\\x03\\0\\x02\\x01\\x12\\x03\\x15\\x04\\x19\\n\\x0e\\n\\x07\\x04\\x02\\x03\\0\\\n    \\x02\\x01\\x05\\x12\\x03\\x15\\x04\\t\\n\\x0e\\n\\x07\\x04\\x02\\x03\\0\\x02\\x01\\x01\\x12\\\n    \\x03\\x15\\n\\x14\\n\\x0e\\n\\x07\\x04\\x02\\x03\\0\\x02\\x01\\x03\\x12\\x03\\x15\\x17\\x18\\\n    \\n\\x0b\\n\\x04\\x04\\x02\\x02\\0\\x12\\x03\\x17\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\\n    \\x05\\x12\\x03\\x17\\x02\\x07\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x01\\x12\\x03\\x17\\x08\\\n    \\x15\\n\\x0c\\n\\x05\\x04\\x02\\x02\\0\\x03\\x12\\x03\\x17\\x18\\x19\\n\\x0b\\n\\x04\\x04\\\n    \\x02\\x02\\x01\\x12\\x03\\x18\\x02\\x1a\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x04\\x12\\x03\\\n    \\x18\\x02\\n\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\x06\\x12\\x03\\x18\\x0b\\x0f\\n\\x0c\\n\\\n    \\x05\\x04\\x02\\x02\\x01\\x01\\x12\\x03\\x18\\x10\\x15\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x01\\\n    \\x03\\x12\\x03\\x18\\x18\\x19\\n\\x0b\\n\\x04\\x04\\x02\\x02\\x02\\x12\\x03\\x19\\x02\\x13\\\n    \\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x05\\x12\\x03\\x19\\x02\\x06\\n\\x0c\\n\\x05\\x04\\x02\\\n    \\x02\\x02\\x01\\x12\\x03\\x19\\x07\\x0e\\n\\x0c\\n\\x05\\x04\\x02\\x02\\x02\\x03\\x12\\x03\\\n    \\x19\\x11\\x12b\\x06proto3\\\n\";\n\n/// `FileDescriptorProto` object which was a source for this generated file\nfn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {\n    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();\n    file_descriptor_proto_lazy.get(|| {\n        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()\n    })\n}\n\n/// `FileDescriptor` object which allows dynamic access to files\npub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {\n    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();\n    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();\n    file_descriptor.get(|| {\n        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {\n            let mut deps = ::std::vec::Vec::with_capacity(0);\n            let mut messages = ::std::vec::Vec::with_capacity(4);\n            messages.push(WitnessCreateContract::generated_message_descriptor_data());\n            messages.push(WitnessUpdateContract::generated_message_descriptor_data());\n            messages.push(VoteWitnessContract::generated_message_descriptor_data());\n            messages.push(vote_witness_contract::Vote::generated_message_descriptor_data());\n            let mut enums = ::std::vec::Vec::with_capacity(0);\n            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(\n                file_descriptor_proto(),\n                deps,\n                messages,\n                enums,\n            )\n        });\n        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)\n    })\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/public_key.rs",
    "content": "use crate::{TronAddress, TronFormat};\nuse anychain_core::{Address, AddressError, PublicKey, PublicKeyError};\nuse core::{fmt, fmt::Display, str::FromStr};\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct TronPublicKey(libsecp256k1::PublicKey);\n\nimpl PublicKey for TronPublicKey {\n    type SecretKey = libsecp256k1::SecretKey;\n    type Address = TronAddress;\n    type Format = TronFormat;\n\n    fn from_secret_key(secret_key: &Self::SecretKey) -> Self {\n        Self(libsecp256k1::PublicKey::from_secret_key(secret_key))\n    }\n\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError> {\n        TronAddress::from_public_key(self, format)\n    }\n}\n\nimpl TronPublicKey {\n    /// Returns a public key given a secp256k1 public key.\n    pub fn from_secp256k1_public_key(public_key: libsecp256k1::PublicKey) -> Self {\n        Self(public_key)\n    }\n\n    /// Returns the secp256k1 public key of the public key\n    pub fn to_secp256k1_public_key(&self) -> libsecp256k1::PublicKey {\n        self.0\n    }\n}\n\nimpl FromStr for TronPublicKey {\n    type Err = PublicKeyError;\n\n    fn from_str(public_key: &str) -> Result<Self, Self::Err> {\n        Ok(Self(\n            libsecp256k1::PublicKey::parse_slice(hex::decode(public_key)?.as_slice(), None)\n                .map_err(|error| PublicKeyError::Crate(\"libsecp256k1\", format!(\"{:?}\", error)))?,\n        ))\n    }\n}\n\nimpl Display for TronPublicKey {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        for s in &self.0.serialize() {\n            write!(f, \"{:02X}\", s)?;\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::TronPublicKey;\n\n    #[test]\n    pub fn test_from_private() {}\n\n    #[test]\n    pub fn test_from_str() {\n        let uncompressed_key = \"0404B604296010A55D40000B798EE8454ECCC1F8900E70B1ADF47C9887625D8BAE3866351A6FA0B5370623268410D33D345F63344121455849C9C28F9389ED9731\";\n        let pubkey: TronPublicKey = uncompressed_key.parse().unwrap();\n        assert_eq!(uncompressed_key, pubkey.to_string());\n    }\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/transaction.rs",
    "content": "use crate::protocol::Tron::transaction::{Contract, Raw as TransactionRaw};\nuse crate::protocol::Tron::Transaction as TransactionProto;\nuse crate::trx;\nuse crate::{TronAddress, TronFormat, TronPublicKey};\nuse anychain_core::utilities::crypto;\nuse anychain_core::Transaction;\nuse anychain_core::TransactionError;\nuse anychain_core::TransactionId;\nuse protobuf::Message;\nuse std::fmt;\nuse std::str::FromStr;\n\n/// Represents the parameters for a Tron transaction\n#[derive(Debug, Clone, PartialEq)]\npub struct TronTransactionParameters {\n    pub ref_block_hash: Vec<u8>,\n    pub ref_block_bytes: Vec<u8>,\n    pub fee_limit: i64,\n    pub expiration: i64,\n    pub timestamp: i64,\n    pub memo: String,\n    pub contract: Contract,\n}\n\nimpl TronTransactionParameters {\n    pub fn set_ref_block(&mut self, number: i64, hash: &str) {\n        self.ref_block_bytes = vec![((number & 0xff00) >> 8) as u8, (number & 0xff) as u8];\n        hex::decode(hash).unwrap()[8..16].clone_into(&mut self.ref_block_hash)\n    }\n\n    pub fn set_contract(&mut self, ct: Contract) {\n        self.contract = ct;\n    }\n\n    pub fn set_timestamp(&mut self, time: i64) {\n        self.timestamp = time;\n    }\n\n    pub fn set_expiration(&mut self, time: i64) {\n        self.expiration = time;\n    }\n\n    pub fn set_fee_limit(&mut self, fee: i64) {\n        self.fee_limit = fee;\n    }\n\n    pub fn to_transaction_raw(&self) -> Result<TransactionRaw, TransactionError> {\n        let mut raw = TransactionRaw::new();\n        let mut timestamp = self.timestamp;\n        // if timestamp equals 0, means the tx is new\n        if self.timestamp == 0 {\n            timestamp = trx::timestamp_millis();\n        }\n        raw.contract = vec![self.contract.clone()];\n        if !self.memo.is_empty() {\n            self.memo.as_bytes().clone_into(&mut raw.data)\n        }\n\n        if self.fee_limit != 0 {\n            raw.fee_limit = self.fee_limit;\n        }\n\n        raw.timestamp = timestamp;\n        raw.expiration = timestamp + self.expiration;\n        raw.ref_block_bytes.clone_from(&self.ref_block_bytes);\n        raw.ref_block_hash.clone_from(&self.ref_block_hash);\n\n        Ok(raw)\n    }\n}\n\nimpl Default for TronTransactionParameters {\n    fn default() -> Self {\n        Self {\n            ref_block_hash: Default::default(),\n            ref_block_bytes: Default::default(),\n            fee_limit: 0,\n            timestamp: 0,\n            expiration: 1000 * 60 * 5_i64,\n            memo: \"\".to_string(),\n            contract: Default::default(),\n        }\n    }\n}\n\n/// Represents an Ethereum transaction signature\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct TronTransactionSignature(Vec<u8>);\n\nimpl TronTransactionSignature {\n    pub fn new(rs: &[u8], recid: u8) -> Self {\n        let mut vec = rs.to_owned();\n        vec.push(recid);\n        TronTransactionSignature(vec)\n    }\n\n    pub fn to_bytes(&self) -> Vec<u8> {\n        self.0.clone()\n    }\n}\n\n/// Represents an Ethereum transaction id\n#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]\npub struct TronTransactionId {\n    pub txid: Vec<u8>,\n}\n\nimpl TransactionId for TronTransactionId {}\n\nimpl fmt::Display for TronTransactionId {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"{}\", &hex::encode(&self.txid))\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct TronTransaction {\n    pub data: TronTransactionParameters,\n    pub signature: Option<TronTransactionSignature>,\n}\n\nimpl FromStr for TronTransaction {\n    type Err = TransactionError;\n\n    fn from_str(tx: &str) -> Result<Self, Self::Err> {\n        Self::from_bytes(&hex::decode(tx)?)\n    }\n}\n\nimpl Transaction for TronTransaction {\n    type Address = TronAddress;\n    type Format = TronFormat;\n    type PublicKey = TronPublicKey;\n    type TransactionId = TronTransactionId;\n    type TransactionParameters = TronTransactionParameters;\n\n    fn new(params: &Self::TransactionParameters) -> Result<Self, TransactionError> {\n        Ok(Self {\n            data: params.clone(),\n            signature: None,\n        })\n    }\n\n    fn sign(&mut self, signature: Vec<u8>, recid: u8) -> Result<Vec<u8>, TransactionError> {\n        self.signature = Some(TronTransactionSignature::new(&signature, recid));\n        self.to_bytes()\n    }\n\n    fn from_bytes(stream: &[u8]) -> Result<Self, TransactionError> {\n        let (raw, sig) = if let Ok(tx) = TransactionProto::parse_from_bytes(stream) {\n            if !tx.signature.is_empty() {\n                let raw = tx.raw_data.unwrap();\n                let sig = tx.signature[0].clone();\n                match sig.len() == 65 {\n                    true => (raw, Some(TronTransactionSignature(sig))),\n                    false => (raw, None),\n                }\n            } else if let Ok(raw) = TransactionRaw::parse_from_bytes(stream) {\n                (raw, None)\n            } else {\n                return Err(TransactionError::Message(\n                    \"illegal tron transaction stream\".to_string(),\n                ));\n            }\n        } else if let Ok(raw) = TransactionRaw::parse_from_bytes(stream) {\n            (raw, None)\n        } else {\n            return Err(TransactionError::Message(\n                \"illegal tron transaction stream\".to_string(),\n            ));\n        };\n\n        let param = TronTransactionParameters {\n            timestamp: raw.timestamp,\n            expiration: raw.expiration - raw.timestamp,\n            ref_block_bytes: raw.ref_block_bytes.clone(),\n            ref_block_hash: raw.ref_block_hash.clone(),\n            memo: String::from_utf8(raw.data.clone())\n                .map_err(|e| TransactionError::Crate(\"protobuf\", e.to_string()))?,\n            fee_limit: raw.fee_limit,\n            contract: raw.contract[0].clone(),\n        };\n\n        Ok(Self {\n            data: param,\n            signature: sig,\n        })\n    }\n\n    fn to_bytes(&self) -> Result<Vec<u8>, TransactionError> {\n        let raw = self.data.to_transaction_raw()?;\n        match &self.signature {\n            Some(sign) => {\n                let mut signed_tx = TransactionProto::new();\n                signed_tx.raw_data = ::protobuf::MessageField::some(raw);\n                signed_tx.signature = vec![sign.to_bytes()];\n                signed_tx\n                    .write_to_bytes()\n                    .map_err(|e| TransactionError::Crate(\"protobuf\", e.to_string()))\n            }\n            None => raw\n                .write_to_bytes()\n                .map_err(|e| TransactionError::Crate(\"protobuf\", e.to_string())),\n        }\n    }\n\n    fn to_transaction_id(&self) -> Result<Self::TransactionId, TransactionError> {\n        Ok(Self::TransactionId {\n            txid: crypto::sha256(&self.to_bytes()?).to_vec(),\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    pub fn build_trx_transaction() -> TronTransaction {\n        let addr_from = \"TG7jQ7eGsns6nmQNfcKNgZKyKBFkx7CvXr\";\n        let addr_to = \"TFk5LfscQv8hYM11mZYmi3ZcnRfFc4LLap\";\n        let amount = \"10000000\";\n        let ct = trx::build_transfer_contract(addr_from, addr_to, amount).unwrap();\n        let mut param = TronTransactionParameters::default();\n        param.set_timestamp(trx::timestamp_millis());\n        param.set_ref_block(\n            26661399,\n            \"000000000196d21784deb05dee04c69ed112b8e078e74019f9a0b1df6adc414e\",\n        );\n        param.set_contract(ct);\n\n        TronTransaction::new(&param).unwrap()\n    }\n\n    #[test]\n    pub fn test_txid() {\n        let transaction = build_trx_transaction();\n        dbg!(\"{}\", transaction.to_transaction_id().unwrap());\n        let raw = transaction.data.to_transaction_raw().unwrap();\n        let raw_bytes = crypto::sha256(&raw.write_to_bytes().unwrap());\n        dbg!(\"{}\", hex::encode(raw_bytes));\n\n        assert_eq!(transaction.to_transaction_id().unwrap().txid, raw_bytes);\n    }\n\n    #[test]\n    fn test_build_tx2() {\n        let from_addr = \"TYn6xn1aY3hrsDfLzpyPQtDiKjHEU8Hsxm\";\n        let to_addr = \"TG7jQ7eGsns6nmQNfcKNgZKyKBFkx7CvXr\";\n        let amount = \"1000000\"; // 以Sun为单位\n        let block_height = 27007120;\n        let block_hash = \"00000000019c1890f87d110a81d815b9a38a3e62d44a00a7c8fd50a7b322a2df\";\n\n        let ct = trx::build_transfer_contract(from_addr, to_addr, amount).unwrap();\n        let mut param = TronTransactionParameters::default();\n        param.set_timestamp(trx::timestamp_millis());\n        param.set_ref_block(block_height, block_hash);\n        param.set_contract(ct);\n        let transaction = TronTransaction::new(&param).unwrap();\n\n        let bytes = transaction.to_bytes().unwrap();\n\n        dbg!(\"{}\", hex::encode(bytes));\n        dbg!(\"{}\", transaction.to_transaction_id().unwrap());\n        dbg!(\"{:?}\", transaction.data);\n    }\n\n    #[test]\n    pub fn test_from_bytes() {\n        let raw = \"0a0218902208f87d110a81d815b9409994dbfaac305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541fa3146ab779ce02392d11209f524ee75d4088a45121541436d74fc1577266b7290b85801145d9c5287e19418c0843d70b9bfd7faac30900180ade204\";\n        let txid = \"519f9d0bdc17d4a083b2676a4e9dce5679045107e7c9a9dad848891ee845235d\";\n        let transaction = TronTransaction::from_bytes(&hex::decode(raw).unwrap()).unwrap();\n        let bytes = transaction.to_bytes().unwrap();\n        //println!(\"{}\",transaction.to_transaction_id().unwrap());\n        //println!(\"{:?}\",transaction.data);\n        assert_eq!(raw, hex::encode(bytes));\n\n        assert_eq!(txid, transaction.to_transaction_id().unwrap().to_string());\n    }\n\n    #[test]\n    pub fn test_raw() {\n        let raw = \"0a025aa722088cb23bfcb18ea03c40facee394ad305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541fa3146ab779ce02392d11209f524ee75d4088a45121541436d74fc1577266b7290b85801145d9c5287e19418c0843d709afadf94ad30900180ade204\";\n        let transaction = TronTransaction::from_bytes(&hex::decode(raw).unwrap());\n        assert!(transaction.is_ok());\n        dbg!(\"{:?}\", transaction.unwrap().data);\n    }\n}\n"
  },
  {
    "path": "crates/anychain-tron/src/trx.rs",
    "content": "use crate::{\n    abi,\n    protocol::{\n        account_contract::AccountCreateContract,\n        balance_contract::{\n            CancelAllUnfreezeV2Contract, DelegateResourceContract, FreezeBalanceV2Contract,\n            TransferContract, UnDelegateResourceContract, UnfreezeBalanceV2Contract,\n            WithdrawBalanceContract, WithdrawExpireUnfreezeContract,\n        },\n        common::ResourceCode,\n        smart_contract::TriggerSmartContract,\n        witness_contract::{vote_witness_contract::Vote, VoteWitnessContract},\n        Tron::{\n            transaction::{contract::ContractType, Contract},\n            AccountType,\n        },\n    },\n    TronAddress,\n};\nuse anychain_core::Error;\nuse chrono::Utc;\nuse core::panic;\nuse protobuf::{well_known_types::any::Any, EnumOrUnknown, Message};\nuse std::str::FromStr;\n\npub trait ContractPbExt: Message {\n    fn contract_type(&self) -> ContractType;\n\n    /// Convert Pb to protobuf::well_known_types::Any\n    fn as_google_any(&self) -> Result<Any, protobuf::Error> {\n        Ok(Any {\n            type_url: format!(\"type.googleapis.com/protocol.{:?}\", self.contract_type()),\n            value: self.write_to_bytes()?,\n            ..Default::default()\n        })\n    }\n}\n\nmacro_rules! impl_contract_pb_ext_for {\n    ($contract_ty:ident) => {\n        impl ContractPbExt for $contract_ty {\n            fn contract_type(&self) -> ContractType {\n                ContractType::$contract_ty\n            }\n        }\n    };\n}\n\nimpl_contract_pb_ext_for!(TransferContract);\nimpl_contract_pb_ext_for!(TriggerSmartContract);\nimpl_contract_pb_ext_for!(AccountCreateContract);\nimpl_contract_pb_ext_for!(FreezeBalanceV2Contract);\nimpl_contract_pb_ext_for!(UnfreezeBalanceV2Contract);\nimpl_contract_pb_ext_for!(DelegateResourceContract);\nimpl_contract_pb_ext_for!(UnDelegateResourceContract);\nimpl_contract_pb_ext_for!(CancelAllUnfreezeV2Contract);\nimpl_contract_pb_ext_for!(WithdrawExpireUnfreezeContract);\nimpl_contract_pb_ext_for!(VoteWitnessContract);\nimpl_contract_pb_ext_for!(WithdrawBalanceContract);\n\nfn to_resource_code(r: u8) -> ResourceCode {\n    match r {\n        0 => ResourceCode::BANDWIDTH,\n        1 => ResourceCode::ENERGY,\n        _ => panic!(\"Undefined resource\"),\n    }\n}\n\npub fn timestamp_millis() -> i64 {\n    Utc::now().timestamp_millis()\n}\n\npub fn build_contract(ct: &impl ContractPbExt) -> Result<Contract, Error> {\n    let mut contract = Contract::new();\n\n    contract.type_ = ::protobuf::EnumOrUnknown::new(ct.contract_type());\n    contract.parameter = ::protobuf::MessageField::some(\n        ct.as_google_any()\n            .map_err(|e| Error::RuntimeError(e.to_string()))?,\n    );\n\n    Ok(contract)\n}\n\npub fn build_trigger_contract(\n    owner: &str,\n    contract: &str,\n    data: Vec<u8>,\n) -> Result<Contract, Error> {\n    let mut ts_contract = TriggerSmartContract::new();\n\n    ts_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    ts_contract.contract_address = TronAddress::from_str(contract)?.as_bytes().to_vec();\n    ts_contract.data = data;\n\n    build_contract(&ts_contract)\n}\n\npub fn build_trc20_transfer_contract(\n    owner: &str,\n    contract: &str,\n    recipient: &str,\n    amount: &str,\n) -> Result<Contract, Error> {\n    build_trigger_contract(owner, contract, abi::trc20_transfer(recipient, amount))\n}\n\npub fn build_trc20_approve_contract(\n    owner: &str,\n    contract: &str,\n    recipient: &str,\n    amount: &str,\n) -> Result<Contract, Error> {\n    build_trigger_contract(owner, contract, abi::trc20_approve(recipient, amount))\n}\n\npub fn build_transfer_contract(\n    owner: &str,\n    recipient: &str,\n    amount: &str,\n) -> Result<Contract, Error> {\n    let sender: TronAddress = owner.parse()?;\n    let recipient: TronAddress = recipient.parse()?;\n\n    let mut transfer_contract = TransferContract::new();\n\n    sender\n        .as_bytes()\n        .clone_into(&mut transfer_contract.owner_address);\n    recipient\n        .as_bytes()\n        .clone_into(&mut transfer_contract.to_address);\n    transfer_contract.amount = amount.parse::<i64>()?;\n\n    build_contract(&transfer_contract)\n}\n\npub fn build_account_create(owner_addr: &str, create_addr: &str) -> Result<Contract, Error> {\n    let mut ac_contract = AccountCreateContract::new();\n\n    ac_contract.owner_address = TronAddress::from_str(owner_addr)?.as_bytes().to_vec();\n    ac_contract.account_address = TronAddress::from_str(create_addr)?.as_bytes().to_vec();\n    ac_contract.type_ = EnumOrUnknown::<AccountType>::new(AccountType::Normal);\n\n    build_contract(&ac_contract)\n}\n\npub fn build_freeze_balance_v2_contract(\n    owner: &str,\n    freeze_balance: &str,\n    resource: u8,\n) -> Result<Contract, Error> {\n    let mut fb_v2_contract = FreezeBalanceV2Contract::new();\n\n    fb_v2_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    fb_v2_contract.frozen_balance = freeze_balance.parse::<i64>()?;\n    fb_v2_contract.resource = EnumOrUnknown::<ResourceCode>::new(to_resource_code(resource));\n\n    build_contract(&fb_v2_contract)\n}\n\npub fn build_unfreeze_balance_v2_contract(\n    owner: &str,\n    unfreeze_balance: &str,\n    resource: u8,\n) -> Result<Contract, Error> {\n    let mut ub_v2_contract = UnfreezeBalanceV2Contract::new();\n\n    ub_v2_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    ub_v2_contract.unfreeze_balance = unfreeze_balance.parse::<i64>()?;\n    ub_v2_contract.resource = EnumOrUnknown::<ResourceCode>::new(to_resource_code(resource));\n\n    build_contract(&ub_v2_contract)\n}\n\npub fn build_delegate_resource_contract(\n    owner: &str,\n    recipient: &str,\n    resource: u8,\n    amount: &str,\n    lock: bool,\n) -> Result<Contract, Error> {\n    let mut dr_contract = DelegateResourceContract::new();\n\n    dr_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    dr_contract.receiver_address = TronAddress::from_str(recipient)?.as_bytes().to_vec();\n    dr_contract.balance = amount.parse::<i64>()?;\n    dr_contract.resource = EnumOrUnknown::<ResourceCode>::new(to_resource_code(resource));\n    dr_contract.lock = lock;\n\n    build_contract(&dr_contract)\n}\n\npub fn build_undelegate_resource_contract(\n    owner: &str,\n    recipient: &str,\n    resource: u8,\n    amount: &str,\n) -> Result<Contract, Error> {\n    let mut ur_contract = UnDelegateResourceContract::new();\n\n    ur_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    ur_contract.receiver_address = TronAddress::from_str(recipient)?.as_bytes().to_vec();\n    ur_contract.balance = amount.parse::<i64>()?;\n    ur_contract.resource = EnumOrUnknown::<ResourceCode>::new(to_resource_code(resource));\n\n    build_contract(&ur_contract)\n}\n\npub fn build_cancel_unfreeze_contract(owner: &str) -> Result<Contract, Error> {\n    let mut cu_contract = CancelAllUnfreezeV2Contract::new();\n    cu_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    build_contract(&cu_contract)\n}\n\npub fn build_withdraw_unfreeze_contract(owner: &str) -> Result<Contract, Error> {\n    let mut wu_contract = WithdrawExpireUnfreezeContract::new();\n    wu_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    build_contract(&wu_contract)\n}\n\npub fn build_vote_witness_contract(\n    owner: &str,\n    votes: Vec<(&str, i64)>,\n    support: bool,\n) -> Result<Contract, Error> {\n    let mut vw_contract = VoteWitnessContract::new();\n    vw_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    vw_contract.support = support;\n\n    vw_contract.votes = votes\n        .iter()\n        .map(|&(addr, vote_count)| {\n            let mut vote = Vote::new();\n            let addr = TronAddress::from_str(addr).unwrap().as_bytes().to_vec();\n            vote.vote_address = addr;\n            vote.vote_count = vote_count;\n            vote\n        })\n        .collect::<Vec<Vote>>();\n\n    build_contract(&vw_contract)\n}\n\npub fn build_withdraw_vote_contract(owner: &str) -> Result<Contract, Error> {\n    let mut wb_contract = WithdrawBalanceContract::new();\n    wb_contract.owner_address = TronAddress::from_str(owner)?.as_bytes().to_vec();\n    build_contract(&wb_contract)\n}\n"
  },
  {
    "path": "docs/design-cn.md",
    "content": "# 设计 AnyChain Wallet SDK 的出发点\n\n1. 支持市值 TVL Top100 Token 的转账交易，包括：BTC、ETH、USDT、BNB、SOL、USDC、TON 等。相应地，需要接入的区块链包括：比特币、以太坊、索拉纳，以及各条链上的 L2 网络。\n2. 实现跨平台编译，确保跨平台兼容性。考虑到源代码兼容性和工具链兼容性，编程语言选择限定为 C/C++/Rust。\n\n## 公链的特性抽象\n\n### 大多数公链需要支持的核心特性\n\n- PublicKey（公钥）\n- PrivateKey（私钥）\n- Address（地址）\n- Amount（金额）\n- Transaction（交易）\n- Network（网络）\n- Format（格式）\n\nanychain-core 作为一个全面的抽象 Trait，定义了以下通用方法：\n\n```rust\npub trait PublicKey {\n    fn from_private_key(private_key: &Self::PrivateKey) -> Self;\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError>;\n}\n\npub trait Address {\n    fn from_private_key(private_key: &Self::PrivateKey, format: &Self::Format) -> Result<Self, AddressError>;\n    fn from_public_key(public_key: &Self::PublicKey, format: &Self::Format) -> Result<Self, AddressError>;\n}\n\npub trait Amount {}\n\npub trait Format {}\n\npub trait Transaction {\n    fn new(parameters: &Self::TransactionParameters) -> Result<Self, TransactionError>;\n    fn sign();\n    fn from_bytes();\n    fn to_bytes(&self);\n    fn to_transaction_id(&self);\n}\n```\n\n### 各条链实现 Trait 的具体方法\n\n以 anychain-tron 的 TronAddress 为例：\n\n```rust\npub struct TronAddress([u8; 21]);\n\nimpl Address for TronAddress {\n    type Format = TronFormat;\n    type PrivateKey = TronPrivateKey;\n    type PublicKey = TronPublicKey;\n\n    fn from_private_key(\n        private_key: &Self::PrivateKey, \n        format: &Self::Format\n    ) -> Result<Self, AddressError> {\n        todo!()\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey, \n        format: &Self::Format\n    ) -> Result<Self, AddressError> {\n        todo!()\n    }\n}\n```\n\n通过引入 anychain-core 的抽象层和 anychain-bitcoin、anychain-tron 等链的具体实现，上层应用可以使用统一的代码和接口来调用 anychain SDK。\n\n## 跨平台编译和技术栈\n\n| 平台 | 目标文件格式 |\n| --- | --- |\n| iOS | .a（静态库） |\n| Android | .so（共享对象） |\n| Web/Wasm | .wasm（WebAssembly） |\n| Windows | .dll（动态链接库） |\n| macOS | .dylib（动态库） |\n| 嵌入式设备 | ELF（可执行与可链接格式） |\n| 可信执行环境（TEE） | .eif（加密镜像文件） |\n\n### 以 iOS 平台为例，其调用层级结构\n\n```\n+-------------------+\n| iOS Application   |\n+-------------------+\n        |\n        | Link\n        v\n+-------------------+\n| C Library (.dylib)|\n+-------------------+\n        |\n        | FFI\n        v\n+-------------------+\n| Rust Library      |\n+-------------------+\n        |\n        | Compile\n        v\n+-------------------+\n| Rust Source Code  |\n+-------------------+\n```\n\n### 以 iOS 平台编译为例，其实现步骤包括：\n\n1. 创建 Rust 库\n2. 在 Rust 中使用 FFI（外部函数接口）\n3. 定义 C-ABI 函数\n4. 编译库文件\n5. 将库文件链接到 iOS 应用\n6. 处理数据类型\n7. 测试和调试\n\n### 最终编译目标的存储空间占用\n\n| **平台/格式** | **文件名** | **大小** |\n| --- | --- | --- |\n| Docker 镜像 | enclave-server | < 17M |\n| WebAssembly 包 | anychain_wasm_bg.wasm | 81K |\n| STM32 | ROM | < 10M |\n| iOS | anychain-ethereum-cli | 7.4M |\n\n相比之下，web3.js/node_modules 需要引入高达 29M 的第三方包\n\n## Anychain-KMS\n\n### Anychain 基于 BIP32/BIP39 标准提供的工具函数集合\n\n- 私钥（Private Key）\n- 公钥（Public Key）\n- 助记词（Mnemonic）\n- 种子（Seed）\n- 扩展密钥（Extended Key）\n- 扩展私钥（Extended Private Key）\n- 扩展公钥（Extended Public Key）\n- 派生路径（Derivation Path）\n\n这些工具函数用于支持各条区块链的钱包生成。"
  },
  {
    "path": "docs/design-en.md",
    "content": "# Design Principles for AnyChain Wallet SDK\n\n1. Support transfer transactions for the top 100 tokens by market cap and TVL, including: BTC, ETH, USDT, BNB, SOL, USDC, TON, etc. Correspondingly, the blockchains to be integrated include: Bitcoin, Ethereum, Solana, as well as L2 networks on various chains.\n2. Implement cross-platform compilation for wide compatibility. Language choice limited to C/C++/Rust due to source code and toolchain considerations.\n\n## Abstraction of Public Chain Features\n\n### Core Features Most Public Chains Need to Support\n\n- PublicKey\n- PrivateKey\n- Address\n- Amount\n- Transaction\n- Network\n- Format\n\nanychain-core, as a comprehensive abstract Trait, defines the following common methods:\n\n```rust\npub trait PublicKey {\n    fn from_private_key(private_key: &Self::PrivateKey) -> Self;\n    fn to_address(&self, format: &Self::Format) -> Result<Self::Address, AddressError>;\n}\n\npub trait Address {\n    fn from_private_key(private_key: &Self::PrivateKey, format: &Self::Format) -> Result<Self, AddressError>;\n    fn from_public_key(public_key: &Self::PublicKey, format: &Self::Format) -> Result<Self, AddressError>;\n}\n\npub trait Amount {}\n\npub trait Format {}\n\npub trait Transaction {\n    fn new(parameters: &Self::TransactionParameters) -> Result<Self, TransactionError>;\n    fn sign();\n    fn from_bytes();\n    fn to_bytes(&self);\n    fn to_transaction_id(&self);\n}\n```\n\n### Trait Implementation for Various Chains\n\nLet's take TronAddress from anychain-tron as an example:\n\n```rust\npub struct TronAddress([u8; 21]);\n\nimpl Address for TronAddress {\n    type Format = TronFormat;\n    type PrivateKey = TronPrivateKey;\n    type PublicKey = TronPublicKey;\n\n    fn from_private_key(\n        private_key: &Self::PrivateKey, \n        format: &Self::Format\n    ) -> Result<Self, AddressError> {\n        todo!()\n    }\n\n    fn from_public_key(\n        public_key: &Self::PublicKey, \n        format: &Self::Format\n    ) -> Result<Self, AddressError> {\n        todo!()\n    }\n}\n```\n\nBy introducing the abstraction layer of anychain-core and the specific implementations of chains such as anychain-bitcoin and anychain-tron, upper-level applications can use unified code and interfaces to call the anychain SDK.\n\n## Cross-Platform Compilation\n\n| Platform | Target File Format |\n| --- | --- |\n| iOS | .a (Static Library) |\n| Android | .so (Shared Object) |\n| Web/Wasm | .wasm (WebAssembly) |\n| Windows | .dll (Dynamic-Link Library) |\n| macOS | .dylib (Dynamic Library) |\n| Embedded Devices | ELF (Executable and Linkable Format) |\n| Trusted Execution Environment (TEE) | .eif (Encrypted Image File) |\n\n### iOS platform calling hierarchy\n\n```\n+-------------------+\n| iOS Application   |\n+-------------------+\n        |\n        | Link\n        v\n+-------------------+\n| C Library (.dylib)|\n+-------------------+\n        |\n        | FFI\n        v\n+-------------------+\n| Rust Library      |\n+-------------------+\n        |\n        | Compile\n        v\n+-------------------+\n| Rust Source Code  |\n+-------------------+\n```\n\n### iOS Platform Compilation Steps:\n\n1. Creating a Rust library\n2. Using FFI (Foreign Function Interface) in Rust\n3. Defining C-ABI functions\n4. Compiling the library file\n5. Linking the library file to the iOS application\n6. Handling data types\n7. Testing and debugging\n\n### Compiled Target Sizes\n\n| **Platform/Format** | **File Name** | **Size** |\n| --- | --- | --- |\n| Docker image | enclave-server | < 17M |\n| WebAssembly package | anychain_wasm_bg.wasm | 81K |\n| STM32 | ROM | < 10M |\n| iOS | anychain-ethereum-cli | 7.4M |\n\nIn comparison, web3.js/node_modules requires the inclusion of third-party packages up to 29M\n\n## Anychain-KMS\n\n### Anychain's BIP32/BIP39-based utility functions\n\n- Private Key\n- Public Key\n- Mnemonic\n- Seed\n- Extended Key\n- Extended Private Key\n- Extended Public Key\n- Derivation Path\n\nThese utility functions are used to support wallet generation for various blockchains."
  },
  {
    "path": "examples/anychain-bitcoin-cli/Cargo.toml",
    "content": "[package]\nname = \"anychain-bitcoin-cli\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../../crates/anychain-core\" }\nanychain-bitcoin = { path = \"../../crates/anychain-bitcoin\" }\nclap = { workspace = true }\nserde_json = { workspace = true }\nlibsecp256k1 = { workspace = true }\n\n[lints]\nworkspace = true"
  },
  {
    "path": "examples/anychain-bitcoin-cli/README.md",
    "content": "# anychain-bitcoin-cli\n\nA command line program for the generation and/or validation of addresses and transactions of utxo compatible blockchains\n\n### Build\n\ncd anychain/anychain-bitcoin-cli\n\ncargo build --release\n\n\n\n### Run\n```\ncd ../target/release\n```\n\n#### Address Generation\n\n* we can generate addresses by providing a corresponding private key:\n```\n./anychain-bitcoin-cli address-gen -n [network] --priv [private_key]\n```\n\ne.g.\n```\n./anychain-bitcoin-cli address-gen -n bitcoin --priv cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\n```\n\n(the private key being a 64-byte hex string)\n\n* we can also generate addresses by providing a corresponding public key:\n\n```\n./anychain-bitcoin-cli address-gen -n [network] --pub [public_key]\n```\n\ne.g.\n```\n./anychain-bitcoin-cli address-gen -n dogecoin --pub 02d215a89dc4aab5191d9480535aba2db9994c3c8fa068102fdb71fba676179e39\n```\n\n(the public key being a 66-byte hex string)\n\n[network] could be any item following:\n```\n  bitcoin\n  bitcoin_testnet\n  bitcoincash\n  bitcoincash_testnet\n  litecoin\n  litecoin_testnet\n  dogecoin\n  dogecoin_testnet\n```\n\n\n#### Address Validation\n\n* we can check if a provided address is a valid one for a specified blockchain network:\n\n```\n./anychain-bitcoin-cli address-validate -n [network] [address]\n```\n\ne.g.\n```\n./anychain-bitcoin-cli address-validate -n bitcoin 15dcrsqEnb7uAsqByxbrUbigpHjPTarbqg\n```\n\n[network] could be any item following:\n```\n  bitcoin\n  bitcoin_testnet\n  bitcoincash\n  bitcoincash_testnet\n  litecoin\n  litecoin_testnet\n  dogecoin\n  dogecoin_testnet\n```\n\n#### Transaction Generation\n\n* we can generate a transaction for a specified blockchain network by providing several inputs and several outputs:\n\n```\n./anychain-bitcoin-cli tx-gen -n [network] -i [input] [input] ...  -o [output] [output] ...\n```\n\n##### Generate a P2PKH Transaction\ne.g.\n```\n./anychain-bitcoin-cli tx-gen -n bitcoin -i \"{\\\"txid\\\": \\\"9975deeace71258149e8b0d02ed83d59335a658dd348d8cae7bf4ff9ed9db2d0\\\", \\\"index\\\": 0, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\"}\" -o \"{\\\"to\\\": \\\"15dcrsqEnb7uAsqByxbrUbigpHjPTarbqg\\\", \\\"amount\\\": 3300000}\"\n```\n\n##### Generate a P2SH_P2WPKH Transaction\ne.g.\n```\n./anychain-bitcoin-cli tx-gen -n bitcoin -i \"{\\\"txid\\\": \\\"9975deeace71258149e8b0d02ed83d59335a658dd348d8cae7bf4ff9ed9db2d0\\\", \\\"index\\\": 0, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\", \\\"format\\\": \\\"p2sh_p2wpkh\\\", \\\"balance\\\": 8800000}\" -o \"{\\\"to\\\": \\\"15dcrsqEnb7uAsqByxbrUbigpHjPTarbqg\\\", \\\"amount\\\": 3300000}\"\n```\n\n##### Generate a Bech32 Transaction\ne.g.\n```\n./anychain-bitcoin-cli tx-gen -n bitcoin -i \"{\\\"txid\\\": \\\"9975deeace71258149e8b0d02ed83d59335a658dd348d8cae7bf4ff9ed9db2d0\\\", \\\"index\\\": 0, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\", \\\"format\\\": \\\"bech32\\\", \\\"balance\\\": 8800000}\" -o \"{\\\"to\\\": \\\"15dcrsqEnb7uAsqByxbrUbigpHjPTarbqg\\\", \\\"amount\\\": 3300000}\"\n```\n\n##### Generate a CashAddr Transaction (Bitcoin Cash Only)\ne.g.\n```\n./anychain-bitcoin-cli tx-gen -n bitcoincash -i \"{\\\"txid\\\": \\\"9975deeace71258149e8b0d02ed83d59335a658dd348d8cae7bf4ff9ed9db2d0\\\", \\\"index\\\": 0, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\", \\\"format\\\": \\\"cash_addr\\\", \\\"balance\\\": 8800000}\" -o \"{\\\"to\\\": \\\"bitcoincash:qp20yqd2260z7rqvm29ntst8vljw5zge352yqrlsql\\\", \\\"amount\\\": 3300000}\"\n```\n\n##### Generate a Transaction with multiple inputs in multiple formats\ne.g.\n```\n./anychain-bitcoin-cli tx-gen -n bitcoin -i \"{\\\"txid\\\": \\\"9975deeace71258149e8b0d02ed83d59335a658dd348d8cae7bf4ff9ed9db2d0\\\", \\\"index\\\": 3, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\"}\" \"{\\\"txid\\\": \\\"36d3815b142fc9a93c1fff1ef7994fe6f3919ccc54a51c891e8418ca95a51020\\\", \\\"index\\\": 1, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\", \\\"format\\\": \\\"p2sh_p2wpkh\\\", \\\"balance\\\": 8090000}\" \"{\\\"txid\\\": \\\"ba2bcfed866d89c59110901ee513ffaba1ab6c8e3b99ab8d386c0f8fc0f8a38b\\\", \\\"index\\\": 2, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\", \\\"format\\\": \\\"bech32\\\", \\\"balance\\\": 31370000}\" -o \"{\\\"to\\\": \\\"15dcrsqEnb7uAsqByxbrUbigpHjPTarbqg\\\", \\\"amount\\\": 3300000}\" \"{\\\"to\\\": \\\"1AWccoPWBihK9kHi1UkZnqpreW55PCugYR\\\", \\\"amount\\\": 9000000}\"\n```\n"
  },
  {
    "path": "examples/anychain-bitcoin-cli/src/main.rs",
    "content": "use clap::{Arg, Command};\nuse serde_json::Value;\nuse std::str::FromStr;\n\nuse anychain_bitcoin::{\n    Bitcoin, BitcoinAddress, BitcoinAmount, BitcoinCash, BitcoinCashTestnet, BitcoinFormat,\n    BitcoinNetwork, BitcoinPublicKey, BitcoinTestnet, BitcoinTransaction, BitcoinTransactionInput,\n    BitcoinTransactionOutput, BitcoinTransactionParameters, Dogecoin, DogecoinTestnet, Litecoin,\n    LitecoinTestnet, SignatureHash,\n};\n\nuse anychain_core::{hex, Address, PublicKey, Transaction};\n\nfn address_from_public_key<N: BitcoinNetwork>(\n    public_key: libsecp256k1::PublicKey,\n) -> Vec<(BitcoinFormat, String)> {\n    let public_key = BitcoinPublicKey::<N>::from_secp256k1_public_key(public_key, true);\n    let converter = |addr: BitcoinAddress<N>| Ok(addr.to_string());\n    let addresses: Vec<(BitcoinFormat, String)> = [\n        (\n            BitcoinFormat::P2PKH,\n            public_key\n                .to_address(&BitcoinFormat::P2PKH)\n                .and_then(converter),\n        ),\n        (\n            BitcoinFormat::P2SH_P2WPKH,\n            public_key\n                .to_address(&BitcoinFormat::P2SH_P2WPKH)\n                .and_then(converter),\n        ),\n        (\n            BitcoinFormat::Bech32,\n            public_key\n                .to_address(&BitcoinFormat::Bech32)\n                .and_then(converter),\n        ),\n        (\n            BitcoinFormat::CashAddr,\n            public_key\n                .to_address(&BitcoinFormat::CashAddr)\n                .and_then(converter),\n        ),\n    ]\n    .iter()\n    .map(|tuple| {\n        if let Ok(item) = &tuple.1 {\n            (tuple.0.clone(), item.to_string())\n        } else {\n            (tuple.0.clone(), \"null\".to_string())\n        }\n    })\n    .collect();\n\n    addresses\n}\n\nfn address_validation<N: BitcoinNetwork>(address: &str) {\n    if BitcoinAddress::<N>::is_valid(address) {\n        println!(\"{} is a valid {} address\", address, N::NAME);\n    } else {\n        println!(\"{} is not a valid {} address\", address, N::NAME);\n    }\n}\n\nfn tx_gen<N: BitcoinNetwork>(\n    inputs: Vec<&String>,\n    outputs: Vec<&String>,\n    is_fork_id: bool,\n) -> String {\n    let inputs: Vec<(BitcoinTransactionInput<N>, Option<libsecp256k1::SecretKey>)> = inputs\n        .iter()\n        .map(|&input| {\n            let input = serde_json::from_str::<Value>(input).unwrap();\n\n            let txid = input[\"txid\"].clone();\n            let index = input[\"index\"].clone();\n            let format = input[\"format\"].clone();\n            let balance = input[\"balance\"].clone();\n            let private_key = input[\"private_key\"].clone();\n            let public_key = input[\"public_key\"].clone();\n            let signature = input[\"signature\"].clone();\n\n            if txid.is_null() {\n                panic!(\"Txid not provided\");\n            }\n\n            if index.is_null() {\n                panic!(\"Index not provided\");\n            }\n\n            let txid = txid.as_str().unwrap();\n            let txid = hex::decode(txid).unwrap();\n\n            let index = index.as_u64().unwrap() as u32;\n\n            let sighash = if is_fork_id {\n                SignatureHash::SIGHASH_ALL_SIGHASH_FORKID\n            } else {\n                SignatureHash::SIGHASH_ALL\n            };\n\n            let format = if !format.is_null() {\n                let f = format.as_str().unwrap();\n                BitcoinFormat::from_str(f).unwrap()\n            } else {\n                BitcoinFormat::P2PKH\n            };\n\n            let balance = if format != BitcoinFormat::P2PKH {\n                if balance.is_null() {\n                    panic!(\"Balance not provided\");\n                }\n                let balance = BitcoinAmount(balance.as_i64().unwrap());\n                Some(balance)\n            } else {\n                None\n            };\n\n            let mut input = BitcoinTransactionInput::<N>::new(\n                txid,\n                index,\n                None,\n                Some(format),\n                None,\n                balance,\n                sighash,\n            )\n            .unwrap();\n\n            let secret_key = if !signature.is_null() {\n                let signature = signature.as_str().unwrap();\n                if signature.len() != 128 {\n                    panic!(\"Invalid signature length\");\n                }\n                let signature = hex::decode(signature).unwrap();\n                if !public_key.is_null() {\n                    let k = public_key.as_str().unwrap();\n                    if k.len() != 66 {\n                        panic!(\"Invalid public key length\");\n                    }\n                    let k = hex::decode(k).unwrap();\n                    input.sign(signature, k).unwrap();\n                    None\n                } else if !private_key.is_null() {\n                    let k = private_key.as_str().unwrap();\n                    if k.len() != 64 {\n                        panic!(\"Invalid private key length\");\n                    }\n                    let k = hex::decode(k).unwrap();\n                    let k = libsecp256k1::SecretKey::parse_slice(&k).unwrap();\n                    let pk = libsecp256k1::PublicKey::from_secret_key(&k);\n                    let pk = pk.serialize_compressed().to_vec();\n                    input.sign(signature, pk).unwrap();\n                    None\n                } else {\n                    panic!(\"Neither a private key nor a public key is provided\");\n                }\n            } else if !private_key.is_null() {\n                let k = private_key.as_str().unwrap();\n                let k = hex::decode(k).unwrap();\n                let k = libsecp256k1::SecretKey::parse_slice(&k).unwrap();\n                Some(k)\n            } else {\n                panic!(\"Private key not provided\");\n            };\n            (input, secret_key)\n        })\n        .collect();\n\n    let outputs: Vec<BitcoinTransactionOutput> = outputs\n        .iter()\n        .map(|&output| {\n            let output = serde_json::from_str::<Value>(output).unwrap();\n\n            let to = output[\"to\"].clone();\n            let amount = output[\"amount\"].clone();\n\n            let to = to.as_str().unwrap();\n            let amount = amount.as_i64().unwrap();\n\n            BitcoinTransactionOutput::new(\n                BitcoinAddress::<N>::from_str(to).unwrap(),\n                BitcoinAmount::from_satoshi(amount).unwrap(),\n            )\n            .unwrap()\n        })\n        .collect();\n\n    let mut tx = BitcoinTransaction::<N>::new(\n        &BitcoinTransactionParameters::<N>::new(\n            inputs.iter().map(|input| input.0.clone()).collect(),\n            outputs,\n        )\n        .unwrap(),\n    )\n    .unwrap();\n\n    for i in 0..inputs.len() {\n        let i = i as u32;\n        let input = tx.input(i).unwrap();\n        let secret_key = &inputs[i as usize].1;\n        if !input.is_signed {\n            match secret_key {\n                Some(k) => {\n                    let pk = BitcoinPublicKey::<N>::from_secret_key(k);\n                    let format = input.get_format().unwrap();\n                    input.set_public_key(pk.clone(), format).unwrap();\n                    let hash = tx.digest(i).unwrap();\n                    let msg = libsecp256k1::Message::parse_slice(&hash).unwrap();\n                    let sig = libsecp256k1::sign(&msg, k).0;\n                    let sig = sig.serialize().to_vec();\n                    let pk = pk.serialize();\n                    tx.input(i).unwrap().sign(sig, pk).unwrap();\n                }\n                None => panic!(\"Private key missing\"),\n            }\n        }\n    }\n\n    tx.set_segwit().unwrap();\n\n    hex::encode(tx.to_bytes().unwrap())\n}\n\nfn main() {\n    let matches = Command::new(\"anychain\")\n        .subcommands(vec![\n            Command::new(\"address-gen\")\n                .about(\"Generate an address of a utxo-typed blockchain\")\n                .arg(\n                    Arg::new(\"network\")\n                        .long(\"network\")\n                        .short('n')\n                        .num_args(1)\n                        .help(\"Specify the network of the address to be generated\"),\n                )\n                .arg(\n                    Arg::new(\"private_key\")\n                        .long(\"priv\")\n                        .num_args(1..)\n                        .help(\"Generate an address from a private key in hex format\"),\n                )\n                .arg(\n                    Arg::new(\"public_key\")\n                        .long(\"pub\")\n                        .num_args(1..)\n                        .help(\"Generate an address from a compressed public key in hex format\"),\n                ),\n            Command::new(\"address-validate\")\n                .about(\"Check if an address of a utxo-typed blockchain is valid\")\n                .arg(\n                    Arg::new(\"network\")\n                        .long(\"network\")\n                        .short('n')\n                        .num_args(1)\n                        .help(\"Specify the network of the address to be validated\"),\n                )\n                .arg(\n                    Arg::new(\"address\")\n                        .num_args(1..)\n                        .help(\"Specify the address to be validated\"),\n                ),\n            Command::new(\"tx-gen\")\n                .about(\"Generate a transaction of a utxo-typed blockchain\")\n                .arg(\n                    Arg::new(\"network\")\n                        .long(\"network\")\n                        .short('n')\n                        .num_args(1)\n                        .help(\"Specify the network of the transaction to be generated\"),\n                )\n                .arg(\n                    Arg::new(\"inputs\")\n                        .num_args(1..)\n                        .long(\"input\")\n                        .short('i')\n                        .help(\"Specify the input of the transaction to be generated\"),\n                )\n                .arg(\n                    Arg::new(\"outputs\")\n                        .num_args(1..)\n                        .long(\"output\")\n                        .short('o')\n                        .help(\"Specify the output of the transaction to be generated\"),\n                ),\n        ])\n        .get_matches();\n\n    match matches.subcommand() {\n        Some((\"address-gen\", sub_matches)) => {\n            let network = sub_matches.get_one::<String>(\"network\");\n            if network.is_none() {\n                println!(\"Network not specified\");\n                return;\n            }\n            let private_keys = sub_matches.get_many::<String>(\"private_key\");\n            let public_keys = sub_matches.get_many::<String>(\"public_key\");\n\n            let public_keys = if let Some(private_keys) = private_keys {\n                if public_keys.is_some() {\n                    println!(\"Public keys are needless in presence of private keys\");\n                    return;\n                }\n                let private_keys: Vec<&String> = private_keys.collect();\n                let public_keys: Vec<libsecp256k1::PublicKey> = private_keys\n                    .iter()\n                    .map(|&private_key| {\n                        if private_key.len() != 64 {\n                            panic!(\"Invalid private key\");\n                        }\n                        let private_key = hex::decode(private_key).unwrap();\n                        let private_key =\n                            libsecp256k1::SecretKey::parse_slice(&private_key).unwrap();\n                        libsecp256k1::PublicKey::from_secret_key(&private_key)\n                    })\n                    .collect();\n                public_keys\n            } else if let Some(public_keys) = public_keys {\n                let public_keys: Vec<&String> = public_keys.collect();\n                let public_keys: Vec<libsecp256k1::PublicKey> = public_keys\n                    .iter()\n                    .map(|&public_key| {\n                        if public_key.len() != 66 {\n                            panic!(\"Invalid compressed public key\");\n                        }\n                        let public_key = hex::decode(public_key).unwrap();\n                        libsecp256k1::PublicKey::parse_slice(&public_key, None).unwrap()\n                    })\n                    .collect();\n                public_keys\n            } else {\n                println!(\"Neither a private key nor a public key is provided\");\n                return;\n            };\n\n            let network = network.unwrap().clone();\n\n            for public_key in public_keys {\n                let addresses = match network.as_str() {\n                    \"bitcoin\" => address_from_public_key::<Bitcoin>(public_key),\n                    \"bitcoin_testnet\" => address_from_public_key::<BitcoinTestnet>(public_key),\n                    \"bitcoincash\" => address_from_public_key::<BitcoinCash>(public_key),\n                    \"bitcoincash_testnet\" => {\n                        address_from_public_key::<BitcoinCashTestnet>(public_key)\n                    }\n                    \"litecoin\" => address_from_public_key::<Litecoin>(public_key),\n                    \"litecoin_testnet\" => address_from_public_key::<LitecoinTestnet>(public_key),\n                    \"dogecoin\" => address_from_public_key::<Dogecoin>(public_key),\n                    \"dogecoin_testnet\" => address_from_public_key::<DogecoinTestnet>(public_key),\n                    _ => {\n                        println!(\"Unsupported network\");\n                        return;\n                    }\n                };\n                for (format, address) in addresses {\n                    println!(\"{} ({})\", address, format,);\n                }\n                println!();\n            }\n        }\n        Some((\"address-validate\", sub_matches)) => {\n            let network = sub_matches.get_one::<String>(\"network\");\n            let address = sub_matches.get_one::<String>(\"address\");\n\n            if network.is_none() {\n                println!(\"Network not provided\");\n                return;\n            }\n\n            if address.is_none() {\n                println!(\"Address not provided\");\n                return;\n            }\n\n            let address = address.unwrap().clone();\n            let network = network.unwrap().clone();\n\n            match network.as_str() {\n                \"bitcoin\" => address_validation::<Bitcoin>(&address),\n                \"bitcoin_testnet\" => address_validation::<BitcoinTestnet>(&address),\n                \"bitcoincash\" => address_validation::<BitcoinCash>(&address),\n                \"bitcoincash_testnet\" => address_validation::<BitcoinCashTestnet>(&address),\n                \"litecoin\" => address_validation::<Litecoin>(&address),\n                \"litecoin_testnet\" => address_validation::<LitecoinTestnet>(&address),\n                \"dogecoin\" => address_validation::<Dogecoin>(&address),\n                \"dogecoin_testnet\" => address_validation::<DogecoinTestnet>(&address),\n                _ => println!(\"Unsupported network\"),\n            };\n        }\n        Some((\"tx-gen\", sub_matches)) => {\n            let network = sub_matches.get_one::<String>(\"network\");\n            let inputs = sub_matches.get_many::<String>(\"inputs\");\n            let outputs = sub_matches.get_many::<String>(\"outputs\");\n\n            if network.is_none() {\n                println!(\"Network not provided\");\n                return;\n            }\n\n            if inputs.is_none() {\n                println!(\"No input is provided\");\n                return;\n            }\n\n            if outputs.is_none() {\n                println!(\"No output is provided\");\n                return;\n            }\n\n            let network = network.unwrap().clone();\n            let inputs: Vec<&String> = inputs.unwrap().collect();\n            let outputs: Vec<&String> = outputs.unwrap().collect();\n\n            let tx = match network.as_str() {\n                \"bitcoin\" => tx_gen::<Bitcoin>(inputs, outputs, false),\n                \"bitcoin_testnet\" => tx_gen::<BitcoinTestnet>(inputs, outputs, false),\n                \"bitcoincash\" => tx_gen::<BitcoinCash>(inputs, outputs, true),\n                \"bitcoincash_testnet\" => tx_gen::<BitcoinCashTestnet>(inputs, outputs, true),\n                \"litecoin\" => tx_gen::<Litecoin>(inputs, outputs, false),\n                \"litecoin_testnet\" => tx_gen::<LitecoinTestnet>(inputs, outputs, false),\n                \"dogecoin\" => tx_gen::<Dogecoin>(inputs, outputs, false),\n                \"dogecoin_testnet\" => tx_gen::<DogecoinTestnet>(inputs, outputs, false),\n                _ => {\n                    println!(\"Unsupported network\");\n                    return;\n                }\n            };\n\n            println!(\"tx = {}\", tx);\n        }\n        _ => {}\n    };\n}\n"
  },
  {
    "path": "examples/anychain-bitcoin-client/Cargo.toml",
    "content": "[package]\nname = \"anychain-bitcoin-client\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../../crates/anychain-core\" }\nanychain-bitcoin = { path = \"../../crates/anychain-bitcoin\" }\nlibsecp256k1 = { workspace = true }\n\n\n[lints]\nworkspace = true"
  },
  {
    "path": "examples/anychain-bitcoin-client/src/main.rs",
    "content": "use std::str::FromStr;\n\nuse anychain_bitcoin::{\n    BitcoinAddress, BitcoinAmount, BitcoinFormat, BitcoinPublicKey, BitcoinTestnet as Testnet,\n    BitcoinTransaction, BitcoinTransactionInput, BitcoinTransactionOutput,\n    BitcoinTransactionParameters, SignatureHash,\n};\n\nuse anychain_core::{hex, Address, PublicKey, Transaction};\n\nfn address_from_secret_key() {\n    // Generates Bitcoin addresses from a secret key.\n    // It generates three types of addresses: P2PKH, P2SH_P2WPKH, and Bech32.\n\n    let secret_key = [\n        1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 71, 1, 1, 1, 1, 8, 1, 1, 1, 111, 1, 1, 103, 1, 1, 57,\n        1, 1, 1, 1,\n    ];\n\n    let secret_key = libsecp256k1::SecretKey::parse(&secret_key).unwrap();\n\n    let addr_p2pkh =\n        BitcoinAddress::<Testnet>::from_secret_key(&secret_key, &BitcoinFormat::P2PKH).unwrap();\n\n    let addr_p2sh_p2wpkh =\n        BitcoinAddress::<Testnet>::from_secret_key(&secret_key, &BitcoinFormat::P2SH_P2WPKH)\n            .unwrap();\n\n    let addr_bech32 =\n        BitcoinAddress::<Testnet>::from_secret_key(&secret_key, &BitcoinFormat::Bech32).unwrap();\n\n    println!(\"address p2pkh = {}\", addr_p2pkh);\n    println!(\"address p2sh_p2wpkh = {}\", addr_p2sh_p2wpkh);\n    println!(\"address bech32 = {}\", addr_bech32);\n}\n\nfn address_from_public_key() {\n    // Generates Bitcoin addresses from a public key.\n    // Generates three types of addresses: P2PKH, P2SH_P2WPKH, and Bech32.\n\n    let public_key = [\n        3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52,\n        96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143,\n    ];\n\n    let public_key = libsecp256k1::PublicKey::parse_compressed(&public_key).unwrap();\n\n    let public_key = BitcoinPublicKey::<Testnet>::from_secp256k1_public_key(public_key, true);\n\n    let addr_p2pkh = public_key.to_address(&BitcoinFormat::P2PKH).unwrap();\n\n    let addr_p2sh_p2wpkh = public_key.to_address(&BitcoinFormat::P2SH_P2WPKH).unwrap();\n\n    let addr_bech32 = public_key.to_address(&BitcoinFormat::Bech32).unwrap();\n\n    println!(\"\\naddress p2pkh = {}\", addr_p2pkh);\n    println!(\"address p2sh_p2wpkh = {}\", addr_p2sh_p2wpkh);\n    println!(\"address bech32 = {}\", addr_bech32);\n}\n\nfn address_from_str() {\n    // Parses a Bitcoin address from a string.\n    // It takes a string representation of a Bitcoin address and converts it into a BitcoinAddress object.\n\n    let addr = \"mm21MpCm2cVYBxZvxk6DaQC7C4o5Ukq2Wf\";\n\n    let addr = BitcoinAddress::<Testnet>::from_str(addr).unwrap();\n\n    println!(\"\\naddress = {}\", addr);\n}\n\nfn address_validation() {\n    // Validates a Bitcoin address.\n    // It checks whether a given string is a valid Bitcoin address.\n\n    let addr = \"mm21MpCm2cVYBxZvxk6DaQC7C4o5Ukq2Wf\";\n\n    let status = BitcoinAddress::<Testnet>::is_valid(addr);\n\n    println!(\"status = {}\", status);\n}\n\nfn amount_gen() {\n    // Generates Bitcoin amounts in satoshi from BTC and satoshi values.\n    // It demonstrates how to create BitcoinAmount objects from BTC and satoshi values.\n\n    let amount1 = BitcoinAmount::from_btc(1).unwrap();\n    let amount2 = BitcoinAmount::from_satoshi(1000).unwrap();\n\n    println!(\"amount1 = {} satoshi\", amount1);\n    println!(\"amount2 = {} satoshi\", amount2);\n}\n\nfn transaction_gen() {\n    // Generates a Bitcoin transaction.\n    // It creates a transaction with multiple inputs and outputs, signs it with a secret key, and prints the transaction.\n\n    let secret_key = [\n        1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 71, 1, 1, 1, 1, 8, 1, 1, 1, 111, 1, 1, 103, 1, 1, 57,\n        1, 1, 1, 1,\n    ];\n    let secret_key = libsecp256k1::SecretKey::parse(&secret_key).unwrap();\n    let public_key = libsecp256k1::PublicKey::from_secret_key(&secret_key);\n    let public_key = BitcoinPublicKey::<Testnet>::from_secp256k1_public_key(public_key, true);\n\n    let recipient = \"2MsRNMaKe8YWcdUaRi8jwa2aHG85kzsbUHe\";\n    let amount = 500000;\n    let fee = 1000;\n\n    let inputs = [\n        (\n            \"39f420dc156f4ac1ad753a9fae1206973d9eede39a004c04496b7f9f525c77b8\",\n            0,\n            \"mm21MpCm2cVYBxZvxk6DaQC7C4o5Ukq2Wf\",\n            1378890,\n        ),\n        (\n            \"dc163eb31a9cdd5a8bb49066477375f9a0068791176e7b4a61e54751581449ae\",\n            1,\n            \"tb1q83t5qrd4yzrd477eskjp5f8ujtrf6enwgw87rn\",\n            1481548,\n        ),\n    ];\n\n    for item in inputs.iter() {\n        let input = BitcoinTransactionInput::new(\n            hex::decode(item.0).unwrap(),\n            item.1,\n            None,\n            None,\n            Some(BitcoinAddress::<Testnet>::from_str(item.2).unwrap()),\n            Some(BitcoinAmount::from_satoshi(item.3).unwrap()),\n            SignatureHash::SIGHASH_ALL,\n        )\n        .unwrap();\n\n        let output1 = BitcoinTransactionOutput::new(\n            BitcoinAddress::<Testnet>::from_str(recipient).unwrap(),\n            BitcoinAmount::from_satoshi(amount).unwrap(),\n        )\n        .unwrap();\n\n        let output2 = BitcoinTransactionOutput::new(\n            BitcoinAddress::<Testnet>::from_str(item.2).unwrap(),\n            BitcoinAmount::from_satoshi(item.3 - amount - fee).unwrap(),\n        )\n        .unwrap();\n\n        let mut tx = BitcoinTransaction::new(\n            &BitcoinTransactionParameters::new(vec![input], vec![output1, output2]).unwrap(),\n        )\n        .unwrap();\n\n        let hash = tx.digest(0).unwrap();\n        let msg = libsecp256k1::Message::parse_slice(&hash).unwrap();\n        let sig = libsecp256k1::sign(&msg, &secret_key).0.serialize().to_vec();\n\n        let _ = tx.input(0).unwrap().sign(sig, public_key.serialize());\n\n        println!(\"tx = {}\\n\", tx);\n    }\n}\n\nfn main() {\n    // Generates Bitcoin addresses from a secret key\n    address_from_secret_key();\n\n    // Generates Bitcoin addresses from a public key\n    address_from_public_key();\n\n    // Parses a Bitcoin address from a string\n    address_from_str();\n\n    // Validates a Bitcoin address\n    address_validation();\n\n    // Generates Bitcoin amounts in satoshi from BTC and satoshi values\n    amount_gen();\n\n    // Generates a Bitcoin transaction\n    transaction_gen();\n}\n"
  },
  {
    "path": "examples/anychain-ethereum-cli/Cargo.toml",
    "content": "[package]\nname = \"anychain-ethereum-cli\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../../crates/anychain-core\" }\nanychain-ethereum = { path = \"../../crates/anychain-ethereum\" }\nclap = { workspace = true }\nrlp = { workspace = true }\nprimitive-types = { workspace = true }\nlibsecp256k1 = { workspace = true }\n\n[lints]\nworkspace = true"
  },
  {
    "path": "examples/anychain-ethereum-cli/README.md",
    "content": "# anychain-ethereum-cli\n\nA command line program for the generation and/or validation of addresses and transactions of evm compatible blockchains\n\n### Build\n\ncd anychain/anychain-ethereum-cli\n\ncargo build --release\n\n\n\n### Run\n```\ncd ../target/release\n```\n\n#### 0. Generate Address \n\n##### from public key\n\n```bash\n./anychain-ethereum-cli address-gen --pub 0x0299bb27e93fba02d13d78b1d7807cc811266e31e7b6feae3e09d42d49482fda95\n0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\n./anychain-ethereum-cli address-gen --pub 0299bb27e93fba02d13d78b1d7807cc811266e31e7b6feae3e09d42d49482fda95\n0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\n./anychain-ethereum-cli address-gen --pub 0499bb27e93fba02d13d78b1d7807cc811266e31e7b6feae3e09d42d49482fda9519127e684ded784c50d4559d87e0723c801635f6c387bb36cb4bf72e33201934\n0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\n./anychain-ethereum-cli address-gen --pub 0x0499bb27e93fba02d13d78b1d7807cc811266e31e7b6feae3e09d42d49482fda9519127e684ded784c50d4559d87e0723c801635f6c387bb36cb4bf72e33201934\n0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\n```\n\n##### from private key\n\n```bash\n./anychain-ethereum-cli address-gen --prv 0xb2ab8cfd1de774907de3fb12c8f3bafb76a575e1004f9f33309f1c570be18baf\n0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\n./anychain-ethereum-cli address-gen --prv b2ab8cfd1de774907de3fb12c8f3bafb76a575e1004f9f33309f1c570be18baf\n0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\n```\n\n#### 1. Parse Address from String & Validate Address\n\n```bash\n./anychain-ethereum-cli address-validate E0709D3C521fe51CA7E65E00929D7EEFCF0b1814\nValid\n./anychain-ethereum-cli address-validate 0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1814\nValid\n./anychain-ethereum-cli address-validate 0xE0709D3C521fe51CA7E65E00929D7EEFCF0b1815\nValid # anychain does not check the checksum\n./anychain-ethereum-cli address-validate 0xE0709D3C521fe51CA7E65E00929D7EEFCF0b18145\nInvalid\n```\n\n#### 2. Generate wei from ether and vice versa\n\n```bash\n./anychain-ethereum-cli towei 0.12345678ether\n123456780000000000\n./anychain-ethereum-cli towei 1gwei\n1000000000\n./anychain-ethereum-cli towei 1.1Gwei\n1100000000\n```\n\n\n#### 3. Make Transaction\n\nThis is a \"Do What I Mean\" (DWIM) style command, which will generate a transaction from the given parameters.\nThe parameters are:\n\n| your intent | mode | to | token | value | data | rsv |\n| ----------- | ---- | -- | ----- | ----- | ---- | --- |\n| unsigned ether transfer | main | recepient | leave empty | amount in wei | leave empty | leave empty |\n| unsigned token transfer | erc20 | recepient | token contract | amount of token | leave empty | leave empty |\n| unsigned any transaction | any | to | leave empty | value | data | leave empty |\n| signed ether transfer | main | recepient | leave empty | amount in wei | leave empty | rsv |\n| signed token transfer | erc20 | recepient | token contract | amount of token | leave empty | rsv |\n| signed any transaction | any | to | leave empty | value | data | rsv |\n\n\n##### Make an ether transaction's preimage\n\n```bash\n./anychain-ethereum-cli maketx --mode main --network sepolia --nonce 4 --gasprice 2gwei --gaslimit 21000 --to 0x717648D7d50fF001cc1088E8dc416Dfa26c32CB9 --value 1145141919810893 \n```\nwhich outputs:\n```\ntx = 0xed04847735940082520894717648d7d50ff001cc1088e8dc416dfa26c32cb9870411802159054d8083aa36a78080\n```\n\n##### Make a signed ether transaction\n\n```bash\n./anychain-ethereum-cli maketx --mode main --network sepolia --nonce 4 --gasprice 2gwei --gaslimit 21000 --to 0x717648D7d50fF001cc1088E8dc416Dfa26c32CB9 --value 1145141919810893 -r 371efe039d17f0bf74b732c94a5d7c4a04f4bf747bde94a779dd8fd7b180d106 -s 0eacd1b265ddfea09f4c20400429dba2224af8eed462a732358f7da8f1848e18 -v 0\n```\nwhich outputs:\n```\ntx = 0xf86e04847735940082520894717648d7d50ff001cc1088e8dc416dfa26c32cb9870411802159054d808401546d71a0371efe039d17f0bf74b732c94a5d7c4a04f4bf747bde94a779dd8fd7b180d106a00eacd1b265ddfea09f4c20400429dba2224af8eed462a732358f7da8f1848e18\n```\n\nthis tx can successfully broadcast: https://sepolia.etherscan.io/tx/0x9abef6656c8c246af1e68d5bca943507727b10597fd2b1cf84d14a868e7da3fb\n\n##### make an erc-20 transaction's preimage\n\n```bash\n./anychain-ethereum-cli maketx --mode erc20 --network sepolia --nonce 5 --gasprice 2gwei --gaslimit 51000 --to 0x717648D7d50fF001cc1088E8dc416Dfa26c32CB9 --token 0x779877A7B0D9E8603169DdbD7836e478b4624789 --value 1145141919810893 \n```\nwhich outputs\n```\ntx = 0xf86b05847735940082c73894779877a7b0d9e8603169ddbd7836e478b462478980b844a9059cbb000000000000000000000000717648d7d50ff001cc1088e8dc416dfa26c32cb9000000000000000000000000000000000000000000000000000411802159054d83aa36a78080\n```\n\n##### make a signed erc-20 transaction\n\n```bash\n./anychain-ethereum-cli maketx --mode erc20 --network sepolia --nonce 5 --gasprice 2gwei --gaslimit 51000 --to 0x717648D7d50fF001cc1088E8dc416Dfa26c32CB9 --token 0x779877A7B0D9E8603169DdbD7836e478b4624789 --value 1145141919810893 -r 2fe49c0b946b77bb2c95a60a57c2ec9e5cb25504d0e549eb3a3cbfed8bc9cc54 -s 0x0e050e046dec65c1505653fe6147eb1fa20c63f6b8c7b78c7138b74f48a260a1 -v 0\n```\nwhich outputs\n```\ntx = 0xf8ac05847735940082c73894779877a7b0d9e8603169ddbd7836e478b462478980b844a9059cbb000000000000000000000000717648d7d50ff001cc1088e8dc416dfa26c32cb9000000000000000000000000000000000000000000000000000411802159054d8401546d71a02fe49c0b946b77bb2c95a60a57c2ec9e5cb25504d0e549eb3a3cbfed8bc9cc54a00e050e046dec65c1505653fe6147eb1fa20c63f6b8c7b78c7138b74f48a260a1\n```\nthis tx can successfully broadcast: https://sepolia.etherscan.io/tx/0x9646b0732437f7f004798fb6ce923c61030934796e8f77db748d9ef32e68b597\n\n"
  },
  {
    "path": "examples/anychain-ethereum-cli/src/main.rs",
    "content": "use clap::value_parser;\nuse clap::{Arg, Command};\nuse primitive_types::H160;\nuse primitive_types::U256;\nuse rlp::Encodable;\nuse std::fmt::Display;\nuse std::fmt::Error;\nuse std::fmt::Formatter;\nuse std::str::FromStr;\n\nuse anychain_ethereum::{erc20_transfer, EthereumAddress, EthereumFormat, EthereumPublicKey};\n\nuse anychain_core::{hex, Address, PublicKey};\n\nfn trim0x(s: &str) -> String {\n    // str to lower case\n    let s = s.to_lowercase();\n    // remove 0x prefix\n    let s = s.trim_start_matches(\"0x\");\n    s.to_string()\n}\n\nstruct EIP155Transaction {\n    nonce: u64,\n    gas_price: U256,\n    gas_limit: u64,\n    to: H160,\n    value: U256,\n    data: Vec<u8>,\n    v: u64, // {0, 1} + chain_id * 2 + 35, since EIP-155\n    r: U256,\n    s: U256,\n}\n\nimpl Encodable for EIP155Transaction {\n    fn rlp_append(&self, s: &mut rlp::RlpStream) {\n        s.begin_list(9);\n        s.append(&self.nonce);\n        s.append(&self.gas_price);\n        s.append(&self.gas_limit);\n        s.append(&self.to);\n        s.append(&self.value);\n        s.append(&self.data);\n        s.append(&self.v);\n        s.append(&self.r);\n        s.append(&self.s);\n    }\n}\n\nimpl Display for EIP155Transaction {\n    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {\n        let encoded = rlp::encode(self);\n        let hex = hex::encode(&encoded);\n        write!(f, \"0x{}\", hex)\n    }\n}\n\nfn main() {\n    let matches = Command::new(\"anychain\")\n        .subcommands(vec![\n            Command::new(\"address-gen\")\n                .about(\"Generate an address ethereum-compatible blockchain\")\n                .arg(\n                    Arg::new(\"private_key\")\n                        .long(\"prv\")\n                        .num_args(1)\n                        .help(\"Generate an address from a private key in hex format\"),\n                )\n                .arg(\n                    Arg::new(\"public_key\")\n                        .long(\"pub\")\n                        .num_args(1)\n                        .help(\"Generate an address from a public key in hex format\"),\n                ),\n            Command::new(\"address-validate\")\n                .about(\"Check if an address is valid\")\n                .arg(\n                    Arg::new(\"address\")\n                        .num_args(1)\n                        .help(\"Specify the address to validate\"),\n                ),\n            Command::new(\"towei\")\n                .about(\"Convert ether/gwei/wei to wei\")\n                .arg(\n                    Arg::new(\"value\")\n                        .num_args(1)\n                        .help(\"Specify the ether to be converted\"),\n                ),\n            Command::new(\"maketx\")\n                .about(\"Generate an EIP-155 transaction\")\n                .arg(\n                    Arg::new(\"mode\")\n                        .long(\"mode\")\n                        .num_args(1)\n                        .help(\"transaction mode: main / erc20 / any\"),\n                )\n                .arg(\n                    Arg::new(\"network\")\n                        .long(\"network\")\n                        .num_args(1)\n                        .help(\"Specify the network, according to https://chainid.network/\"),\n                )\n                .arg(\n                    Arg::new(\"nonce\")\n                        .long(\"nonce\")\n                        .num_args(1)\n                        .value_parser(value_parser!(u64))\n                        .help(\"nonce of the sender\"),\n                )\n                .arg(\n                    Arg::new(\"gas_price\")\n                        .long(\"gasprice\")\n                        .num_args(1)\n                        .help(\"gas price of the transaction\"),\n                )\n                .arg(\n                    Arg::new(\"gas_limit\")\n                        .long(\"gaslimit\")\n                        .num_args(1)\n                        .value_parser(value_parser!(u64))\n                        .help(\"gas limit of the transaction\"),\n                )\n                .arg(\n                    Arg::new(\"to\")\n                        .long(\"to\")\n                        .num_args(1)\n                        .help(\"address of the receiver\"),\n                )\n                .arg(\n                    Arg::new(\"token\")\n                        .long(\"token\")\n                        .num_args(1)\n                        .help(\"address of the token contract (erc20)\"),\n                )\n                .arg(\n                    Arg::new(\"value\")\n                        .long(\"value\")\n                        .num_args(1)\n                        .value_parser(value_parser!(u64))\n                        .help(\"value of the transaction\"),\n                )\n                .arg(\n                    Arg::new(\"data\")\n                        .long(\"data\")\n                        .num_args(1)\n                        .help(\"data of the transaction\"),\n                )\n                .arg(\n                    Arg::new(\"r\")\n                        .long(\"r\")\n                        .short('r')\n                        .num_args(1)\n                        .default_value(\"0\")\n                        .help(\"r of the signature\"),\n                )\n                .arg(\n                    Arg::new(\"s\")\n                        .long(\"s\")\n                        .short('s')\n                        .num_args(1)\n                        .default_value(\"0\")\n                        .help(\"s of the signature\"),\n                )\n                .arg(\n                    Arg::new(\"v\")\n                        .long(\"v\")\n                        .short('v')\n                        .num_args(1)\n                        .default_value(\"0\")\n                        .value_parser(value_parser!(u64))\n                        .help(\"v of the signature\"),\n                ),\n        ])\n        .get_matches();\n\n    match matches.subcommand() {\n        Some((\"address-gen\", sub_matches)) => {\n            let private_key = sub_matches.get_one::<String>(\"private_key\");\n            let public_key = sub_matches.get_one::<String>(\"public_key\");\n            let public_key = match (private_key, public_key) {\n                (Some(_), Some(_)) => {\n                    println!(\"Both private key and public key are provided\");\n                    return;\n                }\n                (Some(private_key), None) => {\n                    let private_key = trim0x(private_key);\n                    if private_key.len() != 64 {\n                        println!(\"Invalid private key\");\n                        return;\n                    }\n                    let private_key = hex::decode(private_key).unwrap();\n                    let private_key = libsecp256k1::SecretKey::parse_slice(&private_key).unwrap();\n                    libsecp256k1::PublicKey::from_secret_key(&private_key)\n                }\n                (None, Some(public_key)) => {\n                    let public_key = trim0x(public_key);\n                    let public_key = hex::decode(public_key).unwrap();\n                    // parse_slice can handle both compressed and uncompressed public key\n                    // therefore we don't need to check the length and prefix of the public key\n                    libsecp256k1::PublicKey::parse_slice(&public_key, None).unwrap()\n                }\n                (None, None) => {\n                    println!(\"No private key or public key is provided\");\n                    return;\n                }\n            };\n            println!(\"{}\", address_from_public_key(public_key))\n        }\n        Some((\"address-validate\", sub_matches)) => {\n            let address = sub_matches.get_one::<String>(\"address\");\n\n            if address.is_none() {\n                println!(\"Address not provided\");\n                return;\n            }\n            let address = address.unwrap();\n            if EthereumAddress::is_valid(address) {\n                println!(\"Valid\");\n            } else {\n                println!(\"Invalid\");\n            }\n        }\n        Some((\"towei\", sub_matches)) => {\n            let value = sub_matches.get_one::<String>(\"value\");\n\n            if value.is_none() {\n                println!(\"Value not provided\");\n                return;\n            }\n            let value = towei(value.unwrap());\n            match value {\n                Some(value) => println!(\"{}\", value),\n                None => println!(\"Invalid value\"),\n            }\n        }\n        Some((\"maketx\", sub_matches)) => {\n            let network = sub_matches.get_one::<String>(\"network\").unwrap();\n            let chainid = network_to_chainid(network);\n            let nonce = *sub_matches.get_one::<u64>(\"nonce\").unwrap();\n            let gas_price = sub_matches.get_one::<String>(\"gas_price\").unwrap();\n            let gas_price = towei(gas_price).unwrap();\n            let gas_limit = *sub_matches.get_one::<u64>(\"gas_limit\").unwrap();\n\n            let mut r = U256::from_str(sub_matches.get_one::<String>(\"r\").unwrap()).unwrap();\n            let mut s = U256::from_str(sub_matches.get_one::<String>(\"s\").unwrap()).unwrap();\n            let mut v = *sub_matches.get_one::<u64>(\"v\").unwrap();\n            if r == U256::from(0) || s == U256::from(0) {\n                // unsigned\n                r = U256::from(0);\n                s = U256::from(0);\n                v = chainid;\n            } else {\n                // signed\n                v = v + chainid * 2 + 35; // according to EIP155, https://eips.ethereum.org/EIPS/eip-155\n            }\n\n            let to;\n            let value;\n            let data;\n            let mode = sub_matches.get_one::<String>(\"mode\").unwrap();\n            match mode.as_str() {\n                \"main\" => {\n                    to = H160::from_str(sub_matches.get_one::<String>(\"to\").unwrap()).unwrap(); // to is to\n                    value = U256::from(*sub_matches.get_one::<u64>(\"value\").unwrap()); // value is value\n                    data = Vec::<u8>::new(); // data is empty\n                }\n                \"erc20\" => {\n                    to = H160::from_str(sub_matches.get_one::<String>(\"token\").unwrap()).unwrap(); // to is token\n                    value = U256::from(0); // value is 0\n                    let recepient = sub_matches.get_one::<String>(\"to\").unwrap();\n                    let recepient = EthereumAddress::from_str(recepient).unwrap();\n                    let amount = U256::from(*sub_matches.get_one::<u64>(\"value\").unwrap());\n                    data = erc20_transfer(&recepient, amount); // data is encoded transfer(recepient, amount)\n                }\n                \"any\" => {\n                    to = H160::from_str(sub_matches.get_one::<String>(\"to\").unwrap()).unwrap(); // as is\n                    value = U256::from(*sub_matches.get_one::<u64>(\"value\").unwrap()); // as is\n                    data = hex::decode(sub_matches.get_one::<String>(\"data\").unwrap()).unwrap();\n                    // as is\n                }\n                _ => {\n                    println!(\"Invalid mode\");\n                    return;\n                }\n            }\n\n            let tx = EIP155Transaction {\n                nonce,\n                gas_price,\n                gas_limit,\n                to,\n                value,\n                data,\n                v,\n                r,\n                s,\n            };\n            println!(\"tx = {}\", tx);\n        }\n        _ => {}\n    };\n}\n\nfn address_from_public_key(public_key: libsecp256k1::PublicKey) -> EthereumAddress {\n    let public_key = EthereumPublicKey::from_secp256k1_public_key(public_key);\n    public_key.to_address(&EthereumFormat::Standard).unwrap()\n}\n\nfn network_to_chainid(network: &str) -> u64 {\n    // to lower\n    let network = network.to_lowercase();\n    match network.as_str() {\n        \"eth\" => 1,\n        \"ethereum\" => 1,\n        \"etc\" => 61,\n        \"ethereum_classic\" => 61,\n        \"goerli\" => 5,\n        \"sepolia\" => 11155111,\n        _ => panic!(\"Invalid network\"),\n    }\n}\n\nfn towei(value: &str) -> Option<U256> {\n    let value = value.to_lowercase();\n    // println!(\"{}\", value);\n    if value.ends_with(\"ether\") {\n        let value = value.trim_end_matches(\"ether\");\n        let value = value.parse::<f64>().unwrap();\n        let value = value * 1e18;\n        Some(U256::from(value as u128))\n    } else if value.ends_with(\"gwei\") {\n        let value = value.trim_end_matches(\"gwei\");\n        let value = value.parse::<f64>().unwrap();\n        let value = value * 1e9;\n        Some(U256::from(value as u128))\n    } else if value.ends_with(\"wei\") {\n        let value = value.trim_end_matches(\"wei\");\n        let value = value.parse::<f64>().unwrap();\n        Some(U256::from(value as u128))\n    } else {\n        None\n    }\n}\n"
  },
  {
    "path": "examples/anychain-neo-cli/Cargo.toml",
    "content": "[package]\nname = \"anychain-neo-cli\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nanychain-core = { path = \"../../crates/anychain-core\" }\nanychain-neo = { path = \"../../crates/anychain-neo\" }\nclap = { workspace = true }\n"
  },
  {
    "path": "examples/anychain-neo-cli/README.md",
    "content": "# anychain-neo-cli\n\nA command line program for the generation and/or validation of addresses and transactions of utxo compatible blockchains\n\n### Build\n\ncd anychain/anychain-neo-cli\n\ncargo build --release\n\n\n\n### Run\n```\ncd ../target/release\n```\n\n#### Address Generation\n\n* we can generate addresses by providing a corresponding private key:\n```\n./anychain-neo-cli address-gen --priv [private_key]\n```\n\ne.g.\n```\n./anychain-neo-cli address-gen --priv cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\n```\n\n(the private key being a 64-byte hex string)\n\n* we can also generate addresses by providing a corresponding public key:\n\n```\n./anychain-neo-cli address-gen --pub [public_key]\n```\n\ne.g.\n```\n./anychain-neo-cli address-gen --pub 02d215a89dc4aab5191d9480535aba2db9994c3c8fa068102fdb71fba676179e39\n```\n\n(the public key being a 66-byte hex string)\n\n\n#### Address Validation\n\n* we can check if a provided address is a valid one for a specified blockchain network:\n\n```\n./anychain-neo-cli address-validate [address]\n```\n\ne.g.\n```\n./anychain-neo-cli address-validate NVEqR4e73afGKpVBzBXLEnY5F5uZSmSKZZ\n```\n\n#### Transaction Generation\n\n* we can generate a transaction for a specified blockchain network by providing several inputs and several outputs:\n\n```\n./anychain-neo-cli tx-gen -i [input] [input] ...  -o [output] [output] ...\n```\n\n##### Generate a Transfer Transaction\ne.g.\n```\n./anychain-neo-cli tx-gen -i \"{\\\"txid\\\": \\\"9975deeace71258149e8b0d02ed83d59335a658dd348d8cae7bf4ff9ed9db2d0\\\", \\\"index\\\": 0, \\\"private_key\\\": \\\"cd483a289c081698fc5a5a47291550962f1de7c98a7d5fcd77be765335e4f564\\\"}\" -o \"{\\\"to\\\": \\\"15dcrsqEnb7uAsqByxbrUbigpHjPTarbqg\\\", \\\"amount\\\": 3300000}\"\n```\n\n"
  },
  {
    "path": "examples/anychain-neo-cli/src/main.rs",
    "content": "use clap::{Arg, Command};\n\nfn main() {\n    let matches = Command::new(\"anychain-neo-cli\")\n        .subcommands(vec![\n            Command::new(\"address-gen\")\n                .about(\"Generate an address of a utxo-typed blockchain\")\n                .arg(\n                    Arg::new(\"private_key\")\n                        .long(\"priv\")\n                        .num_args(1..)\n                        .help(\"Generate an address from a private key in hex format\"),\n                )\n                .arg(\n                    Arg::new(\"public_key\")\n                        .long(\"pub\")\n                        .num_args(1..)\n                        .help(\"Generate an address from a compressed public key in hex format\"),\n                ),\n            Command::new(\"address-validate\")\n                .about(\"Check if an address of a utxo-typed blockchain is valid\")\n                .arg(\n                    Arg::new(\"address\")\n                        .num_args(1..)\n                        .help(\"Specify the address to be validated\"),\n                ),\n            Command::new(\"tx-gen\")\n                .about(\"Generate a transaction of a utxo-typed blockchain\")\n                .arg(\n                    Arg::new(\"inputs\")\n                        .num_args(1..)\n                        .long(\"input\")\n                        .short('i')\n                        .help(\"Specify the input of the transaction to be generated\"),\n                )\n                .arg(\n                    Arg::new(\"outputs\")\n                        .num_args(1..)\n                        .long(\"output\")\n                        .short('o')\n                        .help(\"Specify the output of the transaction to be generated\"),\n                ),\n        ])\n        .get_matches();\n\n    match matches.subcommand() {\n        Some((\"address-gen\", sub_matches)) => {\n            let _private_key = sub_matches.get_one::<String>(\"private_key\");\n            let _public_key = sub_matches.get_one::<String>(\"public_key\");\n        }\n        Some((\"address-validate\", sub_matches)) => {\n            let _address = sub_matches.get_one::<String>(\"address\");\n\n            if _address.is_none() {\n                println!(\"Address not provided\");\n            }\n        }\n        Some((\"tx-gen\", sub_matches)) => {\n            let inputs = sub_matches.get_many::<String>(\"inputs\");\n            let outputs = sub_matches.get_many::<String>(\"outputs\");\n\n            if inputs.is_none() {\n                println!(\"No input is provided\");\n                return;\n            }\n\n            if outputs.is_none() {\n                println!(\"No output is provided\");\n                return;\n            }\n\n            let _inputs: Vec<&String> = inputs.unwrap().collect();\n            let _outputs: Vec<&String> = outputs.unwrap().collect();\n        }\n        _ => {}\n    };\n}\n"
  },
  {
    "path": "lib.rs",
    "content": "pub extern crate anychain_bitcoin as bitcoin;\npub extern crate anychain_bitcoin_cli as bitcoin_cli;\npub extern crate anychain_core as core;\npub extern crate anychain_ethereum as ethereum;\npub extern crate anychain_ethereum_cli as ethereum_cli;\npub extern crate anychain_filecoin as filecoin;\npub extern crate anychain_polkadot as polkadot;\npub extern crate anychain_tron as tron;\npub extern crate anychain_ripple as ripple;\npub extern crate anychain_neo as neo;\n"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"1.95.0\"\ncomponents = [\"clippy\", \"rustfmt\"]\ntargets = []\nprofile = \"minimal\"\n"
  }
]