diff --git a/.gitignore b/.gitignore index b8ac55387..54cd6eb07 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,6 @@ # will have compiled files and executables target/ -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - # Vim temporary files *.swp diff --git a/CHANGELOG.md b/CHANGELOG.md index 662290514..16b2cedd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project will be documented in this file. +## [1.35.0] – 2022-06-28 + +### New + +- `chksig_always_succeed` execution option used in params of the `tvm.run_get`, `tvm.run_tvm` + and `tvm.run_executor`. +- `abi.calc_function_id` function +- `tokio` library is updated to 1.* version + ## [1.34.3] – 2022-06-08 ### New @@ -21,6 +30,7 @@ All notable changes to this project will be documented in this file. ## [1.34.1] – 2022-05-26 ### New + - supported removing Copy interface from UInt256 - supported changed interface of `ton_types::Cell` @@ -29,71 +39,99 @@ All notable changes to this project will be documented in this file. ### New - `client.config` function that returns the current client config -- `run_executor().fees` is extended with these fields: - - - `ext_in_msg_fee` - fee for processing external inbound message - - `total_fwd_fees` - total fees of action phase - - `account_fees` - total fees the account pays for the transaction +- `run_executor().fees` is extended with these fields: + + - `ext_in_msg_fee` - fee for processing external inbound message + - `total_fwd_fees` - total fees of action phase + - `account_fees` - total fees the account pays for the transaction -- `main` and `dev` endpoints aliases for Evernode Cloud Mainnet and Devnet endpoints +- `main` and `dev` endpoints aliases for Evernode Cloud Mainnet and Devnet endpoints ### Improved - Added documentation for `TransactionFees` type (`run_executor().fees`). -- Documentation now includes `enum` types descriptions. - To achieve it we updated binding-gen: enum of types now produces its own type for each enum variant. +- Documentation now includes `enum` types descriptions. + To achieve it we updated binding-gen: enum of types now produces its own type for each enum + variant. ## [1.33.1] – 2022-05-10 ### Fixed - Websocket errors weren't treated as a network errors. - This is why all the processing functions that worked via wss protocol failed on these errors without retries. Now retries are performed. -- SDK tried to rebalance even if only a single endpoint was specified. Now in case of a single endpoint, no rebalancing occurs. + This is why all the processing functions that worked via wss protocol failed on these errors + without retries. Now retries are performed. +- SDK tried to rebalance even if only a single endpoint was specified. Now in case of a single + endpoint, no rebalancing occurs. ## [1.33.0] – 2022-05-02 -### New +### New -- `allow_partial` flag in all `abi.decode_*` functions. This flag controls decoder behaviour whether return error or not in case of incomplete BOC decoding -- `REMP` supported. `ProcessingEvent` enum is extended with `REMP` statuses (enum of events posted into `processing.wait_for_transaction` function callback ) +- `allow_partial` flag in all `abi.decode_*` functions. This flag controls decoder behaviour whether + return error or not in case of incomplete BOC decoding +- `REMP` supported. `ProcessingEvent` enum is extended with `REMP` statuses (enum of events posted + into `processing.wait_for_transaction` function callback ) - UNSTABLE. `first_remp_status_timeout` and `next_remp_status_timeout` parameters in network config ## [1.32.0] – 2022-03-22 -### New +### New -- `network.queries_protocol` config parameter allows selecting protocol the SDK uses to communicaite with GraphQL endpoint: - - `HTTP` – SDK performs single HTTP-request for each request. - - `WS` – SDK uses single WebSocket connection to send all requests. This protocol is a preferable - way when the application sends many GraphQL requests in parallel. +- `network.queries_protocol` config parameter allows selecting protocol the SDK uses to communicaite + with GraphQL endpoint: + - `HTTP` – SDK performs single HTTP-request for each request. + - `WS` – SDK uses single WebSocket connection to send all requests. This protocol is a + preferable + way when the application sends many GraphQL requests in parallel. ### Fixed + - **Debot module**: - - If DEngine received a non-zero exit_code while emulating a transaction while sending a message, DEngine will call onErrorId callback of the message. - + - If DEngine received a non-zero exit_code while emulating a transaction while sending a + message, DEngine will call onErrorId callback of the message. + ## [1.31.0] – 2022-03-09 -### New +### New **crypto module:** -- `Cryptobox` introduced: root crypto object that stores encrypted secret and acts as a factory for all crypto primitives used in SDK. + +- `Cryptobox` introduced: root crypto object that stores encrypted secret and acts as a factory for + all crypto primitives used in SDK. Crypto box provides signing and encryption boxes. Functions: - [`create_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#create_crypto_box) - initializes cryptobox with secret - [`remove_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#remove_crypto_box) - removes cryptobox and overwrites all secrets with zeroes - [`get_crypto_box_seed_phrase`](./docs/reference/types-and-methods/mod_crypto.md#get_crypto_box_seed_phrase) - returns decrypted seed phrase - [`get_crypto_box_info`](./docs/reference/types-and-methods/mod_crypto.md#get_crypto_box_info) - returns encrypted cryptobox secret for next cryptobox initializations - [`get_signing_box_from_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#get_signing_box_from_crypto_box) - derives signing box from secret - [`get_encryption_box_from_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#get_encryption_box_from_crypto_box) - derives encryption box from secret - [`clear_crypto_box_secret_cache`](./docs/reference/types-and-methods/mod_crypto.md#clear_crypto_box_secret_cache) - forces secret cache (signing and encryption) clean up (overwrites all secrets with zeroes). - -- Support of `initCodeHash` in tvm: `X-Evernode-Expected-Account-Boc-Version`=2 http header added to graphql requests. value=2 means that SDK requests the latest account boc version with initCodeHash support from API. This was done because new boc version is not compatible with old transaction executor, i.e. with previous SDK versions. New transaction executor is compatible with new and old boc formats. New SDK asks for new boc format if it exists,if it does not - old boc version is returned. Previous version of SDK will fetch only old version without initCodeHash support. - -**Attention! Migrate your applications to the new SDK version ASAP because in some period of time we will stop supporting old boc version in API and default value of X-Evernode-Expected-Account-Boc-Version on backend side will become 2, missing value will cause an error. Now default value on API side is Null which means that API returns the old version. This is done to avoid breaking changes in existing applications and give time to migrate to the new SDK**. + [`create_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#create_crypto_box) - + initializes cryptobox with secret + [`remove_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#remove_crypto_box) - + removes cryptobox and overwrites all secrets with zeroes + [`get_crypto_box_seed_phrase`](./docs/reference/types-and-methods/mod_crypto.md#get_crypto_box_seed_phrase) + - returns decrypted seed phrase + [`get_crypto_box_info`](./docs/reference/types-and-methods/mod_crypto.md#get_crypto_box_info) - + returns encrypted cryptobox secret for next cryptobox initializations + [`get_signing_box_from_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#get_signing_box_from_crypto_box) + - derives signing box from secret + [`get_encryption_box_from_crypto_box`](./docs/reference/types-and-methods/mod_crypto.md#get_encryption_box_from_crypto_box) + - derives encryption box from secret + [`clear_crypto_box_secret_cache`](./docs/reference/types-and-methods/mod_crypto.md#clear_crypto_box_secret_cache) + - forces secret cache (signing and encryption) clean up (overwrites all secrets with zeroes). + +- Support of `initCodeHash` in tvm: `X-Evernode-Expected-Account-Boc-Version`=2 http header added to + graphql requests. value=2 means that SDK requests the latest account boc version with initCodeHash + support from API. This was done because new boc version is not compatible with old transaction + executor, i.e. with previous SDK versions. New transaction executor is compatible with new and old + boc formats. New SDK asks for new boc format if it exists,if it does not - old boc version is + returned. Previous version of SDK will fetch only old version without initCodeHash support. + +**Attention! Migrate your applications to the new SDK version ASAP because in some period of time we +will stop supporting old boc version in API and default value of +X-Evernode-Expected-Account-Boc-Version on backend side will become 2, missing value will cause an +error. Now default value on API side is Null which means that API returns the old version. This is +done to avoid breaking changes in existing applications and give time to migrate to the new SDK**. ### Fixed + - Documentation generator for app object interface fills documentation from `ParamsOfXXXAppObject` enum. - Documentation generator for function with `obj` parameter add this parameter @@ -102,6 +140,7 @@ All notable changes to this project will be documented in this file. ## [1.30.0] – 2022-02-04 ### New + - Added `boc.encode_external_in_message` function to encode message BOC based on a low level message parts such as a body, state init etc. - Added `net.subscribe` function to start a low level GraphQL subscription. @@ -110,6 +149,7 @@ All notable changes to this project will be documented in this file. ## [1.29.0] – 2022-02-03 ### New + - Added `abi.encode_boc` function to encode parameters with values to BOC, using ABI types. - Added support of `address` type in `boc.encode_boc`. - All fetch requests are now called with timeouts to prevent freezing in case of infinite answer. @@ -118,74 +158,99 @@ All notable changes to this project will be documented in this file. ## [1.28.1] – 2022-01-25 ### Fixed + - Support breaking changes in `ton-labs-block-json` v0.7.1 - Updated endpoints for `main.ton.dev` alias. ## [1.28.0] – 2021-12-24 ### New -- DevNet endpoints now changed to EVER OS domain: eri01.net.everos.dev, rbx01.net.everos.dev, gra01.net.everos.dev + +- DevNet endpoints now changed to EVER OS domain: eri01.net.everos.dev, rbx01.net.everos.dev, + gra01.net.everos.dev - **Debot module**: - Аdded float numbers support for Json interface - Added guide for custom giver usage. ### Fixed -- Debot module: fixed a bug in Query.query function called with an empty `variables` field. +- Debot module: fixed a bug in Query.query function called with an empty `variables` field. ## [1.27.1] – 2021-12-09 ### Fixed + - Empty `function_name` field in the "create run message failed" error. ## [1.27.0] – 2021-12-06 ### New -- Function [`abi.encode_initial_data`](./docs/reference/types-and-methods/mod_abi.md#encode_initial_data) which - encodes initial account data with initial values for the contract's static variables and owner's public key. - This function is analogue of `tvm.buildDataInit` function in Solidity. + +- +Function [`abi.encode_initial_data`](./docs/reference/types-and-methods/mod_abi.md#encode_initial_data) +which +encodes initial account data with initial values for the contract's static variables and owner's +public key. +This function is analogue of `tvm.buildDataInit` function in Solidity. ### Fixed + - Subscription for Counterparties failed with 'Unknown type "CounterpartieFilter"' error. ## [1.26.1] – 2021-12-01 ### Fixed + - Fixed building and warning. ## [1.26.0] – 2021-11-25 ### New + - **Debot module**: - Аdded `allow_no_signature` parameter to `decode_and_fix_ext_msg()` and `onerror_id` return value to `prepare_ext_in_message()` inner functions used in TS4. - Added support for async external calls. - - `Query` interface extended with `waitForCollection` and `query` methods. `waitForCollection` allows to wait - for completion of async external calls. + - `Query` interface extended with `waitForCollection` and `query` methods. `waitForCollection` + allows to wait + for completion of async external calls. - Added support for DeBots with ABI 2.2. -- Function [`proofs.proof_message_data`](./docs/reference/types-and-methods/mod_proofs.md#proof_message_data) which proves message data, retrieved - from Graphql API. +- +Function [`proofs.proof_message_data`](./docs/reference/types-and-methods/mod_proofs.md#proof_message_data) +which proves message data, retrieved +from Graphql API. ## [1.25.0] – 2021-11-08 ### New + - New module [`proofs`](./docs/mod_proofs.md) is introduced! -- Functions [`proofs.proof_block_data`](./docs/mod_proofs.md#proof_block_data) and [`proofs.proof_transaction_data`](./docs/mod_proofs.md#proof_transaction_data) +- Functions [`proofs.proof_block_data`](./docs/mod_proofs.md#proof_block_data) + and [`proofs.proof_transaction_data`](./docs/mod_proofs.md#proof_transaction_data) which prove block data, retrieved from Graphql API. - These are the first functions from proofs series :) Wait for others(`proof_account_data`, `proof_message_data`) in the next releases. + These are the first functions from proofs series :) Wait for others(`proof_account_data` + , `proof_message_data`) in the next releases. Read about them more in the [documentation](./docs/mod_proofs.md#proof_block_data). -- [`abi.decode_boc`](./docs/mod_abi.md#decode_boc) function to decode custom BOC data into JSON parameters. +- [`abi.decode_boc`](./docs/mod_abi.md#decode_boc) function to decode custom BOC data into JSON + parameters. - `Ref()` type was added to ABI. - Solidity functions use ABI types for builder encoding. The simplest way to decode such a BOC is to use ABI decoding. ABI has it own rules for fields layout in cells so manually encoded BOC can not be described in terms of ABI rules. To solve this problem we introduce a new ABI type `Ref()` which allows to store `ParamType` ABI parameter in cell reference and, thus, decode manually encoded BOCs. This type is available only in `decode_boc` function and will not be available in ABI messages encoding until it is included into some ABI revision. + Solidity functions use ABI types for builder encoding. The simplest way to decode such a BOC is to + use ABI decoding. ABI has it own rules for fields layout in cells so manually encoded BOC can not + be described in terms of ABI rules. To solve this problem we introduce a new ABI + type `Ref()` which allows to store `ParamType` ABI parameter in cell reference and, + thus, decode manually encoded BOCs. This type is available only in `decode_boc` function and will + not be available in ABI messages encoding until it is included into some ABI revision. ## [1.24.0] – 2021-10-18 ### New + - `boc.get_boc_depth` function to get depth of the provided boc. -- `boc.decode_tvc` function returns additional fields `code_hash`, `code_depth`, `data_hash`, `data_depth` and `compiler_version` +- `boc.decode_tvc` function returns additional fields `code_hash`, `code_depth`, `data_hash` + , `data_depth` and `compiler_version` - **Debot module**: - added `parse` function to Json interface. @@ -193,18 +258,25 @@ All notable changes to this project will be documented in this file. ## [1.23.0] – 2021-10-05 ### New + - `boc.get_code_salt` and `boc.set_code_salt` functions for contract code salt management. - `boc.encode_tvc` and `boc.decode_tvc` functions for TVC image encoding and decoding - `boc.get_compiler_version` function extracting compiler version from contract code -- `abi.update_initial_data` and `abi.decode_initial_data` function for pre-deployment contract data management +- `abi.update_initial_data` and `abi.decode_initial_data` function for pre-deployment contract data + management ## [1.22.0] – 2021-09-20 ### New -- ABI v2.2 with fixed message body layout supported. [See the specification](https://github.com/tonlabs/ton-labs-abi/blob/master/docs/ABI_2.2_spec.md). - Now, for contracts with ABI version < 2.2 compact layout will still be used for compatibility, for contracts with ABI version 2.2 and more - fixed layout will be used. -**Please, make sure that you updated the ABI if you recompiled your contract with 2.2 ABI, or you may get an inconsistent contract behaviour**. +- ABI v2.2 with fixed message body layout + supported. [See the specification](https://github.com/tonlabs/ton-labs-abi/blob/master/docs/ABI_2.2_spec.md) + . + + Now, for contracts with ABI version < 2.2 compact layout will still be used for compatibility, for + contracts with ABI version 2.2 and more - fixed layout will be used. + **Please, make sure that you updated the ABI if you recompiled your contract with 2.2 ABI, or you + may get an inconsistent contract behaviour**. - **Debot module**: - added `getEncryptionBoxInfo`, `getSigningBoxInfo` functions to Sdk interface. - implemented Query DeBot interface in DEngine. @@ -212,82 +284,107 @@ All notable changes to this project will be documented in this file. ## [1.21.5] – 2021-09-13 ### Fixed + - `abi.encode_message` and `processing.process_message` created invalid deploy message in case of -`Signer::None` was used, and contract could not be deployed. + `Signer::None` was used, and contract could not be deployed. ## [1.21.4] – 2021-09-08 ### New + - Support MacOS aarch64 target ## [1.21.3] – 2021-09-02 ### New + - Information about used endpoint is added to subscription errors. - Graphql response error codes 500-599 are treated as retriable network errors ## [1.21.2] – 2021-08-25 ### Fixed + - Updated crypto libraries in order to fix building. ## [1.21.1] – 2021-08-24 ### Fixed -- http errors were not processed as network errors and didn't lead to endpoint reconnect and request retry + +- http errors were not processed as network errors and didn't lead to endpoint reconnect and request + retry ## [1.21.0] – 2021-08-18 ### New + - `crypto.create_encryption_box` function for creating SDK-defined encryption boxes. First supported -algorithm - AES with CBC mode. + algorithm - AES with CBC mode. - **Debot module**: - Аdded public `prepare_ext_in_message` function. ### Fixed -- `tvm.run_executor` did not work when SDK is configured to use TONOS SE, because of incomplete default -blockchain configuration. Now mainnet config from key block 10660619 (last key block at the moment of fix) -is used as default. + +- `tvm.run_executor` did not work when SDK is configured to use TONOS SE, because of incomplete + default + blockchain configuration. Now mainnet config from key block 10660619 (last key block at the moment + of fix) + is used as default. ## [1.20.1] – 2021-07-30 ### New -- Added support of contract error messages. Error messages (for example, require(...) in Solidity) are now parsed by SDK + +- Added support of contract error messages. Error messages (for example, require(...) in Solidity) + are now parsed by SDK and returned in error message. New field `contract_error` was added to error's `data`. ### Fixed + - Fixed problem with WASM binaries (https://github.com/tonlabs/ton-labs-types/pull/42) ## [1.20.0] – 2021-07-16 ### New + - ABI version `2.1` supported. **Attention!** - If you work with contracts, that contain String parameters, then during migration from ABI 2.0 to 2.1 you will need to remove all String type conversions to bytes and back and pass string to your contract as is. + If you work with contracts, that contain String parameters, then during migration from ABI 2.0 to + 2.1 you will need to remove all String type conversions to bytes and back and pass string to your + contract as is. - Now all requests to GraphQL are limited with timeout to react on unexpected server unavailability. -Existing timeouts in waiting functions keep the same behaviour. All other requests timeout now can -be set with `net.query_timeout` config parameter. Its default value is 60000 ms + Existing timeouts in waiting functions keep the same behaviour. All other requests timeout now can + be set with `net.query_timeout` config parameter. Its default value is 60000 ms - **Debot module**: - added `encrypt`, `decrypt` functions to Sdk interface which accept encryption box handles. ### Fixed + - Deployment with empty signer in cases of public key set in TVC or deploy set. ## [1.19.0] – 2021-07-07 ### New -- `get_address_type` function in `utils` module, which validates address and returns its type. See the documentation. -- `decode_account_data` function in `abi` module that converts account data BOC into JSON representation according to ABI 2.1. See the documentation. + +- `get_address_type` function in `utils` module, which validates address and returns its type. See + the documentation. +- `decode_account_data` function in `abi` module that converts account data BOC into JSON + representation according to ABI 2.1. See the documentation. - Diagnostic fields `filter` and `timestamp` added to `wait_for_collection` error -- `main.ton.dev` and `net.ton.dev` endpoints that will be deprecated on 12.07.21 are now replaced with [proper endpoints list](https://docs.ton.dev/86757ecb2/p/85c869-networks), if they were specified in network `endpoints` config +- `main.ton.dev` and `net.ton.dev` endpoints that will be deprecated on 12.07.21 are now replaced + with [proper endpoints list](https://docs.ton.dev/86757ecb2/p/85c869-networks), if they were + specified in network `endpoints` config ### Fixed -- Search of the first master blocks during the network start period was fixed in blocks and transactions iterators + +- Search of the first master blocks during the network start period was fixed in blocks and + transactions iterators ## [1.18.0] – 2021-06-26 ### New + - Iterators in `net` module: robust way to iterate blockchain items (blocks, transactions) in specified range. See documentation for `create_block_iterator` , `create_transaction_iterator`, `resume_block_iterator`, `resume_transaction_iterator`, `iterator_next`, `iterator_remove` @@ -300,21 +397,27 @@ be set with `net.query_timeout` config parameter. Its default value is 60000 ms ## [1.17.0] – 2021-06-21 ### New -- Added support of external encryption boxes. [See the documentation](docs/mod_crypto.md#register_encryption_box) + +- Added support of external encryption + boxes. [See the documentation](docs/mod_crypto.md#register_encryption_box) - **Debot module**: - Dengine waits for completion of all transactions in a chain initiated by debot's onchain call. ## [1.16.1] – 2021-06-16 ### New + - `timeout` option to `query_transaction_tree` – timeout used to limit waiting time for the next message and transaction in the transaction tree. ### Improved -- Improved error messages regarding ABI and JSON interface. SDK now shows additional tips for the user in cases of + +- Improved error messages regarding ABI and JSON interface. SDK now shows additional tips for the + user in cases of errors. ### Fixed + - Warnings in Rust 1.52+. Little fixes in the documentation. - `total_output` field in fees was always 0. - `query_transaction_tree` didn't wait for messages. @@ -322,16 +425,20 @@ be set with `net.query_timeout` config parameter. Its default value is 60000 ms ## [1.16.0] – 2021-05-25 ### New + - `query_transaction_tree` function that returns messages and transactions tree produced - by the specified message was added to `net` module. [See the documentation](docs/mod_net.md#query_transaction_tree) + by the specified message was added to `net` + module. [See the documentation](docs/mod_net.md#query_transaction_tree) ### Fixed + - `AbiData.key` type changed to u32. - attempt to use `orderBy` instead of `order` in `query_collection` will raise error. ## [1.15.0] – 2021-05-18 ### New + - Sync latency detection increases connection reliability. Library will change the current endpoint when it detects data sync latency on it. @@ -346,16 +453,19 @@ be set with `net.query_timeout` config parameter. Its default value is 60000 ms ## [1.14.1] – 2021-04-29 ### Fixed + - Fixed building under Rust versions older than 1.51. ## [1.14.0] – 2021-04-28 ### New + - **Debot module**: - implementation of Network DeBot interface in DEngine. - implementation of `signHash` function in Sdk interface. ### Fixed + - **Debot module**: - fixed bug in Json interface with supporting nested structures and arrays of structures. - fixed bug in Json interface with keys containing hyphens. @@ -363,279 +473,380 @@ be set with `net.query_timeout` config parameter. Its default value is 60000 ms ## [1.13.0] – 2021-04-23 ### New -- [`net.query_counterparties`](docs/mod_net.md#query_counterparties) - allows to query and paginate through the list of accounts that the specified account - has interacted with, sorted by the time of the last internal message between accounts. + +- [`net.query_counterparties`](docs/mod_net.md#query_counterparties) - allows to query and paginate + through the list of accounts that the specified account + has interacted with, sorted by the time of the last internal message between accounts. Subscription to counterparties collection is available via `net.subscribe_collection` function. -- Blockchain interaction reliability improvement (broadcast): library sends external inbound messages simultaneously +- Blockchain interaction reliability improvement (broadcast): library sends external inbound + messages simultaneously to the N randomly chosen endpoints. If all N endpoints failed to responce then library repeats sending to another random N endpoints (except the failed one). If all the available endpoints fail to respond then library throws error. The N parameter is taken from `config.network.sending_endpoint_count` (default is 2). - Blockchain interaction reliability improvement (bad delivery list): library tracks endpoints - with bad message delivery (expired messages). These endpoints have lower priority when library chooses endpoints + with bad message delivery (expired messages). These endpoints have lower priority when library + chooses endpoints to send message. - **Debot module**: - Implementation of `Json` DeBot interface in DEngine. ### Fixed + - `BuilderOp::Integer.size` type has changed from `u8` to `u32`. - **Debot Module**: - - `Sdk` interface function `getAccountsDataByHash` didn't find accounts by `code_hash` with leading zero. + - `Sdk` interface function `getAccountsDataByHash` didn't find accounts by `code_hash` with + leading zero. ## [1.12.0] – 2021-04-01 ### New -- [`utils.compress_zstd`](docs/mod_utils.md#compress_zstd) compresses data using Facebook's Zstandard algorithm. -- [`utils.decompress_zstd`](docs/mod_utils.md#decompress_zstd) decompresses data using Facebook's Zstandard algorithm. + +- [`utils.compress_zstd`](docs/mod_utils.md#compress_zstd) compresses data using Facebook's + Zstandard algorithm. +- [`utils.decompress_zstd`](docs/mod_utils.md#decompress_zstd) decompresses data using Facebook's + Zstandard algorithm. - **Debot module**: - `init` function that creates an instance of DeBot and returns DeBot metadata. - - Dengine fetches metadata form DeBot by calling 2 mandatory functions: `getRequiredInterfaces` and `getDebotInfo`. This data is returned by `fetch` and `init` functions. - - `approve` DeBot Browser callback which is called by DEngine to request permission for DeBot activities. + - Dengine fetches metadata form DeBot by calling 2 mandatory functions: `getRequiredInterfaces` + and `getDebotInfo`. This data is returned by `fetch` and `init` functions. + - `approve` DeBot Browser callback which is called by DEngine to request permission for DeBot + activities. ### Changed + - **Debot Module**: - - [breaking] `fetch` function does't create an instance of debot. It returns DeBot metadata (`DebotInfo`). - - [breaking] `start` function does't create an instance of debot. It accepts DeBot handle created in `init` function. + - [breaking] `fetch` function does't create an instance of debot. It returns DeBot + metadata (`DebotInfo`). + - [breaking] `start` function does't create an instance of debot. It accepts DeBot handle + created in `init` function. ## [1.11.2] – 2021-03-19 ### Refactor + - Some internal refactor due to `ton-block` changes ## [1.11.1] – 2021-03-15 ### New -- Giver address in tests is calculated from secret key. Default values are provided for TON OS SE giver + +- Giver address in tests is calculated from secret key. Default values are provided for TON OS SE + giver ## [1.11.0] – 2021-03-05 ### New -- [`utils.calc_storage_fee`](docs/mod_utils.md#calc_storage_fee) function to calculate account storage fee over a some time period. + +- [`utils.calc_storage_fee`](docs/mod_utils.md#calc_storage_fee) function to calculate account + storage fee over a some time period. - **Debot Module**: - Added unstable functions to `Sdk` interface: `getAccountsDataByHash` ## [1.10.0] – 2021-03-04 ### New -- Add optional field `src_address` to [`ParamsOfEncodeInternalMessage`](docs/mod_abi.md#encode_internal_message). -- Field `abi` in [`ParamsOfEncodeInternalMessage`](docs/mod_abi.md#encode_internal_message) is optional and can be `None` if `call_set` and `deploy_set` are `None`. -- [`boc.encode_boc`](docs/mod_boc.md#encode_boc) function provides ability to build and serialize any custom tree of cells. + +- Add optional field `src_address` + to [`ParamsOfEncodeInternalMessage`](docs/mod_abi.md#encode_internal_message). +- Field `abi` in [`ParamsOfEncodeInternalMessage`](docs/mod_abi.md#encode_internal_message) is + optional and can be `None` if `call_set` and `deploy_set` are `None`. +- [`boc.encode_boc`](docs/mod_boc.md#encode_boc) function provides ability to build and serialize + any custom tree of cells. Application can use several base Builder serialization primitives like integers, bitstrings and nested cells. -- [`boc.get_blockchain_config`](docs/mod_boc.md#get_blockchain_config) function can extract blockchain configuration from key block and also -from zerostate. -- [`tvm` module](docs/mod_tvm.md) functions download current blockchain configuration if `net` is initialized with -DApp Server endpoints. Otherwise [default configuration](https://github.com/tonlabs/ton-executor/blob/11f46c416ebf1f145eacfb996587891a0a3cb940/src/blockchain_config.rs#L214) is used. +- [`boc.get_blockchain_config`](docs/mod_boc.md#get_blockchain_config) function can extract + blockchain configuration from key block and also + from zerostate. +- [`tvm` module](docs/mod_tvm.md) functions download current blockchain configuration if `net` is + initialized with + DApp Server endpoints. + Otherwise [default configuration](https://github.com/tonlabs/ton-executor/blob/11f46c416ebf1f145eacfb996587891a0a3cb940/src/blockchain_config.rs#L214) + is used. - **Debot Module**: - - Support for debot invoking in Debot Engine. `send` browser callback is used not only for interface calls but to invoke debots. + - Support for debot invoking in Debot Engine. `send` browser callback is used not only for + interface calls but to invoke debots. - `start` and `fetch` functions returns debot ABI. - Added new built-in interface `Hex` which implements hexadecimal encoding and decoding. - - Added unstable functions to `Sdk` interface: naclBox, naclBoxOpen, naclKeypairFromSecret, getAccountCodeHash. + - Added unstable functions to `Sdk` interface: naclBox, naclBoxOpen, naclKeypairFromSecret, + getAccountCodeHash. ### Changed -- Both `call_set` and `deploy_set` in [`ParamsOfEncodeInternalMessage`](docs/mod_abi.md#encode_internal_message) can be omitted. In this case `encode_internal_message` generates internal message with empty body. + +- Both `call_set` and `deploy_set` + in [`ParamsOfEncodeInternalMessage`](docs/mod_abi.md#encode_internal_message) can be omitted. In + this case `encode_internal_message` generates internal message with empty body. - **Debot Module**: - - `send` function accepts one argument - serialized internal message as string encoded into base64. + - `send` function accepts one argument - serialized internal message as string encoded into + base64. + ### Documentation -- [Debot browser app object](docs/mod_debot.md#AppDebotBrowser) and [signing box app object](docs/mod_crypto.md#appsigningbox) descriptions added -- functions-helpers for enum type variable creation for [Signer](docs/mod_abi.md#signer), [Abi](docs/mod_abi.md#abi), [ParamsOfAppDebotBrowser](mod_debot.md#paramsofappdebotbrowser) + +- [Debot browser app object](docs/mod_debot.md#AppDebotBrowser) + and [signing box app object](docs/mod_crypto.md#appsigningbox) descriptions added +- functions-helpers for enum type variable creation for [Signer](docs/mod_abi.md#signer) + , [Abi](docs/mod_abi.md#abi), [ParamsOfAppDebotBrowser](mod_debot.md#paramsofappdebotbrowser) ### Fixed -- doc generator: app object interface description, constructor functions-helpers for enum type variable creation, added new line in the end if api.json + +- doc generator: app object interface description, constructor functions-helpers for enum type + variable creation, added new line in the end if api.json - library libsecp256k1 upgraded to fix https://rustsec.org/advisories/RUSTSEC-2019-0027 ## 1.9.0 Feb 19, 2021 ### New + - `tuple_list_as_array` parameter in `tvm.run_get` function which controls lists representation. -Default is stack-like based on nested tuples. If set to `true` then returned lists are encoded as plain arrays. Use this option if you receive this error on Web: "Runtime error. Unreachable code should not be executed..." -This reduces stack size requirements for long lists. -- `function_name` field of `CallSet` structure can be the name or **id (as string in hex starting with 0x)** of the called function. -- Fields `config_servers`, `query_url`, `account_address`, `gas_used` added into specific errors' `ClientError.data` object. + Default is stack-like based on nested tuples. If set to `true` then returned lists are encoded as + plain arrays. Use this option if you receive this error on Web: "Runtime error. Unreachable code + should not be executed..." + This reduces stack size requirements for long lists. +- `function_name` field of `CallSet` structure can be the name or **id (as string in hex starting + with 0x)** of the called function. +- Fields `config_servers`, `query_url`, `account_address`, `gas_used` added into specific + errors' `ClientError.data` object. ### Fixed + - Binaries download links are now under https protocol -- If you receive this error on Web: "Runtime error. Unreachable code should not be executed..." in `run_get`, use the new parameter `tuple_list_as_array = true`. [See the documentation](docs/mod_tvm.md#run_get). This may happen, for example, when elector contract contains too many participants +- If you receive this error on Web: "Runtime error. Unreachable code should not be executed..." + in `run_get`, use the new parameter `tuple_list_as_array = true` + . [See the documentation](docs/mod_tvm.md#run_get). This may happen, for example, when elector + contract contains too many participants ## 1.8.0 Feb 11, 2021 ### New + - **Debot Module**: - - Added new built-in interface `Msg` which allows to send external message to blockchain and sign it with supplied keypair. + - Added new built-in interface `Msg` which allows to send external message to blockchain and + sign it with supplied keypair. ### Fixed + - `crypto.hdkey_public_from_xprv` used compressed 33-byte form instead of normal 32-byte. ## 1.7.0 Feb 9, 2021 ### New + - BOC cache management functions were introduced: - - `boc.cache_set`, - - `boc.cache_get` - - `boc.cache_unpin` -- Now functions that take boc as a parameter can also take a reference to boc cash instead so that it deсreases the number of boc serialization -and deserializations which drastically improves performance of `run_tvm` and `run_executor` expecially in case of numerous calls on the same data. -- `boc_cache` parameter in `tvm.run_tvm` and `tvm.run_executor` functions to save resulting messages and account BOCs into cache. -- `return_updated_account` flag parameter introduced in `tvm.run_tvm` and `tvm.run_executor` functions to return updated account state. Important: by default this flag is `false` and account data is not returned. + - `boc.cache_set`, + - `boc.cache_get` + - `boc.cache_unpin` +- Now functions that take boc as a parameter can also take a reference to boc cash instead so that + it deсreases the number of boc serialization + and deserializations which drastically improves performance of `run_tvm` and `run_executor` + expecially in case of numerous calls on the same data. +- `boc_cache` parameter in `tvm.run_tvm` and `tvm.run_executor` functions to save resulting messages + and account BOCs into cache. +- `return_updated_account` flag parameter introduced in `tvm.run_tvm` and `tvm.run_executor` + functions to return updated account state. Important: by default this flag is `false` and account + data is not returned. - `abi.encode_internal_message` function to encode an internal ABI-compatible message. - **Debot Module**: - Support for get-methods and external calls in debots. - Debots can send external inbound messages to destination contracts (signed - for external calls and unsigned - for get-methods) using native language syntax without actions. + Debots can send external inbound messages to destination contracts (signed - for external + calls and unsigned - for get-methods) using native language syntax without actions. - Built-in debot interfaces (interfaces implemented by DEngine). - Added two built-in interfaces: base64 and Sdk. + Added two built-in interfaces: base64 and Sdk. - Added `DebotInterfaceExecutor` to automatically route messages to destination interfaces. - Debot's `fetch` function is optional now. New debots can implement only `start` function. ## 1.6.3 Feb 4, 2021 + ### Fixed + - Expired message wasn't retried if local execution succeeded. ## 1.6.2 Feb 3, 2021 + ### Added + - `ResponseHandler` type description into `modules.md`. ### Fixed + - `net.batch_query` parameters serialization did't match to docs. - Module description in docs generator contains `null` instead of summary. - Function result section header hadn't the line separator before. ## 1.6.0 Jan 29, 2021 + ### New + - `nacl_sign_detached_verify` function to verify detached signature. - `aggregate_collection` function as a wrapper for GraphQL aggregation queries. - `batch_query` function performs multiple queries per single fetch. - Active endpoint invalidation in case of network error occurring. -- `network.network_retries_count` config parameter is deprecated. `network.max_reconnect_timeout` is introduced that allows to specify maximum network resolving timeout. Default value is 2 min. -- `initial_pubkey` field in `DeploySet` to specify public key instead of one from TVC file or provided by signer. +- `network.network_retries_count` config parameter is deprecated. `network.max_reconnect_timeout` is + introduced that allows to specify maximum network resolving timeout. Default value is 2 min. +- `initial_pubkey` field in `DeploySet` to specify public key instead of one from TVC file or + provided by signer. - Support for debot interfaces: - - `send` Browser Callback to send messages with interface calls to Browser. - - new variant `ParamsOfAppDebotBrowser::Send`. - - `send` API function to send messages from Browser to Debot. - - `run_output.rs` - internal structure RunOutput to filter messages generated by debot to 4 categories: interface calls, external calls, get-method calls and invoke calls. + - `send` Browser Callback to send messages with interface calls to Browser. + - new variant `ParamsOfAppDebotBrowser::Send`. + - `send` API function to send messages from Browser to Debot. + - `run_output.rs` - internal structure RunOutput to filter messages generated by debot to 4 + categories: interface calls, external calls, get-method calls and invoke calls. ### Fixed -- Device time synchronization is checked only in `send_message`. Data querying does not require proper time now + +- Device time synchronization is checked only in `send_message`. Data querying does not require + proper time now ## 1.5.2 Dec 30, 2020 ### Fixed -- `net` module functions waits for `net.resume` call instead of returning error if called while the module is suspended + +- `net` module functions waits for `net.resume` call instead of returning error if called while the + module is suspended ### Documentation + - How to work with `Application Objects` [specification](docs/app_objects.md) added ## 1.5.1 Dec 28, 2020 ### Fixed + - Updated the dependence on `ton-labs-abi` ## 1.5.0 Dec 25, 2020 ### New + - `reconnect_timeout` parameter in `NetworkConfig`. -- `endpoints` parameter in `NetworkConfig`. It contains the list of available server addresses to connect. -SDK will use one them with the least connect time. `server_address` parameter is still supported but -`endpoints` is prevailing. +- `endpoints` parameter in `NetworkConfig`. It contains the list of available server addresses to + connect. + SDK will use one them with the least connect time. `server_address` parameter is still supported + but + `endpoints` is prevailing. - `net.fetch_endpoints` function to receive available endpoints from server. - `net.set_endpoints` function to set endpoints list for using on next reconnect. - `ErrorCode` type in each module spec in `api.json`. ### Fixed + - send `GQL_TERMINATE_CONNECTION` and close websocket on leaving ws loop. ## 1.4.0 Dec 18, 2020 ### New + - GraphQL optimization: use single web socket to serve all subscriptions. - Support for the `keep-alive` messages from the GraphQL server. - `tonclient-core-version` http header. - `net.find_last_shard_block` function returning account shard last block ID. - `boc.get_code_from_tvc` function extracting contract code from TVC image. - **Debot Module:** - - Add new variant `ParamsOfAppDebotBrowser::SwitchCompleted` to notify browser when all context actions are shown. - - Added new 3 engine routines for crypto operations and 1 routine for querying account state (balance, state type, code, data) that can be used in debots. + - Add new variant `ParamsOfAppDebotBrowser::SwitchCompleted` to notify browser when all context + actions are shown. + - Added new 3 engine routines for crypto operations and 1 routine for querying account state ( + balance, state type, code, data) that can be used in debots. ### Fixed - **Debot Module:** - - Invoked debot terminated correctly after error occurred during -execution of one of its actions. Initial prev_state of invoked debot -changed to STATE_EXIT. - - Fixed double jumping to current context in invoker debot after -returning control to it from invoked debot. - - Fixed conversation of exception codes thrown by debots to their user-friendly description. + - Invoked debot terminated correctly after error occurred during + execution of one of its actions. Initial prev_state of invoked debot + changed to STATE_EXIT. + - Fixed double jumping to current context in invoker debot after + returning control to it from invoked debot. + - Fixed conversation of exception codes thrown by debots to their user-friendly description. ## 1.3.0 Dec 8, 2020 ### Featured -- `net.query` method . Performs custom graphql query that can be copied directly from the playground. -- `net.suspend` and `net.resume` methods for disabling and enabling network activity. One of the possible use-cases is to manage subscriptions when a mobile application is brought to the background and into the foreground again. + +- `net.query` method . Performs custom graphql query that can be copied directly from the + playground. +- `net.suspend` and `net.resume` methods for disabling and enabling network activity. One of the + possible use-cases is to manage subscriptions when a mobile application is brought to the + background and into the foreground again. - Smart summary and description doc separation. - ts-generator includes doc comments in JSDoc format. ## 1.2.0 Nov 26, 2020 ### Featured + - **UNSTABLE API. This API is experimental. It can be changed in the next releases**. -`debot` module was added with debot engine functions, such as : `start`, `fetch`, `execute`, `remove`. See the `debot` module documentation for more info. -Check our tests for code examples. + `debot` module was added with debot engine functions, such as : `start`, `fetch`, `execute` + , `remove`. See the `debot` module documentation for more info. + Check our tests for code examples. -- External signing was supported for message encoding: `SigningBox` type for `Signer` enum was supported. - Now it is possible to sign messages with externally implemented signing box interface without private key disclosure to the library. Can be used in case of signing via HSM API or via cold wallet - when there is no access to the private key. +- External signing was supported for message encoding: `SigningBox` type for `Signer` enum was + supported. + Now it is possible to sign messages with externally implemented signing box interface without + private key disclosure to the library. Can be used in case of signing via HSM API or via cold + wallet - when there is no access to the private key. - It is also possible to create a Signing Box instance inside SDK - from a key pair passed into the library with `get_signing_box` method. It can be used for some test cases. Also it increases security - you need to pass your keys one time only. + It is also possible to create a Signing Box instance inside SDK - from a key pair passed into the + library with `get_signing_box` method. It can be used for some test cases. Also it increases + security - you need to pass your keys one time only. - Check the `crypto` module documentation for `SigningBoxHandle` type and `register_signing_box`, `get_signing_box`, `signing_box_get_public_key`, `signing_box_sign`. + Check the `crypto` module documentation for `SigningBoxHandle` type and `register_signing_box` + , `get_signing_box`, `signing_box_get_public_key`, `signing_box_sign`. Check our tests for code examples. ### Fixed + - panic after `tc_destroy_context` call. Now all contexts use global async runtime - field `mnemonic_hdkey_compliant` was removed from `CryptoConfig` (unused by the library) - original and resolved errors are swapped in result. Now `error.code` contains original error code ## 1.1.2 Nov 15, 2020 + ### Fixed + - `wasm` feature has been fixed - `crypto.factorize` doesn't panic on invalid challenge - `client.get_api_reference` returns proper version - ABI JSON with explicit function ID is parsed properly ## 1.1.1 Nov 11, 2020 + ### Fixed + - Compatible with older rust version change api type derivation with `vec![]` -instead of prev `[].into()` + instead of prev `[].into()` ## 1.1.0 Nov 3, 2020 ### New + - ChaCha20 encryption support `crypto.chacha20`. - `boc.parse_shardstate` function for shardstates parsing. - `boc.get_boc_hash` function for calculating BOC root hash - `client.build_info` fully defined and documented. - `processing.wait_for_transaction` and `processing.process_message` functions execute contract -locally in case if transaction waiting fails in order to resolve the contract execution error + locally in case if transaction waiting fails in order to resolve the contract execution error - `run_executor`, `run_tvm` now return `exit_arg` in case of TVM errors. - Create the `build_info.json` on the build stage. - `Abi::Contract` variant as an alias to deprecated `Abi::Serialized` - `Abi::Json` variant to specify an ABI as a raw JSON string. - `api.json` now contains details about numeric types: Number and BigInt are now -have new fields `number_type` and `number_size`. + have new fields `number_type` and `number_size`. - `api.json` ref type names are fully qualified now in form of `module.type`, -for example `abi.Signer`. + for example `abi.Signer`. ### Fixed + - TS generator fix some field names that is an invalid JS identifiers. - Use `install_name_tool` to fix loading library paths at `libton_client.dylib`. - `api.json` is reduced, so it can't contains tuple types, only structs. -All types are exactly match to JSON. + All types are exactly match to JSON. - `out_of_sync_threshold` config parameter is `u32` ### Unstable + - `tc_request_ptr` function to use pointers `void*` instead of request_id `u32`. -This feature is **UNSTABLE** yet. + This feature is **UNSTABLE** yet. ## 1.0.0 Oct 27, 2020 @@ -647,9 +858,10 @@ This feature is **UNSTABLE** yet. - In snake case - Base64 suffix is removed from parameter names. For example, `bocBase64` is changed to `boc` - Parsed boc replaced with unparsed boc in all function input parameters -- All functions take byte arrays in a defined encoding: +- All functions take byte arrays in a defined encoding: - `base64` - encoding used for byte arrays of variable length: text, images, etc. - - `hex-lower-case` - encoding used to encode fixed length bit sequences: hashes, keys, salt, etc. + - `hex-lower-case` - encoding used to encode fixed length bit sequences: hashes, keys, salt, + etc. - `contracts` module is splitted into 5 modules: - `tvm` - embedded TVM execution functions - `boc` - raw cell and BOC manipulation functions @@ -658,56 +870,92 @@ This feature is **UNSTABLE** yet. - `utils` - has only `convert_address` ATM, later will be used for some useful stuff - `query` module is renamed to `net` - new `client` module with functions `version`, `api_reference` -- All the environment functions (fetch, websocket, spawn, now, etc.) were abstracted behind a separate environment layer crate `ClientEnv`. The standard core env layer implementation is in `std_client_env` . Later (in 1.1 release) `web_client_env` implementation for Web will be added. -- Error codes are distributed across the modules the following way: `client` - 0..99, `crypto` - 100..199, `boc` - 200..299, `abi` - 300..399, `tvm` - 400..499, `processing` - 500..599, `net` - 600..699 +- All the environment functions (fetch, websocket, spawn, now, etc.) were abstracted behind a + separate environment layer crate `ClientEnv`. The standard core env layer implementation is + in `std_client_env` . Later (in 1.1 release) `web_client_env` implementation for Web will be + added. +- Error codes are distributed across the modules the following way: `client` - 0..99, `crypto` - + 100..199, `boc` - 200..299, `abi` - 300..399, `tvm` - 400..499, `processing` - 500..599, `net` - + 600..699 - Error descriptions related to a module are described in error.rs file in the module's folder -- `decode_message`, `process_message`, `wait_for_transaction`, `run_tvm`, `run_executor`, etc. (all the functions that return decoded messages) now returns int*/uint* data as a string which can be either decimal or 0x-prefixed hex string. Hex representation can be in any register and have any number of leading zeroes. +- `decode_message`, `process_message`, `wait_for_transaction`, `run_tvm`, `run_executor`, etc. (all + the functions that return decoded messages) now returns int*/uint* data as a string which can be + either decimal or 0x-prefixed hex string. Hex representation can be in any register and have any + number of leading zeroes. ### Featured - All the functions are asynchronous -- All the functions that can be called via JSON-api are public, so that they can be used directly without JSON-api. +- All the functions that can be called via JSON-api are public, so that they can be used directly + without JSON-api. - Inline documentation and api reference added. -- [breaking] `interops.rs`, `tonclient.h`. `create_context` now takes `config` parameter - context creation and setup happen at the same time. Config structure has been changed. +- [breaking] `interops.rs`, `tonclient.h`. `create_context` now takes `config` parameter - context + creation and setup happen at the same time. Config structure has been changed. - [breaking] `crypto module.` default values for mnemonic-related functions have been changed: - dictionary is 1, for word count is 12, derivation path is 'm/44'/396'/0'/0/0 + dictionary is 1, for word count is 12, derivation path is 'm/44'/396'/0'/0/0 - [breaking] **crypto module.** removed `word_count` parameter from `words` function -- [breaking] **crypto module.** `compliant` parameter is removed from functions `mnemonic_derive_sign_keys`, `hdkey_xprv_derive_path`, `hdkey_xprv_derive`, -- [new] **boc module.** Functions `parse_block`, `parse_account`, `parse_message`, `parse_transaction` that parse bocs to JSONs are introduced. -- [breaking] **net module.** Functions `query` , `wait.for`, `subscribe` are renamed to `query_collection`, `wait_for_collection`, `subscribe_collection` +- [breaking] **crypto module.** `compliant` parameter is removed from + functions `mnemonic_derive_sign_keys`, `hdkey_xprv_derive_path`, `hdkey_xprv_derive`, +- [new] **boc module.** Functions `parse_block`, `parse_account`, `parse_message` + , `parse_transaction` that parse bocs to JSONs are introduced. +- [breaking] **net module.** Functions `query` , `wait.for`, `subscribe` are renamed + to `query_collection`, `wait_for_collection`, `subscribe_collection` - `table` parameter is renamed to `collection`. `filter` parameter is now optional and of `json` type (passed as json object instead of `string`) + `table` parameter is renamed to `collection`. `filter` parameter is now optional and of `json` + type (passed as json object instead of `string`) - [breaking] **net module**. Function `get.next` is removed. - [breaking] **net module.**`subscribe_collection` now uses callback to return data. -- [breaking] **abi module**. `decode_message` introduced instead of `decode_unknown_run`, `decode_run_output` -- [breaking] **abi module**. `encode_message` introduced instead of `encode_unsigned_deploy_message`, `encode_unsigned_run_message`, `run.encode_message`, `deploy.encode_message` -- [breaking] **abi module**. `signer: Signer` parameter used instead of `key_pair: KeyPair` , which can be of `None` (unsigned message will be produced), `External` (data to be signed +unsigned message), `Keys` (signed message will be produced), `SigningBox` (message will be signed using a provided interface - will be supported in coming releases) -- [breaking] **processing module.** `process_message` introduced instead of `deploy` and `run`**.** Parameter set was drastically changed. -- [breaking] **processing module.** `process_message` - now, if the contract was already deployed, deploy fails with an exception of double constructor call. -- [new] **processing module.** `process_message` - any function can be called at deploy, not only constructor, also there can be no function call. -- [new] **processing module.** `process_message` now can optionally use callback to monitor message processing (creation, sending, shard block fetching, transaction receiving). +- [breaking] **abi module**. `decode_message` introduced instead of `decode_unknown_run` + , `decode_run_output` +- [breaking] **abi module**. `encode_message` introduced instead of `encode_unsigned_deploy_message` + , `encode_unsigned_run_message`, `run.encode_message`, `deploy.encode_message` +- [breaking] **abi module**. `signer: Signer` parameter used instead of `key_pair: KeyPair` , which + can be of `None` (unsigned message will be produced), `External` (data to be signed +unsigned + message), `Keys` (signed message will be produced), `SigningBox` (message will be signed using a + provided interface - will be supported in coming releases) +- [breaking] **processing module.** `process_message` introduced instead of `deploy` and `run`**.** + Parameter set was drastically changed. +- [breaking] **processing module.** `process_message` - now, if the contract was already deployed, + deploy fails with an exception of double constructor call. +- [new] **processing module.** `process_message` - any function can be called at deploy, not only + constructor, also there can be no function call. +- [new] **processing module.** `process_message` now can optionally use callback to monitor message + processing (creation, sending, shard block fetching, transaction receiving). - [fixed] **processing module.** `process_message` - deploy can be performed without a key pair - [breaking] **tvm module.** `run_local` is divided into 2 functions `run_tvm` and `run_executor`. -- [new] **tvm module.** `run_tvm` function - performs contract code execution on tvm (part of compute phase). Helps to run contract methods without ACCEPT. Returns account state with updated data, list of external messages and (optional, for ABI contracts only) list of messages decoded data. -- [new] **tvm module.** `run_executor` function - performs full contract code execution on Transaction Executor (part of collator protocol that performs all phases and checks and - as a successful result - forms a transaction) Returns updated account state, parsed transaction, list of parsed messages with optional decoded message bodies. -- [breaking] **tvm module**. `run_get` does not download account boc from the network anymore, but takes account boc as a parameter. +- [new] **tvm module.** `run_tvm` function - performs contract code execution on tvm (part of + compute phase). Helps to run contract methods without ACCEPT. Returns account state with updated + data, list of external messages and (optional, for ABI contracts only) list of messages decoded + data. +- [new] **tvm module.** `run_executor` function - performs full contract code execution on + Transaction Executor (part of collator protocol that performs all phases and checks and - as a + successful result - forms a transaction) Returns updated account state, parsed transaction, list + of parsed messages with optional decoded message bodies. +- [breaking] **tvm module**. `run_get` does not download account boc from the network anymore, but + takes account boc as a parameter. ## 0.26.0 Aug 15, 2020 + ### New + - `config.get_api_reference` api function (pre release). - `ton_sdk_cli` cli tool (pre release). - full local run functions use `LocalRunContext` to exactly reproduce all transaction parameters and -produce the same result as node + produce the same result as node ## 0.25.4 Aug 5, 2020 + ### Fixed + - `waitForTransaction` didn't use prev_alt_ref for block walking ## 0.25.3 Jul 30, 2020 + ### New + - All methods that require contract's code/data can use field `boc` in account document to extract code and data (instead of `code` and `data` fields). @@ -715,55 +963,73 @@ produce the same result as node instead of `codeBase64` and `dataBase64`. ## 0.25.2 Jul 29, 2020 + ### New + - `error.data` object extended with fields `address`, `function_name`, `account_balance`, -`account_address`, `query_url`, `config_server` for appropriate errors + `account_address`, `query_url`, `config_server` for appropriate errors ## 0.25.0 Jul 8, 2020 + ### New + - supports for core context in all platforms - local run functions return updated contract state when running with `full_run = true` - time sync check while initializing - parallel requests on different contexts don't block each other. Requests on the same context -remain sequential + remain sequential - new transaction wait mechanism. All account's shard blocks are checked for transaction to -guarantee message expiration + guarantee message expiration - `contracts.wait.transaction` function for awaiting previously sent message processing -- `contracts.send.message` returns message processing state for `contracts.wait.transaction` function +- `contracts.send.message` returns message processing state for `contracts.wait.transaction` + function - `contracts.find.shard` function for account shard matching - added logging on warning messages ## May 28, 2020 + ### New + - error resolving by local message processing - `contracts.resolve.error` function for manual error resolving call - `contracts.process.transaction` function processing transaction to check errors and get output - `contracts.run.local` and `contracts.run.local` functions now have `fullRun` flag to emulate -node transaction processing and calculate fees + node transaction processing and calculate fees - `tonsdk` command line tool. - `ton_client` function `get_method_names`. ## May 22, 2020 + #### Fix + - TON mnemonic functions didn't check validity of the seed phrase. ## May 19, 2020 + ### ton-client-web 0.23.1 + #### New -- Platform builder generates ready to use `index.js` for web clients (instead of install script of `ton-client-web-js` binding) + +- Platform builder generates ready to use `index.js` for web clients (instead of install script + of `ton-client-web-js` binding) ## May 17, 2020 + ### New + - `tvm.get` now can fetch account data if it is not provided ## May 14, 2020 + ### New + - Message processing functions added - Run get methods function added - `ed25519-dalek` version updated to `1.0.0-pre.3` - SDK is fully open sourced since open repo `ton-labs-executor` used ### Fixed + - Panic in fee calculation under WASM - `reqwest` crate version synced in all projects - Memory leaking in Node JS diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..9f6e84a32 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3047 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug 0.3.0", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.7", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" + +[[package]] +name = "api_derive" +version = "1.35.0" +dependencies = [ + "api_info", + "quote", + "serde_json", + "syn", +] + +[[package]] +name = "api_info" +version = "1.35.0" +dependencies = [ + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "api_test" +version = "1.35.0" +dependencies = [ + "api_derive", + "api_info", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "arc-swap" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dabe5a181f83789739c194cbe5a897dde195078fac08568d09221fd6137a7ba8" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "assert_cmd" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c98233c6673d8601ab23e77eb38f999c51100d46c5703b17288c57fddf3a1ffe" +dependencies = [ + "bstr", + "doc-comment", + "predicates 2.1.1", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + +[[package]] +name = "async-trait" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base58" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" + +[[package]] +name = "base64" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "block-modes" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" +dependencies = [ + "block-padding 0.2.1", + "cipher 0.3.0", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", +] + +[[package]] +name = "build_const" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" + +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed8738f14471a99f0e316c327e68fc82a3611cc2895fcb604b89eedaf8f39d95" +dependencies = [ + "cipher 0.2.5", +] + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "js-sys", + "libc", + "num-integer", + "num-traits", + "time", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +dependencies = [ + "build_const", +] + +[[package]] +name = "crc-any" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +dependencies = [ + "debug-helper", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array 0.14.5", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.5", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.5", + "subtle", +] + +[[package]] +name = "ctor" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "difference" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.2", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +dependencies = [ + "cfg-if 0.1.10", + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "ed25519" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "extfmt" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a48fe53466ab1f4ea6303bf9d7a0ca8060778590f09fd6c3304cc817aeb9935d" + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "flate2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[package]] +name = "graphql-parser" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1abd4ce5247dfc04a03ccde70f87a048458c9356c7e41d21ad8c407b3dde6f2" +dependencies = [ + "combine", + "thiserror", +] + +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.3", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.5", + "hmac 0.8.1", +] + +[[package]] +name = "home" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +dependencies = [ + "winapi", +] + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.14.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "index-fixed" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161ceaf2f41b6cd3f6502f5da085d4ad4393a51e0c70ed2fce1d5698d798fae" + +[[package]] +name = "indexed_db_futures" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26ac735f676c52305becf53264b91cea9866a8de61ccbf464405b377b9cbca9" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown 0.12.1", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb2522ff59fbfefb955e9bd44d04d5e5c2d0e8865bfc2c3d1ab3916183ef5ee" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lockfree" +version = "0.5.1" +source = "git+https://github.com/tonlabs/lockfree.git#bfcb66587dc4ffed9e8e9248995ad2fe8dc3669e" +dependencies = [ + "owned-alloc", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", + "serde", +] + +[[package]] +name = "log-mdc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" + +[[package]] +name = "log4rs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e1ad45e4584824d760c35d71868dd7e6e5acd8f5195a9573743b369fc86cd6" +dependencies = [ + "arc-swap", + "chrono", + "flate2", + "fnv", + "humantime", + "libc", + "log", + "log-mdc", + "parking_lot", + "serde", + "serde-value", + "serde_derive", + "serde_json", + "serde_yaml", + "thread-id", + "typemap", + "winapi", +] + +[[package]] +name = "lru" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84e6fe5655adc6ce00787cf7dcaf8dc4f998a0565d23eafc207a8b08ca3349a" +dependencies = [ + "hashbrown 0.11.2", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", +] + +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.28.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-float" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + +[[package]] +name = "output_vt100" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" +dependencies = [ + "winapi", +] + +[[package]] +name = "owned-alloc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30fceb411f9a12ff9222c5f824026be368ff15dc2f13468d850c7d3f502205d6" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.13", + "smallvec", + "winapi", +] + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.3", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1 0.8.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "predicates" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df" +dependencies = [ + "difference", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" +dependencies = [ + "difflib", + "itertools", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb" + +[[package]] +name = "predicates-tree" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "pretty_assertions" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" +dependencies = [ + "ansi_term", + "ctor", + "difference", + "output_vt100", +] + +[[package]] +name = "proc-macro2" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.7", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.7", + "redox_syscall 0.2.13", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + +[[package]] +name = "regex-syntax" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +dependencies = [ + "base64 0.13.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "salsa20" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" +dependencies = [ + "cipher 0.3.0", +] + +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "scrypt" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879588d8f90906e73302547e20fffefdd240eb3e0e744e142321f5d49dea0518" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "salsa20", + "sha2 0.9.9", +] + +[[package]] +name = "secstr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce2c726741c320e5b8f1edd9a21b3c2c292ae94514afd001d41d81ba143dafc" +dependencies = [ + "libc", +] + +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a65a7291a8a568adcae4c10a677ebcedbc6c9cec91c054dee2ce40b0e3290eb" +dependencies = [ + "ordered-float 1.1.1", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "signature" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "sodalite" +version = "0.3.0" +source = "git+https://github.com/tonlabs/sodalite.git#667f7f01290c95fdbeadc5bce3e32c1d14b92fe1" +dependencies = [ + "index-fixed", + "rand 0.7.3", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "libc", + "redox_syscall 0.2.13", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termtree" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread-id" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" +dependencies = [ + "libc", + "redox_syscall 0.1.57", + "winapi", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac 0.12.1", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash", + "sha2 0.10.2", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "pin-project-lite", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06cda1232a49558c46f8a504d5b93101d42c0bf7f911f12a105ba48168f821ae" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "ton_abi" +version = "2.2.8" +source = "git+https://github.com/tonlabs/ton-labs-abi.git?tag=2.2.8#8e143a32a34ff5836f5309767a14ed62ffedbcee" +dependencies = [ + "base64 0.10.1", + "byteorder", + "chrono", + "ed25519", + "ed25519-dalek", + "failure", + "hex 0.3.2", + "num-bigint", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "sha2 0.8.2", + "ton_block", + "ton_types", +] + +[[package]] +name = "ton_api" +version = "0.2.128" +source = "git+https://github.com/tonlabs/ton-labs-tl?tag=0.2.128#fa91f87c1372048320e91d49ebba7dde52605a87" +dependencies = [ + "byteorder", + "extfmt", + "failure", + "hex 0.4.3", + "lazy_static", + "ordered-float 2.10.0", + "secstr", + "serde", + "serde_derive", + "serde_json", + "ton_block", + "ton_tl_codegen", + "ton_types", +] + +[[package]] +name = "ton_block" +version = "1.7.51" +source = "git+https://github.com/tonlabs/ton-labs-block.git?tag=1.7.51#7243ec8b0d827a6fab8ae2683cb7623d8ed2e93b" +dependencies = [ + "base64 0.13.0", + "crc", + "ed25519", + "ed25519-dalek", + "failure", + "hex 0.4.3", + "log", + "num", + "num-traits", + "rand 0.7.3", + "sha2 0.8.2", + "ton_types", +] + +[[package]] +name = "ton_block_json" +version = "0.7.18" +source = "git+https://github.com/tonlabs/ton-labs-block-json.git?tag=0.7.18#4813e9be697ffb5bd5e91b82070a3e2b90b101f6" +dependencies = [ + "base64 0.13.0", + "failure", + "hex 0.4.3", + "num", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "ton_api", + "ton_block", + "ton_types", +] + +[[package]] +name = "ton_client" +version = "1.35.0" +dependencies = [ + "aes", + "api_derive", + "api_info", + "async-trait", + "base58", + "base64 0.10.1", + "bincode", + "block-modes", + "byteorder", + "chacha20", + "chrono", + "crc-any", + "dirs 2.0.2", + "ed25519-dalek", + "failure", + "futures", + "graphql-parser", + "hex 0.3.2", + "hmac 0.11.0", + "home", + "indexed_db_futures", + "js-sys", + "lazy_static", + "libsecp256k1", + "lockfree", + "log", + "log4rs", + "lru", + "num-bigint", + "num-derive", + "num-traits", + "pbkdf2 0.8.0", + "pretty_assertions", + "rand 0.7.3", + "regex", + "reqwest", + "scrypt", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "sha2 0.9.9", + "sodalite", + "tiny-bip39", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "ton_abi", + "ton_block", + "ton_block_json", + "ton_executor", + "ton_sdk", + "ton_types", + "ton_vm", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "zeroize", + "zstd", +] + +[[package]] +name = "ton_executor" +version = "1.15.72" +source = "git+https://github.com/tonlabs/ton-labs-executor.git?tag=1.15.72#23cc13b4c0d1b256cd0d5d0e24996cf426b01996" +dependencies = [ + "failure", + "lazy_static", + "log", + "ton_block", + "ton_types", + "ton_vm", +] + +[[package]] +name = "ton_sdk" +version = "1.35.0" +dependencies = [ + "api_derive", + "api_info", + "base64 0.10.1", + "chrono", + "crc-any", + "ed25519-dalek", + "failure", + "hex 0.3.2", + "lazy_static", + "log", + "num-bigint", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "sha2 0.8.2", + "ton_abi", + "ton_block", + "ton_types", + "ton_vm", +] + +[[package]] +name = "ton_tl_codegen" +version = "0.0.2" +source = "git+https://github.com/tonlabs/ton-labs-tl?tag=0.2.128#fa91f87c1372048320e91d49ebba7dde52605a87" +dependencies = [ + "crc", + "failure", + "pom", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "ton_types" +version = "1.11.2" +source = "git+https://github.com/tonlabs/ton-labs-types.git?tag=1.11.2#1e8fab540649d4b0fe3713be64fa01ca73d2b9fe" +dependencies = [ + "base64 0.13.0", + "crc", + "failure", + "hex 0.4.3", + "lazy_static", + "lockfree", + "log", + "num", + "num-derive", + "num-traits", + "rand 0.8.5", + "sha2 0.9.9", + "smallvec", +] + +[[package]] +name = "ton_vm" +version = "1.8.38" +source = "git+https://github.com/tonlabs/ton-labs-vm.git?tag=1.8.38#802aec2047e07c518136b10d091a13784ad6d696" +dependencies = [ + "ed25519", + "ed25519-dalek", + "failure", + "hex 0.4.3", + "lazy_static", + "log", + "num", + "num-traits", + "rand 0.7.3", + "sha2 0.9.9", + "ton_block", + "ton_types", +] + +[[package]] +name = "toncli" +version = "1.35.0" +dependencies = [ + "api_info", + "assert_cmd", + "base64 0.13.0", + "dirs 3.0.2", + "json5", + "predicates 1.0.8", + "regex", + "serde", + "serde_derive", + "serde_json", + "ton_client", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +dependencies = [ + "once_cell", +] + +[[package]] +name = "traitobject" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5" +dependencies = [ + "base64 0.13.0", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "native-tls", + "rand 0.8.5", + "sha-1 0.10.0", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typemap" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" +dependencies = [ + "unsafe-any", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-any" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" +dependencies = [ + "traitobject", +] + +[[package]] +name = "update_trusted_blocks" +version = "0.1.0" +dependencies = [ + "bincode", + "failure", + "serde", + "serde_derive", + "serde_json", + "tokio", + "ton_client", + "ton_types", +] + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.7", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" + +[[package]] +name = "web-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "zeroize" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zstd" +version = "0.8.3+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea7094c7b4a58fbd738eb0d4a2fc7684a0e6949a31597e074ffe20a07cbc2bf" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d30375f78e185ca4c91930f42ea2c0162f9aa29737032501f93b79266d985ae7" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2141bed8922b427761470e6bbfeff255da94fa20b0bbeab0d9297fcaf71e3aa7" +dependencies = [ + "cc", + "libc", +] diff --git a/api/derive/Cargo.toml b/api/derive/Cargo.toml index b8f2551b5..3a15e4dd3 100644 --- a/api/derive/Cargo.toml +++ b/api/derive/Cargo.toml @@ -2,7 +2,7 @@ authors = [ 'TON Labs LTD ' ] edition = '2018' name = 'api_derive' -version = '1.34.3' +version = '1.35.0' [dependencies] quote = '1.0' diff --git a/api/info/Cargo.toml b/api/info/Cargo.toml index c9cfdece7..b2a6b3c95 100644 --- a/api/info/Cargo.toml +++ b/api/info/Cargo.toml @@ -2,7 +2,7 @@ authors = [ 'TON Labs LTD ' ] edition = '2018' name = 'api_info' -version = '1.34.3' +version = '1.35.0' [dependencies] serde = '1.0.115' diff --git a/api/test/Cargo.toml b/api/test/Cargo.toml index a89c30295..860e72b25 100644 --- a/api/test/Cargo.toml +++ b/api/test/Cargo.toml @@ -2,7 +2,7 @@ authors = [ 'TON Labs LTD ' ] edition = '2018' name = 'api_test' -version = '1.34.3' +version = '1.35.0' [dependencies] serde = '1.0.115' diff --git a/docs/reference/types-and-methods/mod_abi.md b/docs/reference/types-and-methods/mod_abi.md index 192fe7261..f2b954096 100644 --- a/docs/reference/types-and-methods/mod_abi.md +++ b/docs/reference/types-and-methods/mod_abi.md @@ -32,6 +32,8 @@ Provides message encoding and decoding according to the ABI specification. [encode_boc](mod\_abi.md#encode_boc) – Encodes given parameters in JSON into a BOC using param types from ABI. +[calc_function_id](mod\_abi.md#calc_function_id) – Calculates contract function ID by contract ABI + ## Types [AbiErrorCode](mod\_abi.md#abierrorcode) @@ -143,6 +145,10 @@ Provides message encoding and decoding according to the ABI specification. [ResultOfAbiEncodeBoc](mod\_abi.md#resultofabiencodeboc) +[ParamsOfCalcFunctionId](mod\_abi.md#paramsofcalcfunctionid) + +[ResultOfCalcFunctionId](mod\_abi.md#resultofcalcfunctionid) + # Functions ## encode_message_body @@ -722,6 +728,36 @@ function encode_boc( - `boc`: _string_ – BOC encoded as base64 +## calc_function_id + +Calculates contract function ID by contract ABI + +```ts +type ParamsOfCalcFunctionId = { + abi: Abi, + function_name: string, + output?: boolean +} + +type ResultOfCalcFunctionId = { + function_id: number +} + +function calc_function_id( + params: ParamsOfCalcFunctionId, +): Promise; +``` +### Parameters +- `abi`: _[Abi](mod\_abi.md#abi)_ – Contract ABI. +- `function_name`: _string_ – Contract function name +- `output`?: _boolean_ – If set to `true` output function ID will be returned which is used in contract response. Default is `false` + + +### Result + +- `function_id`: _number_ – Contract function ID + + # Types ## AbiErrorCode ```ts @@ -739,7 +775,8 @@ enum AbiErrorCode { InvalidAbi = 311, InvalidFunctionId = 312, InvalidData = 313, - EncodeInitialDataFailed = 314 + EncodeInitialDataFailed = 314, + InvalidFunctionName = 315 } ``` One of the following value: @@ -758,6 +795,7 @@ One of the following value: - `InvalidFunctionId = 312` - `InvalidData = 313` - `EncodeInitialDataFailed = 314` +- `InvalidFunctionName = 315` ## AbiContractVariant @@ -1621,3 +1659,25 @@ type ResultOfAbiEncodeBoc = { - `boc`: _string_ – BOC encoded as base64 +## ParamsOfCalcFunctionId +```ts +type ParamsOfCalcFunctionId = { + abi: Abi, + function_name: string, + output?: boolean +} +``` +- `abi`: _[Abi](mod\_abi.md#abi)_ – Contract ABI. +- `function_name`: _string_ – Contract function name +- `output`?: _boolean_ – If set to `true` output function ID will be returned which is used in contract response. Default is `false` + + +## ResultOfCalcFunctionId +```ts +type ResultOfCalcFunctionId = { + function_id: number +} +``` +- `function_id`: _number_ – Contract function ID + + diff --git a/docs/reference/types-and-methods/mod_tvm.md b/docs/reference/types-and-methods/mod_tvm.md index a8a6a0a61..7b41b4dac 100644 --- a/docs/reference/types-and-methods/mod_tvm.md +++ b/docs/reference/types-and-methods/mod_tvm.md @@ -262,13 +262,15 @@ type ExecutionOptions = { blockchain_config?: string, block_time?: number, block_lt?: bigint, - transaction_lt?: bigint + transaction_lt?: bigint, + chksig_always_succeed?: boolean } ``` - `blockchain_config`?: _string_ – boc with config - `block_time`?: _number_ – time that is used as transaction time - `block_lt`?: _bigint_ – block logical time - `transaction_lt`?: _bigint_ – transaction logical time +- `chksig_always_succeed`?: _boolean_ – Overrides standard TVM behaviour. If set to `true` then CHKSIG always will return `true`. ## AccountForExecutorNoneVariant diff --git a/docs/reference/types-and-methods/modules.md b/docs/reference/types-and-methods/modules.md index f4bdda421..df72e101c 100644 --- a/docs/reference/types-and-methods/modules.md +++ b/docs/reference/types-and-methods/modules.md @@ -157,6 +157,8 @@ Where: [encode_boc](mod\_abi.md#encode_boc) – Encodes given parameters in JSON into a BOC using param types from ABI. +[calc_function_id](mod\_abi.md#calc_function_id) – Calculates contract function ID by contract ABI + ## [boc](mod\_boc.md) – BOC manipulation module. [parse_message](mod\_boc.md#parse_message) – Parses message boc into a JSON diff --git a/examples/rust/Cargo.lock b/examples/rust/Cargo.lock new file mode 100644 index 000000000..c18f073f8 --- /dev/null +++ b/examples/rust/Cargo.lock @@ -0,0 +1,2433 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug 0.3.0", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.7", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" + +[[package]] +name = "api_derive" +version = "1.35.0" +dependencies = [ + "api_info", + "quote", + "serde_json", + "syn", +] + +[[package]] +name = "api_info" +version = "1.35.0" +dependencies = [ + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "async-trait" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base58" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" + +[[package]] +name = "base64" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "block-modes" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" +dependencies = [ + "block-padding 0.2.1", + "cipher 0.3.0", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "build_const" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" + +[[package]] +name = "bumpalo" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed8738f14471a99f0e316c327e68fc82a3611cc2895fcb604b89eedaf8f39d95" +dependencies = [ + "cipher 0.2.5", +] + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +dependencies = [ + "build_const", +] + +[[package]] +name = "crc-any" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +dependencies = [ + "debug-helper", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array 0.14.5", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.5", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.5", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.2", + "crypto-common", + "subtle", +] + +[[package]] +name = "ed25519" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "extfmt" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a48fe53466ab1f4ea6303bf9d7a0ca8060778590f09fd6c3304cc817aeb9935d" + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.3", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.5", + "hmac 0.8.1", +] + +[[package]] +name = "home" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +dependencies = [ + "winapi", +] + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "index-fixed" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161ceaf2f41b6cd3f6502f5da085d4ad4393a51e0c70ed2fce1d5698d798fae" + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown 0.12.1", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "lockfree" +version = "0.5.1" +source = "git+https://github.com/tonlabs/lockfree.git#bfcb66587dc4ffed9e8e9248995ad2fe8dc3669e" +dependencies = [ + "owned-alloc", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "lru" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84e6fe5655adc6ce00787cf7dcaf8dc4f998a0565d23eafc207a8b08ca3349a" +dependencies = [ + "hashbrown 0.11.2", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", +] + +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.28.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + +[[package]] +name = "owned-alloc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30fceb411f9a12ff9222c5f824026be368ff15dc2f13468d850c7d3f502205d6" + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.3", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.7", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +dependencies = [ + "base64 0.13.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "salsa20" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" +dependencies = [ + "cipher 0.3.0", +] + +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] + +[[package]] +name = "scrypt" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879588d8f90906e73302547e20fffefdd240eb3e0e744e142321f5d49dea0518" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "salsa20", + "sha2 0.9.9", +] + +[[package]] +name = "secstr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce2c726741c320e5b8f1edd9a21b3c2c292ae94514afd001d41d81ba143dafc" +dependencies = [ + "libc", +] + +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "signature" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "sodalite" +version = "0.3.0" +source = "git+https://github.com/tonlabs/sodalite.git#667f7f01290c95fdbeadc5bce3e32c1d14b92fe1" +dependencies = [ + "index-fixed", + "rand 0.7.3", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "test_sdk_v1" +version = "0.1.0" +dependencies = [ + "serde_json", + "tokio", + "ton_client", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac 0.12.1", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash", + "sha2 0.10.2", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "pin-project-lite", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06cda1232a49558c46f8a504d5b93101d42c0bf7f911f12a105ba48168f821ae" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "ton_abi" +version = "2.2.8" +source = "git+https://github.com/tonlabs/ton-labs-abi.git?tag=2.2.8#8e143a32a34ff5836f5309767a14ed62ffedbcee" +dependencies = [ + "base64 0.10.1", + "byteorder", + "chrono", + "ed25519", + "ed25519-dalek", + "failure", + "hex 0.3.2", + "num-bigint", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "sha2 0.8.2", + "ton_block", + "ton_types", +] + +[[package]] +name = "ton_api" +version = "0.2.128" +source = "git+https://github.com/tonlabs/ton-labs-tl?tag=0.2.128#fa91f87c1372048320e91d49ebba7dde52605a87" +dependencies = [ + "byteorder", + "extfmt", + "failure", + "hex 0.4.3", + "lazy_static", + "ordered-float", + "secstr", + "serde", + "serde_derive", + "serde_json", + "ton_block", + "ton_tl_codegen", + "ton_types", +] + +[[package]] +name = "ton_block" +version = "1.7.51" +source = "git+https://github.com/tonlabs/ton-labs-block.git?tag=1.7.51#7243ec8b0d827a6fab8ae2683cb7623d8ed2e93b" +dependencies = [ + "base64 0.13.0", + "crc", + "ed25519", + "ed25519-dalek", + "failure", + "hex 0.4.3", + "log", + "num", + "num-traits", + "rand 0.7.3", + "sha2 0.8.2", + "ton_types", +] + +[[package]] +name = "ton_block_json" +version = "0.7.18" +source = "git+https://github.com/tonlabs/ton-labs-block-json.git?tag=0.7.18#4813e9be697ffb5bd5e91b82070a3e2b90b101f6" +dependencies = [ + "base64 0.13.0", + "failure", + "hex 0.4.3", + "num", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "ton_api", + "ton_block", + "ton_types", +] + +[[package]] +name = "ton_client" +version = "1.35.0" +dependencies = [ + "aes", + "api_derive", + "api_info", + "async-trait", + "base58", + "base64 0.10.1", + "bincode", + "block-modes", + "byteorder", + "chacha20", + "chrono", + "crc-any", + "ed25519-dalek", + "failure", + "futures", + "hex 0.3.2", + "hmac 0.11.0", + "home", + "lazy_static", + "libsecp256k1", + "lockfree", + "log", + "lru", + "num-bigint", + "num-derive", + "num-traits", + "pbkdf2 0.8.0", + "rand 0.7.3", + "regex", + "reqwest", + "scrypt", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "sha2 0.9.9", + "sodalite", + "tiny-bip39", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "ton_abi", + "ton_block", + "ton_block_json", + "ton_executor", + "ton_sdk", + "ton_types", + "ton_vm", + "zeroize", + "zstd", +] + +[[package]] +name = "ton_executor" +version = "1.15.72" +source = "git+https://github.com/tonlabs/ton-labs-executor.git?tag=1.15.72#23cc13b4c0d1b256cd0d5d0e24996cf426b01996" +dependencies = [ + "failure", + "lazy_static", + "log", + "ton_block", + "ton_types", + "ton_vm", +] + +[[package]] +name = "ton_sdk" +version = "1.35.0" +dependencies = [ + "api_derive", + "api_info", + "base64 0.10.1", + "chrono", + "crc-any", + "ed25519-dalek", + "failure", + "hex 0.3.2", + "lazy_static", + "log", + "num-bigint", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "sha2 0.8.2", + "ton_abi", + "ton_block", + "ton_types", + "ton_vm", +] + +[[package]] +name = "ton_tl_codegen" +version = "0.0.2" +source = "git+https://github.com/tonlabs/ton-labs-tl?tag=0.2.128#fa91f87c1372048320e91d49ebba7dde52605a87" +dependencies = [ + "crc", + "failure", + "pom", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "ton_types" +version = "1.11.2" +source = "git+https://github.com/tonlabs/ton-labs-types.git?tag=1.11.2#1e8fab540649d4b0fe3713be64fa01ca73d2b9fe" +dependencies = [ + "base64 0.13.0", + "crc", + "failure", + "hex 0.4.3", + "lazy_static", + "lockfree", + "log", + "num", + "num-derive", + "num-traits", + "rand 0.8.5", + "sha2 0.9.9", + "smallvec", +] + +[[package]] +name = "ton_vm" +version = "1.8.38" +source = "git+https://github.com/tonlabs/ton-labs-vm.git?tag=1.8.38#802aec2047e07c518136b10d091a13784ad6d696" +dependencies = [ + "ed25519", + "ed25519-dalek", + "failure", + "hex 0.4.3", + "lazy_static", + "log", + "num", + "num-traits", + "rand 0.7.3", + "sha2 0.9.9", + "ton_block", + "ton_types", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5" +dependencies = [ + "base64 0.13.0", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "native-tls", + "rand 0.8.5", + "sha-1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" + +[[package]] +name = "web-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "zeroize" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zstd" +version = "0.8.3+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea7094c7b4a58fbd738eb0d4a2fc7684a0e6949a31597e074ffe20a07cbc2bf" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d30375f78e185ca4c91930f42ea2c0162f9aa29737032501f93b79266d985ae7" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2141bed8922b427761470e6bbfeff255da94fa20b0bbeab0d9297fcaf71e3aa7" +dependencies = [ + "cc", + "libc", +] diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index deef7bfd2..1a124c7fe 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -6,5 +6,5 @@ version = '0.1.0' [dependencies] serde_json = '1.0.41' -tokio = { features = [ 'rt-threaded', 'macros', 'sync' ], version = '0.2.13' } +tokio = { features = [ 'rt-multi-thread', 'macros', 'sync' ], version = '1' } ton_client = { path = '../../ton_client' } diff --git a/examples/rust/src/main.rs b/examples/rust/src/main.rs index 722e3e2b8..9ad12d130 100644 --- a/examples/rust/src/main.rs +++ b/examples/rust/src/main.rs @@ -6,7 +6,7 @@ async fn main() { ton_client::ClientContext::new(ton_client::ClientConfig { network: ton_client::net::NetworkConfig { //server_address: "http://localhost:80".to_owned(), - server_address: "cinet.tonlabs.io".to_owned(), + endpoints: Some(vec!["cinet.tonlabs.io".to_owned()]), ..Default::default() }, ..Default::default() diff --git a/ton_client/Cargo.toml b/ton_client/Cargo.toml index 47e7df8f7..b524aadf8 100644 --- a/ton_client/Cargo.toml +++ b/ton_client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'ton_client' -version = '1.34.3' +version = '1.35.0' authors = [ 'TON Labs LTD ' ] edition = '2018' license = 'Apache-2.0' @@ -22,10 +22,10 @@ ton_sdk = { default-features = false, path = '../ton_sdk' } ton_abi = { git = 'https://github.com/tonlabs/ton-labs-abi.git', tag = '2.2.8' } ton_block = { git = 'https://github.com/tonlabs/ton-labs-block.git', tag = '1.7.51' } -ton_block_json = { git = 'https://github.com/tonlabs/ton-labs-block-json.git', tag = '0.7.18' } -ton_executor = { default-features = false, git = 'https://github.com/tonlabs/ton-labs-executor.git', tag = '1.15.72' } +ton_block_json = { git = 'https://github.com/tonlabs/ton-labs-block-json.git', tag = '0.7.19' } +ton_executor = { default-features = false, git = 'https://github.com/tonlabs/ton-labs-executor.git', tag = '1.15.74' } ton_types = { git = 'https://github.com/tonlabs/ton-labs-types.git', tag = '1.11.2' } -ton_vm = { default-features = false, git = 'https://github.com/tonlabs/ton-labs-vm.git', tag = '1.8.38' } +ton_vm = { default-features = false, git = 'https://github.com/tonlabs/ton-labs-vm.git', tag = '1.8.39' } lockfree = { git = 'https://github.com/tonlabs/lockfree.git', package = 'lockfree' } sodalite = { features = [ 'rand' ], git = 'https://github.com/tonlabs/sodalite.git' } @@ -40,7 +40,7 @@ block-modes = '0.8.1' byteorder = '1.3.2' chacha20 = '0.6.0' chrono = '0.4.6' -crc-any = '2.2.3' +crc = '3.0' ed25519-dalek = '1.0.0' failure = '0.1' futures = '0.3.4' @@ -49,7 +49,7 @@ hmac = '0.11.0' lazy_static = '1.1.0' libsecp256k1 = '0.6.0' log = '0.4.11' -lru = '0.6.3' +lru = '0.7.1' num-bigint = '0.4' num-derive = '0.3' num-traits = '0.2' @@ -62,19 +62,17 @@ serde_derive = '1.0.91' serde_json = '1.0.41' serde_repr = '0.1.7' sha2 = '0.9.5' -tokio = { default-features = false, features = [ 'sync', 'stream', 'fs' ], version = '0.2.13' } +tiny-bip39 = '1.0.0' +tokio = { default-features = false, features = [ 'sync', 'fs' ], version = '1.4' } +tokio-stream = '0.1' zeroize = { features = [ 'zeroize_derive' ], version = '1.3' } -# TODO: remove fixed versioning when indexmap compilation issue is resolved -indexmap = '=1.6.2' -# TODO: remove fixed versioning when tiny-bip39 compilation issue is resolved -tiny-bip39 = '=0.7.3' # optional zstd = { default-features = false, optional = true, version = '0.8.0' } # optional for std -reqwest = { optional = true, version = '0.10.4' } -tokio-tungstenite = { features = [ 'tls' ], optional = true, version = '0.11.0' } +reqwest = { optional = true, version = '0.11.11' } +tokio-tungstenite = { features = [ 'native-tls' ], optional = true, version = '0.17.1' } # optional for wasm indexed_db_futures = { default-features = false, optional = true, version = '0.2.0' } @@ -105,16 +103,18 @@ features = [ [dev-dependencies] dirs = '2.0.2' graphql-parser = '0.3.0' -log4rs = '^0' -pretty_assertions = '0.6.1' +log4rs = '1.1' +pretty_assertions = '1.2' [features] default = [ 'std' ] include-zstd = [ ] std = [ - 'tokio/rt-threaded', + 'tokio/rt-multi-thread', 'tokio/macros', + 'tokio/time', + 'tokio/net', 'reqwest', 'tokio-tungstenite', 'home', diff --git a/ton_client/src/abi/errors.rs b/ton_client/src/abi/errors.rs index d20994556..518b42dbd 100644 --- a/ton_client/src/abi/errors.rs +++ b/ton_client/src/abi/errors.rs @@ -17,6 +17,7 @@ pub enum ErrorCode { InvalidFunctionId = 312, InvalidData = 313, EncodeInitialDataFailed = 314, + InvalidFunctionName = 315, } pub struct Error; @@ -118,4 +119,11 @@ impl Error { format!("Encode initial data failed: {}", err), ) } + + pub fn invalid_function_name(func_name: &str) -> ClientError { + error( + ErrorCode::InvalidFunctionName, + format!("Function {} is not found in contract ABI", func_name), + ) + } } diff --git a/ton_client/src/abi/function_id.rs b/ton_client/src/abi/function_id.rs new file mode 100644 index 000000000..64eb600bc --- /dev/null +++ b/ton_client/src/abi/function_id.rs @@ -0,0 +1,41 @@ +use crate::client::ClientContext; +use crate::error::ClientResult; +use std::sync::Arc; + +use super::{Abi, Error}; + +#[derive(Serialize, Deserialize, ApiType, Default)] +pub struct ParamsOfCalcFunctionId { + /// Contract ABI. + pub abi: Abi, + /// Contract function name + pub function_name: String, + /// If set to `true` output function ID will be returned which is used in contract response. + /// Default is `false` + pub output: Option, +} + +#[derive(Serialize, Deserialize, ApiType, Default)] +pub struct ResultOfCalcFunctionId { + /// Contract function ID + pub function_id: u32, +} + +/// Calculates contract function ID by contract ABI +#[api_function] +pub fn calc_function_id( + _context: Arc, + params: ParamsOfCalcFunctionId, +) -> ClientResult { + let abi = params.abi.abi()?; + let function = abi.function(¶ms.function_name) + .map_err(|_| Error::invalid_function_name(¶ms.function_name))?; + + let function_id = if params.output.unwrap_or_default() { + function.get_output_id() + } else { + function.get_input_id() + }; + + Ok(ResultOfCalcFunctionId { function_id }) +} diff --git a/ton_client/src/abi/mod.rs b/ton_client/src/abi/mod.rs index 70c4dbbd8..90779a18c 100644 --- a/ton_client/src/abi/mod.rs +++ b/ton_client/src/abi/mod.rs @@ -20,6 +20,7 @@ pub(crate) mod decode_message; pub(crate) mod encode_account; pub(crate) mod encode_boc; pub(crate) mod encode_message; +pub(crate) mod function_id; pub(crate) mod init_data; mod errors; @@ -49,6 +50,7 @@ pub use encode_message::{ ResultOfEncodeInternalMessage, ResultOfEncodeMessage, ResultOfEncodeMessageBody, }; pub use errors::{Error, ErrorCode}; +pub use function_id::{calc_function_id, ParamsOfCalcFunctionId, ResultOfCalcFunctionId}; pub use init_data::{ encode_initial_data, decode_initial_data, update_initial_data, ParamsOfEncodeInitialData, ParamsOfDecodeInitialData, ParamsOfUpdateInitialData, diff --git a/ton_client/src/abi/tests.rs b/ton_client/src/abi/tests.rs index fb80ab1f4..a9e25933b 100644 --- a/ton_client/src/abi/tests.rs +++ b/ton_client/src/abi/tests.rs @@ -400,7 +400,7 @@ fn test_is_empty_pubkey() -> Result<()> { Ok(()) } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_resolve_pubkey() -> Result<()> { let context = crate::ClientContext::new(crate::ClientConfig::default()).unwrap(); let tvc = base64::encode(include_bytes!("../tests/contracts/abi_v2/Hello.tvc")); @@ -445,7 +445,7 @@ async fn test_resolve_pubkey() -> Result<()> { Ok(()) } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_encode_message_pubkey() -> Result<()> { let client = TestClient::new(); let (abi, tvc) = TestClient::package(HELLO, None); @@ -570,7 +570,7 @@ fn gen_pubkey() -> ed25519_dalek::PublicKey { ed25519_dalek::Keypair::generate(&mut rand::thread_rng()).public } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_encode_internal_message() -> Result<()> { let client = TestClient::new(); let (abi, tvc) = TestClient::package(HELLO, None); @@ -685,7 +685,7 @@ async fn test_encode_internal_message() -> Result<()> { .await } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_encode_internal_message_empty_body() -> Result<()> { let client = TestClient::new(); let dst_address = @@ -1119,3 +1119,31 @@ fn test_encode_boc() { assert_eq!(boc, "te6ccgEBAQEANAAAY5/mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmAAAAAAAAAAAAAAAAACWtD4"); } + +#[test] +fn test_calc_function_id() { + let client = TestClient::new(); + let abi = TestClient::abi("GiverV2", Some(2)); + + let result: ResultOfCalcFunctionId = client.request( + "abi.calc_function_id", + ParamsOfCalcFunctionId { + abi: abi.clone(), + function_name: "getMessages".to_owned(), + ..Default::default() + }, + ).unwrap(); + + assert_eq!(result.function_id, 0x7744C7E2); + + let result: ResultOfCalcFunctionId = client.request( + "abi.calc_function_id", + ParamsOfCalcFunctionId { + abi: abi.clone(), + function_name: "getMessages".to_owned(), + output: Some(true), + }, + ).unwrap(); + + assert_eq!(result.function_id, 0xF744C7E2); +} diff --git a/ton_client/src/boc/tests.rs b/ton_client/src/boc/tests.rs index c93b8858b..dafb3eaf7 100644 --- a/ton_client/src/boc/tests.rs +++ b/ton_client/src/boc/tests.rs @@ -26,7 +26,7 @@ use std::str::FromStr; use ton_block::{MsgAddrStd, MsgAddressInt, Serializable}; use ton_types::{AccountId, BuilderData, IBitstring}; -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_encode_boc() { fn write_b(value: u8) -> BuilderOp { BuilderOp::Integer { @@ -181,7 +181,7 @@ async fn test_encode_boc() { assert_eq!(boc, response.boc); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_pinned_cache() { let client = TestClient::new(); let cache_set = client.wrap_async(cache_set, BocModule::api(), super::cache::cache_set_api()); @@ -313,7 +313,7 @@ async fn test_pinned_cache() { .unwrap(); assert_eq!(boc.boc, None); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_unpinned_cache() { let boc1 = TestClient::tvc(crate::tests::TEST_DEBOT, None); let boc2 = TestClient::tvc(crate::tests::SUBSCRIBE, None); diff --git a/ton_client/src/client/network_mock.rs b/ton_client/src/client/network_mock.rs index cc0d5dc69..6dc989443 100644 --- a/ton_client/src/client/network_mock.rs +++ b/ton_client/src/client/network_mock.rs @@ -112,18 +112,16 @@ impl NetworkMock { let (client_sender, server_receiver) = futures::channel::mpsc::channel::(10); let (mut server_sender, client_receiver) = futures::channel::mpsc::channel::>(10); - async_runtime_handle.enter(move || { - tokio::spawn(Box::pin(async move { - let _ = server_receiver; - while !messages.is_empty() { - let message = messages.remove(0); - println!("Send {}", message.message); - if let Some(delay) = message.delay { - tokio::time::delay_for(tokio::time::Duration::from_millis(delay)).await; - } - let _ = server_sender.send(Ok(message.message)).await; + async_runtime_handle.spawn(async move { + let _ = server_receiver; + while !messages.is_empty() { + let message = messages.remove(0); + println!("Send {}", message.message); + if let Some(delay) = message.delay { + tokio::time::sleep(tokio::time::Duration::from_millis(delay)).await; } - })) + let _ = server_sender.send(Ok(message.message)).await; + } }); Some(WebSocket { receiver: Box::pin(client_receiver), diff --git a/ton_client/src/client/std_client_env.rs b/ton_client/src/client/std_client_env.rs index 939cf90af..1bb8a113c 100644 --- a/ton_client/src/client/std_client_env.rs +++ b/ton_client/src/client/std_client_env.rs @@ -24,6 +24,7 @@ use reqwest::{ Client as HttpClient, ClientBuilder, Method, }; use std::collections::HashMap; +use std::convert::TryFrom; use std::path::PathBuf; use std::str::FromStr; use tokio::runtime::Runtime; @@ -40,8 +41,7 @@ lazy_static! { } fn create_runtime() -> ClientResult { - tokio::runtime::Builder::new() - .threaded_scheduler() + tokio::runtime::Builder::new_multi_thread() .enable_io() .enable_time() .build() @@ -112,14 +112,13 @@ impl ClientEnv { /// Sets timer for provided time interval pub async fn set_timer(&self, ms: u64) -> ClientResult<()> { - tokio::time::delay_for(tokio::time::Duration::from_millis(ms)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(ms)).await; Ok(()) } /// Sends asynchronous task to scheduler pub fn spawn(&self, future: impl Future + Send + 'static) { - self.async_runtime_handle - .enter(move || tokio::spawn(future)); + self.async_runtime_handle.spawn(future); } /// Executes asynchronous task blocking current thread @@ -145,20 +144,19 @@ impl ClientEnv { return Ok(ws); } } - let mut request = tokio_tungstenite::tungstenite::handshake::client::Request::builder() - .method("GET") - .uri(url); + let mut request = tokio_tungstenite::tungstenite::client::IntoClientRequest::into_client_request(url) + .map_err(|err| Error::websocket_connect_error(url, err))?; if let Some(headers) = headers { for (key, value) in headers { - request = request.header(&key, &value); + let key = tokio_tungstenite::tungstenite::http::header::HeaderName::try_from(key) + .map_err(|err| Error::websocket_connect_error(url, err))?; + let value = tokio_tungstenite::tungstenite::http::HeaderValue::try_from(value) + .map_err(|err| Error::websocket_connect_error(url, err))?; + request.headers_mut().insert(key, value); } } - let request = request - .body(()) - .map_err(|err| Error::websocket_connect_error(url, err))?; - let (client, _) = tokio_tungstenite::connect_async(request) .await .map_err(|err| Error::websocket_connect_error(url, err))?; diff --git a/ton_client/src/client/wasm_client_env.rs b/ton_client/src/client/wasm_client_env.rs index b3c1f5327..132e6456b 100644 --- a/ton_client/src/client/wasm_client_env.rs +++ b/ton_client/src/client/wasm_client_env.rs @@ -171,8 +171,8 @@ impl ClientEnv { onmessage_callback.forget(); // on_open callback to get notification when websocket is ready to use - let (mut on_open_sender, mut on_open_receiver) = tokio::sync::mpsc::channel(1); - let mut on_open_sender_copy = on_open_sender.clone(); + let (on_open_sender, mut on_open_receiver) = tokio::sync::mpsc::channel(1); + let on_open_sender_copy = on_open_sender.clone(); let onopen_callback = Closure::once(move |_: JsValue| { log::trace!("Websocket opened"); wasm_bindgen_futures::spawn_local(async move { diff --git a/ton_client/src/crypto/internal.rs b/ton_client/src/crypto/internal.rs index 4036be964..a78380d05 100644 --- a/ton_client/src/crypto/internal.rs +++ b/ton_client/src/crypto/internal.rs @@ -6,6 +6,8 @@ use sha2::Digest; use sha2::Sha512; use zeroize::Zeroize; +const XMODEM: crc::Crc = crc::Crc::::new(&crc::CRC_16_XMODEM); + #[derive(Serialize, Deserialize, Debug, PartialEq, Zeroize, ZeroizeOnDrop)] pub(crate) struct SecretString(pub String); @@ -67,9 +69,7 @@ pub(crate) fn sha256(bytes: &[u8]) -> Vec { } pub(crate) fn ton_crc16(data: &[u8]) -> u16 { - let mut crc = crc_any::CRC::crc16xmodem(); - crc.digest(data); - crc.get_crc() as u16 + XMODEM.checksum(data) } pub(crate) fn decode_public_key(string: &String) -> ClientResult { diff --git a/ton_client/src/crypto/tests.rs b/ton_client/src/crypto/tests.rs index b5e0d9054..a0ca2fcd2 100644 --- a/ton_client/src/crypto/tests.rs +++ b/ton_client/src/crypto/tests.rs @@ -756,7 +756,7 @@ fn hdkey() { ); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_signing_box() { let client = std::sync::Arc::new(TestClient::new()); let client_copy = client.clone(); @@ -951,7 +951,7 @@ async fn test_aes_params(key: &str, data: &str, encrypted: &str) { ).await.unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_aes_encryption_box() { test_aes_params( "src/crypto/test_data/aes128.key.bin", diff --git a/ton_client/src/debot/tests.rs b/ton_client/src/debot/tests.rs index ccae9cc91..cd103e755 100644 --- a/ton_client/src/debot/tests.rs +++ b/ton_client/src/debot/tests.rs @@ -807,7 +807,7 @@ async fn get_code_hash_from_tvc(client: Arc, name: &str) -> String { const EXIT_CHOICE: u8 = 9; -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_goto() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -827,7 +827,7 @@ async fn test_debot_goto() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_print() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr, keys, abi } = init_debot(client.clone()).await; @@ -849,7 +849,7 @@ async fn test_debot_print() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_runact() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -873,7 +873,7 @@ async fn test_debot_runact() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_run_method() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -895,7 +895,7 @@ async fn test_debot_run_method() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_send_msg() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -918,7 +918,7 @@ async fn test_debot_send_msg() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_invoke_debot() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -946,7 +946,7 @@ async fn test_debot_invoke_debot() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_engine_calls() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -971,7 +971,7 @@ async fn test_debot_engine_calls() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_interface_call() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot(client.clone()).await; @@ -991,7 +991,7 @@ async fn test_debot_interface_call() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_inner_interfaces() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot3(client.clone()).await; @@ -1029,7 +1029,7 @@ async fn test_debot_inner_interfaces() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_4() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr, keys, abi } = init_debot4(client.clone()).await; @@ -1082,7 +1082,7 @@ async fn test_debot_4() { } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_msg_interface() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_debot2(client.clone()).await; @@ -1123,7 +1123,7 @@ async fn test_debot_msg_interface() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_invoke_msgs() { let client = std::sync::Arc::new(TestClient::new()); let (debot1, _, abi) = init_debot_pair(client.clone(), TEST_DEBOTA, TEST_DEBOTB).await; @@ -1144,7 +1144,7 @@ async fn test_debot_invoke_msgs() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_sdk_get_accounts_by_hash() { let client = std::sync::Arc::new(TestClient::new()); let deploy_count = 8; @@ -1162,7 +1162,7 @@ async fn test_debot_sdk_get_accounts_by_hash() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_getinfo() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_hello_debot(client.clone()).await; @@ -1196,7 +1196,7 @@ async fn test_debot_getinfo() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_approve() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot6").await; @@ -1249,7 +1249,7 @@ async fn test_debot_approve() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_json_interface() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot7").await; @@ -1281,7 +1281,7 @@ async fn test_debot_json_interface() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_network_interface() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot8").await; @@ -1301,7 +1301,7 @@ async fn test_debot_network_interface() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_transaction_chain() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot9").await; @@ -1317,7 +1317,7 @@ async fn test_debot_transaction_chain() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_encryption_box() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot10").await; @@ -1336,7 +1336,7 @@ async fn test_debot_encryption_box() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_encryption_box_get_info() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot11").await; @@ -1355,7 +1355,7 @@ async fn test_debot_encryption_box_get_info() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_signing_box_get_info() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot12").await; @@ -1374,7 +1374,7 @@ async fn test_debot_signing_box_get_info() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_query() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot14").await; @@ -1392,7 +1392,7 @@ async fn test_debot_query() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_json_parse() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { @@ -1420,7 +1420,7 @@ async fn test_debot_json_parse() { .await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_target_abi() { let client = std::sync::Arc::new(TestClient::new()); let DebotData {debot_addr, target_addr: _, keys, abi} = @@ -1439,7 +1439,7 @@ async fn test_debot_target_abi() { .await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_msg_sendasync_and_waitforcollection() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot17").await; @@ -1458,7 +1458,7 @@ async fn test_debot_msg_sendasync_and_waitforcollection() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_query_query() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot18").await; @@ -1476,7 +1476,7 @@ async fn test_debot_query_query() { ).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_debot_transaction_result() { let client = std::sync::Arc::new(TestClient::new()); let DebotData { debot_addr, target_addr: _, keys, abi } = init_simple_debot(client.clone(), "testDebot19").await; diff --git a/ton_client/src/encoding.rs b/ton_client/src/encoding.rs index dbb2561c7..be0b98030 100644 --- a/ton_client/src/encoding.rs +++ b/ton_client/src/encoding.rs @@ -14,6 +14,7 @@ #![allow(dead_code)] use crate::client; +use crate::crypto::internal::ton_crc16; use crate::error::ClientResult; use std::str::FromStr; use num_bigint::BigInt; @@ -74,10 +75,9 @@ pub(crate) fn decode_std_base64(data: &str) -> ClientResult { let vec = base64::decode(&data).map_err(|err| client::Error::invalid_address(err, &data))?; // check CRC and address tag - let mut crc = crc_any::CRC::crc16xmodem(); - crc.digest(&vec[..34]); + let crc = ton_crc16(&vec[..34]).to_be_bytes(); - if crc.get_crc_vec_be() != &vec[34..36] || vec[0] & 0x3f != 0x11 { + if crc != vec[34..36] || vec[0] & 0x3f != 0x11 { return Err(client::Error::invalid_address("CRC mismatch", &data).into()); }; @@ -100,9 +100,8 @@ fn encode_base64( vec.extend_from_slice(&address.workchain_id.to_be_bytes()); vec.append(&mut address.address.get_bytestring(0)); - let mut crc = crc_any::CRC::crc16xmodem(); - crc.digest(&vec); - vec.extend_from_slice(&crc.get_crc_vec_be()); + let crc = ton_crc16(&vec); + vec.extend_from_slice(&crc.to_be_bytes()); let result = base64::encode(&vec); diff --git a/ton_client/src/json_interface/modules.rs b/ton_client/src/json_interface/modules.rs index 1201a2977..158a149c9 100644 --- a/ton_client/src/json_interface/modules.rs +++ b/ton_client/src/json_interface/modules.rs @@ -377,6 +377,10 @@ fn register_abi(handlers: &mut RuntimeHandlers) { crate::abi::encode_boc, crate::abi::encode_boc::encode_boc_api, ); + module.register_sync_fn( + crate::abi::calc_function_id, + crate::abi::function_id::calc_function_id_api, + ); module.register(); } diff --git a/ton_client/src/net/iterators/tests.rs b/ton_client/src/net/iterators/tests.rs index ca90e7af0..73daf15cc 100644 --- a/ton_client/src/net/iterators/tests.rs +++ b/ton_client/src/net/iterators/tests.rs @@ -114,7 +114,7 @@ async fn remove_iterator(client: &TestClient, iterator: u32) { .unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn block_iterator() { if TestClient::node_se() { return; @@ -165,7 +165,7 @@ async fn block_iterator() { assert_eq!(extra_ids, HashSet::default(), "Extra iterated"); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn transaction_iterator() { if TestClient::node_se() { return; diff --git a/ton_client/src/net/server_link.rs b/ton_client/src/net/server_link.rs index ae1185882..1f880faf7 100644 --- a/ton_client/src/net/server_link.rs +++ b/ton_client/src/net/server_link.rs @@ -154,13 +154,13 @@ impl NetworkState { async fn suspend(&self, sender: &watch::Sender) { if !*self.suspended.borrow() { - let _ = sender.broadcast(true); + let _ = sender.send(true); *self.query_endpoint.write().await = None; } } async fn resume(sender: &watch::Sender) { - let _ = sender.broadcast(false); + let _ = sender.send(false); } pub async fn external_suspend(&self) { @@ -339,7 +339,9 @@ impl NetworkState { pub async fn get_query_endpoint(&self) -> ClientResult> { // wait for resume let mut suspended = self.suspended.clone(); - while Some(true) == suspended.recv().await {} + while *suspended.borrow() { + let _ = suspended.changed().await; + } if let Some(endpoint) = &*self.query_endpoint.read().await { return Ok(endpoint.clone()); @@ -454,6 +456,7 @@ impl ServerLink { table, filter, fields, )) .await?; + let event_receiver = tokio_stream::wrappers::ReceiverStream::new(event_receiver); let operation_id = Arc::new(Mutex::new(0u32)); let unsubscribe_operation_id = operation_id.clone(); @@ -496,6 +499,7 @@ impl ServerLink { .websocket_link .start_operation(GraphQLQuery::with_subscription(subscription, variables)) .await?; + let event_receiver = tokio_stream::wrappers::ReceiverStream::new(event_receiver); let operation_id = Arc::new(Mutex::new(0u32)); let unsubscribe_operation_id = operation_id.clone(); diff --git a/ton_client/src/net/subscriptions.rs b/ton_client/src/net/subscriptions.rs index d81cf1aa4..4cce2a538 100644 --- a/ton_client/src/net/subscriptions.rs +++ b/ton_client/src/net/subscriptions.rs @@ -190,7 +190,7 @@ pub async fn unsubscribe( context: std::sync::Arc, params: ResultOfSubscribeCollection, ) -> ClientResult<()> { - if let Some(mut sender) = extract_subscription_handle(&context, ¶ms.handle).await { + if let Some(sender) = extract_subscription_handle(&context, ¶ms.handle).await { let _ = sender.send(SubscriptionAction::Finish).await; } Ok(()) diff --git a/ton_client/src/net/tests.rs b/ton_client/src/net/tests.rs index 8953bd067..8e00b9019 100644 --- a/ton_client/src/net/tests.rs +++ b/ton_client/src/net/tests.rs @@ -15,7 +15,7 @@ use std::collections::HashSet; use std::sync::Arc; use std::vec; -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn batch_query() { let client = TestClient::new(); @@ -56,7 +56,7 @@ async fn batch_query() { assert_eq!(batch.results.len(), 3); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn query() { let client = TestClient::new(); @@ -75,7 +75,7 @@ async fn query() { assert_eq!(version.split(".").count(), 3); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn block_signatures() { let client = TestClient::new(); @@ -94,7 +94,7 @@ async fn block_signatures() { .unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn all_accounts() { let client = TestClient::new(); @@ -115,7 +115,7 @@ async fn all_accounts() { assert!(accounts.result.len() > 0); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn aggregates() { let client = TestClient::new(); @@ -138,7 +138,7 @@ async fn aggregates() { assert!(count > 0); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn ranges() { let client = TestClient::new(); @@ -161,7 +161,7 @@ async fn ranges() { assert!(accounts.result[0]["created_at"].as_u64().unwrap() > 1562342740); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn wait_for() { let now = ton_sdk::Contract::now(); let request = tokio::spawn(async move { @@ -183,7 +183,7 @@ async fn wait_for() { assert!(transactions.result["now"].as_u64().unwrap() > now as u64); }); - tokio::time::delay_for(tokio::time::Duration::from_secs(1)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; let client = TestClient::new(); @@ -194,7 +194,7 @@ async fn wait_for() { request.await.unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn message_sending_addresses() { let client = ClientContext::new(ClientConfig { network: NetworkConfig { @@ -248,7 +248,7 @@ async fn message_sending_addresses() { assert!(a_good && e_good) } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn subscribe_for_transactions_with_addresses() { let client = TestClient::new_with_config(json!({ "network": { @@ -472,7 +472,7 @@ async fn subscribe_for_transactions_with_addresses() { .unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn subscribe_for_messages() { let messages = std::sync::Arc::new(Mutex::new(Vec::new())); let messages_copy = messages.clone(); @@ -522,7 +522,7 @@ async fn subscribe_for_messages() { .unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn find_last_shard_block() { let client = TestClient::new(); @@ -539,7 +539,7 @@ async fn find_last_shard_block() { println!("{}", block.block_id); } -// #[tokio::test(core_threads = 2)] +// #[tokio::test(flavor = "multi_thread", worker_threads = 2)] // async fn test_endpoints() { // let client = TestClient::new_with_config(json!({ // "network": { @@ -558,7 +558,7 @@ async fn find_last_shard_block() { // .unwrap(); // } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_wait_resume() { let client = std::sync::Arc::new(TestClient::new()); let client_copy = client.clone(); @@ -576,14 +576,14 @@ async fn test_wait_resume() { }); let timeout = 5000; - tokio::time::delay_for(tokio::time::Duration::from_millis(timeout)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(timeout)).await; let _: () = client.request_async("net.resume", ()).await.unwrap(); assert!(duration.await.unwrap() > timeout as u128); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_query_counterparties() { if TestClient::node_se() { return; @@ -669,7 +669,7 @@ async fn get_query_url(client: &Arc) -> String { url } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn retry_query_on_network_errors() { let client = Arc::new( ClientContext::new(ClientConfig { @@ -734,7 +734,7 @@ async fn retry_query_on_network_errors() { assert_eq!(query_block_id(&client).await, "4"); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn querying_endpoint_selection() { let client = Arc::new( ClientContext::new(ClientConfig { @@ -826,7 +826,7 @@ async fn querying_endpoint_selection() { ); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn latency_detection_with_queries() { let client = Arc::new( ClientContext::new(ClientConfig { @@ -885,7 +885,7 @@ async fn latency_detection_with_queries() { assert_eq!(get_query_url(&client).await, "b"); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn latency_detection_with_websockets() { let client = Arc::new( ClientContext::new(ClientConfig { @@ -948,7 +948,7 @@ async fn latency_detection_with_websockets() { client.get_server_link().unwrap().suspend().await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn get_endpoints() { let client = Arc::new( ClientContext::new(ClientConfig { @@ -992,7 +992,7 @@ fn collect(loaded_messages: &Vec, messages: &mut Vec, transactions } } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn transaction_tree() { let client = TestClient::new(); @@ -1090,7 +1090,7 @@ async fn transaction_tree() { assert!(has_decoded_bodies); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn order_by_fallback() { let params: ParamsOfQueryCollection = serde_json::from_str( r#" @@ -1235,7 +1235,7 @@ fn test_subscription_gql() { ); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn low_level_subscribe() { let messages = std::sync::Arc::new(Mutex::new(Vec::new())); let messages_copy = messages.clone(); @@ -1292,7 +1292,7 @@ async fn low_level_subscribe() { .unwrap(); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn query_using_ws() { let client = TestClient::new_with_config(json!({ "network": { diff --git a/ton_client/src/net/websocket_link.rs b/ton_client/src/net/websocket_link.rs index d56272e0c..e8d9f92ca 100644 --- a/ton_client/src/net/websocket_link.rs +++ b/ton_client/src/net/websocket_link.rs @@ -26,6 +26,7 @@ use std::collections::HashMap; use std::pin::Pin; use std::sync::Arc; use tokio::sync::mpsc::{channel, Receiver, Sender}; +use tokio_stream::wrappers::ReceiverStream; type WSSender = Pin + Send>>; @@ -123,9 +124,9 @@ enum Phase { pub(crate) struct LinkHandler { client_env: Arc, - action_receiver: Fuse>, + action_receiver: Fuse>, internal_action_sender: Sender, - internal_action_receiver: Fuse>, + internal_action_receiver: Fuse>, last_operation_id: u32, operations: HashMap, keep_alive: KeepAlive, @@ -145,7 +146,9 @@ impl LinkHandler { config: NetworkConfig, ) -> Sender { let (action_sender, action_receiver) = channel(10); + let action_receiver = ReceiverStream::new(action_receiver); let (internal_action_sender, internal_action_receiver) = channel(10); + let internal_action_receiver = ReceiverStream::new(internal_action_receiver); client_env.clone().spawn(Box::pin(async move { LinkHandler { client_env, @@ -431,7 +434,7 @@ impl LinkHandler { fn start_keep_alive_timer(&mut self, timeout: u64) { log::debug!("WS keep alive timer {}", timeout); - let mut sender = self.internal_action_sender.clone(); + let sender = self.internal_action_sender.clone(); self.keep_alive = KeepAlive::WaitNext { timeout }; let env = self.client_env.clone(); env.clone().spawn(Box::pin(async move { diff --git a/ton_client/src/processing/tests.rs b/ton_client/src/processing/tests.rs index e8151b5ff..b48b71c7c 100644 --- a/ton_client/src/processing/tests.rs +++ b/ton_client/src/processing/tests.rs @@ -93,7 +93,7 @@ async fn remp_enabled(client: &TestClient) -> bool { info.result["data"]["info"]["rempEnabled"].as_bool().unwrap_or_default() } -#[tokio::test(core_threads = 5)] +#[tokio::test(flavor = "multi_thread", worker_threads = 5)] async fn test_wait_message() { TestClient::init_log(); let client = TestClient::new(); @@ -184,7 +184,7 @@ async fn test_wait_message() { assert_events(&events.lock().await, remp_enabled(&client).await); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_process_message() { TestClient::init_log(); let client = TestClient::new(); @@ -308,7 +308,7 @@ async fn test_process_message() { assert_events(&events.lock().await, remp_enabled); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_error_resolving() { // skip on Evernode SE since it behaves different to real node if TestClient::node_se() { @@ -424,7 +424,7 @@ async fn test_error_resolving() { // ABI version 1 messages don't expire so previous deploy message can be processed after // increasing balance. Need to wait until message will be rejected by all validators if TestClient::abi_version() == 1 { - tokio::time::delay_for(tokio::time::Duration::from_secs(40)).await; + tokio::time::sleep(tokio::time::Duration::from_secs(40)).await; } // run before deploy @@ -493,7 +493,7 @@ async fn test_error_resolving() { } } -#[tokio::test(core_threads = 10)] +#[tokio::test(flavor = "multi_thread", worker_threads = 10)] async fn test_retries() { let client = TestClient::new_with_config(json!({ "network": { @@ -558,7 +558,7 @@ async fn test_retries() { } } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fees() { let client = TestClient::new(); let (abi, tvc) = TestClient::package(GIVER_V2, Some(2)); diff --git a/ton_client/src/processing/wait_for_transaction.rs b/ton_client/src/processing/wait_for_transaction.rs index 25f10c3b7..e3dd9e32f 100644 --- a/ton_client/src/processing/wait_for_transaction.rs +++ b/ton_client/src/processing/wait_for_transaction.rs @@ -80,10 +80,10 @@ async fn wait_by_remp + Send>( let message_id = message.cell.repr_hash().as_hex_string(); let (sender, reciever) = mpsc::channel(10); - let mut reciever = reciever.fuse(); + let mut reciever = tokio_stream::wrappers::ReceiverStream::new(reciever).fuse(); let subscription_callback = move |event: ClientResult| { - let mut sender = sender.clone(); + let sender = sender.clone(); async move { let _ = sender.send(event.map(|mut result| result.result["rempReceipts"].take())).await; } @@ -109,7 +109,7 @@ async fn wait_by_remp + Send>( Ok(result) => Some(result), Err(error) => { if params.send_events { callback(ProcessingEvent::RempError { error }).await; } - notify.notify(); + notify.notify_one(); None } }; @@ -127,7 +127,7 @@ async fn wait_by_remp + Send>( error: Error::next_remp_status_timeout() }).await; } - notify.notify(); None + notify.notify_one(); None }, fallback = fallback_fut => Some(fallback), remp_message = reciever.select_next_some() => { @@ -141,7 +141,7 @@ async fn wait_by_remp + Send>( ).await { Err(error) => { if params.send_events { callback(ProcessingEvent::RempError { error }).await;} - notify.notify(); + notify.notify_one(); None }, Ok(result) => result, diff --git a/ton_client/src/proofs/trusted_key_blocks.bin b/ton_client/src/proofs/trusted_key_blocks.bin index 1320c4e40..2f839db96 100644 Binary files a/ton_client/src/proofs/trusted_key_blocks.bin and b/ton_client/src/proofs/trusted_key_blocks.bin differ diff --git a/ton_client/src/proofs/validators.rs b/ton_client/src/proofs/validators.rs index e038094e0..f6b819f6a 100644 --- a/ton_client/src/proofs/validators.rs +++ b/ton_client/src/proofs/validators.rs @@ -137,7 +137,7 @@ pub(crate) fn check_crypto_signatures( for sign in signatures.pure_signatures() { let key = AdnlKeyId(sign.node_id_short.as_array().clone()); if let Some(vd) = validators_map.get(&key) { - if !vd.public_key.verify_signature(data, &sign.sign) { + if !vd.verify_signature(data, &sign.sign) { bail!("bad signature from validator with pub_key {}", key) } weight += vd.weight; diff --git a/ton_client/src/tests/common.rs b/ton_client/src/tests/common.rs index fb4a785ce..38bcedda9 100644 --- a/ton_client/src/tests/common.rs +++ b/ton_client/src/tests/common.rs @@ -86,7 +86,7 @@ fn test_deferred_init() { assert_eq!(result.code, crate::net::ErrorCode::QueryFailed as u32); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_clock_sync() { let client = TestClient::new_with_config(json!({ "network": { diff --git a/ton_client/src/tvm/call_tvm.rs b/ton_client/src/tvm/call_tvm.rs index f6c0f72ff..b72533062 100644 --- a/ton_client/src/tvm/call_tvm.rs +++ b/ton_client/src/tvm/call_tvm.rs @@ -20,16 +20,17 @@ use ton_block::{ Account, CommonMsgInfo, ConfigParams, CurrencyCollection, Deserializable, GlobalCapabilities, Message, MsgAddressInt, OutAction, OutActions, Serializable, }; -use ton_types::dictionary::HashmapType; -use ton_types::{Cell, SliceData, UInt256}; -use ton_vm::executor::gas::gas_state::Gas; -use ton_vm::stack::{integer::IntegerData, savelist::SaveList, Stack, StackItem}; +use ton_types::{Cell, HashmapType, SliceData, UInt256}; +use ton_vm::{ + executor::{gas::gas_state::Gas, Engine}, + stack::{integer::IntegerData, savelist::SaveList, Stack, StackItem}, +}; pub(crate) fn call_tvm( account: &mut Account, options: ResolvedExecutionOptions, stack: Stack, -) -> ClientResult { +) -> ClientResult { let code = account.get_code().unwrap_or_default(); let data = account .get_data() @@ -76,6 +77,8 @@ pub(crate) fn call_tvm( Some(gas), ); + engine.modify_behavior(options.behavior_modifiers); + match engine.execute() { Err(err) => { let exception = ton_vm::error::tvm_exception(err) @@ -171,8 +174,7 @@ fn build_contract_info( info.block_lt = block_lt; info.trans_lt = tr_lt; info.unix_time = block_unixtime; - info.balance.grams = balance.grams.as_u128().into(); - info.balance.other = balance.other_as_hashmap().into(); + info.balance = balance.clone(); if let Some(data) = config_params.config_params.data() { info.config_params = Some(data.clone()); } diff --git a/ton_client/src/tvm/run_get.rs b/ton_client/src/tvm/run_get.rs index 70bd0638c..2b619e370 100644 --- a/ton_client/src/tvm/run_get.rs +++ b/ton_client/src/tvm/run_get.rs @@ -17,6 +17,7 @@ use super::stack; use super::types::{ExecutionOptions, ResolvedExecutionOptions}; use crate::boc::internal::deserialize_object_from_boc; use crate::client::ClientContext; +use crate::crypto::internal::ton_crc16; use crate::error::ClientResult; use crate::tvm::Error; use std::sync::Arc; @@ -66,9 +67,8 @@ pub async fn run_get( return Err(Error::invalid_account_boc("Account is None")) } - let mut crc = crc_any::CRC::crc16xmodem(); - crc.digest(params.function_name.as_bytes()); - let function_id = ((crc.get_crc() as u32) & 0xffff) | 0x10000; + let crc = ton_crc16(params.function_name.as_bytes()); + let function_id = ((crc as u32) & 0xffff) | 0x10000; let mut stack_in = Stack::new(); if let Some(input) = params.input { if let Value::Array(array) = input { diff --git a/ton_client/src/tvm/run_message.rs b/ton_client/src/tvm/run_message.rs index 3939488a9..90110b88d 100644 --- a/ton_client/src/tvm/run_message.rs +++ b/ton_client/src/tvm/run_message.rs @@ -261,7 +261,7 @@ pub async fn run_executor_internal( let contract_info = move || async move { let account = deserialize_object_from_cell::(account_copy.clone(), "account")?; if let (Some(addr), Some(balance)) = (account.get_addr(), account.balance()) { - Ok((addr.clone(), balance.grams.as_u64())) + Ok((addr.clone(), balance.grams.as_u128() as u64)) } else { Ok((msg_address.clone(), 0)) } @@ -391,6 +391,7 @@ where block_unixtime: options.block_time, block_lt: options.block_lt, last_tr_lt: Arc::new(AtomicU64::new(options.transaction_lt)), + behavior_modifiers: Some(options.behavior_modifiers), ..ExecuteParams::default() }; let transaction = match executor.execute_with_libs_and_params(Some(&msg), &mut account_root, params) { diff --git a/ton_client/src/tvm/tests.rs b/ton_client/src/tvm/tests.rs index 00868a317..89fbfcdeb 100644 --- a/ton_client/src/tvm/tests.rs +++ b/ton_client/src/tvm/tests.rs @@ -16,7 +16,7 @@ use super::types::resolve_blockchain_config; use super::*; use crate::abi::{ encode_account::{ParamsOfEncodeAccount, StateInitSource}, - Abi, CallSet, DeploySet, ParamsOfEncodeMessage, ResultOfEncodeMessage, Signer, + Abi, CallSet, DeploySet, FunctionHeader, ParamsOfEncodeMessage, ResultOfEncodeMessage, Signer, }; use crate::boc::{ internal::{deserialize_object_from_base64, serialize_cell_to_base64}, @@ -38,7 +38,7 @@ const ELECTOR_ADDRESS: &str = "-1:3333333333333333333333333333333333333333333333 const ELECTOR_CODE: &str = "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"; const ELECTOR_DATA: &str = "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"; -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_execute_get() { TestClient::init_log(); let client = TestClient::new(); @@ -130,7 +130,7 @@ async fn test_execute_get() { assert_eq!(result[0][0][0], "1588268660"); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_run_executor() { let run = |client: Arc, message: ResultOfEncodeMessage, @@ -166,7 +166,7 @@ async fn test_run_executor() { test_run_message(run).await; } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_run_tvm() { let run = |client: Arc, message: ResultOfEncodeMessage, @@ -292,7 +292,7 @@ async fn test_run_message( ); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_run_account_none() { TestClient::init_log(); let client = Arc::new(TestClient::new()); @@ -332,7 +332,7 @@ async fn test_run_account_none() { assert_eq!(parsed.parsed["acc_type_name"], "Uninit"); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_run_account_uninit() { TestClient::init_log(); let client = Arc::new(TestClient::new()); @@ -388,7 +388,7 @@ async fn test_run_account_uninit() { } #[allow(dead_code)] -//#[tokio::test(core_threads = 2)] +//#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn profile_tvm() { let very_start = chrono::prelude::Utc::now().timestamp_millis(); let client = TestClient::new(); @@ -848,7 +848,7 @@ async fn test_method_error( } } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_resolve_blockchain_config() { if TestClient::node_se() { return; @@ -877,7 +877,7 @@ async fn test_resolve_blockchain_config() { assert_ne!(config.raw_config(), mainnet_config().raw_config()); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_my_code() { let client = TestClient::new(); let (abi, tvc) = TestClient::package("MyCodeFail", None); @@ -954,14 +954,18 @@ async fn test_my_code() { println!("{:?}", get_my_code); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_run_executor_fees() { let client = TestClient::new(); let (abi, tvc) = TestClient::package("Events", None); let keys = client.generate_sign_keys(); + let pubkey = Some(keys.public.clone()); + let signer = Signer::Keys { keys }; + let keys = client.generate_sign_keys(); + let bad_signer = Signer::Keys { keys }; - let signer = Signer::Keys { keys: keys.clone() }; + // use correct signature let deploy_message: ResultOfEncodeMessage = client .request_async( "abi.encode_message", @@ -1009,13 +1013,77 @@ async fn test_run_executor_fees() { })), ..Default::default() }), - signer: signer.clone(), + signer, + ..Default::default() + }, + ) + .await + .unwrap(); + + // first run - with correct signature + let return_value: ResultOfRunExecutor = client + .request_async( + "tvm.run_executor", + ParamsOfRunExecutor { + message: return_value_message.message.clone(), + account: AccountForExecutor::Account { + boc: deployed.account.clone(), + unlimited_balance: Some(true), + }, + abi: Some(abi.clone()), + ..Default::default() + }, + ) + .await + .unwrap(); + + assert_eq!(2354000, return_value.fees.ext_in_msg_fee); + assert_eq!(1166500, return_value.fees.account_fees/10); + assert_eq!(2000000, return_value.fees.total_fwd_fees); + + // use wrong signature + let return_value_message: ResultOfEncodeMessage = client + .request_async( + "abi.encode_message", + ParamsOfEncodeMessage { + abi: abi.clone(), + address: Some(deploy_message.address.clone()), + call_set: Some(CallSet { + function_name: "returnValue".into(), + header: Some(FunctionHeader { + pubkey, + ..Default::default() + }), + input: Some(json!({ + "id": "0x1" + })), + ..Default::default() + }), + signer: bad_signer, ..Default::default() }, ) .await .unwrap(); + // second run - with wrong signature + let _err = client + .request_async::<_, ResultOfRunExecutor>( + "tvm.run_executor", + ParamsOfRunExecutor { + message: return_value_message.message.clone(), + account: AccountForExecutor::Account { + boc: deployed.account.clone(), + unlimited_balance: Some(true), + }, + abi: Some(abi.clone()), + ..Default::default() + }, + ) + .await + .unwrap_err(); + + // third run - with wrong signature and with skipped signature checking let return_value: ResultOfRunExecutor = client .request_async( "tvm.run_executor", @@ -1025,6 +1093,10 @@ async fn test_run_executor_fees() { boc: deployed.account.clone(), unlimited_balance: Some(true), }, + execution_options: Some(ExecutionOptions { + chksig_always_succeed: Some(true), + ..Default::default() + }), abi: Some(abi.clone()), ..Default::default() }, diff --git a/ton_client/src/tvm/types.rs b/ton_client/src/tvm/types.rs index 0f72383d5..329422367 100644 --- a/ton_client/src/tvm/types.rs +++ b/ton_client/src/tvm/types.rs @@ -13,17 +13,19 @@ */ use super::Error; -use crate::{boc::{ - blockchain_config::{extract_config_from_block, extract_config_from_zerostate}, - internal::{deserialize_object_from_base64, deserialize_object_from_boc}, -}, net::ServerLink}; -use crate::net::ParamsOfQueryCollection; use crate::client::ClientContext; use crate::error::ClientResult; -use crate::net::{OrderBy, SortDirection}; +use crate::{ + boc::{ + blockchain_config::{extract_config_from_block, extract_config_from_zerostate}, + internal::{deserialize_object_from_base64, deserialize_object_from_boc}, + }, + net::{OrderBy, ParamsOfQueryCollection, ServerLink, SortDirection}, +}; use std::sync::Arc; use ton_block::Deserializable; use ton_executor::BlockchainConfig; +use ton_vm::executor::BehaviorModifiers; #[derive(Serialize, Deserialize, ApiType, Clone, Default)] pub struct ExecutionOptions { @@ -35,6 +37,9 @@ pub struct ExecutionOptions { pub block_lt: Option, /// transaction logical time pub transaction_lt: Option, + /// Overrides standard TVM behaviour. + /// If set to `true` then CHKSIG always will return `true`. + pub chksig_always_succeed: Option, } pub(crate) struct ResolvedExecutionOptions { @@ -42,6 +47,7 @@ pub(crate) struct ResolvedExecutionOptions { pub block_time: u32, pub block_lt: u64, pub transaction_lt: u64, + pub behavior_modifiers: BehaviorModifiers, } pub(crate) async fn blockchain_config_from_boc(context: &ClientContext, b64: &str) -> ClientResult { @@ -57,7 +63,7 @@ impl ResolvedExecutionOptions { ) -> ClientResult { let options = options.unwrap_or_default(); - let config = resolve_blockchain_config(context,options.blockchain_config).await?; + let config = resolve_blockchain_config(context, options.blockchain_config).await?; let block_lt = options .block_lt @@ -66,12 +72,16 @@ impl ResolvedExecutionOptions { let block_time = options .block_time .unwrap_or_else(|| (context.env.now_ms() / 1000) as u32); - + let behavior_modifiers = BehaviorModifiers { + chksig_always_succeed: options.chksig_always_succeed.unwrap_or(false), + ..Default::default() + }; Ok(Self { block_lt, block_time, blockchain_config: config, transaction_lt, + behavior_modifiers, }) } } diff --git a/ton_client/src/utils/tests.rs b/ton_client/src/utils/tests.rs index 2613a8b7e..114c846d1 100644 --- a/ton_client/src/utils/tests.rs +++ b/ton_client/src/utils/tests.rs @@ -9,7 +9,7 @@ use crate::json_interface::utils::{ use super::*; -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_utils() { TestClient::init_log(); let client = TestClient::new(); @@ -74,7 +74,7 @@ async fn test_utils() { assert_eq!(converted.address, hex); } -#[tokio::test(core_threads = 2)] +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_calc_storage_fee() { let client = TestClient::new(); diff --git a/ton_sdk/Cargo.toml b/ton_sdk/Cargo.toml index 338bc43b8..dd838ba3e 100644 --- a/ton_sdk/Cargo.toml +++ b/ton_sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'ton_sdk' -version = '1.34.3' +version = '1.35.0' edition = '2018' license = 'Apache-2.0' authors = [ 'TON Labs LTD ' ] @@ -8,14 +8,14 @@ authors = [ 'TON Labs LTD ' ] [dependencies] ton_abi = { git = 'https://github.com/tonlabs/ton-labs-abi.git', tag = '2.2.8' } ton_block = { git = 'https://github.com/tonlabs/ton-labs-block.git', tag = '1.7.51' } -ton_vm = { default-features = false, git = 'https://github.com/tonlabs/ton-labs-vm.git', tag = '1.8.38' } +ton_vm = { default-features = false, git = 'https://github.com/tonlabs/ton-labs-vm.git', tag = '1.8.39' } ton_types = { git = 'https://github.com/tonlabs/ton-labs-types.git', tag = '1.11.2' } api_info = { path = '../api/info' } api_derive = { path = '../api/derive' } num-bigint = '0.4' -sha2 = '0.8' +sha2 = '0.9' serde_json = '1.0.41' serde = '1.0.91' serde_derive = '1.0.91' @@ -24,7 +24,6 @@ ed25519-dalek = '1.0.0' lazy_static = '1.1.0' base64 = '0.10.0' chrono = '0.4.9' -crc-any = '2.2.3' failure = '0.1' num-traits = '0.2' log = '0.4.11' diff --git a/toncli/Cargo.toml b/toncli/Cargo.toml index 8ce29ca29..7156646f5 100644 --- a/toncli/Cargo.toml +++ b/toncli/Cargo.toml @@ -9,7 +9,7 @@ license = 'Apache-2.0' name = 'toncli' readme = 'README.md' repository = 'https://github.com/tonlabs/ever-sdk' -version = '1.34.3' +version = '1.35.0' [dependencies] base64 = '0.13.0' diff --git a/tools/api.json b/tools/api.json index 4be8e1e4f..28071e1bc 100644 --- a/tools/api.json +++ b/tools/api.json @@ -1,5 +1,5 @@ { - "version": "1.34.3", + "version": "1.35.0", "modules": [ { "name": "client", @@ -5374,6 +5374,13 @@ "value": "314", "summary": null, "description": null + }, + { + "name": "InvalidFunctionName", + "type": "Number", + "value": "315", + "summary": null, + "description": null } ], "summary": null, @@ -6950,6 +6957,52 @@ ], "summary": null, "description": null + }, + { + "name": "ParamsOfCalcFunctionId", + "type": "Struct", + "struct_fields": [ + { + "name": "abi", + "type": "Ref", + "ref_name": "abi.Abi", + "summary": "Contract ABI.", + "description": null + }, + { + "name": "function_name", + "type": "String", + "summary": "Contract function name", + "description": null + }, + { + "name": "output", + "type": "Optional", + "optional_inner": { + "type": "Boolean" + }, + "summary": "If set to `true` output function ID will be returned which is used in contract response. Default is `false`", + "description": null + } + ], + "summary": null, + "description": null + }, + { + "name": "ResultOfCalcFunctionId", + "type": "Struct", + "struct_fields": [ + { + "name": "function_id", + "type": "Number", + "number_type": "UInt", + "number_size": 32, + "summary": "Contract function ID", + "description": null + } + ], + "summary": null, + "description": null } ], "functions": [ @@ -7484,6 +7537,44 @@ ] }, "errors": null + }, + { + "name": "calc_function_id", + "summary": "Calculates contract function ID by contract ABI", + "description": null, + "params": [ + { + "name": "_context", + "type": "Generic", + "generic_name": "Arc", + "generic_args": [ + { + "type": "Ref", + "ref_name": "ClientContext" + } + ], + "summary": null, + "description": null + }, + { + "name": "params", + "type": "Ref", + "ref_name": "abi.ParamsOfCalcFunctionId", + "summary": null, + "description": null + } + ], + "result": { + "type": "Generic", + "generic_name": "ClientResult", + "generic_args": [ + { + "type": "Ref", + "ref_name": "abi.ResultOfCalcFunctionId" + } + ] + }, + "errors": null } ] }, @@ -10512,6 +10603,15 @@ }, "summary": "transaction logical time", "description": null + }, + { + "name": "chksig_always_succeed", + "type": "Optional", + "optional_inner": { + "type": "Boolean" + }, + "summary": "Overrides standard TVM behaviour. If set to `true` then CHKSIG always will return `true`.", + "description": null } ], "summary": null, diff --git a/tools/update_trusted_blocks/Cargo.toml b/tools/update_trusted_blocks/Cargo.toml index cb65fdfd8..7a66a064d 100644 --- a/tools/update_trusted_blocks/Cargo.toml +++ b/tools/update_trusted_blocks/Cargo.toml @@ -9,6 +9,6 @@ failure = '0.1.8' serde = '1.0.130' serde_derive = '1.0.130' serde_json = '1.0.68' -tokio = { default-features = false, features = [ 'sync', 'stream', 'fs' ], version = '0.2.13' } +tokio = { default-features = false, features = [ 'sync', 'fs' ], version = '1' } ton_client = { path = '../../ton_client' } ton_types = { git = 'https://github.com/tonlabs/ton-labs-types.git', tag = '1.11.2' }