From 535e62c9c59c6688120f927f52969c4be99d7ce6 Mon Sep 17 00:00:00 2001 From: Mohsen <56779182+mrtnetwork@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:36:42 +0330 Subject: [PATCH] New Feature Added Web3 support for Ton blockchain Supported Ton W5 wallet contract --- .DS_Store | Bin 14340 -> 14340 bytes mrt_native_support/lib/io/webview.dart | 2 +- .../models/events/models/wallet_event.dart | 2 +- .../lib/platform_interface.dart | 1 + .../lib/web/api/chrome/api/core.dart | 4 +- mrt_native_support/lib/web/api/core/js.dart | 1 + .../lib/web/api/window/window.dart | 7 +- .../lib/web/mrt_native_web.dart | 5 - .../web/storage/safe_storage/safestorage.dart | 10 +- .../web/storage/storage/chrome_storage.dart | 2 +- .../macos/Classes/NativeView/WebKit.swift | 14 +- mrt_wallet/assets/wasm/crypto.mjs | 113 +- mrt_wallet/assets/wasm/crypto.wasm | Bin 1246568 -> 1245384 bytes mrt_wallet/assets/webview/script.js | 9857 ++++++++++++----- mrt_wallet/{extentions => extensions}/bn.js | 0 .../chrome_manifest.json | 0 .../{extentions => extensions}/index.html | 0 .../mozila_manifest.json | 0 .../{extentions => extensions}/popup.html | 0 .../{extentions => extensions}/tron_web.js | 0 mrt_wallet/js/background.dart | 81 +- mrt_wallet/js/content.dart | 49 +- .../js/js_wallet/constant/constant.dart | 2 +- .../js/js_wallet/models/models/completer.dart | 16 +- .../js/js_wallet/models/models/exception.dart | 4 +- .../js/js_wallet/models/models/mrt.dart | 33 +- .../js/js_wallet/models/models/networks.dart | 1 + .../models/models/networks/ethereum.dart | 118 +- .../models/models/networks/solana.dart | 151 +- .../js_wallet/models/models/networks/ton.dart | 268 + .../models/models/networks/tron.dart | 164 +- .../js/js_wallet/models/models/requests.dart | 486 +- .../page_script/controller/controller.dart | 94 +- .../page_script/core/controller.dart | 76 +- .../js_wallet/page_script/networks/eth.dart | 72 +- .../page_script/networks/solana.dart | 321 +- .../js_wallet/page_script/networks/ton.dart | 94 + .../js_wallet/page_script/networks/tron.dart | 143 +- .../js/js_wallet/page_script/scripts.dart | 4 +- mrt_wallet/js/js_wallet/utils/utils.dart | 2 +- .../utils/{promise.dart => extensions.dart} | 4 + .../js/js_wallet/utils/utils/utils.dart | 36 +- .../wallet/core/network_handler.dart | 42 +- .../js/js_wallet/wallet/core/wallet.dart | 197 +- .../wallet/{extention.dart => extension.dart} | 31 +- .../js_wallet/wallet/networks/ethereum.dart | 221 +- .../js/js_wallet/wallet/networks/solana.dart | 231 +- .../js/js_wallet/wallet/networks/ton.dart | 302 + .../js/js_wallet/wallet/networks/tron.dart | 161 +- mrt_wallet/js/page.dart | 28 +- mrt_wallet/js/webview.dart | 1 - mrt_wallet/lib/app/constant/global/app.dart | 3 + mrt_wallet/lib/app/constant/global/link.dart | 2 + mrt_wallet/lib/app/dev/logging.dart | 4 +- mrt_wallet/lib/app/file/cross/web.dart | 8 +- .../lib/app/localization/localization.dart | 81 +- mrt_wallet/lib/app/models/models/typedef.dart | 2 +- .../list/{extention.dart => extension.dart} | 0 mrt_wallet/lib/app/utils/utils.dart | 2 +- mrt_wallet/lib/crypto/coins/coins.dart | 2 +- .../{extention.dart => extension.dart} | 0 .../lib/crypto/isolate/cross/web/browser.dart | 11 +- .../wallet/requests/personal_sign.dart | 13 - mrt_wallet/lib/crypto/utils/ton/ton.dart | 154 +- mrt_wallet/lib/future/router/page_router.dart | 5 + .../app_extensions}/bool.dart | 2 +- .../app_extensions}/color.dart | 0 .../app_extensions}/context.dart | 0 .../app_extensions}/date_time.dart | 0 .../app_extensions}/double.dart | 0 .../app_extensions}/state_key.dart | 0 .../app_extensions}/string.dart | 0 .../state_managment/extension/extension.dart | 7 + .../state_managment/extention/extention.dart | 7 - .../state_managment/state_managment.dart | 4 +- mrt_wallet/lib/future/theme/theme.dart | 2 +- .../lib/future/wallet/account/account.dart | 1 - .../controller/impl/extention_wallet.dart | 26 +- .../wallet/controller/wallet/cross/web.dart | 2 +- .../wallet/controller/wallet/ui_wallet.dart | 4 +- .../global/address_derivation/generic.dart | 2 +- .../global/pages/add_to_contact_list.dart | 2 +- .../wallet/global/pages/address_details.dart | 2 +- .../wallet/global/pages/bip32_derivation.dart | 2 +- .../global/pages/byron_legacy_derivation.dart | 2 +- .../global/pages/receipt_address_view.dart | 2 +- .../wallet/global/pages/show_public_key.dart | 2 +- .../wallet/global/pages/switch_network.dart | 4 +- .../wallet/global/pages/token_details.dart | 2 +- .../global/pages/token_details_view.dart | 16 +- .../global/pages/transaction_amount.dart | 24 +- .../global/pages/wallet_signing_password.dart | 280 +- .../wallet/network/bch/account/account.dart | 2 +- .../bch/token/pages/cash_token_info.dart | 2 +- .../transaction/build_transaction.dart | 2 +- .../network/bitcoin/account/account.dart | 2 +- .../transaction/pages/build_transaction.dart | 2 +- .../ordering/transaction_ordering_view.dart | 2 +- .../bitcoin/transaction/pages/utxo_view.dart | 2 +- .../import_electrum_provider.dart | 2 +- .../network/cardano/account/account.dart | 2 +- .../transaction/controller/impl/fee_impl.dart | 2 +- .../controller/impl/signer_impl.dart | 2 +- .../cardano/transaction/pages/asset_info.dart | 2 +- .../transaction/pages/send_transaction.dart | 2 +- .../cardano/transaction/pages/utxo_view.dart | 2 +- .../controller/impl/conditions.dart | 2 +- .../transaction/controller/impl/signer.dart | 2 +- .../cosmos/transaction/pages/transfer.dart | 2 +- .../ethereum/account/pages/account.dart | 2 +- .../ethereum/network/pages/import.dart | 2 +- .../wallet/network/ethereum/token/import.dart | 2 +- .../transaction/controller/impl/fee_impl.dart | 2 +- .../ethereum/transaction/pages/gas_fee.dart | 2 +- .../ethereum/transaction/pages/transfer.dart | 2 +- .../web3/controller/controller/global.dart | 20 +- .../network/ethereum/web3/pages/fields.dart | 2 +- .../{ => fields}/add_ethereum_chains.dart | 23 +- .../web3/pages/fields/request_accounts.dart | 89 +- .../web3/pages/fields/typded_data_sign.dart | 1 - .../permission/ethereum_permission_view.dart | 132 +- .../network/forms/core/validator/field.dart | 2 + .../forms/cosmos/forms/transfer/transfer.dart | 2 +- .../ethereum/forms/transfer/transfer.dart | 2 +- .../forms/web3/request_account_validator.dart | 70 +- .../ripple/forms/account_set/account_set.dart | 2 +- .../forms/escrow/forms/escrow_cancel.dart | 2 +- .../forms/escrow/forms/escrow_create.dart | 2 +- .../forms/escrow/forms/escrow_finish.dart | 2 +- .../ripple/forms/nft/forms/accept_offer.dart | 2 +- .../ripple/forms/nft/forms/burn_token.dart | 2 +- .../ripple/forms/nft/forms/cancel_offer.dart | 2 +- .../ripple/forms/nft/forms/create_offer.dart | 2 +- .../ripple/forms/nft/forms/mint_token.dart | 2 +- .../forms/ripple/forms/payment/payment.dart | 2 +- .../ripple/forms/regular_key/regular_key.dart | 2 +- .../ripple/forms/signer_list/signer_list.dart | 2 +- .../ripple/forms/trust_set/trust_set.dart | 2 +- .../solana/forms/transfer/create_account.dart | 2 +- ...te_associated_token_account_validator.dart | 2 +- .../forms/transfer/initialize_mint.dart | 2 +- .../forms/solana/forms/transfer/mint_to.dart | 2 +- .../forms/solana/forms/transfer/transfer.dart | 2 +- .../forms/web3/forms/requst_account.dart | 72 +- .../forms/web3/forms/send_transaction.dart | 23 +- .../solana/forms/web3/forms/sign_message.dart | 21 + .../network/forms/solana/forms/web3/web3.dart | 1 + .../forms/substrate/transfer/transfer.dart | 2 +- .../network/forms/ton/forms/core/ton.dart | 25 +- .../wallet/network/forms/ton/forms/forms.dart | 1 + .../forms/ton/forms/transfer/transfer.dart | 2 +- .../ton/forms/web3/forms/read_only_forms.dart | 14 + .../ton/forms/web3/forms/requst_account.dart | 109 + .../forms/web3/forms/send_transaction.dart | 69 + .../ton/forms/web3/forms/sign_message.dart | 21 + .../network/forms/ton/forms/web3/web3.dart | 4 + .../forms/account/forms/update_account.dart | 2 +- .../forms/update_account_permission.dart | 2 +- .../resource_v2/forms/delegated_resource.dart | 2 +- .../resource_v2/forms/freez_balance_v2.dart | 2 +- .../forms/undelegated_resource.dart | 2 +- .../resource_v2/forms/unfreez_balance_v2.dart | 2 +- .../forms/tron/forms/transfer/transfer.dart | 2 +- .../forms/vote_sr/forms/create_witness.dart | 2 +- .../tron/forms/web3/forms/requst_account.dart | 78 +- .../network/ripple/account/account.dart | 2 +- .../settings/pages/ripple_feature_page.dart | 2 +- .../transaction/controller/controller.dart | 2 +- .../impl/sign_transaction_impl.dart | 2 +- .../pages/pages/account_set_fields.dart | 2 +- .../pages/pages/create_ripple_memo.dart | 2 +- .../ripple/transaction/pages/pages/memo.dart | 2 +- .../pages/pages/payment_fields.dart | 2 +- .../pages/pages/ripple_memo_fee.dart | 2 +- .../transaction/pages/pages/transfer.dart | 2 +- .../network/ripple/widgets/nft_info.dart | 2 +- .../network/solana/account/account.dart | 2 +- .../wallet/network/solana/network/update.dart | 2 +- .../solana/token/account_spl_tokens_view.dart | 2 +- .../controller/imp/signer_impl.dart | 2 +- .../transaction/pages/pages/transfer.dart | 2 +- .../web3/controller/controller/global.dart | 41 +- .../controller/controller/transaction.dart | 79 +- .../solana/web3/controller/impl/impl.dart | 10 +- .../network/solana/web3/pages/fields.dart | 10 +- .../web3/pages/fields/request_account.dart | 81 +- .../web3/pages/fields/sign_message.dart | 102 + .../web3/pages/fields/sign_message_v2.dart | 62 - .../network/solana/web3/pages/global.dart | 4 +- .../solana/web3/pages/transaction.dart | 103 +- .../solana/web3/permission/permission.dart | 135 +- .../controller/impl/signer_impl.dart | 2 +- .../transaction/pages/pages/fee_info.dart | 2 +- .../transaction/pages/pages/memo.dart | 2 +- .../transaction/pages/pages/transfer.dart | 2 +- .../wallet/network/ton/account/account.dart | 6 +- .../wallet/network/ton/address/address.dart | 137 +- .../ton/setting/generate_ton_mnemonic.dart | 4 +- .../network/ton/setting/ton_setting_page.dart | 4 +- .../network/ton/token/import_jettons.dart | 72 +- .../lib/future/wallet/network/ton/ton.dart | 1 + .../controller/controller/controller.dart | 2 +- .../transaction/controller/impl/fee_impl.dart | 10 +- .../controller/impl/signer_impl.dart | 63 +- .../controller/impl/transaction_impl.dart | 2 +- .../ton/transaction/pages/pages/fee.dart | 2 +- .../pages/pages/message_settings.dart | 7 +- .../transaction/pages/pages/token_list.dart | 2 +- .../transaction/pages/pages/transaction.dart | 11 +- .../ton/transaction/pages/pages/transfer.dart | 4 +- .../ton/web3/controller/controller.dart | 2 + .../web3/controller/controller/global.dart | 81 + .../controller/controller/transaction.dart | 122 + .../ton/web3/controller/impl/impl.dart | 50 + .../wallet/network/ton/web3/pages/fields.dart | 29 + .../web3/pages/fields/request_account.dart | 119 + .../ton/web3/pages/fields/sign_message.dart | 102 + .../wallet/network/ton/web3/pages/global.dart | 51 + .../network/ton/web3/pages/transaction.dart | 257 + .../ton/web3/permission/permission.dart | 73 + .../future/wallet/network/ton/web3/web3.dart | 3 + .../network/tron/token/pages/token.dart | 2 +- .../tron/transaction/account/account.dart | 2 +- .../controller/impl/network_impl.dart | 2 +- .../controller/impl/signer_impl.dart | 2 +- .../pages/pages/create_witness.dart | 2 +- .../pages/pages/delegated_resource.dart | 2 +- .../pages/pages/frozen_balance_v2.dart | 2 +- .../pages/pages/tron_fee_details_view.dart | 16 +- .../pages/pages/tron_transfer_field_view.dart | 2 +- .../pages/pages/undelegated_resource.dart | 2 +- .../pages/pages/unfreez_balance_v2.dart | 2 +- .../pages/pages/update_account.dart | 2 +- .../update_account_permission_feilds.dart | 2 +- .../web3/controller/controller/global.dart | 4 + .../controller/controller/transaction.dart | 30 +- .../web3/pages/fields/request_account.dart | 94 +- .../network/tron/web3/pages/transaction.dart | 2 +- .../tron/web3/permission/permission.dart | 149 +- .../security/pages/password_checker.dart | 13 +- .../future/wallet/setting/color_selector.dart | 2 +- .../lib/future/wallet/setting/setting.dart | 2 +- .../wallet/setup/pages/mnemonic_view.dart | 2 +- .../lib/future/wallet/start/pages/about.dart | 2 +- .../start/pages/account_not_adress.dart | 13 +- .../lib/future/wallet/start/pages/appbar.dart | 2 +- .../lib/future/wallet/start/pages/client.dart | 2 +- .../future/wallet/start/pages/menu_bar.dart | 2 +- .../pages/platform_widgets/platforms/io.dart | 2 +- .../pages/platform_widgets/platforms/web.dart | 13 +- .../wallet/web3/pages/appbar_action.dart | 5 +- .../wallet/web3/pages/chain_permission.dart | 205 +- .../wallet/web3/pages/page_progress.dart | 8 +- .../wallet/web3/pages/permission_view.dart | 324 +- .../wallet/web3/pages/view_controller.dart | 18 +- .../controller/controller/controller.dart | 72 +- .../controller/controller/tab_handler.dart | 14 +- .../future/wallet/webview/pages/web_view.dart | 17 +- .../wallet/webview/view/native_view.dart | 10 +- .../widgets/account_token_list_view.dart | 2 +- .../future/widgets/widgets/assets_image.dart | 2 +- .../widgets/barcode/widgets/barcode_icon.dart | 2 +- .../future/widgets/widgets/bottom_sheet.dart | 12 +- .../widgets/widgets/constraints_box_view.dart | 5 +- .../widgets/container_with_border.dart | 2 +- .../widgets/widgets/copy_icon_widget.dart | 2 +- .../widgets/widgets/custom_spinner.dart | 2 +- .../widgets/widgets/drop_down_button.dart | 16 +- .../widgets/widgets/empty_sliver_widget.dart | 2 +- .../widgets/widgets/error_text_container.dart | 2 +- .../future/widgets/widgets/launch_icon.dart | 2 +- .../lib/future/widgets/widgets/list_tile.dart | 34 +- .../future/widgets/widgets/material_page.dart | 2 +- .../future/widgets/widgets/number_field.dart | 4 + .../widgets/widgets/page_title_subtitle.dart | 7 +- .../widgets/widgets/secure_content_view.dart | 2 +- .../widgets/widgets/selectable_widget.dart | 2 +- .../widgets/widgets/status_icon_widget.dart | 2 +- .../future/widgets/widgets/text_and_link.dart | 2 +- .../future/widgets/widgets/view_padding.dart | 2 +- .../widgets/widgets/widget_constant.dart | 1 + mrt_wallet/lib/main.dart | 9 +- .../api/client/networks/solana/solana.dart | 18 +- .../api/client/networks/ton/client/ton.dart | 207 +- .../wallet/api/services/impl/http/http.dart | 6 +- .../lib/wallet/constant/networks/ton.dart | 6 +- .../lib/wallet/constant/tags/constant.dart | 6 + .../address/creation_params/networks/ton.dart | 39 +- .../chain/address/networks/ton/ton.dart | 75 +- .../wallet/models/chain/chain/core/chain.dart | 4 +- .../models/chain/chain/neworks/ton.dart | 25 +- .../models/network/core/params/params.dart | 2 +- .../lib/wallet/models/network/params/ton.dart | 3 +- .../solana/models/web3_transaction_info.dart | 63 +- .../networks/ton/models/account_context.dart | 363 + .../models/networks/ton/models/chain_id.dart | 15 + .../ton/models/message_body_type.dart | 53 - .../ton/models/transaction_output.dart | 3 +- .../ton/models/web3_transaction_info.dart | 385 + .../lib/wallet/models/networks/ton/ton.dart | 3 +- .../tron/models/account_resource_info.dart | 2 + .../models/networks/tron/models/tron_fee.dart | 2 +- .../{ethereum_web3.dart => ethereum.dart} | 5 +- .../provider/controller/networks/ton.dart | 11 + .../networks/{tron_web3.dart => tron.dart} | 0 .../controller/wallet_controller.dart | 1 + .../lib/wallet/provider/controller/web3.dart | 53 +- .../lib/wallet/provider/wallet_provider.dart | 6 +- .../web3/constant/constant/exception.dart | 51 +- .../wallet/web3/constant/constant/web3.dart | 1 + .../wallet/web3/core/exception/exception.dart | 7 +- .../core/messages/models/models/chain.dart | 22 +- .../messages/models/models/exception.dart | 19 +- .../core/messages/models/models/response.dart | 24 + .../models/models/wallet_response.dart | 30 +- .../web3/core/messages/types/message.dart | 8 +- .../lib/wallet/web3/core/methods/methods.dart | 3 + .../core/permission/models/authenticated.dart | 26 +- .../web3/core/permission/types/account.dart | 11 +- .../web3/core/permission/types/chain.dart | 13 +- .../lib/wallet/web3/core/request/params.dart | 13 + .../wallet/web3/core/request/permission.dart | 1 - .../web3/models/models/client_info.dart | 2 +- .../networks/ethereum/constant/constant.dart | 2 - .../networks/ethereum/methods/methods.dart | 2 +- .../ethereum/params/core/request.dart | 6 +- .../ethereum/permission/models/account.dart | 7 - .../permission/models/permission.dart | 47 +- .../web3/networks/global/methods/methods.dart | 2 +- .../solana/constant/constants/constant.dart | 13 +- .../solana/constant/constants/exception.dart | 10 +- .../web3/networks/solana/methods/methods.dart | 19 +- .../networks/solana/params/core/request.dart | 11 +- .../solana/params/models/sign_message.dart | 34 +- .../solana/params/models/transaction.dart | 38 +- .../solana/permission/models/account.dart | 11 +- .../solana/permission/models/permission.dart | 46 +- .../web3/networks/ton/constant/constant.dart | 2 + .../ton/constant/constants/constant.dart | 16 + .../ton/constant/constants/exception.dart | 8 + .../web3/networks/ton/methods/methods.dart | 39 + .../networks/ton/params/core/request.dart | 103 + .../ton/params/models/request_account.dart | 51 + .../ton/params/models/sign_message.dart | 95 + .../ton/params/models/transaction.dart | 179 + .../web3/networks/ton/params/params.dart | 4 + .../ton/permission/models/account.dart | 59 + .../ton/permission/models/permission.dart | 113 + .../networks/ton/permission/permission.dart | 2 + .../lib/wallet/web3/networks/ton/ton.dart | 5 + .../tron/constant/constants/constant.dart | 8 +- .../web3/networks/tron/methods/methods.dart | 2 +- .../networks/tron/params/core/request.dart | 8 +- .../tron/permission/models/account.dart | 7 - .../tron/permission/models/permission.dart | 46 +- .../web3/validator/web3_validator_utils.dart | 104 +- .../macos/Runner/MainFlutterWindow.swift | 2 +- mrt_wallet/pubspec.lock | 12 +- mrt_wallet/pubspec.yaml | 6 +- mrt_wallet/web/index.html | 37 +- mrt_wallet/web/manifest.json | 80 +- mrt_wallet/web_builder.dart | 43 +- 362 files changed, 14547 insertions(+), 6383 deletions(-) rename mrt_wallet/{extentions => extensions}/bn.js (100%) rename mrt_wallet/{extentions => extensions}/chrome_manifest.json (100%) rename mrt_wallet/{extentions => extensions}/index.html (100%) rename mrt_wallet/{extentions => extensions}/mozila_manifest.json (100%) rename mrt_wallet/{extentions => extensions}/popup.html (100%) rename mrt_wallet/{extentions => extensions}/tron_web.js (100%) create mode 100644 mrt_wallet/js/js_wallet/models/models/networks/ton.dart create mode 100644 mrt_wallet/js/js_wallet/page_script/networks/ton.dart rename mrt_wallet/js/js_wallet/utils/utils/{promise.dart => extensions.dart} (88%) rename mrt_wallet/js/js_wallet/wallet/{extention.dart => extension.dart} (84%) create mode 100644 mrt_wallet/js/js_wallet/wallet/networks/ton.dart rename mrt_wallet/lib/app/utils/list/{extention.dart => extension.dart} (100%) rename mrt_wallet/lib/crypto/coins/serialization/{extention.dart => extension.dart} (100%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/bool.dart (57%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/color.dart (100%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/context.dart (100%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/date_time.dart (100%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/double.dart (100%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/state_key.dart (100%) rename mrt_wallet/lib/future/state_managment/{extention/app_extentions => extension/app_extensions}/string.dart (100%) create mode 100644 mrt_wallet/lib/future/state_managment/extension/extension.dart delete mode 100644 mrt_wallet/lib/future/state_managment/extention/extention.dart rename mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/{ => fields}/add_ethereum_chains.dart (54%) create mode 100644 mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/sign_message.dart create mode 100644 mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/read_only_forms.dart create mode 100644 mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/requst_account.dart create mode 100644 mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/send_transaction.dart create mode 100644 mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/sign_message.dart create mode 100644 mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/web3.dart create mode 100644 mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message.dart delete mode 100644 mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message_v2.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/global.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/transaction.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/controller/impl/impl.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/request_account.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/sign_message.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/pages/global.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/pages/transaction.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/permission/permission.dart create mode 100644 mrt_wallet/lib/future/wallet/network/ton/web3/web3.dart create mode 100644 mrt_wallet/lib/wallet/models/networks/ton/models/account_context.dart create mode 100644 mrt_wallet/lib/wallet/models/networks/ton/models/chain_id.dart delete mode 100644 mrt_wallet/lib/wallet/models/networks/ton/models/message_body_type.dart create mode 100644 mrt_wallet/lib/wallet/models/networks/ton/models/web3_transaction_info.dart rename mrt_wallet/lib/wallet/provider/controller/networks/{ethereum_web3.dart => ethereum.dart} (85%) create mode 100644 mrt_wallet/lib/wallet/provider/controller/networks/ton.dart rename mrt_wallet/lib/wallet/provider/controller/networks/{tron_web3.dart => tron.dart} (100%) create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/constant/constant.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/constant.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/exception.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/methods/methods.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/params/core/request.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/params/models/request_account.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/params/models/sign_message.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/params/models/transaction.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/params/params.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/permission/models/account.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/permission/models/permission.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/permission/permission.dart create mode 100644 mrt_wallet/lib/wallet/web3/networks/ton/ton.dart diff --git a/.DS_Store b/.DS_Store index 8b06234ff05d4d8293e21a312d40c279740b1b1d..d83c011cbf3d473f49832fd229fa7fb4a365f5b3 100644 GIT binary patch delta 23 ecmZoEXeromT!Y=rTt~s!(s+`h&1NpmUwi;$ZU@8w delta 16 XcmZoEXeromTx0T21?SCNn!oq}L#_v9 diff --git a/mrt_native_support/lib/io/webview.dart b/mrt_native_support/lib/io/webview.dart index 6875ba29..ea4ac3bc 100644 --- a/mrt_native_support/lib/io/webview.dart +++ b/mrt_native_support/lib/io/webview.dart @@ -26,7 +26,7 @@ class WebViewIoInterface implements PlatformWebView { Future _methodCallHandler(Map args) async { if (args['type'] == "log") { - print('\x1B[33m${args['data']}\x1B[0m'); + print('console: \x1B[33m${args['data']}\x1B[0m'); return; } if (args["eventName"] == null) return; diff --git a/mrt_native_support/lib/models/events/models/wallet_event.dart b/mrt_native_support/lib/models/events/models/wallet_event.dart index 95942a89..8bf849d1 100644 --- a/mrt_native_support/lib/models/events/models/wallet_event.dart +++ b/mrt_native_support/lib/models/events/models/wallet_event.dart @@ -8,7 +8,7 @@ enum WalletEventTypes { ping, popup, windowId, - openExtention; + openExtension; static WalletEventTypes fromName(String name) { return values.firstWhere((e) => e.name == name, diff --git a/mrt_native_support/lib/platform_interface.dart b/mrt_native_support/lib/platform_interface.dart index 8f7cbd1b..bfc49718 100644 --- a/mrt_native_support/lib/platform_interface.dart +++ b/mrt_native_support/lib/platform_interface.dart @@ -11,6 +11,7 @@ class PlatformInterface { static AppPlatform get appPlatform => instance.platform; static bool get isWindows => appPlatform == AppPlatform.windows; static bool get isWeb => appPlatform == AppPlatform.web; + static bool get isMacos => appPlatform == AppPlatform.macos; static PlatformWebView get webViewController => instance.webView; static bool get supportWebView => webViewController.supported; } diff --git a/mrt_native_support/lib/web/api/chrome/api/core.dart b/mrt_native_support/lib/web/api/chrome/api/core.dart index c99220ae..dd1cff6e 100644 --- a/mrt_native_support/lib/web/api/chrome/api/core.dart +++ b/mrt_native_support/lib/web/api/chrome/api/core.dart @@ -39,13 +39,13 @@ external Browser get _browser; @JS("browser") external Browser? get _browserNullabe; -ChromeAPI get extention { +ChromeAPI get extension { if (_chromeNullabe != null) { return _chrome; } return _browser; } -bool get isExtention => +bool get isExtension => _chromeNullabe?.runtimeNullable?.idNullabe != null || _browserNullabe?.runtimeNullable?.idNullabe != null; diff --git a/mrt_native_support/lib/web/api/core/js.dart b/mrt_native_support/lib/web/api/core/js.dart index 13a201cc..e3ee1c3e 100644 --- a/mrt_native_support/lib/web/api/core/js.dart +++ b/mrt_native_support/lib/web/api/core/js.dart @@ -12,4 +12,5 @@ extension type MRTJsObject(JSObject _) implements JSObject { external static JSAny keys(JSAny? val); external static JSAny entries(JSAny? val); external bool hasOwnProperty(String nameOrSymbol); + external static bool hasOwn(JSAny? obj, String prop); } diff --git a/mrt_native_support/lib/web/api/window/window.dart b/mrt_native_support/lib/web/api/window/window.dart index f04b41ab..20d223fc 100644 --- a/mrt_native_support/lib/web/api/window/window.dart +++ b/mrt_native_support/lib/web/api/window/window.dart @@ -332,12 +332,11 @@ extension type CustomEvent._(JSObject _) implements WebEvent { external factory CustomEvent(String? type, EventInit? options); factory CustomEvent.create( {required String? type, - required List data, + required JSAny? eventData, bool bubbles = true, bool cancelable = false, bool clone = false}) { - JSAny? eventData = data.jsify(); - if (clone && isExtention && cloneInto != null) { + if (clone && isExtension && cloneInto != null) { eventData = _cloneInto(eventData, jsWindow.document.defaultView); } @@ -363,4 +362,6 @@ extension type JSConsole._(JSObject _) implements JSObject { external void debug(String? text); external void info(String? text); external void error(String? text); + @JS("error") + external void errorObject(JSAny? obj); } diff --git a/mrt_native_support/lib/web/mrt_native_web.dart b/mrt_native_support/lib/web/mrt_native_web.dart index 19f060b2..6d9676bd 100644 --- a/mrt_native_support/lib/web/mrt_native_web.dart +++ b/mrt_native_support/lib/web/mrt_native_web.dart @@ -146,12 +146,7 @@ class MrtNativeWeb extends MrtPlatformInterface { @override Future getConfig() async { - final now = DateTime.now(); - storage = await SafeStorage.init(); - final end = DateTime.now(); - print( - "difference initiale storage ${now.difference(end).inMilliseconds.abs()}"); final barcode = await hasBarcodeScanner().catchError((e) => false); return MRTAPPConfig(platform: platform, hasBarcodeScanner: barcode); } diff --git a/mrt_native_support/lib/web/storage/safe_storage/safestorage.dart b/mrt_native_support/lib/web/storage/safe_storage/safestorage.dart index 5dbe31eb..cb73efc6 100644 --- a/mrt_native_support/lib/web/storage/safe_storage/safestorage.dart +++ b/mrt_native_support/lib/web/storage/safe_storage/safestorage.dart @@ -60,8 +60,8 @@ class SafestorageUtils { } static Future _key() async { - if (isExtention) { - return await extention.storage.local.getStorage_(StorageConst.key); + if (isExtension) { + return await extension.storage.local.getStorage_(StorageConst.key); } return localStorage.getItem(StorageConst.key); } @@ -73,8 +73,8 @@ class SafestorageUtils { } final generateKey = _generateKey(); final ChaCha20Poly1305 chacha = generateKey.$2; - if (isExtention) { - await extention.storage.local + if (isExtension) { + await extension.storage.local .setStorage_(StorageConst.key, generateKey.$1); return chacha; } @@ -106,7 +106,7 @@ abstract class SafeStorage { const SafeStorage(this._chacha); static Future init() async { final key = await SafestorageUtils.migrateLegacy(); - if (isExtention) { + if (isExtension) { return ChromeStorage(key); } return WebStorage(key); diff --git a/mrt_native_support/lib/web/storage/storage/chrome_storage.dart b/mrt_native_support/lib/web/storage/storage/chrome_storage.dart index e2b2718b..aaa0f3bb 100644 --- a/mrt_native_support/lib/web/storage/storage/chrome_storage.dart +++ b/mrt_native_support/lib/web/storage/storage/chrome_storage.dart @@ -5,7 +5,7 @@ import 'package:mrt_native_support/web/storage/constant/constant.dart'; class ChromeStorage extends SafeStorage { ChromeStorage(super.chacha); - StorageArea get _storage => extention.storage.local; + StorageArea get _storage => extension.storage.local; @override Future clear() async { await _storage.clear_(); diff --git a/mrt_native_support/macos/Classes/NativeView/WebKit.swift b/mrt_native_support/macos/Classes/NativeView/WebKit.swift index 9a7ce11b..1d329af7 100644 --- a/mrt_native_support/macos/Classes/NativeView/WebKit.swift +++ b/mrt_native_support/macos/Classes/NativeView/WebKit.swift @@ -102,11 +102,11 @@ class NativeViewFactory: NSObject, FlutterPlatformViewFactory,WKNavigationDelega self.channel.invokeMethod(WebViewConst.webView, arguments: data.toJson()) } } + func dispose(){ - - webView?.stopLoading() - - webView?.removeFromSuperview() + webView.reload() + webView.stopLoading() + webView.removeFromSuperview() } func openPage(url: String) { @@ -170,7 +170,7 @@ class NativeViewFactory: NSObject, FlutterPlatformViewFactory,WKNavigationDelega window.addEventListener("error", function (e) { window.webkit.messageHandlers.MRT.postMessage({ type: 'log', - data: "Error occurred: " + e.error.message, + data: "Error occurred: " + e.error.message + e + e.error, id: '1', requestId: '0', }); @@ -180,7 +180,7 @@ class NativeViewFactory: NSObject, FlutterPlatformViewFactory,WKNavigationDelega // Send the message to the native side window.webkit.messageHandlers.MRT.postMessage({ type: 'log', - data: "Error occurred: " + e.reason.message, + data: "Error occurred: " + e.reason.message + e + e.reason, id: '1', requestId: '0', }); @@ -191,7 +191,7 @@ class NativeViewFactory: NSObject, FlutterPlatformViewFactory,WKNavigationDelega // Send the message to the native side window.webkit.messageHandlers.MRT.postMessage({ type: 'log', - data: "Error occurred: " + message, + data: "Error occurred: " + message + source + lineno + colno, id: '1', requestId: '0', }); diff --git a/mrt_wallet/assets/wasm/crypto.mjs b/mrt_wallet/assets/wasm/crypto.mjs index b815c858..a0b0e3a3 100644 --- a/mrt_wallet/assets/wasm/crypto.mjs +++ b/mrt_wallet/assets/wasm/crypto.mjs @@ -89,7 +89,6 @@ _100: Object.is, _101: s => s.toUpperCase(), _102: s => s.toLowerCase(), _103: (a, i) => a.push(i), -_104: (a, i) => a.splice(i, 1)[0], _110: (a, s) => a.join(s), _111: (a, s, e) => a.slice(s, e), _114: a => a.length, @@ -138,44 +137,44 @@ _182: f => finalizeWrapper(f, function(x0) { return dartInstance.exports._182(f, _183: f => finalizeWrapper(f, function() { return dartInstance.exports._183(f,arguments.length) }), _201: (c) => queueMicrotask(() => dartInstance.exports.$invokeCallback(c)), -_577: (s, m) => { +_585: (s, m) => { try { return new RegExp(s, m); } catch (e) { return String(e); } }, -_578: (x0,x1) => x0.exec(x1), -_579: (x0,x1) => x0.test(x1), -_580: (x0,x1) => x0.exec(x1), -_588: o => o === undefined, -_589: o => typeof o === 'boolean', -_590: o => typeof o === 'number', -_592: o => typeof o === 'string', -_595: o => o instanceof Int8Array, -_596: o => o instanceof Uint8Array, -_597: o => o instanceof Uint8ClampedArray, -_598: o => o instanceof Int16Array, -_599: o => o instanceof Uint16Array, -_600: o => o instanceof Int32Array, -_601: o => o instanceof Uint32Array, -_602: o => o instanceof Float32Array, -_603: o => o instanceof Float64Array, -_604: o => o instanceof ArrayBuffer, -_605: o => o instanceof DataView, -_606: o => o instanceof Array, -_607: o => typeof o === 'function' && o[jsWrappedDartFunctionSymbol] === true, -_610: o => o instanceof RegExp, -_611: (l, r) => l === r, -_612: o => o, -_613: o => o, -_614: o => o, -_615: b => !!b, -_616: o => o.length, -_619: (o, i) => o[i], -_620: f => f.dartFunction, -_621: l => arrayFromDartList(Int8Array, l), -_622: (data, length) => { +_586: (x0,x1) => x0.exec(x1), +_587: (x0,x1) => x0.test(x1), +_588: (x0,x1) => x0.exec(x1), +_596: o => o === undefined, +_597: o => typeof o === 'boolean', +_598: o => typeof o === 'number', +_600: o => typeof o === 'string', +_603: o => o instanceof Int8Array, +_604: o => o instanceof Uint8Array, +_605: o => o instanceof Uint8ClampedArray, +_606: o => o instanceof Int16Array, +_607: o => o instanceof Uint16Array, +_608: o => o instanceof Int32Array, +_609: o => o instanceof Uint32Array, +_610: o => o instanceof Float32Array, +_611: o => o instanceof Float64Array, +_612: o => o instanceof ArrayBuffer, +_613: o => o instanceof DataView, +_614: o => o instanceof Array, +_615: o => typeof o === 'function' && o[jsWrappedDartFunctionSymbol] === true, +_618: o => o instanceof RegExp, +_619: (l, r) => l === r, +_620: o => o, +_621: o => o, +_622: o => o, +_623: b => !!b, +_624: o => o.length, +_627: (o, i) => o[i], +_628: f => f.dartFunction, +_629: l => arrayFromDartList(Int8Array, l), +_630: (data, length) => { const jsBytes = new Uint8Array(length); const getByte = dartInstance.exports.$uint8ListGet; for (let i = 0; i < length; i++) { @@ -183,14 +182,14 @@ _622: (data, length) => { } return jsBytes; }, -_623: l => arrayFromDartList(Uint8ClampedArray, l), -_624: l => arrayFromDartList(Int16Array, l), -_625: l => arrayFromDartList(Uint16Array, l), -_626: l => arrayFromDartList(Int32Array, l), -_627: l => arrayFromDartList(Uint32Array, l), -_628: l => arrayFromDartList(Float32Array, l), -_629: l => arrayFromDartList(Float64Array, l), -_630: (data, length) => { +_631: l => arrayFromDartList(Uint8ClampedArray, l), +_632: l => arrayFromDartList(Int16Array, l), +_633: l => arrayFromDartList(Uint16Array, l), +_634: l => arrayFromDartList(Int32Array, l), +_635: l => arrayFromDartList(Uint32Array, l), +_636: l => arrayFromDartList(Float32Array, l), +_637: l => arrayFromDartList(Float64Array, l), +_638: (data, length) => { const read = dartInstance.exports.$byteDataGetUint8; const view = new DataView(new ArrayBuffer(length)); for (let i = 0; i < length; i++) { @@ -198,8 +197,8 @@ _630: (data, length) => { } return view; }, -_631: l => arrayFromDartList(Array, l), -_632: (s, length) => { +_639: l => arrayFromDartList(Array, l), +_640: (s, length) => { if (length == 0) return ''; const read = dartInstance.exports.$stringRead1; @@ -220,7 +219,7 @@ _632: (s, length) => { return result; } , -_633: (s, length) => { +_641: (s, length) => { if (length == 0) return ''; const read = dartInstance.exports.$stringRead2; @@ -241,7 +240,7 @@ _633: (s, length) => { return result; } , -_634: (s) => { +_642: (s) => { let length = s.length; let range = 0; for (let i = 0; i < length; i++) { @@ -297,18 +296,18 @@ _634: (s) => { } } , -_637: l => new Array(l), -_641: (o, p) => o[p], -_645: o => String(o), -_650: x0 => x0.index, -_652: x0 => x0.length, -_654: (x0,x1) => x0[x1], -_657: x0 => x0.flags, -_658: x0 => x0.multiline, -_659: x0 => x0.ignoreCase, -_660: x0 => x0.unicode, -_661: x0 => x0.dotAll, -_662: (x0,x1) => x0.lastIndex = x1 +_645: l => new Array(l), +_649: (o, p) => o[p], +_653: o => String(o), +_658: x0 => x0.index, +_660: x0 => x0.length, +_662: (x0,x1) => x0[x1], +_665: x0 => x0.flags, +_666: x0 => x0.multiline, +_667: x0 => x0.ignoreCase, +_668: x0 => x0.unicode, +_669: x0 => x0.dotAll, +_670: (x0,x1) => x0.lastIndex = x1 }; const baseImports = { diff --git a/mrt_wallet/assets/wasm/crypto.wasm b/mrt_wallet/assets/wasm/crypto.wasm index 3ba50b1dd8c0cc35526ef0617e45e9e72e920399..bc37703c075eddd8d966463ee3c51ff23519c275 100644 GIT binary patch literal 1245384 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[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 Dy@)=G diff --git a/mrt_wallet/assets/webview/script.js b/mrt_wallet/assets/webview/script.js index beb85f49..1dc06f48 100644 --- a/mrt_wallet/assets/webview/script.js +++ b/mrt_wallet/assets/webview/script.js @@ -1,4 +1,4 @@ -// Generated by dart2js (NullSafetyMode.sound, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.5.0. +// Generated by dart2js (NullSafetyMode.sound, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.5.3. // The code supports the following hooks: // dartPrint(message): // if this function is defined it is called instead of the Dart [print] @@ -398,6 +398,28 @@ return receiver; return J.getNativeInterceptor(receiver); }, + getInterceptor$ansx(receiver) { + if (typeof receiver == "number") + return J.JSNumber.prototype; + if (typeof receiver == "string") + return J.JSString.prototype; + if (receiver == null) + return receiver; + if (Array.isArray(receiver)) + return J.JSArray.prototype; + if (typeof receiver != "object") { + if (typeof receiver == "function") + return J.JavaScriptFunction.prototype; + if (typeof receiver == "symbol") + return J.JavaScriptSymbol.prototype; + if (typeof receiver == "bigint") + return J.JavaScriptBigInt.prototype; + return receiver; + } + if (receiver instanceof A.Object) + return receiver; + return J.getNativeInterceptor(receiver); + }, getInterceptor$asx(receiver) { if (typeof receiver == "string") return J.JSString.prototype; @@ -498,6 +520,11 @@ get$toString$(receiver) { return J.getInterceptor$(receiver).get$toString(receiver); }, + $add$ansx(receiver, a0) { + if (typeof receiver == "number" && typeof a0 == "number") + return receiver + a0; + return J.getInterceptor$ansx(receiver).$add(receiver, a0); + }, $eq$(receiver, a0) { if (receiver == null) return a0 == null; @@ -541,6 +568,9 @@ elementAt$1$ax(receiver, a0) { return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0); }, + endsWith$1$s(receiver, a0) { + return J.getInterceptor$s(receiver).endsWith$1(receiver, a0); + }, firstWhere$1$ax(receiver, a0) { return J.getInterceptor$ax(receiver).firstWhere$1(receiver, a0); }, @@ -598,6 +628,9 @@ toString$0$(receiver) { return J.getInterceptor$(receiver).toString$0(receiver); }, + toString$1$indent$(receiver, a0) { + return J.getInterceptor$(receiver).toString$1$indent(receiver, a0); + }, trim$0$s(receiver) { return J.getInterceptor$s(receiver).trim$0(receiver); }, @@ -660,6 +693,9 @@ LateError$fieldNI(fieldName) { return new A.LateError("Field '" + fieldName + "' has not been initialized."); }, + LateError$fieldAI(fieldName) { + return new A.LateError("Field '" + fieldName + "' has already been initialized."); + }, CodeUnits$(_string) { return new A.CodeUnits(_string); }, @@ -2188,7 +2224,7 @@ this._1 = t1; }, ConstantMapView: function ConstantMapView(t0, t1) { - this._map = t0; + this._collection$_map = t0; this.$ti = t1; }, ConstantMap: function ConstantMap() { @@ -2281,7 +2317,7 @@ JsLinkedHashMap: function JsLinkedHashMap(t0) { var _ = this; _.__js_helper$_length = 0; - _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null; + _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null; _._modifications = 0; _.$ti = t0; }, @@ -2298,12 +2334,12 @@ _._previous = _._next = null; }, LinkedHashMapKeyIterable: function LinkedHashMapKeyIterable(t0, t1) { - this.__js_helper$_map = t0; + this._map = t0; this.$ti = t1; }, LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1, t2) { var _ = this; - _.__js_helper$_map = t0; + _._map = t0; _._modifications = t1; _.__js_helper$_current = _._cell = null; _.$ti = t2; @@ -2311,14 +2347,14 @@ JsIdentityLinkedHashMap: function JsIdentityLinkedHashMap(t0) { var _ = this; _.__js_helper$_length = 0; - _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null; + _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null; _._modifications = 0; _.$ti = t0; }, JsConstantLinkedHashMap: function JsConstantLinkedHashMap(t0) { var _ = this; _.__js_helper$_length = 0; - _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null; + _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null; _._modifications = 0; _.$ti = t0; }, @@ -2386,7 +2422,7 @@ return t1._value = t1; }, _Cell: function _Cell(t0) { - this.__late_helper$_name = t0; + this._name = t0; this._value = null; }, _checkViewArguments(buffer, offsetInBytes, $length) { @@ -4898,16 +4934,16 @@ _IdentityHashMap: function _IdentityHashMap(t0) { var _ = this; _._collection$_length = 0; - _._keys = _._collection$_rest = _._nums = _._strings = null; + _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null; _.$ti = t0; }, _HashMapKeyIterable: function _HashMapKeyIterable(t0, t1) { - this._map = t0; + this._collection$_map = t0; this.$ti = t1; }, _HashMapKeyIterator: function _HashMapKeyIterator(t0, t1, t2) { var _ = this; - _._map = t0; + _._collection$_map = t0; _._keys = t1; _._offset = 0; _._collection$_current = null; @@ -4919,7 +4955,7 @@ _._hashCode = t1; _._validKey = t2; _.__js_helper$_length = 0; - _._last = _._first = _.__js_helper$_rest = _.__js_helper$_nums = _.__js_helper$_strings = null; + _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null; _._modifications = 0; _.$ti = t3; }, @@ -4929,7 +4965,7 @@ _LinkedHashSet: function _LinkedHashSet(t0) { var _ = this; _._collection$_length = 0; - _._collection$_last = _._collection$_first = _._collection$_rest = _._nums = _._strings = null; + _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null; _._collection$_modifications = 0; _.$ti = t0; }, @@ -4963,13 +4999,13 @@ UnmodifiableMapBase: function UnmodifiableMapBase() { }, _MapBaseValueIterable: function _MapBaseValueIterable(t0, t1) { - this._map = t0; + this._collection$_map = t0; this.$ti = t1; }, _MapBaseValueIterator: function _MapBaseValueIterator(t0, t1, t2) { var _ = this; _._keys = t0; - _._map = t1; + _._collection$_map = t1; _._collection$_current = null; _.$ti = t2; }, @@ -4978,7 +5014,7 @@ MapView: function MapView() { }, UnmodifiableMapView: function UnmodifiableMapView(t0, t1) { - this._map = t0; + this._collection$_map = t0; this.$ti = t1; }, SetBase: function SetBase() { @@ -5374,7 +5410,7 @@ _JsonMap: function _JsonMap(t0, t1) { this._original = t0; this._processed = t1; - this._data = null; + this._convert$_data = null; }, _JsonMap_values_closure: function _JsonMap_values_closure(t0) { this.$this = t0; @@ -6708,6 +6744,16 @@ object4 = A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3), object4)); return object4; }, + Object_hashAll(objects) { + var t1, _i, + hash = $.$get$_hashSeed(); + for (t1 = objects.length, _i = 0; _i < objects.length; objects.length === t1 || (0, A.throwConcurrentModificationError)(objects), ++_i) + hash = A.SystemHash_combine(hash, J.get$hashCode$(objects[_i])); + return A.SystemHash_finish(hash); + }, + print(object) { + A.printString(object); + }, _combineSurrogatePair(start, end) { return 65536 + ((start & 1023) << 10) + (end & 1023); }, @@ -8377,6 +8423,9 @@ return object; return new A.jsify__convert(new A._IdentityHashMap(type$._IdentityHashMap_of_nullable_Object_and_nullable_Object)).call$1(object); }, + getProperty(o, $name, $T) { + return $T._as(o[$name]); + }, callConstructor(constr, $arguments, $T) { var args, factoryFunction; if ($arguments instanceof Array) @@ -8435,7 +8484,7 @@ _JSRandom: function _JSRandom() { }, _JSSecureRandom: function _JSSecureRandom(t0) { - this._math$_buffer = t0; + this._buffer = t0; }, Endian: function Endian() { }, @@ -8531,7 +8580,7 @@ if (0 >= convData.length) return A.ioore(convData, 0); ver = convData[0]; - decode = new A.Tuple(A.IntUtils_toBytes(ver, B.C_Endian0, A.IntUtils_bitlengthInBytes(ver)), B.JSArray_methods.sublist$1(convData, 1), type$.Tuple_of_List_int_and_List_int); + decode = new A.Tuple(A.IntUtils_toBytes(ver, B.C_Endian, A.IntUtils_bitlengthInBytes(ver)), B.JSArray_methods.sublist$1(convData, 1), type$.Tuple_of_List_int_and_List_int); scriptBytes = decode.item2; version = decode.item1; t1 = A._BitcoinAddressUtils__validateBchScriptBytes(network, scriptBytes, version); @@ -8746,7 +8795,7 @@ this.message = t0; }, BasedUtxoNetwork_fromName($name) { - return B.JSArray_methods.firstWhere$1(B.List_01, new A.BasedUtxoNetwork_fromName_closure($name)); + return B.JSArray_methods.firstWhere$1(B.List_02, new A.BasedUtxoNetwork_fromName_closure($name)); }, BasedUtxoNetwork_fromName_closure: function BasedUtxoNetwork_fromName_closure(t0) { this.name = t0; @@ -8829,7 +8878,7 @@ return new A.APIConfig(baseUrl + "/block-height/###", B.APIType_0); }, APIType: function APIType(t0) { - this._name = t0; + this._core$_name = t0; }, APIConfig: function APIConfig(t0, t1) { this.blockHeight = t0; @@ -8847,7 +8896,7 @@ var val, t2, enc, t3, div, t4, zero, t1 = B.Map_inkaS.$index(0, base58alphabets); t1.toString; - val = A.BigintUtils_fromBytes(dataBytes, B.C_Endian, false); + val = A.BigintUtils_fromBytes(dataBytes, B.C_Endian0, false); for (t2 = t1.length, enc = ""; val.compareTo$1(0, $.$get$_BigIntImpl_zero()) > 0; val = div) { t3 = A._BigIntImpl__BigIntImpl$from(58); if (t3._used === 0) @@ -8889,7 +8938,7 @@ throw A.wrapException(B.MessageException_IMr); val = val.$add(0, A._BigIntImpl__BigIntImpl$from(charIndex).$mul(0, A._BigIntImpl__BigIntImpl$from(58).pow$1(i))); } - bytes = A.BigintUtils_toBytes(val, B.JSInt_methods._tdivFast$1((val._isNegative ? val.$negate(0) : val).get$bitLength(0) + 7, 8), B.C_Endian); + bytes = A.BigintUtils_toBytes(val, B.JSInt_methods._tdivFast$1((val._isNegative ? val.$negate(0) : val).get$bitLength(0) + 7, 8), B.C_Endian0); for (t3 = t1.length, padLen = 0, i = 0; i < t2; ++i) { t4 = data[i]; if (0 >= t3) @@ -8914,7 +8963,7 @@ return dataBytes; }, Base58Alphabets: function Base58Alphabets(t0) { - this._name = t0; + this._core$_name = t0; }, Base58ChecksumError: function Base58ChecksumError(t0) { this.message = t0; @@ -9032,7 +9081,7 @@ return new A.Tuple(decode.item1, A.Bech32BaseUtils_convertFromBase32(decode.item2), type$.Tuple_of_String_and_List_int); }, Bech32Encodings: function Bech32Encodings(t0) { - this._name = t0; + this._core$_name = t0; }, Bech32ChecksumError: function Bech32ChecksumError() { }, @@ -9287,7 +9336,7 @@ AdaShelleyAddrUtils_encodePrefix(hdrType, netTag, credType, stakeType) { var hdr = (hdrType.header << 4 | credType.value << 4) >>> 0; hdr = (hdrType === B.ADAAddressType_0_Base && stakeType != null ? (hdr | stakeType.value << 5) >>> 0 : hdr) + netTag; - return A.IntUtils_toBytes(hdr, B.C_Endian0, A.IntUtils_bitlengthInBytes(hdr)); + return A.IntUtils_toBytes(hdr, B.C_Endian, A.IntUtils_bitlengthInBytes(hdr)); }, AdaShelleyAddrUtils_encode(credential, hrp, netTag, stakeCredential, type) { var t1 = stakeCredential == null, @@ -9436,7 +9485,7 @@ return A.SHA256_hash(A.List_List$from(t2, true, type$.int)); }, P2TRUtils_calculateTweek(pubPoint, script) { - var tweek = A.P2TRUtils_taggedHash("TapTweak", A.BigintUtils_toBytes(pubPoint.get$x(), A.BigintUtils_orderLen(pubPoint.curve.p), B.C_Endian)); + var tweek = A.P2TRUtils_taggedHash("TapTweak", A.BigintUtils_toBytes(pubPoint.get$x(), A.BigintUtils_orderLen(pubPoint.curve.p), B.C_Endian0)); return tweek; }, P2TRAddrEncoder: function P2TRAddrEncoder() { @@ -10176,7 +10225,7 @@ t1 = J.getInterceptor$asx(keyBytes); if (t1.get$length(keyBytes) === 33) { prefix = t1.sublist$2(keyBytes, 0, 1); - if (A.BytesUtils_bytesEqual(prefix, B.List_0) || A.BytesUtils_bytesEqual(prefix, B.List_237)) + if (A.BytesUtils_bytesEqual(prefix, B.List_00) || A.BytesUtils_bytesEqual(prefix, B.List_237)) keyBytes = t1.sublist$1(keyBytes, 1); } t1 = $.$get$Curves_generatorED25519(); @@ -10574,9 +10623,9 @@ t1 = len + 1; bytes = J.sublist$2$ax(cborBytes, 1, t1); if (len <= 4) - return new A.Tuple(A.IntUtils_fromBytes(bytes, B.C_Endian, false), t1, type$.Tuple_dynamic_int); + return new A.Tuple(A.IntUtils_fromBytes(bytes, B.C_Endian0, false), t1, type$.Tuple_dynamic_int); else if (len <= 8) { - decode = A.BigintUtils_fromBytes(bytes, B.C_Endian, false); + decode = A.BigintUtils_fromBytes(bytes, B.C_Endian0, false); if (decode.get$isValidInt()) return new A.Tuple(decode.toInt$0(0), t1, type$.Tuple_dynamic_int); return new A.Tuple(decode, t1, type$.Tuple_dynamic_int); @@ -10619,7 +10668,7 @@ } else if (A.BytesUtils_bytesEqual(tags, B.List_35)) { B.JSArray_methods.clear$0(tags); toObj = new A.CborRegxpValue($toString); - } else if (A.BytesUtils_bytesEqual(tags, B.List_0)) { + } else if (A.BytesUtils_bytesEqual(tags, B.List_00)) { B.JSArray_methods.clear$0(tags); toObj = new A.CborStringDateValue(A.CborUtils_parseRFC3339DateTime($toString)); } else @@ -10641,7 +10690,7 @@ } bytes = A.CborUtils__parsBytes(info, J.sublist$1$ax(cborBytes, i)); if (A.BytesUtils_bytesEqual(tags, B.List_3) || A.BytesUtils_bytesEqual(tags, B.List_2)) { - big = A.BigintUtils_fromBytes(bytes.item1, B.C_Endian, false); + big = A.BigintUtils_fromBytes(bytes.item1, B.C_Endian0, false); if (A.BytesUtils_bytesEqual(tags, B.List_3)) big = big.$not(0); B.JSArray_methods.clear$0(tags); @@ -11094,7 +11143,7 @@ if (typeof t1 !== "number") return t1.$and(); B.JSArray_methods.$indexSet(data, t2, t1 & 127); - y = A.BigintUtils_fromBytes(data, B.C_Endian0, false); + y = A.BigintUtils_fromBytes(data, B.C_Endian, false); x = A.ECDSAUtils_modularSquareRootPrime(y.$mul(0, y).$sub(0, A._BigIntImpl__BigIntImpl$from(1)).$mul(0, A.BigintUtils_inverseMod(curve.d.$mul(0, y).$mul(0, y).$sub(0, curve.a), p)).$mod(0, p), p); if (!x.get$isEven(0) !== ((t1 >>> 7 & 1) === 1)) x = x.$negate(0).$mod(0, p); @@ -11148,7 +11197,7 @@ t2 = J.getInterceptor$ax(data), xs = t2.sublist$2(data, 0, t1), ys = t2.sublist$1(data, t1); - return new A.Tuple(A.BigintUtils_fromBytes(xs, B.C_Endian, false), A.BigintUtils_fromBytes(ys, B.C_Endian, false), type$.Tuple_BigInt_BigInt); + return new A.Tuple(A.BigintUtils_fromBytes(xs, B.C_Endian0, false), A.BigintUtils_fromBytes(ys, B.C_Endian0, false), type$.Tuple_BigInt_BigInt); }, AbstractPoint__fromCompressed(data, curve) { var isEven, x, p, beta, t2, @@ -11156,7 +11205,7 @@ if (!J.$eq$(t1.$index(data, 0), 2) && !J.$eq$(t1.$index(data, 0), 3)) throw A.wrapException(B.ArgumentException_yPV); isEven = J.$eq$(t1.$index(data, 0), 2); - x = A.BigintUtils_fromBytes(t1.sublist$1(data, 1), B.C_Endian, false); + x = A.BigintUtils_fromBytes(t1.sublist$1(data, 1), B.C_Endian0, false); p = curve.p; beta = A.ECDSAUtils_modularSquareRootPrime(x.modPow$2(0, A._BigIntImpl__BigIntImpl$from(3), p).$add(0, curve.a.$mul(0, x)).$add(0, curve.b).$mod(0, p), p); t1 = beta.$and(0, $.$get$_BigIntImpl_one()).compareTo$1(0, $.$get$_BigIntImpl_zero()); @@ -11167,16 +11216,16 @@ return new A.Tuple(x, beta, t2); }, EncodeType: function EncodeType(t0) { - this._name = t0; + this._core$_name = t0; }, AbstractPoint: function AbstractPoint() { }, ProjectiveECCPoint_ProjectiveECCPoint(curve, generator, order, x, y, z) { - return new A.ProjectiveECCPoint(curve, order, generator, B.List_empty13, A._setArrayType([x, y, z], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(curve, order, generator, B.List_empty14, A._setArrayType([x, y, z], type$.JSArray_BigInt)); }, ProjectiveECCPoint_ProjectiveECCPoint$fromBytes(curve, data, order) { var coords = A.AbstractPoint_fromBytes(curve, data); - return new A.ProjectiveECCPoint(curve, order, false, B.List_empty13, A._setArrayType([coords.item1, coords.item2, $.$get$_BigIntImpl_one()], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(curve, order, false, B.List_empty14, A._setArrayType([coords.item1, coords.item2, $.$get$_BigIntImpl_one()], type$.JSArray_BigInt)); }, ProjectiveECCPoint: function ProjectiveECCPoint(t0, t1, t2, t3, t4) { var _ = this; @@ -11187,14 +11236,14 @@ _._ec_projective_point$_coords = t4; }, EDPoint$(curve, generator, order, t, x, y, z) { - return new A.EDPoint(curve, order, generator, B.List_empty13, A._setArrayType([x, y, z, t], type$.JSArray_BigInt)); + return new A.EDPoint(curve, order, generator, B.List_empty14, A._setArrayType([x, y, z, t], type$.JSArray_BigInt)); }, EDPoint_EDPoint$fromBytes(curve, data) { var coords = A.AbstractPoint_fromBytes(curve, data), x = coords.item1, y = coords.item2, t = x.$mul(0, y); - return new A.EDPoint(curve, null, false, B.List_empty13, A._setArrayType([x, y, $.$get$_BigIntImpl_one(), t], type$.JSArray_BigInt)); + return new A.EDPoint(curve, null, false, B.List_empty14, A._setArrayType([x, y, $.$get$_BigIntImpl_one(), t], type$.JSArray_BigInt)); }, EDPoint: function EDPoint(t0, t1, t2, t3, t4) { var _ = this; @@ -11219,14 +11268,14 @@ t4 = coords[2]; if (3 >= t1) return A.ioore(coords, 3); - return new A.RistrettoPoint(point.curve, point.order, false, B.List_empty13, A._setArrayType([t2, t3, t4, coords[3]], type$.JSArray_BigInt)); + return new A.RistrettoPoint(point.curve, point.order, false, B.List_empty14, A._setArrayType([t2, t3, t4, coords[3]], type$.JSArray_BigInt)); }, RistrettoPoint_RistrettoPoint$fromBytes(bytes) { var s2, u1, u2, u1_2, u2_2, v, invSqrt, t3, x2, y2, x, y, t, c = $.$get$Curves_curveEd25519(), a = c.a, $P = c.p, - s = A.BigintUtils_fromBytes(bytes, B.C_Endian0, false), + s = A.BigintUtils_fromBytes(bytes, B.C_Endian, false), t1 = A.positiveMod(s, $P), t2 = $.$get$_BigIntImpl_one(); t1 = t1.$and(0, t2).compareTo$1(0, t2); @@ -11257,7 +11306,7 @@ } if (t1) throw A.wrapException(B.ArgumentException_IJC); - return A.RistrettoPoint_RistrettoPoint$fromEdwardsPoint(new A.EDPoint(c, null, false, B.List_empty13, A._setArrayType([x, y, t2, t], type$.JSArray_BigInt))); + return A.RistrettoPoint_RistrettoPoint$fromEdwardsPoint(new A.EDPoint(c, null, false, B.List_empty14, A._setArrayType([x, y, t2, t], type$.JSArray_BigInt))); }, RistrettoPoint: function RistrettoPoint(t0, t1, t2, t3, t4) { var _ = this; @@ -11715,13 +11764,19 @@ } return state; }, + SHA256$() { + var t1 = type$.int; + t1 = new A.SHA256(A.List_List$filled(8, 0, false, t1), A.List_List$filled(64, 0, false, t1), A.List_List$filled(128, 0, false, t1), A.List_List$unmodifiable(B.List_0, t1)); + t1.reset$0(); + return t1; + }, SHA256_hash(data) { var digest, t1 = type$.int, t2 = A.List_List$filled(8, 0, false, t1), t3 = A.List_List$filled(64, 0, false, t1), t4 = A.List_List$filled(128, 0, false, t1), - h = new A.SHA256(t2, t3, t4, A.List_List$unmodifiable(B.List_02, t1)); + h = new A.SHA256(t2, t3, t4, A.List_List$unmodifiable(B.List_0, t1)); h.reset$0(); h.update$1(data); digest = h.digest$0(); @@ -11903,7 +11958,7 @@ return new A.LayoutByteWriter(span < 0, new A.LayoutByteReader(t1)); }, LayoutByteReader: function LayoutByteReader(t0) { - this._bytes = t0; + this._byte_handler$_bytes = t0; }, LayoutByteWriter: function LayoutByteWriter(t0, t1) { this.growable = t0; @@ -11913,7 +11968,7 @@ return A.OptionalLayout$(layout, null, false, property, type$.dynamic); }, LayoutConst_rustEnum(variants, property, useKeyAndValue) { - var t1 = A.IntegerLayout$(1, B.C_Endian0, null, false), + var t1 = A.IntegerLayout$(1, B.C_Endian, null, false), unionLayout = A.Union_Union(t1, null, null); new A.ListMapView(variants, A._arrayInstanceType(variants)._eval$1("ListMapView<1>")).forEach$1(0, new A.LayoutConst_rustEnum_closure(unionLayout)); return new A.CustomLayout(unionLayout, new A.LayoutConst_rustEnum_closure0(), new A.LayoutConst_rustEnum_closure1(false), unionLayout.span, property, type$.CustomLayout_of_Map_String_dynamic_and_Map_String_dynamic); @@ -12091,7 +12146,7 @@ this.property = t2; }, OptionalLayout$(layout, discriminator, keepLayoutSize, property, $T) { - var t1 = discriminator == null ? A.IntegerLayout$(1, B.C_Endian0, null, false) : discriminator; + var t1 = discriminator == null ? A.IntegerLayout$(1, B.C_Endian, null, false) : discriminator; return new A.OptionalLayout(layout, t1, false, -1, property, $T._eval$1("OptionalLayout<0>")); }, OptionalLayout__validateOption(property, value) { @@ -12222,10 +12277,10 @@ this.message = t0; }, DynamicByteTracker: function DynamicByteTracker(t0) { - this._buffer = t0; + this._bytes_tracker$_buffer = t0; }, BytesUtils_toHexString(dataBytes, lowerCase, prefix) { - var toHex = B.C__Hex.encode$2$lowerCase(dataBytes, true); + var toHex = B.C__Hex.encode$2$lowerCase(dataBytes, lowerCase); return (prefix == null ? "" : prefix) + toHex; }, BytesUtils_tryToHexString(dataBytes) { @@ -12319,15 +12374,19 @@ return 0; }, BytesUtils_bytesEqual(a, b) { - var t1, t2, index; + var t1, t2, t3, t4, index; if (a == null) - return b == null; - if (b == null || J.get$length$asx(a) !== J.get$length$asx(b)) + return false; + t1 = J.getInterceptor$asx(a); + t2 = t1.get$length(a); + t3 = J.getInterceptor$asx(b); + t4 = t3.get$length(b); + if (t2 !== t4) return false; if (a === b) return true; - for (t1 = J.getInterceptor$asx(a), t2 = J.getInterceptor$asx(b), index = 0; index < t1.get$length(a); ++index) - if (!J.$eq$(t1.$index(a, index), t2.$index(b, index))) + for (index = 0; index < t1.get$length(a); ++index) + if (!J.$eq$(t1.$index(a, index), t3.$index(b, index))) return false; return true; }, @@ -12551,7 +12610,7 @@ } }, StringEncoding: function StringEncoding(t0) { - this._name = t0; + this._core$_name = t0; }, Tuple: function Tuple(t0, t1, t2) { this.item1 = t0; @@ -12626,7 +12685,7 @@ }, TendermintProvider: function TendermintProvider(t0) { this.rpc = t0; - this._provider3$_id = 0; + this._provider5$_id = 0; }, TendermintProvider_request_closure: function TendermintProvider_request_closure() { }, @@ -12811,13 +12870,13 @@ this.message = t0; }, AppPlatform: function AppPlatform(t0) { - this._name = t0; + this._core$_name = t0; }, WalletEventTypes_fromName($name) { return B.JSArray_methods.firstWhere$2$orElse(B.List_hHc, new A.WalletEventTypes_fromName_closure($name), new A.WalletEventTypes_fromName_closure0($name)); }, WalletEventTypes: function WalletEventTypes(t0) { - this._name = t0; + this._core$_name = t0; }, WalletEventTypes_fromName_closure: function WalletEventTypes_fromName_closure(t0) { this.name = t0; @@ -12842,15 +12901,6 @@ }, JSWebSocket_constructor_create_closure: function JSWebSocket_constructor_create_closure() { }, - EventInit_detailBytes(_this) { - var t1, exception; - try { - t1 = A.List_List$from(type$.List_dynamic._as(A.dartify(_this.detail)), true, type$.int); - return t1; - } catch (exception) { - return null; - } - }, WebEventStream_stream(_this, type, $T) { var controller = A.StreamController_StreamController(false, $T), callback = A._functionToJS1(new A.WebEventStream_stream_closure(controller, $T)); @@ -12858,9 +12908,8 @@ _this.addEventListener(type, callback); return new A._ControllerStream(controller, A._instanceType(controller)._eval$1("_ControllerStream<1>")); }, - CustomEvent_constructor_create(clone, data, type) { - var t1, t2, t3, _null = null, - eventData = A.jsify(data); + CustomEvent_constructor_create(clone, eventData, type) { + var t1, t2, t3, _null = null; if (clone) { t1 = self; t2 = type$.nullable_JSObject; @@ -12948,7 +12997,7 @@ }, ContentType: function ContentType(t0, t1) { this.value = t0; - this._name = t1; + this._core$_name = t1; }, ContentType_fromValue_closure: function ContentType_fromValue_closure(t0) { this.value = t0; @@ -13168,6 +13217,12 @@ throw A.wrapException($.$get$WalletExceptionConst_invalidSerializationData()); return toe.call$1($T._as(t1)); }, + QuickCborTag_get_getList(_this) { + var t1 = _this.value; + if (!(t1 instanceof A.CborListValue)) + throw A.wrapException($.$get$WalletExceptionConst_invalidSerializationData()); + return t1; + }, CborSerializable: function CborSerializable() { }, ExtractCborMap_generateMap_closure: function ExtractCborMap_generateMap_closure(t0, t1, t2, t3) { @@ -13522,7 +13577,7 @@ }, AddressDerivationType: function AddressDerivationType(t0, t1) { this.tag = t0; - this._name = t1; + this._core$_name = t1; }, AddressDerivationType_fromTag_closure: function AddressDerivationType_fromTag_closure(t0) { this.tag = t0; @@ -13606,7 +13661,7 @@ }, SeedTypes: function SeedTypes(t0, t1) { this.name = t0; - this._name = t1; + this._core$_name = t1; }, SeedTypes_fromName_closure: function SeedTypes_fromName_closure(t0) { this.name = t0; @@ -13618,10 +13673,10 @@ t1.tag = tag; if (tag != null && J.get$length$asx(tag) > 3) t1.tag = J.sublist$2$ax(tag, 0, 3); - return B.JSArray_methods.firstWhere$2$orElse(B.List_00, new A.NetworkType_fromTag_closure(t1), new A.NetworkType_fromTag_closure0()); + return B.JSArray_methods.firstWhere$2$orElse(B.List_01, new A.NetworkType_fromTag_closure(t1), new A.NetworkType_fromTag_closure0()); }, NetworkType_fromName($name) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_00, new A.NetworkType_fromName_closure($name), new A.NetworkType_fromName_closure0()); + return B.JSArray_methods.firstWhere$2$orElse(B.List_01, new A.NetworkType_fromName_closure($name), new A.NetworkType_fromName_closure0()); }, NetworkType: function NetworkType(t0, t1) { this.name = t0; @@ -13640,7 +13695,7 @@ BaseRepository: function BaseRepository() { }, NodeClientStatus: function NodeClientStatus(t0) { - this._name = t0; + this._core$_name = t0; }, NetworkClient: function NetworkClient() { }, @@ -13740,12 +13795,13 @@ }, SubstrateRepository: function SubstrateRepository() { }, - TonClient: function TonClient(t0, t1, t2, t3) { + TonClient: function TonClient(t0, t1, t2, t3, t4) { var _ = this; _.provider = t0; _.network = t1; - _._status = t2; - _._lock = t3; + _._contractsCode = t2; + _._status = t3; + _._lock = t4; }, TonClient_onInit_closure: function TonClient_onInit_closure(t0) { this.$this = t0; @@ -13827,7 +13883,7 @@ return B.JSArray_methods.firstWhere$2$orElse(B.List_swi, new A.BitcoinExplorerProviderType_fromName_closure($name), new A.BitcoinExplorerProviderType_fromName_closure0()); }, BitcoinExplorerProviderType: function BitcoinExplorerProviderType(t0) { - this._name = t0; + this._core$_name = t0; }, BitcoinExplorerProviderType_fromName_closure: function BitcoinExplorerProviderType_fromName_closure(t0) { this.name = t0; @@ -14268,7 +14324,7 @@ return new A.ProviderAuth(A.ProviderAuthType_fromName(A.ExtractCborList_elementAt(cbor, 0, type$.nullable_String)), A.ExtractCborList_elementAt(cbor, 1, t1), A.ExtractCborList_elementAt(cbor, 2, t1)); }, ProviderAuthType: function ProviderAuthType(t0) { - this._name = t0; + this._core$_name = t0; }, ProviderAuthType_fromName_closure: function ProviderAuthType_fromName_closure(t0) { this.name = t0; @@ -14297,7 +14353,7 @@ ServiceProtocol: function ServiceProtocol(t0, t1, t2) { this.value = t0; this.id = t1; - this._name = t2; + this._core$_name = t2; }, ServiceProtocol_fromID_closure: function ServiceProtocol_fromID_closure(t0) { this.id = t0; @@ -14311,10 +14367,10 @@ this.id = t2; }, SocketStatus: function SocketStatus(t0) { - this._name = t0; + this._core$_name = t0; }, APIServiceStatus: function APIServiceStatus(t0) { - this._name = t0; + this._core$_name = t0; }, EthereumSubscribeResult: function EthereumSubscribeResult(t0, t1) { this.subscription = t0; @@ -14623,7 +14679,7 @@ if (bitcoinAddressType !== A.BlockchainAddressUtils_toBitcoinAddress(address.address, t4.transacationNetwork, bitcoinAddressType).get$type()) A.throwExpression($.$get$WalletExceptionConst_invalidAccountDetails()); A.ExtractCborList_elementAt(cbor, 7, type$.nullable_String); - A.List_List$unmodifiable(B.List_empty4, t2); + A.List_List$unmodifiable(B.List_empty5, t2); return new A.IBitcoinCashMultiSigAddress(multiSignatureAddress, bitcoinAddressType, keyIndex, t3); } cbor = A.CborSerializable_decodeCborTags(null, obj, B.List_200_191, type$.CborListValue_dynamic); @@ -14679,7 +14735,7 @@ A.ExtractCborList_elementAt(cbor, 7, type$.nullable_String); multiSignatureAddress.fromType$2$addressType$network(bitcoinAddressType, network.toNetwork$1$0(type$.WalletBitcoinNetwork).coinParam.transacationNetwork); t1 = network.get$value(); - A.List_List$unmodifiable(B.List_empty4, t2); + A.List_List$unmodifiable(B.List_empty5, t2); return new A.IBitcoinMultiSigAddress(multiSignatureAddress, bitcoinAddressType, keyIndex, t1); } cbor = A.CborSerializable_decodeCborTags(null, obj, B.List_200_192, type$.CborListValue_dynamic); @@ -14838,7 +14894,7 @@ _ISubstrateAddress_ChainAccount_Equatable: function _ISubstrateAddress_ChainAccount_Equatable() { }, ITonAddress_ITonAddress$fromCborBytesOrObject(network, obj) { - var keyIndex, publicKey, t2, networkId, t3, t4, tokens, + var keyIndex, publicKey, t2, address, tonAddress, networkId, version, subWalletId, t3, t4, tokens, bouncable, contextObject, context, cbor = A.CborSerializable_decodeCborTags(null, obj, B.List_200_199, type$.CborListValue_dynamic), t1 = type$.String, proposal = A.CoinProposal_fromName(A.ExtractCborList_elementAt(cbor, 0, t1)); @@ -14847,29 +14903,41 @@ publicKey = A.ExtractCborList_elementAt(cbor, 3, type$.List_int); t2 = network.get$coinParam().token.decimal; t2.toString; - A.AccountBalance_AccountBalance$fromCborBytesOrObject(t2, A.ExtractCborList_getCborTag(cbor, 4)); - A.TonAddress_TonAddress(A.ExtractCborList_elementAt(cbor, 5, t1)); + address = A.AccountBalance_AccountBalance$fromCborBytesOrObject(t2, A.ExtractCborList_getCborTag(cbor, 4)); + tonAddress = A.TonAddress_TonAddress(A.ExtractCborList_elementAt(cbor, 5, t1), null); t1 = type$.int; networkId = A.ExtractCborList_elementAt(cbor, 6, t1); if (networkId !== network.get$value()) throw A.wrapException($.$get$WalletExceptionConst_incorrectNetwork()); t2 = type$.nullable_String; - A.WalletVersion_WalletVersion$fromValue(A.ExtractCborList_elementAt(cbor, 7, t2)); - A.ExtractCborList_elementAt(cbor, 8, type$.nullable_int); + version = A.ExtractCborList_elemetAs(cbor, 7, t2); + subWalletId = A.ExtractCborList_elemetAs(cbor, 8, type$.nullable_int); t3 = type$.TonJettonToken; t4 = J.map$1$1$ax(A.ExtractCborList_elementAt(cbor, 9, type$.List_dynamic), new A.ITonAddress_ITonAddress$fromCborBytesOrObject_closure(), t3); tokens = A.List_List$of(t4, true, t4.$ti._eval$1("ListIterable.E")); A.ExtractCborList_elementAt(cbor, 11, t2); + bouncable = A.ExtractCborList_elemetAs(cbor, 12, type$.nullable_bool); + contextObject = A.ExtractCborList_elemetAs(cbor, 13, type$.nullable_CborTagValue_dynamic); + if (contextObject != null) + context = A.TonAccountContext_TonAccountContext$deserialize(contextObject); + else if (version != null && bouncable != null) + context = A.TonAccountContext_TonAccountContext$merge(bouncable, subWalletId, A.WalletVersion_WalletVersion$fromValue(version)); + else + throw A.wrapException($.$get$WalletExceptionConst_invalidAccountDetails()); t2 = A._setArrayType([], type$.JSArray_NFTCore); - A.ExtractCborList_elementAt(cbor, 12, type$.bool); - A.List_List$unmodifiable(publicKey, t1); + t1 = A.List_List$unmodifiable(publicKey, t1); A.List_List$unmodifiable(tokens, t3); A.List_List$unmodifiable(t2, type$.NFTCore); - return new A.ITonAddress(keyIndex, networkId); + return new A.ITonAddress(context, address, keyIndex, networkId, t1, tonAddress); }, - ITonAddress: function ITonAddress(t0, t1) { - this.keyIndex = t0; - this.network = t1; + ITonAddress: function ITonAddress(t0, t1, t2, t3, t4, t5) { + var _ = this; + _.context = t0; + _.address = t1; + _.keyIndex = t2; + _.network = t3; + _.publicKey = t4; + _.networkAddress = t5; }, ITonAddress_ITonAddress$fromCborBytesOrObject_closure: function ITonAddress_ITonAddress$fromCborBytesOrObject_closure() { }, @@ -15000,7 +15068,7 @@ A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject(account); if (resource != null) A.TronAccountResourceInfo_TronAccountResourceInfo$fromCborBytesOrObject(resource); - A.List_List$unmodifiable(B.List_empty4, type$.int); + A.List_List$unmodifiable(B.List_empty5, type$.int); A.List_List$unmodifiable(trc10Tokens, type$.TronTRC10Token); A.List_List$unmodifiable(trc20Tokens, type$.TronTRC20Token); A.List_List$unmodifiable(t1, type$.NFTCore); @@ -15127,7 +15195,7 @@ accountNfts = A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")); multiSigAccount = A.RippleMultiSignatureAddress_RippleMultiSignatureAddress$fromCborBytesOrObject(A.ExtractCborList_getCborTag(values, 11)); A.ExtractCborList_elementAt(values, 12, type$.nullable_String); - A.List_List$unmodifiable(B.List_empty4, t2); + A.List_List$unmodifiable(B.List_empty5, t2); A.List_List$unmodifiable(issueTokens, t3); A.List_List$unmodifiable(accountNfts, t4); return new A.IXRPMultisigAddress(multiSigAccount, B.C_MultiSigAddressIndex, networkId, tag); @@ -15172,57 +15240,57 @@ t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.EthereumClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.EthereumChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.EthereumChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_SkF: t1 = network.toNetwork$1$0(type$.WalletTronNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.TronClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.TronChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.TronChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_Oh2: t1 = network.toNetwork$1$0(type$.WalletXRPNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.RippleClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.RippleChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.RippleChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_4QF: t1 = network.toNetwork$1$0(type$.WalletSolanaNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.SolanaClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.SolanaChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.SolanaChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_4ei: t1 = network.toNetwork$1$0(type$.WalletCardanoNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.CardanoClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.ADAChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.ADAChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_QJm: t1 = network.toNetwork$1$0(type$.WalletCosmosNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.CosmosClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.CosmosChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.CosmosChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_66M: t1 = network.toNetwork$1$0(type$.WalletTonNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.TonClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.TonChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.TheOpenNetworkChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_GRA: case B.NetworkType_0: t1 = network.toNetwork$1$0(type$.WalletPolkadotNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.SubstrateClient); t3 = t1.coinParam.token.decimal; t3.toString; - return A.SubstrateChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.SubstrateChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); case B.NetworkType_8eb: case B.NetworkType_8Nh: t1 = network.toNetwork$1$0(type$.WalletBitcoinNetwork); t2 = A.APIUtils_createApiClient(network, false, _null, _null, type$.BitcoinClient_IBitcoinAddress); t3 = t1.coinParam.token.decimal; t3.toString; - return A.BitcoinChain$_(0, B.List_empty11, t2, B.List_empty12, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.BitcoinChain$_(0, B.List_empty12, t2, B.List_empty13, id, t1, new A.Live(A.IntegerBalance_IntegerBalance($.$get$_BigIntImpl_zero(), t3, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); default: throw A.wrapException(A.UnimplementedError$("network does not eixst. ")); } @@ -15250,7 +15318,7 @@ break; case B.NetworkType_66M: t1 = network.toNetwork$1$0(type$.WalletTonNetwork); - chain = A.TonChain_TonChain$deserialize(values, A.APIUtils_createApiClient(network, false, _null, provider, type$.TonClient), id, t1); + chain = A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize(values, A.APIUtils_createApiClient(network, false, _null, provider, type$.TonClient), id, t1); break; case B.NetworkType_SkF: t1 = network.toNetwork$1$0(type$.WalletTronNetwork); @@ -15517,12 +15585,12 @@ t2 = id; return A.SubstrateChain$_(t1, toAccounts, client, contacts, t2, network, new A.Live(t3, A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); }, - TonChain$_(addressIndex, addresses, client, contacts, id, network, totalBalance) { + TheOpenNetworkChain$_(addressIndex, addresses, client, contacts, id, network, totalBalance) { var t1 = A.List_List$unmodifiable(addresses, type$.ITonAddress); A.List_List$unmodifiable(contacts, type$.ContactCore_TonAddress); - return new A.TonChain(network, client, t1); + return new A.TheOpenNetworkChain(network, client, t1); }, - TonChain_TonChain$deserialize(cbor, client, id, network) { + TheOpenNetworkChain_TheOpenNetworkChain$deserialize(cbor, client, id, network) { var accounts, toAccounts, t1, t2, acc, addressIndex, contacts, cborContacts, totalBalance, t3; if (A.ExtractCborList_elementAt(cbor, 0, type$.int) !== network.value) throw A.wrapException($.$get$WalletExceptionConst_incorrectNetwork()); @@ -15531,7 +15599,7 @@ accounts = A._setArrayType([], type$.JSArray_CborObject); toAccounts = A._setArrayType([], type$.JSArray_ITonAddress); for (t1 = J.get$iterator$ax(accounts), t2 = type$.ITonAddress; t1.moveNext$0();) { - acc = A.MethodUtils_nullOnException(new A.TonChain_TonChain$deserialize_closure(network, t1.get$current()), t2); + acc = A.MethodUtils_nullOnException(new A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure(network, t1.get$current()), t2); if (acc != null) B.JSArray_methods.add$1(toAccounts, acc); } @@ -15543,7 +15611,7 @@ contacts = A._setArrayType([], type$.JSArray_ContactCore_TonAddress); cborContacts = A.ExtractCborList_elementAt(cbor, 3, type$.nullable_List_dynamic); if (cborContacts != null) { - t1 = J.map$1$1$ax(cborContacts, new A.TonChain_TonChain$deserialize_closure0(network), type$.ContactCore_TonAddress); + t1 = J.map$1$1$ax(cborContacts, new A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure0(network), type$.ContactCore_TonAddress); contacts = A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")); } totalBalance = A.ExtractCborList_elementAt(cbor, 4, type$.nullable_BigInt); @@ -15555,7 +15623,7 @@ t2 = A.ExtractCborList_elementAt(cbor, 8, type$.nullable_String); if (t2 == null) t2 = id; - return A.TonChain$_(t1, toAccounts, client, contacts, t2, network, new A.Live(t3, A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); + return A.TheOpenNetworkChain$_(t1, toAccounts, client, contacts, t2, network, new A.Live(t3, A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance)); }, TronChain$_(addressIndex, addresses, client, contacts, id, network, totalBalance) { var t1 = A.List_List$unmodifiable(addresses, type$.ITronAddress); @@ -15648,7 +15716,7 @@ }, ADAChain: function ADAChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, ADAChain_ADAChain$deserialize_closure: function ADAChain_ADAChain$deserialize_closure(t0, t1) { @@ -15660,7 +15728,7 @@ }, BitcoinChain: function BitcoinChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, BitcoinChain_BitcoinChain$deserialize_closure: function BitcoinChain_BitcoinChain$deserialize_closure(t0, t1) { @@ -15672,7 +15740,7 @@ }, CosmosChain: function CosmosChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, CosmosChain_CosmosChain$deserialize_closure: function CosmosChain_CosmosChain$deserialize_closure(t0, t1) { @@ -15684,7 +15752,7 @@ }, EthereumChain: function EthereumChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, EthereumChain_EthereumChain$deserialize_closure: function EthereumChain_EthereumChain$deserialize_closure(t0, t1) { @@ -15696,7 +15764,7 @@ }, SolanaChain: function SolanaChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, SolanaChain_SolanaChain$deserialize_closure: function SolanaChain_SolanaChain$deserialize_closure(t0, t1) { @@ -15708,7 +15776,7 @@ }, SubstrateChain: function SubstrateChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, SubstrateChain_SubstrateChain$deserialize_closure: function SubstrateChain_SubstrateChain$deserialize_closure(t0, t1) { @@ -15718,21 +15786,21 @@ SubstrateChain_SubstrateChain$deserialize_closure0: function SubstrateChain_SubstrateChain$deserialize_closure0(t0) { this.network = t0; }, - TonChain: function TonChain(t0, t1, t2) { + TheOpenNetworkChain: function TheOpenNetworkChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, - TonChain_TonChain$deserialize_closure: function TonChain_TonChain$deserialize_closure(t0, t1) { + TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure: function TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure(t0, t1) { this.network = t0; this.i = t1; }, - TonChain_TonChain$deserialize_closure0: function TonChain_TonChain$deserialize_closure0(t0) { + TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure0: function TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure0(t0) { this.network = t0; }, TronChain: function TronChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, TronChain_TronChain$deserialize_closure: function TronChain_TronChain$deserialize_closure(t0, t1) { @@ -15744,7 +15812,7 @@ }, RippleChain: function RippleChain(t0, t1, t2) { this.network = t0; - this._client = t1; + this._chain$_client = t1; this._addresses = t2; }, RippleChain_RippleChain$deserialize_closure: function RippleChain_RippleChain$deserialize_closure(t0, t1) { @@ -15884,7 +15952,7 @@ address = A.ExtractCborList_elementAt(cbor, 0, t1); created = A.ExtractCborList_elementAt(cbor, 1, type$.DateTime); $name = A.ExtractCborList_elementAt(cbor, 2, t1); - solanaAddress = A.TonAddress_TonAddress(address); + solanaAddress = A.TonAddress_TonAddress(address, null); return new A.TonContact(solanaAddress, $name); } catch (exception) { t1 = $.$get$WalletExceptionConst_invalidContactDetails(); @@ -16441,7 +16509,7 @@ } }, SolanaWeb3TransactionResponseType: function SolanaWeb3TransactionResponseType(t0) { - this._name = t0; + this._core$_name = t0; }, SolanaWeb3TransactionResponseType_fromName_closure: function SolanaWeb3TransactionResponseType_fromName_closure(t0) { this.name = t0; @@ -16469,6 +16537,101 @@ _.signer = t2; _.signerAddressBytes = t3; }, + TonAccountContextType_fromTag(tag) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_RUw, new A.TonAccountContextType_fromTag_closure(tag), new A.TonAccountContextType_fromTag_closure0()); + }, + TonAccountContext_TonAccountContext$deserialize(object) { + var t1, + decode = A.CborSerializable_decode(null, null, object, type$.CborTagValue_dynamic), + type = A.TonAccountContextType_fromTag(decode.tags), + list = A.QuickCborTag_get_getList(decode), + version = A.WalletVersion_WalletVersion$fromValue(A.ExtractCborList_elemetAs(list, 0, type$.String)), + bouncable = A.ExtractCborList_elementAt(list, 1, type$.bool); + switch (type) { + case B.TonAccountContextType_6m4: + return A.TonAccountLegacyContext_TonAccountLegacyContext(bouncable, version); + case B.TonAccountContextType_BO0: + return A.TonAccountSubWalletContext_TonAccountSubWalletContext(bouncable, A.ExtractCborList_elemetAs(list, 2, type$.int), version); + case B.TonAccountContextType_apl: + t1 = A.ExtractCborList_elemetAs(list, 2, type$.int); + if (version !== B.WalletVersion_v5R1_5) + A.throwExpression($.$get$WalletExceptionConst_invalidAccountDetails()); + return new A.TonAccountV5CustomContext(t1, B.WalletVersion_v5R1_5, bouncable); + case B.TonAccountContextType_Wv6: + t1 = A.ExtractCborList_elemetAs(list, 2, type$.int); + if (version !== B.WalletVersion_v5R1_5) + A.throwExpression($.$get$WalletExceptionConst_invalidAccountDetails()); + return new A.TonAccountV5SubWalletContext(t1, B.WalletVersion_v5R1_5, bouncable); + default: + throw A.wrapException($.$get$WalletExceptionConst_invalidAccountDetails()); + } + }, + TonAccountContext_TonAccountContext$merge(bouncable, subwalletId, version) { + switch (version) { + case B.WalletVersion_v1R1_1: + case B.WalletVersion_v1R2_1: + case B.WalletVersion_v1R3_1: + case B.WalletVersion_v2R1_2: + case B.WalletVersion_v2R2_2: + if (subwalletId == null) + return A.TonAccountLegacyContext_TonAccountLegacyContext(bouncable, version); + break; + case B.WalletVersion_v3R1_3: + case B.WalletVersion_v3R2_3: + case B.WalletVersion_v4_4: + if (subwalletId != null) + return A.TonAccountSubWalletContext_TonAccountSubWalletContext(bouncable, subwalletId, version); + break; + default: + break; + } + throw A.wrapException($.$get$WalletExceptionConst_invalidAccountDetails()); + }, + TonAccountLegacyContext_TonAccountLegacyContext(bouncable, version) { + if (version.version > 2) + throw A.wrapException($.$get$WalletExceptionConst_invalidAccountDetails()); + return new A.TonAccountLegacyContext(version, bouncable); + }, + TonAccountSubWalletContext_TonAccountSubWalletContext(bouncable, subwalletId, version) { + var t1 = version.version; + if (t1 < 3 || t1 > 4) + throw A.wrapException($.$get$WalletExceptionConst_invalidAccountDetails()); + return new A.TonAccountSubWalletContext(subwalletId, version, bouncable); + }, + TonAccountContextType: function TonAccountContextType(t0, t1) { + this.tag = t0; + this._core$_name = t1; + }, + TonAccountContextType_fromTag_closure: function TonAccountContextType_fromTag_closure(t0) { + this.tag = t0; + }, + TonAccountContextType_fromTag_closure0: function TonAccountContextType_fromTag_closure0() { + }, + TonAccountContext: function TonAccountContext() { + }, + TonAccountLegacyContext: function TonAccountLegacyContext(t0, t1) { + this.version = t0; + this.bouncable = t1; + }, + TonAccountSubWalletContext: function TonAccountSubWalletContext(t0, t1, t2) { + this.subwalletId = t0; + this.version = t1; + this.bouncable = t2; + }, + TonAccountV5CustomContext: function TonAccountV5CustomContext(t0, t1, t2) { + this.walletId = t0; + this.version = t1; + this.bouncable = t2; + }, + TonAccountV5SubWalletContext: function TonAccountV5SubWalletContext(t0, t1, t2) { + this.subwalletId = t0; + this.version = t1; + this.bouncable = t2; + }, + _TonAccountContext_Object_CborSerializable: function _TonAccountContext_Object_CborSerializable() { + }, + _TonAccountContext_Object_CborSerializable_Equatable: function _TonAccountContext_Object_CborSerializable_Equatable() { + }, TronAccountResourceInfo_TronAccountResourceInfo$fromCborBytesOrObject(obj) { var t7, t8, cbor = A.CborSerializable_decodeCborTags(null, obj, B.List_200_195_101, type$.CborListValue_dynamic), @@ -16518,7 +16681,7 @@ TronChainType: function TronChainType(t0, t1, t2) { this.id = t0; this.genesisBlockNumber = t1; - this._name = t2; + this._core$_name = t2; }, TronChainType_fromName_closure: function TronChainType_fromName_closure(t0) { this.lower = t0; @@ -16892,8 +17055,8 @@ t2.toString; balance = new A.Live(A.IntegerBalance_IntegerBalance(t1, t2, false), A.LinkedHashSet_LinkedHashSet$_empty(type$.void_Function), type$.Live_IntegerBalance); updated = A.ExtractCborList_elementAt(cbor, 4, type$.DateTime); - t2 = A.TonAddress_TonAddress(minterAddress); - t1 = A.TonAddress_TonAddress(walletAddress); + t2 = A.TonAddress_TonAddress(minterAddress, null); + t1 = A.TonAddress_TonAddress(walletAddress, null); t3 = type$.nullable_String; A.ExtractCborList_elementAt(cbor, 5, t3); A.ExtractCborList_elementAt(cbor, 6, t3); @@ -17104,25 +17267,17 @@ _.data = t3; }, Web3ChainMessage_Web3ChainMessage$deserialize(bytes, object) { - var response, t2, t3, - tag = A.CborSerializable_decode(bytes, null, object, type$.CborTagValue_dynamic), + var tag = A.CborSerializable_decode(bytes, null, object, type$.CborTagValue_dynamic), type = A.Web3MessageTypes_fromTag(tag.tags), - t1 = tag.value; - if (!(t1 instanceof A.CborListValue)) - A.throwExpression($.$get$WalletExceptionConst_invalidSerializationData()); - type$.CborListValue_dynamic._as(t1); - response = A.ExtractCborList_getCborTag(t1, 2); - t2 = A.ExtractCborList_elementAt(t1, 0, type$.List_int); - t1 = A.Web3APPAuthentication_Web3APPAuthentication$deserialize(A.ExtractCborList_getCborTag(t1, 1)); - t3 = response == null ? null : A.Web3ResponseMessage_Web3ResponseMessage$deserialize(response); - return new A.Web3ChainMessage(A.BytesUtils_toBytes(t2, true), type, t1, t3); - }, - Web3ChainMessage: function Web3ChainMessage(t0, t1, t2, t3) { - var _ = this; - _.message = t0; - _.type = t1; - _.authenticated = t2; - _.response = t3; + values = A.QuickCborTag_get_getList(tag), + t1 = A.ExtractCborList_elementAt(values, 0, type$.List_int), + t2 = A.Web3APPAuthentication_Web3APPAuthentication$deserialize(A.ExtractCborList_getCborTag(values, 1)); + return new A.Web3ChainMessage(A.BytesUtils_toBytes(t1, true), type, t2); + }, + Web3ChainMessage: function Web3ChainMessage(t0, t1, t2) { + this.message = t0; + this.type = t1; + this.authenticated = t2; }, Web3EncryptedMessage_Web3EncryptedMessage$deserialize(bytes) { var values, t1, t2, exception, hex = null, object = null; @@ -17143,43 +17298,32 @@ _Web3EncryptedMessage_Object_CborSerializable: function _Web3EncryptedMessage_Object_CborSerializable() { }, Web3ExceptionMessage_Web3ExceptionMessage$deserialize(bytes, object) { - var t4, t5, t6, - values = A.CborSerializable_cborTagValue(bytes, null, object, B.List_100_15, type$.CborListValue_dynamic), - t1 = type$.String, - t2 = A.ExtractCborList_elementAt(values, 0, t1), - t3 = A.ExtractCborList_elementAt(values, 1, type$.int); - t1 = A.ExtractCborList_elementAt(values, 2, t1); - t4 = type$.nullable_String; - t5 = A.ExtractCborList_elementAt(values, 3, t4); - t6 = A.ExtractCborList_elementAt(values, 4, type$.nullable_Map_String_dynamic); - return new A.Web3ExceptionMessage(t2, t3, t1, t5, A.ExtractCborList_elementAt(values, 5, t4), A.StringUtils_tryFromJson(t6)); + var values = A.CborSerializable_cborTagValue(bytes, null, object, B.List_100_15, type$.CborListValue_dynamic), + t1 = type$.String; + return new A.Web3ExceptionMessage(A.ExtractCborList_elementAt(values, 0, t1), A.ExtractCborList_elementAt(values, 1, type$.int), A.ExtractCborList_elementAt(values, 2, t1), A.ExtractCborList_elementAt(values, 3, type$.nullable_String)); }, - Web3ExceptionMessage: function Web3ExceptionMessage(t0, t1, t2, t3, t4, t5) { + Web3ExceptionMessage: function Web3ExceptionMessage(t0, t1, t2, t3) { var _ = this; _.message = t0; _.code = t1; _.walletCode = t2; _.data = t3; - _.requestId = t4; - _.request = t5; }, Web3ExceptionMessage_toJson_closure: function Web3ExceptionMessage_toJson_closure() { }, - Web3ResponseMessage_Web3ResponseMessage$deserialize(object) { - var values = A.CborSerializable_cborTagValue(null, null, object, B.List_100_13, type$.CborListValue_dynamic); - return new A.Web3ResponseMessage(A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 0, type$.String), type$.Map_String_dynamic).$index(0, "result"), A.NetworkType_fromTag(A.ExtractCborList_elementAt(values, 1, type$.nullable_List_int))); - }, Web3ResponseMessage: function Web3ResponseMessage(t0, t1) { this.result = t0; this.network = t1; }, - Web3WalletResponseMessage: function Web3WalletResponseMessage(t0, t1, t2) { - this.authenticated = t0; - this.result = t1; - this.network = t2; + Web3WalletResponseMessage: function Web3WalletResponseMessage(t0, t1, t2, t3) { + var _ = this; + _.authenticated = t0; + _.chain = t1; + _.result = t2; + _.network = t3; }, Web3MessageCore_Web3MessageCore$deserialize(bytes) { - var cbor, type, t1, values, t2, t3, exception, _null = null, hex = null, object = null; + var cbor, type, t1, values, t2, t3, t4, exception, _null = null, hex = null, object = null; try { cbor = A.CborSerializable_decode(bytes, hex, object, type$.CborTagValue_dynamic); type = A.Web3MessageTypes_fromTag(cbor.tags); @@ -17188,14 +17332,18 @@ t1 = A.Web3ChainMessage_Web3ChainMessage$deserialize(_null, cbor); return t1; case B.Web3MessageTypes_List_100_13_response: - t1 = A.Web3ResponseMessage_Web3ResponseMessage$deserialize(cbor); - return t1; + values = A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_100_13, type$.CborListValue_dynamic); + t1 = A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 0, type$.String), type$.Map_String_dynamic).$index(0, "result"); + t2 = A.NetworkType_fromTag(A.ExtractCborList_elementAt(values, 1, type$.nullable_List_int)); + return new A.Web3ResponseMessage(t1, t2); case B.Web3MessageTypes_List_100_14_walletResponse: values = A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_100_14, type$.CborListValue_dynamic); t1 = A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 0, type$.String), type$.Map_String_dynamic).$index(0, "result"); t2 = A.Web3APPAuthentication_Web3APPAuthentication$deserialize(A.ExtractCborList_getCborTag(values, 1)); - t3 = A.NetworkType_fromTag(A.ExtractCborList_elementAt(values, 2, type$.nullable_List_int)); - return new A.Web3WalletResponseMessage(t2, t1, t3); + t3 = type$.nullable_List_int; + t4 = A.NetworkType_fromTag(A.ExtractCborList_elementAt(values, 2, t3)); + t3 = A.BytesUtils_tryToBytes(A.ExtractCborList_elementAt(values, 3, t3), true); + return new A.Web3WalletResponseMessage(t2, t3, t1, t4); case B.Web3MessageTypes_List_100_12_walletRequest: t1 = type$.dynamic; t1 = A.Web3RequestParams_Web3RequestParams$deserialize(cbor, t1, t1, type$.Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_APIProvider, type$.Web3ChainAccount_nullable_Object, type$.Web3Chain_of_nullable_Object_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_nullable_Object); @@ -17210,19 +17358,24 @@ throw A.wrapException(B.Web3RequestException_chs); } } catch (exception) { - throw A.wrapException(B.Web3RequestException_chs); + if (A.unwrapException(exception) instanceof A.Web3RequestException) + throw exception; + else + throw A.wrapException(B.Web3RequestException_chs); } }, Web3MessageCore: function Web3MessageCore() { }, _Web3MessageCore_Object_CborSerializable: function _Web3MessageCore_Object_CborSerializable() { }, + _Web3MessageCore_Object_CborSerializable_JsonSerialization: function _Web3MessageCore_Object_CborSerializable_JsonSerialization() { + }, Web3MessageTypes_fromTag(tags) { return B.JSArray_methods.firstWhere$2$orElse(B.List_CB6, new A.Web3MessageTypes_fromTag_closure(tags), new A.Web3MessageTypes_fromTag_closure0()); }, Web3MessageTypes: function Web3MessageTypes(t0, t1) { this.tag = t0; - this._name = t1; + this._core$_name = t1; }, Web3MessageTypes_fromTag_closure: function Web3MessageTypes_fromTag_closure(t0) { this.tags = t0; @@ -17240,6 +17393,9 @@ case B.NetworkType_4QF: tag.toString; return A.Web3SolanaRequestMethods_fromId(J.get$last$ax(tag)); + case B.NetworkType_66M: + tag.toString; + return A.Web3TonRequestMethods_fromId(J.get$last$ax(tag)); default: throw A.wrapException(B.Web3RequestException_IAR); } @@ -17328,6 +17484,9 @@ case B.NetworkType_4QF: chain = A.Web3SolanaChain_Web3SolanaChain$deserialize(decode); break; + case B.NetworkType_66M: + chain = A.Web3TonChain_Web3TonChain$deserialize(decode); + break; default: throw A.wrapException($.$get$WalletExceptionConst_unsuportedFeature()); } @@ -17365,6 +17524,9 @@ case B.NetworkType_4QF: param = A.Web3SolanaRequestParam_Web3SolanaRequestParam$deserialize(_null, _null, object, type$.dynamic); break; + case B.NetworkType_66M: + param = A.Web3TonRequestParam_Web3TonRequestParam$deserialize(_null, _null, object, type$.dynamic); + break; default: throw A.wrapException(B.Web3RequestException_chs); } @@ -17537,7 +17699,7 @@ t1 = A.stringReplaceAllUnchecked(t1, "\x1f", "\\u001F"); $content = A.stringReplaceAllUnchecked(t1, "\x7f", "\\u007F"); } - return new A.Web3EthreumPersonalSign(A.Web3ValidatorUtils_parseAddress(json, "address", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, new A.Web3EthreumPersonalSign_Web3EthreumPersonalSign$fromJson_closure(), type$.ETHAddress), A.Web3ValidatorUtils_parseHex(json, _s8_, B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, type$.String), $content); + return new A.Web3EthreumPersonalSign(A.Web3ValidatorUtils_parseAddress("Ethereum address", json, "address", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, new A.Web3EthreumPersonalSign_Web3EthreumPersonalSign$fromJson_closure(), type$.ETHAddress), A.Web3ValidatorUtils_parseHex(json, _s8_, B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, type$.String), $content); }, Web3EthreumPersonalSign: function Web3EthreumPersonalSign(t0, t1, t2) { this.address = t0; @@ -17554,6 +17716,7 @@ Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson(json) { var t4, t5, ethTransactionType, t6, _s84_ = "The provided transaction type does not correspond with the specified gas parameters.", + _s16_ = "Ethereum address", t1 = type$.nullable_BigInt, gasPrice = A.Web3ValidatorUtils_parseBigInt(json, "gasPrice", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, t1), maxPriorityFeePerGas = A.Web3ValidatorUtils_parseBigInt(json, "maxPriorityFeePerGas", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, t1), @@ -17589,13 +17752,13 @@ ethTransactionType = B.ETHTransactionType_2; else if (t3) ethTransactionType = B.ETHTransactionType_0; - t3 = A.Web3ValidatorUtils_parseAddress(json, "from", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, new A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure0(), type$.ETHAddress); - t4 = A.Web3ValidatorUtils_parseAddress(json, "to", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, new A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure1(), type$.nullable_ETHAddress); + t3 = A.Web3ValidatorUtils_parseAddress(_s16_, json, "from", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, new A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure0(), type$.ETHAddress); + t4 = A.Web3ValidatorUtils_parseAddress(_s16_, json, "to", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, new A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure1(), type$.nullable_ETHAddress); t5 = A.Web3ValidatorUtils_parseBigInt(json, "value", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, type$.BigInt); t2 = A.Web3ValidatorUtils_parseInt(json, "gas", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, t2); t6 = A.Web3ValidatorUtils_parseHex(json, "data", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, type$.nullable_List_int); if (t6 == null) - t6 = B.List_empty4; + t6 = B.List_empty5; return A.Web3EthreumSendTransaction$(A.Web3ValidatorUtils_parseBigInt(json, "chainId", B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, t1), t6, t3, t2, gasPrice, maxFeePerGas, maxPriorityFeePerGas, t4, ethTransactionType, t5); }, Web3EthreumSendTransaction: function Web3EthreumSendTransaction(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) { @@ -17622,7 +17785,7 @@ return new A.Web3EthreumTypdedData(address, typedData, domain); }, Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson(json) { - var address = A.Web3ValidatorUtils_parseAddress(json, "address", B.Web3EthereumRequestMethods_MEg, new A.Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson_closure(), type$.ETHAddress), + var address = A.Web3ValidatorUtils_parseAddress("Ethereum address", json, "address", B.Web3EthereumRequestMethods_MEg, new A.Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson_closure(), type$.ETHAddress), typedData = A.Web3EthereumValidator_parseTypedData(A._asString(json.$index(0, "typedData")), B.Web3EthereumRequestMethods_MEg); return A.Web3EthreumTypdedData$(address, typedData.get$version() !== B.EIP712Version_1 ? A.EIP712Domain_fromJson(type$.Eip712TypedData._as(typedData).domain) : null, typedData); }, @@ -17641,7 +17804,7 @@ _.chainId = t0; _.keyIndex = t1; _.address = t2; - _.defaultAddress = t3; + _._defaultAddress = t3; }, Web3EthereumChain_Web3EthereumChain$deserialize(object) { var t4, t5, @@ -17669,10 +17832,10 @@ }, Web3EthereumChain_toCbor_closure0: function Web3EthereumChain_toCbor_closure0() { }, - Web3EthereumChain_currentChainAccounts_closure: function Web3EthereumChain_currentChainAccounts_closure(t0) { - this.$this = t0; + Web3EthereumChain_chainAccounts_closure: function Web3EthereumChain_chainAccounts_closure(t0) { + this.chain = t0; }, - Web3EthereumChain_currentChainAccounts_closure0: function Web3EthereumChain_currentChainAccounts_closure0(t0) { + Web3EthereumChain_chainAccounts_closure0: function Web3EthereumChain_chainAccounts_closure0(t0) { this.i = t0; }, Web3EthereumValidator_parseTypedData(data, method) { @@ -17686,7 +17849,7 @@ t1 = A.unwrapException(exception); if (t1 instanceof A.SolidityAbiException) { e = t1; - throw A.wrapException(A.Web3RequestException$(-32602, "Invalid typedData parameter: " + e.message, "Invalid method parameters\t", "WEB3-5070")); + throw A.wrapException(A.Web3RequestException$(-32602, "Invalid typedData parameter: " + e.message, "Invalid method parameters.", "WEB3-5070")); } else throw A.wrapException(B.Web3RequestException_gc6); } @@ -17753,6 +17916,9 @@ param = new A.Web3SolanaRequestAccounts(); break; case B.Web3SolanaRequestMethods_6YB: + case B.Web3SolanaRequestMethods_upD: + case B.Web3SolanaRequestMethods_mJH: + case B.Web3SolanaRequestMethods_a3R: param = A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize(bytes, hex, object); break; case B.Web3SolanaRequestMethods_102_solana_signMessage_List_empty: @@ -17775,21 +17941,43 @@ }, Web3SolanaRequestAccounts: function Web3SolanaRequestAccounts() { }, + Web3SolanaSignMessageResponse: function Web3SolanaSignMessageResponse(t0, t1) { + this.address = t0; + this.signature = t1; + }, Web3SolanaSignMessage: function Web3SolanaSignMessage(t0, t1, t2) { this.address = t0; this.challeng = t1; this.content = t2; }, + Web3SolanaSendTransactionOptions_Web3SolanaSendTransactionOptions$fromJson(json) { + var t1 = A._asStringQ(json.$index(0, "preflightCommitment")), + t2 = A._asBool(json.$index(0, "skipPreflight")); + return new A.Web3SolanaSendTransactionOptions(A._asIntQ(json.$index(0, "maxRetries")), t2, t1, A._asIntQ(json.$index(0, "minContextSlot")), A._asBool(json.$index(0, "signers"))); + }, + Web3SolanaSendTransaction_Web3SolanaSendTransaction(messages, method, sendConfig) { + switch (method) { + case B.Web3SolanaRequestMethods_a3R: + case B.Web3SolanaRequestMethods_upD: + case B.Web3SolanaRequestMethods_mJH: + case B.Web3SolanaRequestMethods_6YB: + break; + default: + throw A.wrapException(B.Web3RequestException_chs); + } + return new A.Web3SolanaSendTransaction(messages, sendConfig, type$.Web3SolanaRequestMethods._as(method)); + }, Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize(bytes, hex, object) { var t2, t3, t1 = type$.CborListValue_dynamic, - values = A.CborSerializable_cborTagValue(bytes, hex, object, B.List_100_12, t1); + values = A.CborSerializable_cborTagValue(bytes, hex, object, B.List_100_12, t1), + method = A.Web3RequestMethods_fromTag(A.ExtractCborList_elementAt(values, 0, type$.nullable_List_int)); t1 = A.ExtractCborList_castValue(A.ExtractCborList_elemetAs(values, 1, t1), type$.CborTagValue_dynamic); t2 = A._arrayInstanceType(t1); t3 = t2._eval$1("MappedListIterable<1,Web3SolanaSendTransactionData>"); t3 = A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("Web3SolanaSendTransactionData(1)")._as(new A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure()), t3), true, t3._eval$1("ListIterable.E")); t2 = A.ExtractCborList_getCborTag(values, 2); - return new A.Web3SolanaSendTransaction(t3, t2 == null ? null : A.QuickCbor_to(t2, new A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure0(), type$.nullable_Web3SolanaSendTransactionOptions, type$.CborObject)); + return A.Web3SolanaSendTransaction_Web3SolanaSendTransaction(t3, method, t2 == null ? null : A.QuickCbor_to(t2, new A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure0(), type$.nullable_Web3SolanaSendTransactionOptions, type$.CborObject)); }, Web3SolanaSendTransactionOptions: function Web3SolanaSendTransactionOptions(t0, t1, t2, t3, t4) { var _ = this; @@ -17804,9 +17992,10 @@ this.id = t1; this.messageBytes = t2; }, - Web3SolanaSendTransaction: function Web3SolanaSendTransaction(t0, t1) { + Web3SolanaSendTransaction: function Web3SolanaSendTransaction(t0, t1, t2) { this.messages = t0; this.sendConfig = t1; + this.method = t2; }, Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure: function Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure() { }, @@ -17825,7 +18014,7 @@ _.genesis = t0; _.keyIndex = t1; _.address = t2; - _.defaultAddress = t3; + _._defaultAddress = t3; }, Web3SolanaChain_Web3SolanaChain$deserialize(object) { var t4, t5, @@ -17853,15 +18042,157 @@ }, Web3SolanaChain_toCbor_closure0: function Web3SolanaChain_toCbor_closure0() { }, - Web3SolanaChain_currentChainAccounts_closure: function Web3SolanaChain_currentChainAccounts_closure(t0) { - this.$this = t0; + Web3SolanaChain_getPermission_closure: function Web3SolanaChain_getPermission_closure(t0) { + this.address = t0; + }, + Web3SolanaChain_chainAccounts_closure: function Web3SolanaChain_chainAccounts_closure(t0) { + this.chain = t0; }, - Web3SolanaChain_currentChainAccounts_closure0: function Web3SolanaChain_currentChainAccounts_closure0(t0) { + Web3SolanaChain_chainAccounts_closure0: function Web3SolanaChain_chainAccounts_closure0(t0) { this.i = t0; }, - Web3SolanaChain_getPermission_closure: function Web3SolanaChain_getPermission_closure(t0) { + Web3TonRequestMethods_fromId(id) { + return B.JSArray_methods.firstWhere$2$orElse($.Web3TonRequestMethods_values, new A.Web3TonRequestMethods_fromId_closure(id), new A.Web3TonRequestMethods_fromId_closure0()); + }, + Web3TonRequestMethods_fromName($name) { + return A.QuickImutableList_firstWhereOrNull($.Web3TonRequestMethods_values, new A.Web3TonRequestMethods_fromName_closure($name), null, type$.Web3TonRequestMethods); + }, + Web3TonRequestMethods: function Web3TonRequestMethods(t0, t1, t2) { + this.id = t0; + this.name = t1; + this.methodsName = t2; + }, + Web3TonRequestMethods_fromId_closure: function Web3TonRequestMethods_fromId_closure(t0) { + this.id = t0; + }, + Web3TonRequestMethods_fromId_closure0: function Web3TonRequestMethods_fromId_closure0() { + }, + Web3TonRequestMethods_fromName_closure: function Web3TonRequestMethods_fromName_closure(t0) { + this.name = t0; + }, + Web3TonRequestParam_Web3TonRequestParam$deserialize(bytes, hex, object, RESPONSE) { + var param, values, challeng, + t1 = type$.CborListValue_dynamic; + switch (A.Web3RequestMethods_fromTag(A.ExtractCborList_elementAt(A.CborSerializable_cborTagValue(bytes, hex, object, B.List_100_12, t1), 0, type$.nullable_List_int))) { + case B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty: + A.CborSerializable_cborTagValue(bytes, hex, object, B.List_100_12, type$.CborObject); + param = new A.Web3TonRequestAccounts(); + break; + case B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty: + param = A.Web3TonSendTransaction_Web3TonSendTransaction$deserialize(bytes, hex, object); + break; + case B.Web3TonRequestMethods_102_ton_signMessage_List_empty: + values = A.CborSerializable_cborTagValue(bytes, hex, object, B.List_100_12, t1); + challeng = A.ExtractCborList_elementAt(values, 2, type$.List_int); + param = new A.Web3TonSignMessage(A.TonAddress_TonAddress(A.ExtractCborList_elementAt(values, 1, type$.String), null), A.BytesUtils_toHexString(challeng, true, "0x"), A.ExtractCborList_elementAt(values, 3, type$.nullable_String)); + break; + default: + throw A.wrapException(B.Web3RequestException_chs); + } + if (!RESPONSE._eval$1("Web3TonRequestParam<0>")._is(param)) + throw A.wrapException(B.Web3RequestException_chs); + return param; + }, + Web3TonPermissionRequestParam: function Web3TonPermissionRequestParam() { + }, + Web3TonRequestParam: function Web3TonRequestParam() { + }, + Web3TonRequestAccounts: function Web3TonRequestAccounts() { + }, + Web3TonSignMessage: function Web3TonSignMessage(t0, t1, t2) { + this.address = t0; + this.challeng = t1; + this.content = t2; + }, + Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson(json, workchain) { + var t1 = type$.nullable_Cell; + return new A.Web3TonTransactionMessage(A.Web3ValidatorUtils_parseAddress("Ton address", json, "address", B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty, new A.Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson_closure(workchain), type$.TonAddress), A.Web3ValidatorUtils_parseBigInt(json, "amount", B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty, type$.BigInt), A.Web3ValidatorUtils_parseTonCell(json, "stateInit", B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty, t1), A.Web3ValidatorUtils_parseTonCell(json, "payload", B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty, t1)); + }, + Web3TonSendTransaction_Web3TonSendTransaction$fromJson(account, json) { + var t1 = A.Web3ValidatorUtils_parseInt(json, "validUntil", B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty, type$.int), + t2 = type$.Web3TonTransactionMessage, + t3 = J.map$1$1$ax(A.Web3ValidatorUtils_parseList(json, "messages", B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty, type$.List_dynamic, type$.dynamic), new A.Web3TonSendTransaction_Web3TonSendTransaction$fromJson_closure(account), t2); + return new A.Web3TonSendTransaction(account, t1, A.List_List$unmodifiable(A.List_List$of(t3, true, t3.$ti._eval$1("ListIterable.E")), t2)); + }, + Web3TonSendTransaction_Web3TonSendTransaction$deserialize(bytes, hex, object) { + var t3, t4, + t1 = type$.CborListValue_dynamic, + values = A.CborSerializable_cborTagValue(bytes, hex, object, B.List_100_12, t1), + t2 = A.TonAddress_TonAddress(A.ExtractCborList_elementAt(values, 1, type$.String), null); + t1 = A.ExtractCborList_elemetAs(values, 2, t1).value; + t3 = A._arrayInstanceType(t1)._eval$1("CastList<1,CborTagValue<@>>"); + t4 = t3._eval$1("MappedListIterable"); + t4 = A.List_List$of(new A.MappedListIterable(new A.CastList(t1, t3), t3._eval$1("Web3TonTransactionMessage(ListBase.E)")._as(new A.Web3TonSendTransaction_Web3TonSendTransaction$deserialize_closure()), t4), true, t4._eval$1("ListIterable.E")); + return new A.Web3TonSendTransaction(t2, A.ExtractCborList_elementAt(values, 3, type$.int), A.List_List$unmodifiable(t4, type$.Web3TonTransactionMessage)); + }, + Web3TonTransactionMessage: function Web3TonTransactionMessage(t0, t1, t2, t3) { + var _ = this; + _.address = t0; + _.amount = t1; + _.stateInit = t2; + _.payload = t3; + }, + Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson_closure: function Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson_closure(t0) { + this.workchain = t0; + }, + Web3TonSendTransaction: function Web3TonSendTransaction(t0, t1, t2) { + this.account = t0; + this.validUntil = t1; + this.messages = t2; + }, + Web3TonSendTransaction_Web3TonSendTransaction$fromJson_closure: function Web3TonSendTransaction_Web3TonSendTransaction$fromJson_closure(t0) { + this.account = t0; + }, + Web3TonSendTransaction_Web3TonSendTransaction$deserialize_closure: function Web3TonSendTransaction_Web3TonSendTransaction$deserialize_closure() { + }, + Web3TonSendTransaction_toCbor_closure: function Web3TonSendTransaction_toCbor_closure() { + }, + Web3TonSendTransaction_toJson_closure: function Web3TonSendTransaction_toJson_closure() { + }, + _Web3TonTransactionMessage_Object_CborSerializable: function _Web3TonTransactionMessage_Object_CborSerializable() { + }, + Web3TonChainAccount: function Web3TonChainAccount(t0, t1, t2, t3) { + var _ = this; + _.workChain = t0; + _.keyIndex = t1; + _.address = t2; + _._defaultAddress = t3; + }, + Web3TonChain_Web3TonChain$deserialize(object) { + var t4, t5, + values = A.CborSerializable_cborTagValue(null, null, object, B.List_80_0_11, type$.CborListValue_dynamic), + t1 = type$.List_dynamic, + t2 = type$.Web3TonChainAccount, + t3 = J.map$1$1$ax(A.ExtractCborList_elementAt(values, 0, t1), new A.Web3TonChain_Web3TonChain$deserialize_closure(), t2); + t3 = A.List_List$of(t3, true, t3.$ti._eval$1("ListIterable.E")); + t4 = A.ExtractCborList_elementAt(values, 1, type$.int); + t5 = type$.Web3AccountAcitvity; + t1 = J.map$1$1$ax(A.ExtractCborList_elementAt(values, 2, t1), new A.Web3TonChain_Web3TonChain$deserialize_closure0(), t5); + t1 = A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")); + return new A.Web3TonChain(t4, A.List_List$unmodifiable(t3, t2), A.List_List$unmodifiable(t1, t5)); + }, + Web3TonChain: function Web3TonChain(t0, t1, t2) { + this._workChain = t0; + this._accounts = t1; + this._activities = t2; + }, + Web3TonChain_Web3TonChain$deserialize_closure: function Web3TonChain_Web3TonChain$deserialize_closure() { + }, + Web3TonChain_Web3TonChain$deserialize_closure0: function Web3TonChain_Web3TonChain$deserialize_closure0() { + }, + Web3TonChain_toCbor_closure: function Web3TonChain_toCbor_closure() { + }, + Web3TonChain_toCbor_closure0: function Web3TonChain_toCbor_closure0() { + }, + Web3TonChain_getPermission_closure: function Web3TonChain_getPermission_closure(t0) { this.address = t0; }, + Web3TonChain_chainAccounts_closure: function Web3TonChain_chainAccounts_closure(t0) { + this.chain = t0; + }, + Web3TonChain_chainAccounts_closure0: function Web3TonChain_chainAccounts_closure0(t0) { + this.i = t0; + }, Web3TronRequestMethods_fromId(id) { return B.JSArray_methods.firstWhere$2$orElse($.Web3TronRequestMethods_values, new A.Web3TronRequestMethods_fromId_closure(id), new A.Web3TronRequestMethods_fromId_closure0()); }, @@ -17935,7 +18266,7 @@ _.chain = t0; _.keyIndex = t1; _.address = t2; - _.defaultAddress = t3; + _._defaultAddress = t3; }, Web3TronChain_Web3TronChain$deserialize(object) { var t4, t5, @@ -17963,16 +18294,27 @@ }, Web3TronChain_toCbor_closure0: function Web3TronChain_toCbor_closure0() { }, - Web3TronChain_currentChainAccounts_closure: function Web3TronChain_currentChainAccounts_closure(t0) { - this.$this = t0; + Web3TronChain_getPermission_closure: function Web3TronChain_getPermission_closure(t0) { + this.address = t0; + }, + Web3TronChain_chainAccounts_closure: function Web3TronChain_chainAccounts_closure(t0) { + this.chain = t0; }, - Web3TronChain_currentChainAccounts_closure0: function Web3TronChain_currentChainAccounts_closure0(t0) { + Web3TronChain_chainAccounts_closure0: function Web3TronChain_chainAccounts_closure0(t0) { this.i = t0; }, - Web3TronChain_getPermission_closure: function Web3TronChain_getPermission_closure(t0) { - this.address = t0; + Web3ValidatorUtils_isValidMap(data, $K, $V, $T) { + var toMap; + if (data == null && $T._is(null)) { + $T._as(null); + return null; + } + toMap = A.MethodUtils_nullOnException(new A.Web3ValidatorUtils_isValidMap_closure(data, $K, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("Map<1,2>")); + if (toMap != null) + return $T._as(toMap); + throw A.wrapException(A.Web3RequestExceptionConst_invalidMap(null)); }, - Web3ValidatorUtils_parseAddress(json, key, method, onParse, $T) { + Web3ValidatorUtils_parseAddress(addressName, json, key, method, onParse, $T) { var value, addr, t1 = json.$index(0, key); if (t1 == null) @@ -17983,11 +18325,11 @@ return null; } if (typeof value != "string") - throw A.wrapException(A.Web3RequestExceptionConst_invalidStringArgrument("Ethereum address")); + throw A.wrapException(A.Web3RequestExceptionConst_invalidStringArgrument(addressName)); addr = A.MethodUtils_nullOnException(new A.Web3ValidatorUtils_parseAddress_closure(onParse, value, $T), $T); if (addr != null) return addr; - throw A.wrapException(A.Web3RequestException$(-32602, "Invalid address argument provided for Ethereum. Please ensure the input is a valid Ethereum and try again.", "Invalid method parameters\t", "WEB3-0030")); + throw A.wrapException(A.Web3RequestException$(-32602, "Invalid address argument provided for " + addressName + ". Please ensure the input is a valid " + addressName + " and try again.", "Invalid method parameters.", "WEB3-0030")); }, Web3ValidatorUtils_parseHex(json, key, method, $T) { var value, toBytes, @@ -18006,7 +18348,25 @@ return $T._as(value); return $T._as(toBytes); } - throw A.wrapException(A.Web3RequestExceptionConst_invalidHexBytes(key)); + throw A.wrapException(A.Web3RequestException$(-32602, "Invalid hex string for " + key + ": Hex must be valid, start with '0x', and have an even length. Please check the input and try again.", "Invalid method parameters.", "WEB3-0040")); + }, + Web3ValidatorUtils_parseTonCell(json, key, method, $T) { + var value, cell, t1 = {}, + t2 = json.$index(0, key); + if (t2 == null) + t2 = json.$index(0, A.StrUtils_toSnakeCase(key)); + value = t2 == null ? null : J.toString$0$(t2); + t1.value = value; + t2 = value == null ? null : value.length === 0; + t2 = t2 === true ? t1.value = null : value; + if ($T._is(null) && t2 == null) { + $T._as(null); + return null; + } + cell = A.MethodUtils_nullOnException(new A.Web3ValidatorUtils_parseTonCell_closure(t1), type$.Cell); + if (cell != null) + return $T._as(cell); + throw A.wrapException(A.Web3RequestException$(-32602, "Invalid base64 string for " + key + ": Please check the input and try again.", "Invalid method parameters.", "WEB3-0040")); }, Web3ValidatorUtils_parseList(json, key, method, $T, $E) { var t1, toList, @@ -18027,7 +18387,7 @@ } } else return $T._as(toList); - throw A.wrapException(A.Web3RequestExceptionConst_invalidHexBytes(key)); + throw A.wrapException(A.Web3RequestExceptionConst_invalidList(key)); }, Web3ValidatorUtils_parseMap(json, key, method, $T) { var toMap, @@ -18041,7 +18401,7 @@ toMap = A.MethodUtils_nullOnException(new A.Web3ValidatorUtils_parseMap_closure(value), type$.Map_String_dynamic); if (toMap != null) return $T._as(toMap); - throw A.wrapException(A.Web3RequestExceptionConst_invalidHexBytes(key)); + throw A.wrapException(A.Web3RequestExceptionConst_invalidMap(key)); }, Web3ValidatorUtils_parseString(json, key, method, $T) { var value = json.$index(0, key); @@ -18067,7 +18427,7 @@ toBigInt = A.BigintUtils_tryParse(value); if (toBigInt != null) return $T._as(toBigInt); - throw A.wrapException(A.Web3RequestException$(-32602, "Invalid number argument provided for " + key + ": Numbers must be valid hexadecimal values starting with '0x'. Please check the input and try again.", "Invalid method parameters\t", "WEB3-0070")); + throw A.wrapException(A.Web3RequestException$(-32602, "Invalid number argument provided for " + key + ": Numbers must be valid hexadecimal values starting with '0x'. Please check the input and try again.", "Invalid method parameters.", "WEB3-0070")); }, Web3ValidatorUtils_parseInt(json, key, method, $T) { var toBigInt, @@ -18083,11 +18443,19 @@ return $T._as(toBigInt); throw A.wrapException(A.Web3RequestExceptionConst_invalidStringArgrument(key)); }, + Web3ValidatorUtils_isValidMap_closure: function Web3ValidatorUtils_isValidMap_closure(t0, t1, t2) { + this.data = t0; + this.K = t1; + this.V = t2; + }, Web3ValidatorUtils_parseAddress_closure: function Web3ValidatorUtils_parseAddress_closure(t0, t1, t2) { this.onParse = t0; this.value = t1; this.T = t2; }, + Web3ValidatorUtils_parseTonCell_closure: function Web3ValidatorUtils_parseTonCell_closure(t0) { + this._box_0 = t0; + }, Web3ValidatorUtils_parseList_closure: function Web3ValidatorUtils_parseList_closure(t0, t1) { this.value = t0; this.E = t1; @@ -18257,7 +18625,7 @@ }, BlockforestProvider: function BlockforestProvider(t0) { this.rpc = t0; - this._provider4$_id = 0; + this._provider6$_id = 0; }, BlockforestProvider_request_closure: function BlockforestProvider_request_closure() { }, @@ -18320,7 +18688,7 @@ }, EVMRPC: function EVMRPC(t0) { this.rpc = t0; - this._provider$_id = 0; + this._provider0$_id = 0; }, ETHTransactionType_fromPrefix(prefix) { return B.JSArray_methods.firstWhere$1(B.List_aWR, new A.ETHTransactionType_fromPrefix_closure(prefix)); @@ -18332,7 +18700,7 @@ this.prefix = t0; }, HTTPRequestType: function HTTPRequestType(t0) { - this._name = t0; + this._core$_name = t0; }, SolAddress_SolAddress$uncheckBytes(keyBytes) { if (J.get$length$asx(keyBytes) !== 32) @@ -18376,7 +18744,7 @@ }, SolanaRPC: function SolanaRPC(t0) { this.rpc = t0; - this._provider2$_id = 0; + this._provider3$_id = 0; }, Message: function Message(t0, t1, t2, t3) { var _ = this; @@ -18466,7 +18834,7 @@ t8 = t7.length; encodedDataLength = A.SolanaTransactionUtils__encodeLength(t8); t9 = A.RawBytesLayout_RawBytesLayout(encodedAccountKeyIndexesLength.length, _s30_); - encode = A.StructLayout_StructLayout(A._setArrayType([new A.IntegerLayout(false, B.C_Endian0, 1, "programIdIndex"), t9, A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian0, 1, null), t6, _s17_), A.RawBytesLayout_RawBytesLayout(encodedDataLength.length, _s17_0), A.RawBytesLayout_RawBytesLayout(t8, "data")], t2), false, null).serialize$1(A.LinkedHashMap_LinkedHashMap$_literal(["programIdIndex", instruction.programIdIndex, _s30_, encodedAccountKeyIndexesLength, _s17_, t5, _s17_0, encodedDataLength, "data", t7], t3, t4)); + encode = A.StructLayout_StructLayout(A._setArrayType([new A.IntegerLayout(false, B.C_Endian, 1, "programIdIndex"), t9, A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian, 1, null), t6, _s17_), A.RawBytesLayout_RawBytesLayout(encodedDataLength.length, _s17_0), A.RawBytesLayout_RawBytesLayout(t8, "data")], t2), false, null).serialize$1(A.LinkedHashMap_LinkedHashMap$_literal(["programIdIndex", instruction.programIdIndex, _s30_, encodedAccountKeyIndexesLength, _s17_, t5, _s17_0, encodedDataLength, "data", t7], t3, t4)); B.JSArray_methods.setAll$2(serializedInstructions, serializedLength, encode); serializedLength += encode.length; } @@ -18491,7 +18859,7 @@ t2 = type$.JSArray_Layout_dynamic; t3 = A._arrayInstanceType(t1); t4 = t3._eval$1("MappedListIterable<1,SolAddress>"); - return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(1, B.C_Endian0, "prefix", false), A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(1, B.C_Endian0, "numRequiredSignatures", false), A.IntegerLayout$(1, B.C_Endian0, "numReadonlySignedAccounts", false), A.IntegerLayout$(1, B.C_Endian0, "numReadonlyUnsignedAccounts", false)], t2), false, "header"), A.RawBytesLayout_RawBytesLayout(encodedStaticAccountKeysLength.length, _s23_), A.LayoutConst_array(A.SolanaLayoutUtils_publicKey(null), t1.length, _s17_), A.SolanaLayoutUtils_publicKey("recentBlockhash"), A.RawBytesLayout_RawBytesLayout(encodedInstructionsLength.length, _s18_), A.RawBytesLayout_RawBytesLayout(serializedInstructions.length, _s22_), A.RawBytesLayout_RawBytesLayout(encodedAddressTableLookupsLength.length, _s25_), A.RawBytesLayout_RawBytesLayout(serializedAddressTableLookups.length, _s29_)], t2), false, null).serialize$1(A.LinkedHashMap_LinkedHashMap$_literal(["prefix", 128, "header", message.header.toJson$0(), _s23_, encodedStaticAccountKeysLength, _s17_, A.List_List$of(new A.MappedListIterable(t1, t3._eval$1("SolAddress(1)")._as(new A.SolanaTransactionUtils_serializeV0_closure()), t4), true, t4._eval$1("ListIterable.E")), "recentBlockhash", message.recentBlockhash, _s18_, encodedInstructionsLength, _s22_, serializedInstructions, _s25_, encodedAddressTableLookupsLength, _s29_, serializedAddressTableLookups], type$.String, type$.dynamic)); + return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(1, B.C_Endian, "prefix", false), A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(1, B.C_Endian, "numRequiredSignatures", false), A.IntegerLayout$(1, B.C_Endian, "numReadonlySignedAccounts", false), A.IntegerLayout$(1, B.C_Endian, "numReadonlyUnsignedAccounts", false)], t2), false, "header"), A.RawBytesLayout_RawBytesLayout(encodedStaticAccountKeysLength.length, _s23_), A.LayoutConst_array(A.SolanaLayoutUtils_publicKey(null), t1.length, _s17_), A.SolanaLayoutUtils_publicKey("recentBlockhash"), A.RawBytesLayout_RawBytesLayout(encodedInstructionsLength.length, _s18_), A.RawBytesLayout_RawBytesLayout(serializedInstructions.length, _s22_), A.RawBytesLayout_RawBytesLayout(encodedAddressTableLookupsLength.length, _s25_), A.RawBytesLayout_RawBytesLayout(serializedAddressTableLookups.length, _s29_)], t2), false, null).serialize$1(A.LinkedHashMap_LinkedHashMap$_literal(["prefix", 128, "header", message.header.toJson$0(), _s23_, encodedStaticAccountKeysLength, _s17_, A.List_List$of(new A.MappedListIterable(t1, t3._eval$1("SolAddress(1)")._as(new A.SolanaTransactionUtils_serializeV0_closure()), t4), true, t4._eval$1("ListIterable.E")), "recentBlockhash", message.recentBlockhash, _s18_, encodedInstructionsLength, _s22_, serializedInstructions, _s25_, encodedAddressTableLookupsLength, _s29_, serializedAddressTableLookups], type$.String, type$.dynamic)); }, SolanaTransactionUtils_serializeAddressTableLookups(addressTableLookups) { var t1, t2, t3, t4, serializedLength, _i, lookup, t5, t6, encodedWritableIndexesLength, t7, t8, encodedReadonlyIndexesLength, t9, t10, t11, encode, @@ -18508,9 +18876,9 @@ encodedReadonlyIndexesLength = A.SolanaTransactionUtils__encodeLength(t8); t9 = A.SolanaLayoutUtils_publicKey("accountKey"); t10 = A.RawBytesLayout_RawBytesLayout(encodedWritableIndexesLength.length, _s28_); - t6 = A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian0, 1, null), t6, "writableIndexes"); + t6 = A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian, 1, null), t6, "writableIndexes"); t11 = A.RawBytesLayout_RawBytesLayout(encodedReadonlyIndexesLength.length, _s28_0); - encode = A.StructLayout_StructLayout(A._setArrayType([t9, t10, t6, t11, A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian0, 1, null), t8, "readonlyIndexes")], t2), false, null).serialize$1(A.LinkedHashMap_LinkedHashMap$_literal(["accountKey", lookup.accountKey, _s28_, encodedWritableIndexesLength, "writableIndexes", t5, _s28_0, encodedReadonlyIndexesLength, "readonlyIndexes", t7], t3, t4)); + encode = A.StructLayout_StructLayout(A._setArrayType([t9, t10, t6, t11, A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian, 1, null), t8, "readonlyIndexes")], t2), false, null).serialize$1(A.LinkedHashMap_LinkedHashMap$_literal(["accountKey", lookup.accountKey, _s28_, encodedWritableIndexesLength, "writableIndexes", t5, _s28_0, encodedReadonlyIndexesLength, "readonlyIndexes", t7], t3, t4)); B.JSArray_methods.setAll$2(serializedAddressTableLookups, serializedLength, encode); serializedLength += encode.length; } @@ -18632,9 +19000,9 @@ instruction = instructions[_i]; t6 = J.getInterceptor$asx(instruction); t7 = A.RawBytesLayout_RawBytesLayout(J.get$length$asx(t2._as(t6.$index(instruction, _s15_))), _s15_); - t8 = A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian0, 1, "keyIndex"), J.get$length$asx(t2._as(t6.$index(instruction, _s10_))), _s10_); + t8 = A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian, 1, "keyIndex"), J.get$length$asx(t2._as(t6.$index(instruction, _s10_))), _s10_); t9 = A.RawBytesLayout_RawBytesLayout(J.get$length$asx(t2._as(t6.$index(instruction, _s10_0))), _s10_0); - encode = A.StructLayout_StructLayout(A._setArrayType([new A.IntegerLayout(false, B.C_Endian0, 1, "programIdIndex"), t7, t8, t9, A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian0, 1, "userdatum"), J.get$length$asx(t2._as(t6.$index(instruction, "data"))), "data")], t5), false, null).serialize$1(instruction); + encode = A.StructLayout_StructLayout(A._setArrayType([new A.IntegerLayout(false, B.C_Endian, 1, "programIdIndex"), t7, t8, t9, A.LayoutConst_array(new A.IntegerLayout(false, B.C_Endian, 1, "userdatum"), J.get$length$asx(t2._as(t6.$index(instruction, "data"))), "data")], t5), false, null).serialize$1(instruction); B.JSArray_methods.setAll$2(instructionBuffer, instructionBufferLength, encode); instructionBufferLength += encode.length; } @@ -19025,7 +19393,7 @@ if (encodedParam.isDynamic) { t1 = A._BigIntImpl__BigIntImpl$from(staticSize + dynamicSize); A._ABIValidator_isValidNumber("uint256", t1); - B.JSArray_methods.add$1(staticParams, new A.EncoderResult(false, A.BigintUtils_toBytes(t1, 32, B.C_Endian))); + B.JSArray_methods.add$1(staticParams, new A.EncoderResult(false, A.BigintUtils_toBytes(t1, 32, B.C_Endian0))); B.JSArray_methods.add$1(dynamicParams, encodedParam); dynamicSize += J.get$length$asx(encodedParam.encoded); } else @@ -21337,7 +21705,7 @@ }, TronProvider: function TronProvider(t0) { this.rpc = t0; - this._id = 0; + this._provider$_id = 0; }, _parseUri(uri) { return uri; @@ -22023,7 +22391,7 @@ t1 = J.getInterceptor$asx(bytes); if (t1.get$length(bytes) < 5) throw A.wrapException(A.MetadataException$("Invalid metadata bytes", _null)); - getNumber = A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(4, B.C_Endian0, _s11_, false), A.IntegerLayout$(1, B.C_Endian0, "version", false)], type$.JSArray_Layout_dynamic), false, _null).deserialize$1(t1.sublist$2(bytes, 0, 5)).value; + getNumber = A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(4, B.C_Endian, _s11_, false), A.IntegerLayout$(1, B.C_Endian, "version", false)], type$.JSArray_Layout_dynamic), false, _null).deserialize$1(t1.sublist$2(bytes, 0, 5)).value; version = A._asInt(getNumber.$index(0, "version")); magicNumber = A._asInt(getNumber.$index(0, _s11_)); metadataBytes = t1.sublist$1(bytes, 5); @@ -22075,7 +22443,7 @@ }, SubstrateRPC: function SubstrateRPC(t0) { this.rpc = t0; - this._provider0$_id = 0; + this._provider1$_id = 0; }, SubstrateSerialization: function SubstrateSerialization() { }, @@ -22382,12 +22750,24 @@ _._position = 0; _._lastMatchPosition = _._lastMatch = null; }, - TonAddress_TonAddress(address) { + TonAddress_TonAddress$fromState(bounceable, state, workChain) { + var hash, + t1 = new A.Builder(A.BitBuilder$(1023), A._setArrayType([], type$.JSArray_Cell)); + state.store$1(t1); + hash = t1.endCell$0().hash$0(); + t1 = A._setArrayType([], type$.JSArray_FriendlyAddressFlags); + if (bounceable) + t1.push(B.FriendlyAddressFlags_17); + else + t1.push(B.FriendlyAddressFlags_81); + return new A.TonAddress(workChain, hash, A.List_List$unmodifiable(t1, type$.FriendlyAddressFlags)); + }, + TonAddress_TonAddress(address, forceWorkchain) { var t1, t2, workChain, decode, flags; $.$get$TonAddress__decoder(); t1 = type$.String; t2 = type$.dynamic; - workChain = A.AddrKeyValidator_nullOrValidateAddressArgs(type$.Map_String_dynamic._as(A.LinkedHashMap_LinkedHashMap$_literal(["workchain", null], t1, t2)), "workchain", type$.int); + workChain = A.AddrKeyValidator_nullOrValidateAddressArgs(type$.Map_String_dynamic._as(A.LinkedHashMap_LinkedHashMap$_literal(["workchain", forceWorkchain], t1, t2)), "workchain", type$.int); decode = A.TonAddressUtils_decodeAddress(address); if (workChain != null && workChain !== decode.workchain) A.throwExpression(A.AddressConverterException$("Invalid address workchain.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", workChain, "workchain", decode.workchain], t1, t2))); @@ -22400,15 +22780,881 @@ this.hash = t1; this.defaultFlags = t2; }, + _BitBuilderUtils_validateBits(bits) { + if (bits < 0) + throw A.wrapException(A.BocException$("Invalid bit length.", A.LinkedHashMap_LinkedHashMap$_literal(["length", bits], type$.String, type$.dynamic))); + }, + _BitBuilderUtils_parseBigint(value, sign) { + var val, + t1 = A._isInt(value); + if (!t1 && !(value instanceof A._BigIntImpl)) + throw A.wrapException(A.BocException$("Invalid integer type. value must be int or BigInt.", A.LinkedHashMap_LinkedHashMap$_literal(["value", value, "type", J.get$runtimeType$(value).toString$0(0)], type$.String, type$.dynamic))); + val = t1 ? A._BigIntImpl__BigIntImpl$from(value) : type$.BigInt._as(value); + if (!sign && val._isNegative) + throw A.wrapException(A.BocException$("Invalid unsigned integer.", A.LinkedHashMap_LinkedHashMap$_literal(["value", val], type$.String, type$.dynamic))); + return val; + }, + BitBuilder$(size) { + return new A.BitBuilder(A.List_List$filled(B.JSNumber_methods.ceil$0(size / 8), 0, false, type$.int)); + }, + BitBuilder: function BitBuilder(t0) { + this._bytes = t0; + this._bit_builder$_length = 0; + }, + BitReader: function BitReader(t0, t1, t2) { + this._checkpoints = t0; + this._bits = t1; + this._bit_reader$_offset = t2; + }, + _BitStringUtils_validateOffset(offset, $length, at) { + var index, + _s23_ = "Offset is out of bounds"; + if (B.JSInt_methods.get$isNegative(offset)) + throw A.wrapException(A.BocException$(_s23_, A.LinkedHashMap_LinkedHashMap$_literal(["offset", offset, "length", $length, "at", at], type$.String, type$.dynamic))); + index = offset + (at == null ? 0 : at); + if (index > $length) + throw A.wrapException(A.BocException$(_s23_, A.LinkedHashMap_LinkedHashMap$_literal(["offset", index, "length", $length, "at", at], type$.String, type$.dynamic))); + }, + BitString_BitString(data, offset, $length) { + if ($length < 0) + throw A.wrapException(A.BocException$("Length is out of bounds", A.LinkedHashMap_LinkedHashMap$_literal(["length", $length], type$.String, type$.dynamic))); + return new A.BitString(offset, $length, A.BytesUtils_toBytes(data, true)); + }, + BitString: function BitString(t0, t1, t2) { + this._bit_string$_offset = t0; + this._bit_string$_length = t1; + this._data = t2; + }, + Builder: function Builder(t0, t1) { + this._builder$_bits = t0; + this._refs = t1; + }, + Cell_Cell$fromBytes(src) { + var parsed = A.BocSerialization_deserialize(src), + t1 = parsed.length; + if (t1 !== 1) + throw A.wrapException(A.BocException$("Deserialized more than one cell.", A.LinkedHashMap_LinkedHashMap$_literal(["cells", parsed], type$.String, type$.dynamic))); + if (0 >= t1) + return A.ioore(parsed, 0); + return parsed[0]; + }, + Cell$_(bits, depths, hashes, mask, refs, type) { + var t2, + t1 = A._arrayInstanceType(hashes); + t1 = A.List_List$unmodifiable(new A.MappedListIterable(hashes, t1._eval$1("@(1)")._as(new A.Cell$__closure()), t1._eval$1("MappedListIterable<1,@>")), type$.List_int); + t2 = A.List_List$unmodifiable(depths, type$.int); + return new A.Cell(type, bits, A.List_List$unmodifiable(refs, type$.Cell), mask, t1, t2); + }, + Cell_Cell(bits, exotic, refs) { + var type, wonders, mask, depths, hashes, t1; + if (exotic) { + type = A.CellUtils_resolveExotic(bits, refs).type; + wonders = A.CellUtils_wonderCalculator(type, bits, refs); + mask = wonders.mask; + depths = wonders.depths; + hashes = wonders.hashes; + } else { + if (refs.length > 4) + throw A.wrapException(A.BocException$("Invalid number of references", null)); + t1 = bits._bit_string$_length; + if (t1 > 1023) + throw A.wrapException(A.BocException$("Bits overflow", A.LinkedHashMap_LinkedHashMap$_literal(["maximum_length", 1023, "length", t1], type$.String, type$.dynamic))); + wonders = A.CellUtils_wonderCalculator(B.CellType_Ordinary_m1, bits, refs); + mask = wonders.mask; + depths = wonders.depths; + hashes = wonders.hashes; + type = B.CellType_Ordinary_m1; + } + return A.Cell$_(bits, depths, hashes, mask, refs, type); + }, + Cell: function Cell(t0, t1, t2, t3, t4, t5) { + var _ = this; + _.type = t0; + _.bits = t1; + _.refs = t2; + _.mask = t3; + _._hashes = t4; + _._depths = t5; + }, + Cell$__closure: function Cell$__closure() { + }, + CellType_fromValue(tag) { + var t1, exception; + try { + t1 = B.JSArray_methods.firstWhere$1(B.List_43h, new A.CellType_fromValue_closure(tag)); + return t1; + } catch (exception) { + if (A.unwrapException(exception) instanceof A.StateError) + return null; + else + throw exception; + } + }, + CellType: function CellType(t0, t1) { + this.name = t0; + this.tag = t1; + }, + CellType_fromValue_closure: function CellType_fromValue_closure(t0) { + this.tag = t0; + }, + Slice: function Slice(t0, t1) { + this._reader = t0; + this._slice$_refs = t1; + this._refsOffset = 0; + }, + BocException$(message, details) { + return new A.BocException(message, details); + }, + BocException: function BocException(t0, t1) { + this.message = t0; + this.details = t1; + }, + ExoticMerkleProof: function ExoticMerkleProof() { + }, + ExoticMerkleUpdate: function ExoticMerkleUpdate() { + }, + Pruned: function Pruned(t0, t1) { + this.hash = t0; + this.depth = t1; + }, + ExoticPruned: function ExoticPruned(t0, t1) { + this.mask = t0; + this.pruned = t1; + }, + _LevelMaskUtils_countSetBits(n) { + n -= B.JSInt_methods._shrOtherPositive$1(n, 1) & 1431655765; + n = (n & 858993459) + (B.JSInt_methods._shrOtherPositive$1(n, 2) & 858993459); + return (n + (n >>> 4) & 252645135) * 16843009 >>> 24; + }, + LevelMask_LevelMask(mask) { + var hashIndex, + n = mask - (B.JSInt_methods._shrOtherPositive$1(mask, 1) & 1431655765); + n = (n & 858993459) + (B.JSInt_methods._shrOtherPositive$1(n, 2) & 858993459); + hashIndex = (n + (n >>> 4) & 252645135) * 16843009 >>> 24; + return new A.LevelMask(mask, hashIndex, hashIndex + 1); + }, + LevelMask: function LevelMask(t0, t1, t2) { + var _ = this; + _._mask = t0; + _._hashIndex = t1; + _._hashCount = t2; + _.__LevelMask_level_FI = $; + }, + ResolvedCellResult$(depths, hashes, mask, type) { + var t1 = A._arrayInstanceType(hashes); + return new A.ResolvedCellResult(type, A.List_List$unmodifiable(new A.MappedListIterable(hashes, t1._eval$1("@(1)")._as(new A.ResolvedCellResult_closure()), t1._eval$1("MappedListIterable<1,@>")), type$.List_int), A.List_List$unmodifiable(depths, type$.int), mask); + }, + ResolvedCellResult: function ResolvedCellResult(t0, t1, t2, t3) { + var _ = this; + _.type = t0; + _.hashes = t1; + _.depths = t2; + _.mask = t3; + }, + ResolvedCellResult_closure: function ResolvedCellResult_closure() { + }, + CellTopoloigicalSort: function CellTopoloigicalSort(t0, t1) { + this.cell = t0; + this.refs = t1; + }, + _ParseBocResult$(absent, cellData, cells, hasCrc32, hasIndex, index, magicNumber, offBytes, root, roots, size, totalCellSize) { + A.BytesUtils_tryToBytes(index, true); + return new A._ParseBocResult(size, cells, A.BytesUtils_toBytes(cellData, true), A.BytesUtils_toBytes(root, true)); + }, + _BocSerializationUtils_getHashesCountFromMask(mask) { + var n, i; + for (n = 0, i = 0; i < 3; ++i) { + n += mask & 1; + mask = mask >>> 1; + } + return n + 1; + }, + _BocSerializationUtils_parseBoc(src) { + var size, offBytes, cells, roots, absent, totalCellSize, index, cellData, crc32, hasIdx, hasCrc32c, root, i, loaded, _null = null, + _s14_ = "Invalid CRC32C", + t1 = J.getInterceptor$asx(src), + t2 = A.BitString_BitString(src, 0, t1.get$length(src) * 8), + t3 = type$.JSArray_int, + reader = new A.BitReader(A._setArrayType([], t3), t2, 0), + magic = reader.loadUintBig$1(32).toInt$0(0); + switch (magic) { + case 1761568243: + size = reader.loadUintBig$1(8).toInt$0(0); + offBytes = reader.loadUintBig$1(8).toInt$0(0); + t1 = size * 8; + cells = reader.loadUintBig$1(t1).toInt$0(0); + roots = reader.loadUintBig$1(t1).toInt$0(0); + absent = reader.loadUintBig$1(t1).toInt$0(0); + totalCellSize = reader.loadUintBig$1(offBytes * 8).toInt$0(0); + index = reader.loadBuffer$1(cells * offBytes); + return A._ParseBocResult$(absent, reader.loadBuffer$1(totalCellSize), cells, _null, _null, index, magic, offBytes, A._setArrayType([0], t3), roots, size, totalCellSize); + case 2898503464: + size = reader.loadUintBig$1(8).toInt$0(0); + offBytes = reader.loadUintBig$1(8).toInt$0(0); + t2 = size * 8; + cells = reader.loadUintBig$1(t2).toInt$0(0); + roots = reader.loadUintBig$1(t2).toInt$0(0); + absent = reader.loadUintBig$1(t2).toInt$0(0); + totalCellSize = reader.loadUintBig$1(offBytes * 8).toInt$0(0); + index = reader.loadBuffer$1(cells * offBytes); + cellData = reader.loadBuffer$1(totalCellSize); + crc32 = reader.loadBuffer$1(4); + if (!A.BytesUtils_bytesEqual(A.CryptoUtils_crc32c(t1.sublist$2(src, 0, t1.get$length(src) - 4)), crc32)) + throw A.wrapException(A.BocException$(_s14_, A.LinkedHashMap_LinkedHashMap$_literal(["crc32", crc32, "excepted", t1.sublist$2(src, 0, t1.get$length(src) - 4)], type$.String, type$.dynamic))); + return A._ParseBocResult$(absent, cellData, cells, _null, _null, index, magic, offBytes, A._setArrayType([0], t3), roots, size, totalCellSize); + case 3052313714: + hasIdx = reader.loadBit$0(); + hasCrc32c = reader.loadBit$0(); + reader.loadUintBig$1(1).toInt$0(0); + reader.loadUintBig$1(2).toInt$0(0); + size = reader.loadUintBig$1(3).toInt$0(0); + offBytes = reader.loadUintBig$1(8).toInt$0(0); + t2 = size * 8; + cells = reader.loadUintBig$1(t2).toInt$0(0); + roots = reader.loadUintBig$1(t2).toInt$0(0); + absent = reader.loadUintBig$1(t2).toInt$0(0); + totalCellSize = reader.loadUintBig$1(offBytes * 8).toInt$0(0); + root = A._setArrayType([], t3); + for (i = 0; i < roots; ++i) { + loaded = reader._preloadUint$2(t2, reader._bit_reader$_offset); + reader._bit_reader$_offset += t2; + B.JSArray_methods.add$1(root, loaded.toInt$0(0)); + } + index = hasIdx ? reader.loadBuffer$1(cells * offBytes) : _null; + cellData = reader.loadBuffer$1(totalCellSize); + if (hasCrc32c) { + crc32 = reader.loadBuffer$1(4); + if (!A.BytesUtils_bytesEqual(A.CryptoUtils_crc32c(t1.sublist$2(src, 0, t1.get$length(src) - 4)), crc32)) + throw A.wrapException(A.BocException$(_s14_, A.LinkedHashMap_LinkedHashMap$_literal(["crc32", crc32, "excepted", t1.sublist$2(src, 0, t1.get$length(src) - 4)], type$.String, type$.dynamic))); + } + return A._ParseBocResult$(absent, cellData, cells, hasCrc32c, hasIdx, index, magic, offBytes, root, roots, size, totalCellSize); + default: + throw A.wrapException(A.BocException$("Invalid magic number.", A.LinkedHashMap_LinkedHashMap$_literal(["magic", magic, "excepted", B.JSArray_methods.join$1(A._setArrayType([1761568243, 2898503464, 3052313714], t3), "or ")], type$.String, type$.dynamic))); + } + }, + _BocSerializationUtils_writeCellToBuilder(cell, refs, sizeBytes, to) { + var t2, _i, + d1 = A.CellUtils_getRefsDescriptor(cell.refs, cell.mask._mask, cell.type), + t1 = cell.bits, + d2 = A.CellUtils_getBitsDescriptor(t1); + to.writeUint$2(d1, 8); + to.writeUint$2(d2, 8); + to.writeBuffer$1(A.BocUtils_bitsToPaddedBuffer(t1).buffer$0(0)); + for (t1 = refs.length, t2 = sizeBytes * 8, _i = 0; _i < t1; ++_i) + to.writeUint$2(refs[_i], t2); + }, + _BocSerializationUtils_readCell(reader, sizeBytes) { + var t2, bits, refsList, i, loaded, + d1 = reader.loadUintBig$1(8).toInt$0(0), + refsCount = B.JSInt_methods.$mod(d1, 8), + d2 = reader.loadUintBig$1(8).toInt$0(0), + dataBytesize = B.JSNumber_methods.ceil$0(d2 / 2), + t1 = B.JSInt_methods.$mod(d2, 2), + levelMask = B.JSInt_methods._shrOtherPositive$1(d1, 5), + hasHashes = (d1 & 16) !== 0, + hashesSize = hasHashes ? A._BocSerializationUtils_getHashesCountFromMask(levelMask & 7) * 32 : 0, + depthSize = hasHashes ? A._BocSerializationUtils_getHashesCountFromMask(levelMask & 7) * 2 : 0; + reader.skip$1(0, hashesSize * 8); + reader.skip$1(0, depthSize * 8); + if (dataBytesize > 0) { + t2 = dataBytesize * 8; + bits = t1 !== 0 ? reader.loadPaddedBits$1(t2) : reader.loadBits$1(t2); + } else + bits = B.BitString_0_0_List_empty; + refsList = A._setArrayType([], type$.JSArray_int); + for (t1 = sizeBytes * 8, i = 0; i < refsCount; ++i) { + loaded = reader._preloadUint$2(t1, reader._bit_reader$_offset); + reader._bit_reader$_offset += t1; + B.JSArray_methods.add$1(refsList, loaded.toInt$0(0)); + } + return new A._ReadCellResult(bits, A.List_List$unmodifiable(refsList, type$.int), (d1 & 8) !== 0, null); + }, + BocSerialization_serialize(crc32, idx, root) { + var t1, totalCellSize, _i, t2, offsetBytes, totalSize, builder, i, res, + allCells = A.CellUtils_topologicalSort(root), + cellsNum = allCells.length, + sizeBytes = B.JSNumber_methods.toInt$0(B.JSInt_methods.clamp$2(B.JSNumber_methods.ceil$0(B.JSInt_methods.toRadixString$1(cellsNum, 2).length / 8), 1, 3)), + index = A._setArrayType([], type$.JSArray_int); + for (t1 = allCells.length, totalCellSize = 0, _i = 0; _i < allCells.length; allCells.length === t1 || (0, A.throwConcurrentModificationError)(allCells), ++_i) { + t2 = allCells[_i].cell; + totalCellSize += 2 + B.JSInt_methods._tdivFast$1(t2.bits._bit_string$_length + 7, 8) + t2.refs.length * sizeBytes; + B.JSArray_methods.add$1(index, totalCellSize); + } + offsetBytes = B.JSNumber_methods.toInt$0(B.JSInt_methods.clamp$2(B.JSNumber_methods.ceil$0(B.JSInt_methods.toRadixString$1(totalCellSize, 2).length / 8), 1, 3)); + totalSize = (6 + 3 * sizeBytes + offsetBytes + sizeBytes + totalCellSize + 4) * 8; + builder = A.BitBuilder$(totalSize); + builder.writeUint$2(3052313714, 32); + builder.writeBit$1(false); + builder.writeBit$1(true); + builder.writeBit$1(false); + builder.writeUint$2(0, 2); + builder.writeUint$2(sizeBytes, 3); + builder.writeUint$2(offsetBytes, 8); + t1 = sizeBytes * 8; + builder.writeUint$2(cellsNum, t1); + builder.writeUint$2(1, t1); + builder.writeUint$2(0, t1); + builder.writeUint$2(totalCellSize, offsetBytes * 8); + builder.writeUint$2(0, t1); + for (i = 0; i < cellsNum; ++i) { + if (!(i < allCells.length)) + return A.ioore(allCells, i); + t1 = allCells[i]; + A._BocSerializationUtils_writeCellToBuilder(t1.cell, t1.refs, sizeBytes, builder); + } + builder.writeBuffer$1(A.CryptoUtils_crc32c(builder.buffer$0(0))); + res = builder.buffer$0(0); + t1 = res.length; + t2 = B.JSInt_methods._tdivFast$1(totalSize, 8); + if (t1 !== t2) + throw A.wrapException(A.BocException$("Serialization cannot verify length.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", t2, "length", t1], type$.String, type$.dynamic))); + return res; + }, + BocSerialization_deserialize(src) { + var reader, _length, cells, index, i, refs, cell, t2, t3, _i, result, roots, + boc = A._BocSerializationUtils_parseBoc(src), + t1 = boc.cellData; + t1 = A.BitString_BitString(t1, 0, t1.length * 8); + reader = new A.BitReader(A._setArrayType([], type$.JSArray_int), t1, 0); + _length = boc.cells; + cells = J.JSArray_JSArray$allocateGrowable(_length, type$._ReadCellResult); + for (t1 = boc.size, index = 0; index < _length; ++index) + cells[index] = A._BocSerializationUtils_readCell(reader, t1); + for (i = cells.length - 1, t1 = type$.JSArray_Cell; i >= 0; --i) { + refs = A._setArrayType([], t1); + if (!(i < cells.length)) + return A.ioore(cells, i); + cell = cells[i]; + for (t2 = cell.refsList, t3 = t2.length, _i = 0; _i < t3; ++_i) { + result = B.JSArray_methods.$index(cells, t2[_i]).result; + if (result == null) + throw A.wrapException(A.BocException$("Invalid BOC file", null)); + B.JSArray_methods.add$1(refs, result); + } + cell.result = A.Cell_Cell(cell.bits, cell.exotic, refs); + } + roots = A._setArrayType([], t1); + for (t1 = boc.root, i = 0; i < t1.length; ++i) { + t2 = A._asInt(t1[i]); + if (!(t2 >= 0 && t2 < cells.length)) + return A.ioore(cells, t2); + t2 = cells[t2].result; + t2.toString; + B.JSArray_methods.add$1(roots, t2); + } + return roots; + }, + _ParseBocResult: function _ParseBocResult(t0, t1, t2, t3) { + var _ = this; + _.size = t0; + _.cells = t1; + _.cellData = t2; + _.root = t3; + }, + _ReadCellResult: function _ReadCellResult(t0, t1, t2, t3) { + var _ = this; + _.bits = t0; + _.refsList = t1; + _.exotic = t2; + _.result = t3; + }, + CellUtils_topologicalSort(src) { + var t3, t4, cells, t5, _i, cell, t6, t7, t8, toHex, _i0, visit, first, indexes, i, + t1 = type$.JSArray_Cell, + pending = A._setArrayType([src], t1), + t2 = type$.String, + allCells = A.LinkedHashMap_LinkedHashMap$_empty(t2, type$.Map_String_dynamic), + notPermCells = A.LinkedHashSet_LinkedHashSet$_empty(t2), + sorted = A._setArrayType([], type$.JSArray_String); + for (t3 = type$.dynamic, t4 = type$.Cell; pending.length !== 0;) { + cells = A.List_List$from(pending, true, t4); + pending = A._setArrayType([], t1); + for (t5 = cells.length, _i = 0; _i < cells.length; cells.length === t5 || (0, A.throwConcurrentModificationError)(cells), ++_i) { + cell = cells[_i]; + t6 = cell._hashes; + t7 = t6.length; + t8 = Math.min(t7 - 1, 3); + if (t8 >>> 0 !== t8 || t8 >= t7) + return A.ioore(t6, t8); + toHex = B.C__Hex.encode$2$lowerCase(t6[t8], true); + if (allCells.containsKey$1(toHex)) + continue; + notPermCells.add$1(0, toHex); + t6 = cell.refs; + t7 = A._arrayInstanceType(t6); + t8 = t7._eval$1("MappedListIterable<1,String>"); + allCells.$indexSet(0, toHex, A.LinkedHashMap_LinkedHashMap$_literal(["cell", cell, "refs", A.List_List$of(new A.MappedListIterable(t6, t7._eval$1("String(1)")._as(new A.CellUtils_topologicalSort_closure()), t8), true, t8._eval$1("ListIterable.E"))], t2, t3)); + for (t7 = t6.length, _i0 = 0; _i0 < t7; ++_i0) + B.JSArray_methods.add$1(pending, t6[_i0]); + } + } + visit = new A.CellUtils_topologicalSort_visit(notPermCells, A.LinkedHashSet_LinkedHashSet$_empty(t2), allCells, sorted); + for (t1 = notPermCells.$ti._precomputed1; notPermCells._collection$_length !== 0;) { + first = notPermCells._collection$_first; + if (first == null) + A.throwExpression(A.StateError$("No elements")); + visit.call$1(t1._as(first._element)); + } + indexes = A.LinkedHashMap_LinkedHashMap$_empty(t2, type$.int); + for (i = 0; t1 = sorted.length, i < t1; ++i) { + t2 = t1 - i - 1; + if (!(t2 >= 0)) + return A.ioore(sorted, t2); + indexes.$indexSet(0, sorted[t2], i); + } + t1 = type$.ReversedListIterable_String; + t2 = t1._eval$1("MappedListIterable"); + return A.List_List$of(new A.MappedListIterable(new A.ReversedListIterable(sorted, t1), t1._eval$1("CellTopoloigicalSort(ListIterable.E)")._as(new A.CellUtils_topologicalSort_closure0(allCells, indexes)), t2), true, t2._eval$1("ListIterable.E")); + }, + CellUtils_getRefsDescriptor(refs, levelMask, type) { + var t1 = refs.length; + return t1 + (type !== B.CellType_Ordinary_m1 ? 1 : 0) * 8 + levelMask * 32; + }, + CellUtils_getBitsDescriptor(bits) { + var t1 = bits._bit_string$_length / 8; + return B.JSInt_methods.toInt$0(B.JSNumber_methods.ceil$0(t1) + B.JSNumber_methods.floor$0(t1)); + }, + CellUtils_getRepr(originalBits, bits, refs, level, levelMask, type) { + var buff, t1, i, t2, t3, t4, _i, t5, c, t6, t7, childDepth, reprCursor0, childHash, + reprCursor = 2 + B.JSNumber_methods.ceil$0(bits._bit_string$_length / 8), + repr = A.List_List$filled(reprCursor + 34 * refs.length, 0, false, type$.int); + B.JSArray_methods.$indexSet(repr, 0, A.CellUtils_getRefsDescriptor(refs, levelMask, type)); + B.JSArray_methods.$indexSet(repr, 1, A.CellUtils_getBitsDescriptor(originalBits)); + buff = A.BocUtils_bitsToPaddedBuffer(bits).buffer$0(0); + for (t1 = buff.length, i = 0; i < t1; ++i) + B.JSArray_methods.$indexSet(repr, 2 + i, buff[i]); + for (t1 = refs.length, t2 = type !== B.CellType_MerkleProof_3, t3 = type === B.CellType_MerkleUpdate_4, t4 = level + 1, _i = 0; t5 = refs.length, _i < t5; refs.length === t1 || (0, A.throwConcurrentModificationError)(refs), ++_i) { + c = refs[_i]; + t5 = !t2 || t3; + t6 = c._depths; + t7 = t6.length; + if (t5) { + t5 = Math.min(t7 - 1, t4); + if (t5 >>> 0 !== t5 || t5 >= t7) + return A.ioore(t6, t5); + childDepth = t6[t5]; + } else { + t5 = Math.min(t7 - 1, level); + if (t5 >>> 0 !== t5 || t5 >= t7) + return A.ioore(t6, t5); + childDepth = t6[t5]; + } + reprCursor0 = reprCursor + 1; + B.JSArray_methods.$indexSet(repr, reprCursor, B.JSNumber_methods.floor$0(childDepth / 256)); + reprCursor = reprCursor0 + 1; + B.JSArray_methods.$indexSet(repr, reprCursor0, B.JSInt_methods.$mod(childDepth, 256)); + } + for (_i = 0; _i < refs.length; refs.length === t5 || (0, A.throwConcurrentModificationError)(refs), ++_i, reprCursor = reprCursor0) { + c = refs[_i]; + t1 = !t2 || t3; + t6 = c._hashes; + t7 = t6.length; + if (t1) { + t1 = Math.min(t7 - 1, t4); + if (t1 >>> 0 !== t1 || t1 >= t7) + return A.ioore(t6, t1); + childHash = t6[t1]; + } else { + t1 = Math.min(t7 - 1, level); + if (t1 >>> 0 !== t1 || t1 >= t7) + return A.ioore(t6, t1); + childHash = t6[t1]; + } + reprCursor0 = reprCursor + 32; + B.JSArray_methods.setRange$3(repr, reprCursor, reprCursor0, childHash); + } + return repr; + }, + CellUtils_exoticLibrary(bits, refs) { + var type, + t1 = A._setArrayType([], type$.JSArray_int), + t2 = bits._bit_string$_length; + if (t2 !== 264) + throw A.wrapException(A.BocException$("Invalid Library cell bits length", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", "8 + 256", "length", t2], type$.String, type$.dynamic))); + type = new A.BitReader(t1, bits, 0).loadUintBig$1(8).toInt$0(0); + if (type !== 2) { + t1 = A.CellType_fromValue(type); + throw A.wrapException(A.BocException$("Invalid Library cell type.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", B.CellType_Library_2, "type", t1 == null ? "" + type : t1], type$.String, type$.dynamic))); + } + }, + CellUtils_exoticMerkleProof(bits, refs) { + var type, proofHash, proofDepth, refHash, + reader = new A.BitReader(A._setArrayType([], type$.JSArray_int), bits, 0), + t1 = bits._bit_string$_length; + if (t1 !== 280) + throw A.wrapException(A.BocException$("Invalid Merkle Proof cell bits length.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", 280, "length", t1], type$.String, type$.dynamic))); + t1 = refs.length; + if (t1 !== 1) + throw A.wrapException(A.BocException$("Invalid Merkle Proof cell reference length.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", 1, "length", t1], type$.String, type$.dynamic))); + type = reader.loadUintBig$1(8).toInt$0(0); + if (type !== 3) { + t1 = A.CellType_fromValue(type); + throw A.wrapException(A.BocException$("Merkle Proof cell type.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", B.CellType_MerkleProof_3, "type", t1 == null ? "" + type : t1], type$.String, type$.dynamic))); + } + proofHash = reader.loadBuffer$1(32); + proofDepth = reader.loadUintBig$1(16).toInt$0(0); + if (0 >= refs.length) + return A.ioore(refs, 0); + refHash = refs[0].hash$1$level(0); + if (0 >= refs.length) + return A.ioore(refs, 0); + if (proofDepth !== refs[0].depth$1$level(0) || !A.BytesUtils_bytesEqual(proofHash, refHash)) + throw A.wrapException(A.BocException$("Mismatch in reference", null)); + A.BytesUtils_toBytes(proofHash, true); + return new A.ExoticMerkleProof(); + }, + CellUtils_exoticMerkleUpdate(bits, refs) { + var type, proofHash1, proofHash2, proofDepth1, proofDepth2, _null = null, + reader = new A.BitReader(A._setArrayType([], type$.JSArray_int), bits, 0), + t1 = bits._bit_string$_length; + if (t1 !== 552) + throw A.wrapException(A.BocException$("Invalid Merkle Update cell bits length.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", 552, "length", t1], type$.String, type$.dynamic))); + t1 = refs.length; + if (t1 !== 2) + throw A.wrapException(A.BocException$("Invalid Merkle Update cell refs length.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", 2, "length", t1], type$.String, type$.dynamic))); + type = reader.loadUintBig$1(8).toInt$0(0); + if (type !== 4) { + t1 = A.CellType_fromValue(type); + throw A.wrapException(A.BocException$("Invalid Merkle Update cell type.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", B.CellType_MerkleUpdate_4, "type", t1 == null ? "" + type : t1], type$.String, type$.dynamic))); + } + proofHash1 = reader.loadBuffer$1(32); + proofHash2 = reader.loadBuffer$1(32); + proofDepth1 = reader.loadUintBig$1(16).toInt$0(0); + proofDepth2 = reader.loadUintBig$1(16).toInt$0(0); + if (0 >= refs.length) + return A.ioore(refs, 0); + if (proofDepth1 !== refs[0].depth$1$level(0)) + throw A.wrapException(A.BocException$("Mismatch in reference 1", _null)); + if (0 >= refs.length) + return A.ioore(refs, 0); + if (!A.BytesUtils_bytesEqual(proofHash1, refs[0].hash$1$level(0))) + throw A.wrapException(A.BocException$("Invalid Merkle Update cell reference hash.", _null)); + if (1 >= refs.length) + return A.ioore(refs, 1); + if (proofDepth2 !== refs[1].depth$1$level(0)) + throw A.wrapException(A.BocException$("Mismatch in reference 2", _null)); + if (1 >= refs.length) + return A.ioore(refs, 1); + if (!A.BytesUtils_bytesEqual(proofHash2, refs[1].hash$1$level(0))) + throw A.wrapException(A.BocException$("Invalid Merkle Update cell reference 2 hash.", _null)); + A.BytesUtils_toBytes(proofHash1, true); + A.BytesUtils_toBytes(proofHash2, true); + return new A.ExoticMerkleUpdate(); + }, + CellUtils_exoticPruned(bits, refs) { + var t2, mask, size, pruned, hashes, depths, i, buf, loaded, + t1 = type$.JSArray_int, + reader = new A.BitReader(A._setArrayType([], t1), bits, 0), + type = reader.loadUintBig$1(8).toInt$0(0); + if (type !== 1) { + t1 = A.CellType_fromValue(type); + throw A.wrapException(A.BocException$("Invalid Pruned branch cell type.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", B.CellType_PrunedBranch_1, "type", t1 == null ? "" + type : t1], type$.String, type$.dynamic))); + } + if (refs.length !== 0) + throw A.wrapException(A.BocException$("Pruned Branch cell have refs", null)); + t2 = bits._bit_string$_length; + if (t2 === 280) + mask = A.LevelMask_LevelMask(1); + else { + mask = A.LevelMask_LevelMask(reader.loadUintBig$1(8).toInt$0(0)); + if (mask.get$level() < 1 || mask.get$level() > 3) + throw A.wrapException(A.BocException$("Invalid Pruned Branch cell level", A.LinkedHashMap_LinkedHashMap$_literal(["level", mask.get$level(), "excepted", B.JSArray_methods.join$1(A._setArrayType([1, 2, 3], t1), ", ")], type$.String, type$.dynamic))); + size = 16 + mask.apply$1(mask.get$level() - 1)._hashCount * 272; + if (t2 !== size) + throw A.wrapException(A.BocException$("Invalid Pruned branch cell bits length.", A.LinkedHashMap_LinkedHashMap$_literal(["excepted", size, "length", t2], type$.String, type$.dynamic))); + } + pruned = A._setArrayType([], type$.JSArray_Pruned); + hashes = A._setArrayType([], type$.JSArray_List_int); + depths = A._setArrayType([], t1); + for (i = 0; i < mask.get$level(); ++i) { + buf = reader._preloadBuffer$2(32, reader._bit_reader$_offset); + reader._bit_reader$_offset += 256; + B.JSArray_methods.add$1(hashes, buf); + } + for (i = 0; i < mask.get$level(); ++i) { + loaded = reader._preloadUint$2(16, reader._bit_reader$_offset); + reader._bit_reader$_offset += 16; + B.JSArray_methods.add$1(depths, loaded.toInt$0(0)); + } + for (i = 0; i < mask.get$level(); ++i) { + if (!(i < hashes.length)) + return A.ioore(hashes, i); + t1 = hashes[i]; + if (!(i < depths.length)) + return A.ioore(depths, i); + t2 = depths[i]; + B.JSArray_methods.add$1(pruned, new A.Pruned(A.BytesUtils_toBytes(t1, true), t2)); + } + return new A.ExoticPruned(mask._mask, pruned); + }, + CellUtils_resolveExotic(bits, refs) { + var mask, pruned, t2, t3, + t1 = type$.JSArray_int, + typeTag = new A.BitReader(A._setArrayType([], t1), bits, 0)._preloadUint$2(8, 0).toInt$0(0), + type = A.CellType_fromValue(typeTag), + depths = A._setArrayType([], t1), + hashes = A._setArrayType([], type$.JSArray_List_int); + switch (type) { + case B.CellType_Library_2: + A.CellUtils_exoticLibrary(bits, refs); + mask = A.LevelMask_LevelMask(0); + break; + case B.CellType_MerkleProof_3: + A.CellUtils_exoticMerkleProof(bits, refs); + if (0 >= refs.length) + return A.ioore(refs, 0); + mask = A.LevelMask_LevelMask(B.JSInt_methods._shrOtherPositive$1(refs[0].mask.get$level(), 1)); + break; + case B.CellType_MerkleUpdate_4: + A.CellUtils_exoticMerkleUpdate(bits, refs); + if (0 >= refs.length) + return A.ioore(refs, 0); + t1 = refs[0].mask.get$level(); + if (1 >= refs.length) + return A.ioore(refs, 1); + mask = A.LevelMask_LevelMask((t1 | refs[1].mask.get$level()) >>> 1); + break; + case B.CellType_PrunedBranch_1: + pruned = A.CellUtils_exoticPruned(bits, refs); + mask = A.LevelMask_LevelMask(pruned.mask); + t1 = pruned.pruned; + t2 = A._arrayInstanceType(t1); + t3 = t2._eval$1("MappedListIterable<1,List>"); + hashes = A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("List(1)")._as(new A.CellUtils_resolveExotic_closure()), t3), true, t3._eval$1("ListIterable.E")); + t3 = t2._eval$1("MappedListIterable<1,int>"); + depths = A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("int(1)")._as(new A.CellUtils_resolveExotic_closure0()), t3), true, t3._eval$1("ListIterable.E")); + break; + default: + throw A.wrapException(A.BocException$("Invalid exotic cell type.", A.LinkedHashMap_LinkedHashMap$_literal(["type", type == null ? "" + typeTag : type], type$.String, type$.dynamic))); + } + type.toString; + return A.ResolvedCellResult$(depths, hashes, mask, type); + }, + CellUtils_wonderCalculator(type, bits, refs) { + var t1, mask, _i, levelMask, t2, depths, hashes, t3, hashCount, hashIOffset, t4, t5, t6, t7, t8, levelI, hashI, t9, currentBits, t10, currentDepth, r, t11, t12, t13, childDepth, repr, h, out, destI, resolvedHashes, resolvedDepths, thisHashIndex, i, hashIndex, + _s14_ = "Invalid Level.", + pruned = null; + switch (type) { + case B.CellType_Ordinary_m1: + for (t1 = refs.length, mask = 0, _i = 0; _i < t1; ++_i) + mask = (mask | refs[_i].mask._mask) >>> 0; + levelMask = A.LevelMask_LevelMask(mask); + break; + case B.CellType_PrunedBranch_1: + pruned = A.CellUtils_exoticPruned(bits, refs); + levelMask = A.LevelMask_LevelMask(pruned.mask); + break; + case B.CellType_MerkleProof_3: + A.CellUtils_exoticMerkleProof(bits, refs); + if (0 >= refs.length) + return A.ioore(refs, 0); + levelMask = A.LevelMask_LevelMask(B.JSInt_methods._shrOtherPositive$1(refs[0].mask._mask, 1)); + break; + case B.CellType_MerkleUpdate_4: + A.CellUtils_exoticMerkleUpdate(bits, refs); + t1 = refs.length; + if (0 >= t1) + return A.ioore(refs, 0); + t2 = refs[0]; + if (1 >= t1) + return A.ioore(refs, 1); + levelMask = A.LevelMask_LevelMask((t2.mask._mask | refs[1].mask._mask) >>> 1); + break; + case B.CellType_Library_2: + A.CellUtils_exoticLibrary(bits, refs); + levelMask = A.LevelMask_LevelMask(0); + break; + default: + throw A.wrapException(A.BocException$("Unsupported exotic type", A.LinkedHashMap_LinkedHashMap$_literal(["type", type], type$.String, type$.dynamic))); + } + t1 = type$.JSArray_int; + depths = A._setArrayType([], t1); + t2 = type$.JSArray_List_int; + hashes = A._setArrayType([], t2); + t3 = type === B.CellType_PrunedBranch_1; + hashCount = t3 ? 1 : levelMask._hashCount; + hashIOffset = levelMask._hashCount - hashCount; + for (t4 = levelMask._mask, t5 = type$.int, t6 = type !== B.CellType_MerkleProof_3, t7 = type === B.CellType_MerkleUpdate_4, t8 = !t3, levelI = 0, hashI = 0; levelI <= levelMask.get$level(); ++levelI) { + t9 = levelI !== 0; + if (!(!t9 || (B.JSInt_methods.$shr(t4, levelI - 1) & 1) !== 0)) + continue; + if (hashI < hashIOffset) { + ++hashI; + continue; + } + if (hashI === hashIOffset) { + if (!(!t9 || t3)) + throw A.wrapException(A.BocException$(_s14_, A.LinkedHashMap_LinkedHashMap$_literal(["level", levelI, "type", type], type$.String, type$.dynamic))); + currentBits = bits; + } else { + if (!(t9 && t8)) + throw A.wrapException(A.BocException$(_s14_, A.LinkedHashMap_LinkedHashMap$_literal(["level", levelI, "type", type], type$.String, type$.dynamic))); + t9 = hashI - hashIOffset - 1; + if (!(t9 >= 0 && t9 < hashes.length)) + return A.ioore(hashes, t9); + t9 = hashes[t9]; + currentBits = new A.BitString(0, 256, A.BytesUtils_toBytes(t9, true)); + } + for (t9 = refs.length, t10 = levelI + 1, currentDepth = 0, _i = 0; _i < t9; ++_i) { + r = refs[_i]; + t11 = !t6 || t7; + t12 = r._depths; + t13 = t12.length; + if (t11) { + t11 = Math.min(t13 - 1, t10); + if (t11 >>> 0 !== t11 || t11 >= t13) + return A.ioore(t12, t11); + childDepth = t12[t11]; + } else { + t11 = Math.min(t13 - 1, levelI); + if (t11 >>> 0 !== t11 || t11 >= t13) + return A.ioore(t12, t11); + childDepth = t12[t11]; + } + currentDepth = Math.max(currentDepth, childDepth); + } + if (t9 !== 0) + ++currentDepth; + t9 = (t4 & B.JSInt_methods._shlPositive$1(1, levelI) - 1) >>> 0; + A._LevelMaskUtils_countSetBits(t9); + repr = A.CellUtils_getRepr(bits, currentBits, refs, levelI, t9, type); + h = A.SHA256$(); + h.update$1(repr); + out = A.List_List$filled(32, 0, false, t5); + h.finish$1(out); + A.zero(h._hash$_buffer); + A.zero(h._temp); + h._initState$0(); + h._bytesHashed = h._bufferLength = 0; + h._finished = false; + destI = hashI - hashIOffset; + B.JSArray_methods.insert$2(depths, destI, currentDepth); + B.JSArray_methods.insert$2(hashes, destI, out); + ++hashI; + } + resolvedHashes = A._setArrayType([], t2); + resolvedDepths = A._setArrayType([], t1); + if (pruned != null) + for (thisHashIndex = levelMask._hashIndex, t1 = pruned.pruned, i = 0; i < 4; ++i) { + hashIndex = A._LevelMaskUtils_countSetBits((t4 & B.JSInt_methods._shlPositive$1(1, i) - 1) >>> 0); + if (hashIndex !== thisHashIndex) { + if (!(hashIndex < t1.length)) + return A.ioore(t1, hashIndex); + B.JSArray_methods.add$1(resolvedHashes, t1[hashIndex].hash); + if (!(hashIndex < t1.length)) + return A.ioore(t1, hashIndex); + B.JSArray_methods.add$1(resolvedDepths, t1[hashIndex].depth); + } else { + if (0 >= hashes.length) + return A.ioore(hashes, 0); + B.JSArray_methods.add$1(resolvedHashes, hashes[0]); + if (0 >= depths.length) + return A.ioore(depths, 0); + B.JSArray_methods.add$1(resolvedDepths, depths[0]); + } + } + else + for (i = 0; i < 4; ++i) { + t1 = (t4 & B.JSInt_methods._shlPositive$1(1, i) - 1) >>> 0; + hashIndex = A._LevelMaskUtils_countSetBits(t1); + if (!(hashIndex < hashes.length)) + return A.ioore(hashes, hashIndex); + B.JSArray_methods.add$1(resolvedHashes, hashes[hashIndex]); + hashIndex = A._LevelMaskUtils_countSetBits(t1); + if (!(hashIndex < depths.length)) + return A.ioore(depths, hashIndex); + B.JSArray_methods.add$1(resolvedDepths, depths[hashIndex]); + } + return A.ResolvedCellResult$(resolvedDepths, resolvedHashes, levelMask, type); + }, + CellUtils_topologicalSort_closure: function CellUtils_topologicalSort_closure() { + }, + CellUtils_topologicalSort_visit: function CellUtils_topologicalSort_visit(t0, t1, t2, t3) { + var _ = this; + _.notPermCells = t0; + _.tempMark = t1; + _.allCells = t2; + _.sorted = t3; + }, + CellUtils_topologicalSort_closure0: function CellUtils_topologicalSort_closure0(t0, t1) { + this.allCells = t0; + this.indexes = t1; + }, + CellUtils_topologicalSort__closure: function CellUtils_topologicalSort__closure(t0) { + this.indexes = t0; + }, + CellUtils_resolveExotic_closure: function CellUtils_resolveExotic_closure() { + }, + CellUtils_resolveExotic_closure0: function CellUtils_resolveExotic_closure0() { + }, + TonChain_fromWorkchain(workchain) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_M5Z, new A.TonChain_fromWorkchain_closure(workchain), new A.TonChain_fromWorkchain_closure0()); + }, + TonChain: function TonChain(t0, t1) { + this.workchain = t0; + this.id = t1; + }, + TonChain_fromWorkchain_closure: function TonChain_fromWorkchain_closure(t0) { + this.workchain = t0; + }, + TonChain_fromWorkchain_closure0: function TonChain_fromWorkchain_closure0() { + }, + TonContract: function TonContract() { + }, + _TonContract_Object_ContractProvider: function _TonContract_Object_ContractProvider() { + }, + ContractProvider: function ContractProvider() { + }, TonContractException: function TonContractException(t0, t1) { this.message = t0; this.details = t1; }, + WalletV1R1: function WalletV1R1(t0) { + this.state = t0; + }, + WalletV1R2: function WalletV1R2(t0) { + this.state = t0; + }, + WalletV1R3: function WalletV1R3(t0) { + this.state = t0; + }, + WalletV2R1: function WalletV2R1(t0) { + this.state = t0; + }, + WalletV2R2: function WalletV2R2(t0) { + this.state = t0; + }, + WalletV3R1: function WalletV3R1(t0) { + this.state = t0; + }, + WalletV3R2: function WalletV3R2(t0) { + this.state = t0; + }, + WalletV4: function WalletV4(t0) { + this.state = t0; + }, + WalletV5R1_WalletV5R1$create(bounceableAddress, chain, context, publicKey) { + var state, t1, t2; + if (context instanceof A.V5R1ClientContext) + chain = context.chain; + A.List_List$unmodifiable(B.List_empty15, type$.TonAddress); + state = new A.V5VersionedWalletState(context, A.TonPublicKey_TonPublicKey$fromBytes(publicKey), B.WalletVersion_v5R1_5); + t1 = state.initialState$0(); + t2 = chain.workchain; + A.TonChain_fromWorkchain(A.TonAddress_TonAddress$fromState(bounceableAddress, t1, t2 == null ? 0 : t2).workChain); + return new A.WalletV5R1(state); + }, + WalletV5R1: function WalletV5R1(t0) { + this.state = t0; + }, + WalletContract: function WalletContract() { + }, WalletVersion_WalletVersion$fromValue($name) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_oOy, new A.WalletVersion_WalletVersion$fromValue_closure($name), new A.WalletVersion_WalletVersion$fromValue_closure0($name)); + return B.JSArray_methods.firstWhere$2$orElse(B.List_86y, new A.WalletVersion_WalletVersion$fromValue_closure($name), new A.WalletVersion_WalletVersion$fromValue_closure0($name)); }, - WalletVersion: function WalletVersion(t0) { + WalletVersion: function WalletVersion(t0, t1) { this.name = t0; + this.version = t1; }, WalletVersion_WalletVersion$fromValue_closure: function WalletVersion_WalletVersion$fromValue_closure(t0) { this.name = t0; @@ -22416,6 +23662,266 @@ WalletVersion_WalletVersion$fromValue_closure0: function WalletVersion_WalletVersion$fromValue_closure0(t0) { this.name = t0; }, + VersionedWalletContract: function VersionedWalletContract() { + }, + _VersionedWalletContract_WalletContract_VerionedProviderImpl: function _VersionedWalletContract_WalletContract_VerionedProviderImpl() { + }, + VerionedProviderImpl: function VerionedProviderImpl() { + }, + V5R1Context: function V5R1Context() { + }, + V5R1CustomContext: function V5R1CustomContext(t0, t1) { + this.context = t0; + this.chain = t1; + }, + V5R1ClientContext: function V5R1ClientContext(t0, t1) { + this.subwalletNumber = t0; + this.chain = t1; + }, + NoneSubWalletVersionedWalletState$(publicKey, version) { + return new A.NoneSubWalletVersionedWalletState(A.TonPublicKey_TonPublicKey$fromBytes(publicKey), version); + }, + SubWalletVersionedWalletState$(publicKey, subwallet, version) { + return new A.SubWalletVersionedWalletState(subwallet, A.TonPublicKey_TonPublicKey$fromBytes(publicKey), version); + }, + VersionedWalletState: function VersionedWalletState() { + }, + NoneSubWalletVersionedWalletState: function NoneSubWalletVersionedWalletState(t0, t1) { + this.publicKey = t0; + this.version = t1; + }, + SubWalletVersionedWalletState: function SubWalletVersionedWalletState(t0, t1, t2) { + this.subwallet = t0; + this.publicKey = t1; + this.version = t2; + }, + V5VersionedWalletState: function V5VersionedWalletState(t0, t1, t2) { + this.context = t0; + this.publicKey = t1; + this.version = t2; + }, + KeyException: function KeyException(t0, t1) { + this.message = t0; + this.details = t1; + }, + TonPublicKey_TonPublicKey$fromBytes(keyBytes) { + var e, t1, exception; + try { + t1 = A.Ed25519PublicKey_Ed25519PublicKey$fromBytes(keyBytes); + return new A.TonPublicKey(t1); + } catch (exception) { + e = A.unwrapException(exception); + t1 = A.LinkedHashMap_LinkedHashMap$_literal(["key", A.BytesUtils_toHexString(keyBytes, true, null), "error", J.toString$0$(e)], type$.String, type$.dynamic); + throw A.wrapException(new A.KeyException("Invalid Ton Public key. Public key must be a valid Ed25519 key.", t1)); + } + }, + TonPublicKey: function TonPublicKey(t0) { + this._publickKey = t0; + }, + DictionaryCodecs_createBigUintKey(bits) { + return new A.DictionaryKey(bits, new A.DictionaryCodecs_createBigUintKey_closure(bits), type$.DictionaryKey_BigInt); + }, + DictionaryCodecs_createBigUintKey_closure: function DictionaryCodecs_createBigUintKey_closure(t0) { + this.bits = t0; + }, + Dictionary_empty(key, value, $K, $V) { + return new A.Dictionary(key, value, A.LinkedHashMap_LinkedHashMap$_empty(type$.String, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("Dictionary<1,2>")); + }, + Dictionary_fromEnteries(key, map, value, $K, $V) { + var t1, t2, t3, t4, t5, t6, + dict = A.Dictionary_empty(key, value, $K, $V); + for (t1 = map.get$entries(), t1 = t1.get$iterator(t1), t2 = dict.$ti, t3 = t2._precomputed1, t2 = t2._rest[1], t4 = dict._dictionary$_map; t1.moveNext$0();) { + t5 = t1.get$current(); + t6 = t5.key; + t5 = t5.value; + t3._as(t6); + t2._as(t5); + t4.$indexSet(0, A.DictionaryUtils_serializeInternalKey(t6), t5); + } + return dict; + }, + Dictionary: function Dictionary(t0, t1, t2, t3) { + var _ = this; + _._dictionary$_key = t0; + _._dictionary$_value = t1; + _._dictionary$_map = t2; + _.$ti = t3; + }, + Dictionary_store_closure: function Dictionary_store_closure(t0, t1) { + this.$this = t0; + this.resolvedKey = t1; + }, + DictionaryKey: function DictionaryKey(t0, t1, t2) { + this.bits = t0; + this.serialize = t1; + this.$ti = t2; + }, + DictionaryValue: function DictionaryValue(t0, t1) { + this.serialize = t0; + this.$ti = t1; + }, + DictException$(message, details) { + return new A.DictException(message, details); + }, + DictException: function DictException(t0, t1) { + this.message = t0; + this.details = t1; + }, + _DictSerializationUtils_pad(src, size) { + for (; src.length < size;) + src = "0" + src; + return src; + }, + _DictSerializationUtils_forkMap(src, prefixLen, $T) { + var t1, left, right, t2, k, d; + if (src.get$isEmpty(src)) + throw A.wrapException(A.DictException$("Internal inconsistency", null)); + t1 = type$.String; + left = A.LinkedHashMap_LinkedHashMap$_empty(t1, $T); + right = A.LinkedHashMap_LinkedHashMap$_empty(t1, $T); + for (t1 = src.get$entries(), t1 = t1.get$iterator(t1); t1.moveNext$0();) { + t2 = t1.get$current(); + k = t2.key; + d = t2.value; + if (!(prefixLen >= 0 && prefixLen < k.length)) + return A.ioore(k, prefixLen); + if (k[prefixLen] === "0") + left.$indexSet(0, k, d); + else + right.$indexSet(0, k, d); + } + if (left.__js_helper$_length === 0) + throw A.wrapException(A.DictException$("Internal inconsistency. Left emtpy.", null)); + if (right.__js_helper$_length === 0) + throw A.wrapException(A.DictException$("Internal inconsistency. Right emtpy.", null)); + return new A.Tuple(left, right, $T._eval$1("Tuple,Map>")); + }, + _DictSerializationUtils_buildNode(src, prefixLen, $T) { + var t1, fork; + if (src.get$isEmpty(src)) + throw A.wrapException(A.DictException$("Internal inconsistency", null)); + if (src.get$length(src) === 1) { + t1 = src.get$values(); + return new A._Node($, $, true, t1.get$first(t1), $T._eval$1("_Node<0>")); + } + fork = A._DictSerializationUtils_forkMap(src, prefixLen, $T); + t1 = prefixLen + 1; + return new A._Node(A._DictSerializationUtils_buildEdge(fork.item1, t1, $T), A._DictSerializationUtils_buildEdge(fork.item2, t1, $T), false, $, $T._eval$1("_Node<0>")); + }, + _DictSerializationUtils_buildEdge(src, prefixLen, $T) { + var t1, label; + if (src.get$isEmpty(src)) + throw A.wrapException(A.DictException$("Internal inconsistency", null)); + t1 = src.get$keys(); + label = A.DictionaryUtils_findCommonPrefix(t1.toList$0(t1), prefixLen); + return new A._Edge(label, A._DictSerializationUtils_buildNode(src, label.length + prefixLen, $T), $T._eval$1("_Edge<0>")); + }, + _DictSerializationUtils_buildTree(src, keyLength, $T) { + var converted = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, $T); + src.forEach$1(0, new A._DictSerializationUtils_buildTree_closure(keyLength, converted, $T)); + return A._DictSerializationUtils_buildEdge(converted, 0, $T); + }, + _DictSerializationUtils_writeLabelShort(src, to) { + var t1, t2, i; + to.storeBit$1(0); + for (t1 = src.length, t2 = to._builder$_bits, i = 0; i < t1; ++i) + t2.writeBit$1(true); + to.storeBit$1(0); + if (t1 !== 0) + t2.writeUint$2(A._BigIntImpl_parse(src, 2), t1); + return src; + }, + _DictSerializationUtils_isSame(src) { + var i, + t1 = src.length; + if (t1 === 0 || t1 === 1) + return true; + for (i = 1; i < t1; ++i) + if (src[i] !== src[0]) + return false; + return true; + }, + _DictSerializationUtils_writeLabel(src, keyLength, to) { + var kind, t3, + t1 = src.length, + kindLength = 1 + t1 + 1 + t1, + t2 = keyLength + 1, + longLength = 2 + B.JSNumber_methods.ceil$0(Math.log(t2) / Math.log(2)) + t1; + if (longLength < kindLength) { + kindLength = longLength; + kind = 1; + } else + kind = 0; + if (A._DictSerializationUtils_isSame(src)) + if (3 + B.JSInt_methods.ceil$0(B.JSNumber_methods.ceil$0(Math.log(t2) / Math.log(2))) < kindLength) + kind = 2; + switch (kind) { + case 0: + A._DictSerializationUtils_writeLabelShort(src, to); + break; + case 1: + to.storeBit$1(1); + to.storeBit$1(0); + t3 = to._builder$_bits; + t3.writeUint$2(t1, B.JSNumber_methods.ceil$0(Math.log(t2) / Math.log(2))); + if (t1 !== 0) + t3.writeUint$2(A._BigIntImpl_parse(src, 2), t1); + break; + default: + if (0 >= t1) + return A.ioore(src, 0); + t3 = src[0]; + to.storeBit$1(1); + to.storeBit$1(1); + to.storeBit$1(t3 === "1" ? 1 : 0); + to._builder$_bits.writeUint$2(t1, B.JSNumber_methods.ceil$0(Math.log(t2) / Math.log(2))); + break; + } + }, + _DictSerializationUtils_writeEdge(src, keyLength, serializer, to, $T) { + var t2, t3, t4, leftCell, rightCell, + t1 = src.label; + A._DictSerializationUtils_writeLabel(t1, keyLength, to); + t2 = src.node; + t3 = t2.isLeaf; + if (t3) { + t4 = t2.___Node_value_F; + t4 === $ && A.throwLateFieldNI("value"); + serializer.call$2(t4, to); + } + if (!t3) { + t3 = type$.JSArray_Cell; + leftCell = new A.Builder(A.BitBuilder$(1023), A._setArrayType([], t3)); + rightCell = new A.Builder(A.BitBuilder$(1023), A._setArrayType([], t3)); + t3 = t2.___Node_left_A; + t3 === $ && A.throwLateFieldNI("left"); + t1 = keyLength - t1.length - 1; + A._DictSerializationUtils_writeEdge(t3, t1, serializer, leftCell, $T); + t2 = t2.___Node_right_A; + t2 === $ && A.throwLateFieldNI("right"); + A._DictSerializationUtils_writeEdge(t2, t1, serializer, rightCell, $T); + to.storeRef$1(leftCell.endCell$0()); + to.storeRef$1(rightCell.endCell$0()); + } + }, + _Node: function _Node(t0, t1, t2, t3, t4) { + var _ = this; + _.___Node_left_A = t0; + _.___Node_right_A = t1; + _.isLeaf = t2; + _.___Node_value_F = t3; + _.$ti = t4; + }, + _Edge: function _Edge(t0, t1, t2) { + this.label = t0; + this.node = t1; + this.$ti = t2; + }, + _DictSerializationUtils_buildTree_closure: function _DictSerializationUtils_buildTree_closure(t0, t1, t2) { + this.keyLength = t0; + this.converted = t1; + this.T = t2; + }, TonDartPluginException$(message, details) { return new A.TonDartPluginException(message, details); }, @@ -22427,11 +23933,22 @@ }, TonDartPluginException_toString_closure0: function TonDartPluginException_toString_closure0() { }, + SimpleLibraryCodecs_codec_closure: function SimpleLibraryCodecs_codec_closure() { + }, + StateInit: function StateInit(t0, t1, t2) { + this.code = t0; + this.data = t1; + this.libraries = t2; + }, + StateInit_store_closure: function StateInit_store_closure() { + }, + StateInit_toJson_closure: function StateInit_toJson_closure() { + }, TonApiType_TonApiType$fromValue($name) { return B.JSArray_methods.firstWhere$2$orElse(B.List_ivT, new A.TonApiType_TonApiType$fromValue_closure($name), new A.TonApiType_TonApiType$fromValue_closure0($name)); }, RequestMethod: function RequestMethod(t0) { - this._name = t0; + this._core$_name = t0; }, TonApiType: function TonApiType(t0) { this.name = t0; @@ -22582,7 +24099,7 @@ var t2, t1 = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic); t1.$indexSet(0, "path", request.pathParams); - t1.$indexSet(0, "method", request.requestType._name); + t1.$indexSet(0, "method", request.requestType._core$_name); t2 = request.body; if (t2 != null) t1.$indexSet(0, "body", t2); @@ -22596,12 +24113,16 @@ }, TonProvider: function TonProvider(t0) { this.rpc = t0; - this._provider1$_id = 0; + this._provider2$_id = 0; }, TonProvider_request_closure: function TonProvider_request_closure() { }, JsonSerialization0: function JsonSerialization0() { }, + TonSerialization: function TonSerialization() { + }, + _TonSerialization_Object_JsonSerialization: function _TonSerialization_Object_JsonSerialization() { + }, _EventStreamSubscription$(_target, _eventType, onData, _useCapture, $T) { var t1; if (onData == null) @@ -22679,7 +24200,7 @@ }, XRPLRpc: function XRPLRpc(t0) { this.rpc = t0; - this._requestId = 0; + this._provider4$_requestId = 0; }, XRPAddress_XRPAddress(address) { var t1, addrNetVar, decodeXAddress, t2, toClassic, netVarBytes, addrDecBytes, exception, _null = null, allowXAddress = null, isTestnet = null; @@ -22695,14 +24216,14 @@ t2 = t1.length; if (t2 !== 20) A.throwExpression(A.AddressConverterException$("address hash must be 20 bytes length but got " + t2, _null)); - t2 = A.List_List$of(B.List_0, true, type$.dynamic); + t2 = A.List_List$of(B.List_00, true, type$.dynamic); B.JSArray_methods.addAll$1(t2, t1); toClassic = A.Base58Encoder_checkEncode(A.List_List$from(t2, true, type$.int), B.Base58Alphabets_1); return new A.XRPAddress(toClassic, decodeXAddress.tag); } t1 = type$.Map_String_dynamic; t1._as(B.Map_empty0); - t1 = t1._as(A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "base58_alph", B.Base58Alphabets_1], type$.String, type$.dynamic)); + t1 = t1._as(A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "base58_alph", B.Base58Alphabets_1], type$.String, type$.dynamic)); t2 = type$.List_int; A.AddrKeyValidator_validateAddressArgs(t1, "net_ver", t2); netVarBytes = t2._as(t1.$index(0, "net_ver")); @@ -22741,18 +24262,6 @@ t2._as(t1.window).addEventListener("eip6963:requestProvider", A._functionToJS1(new A.EIP6963ProviderDetail_setup_closure($event))); t2._as(t1.window).dispatchEvent($event); }, - EthereumEventTypes_fromTag(tag) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_86y, new A.EthereumEventTypes_fromTag_closure(tag), new A.EthereumEventTypes_fromTag_closure0()); - }, - EthereumEventTypes_fromName($name) { - var t1, exception; - try { - t1 = B.JSArray_methods.firstWhere$2$orElse(B.List_86y, new A.EthereumEventTypes_fromName_closure($name), new A.EthereumEventTypes_fromName_closure0()); - return t1; - } catch (exception) { - return null; - } - }, ProxyMethodHandler: function ProxyMethodHandler(t0, t1) { this.object = t0; this.$ti = t1; @@ -22760,29 +24269,6 @@ EIP6963ProviderDetail_setup_closure: function EIP6963ProviderDetail_setup_closure(t0) { this.event = t0; }, - ClientMessageEthereum: function ClientMessageEthereum(t0, t1) { - this.method = t0; - this.params = t1; - }, - EthereumEventTypes: function EthereumEventTypes(t0, t1) { - this.tag = t0; - this._name = t1; - }, - EthereumEventTypes_fromTag_closure: function EthereumEventTypes_fromTag_closure(t0) { - this.tag = t0; - }, - EthereumEventTypes_fromTag_closure0: function EthereumEventTypes_fromTag_closure0() { - }, - EthereumEventTypes_fromName_closure: function EthereumEventTypes_fromName_closure(t0) { - this.name = t0; - }, - EthereumEventTypes_fromName_closure0: function EthereumEventTypes_fromName_closure0() { - }, - JSWalletMessageResponseEthereum: function JSWalletMessageResponseEthereum(t0, t1, t2) { - this.event = t0; - this.client = t1; - this.data = t2; - }, EthereumAccountsChanged: function EthereumAccountsChanged(t0, t1) { this.accounts = t0; this.defaultAddress = t1; @@ -22802,50 +24288,54 @@ return new A.EthereumWeb3State(chain, defaultAddress, client, permission, A.List_List$unmodifiable(chains, type$.EthereumChain), t1, state); }, EthereumWeb3State_EthereumWeb3State(authenticated, chainHandler) { - var t1, t2, currentChain, permissionAccounts, defaultAddress, t3, _null = null, + var t1, t2, currentChain, t3, permissionAccounts, defaultAddress, t4, _null = null, permission = authenticated.getChainFromNetworkType$1$1(B.NetworkType_iDZ, type$.Web3EthereumChain); if (permission == null) - return A.EthereumWeb3State$_(_null, B.List_empty3, _null, _null, _null, B.List_empty1, B.JSNetworkState_2); + return A.EthereumWeb3State$_(_null, B.List_empty0, _null, _null, _null, B.List_empty1, B.JSNetworkState_2); t1 = type$.WhereTypeIterable_EthereumChain; t2 = t1._eval$1("Iterable.E"); - currentChain = B.JSArray_methods.firstWhere$1(A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2), new A.EthereumWeb3State_EthereumWeb3State_closure(permission)); - permissionAccounts = permission.currentChainAccounts$1(currentChain); + currentChain = A.QuickImutableList_firstWhereOrNull(A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2), new A.EthereumWeb3State_EthereumWeb3State_closure(permission), _null, type$.EthereumChain); + t3 = currentChain == null; + permissionAccounts = t3 ? A._setArrayType([], type$.JSArray_Web3EthereumChainAccount) : permission.chainAccounts$1(currentChain); defaultAddress = A.QuickImutableList_firstWhereOrNull(permissionAccounts, new A.EthereumWeb3State_EthereumWeb3State_closure0(), new A.EthereumWeb3State_EthereumWeb3State_closure1(permissionAccounts), type$.Web3EthereumChainAccount); - t2 = A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2); - t1 = A._arrayInstanceType(permissionAccounts); - t3 = t1._eval$1("MappedListIterable<1,String>"); - t3 = A.List_List$of(new A.MappedListIterable(permissionAccounts, t1._eval$1("String(1)")._as(new A.EthereumWeb3State_EthereumWeb3State_closure2()), t3), true, t3._eval$1("ListIterable.E")); - B.JSArray_methods.sort$1(t3, new A.EthereumWeb3State_EthereumWeb3State_closure3(defaultAddress)); - t1 = defaultAddress == null ? _null : defaultAddress.address.address; - return A.EthereumWeb3State$_(currentChain, t2, currentChain.getWeb3Provider$1$requestTimeout(B.Duration_1000000), t1, permission, t3, B.JSNetworkState_0); + t1 = A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2); + t2 = A._arrayInstanceType(permissionAccounts); + t4 = t2._eval$1("MappedListIterable<1,String>"); + t4 = A.List_List$of(new A.MappedListIterable(permissionAccounts, t2._eval$1("String(1)")._as(new A.EthereumWeb3State_EthereumWeb3State_closure2()), t4), true, t4._eval$1("ListIterable.E")); + B.JSArray_methods.sort$1(t4, new A.EthereumWeb3State_EthereumWeb3State_closure3(defaultAddress)); + t2 = defaultAddress == null ? _null : defaultAddress.address.address; + return A.EthereumWeb3State$_(currentChain, t1, t3 ? _null : currentChain.getWeb3Provider$1$requestTimeout(B.Duration_1000000), t2, permission, t4, B.JSNetworkState_0); }, JSEthereumHandler__parseTypedData(params, chainId) { - var toList, version, address, data, typdedDataParams, t1, t2, t3, t4, version0, exception; + var items, item0, item1, version, address, data, typdedDataParams, t1, t2, t3, version0, exception, _null = null; try { - t1 = type$.dynamic; - toList = params.paramsAsList$1$1$length(2, t1); - if (toList == null) + items = A.PageMessageRequest_getElements(params, 2); + t1 = items; + item0 = t1 == null ? _null : J.$index$asx(t1, 0); + t1 = items; + item1 = t1 == null ? _null : J.$index$asx(t1, 1); + if (items == null) throw A.wrapException(B.Web3RequestException_gc6); - t2 = params.method; - t3 = t2.length; - t4 = t3 - 1; - if (!(t4 >= 0)) - return A.ioore(t2, t4); - version0 = A.Primitives_parseInt(t2[t4], null); + t1 = A._asString(params.method); + t2 = t1.length; + t3 = t2 - 1; + if (!(t3 >= 0)) + return A.ioore(t1, t3); + version0 = A.Primitives_parseInt(t1[t3], _null); version = A.EIP712Version_fromVersion(version0 == null ? 1 : version0); address = null; data = null; if (version === B.EIP712Version_1) { - address = A._asString(J.$index$asx(toList, 1)); - t2 = A.JsUtils_toList(J.$index$asx(toList, 0), t1); - t3 = A._arrayInstanceType(t2); - t4 = t3._eval$1("MappedListIterable<1,Map>"); - data = A.EIP712Legacy_EIP712Legacy$fromJson(A.List_List$of(new A.MappedListIterable(t2, t3._eval$1("Map(1)")._as(new A.JSEthereumHandler__parseTypedData_closure()), t4), true, t4._eval$1("ListIterable.E"))); + address = A._asString(item1); + t1 = A.JsUtils_toList(item0, _null, type$.dynamic); + t2 = A._arrayInstanceType(t1); + t3 = t2._eval$1("MappedListIterable<1,Map>"); + data = A.EIP712Legacy_EIP712Legacy$fromJson(A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("Map(1)")._as(new A.JSEthereumHandler__parseTypedData_closure()), t3), true, t3._eval$1("ListIterable.E"))); } else { - address = A._asString(J.$index$asx(toList, 0)); - data = A.Eip712TypedData_Eip712TypedData$fromJson(A.JsUtils_toMap(J.$index$asx(toList, 1), null, type$.String, t1), version); + address = A._asString(item0); + data = A.Eip712TypedData_Eip712TypedData$fromJson(A.JsUtils_toMap(item1, _null), version); } - typdedDataParams = A.Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson(A.LinkedHashMap_LinkedHashMap$_literal(["address", address, "typedData", B.C_JsonCodec.encode$2$toEncodable(data.toJson$0(), null)], type$.String, t1)); + typdedDataParams = A.Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson(A.LinkedHashMap_LinkedHashMap$_literal(["address", address, "typedData", B.C_JsonCodec.encode$2$toEncodable(data.toJson$0(), _null)], type$.String, type$.dynamic)); return typdedDataParams; } catch (exception) { if (A.unwrapException(exception) instanceof A.Web3RequestException) @@ -22854,18 +24344,6 @@ throw A.wrapException(B.Web3RequestException_gc6); } }, - JSEthereumHandler__parseTransaction(params, chainId) { - var toJson, - toList = params.paramsAsList$1$1$length(1, type$.dynamic); - if (toList == null) - throw A.wrapException(A.Web3RequestExceptionConst_invalidMethodArgruments(params.method)); - if (0 >= toList.length) - return A.ioore(toList, 0); - toJson = A.MethodUtils_nullOnException(new A.JSEthereumHandler__parseTransaction_closure(toList[0]), type$.Map_String_dynamic); - if (toJson == null) - throw A.wrapException(A.Web3RequestExceptionConst_invalidMethodArgruments(params.method)); - return A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson(toJson); - }, EthereumWeb3State: function EthereumWeb3State(t0, t1, t2, t3, t4, t5, t6) { var _ = this; _.chain = t0; @@ -22908,9 +24386,6 @@ this.i = t0; this.network = t1; }, - JSEthereumHandler__parseTransaction_closure: function JSEthereumHandler__parseTransaction_closure(t0) { - this.transactionParam = t0; - }, JSWalletError_constructor_fromMessage(message, stack) { var t1, json = message.toJson$0(); @@ -22942,13 +24417,6 @@ JSWalletError_constructor_fromJson_toString: function JSWalletError_constructor_fromJson_toString(t0) { this.message = t0; }, - ChainWeb3State: function ChainWeb3State() { - }, - JSNetworkHandler: function JSNetworkHandler() { - }, - JSNetworkState: function JSNetworkState(t0) { - this._name = t0; - }, WalletPromise_get_toPromise(_this, $T) { return type$.JSObject._as(new self.Promise(A._functionToJS2(new A.WalletPromise_get_toPromise_closure(_this)))); }, @@ -22965,148 +24433,179 @@ this.reject = t0; this.resolve = t1; }, - JSWalletMessageType_fromTag(tag) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_vwZ, new A.JSWalletMessageType_fromTag_closure(tag), new A.JSWalletMessageType_fromTag_closure0()); - }, - JSWalletMessage_deserialize(bytes, $T) { - var values, t1, t2, t3, t4, response, _null = null, - cbor = A.CborSerializable_decode(bytes, _null, _null, type$.CborTagValue_dynamic); - switch (A.JSWalletMessageType_fromTag(cbor.tags)) { - case B.JSWalletMessageType_List_100_response: - values = A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_100, type$.CborListValue_dynamic); - t1 = type$.nullable_List_int; - t2 = A.JSClientType_fromTag(A.ExtractCborList_elementAt(values, 0, t1)); - t3 = type$.String; - t4 = A.ExtractCborList_elementAt(values, 1, t3); - t3 = J.$index$asx(A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 2, t3), type$.dynamic), "result"); - response = new A.JSWalletMessageResponse(t4, A.JSWalletResponseType_fromTag(A.ExtractCborList_elementAt(values, 3, t1)), t2, t3); - break; - case B.JSWalletMessageType_List_101_event: - response = A.JSWalletNetworkEvent_JSWalletNetworkEvent$deserialize(cbor); - break; - default: - throw A.wrapException(B.Web3RequestException_chs); - } - if (!$T._is(response)) + ChainWeb3State: function ChainWeb3State() { + }, + JSNetworkHandler: function JSNetworkHandler() { + }, + JSNetworkState: function JSNetworkState(t0) { + this._core$_name = t0; + }, + JSWalletMessageType_fromName($name) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_soA, new A.JSWalletMessageType_fromName_closure($name), new A.JSWalletMessageType_fromName_closure0()); + }, + WalletMessage_constructor_response(client, data, id, requestId) { + return {requestId: requestId, id: id, client: client._core$_name, data: data}; + }, + WalletMessageData_asString(_this) { + var t1 = _this.data; + return A._asString(t1 == null ? null : A.dartify(t1)); + }, + WalletMessageData__convertMap(_this, map) { + map.forEach$1(0, new A.WalletMessageData__convertMap_closure(map, _this)); + return A.LinkedHashMap_LinkedHashMap$from(map, type$.String, type$.dynamic); + }, + WalletMessageData_asMap(_this) { + var t1 = _this.data; + t1 = t1 == null ? null : A.dartify(t1); + return A.WalletMessageData__convertMap(_this, type$.Map_dynamic_dynamic._as(t1)); + }, + WalletMessageEvent_constructor_build(data, $event) { + var t1 = data == null ? null : A.jsify(data); + return {type: "event", event: $event._core$_name, data: t1}; + }, + JSEventType_name($name) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_7xV, new A.JSEventType_name_closure($name), new A.JSEventType_name_closure0()); + }, + JSEventType_fromName($name) { + return A.QuickImutableList_firstWhereOrNull(B.List_7xV, new A.JSEventType_fromName_closure($name), null, type$.JSEventType); + }, + JSWalletResponseType_fromName($name) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_JEF, new A.JSWalletResponseType_fromName_closure($name), new A.JSWalletResponseType_fromName_closure0()); + }, + JSClientType_fronNetworkName($name) { + if ($name == null) + return B.JSClientType_AOw; + return B.JSArray_methods.firstWhere$2$orElse(B.List_jyH, new A.JSClientType_fronNetworkName_closure($name), new A.JSClientType_fronNetworkName_closure0()); + }, + JSClientType_fromName($name) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_jyH, new A.JSClientType_fromName_closure($name), new A.JSClientType_fromName_closure0()); + }, + PageMessageType_fromName($name) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_WQM, new A.PageMessageType_fromName_closure($name), new A.PageMessageType_fromName_closure0()); + }, + PageMessageData_cast(_this, $T) { + if (!$T._is(_this)) throw A.wrapException(B.Web3RequestException_chs); - return response; + return $T._as(_this); }, - JSWalletNetworkEvent_JSWalletNetworkEvent$deserialize(object) { - var values, _null = null, _s6_ = "result", - cbor = A.CborSerializable_decode(_null, _null, object, type$.CborTagValue_dynamic), - t1 = type$.CborListValue_dynamic, - t2 = type$.nullable_List_int; - switch (A.JSClientType_fromTag(A.ExtractCborList_elementAt(A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_101, t1), 0, t2))) { - case B.JSClientType_List_111_ethereum: - values = A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_101, t1); - if (A.JSClientType_fromTag(A.ExtractCborList_elementAt(values, 0, t2)) !== B.JSClientType_List_111_ethereum) - A.throwExpression(B.Web3RequestException_chs); - return new A.JSWalletMessageResponseEthereum(A.EthereumEventTypes_fromTag(A.ExtractCborList_elementAt(values, 1, t2)), B.JSClientType_List_111_ethereum, J.$index$asx(A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 2, type$.String), type$.dynamic), _s6_)); - case B.JSClientType_List_112_tron: - values = A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_101, t1); - if (A.JSClientType_fromTag(A.ExtractCborList_elementAt(values, 0, t2)) !== B.JSClientType_List_112_tron) - A.throwExpression(B.Web3RequestException_chs); - return new A.JSWalletMessageResponseTron(A.TronEventTypes_fromTag(A.ExtractCborList_elementAt(values, 1, t2)), B.JSClientType_List_112_tron, J.$index$asx(A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 2, type$.String), type$.dynamic), _s6_)); - case B.JSClientType_List_113_solana: - values = A.CborSerializable_cborTagValue(_null, _null, cbor, B.List_101, t1); - if (A.JSClientType_fromTag(A.ExtractCborList_elementAt(values, 0, t2)) !== B.JSClientType_List_113_solana) - A.throwExpression(B.Web3RequestException_chs); - return new A.JSWalletMessageResponseSolana(A.SolanaEventTypes_fromTag(A.ExtractCborList_elementAt(values, 1, t2)), B.JSClientType_List_113_solana, J.$index$asx(A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 2, type$.String), type$.dynamic), _s6_)); - } - throw A.wrapException(B.Web3RequestException_chs); - }, - JSWalletResponseType_fromTag(tag) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_Oho, new A.JSWalletResponseType_fromTag_closure(tag), new A.JSWalletResponseType_fromTag_closure0()); - }, - JSClientType_fromTag(tag) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_wjC, new A.JSClientType_fromTag_closure(tag), new A.JSClientType_fromTag_closure0()); - }, - PageMessage_PageMessage$deserialize(object) { - var values, t1, params, _null = null, _s6_ = "result", - tag = A.CborSerializable_decode(_null, _null, object, type$.CborTagValue_dynamic); - switch (A.JSClientType_fromTag(tag.tags)) { - case B.JSClientType_List_111_ethereum: - values = A.CborSerializable_cborTagValue(_null, _null, tag, B.List_111, type$.CborListValue_dynamic); - t1 = type$.String; - params = A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 1, t1), type$.dynamic); - return new A.ClientMessageEthereum(A.ExtractCborList_elementAt(values, 0, t1), J.$index$asx(params, _s6_)); - case B.JSClientType_List_112_tron: - values = A.CborSerializable_cborTagValue(_null, _null, tag, B.List_112, type$.CborListValue_dynamic); - t1 = type$.String; - params = A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 1, t1), type$.dynamic); - return new A.ClientMessageTron(A.ExtractCborList_elementAt(values, 0, t1), J.$index$asx(params, _s6_)); - case B.JSClientType_List_113_solana: - values = A.CborSerializable_cborTagValue(_null, _null, tag, B.List_113, type$.CborListValue_dynamic); - t1 = type$.String; - params = A.StringUtils_toJson(A.ExtractCborList_elementAt(values, 1, t1), type$.dynamic); - return new A.ClientMessageSolana(A.ExtractCborList_elementAt(values, 0, t1), J.$index$asx(params, _s6_)); - default: - throw A.wrapException(B.Web3RequestException_chs); + JSArrayFuture_elemetAt(_this, index, $T, $E) { + var t1, exception; + try { + t1 = $E._as($T._eval$1("0?")._as(_this[index])); + return t1; + } catch (exception) { + return null; } }, - JSWalletMessageType: function JSWalletMessageType(t0, t1) { - this.tag = t0; - this._name = t1; + PageMessageRequest_constructor_create(additionalData, id, method, params) { + var t1 = id == null ? "" : id; + return {type: "request", method: method, params: params, id: t1, additionalData: additionalData}; }, - JSWalletMessageType_fromTag_closure: function JSWalletMessageType_fromTag_closure(t0) { - this.tag = t0; + PageMessageRequest_get_dartParams(_this) { + var t1 = type$.nullable_JSArray_nullable_Object._as(_this.params); + if (t1 == null) + t1 = null; + else { + t1 = B.JSArray_methods.map$1$1(t1, new A.PageMessageRequest_get_dartParams_closure(), type$.nullable_Object); + t1 = A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")); + } + return t1 == null ? [] : t1; }, - JSWalletMessageType_fromTag_closure0: function JSWalletMessageType_fromTag_closure0() { + PageMessageRequest_getElements(_this, $length) { + var toDart = A.PageMessageRequest_get_dartParams(_this); + if (toDart.length >= $length) + return B.JSArray_methods.sublist$2(toDart, 0, $length); + return null; }, - JSWalletMessage: function JSWalletMessage() { + PageMessageRequest_getJSParamsAs(_this, $T) { + var t1, exception; + try { + t1 = type$.nullable_JSArray_nullable_Object._as(_this.params); + t1 = A.List_List$from(t1 == null ? type$.List_dynamic._as(t1) : t1, true, $T); + return t1; + } catch (exception) { + return null; + } }, - JSWalletNetworkEvent: function JSWalletNetworkEvent() { + PageMessageRequest_get_getFirstParam(_this) { + var toDart = A.PageMessageRequest_get_dartParams(_this); + if (toDart.length === 0) + return null; + return B.JSArray_methods.get$first(toDart); }, - JSWalletResponseType: function JSWalletResponseType(t0, t1) { - this.tag = t0; - this._name = t1; + PageMessageEvent_constructor_build($event) { + return {type: "event", event: $event._core$_name, data: null}; }, - JSWalletResponseType_fromTag_closure: function JSWalletResponseType_fromTag_closure(t0) { - this.tag = t0; + JSWalletMessageType: function JSWalletMessageType(t0) { + this._core$_name = t0; }, - JSWalletResponseType_fromTag_closure0: function JSWalletResponseType_fromTag_closure0() { + JSWalletMessageType_fromName_closure: function JSWalletMessageType_fromName_closure(t0) { + this.name = t0; }, - JSWalletMessageResponse: function JSWalletMessageResponse(t0, t1, t2, t3) { - var _ = this; - _.requestId = t0; - _.status = t1; - _.client = t2; - _.data = t3; + JSWalletMessageType_fromName_closure0: function JSWalletMessageType_fromName_closure0() { + }, + WalletMessageData__convertMap_closure: function WalletMessageData__convertMap_closure(t0, t1) { + this.map = t0; + this._this = t1; + }, + JSEventType: function JSEventType(t0) { + this._core$_name = t0; + }, + JSEventType_name_closure: function JSEventType_name_closure(t0) { + this.name = t0; + }, + JSEventType_name_closure0: function JSEventType_name_closure0() { + }, + JSEventType_fromName_closure: function JSEventType_fromName_closure(t0) { + this.name = t0; + }, + JSWalletResponseType: function JSWalletResponseType(t0) { + this._core$_name = t0; + }, + JSWalletResponseType_fromName_closure: function JSWalletResponseType_fromName_closure(t0) { + this.name = t0; + }, + JSWalletResponseType_fromName_closure0: function JSWalletResponseType_fromName_closure0() { }, JSClientType: function JSClientType(t0, t1) { - this.tag = t0; - this._name = t1; + this.networkName = t0; + this._core$_name = t1; }, - JSClientType_fromTag_closure: function JSClientType_fromTag_closure(t0) { - this.tag = t0; + JSClientType_fronNetworkName_closure: function JSClientType_fronNetworkName_closure(t0) { + this.name = t0; }, - JSClientType_fromTag_closure0: function JSClientType_fromTag_closure0() { + JSClientType_fronNetworkName_closure0: function JSClientType_fronNetworkName_closure0() { }, - JSPageRequest: function JSPageRequest(t0, t1) { - this.id = t0; - this.message = t1; + JSClientType_fromName_closure: function JSClientType_fromName_closure(t0) { + this.name = t0; }, - PageMessage: function PageMessage() { + JSClientType_fromName_closure0: function JSClientType_fromName_closure0() { }, - _JSPageRequest_Object_CborSerializable: function _JSPageRequest_Object_CborSerializable() { + PageMessageType: function PageMessageType(t0) { + this._core$_name = t0; }, - _JSWalletMessage_Object_CborSerializable: function _JSWalletMessage_Object_CborSerializable() { + PageMessageType_fromName_closure: function PageMessageType_fromName_closure(t0) { + this.name = t0; + }, + PageMessageType_fromName_closure0: function PageMessageType_fromName_closure0() { }, - _PageMessage_Object_CborSerializable: function _PageMessage_Object_CborSerializable() { + PageMessageRequest_get_dartParams_closure: function PageMessageRequest_get_dartParams_closure() { }, - JSPageController: function JSPageController(t0, t1) { + JSPageController: function JSPageController(t0, t1, t2, t3) { var _ = this; - _.__JSPageController_solanaPageController_FI = _.__JSPageController_tronPageController_FI = _.__JSPageController_ethereumPageController_FI = $; - _.clientId = t0; - _.__JSPageController__walletId_FI = _.__JSPageController__id_FI = $; - _._waitingRequest = t1; + _.ethereumPageController = t0; + _.tronPageController = t1; + _.solanaPageController = t2; + _.tonPageController = t3; }, PageNetworkController: function PageNetworkController() { }, - EthereumPageController: function EthereumPageController(t0, t1) { - this._ethereum = null; - this._listeners = t0; - this.getWalletMessage = t1; + EthereumPageController: function EthereumPageController(t0) { + var _ = this; + _._requestId = 0; + _._ethereum = null; + _._id = 0; + _._listeners = t0; }, EthereumPageController__init__closure: function EthereumPageController__init__closure(t0) { this._dartInstance = t0; @@ -23114,59 +24613,76 @@ EthereumPageController__init_closure: function EthereumPageController__init_closure(t0) { this.$this = t0; }, - SolanaPageController: function SolanaPageController(t0, t1) { + SolanaPageController: function SolanaPageController(t0) { this._solana = null; + this._id = 0; this._listeners = t0; - this.getWalletMessage = t1; }, SolanaPageController__init__closure: function SolanaPageController__init__closure(t0) { this._dartInstance = t0; }, SolanaPageController__init_closure: function SolanaPageController__init_closure(t0) { - this.handler = t0; + this.$this = t0; }, - SolanaPageController__buildTransaction_closure: function SolanaPageController__buildTransaction_closure() { + SolanaPageController__signMessage_closure: function SolanaPageController__signMessage_closure() { }, - SolanaPageController__buildTransaction_closure0: function SolanaPageController__buildTransaction_closure0(t0) { - this.completer = t0; + SolanaPageController__buildWalletRequest_closure: function SolanaPageController__buildWalletRequest_closure() { }, - SolanaPageController__buildTransaction_closure1: function SolanaPageController__buildTransaction_closure1(t0, t1, t2, t3) { - var _ = this; - _.option = t0; - _.toDart = t1; - _.batch = t2; - _.completer = t3; + SolanaPageController__toWalletRequest_closure: function SolanaPageController__toWalletRequest_closure() { }, - SolanaPageController__buildTransaction__closure: function SolanaPageController__buildTransaction__closure() { + SolanaPageController__toWalletRequest_closure0: function SolanaPageController__toWalletRequest_closure0(t0, t1, t2) { + this.$this = t0; + this.request = t1; + this.transactions = t2; + }, + SolanaPageController__buildTransaction_closure: function SolanaPageController__buildTransaction_closure() { }, - SolanaPageController__buildTransaction__closure0: function SolanaPageController__buildTransaction__closure0() { + SolanaPageController__buildTransaction_closure0: function SolanaPageController__buildTransaction_closure0(t0, t1, t2) { + this.$this = t0; + this.method = t1; + this.transactions = t2; }, - SolanaPageController__buildTransaction__closure1: function SolanaPageController__buildTransaction__closure1() { + SolanaPageController__onTransactionResponse_closure: function SolanaPageController__onTransactionResponse_closure() { }, - SolanaPageController_onEvent_closure: function SolanaPageController_onEvent_closure() { + TonPageController: function TonPageController(t0) { + this._ton = null; + this._id = 0; + this._listeners = t0; }, - TronPageController: function TronPageController(t0, t1) { + TonPageController__init__closure: function TonPageController__init__closure(t0) { + this._dartInstance = t0; + }, + TonPageController__init_closure: function TonPageController__init_closure(t0) { + this.$this = t0; + }, + TronPageController: function TronPageController(t0) { var _ = this; _._tronWeb = _._tron = null; + _._id = 0; _._listeners = t0; - _.getWalletMessage = t1; }, - TronPageController__init__closure1: function TronPageController__init__closure1(t0) { + TronPageController__init__closure2: function TronPageController__init__closure2(t0) { this._dartInstance = t0; }, TronPageController__init_closure: function TronPageController__init_closure(t0) { + this.$this = t0; + }, + TronPageController__init__closure1: function TronPageController__init__closure1(t0) { + this._dartInstance = t0; + }, + TronPageController__init_closure0: function TronPageController__init_closure0(t0) { this.trxHandler = t0; }, TronPageController__init__closure0: function TronPageController__init__closure0(t0) { this._dartInstance = t0; }, - TronPageController__init_closure0: function TronPageController__init_closure0(t0) { + TronPageController__init_closure1: function TronPageController__init_closure1(t0) { this.tronWebMethodHandler = t0; }, TronPageController__init__closure: function TronPageController__init__closure(t0) { this._dartInstance = t0; }, - TronPageController__init_closure1: function TronPageController__init_closure1(t0) { + TronPageController__init_closure2: function TronPageController__init_closure2(t0) { this.adapter = t0; }, TronPageController_onEvent__closure: function TronPageController_onEvent__closure(t0) { @@ -23178,10 +24694,22 @@ TronPageController_onEvent_closure: function TronPageController_onEvent_closure(t0) { this.changeInfo = t0; }, - JSUint8Array_toListInt(_this) { - var t1 = type$.nullable_List_dynamic._as(A.dartify(_this)); - t1 = t1 == null ? null : J.cast$1$0$ax(t1, type$.int); - return t1 == null ? A._setArrayType([], type$.JSArray_int) : t1; + JSSolanaSignMessageResponse_constructor_fromJson(json) { + var t1 = type$.List_dynamic, + t2 = type$.int, + t3 = J.cast$1$0$ax(t1._as(json.$index(0, "signature")), t2); + return {signature: type$.Object._as(self.Uint8Array.from(A.jsify(t3))), publicKey: A.JSSolanaPublicKey_JSSolanaPublicKey(A._asString(json.$index(0, "signer")), J.cast$1$0$ax(t1._as(json.$index(0, "signerAddressBytes")), t2)).get$toJS()}; + }, + JSSolanaTranasctionSendOptions_toJson(_this) { + var t1 = A._asBoolQ(_this.skipPreflight), + t2 = A._asStringQ(_this.preflightCommitment), + t3 = A._asIntQ(_this.minContextSlot), + t4 = type$.nullable_JSArray_nullable_Object._as(_this.signers); + if (t4 == null) + t4 = null; + else + t4 = J.get$isNotEmpty$asx(type$.List_Object._is(t4) ? t4 : new A.CastList(t4, A._arrayInstanceType(t4)._eval$1("CastList<1,Object>"))); + return A.LinkedHashMap_LinkedHashMap$_literal(["skipPreflight", t1, "preflightCommitment", t2, "minContextSlot", t3, "signers", t4 === true, "maxRetries", A._asIntQ(_this.maxRetries)], type$.String, type$.dynamic); }, JSSolanaPublicKey_JSSolanaPublicKey(base58, bytes) { var t1 = self, @@ -23190,26 +24718,19 @@ return new A.JSSolanaPublicKey(base58, jsBuffer, new t1.BN(t2._as(jsBuffer.slice()))); }, SolanaAccountsChanged_SolanaAccountsChanged$fromJson(json) { - var t4, - _s14_ = "defaultAddress", - t1 = type$.List_dynamic, - t2 = type$.String, - t3 = J.cast$1$0$ax(t1._as(json.$index(0, "accounts")), t2); - if (json.$index(0, _s14_) == null) - t1 = null; - else { - t4 = type$.Map_String_dynamic._as(json.$index(0, _s14_)); - t4 = A.JSSolanaPublicKey_JSSolanaPublicKey(A._asString(t4.$index(0, "base58")), J.cast$1$0$ax(t1._as(t4.$index(0, "bytes")), type$.int)); - t1 = t4; - } - t4 = A._asString(type$.Map_String_dynamic._as(json.$index(0, "connectInfo")).$index(0, "genesisBlock")); - return new A.SolanaAccountsChanged(A.List_List$unmodifiable(t3, t2), t1, new A.SolanaProviderConnectInfo(t4)); - }, - SolanaEventTypes_fromTag(tag) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_fHr, new A.SolanaEventTypes_fromTag_closure(tag), new A.SolanaEventTypes_fromTag_closure0()); - }, - SolanaEventTypes_fromName($name) { - return A.QuickImutableList_firstWhereOrNull(B.List_fHr, new A.SolanaEventTypes_fromName_closure($name), null, type$.SolanaEventTypes); + var t5, + t1 = type$.String, + t2 = J.cast$1$0$ax(type$.List_dynamic._as(json.$index(0, "accounts")), t1), + t3 = A._asStringQ(json.$index(0, "defaultAddress")), + t4 = type$.nullable_List_dynamic._as(json.$index(0, "defaultAddressBytes")); + t4 = t4 == null ? null : J.cast$1$0$ax(t4, type$.int); + t5 = A._asString(type$.Map_String_dynamic._as(json.$index(0, "connectInfo")).$index(0, "genesisBlock")); + return new A.SolanaAccountsChanged(A.List_List$unmodifiable(t2, t1), t3, A.BytesUtils_tryToBytes(t4, true), new A.SolanaProviderConnectInfo(t5)); + }, + JSSolanaSignTransactionResponse: function JSSolanaSignTransactionResponse(t0, t1, t2) { + this.signature = t0; + this.addressBytes = t1; + this.address = t2; }, JSSolanaPublicKey: function JSSolanaPublicKey(t0, t1, t2) { this.base58 = t0; @@ -23222,36 +24743,14 @@ JSSolanaPublicKey_toJS_closure: function JSSolanaPublicKey_toJS_closure(t0) { this.$this = t0; }, - SolanaAccountsChanged: function SolanaAccountsChanged(t0, t1, t2) { - this.accounts = t0; - this.defaultAddress = t1; - this.connectInfo = t2; - }, - SolanaEventTypes: function SolanaEventTypes(t0, t1) { - this.tag = t0; - this._name = t1; - }, - SolanaEventTypes_fromTag_closure: function SolanaEventTypes_fromTag_closure(t0) { - this.tag = t0; - }, - SolanaEventTypes_fromTag_closure0: function SolanaEventTypes_fromTag_closure0() { - }, - SolanaEventTypes_fromName_closure: function SolanaEventTypes_fromName_closure(t0) { - this.name = t0; - }, - ClientMessageSolana: function ClientMessageSolana(t0, t1) { - this.method = t0; - this.params = t1; - }, - ClientSolanaTransactionMessage: function ClientSolanaTransactionMessage(t0, t1, t2) { - this.id = t0; - this.message = t1; - this.sendOption = t2; + SolanaAccountsChanged: function SolanaAccountsChanged(t0, t1, t2, t3) { + var _ = this; + _.accounts = t0; + _.defaultAddress = t1; + _.defaultAddressBytes = t2; + _.connectInfo = t3; }, - JSWalletMessageResponseSolana: function JSWalletMessageResponseSolana(t0, t1, t2) { - this.event = t0; - this.client = t1; - this.data = t2; + SolanaAccountsChanged_accountJS_closure: function SolanaAccountsChanged_accountJS_closure() { }, SolanaProviderConnectInfo: function SolanaProviderConnectInfo(t0) { this.genesisBlock = t0; @@ -23270,23 +24769,18 @@ var t1, t2, currentChain, permissionAccounts, defaultAddress, t3, _null = null, permission = authenticated.getChainFromNetworkType$1$1(B.NetworkType_4QF, type$.Web3SolanaChain); if (permission == null) - return A.SolanaWeb3State$_(_null, B.List_empty0, _null, _null, _null, B.List_empty1, B.JSNetworkState_2); + return A.SolanaWeb3State$_(_null, B.List_empty3, _null, _null, _null, B.List_empty1, B.JSNetworkState_2); t1 = type$.WhereTypeIterable_SolanaChain; t2 = t1._eval$1("Iterable.E"); currentChain = B.JSArray_methods.firstWhere$1(A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2), new A.SolanaWeb3State_SolanaWeb3State_closure(permission)); - permissionAccounts = permission.currentChainAccounts$1(currentChain); + permissionAccounts = permission.chainAccounts$1(currentChain); defaultAddress = A.QuickImutableList_firstWhereOrNull(permissionAccounts, new A.SolanaWeb3State_SolanaWeb3State_closure0(), new A.SolanaWeb3State_SolanaWeb3State_closure1(permissionAccounts), type$.Web3SolanaChainAccount); t2 = A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2); t1 = A._arrayInstanceType(permissionAccounts); t3 = t1._eval$1("MappedListIterable<1,String>"); t3 = A.List_List$of(new A.MappedListIterable(permissionAccounts, t1._eval$1("String(1)")._as(new A.SolanaWeb3State_SolanaWeb3State_closure2()), t3), true, t3._eval$1("ListIterable.E")); B.JSArray_methods.sort$1(t3, new A.SolanaWeb3State_SolanaWeb3State_closure3(defaultAddress)); - if (defaultAddress == null) - t1 = _null; - else { - t1 = defaultAddress.address.address; - t1 = A.JSSolanaPublicKey_JSSolanaPublicKey(t1, A.List_List$from(new A.SolAddrDecoder().decodeAddr$1(t1), true, type$.int)); - } + t1 = defaultAddress == null ? _null : defaultAddress.address; return A.SolanaWeb3State$_(currentChain, t2, currentChain.getWeb3Provider$1$requestTimeout(B.Duration_1000000), t1, permission, t3, B.JSNetworkState_0); }, SolanaWeb3State: function SolanaWeb3State(t0, t1, t2, t3, t4, t5) { @@ -23321,39 +24815,123 @@ this.authenticated = t1; this.chainHandler = t2; }, - JSSolanaHandler__parseTransaction_closure: function JSSolanaHandler__parseTransaction_closure() { - }, - JSSolanaHandler__parseTransaction_closure0: function JSSolanaHandler__parseTransaction_closure0(t0) { + JSSolanaHandler__parseTransaction_closure: function JSSolanaHandler__parseTransaction_closure(t0) { this.state = t0; }, - JSSolanaHandler__parseTransaction_closure1: function JSSolanaHandler__parseTransaction_closure1(t0) { + JSSolanaHandler__parseTransaction_closure0: function JSSolanaHandler__parseTransaction_closure0(t0) { this.activeAccounts = t0; }, - TronEventTypes_fromTag(tag) { - return B.JSArray_methods.firstWhere$2$orElse(B.List_C8a, new A.TronEventTypes_fromTag_closure(tag), new A.TronEventTypes_fromTag_closure0()); + JSSolanaHandler_finilizeWalletResponse_closure: function JSSolanaHandler_finilizeWalletResponse_closure() { }, - TronEventTypes_fromName($name) { - return A.QuickImutableList_firstWhereOrNull(B.List_C8a, new A.TronEventTypes_fromName_closure($name), null, type$.TronEventTypes); + JSSolanaHandler_finilizeWalletResponse_closure0: function JSSolanaHandler_finilizeWalletResponse_closure0() { }, - JSTronAddress: function JSTronAddress(t0, t1) { - this.base58 = t0; - this.hex = t1; + TonChainId_fromNetworkId(id) { + return B.JSArray_methods.firstWhere$2$orElse(B.List_wQu, new A.TonChainId_fromNetworkId_closure(id), new A.TonChainId_fromNetworkId_closure0()); }, - TronEventTypes: function TronEventTypes(t0, t1) { - this.tag = t0; - this._name = t1; + TonChainId: function TonChainId(t0, t1, t2) { + this.value = t0; + this.workchain = t1; + this._core$_name = t2; }, - TronEventTypes_fromTag_closure: function TronEventTypes_fromTag_closure(t0) { - this.tag = t0; + TonChainId_fromNetworkId_closure: function TonChainId_fromNetworkId_closure(t0) { + this.id = t0; }, - TronEventTypes_fromTag_closure0: function TronEventTypes_fromTag_closure0() { + TonChainId_fromNetworkId_closure0: function TonChainId_fromNetworkId_closure0() { }, - TronEventTypes_fromName_closure: function TronEventTypes_fromName_closure(t0) { - this.name = t0; + TonAccountsChanged: function TonAccountsChanged(t0, t1) { + this.accounts = t0; + this.defaultAddress = t1; }, - ClientMessageTron: function ClientMessageTron(t0, t1) { - this.method = t0; - this.params = t1; + TonChainChanged: function TonChainChanged(t0) { + this.workChain = t0; + }, + TonChainChanged_toJS__closure: function TonChainChanged_toJS__closure(t0) { + this._dartInstance = t0; + }, + TonChainChanged_toJS_closure: function TonChainChanged_toJS_closure(t0) { + this.$this = t0; + }, + TonWeb3State$_(chain, chains, client, defaultAddress, permission, permissionAccounts, state) { + var t1 = A.List_List$unmodifiable(permissionAccounts, type$.String); + return new A.TonWeb3State(chain, defaultAddress, permission, A.List_List$unmodifiable(chains, type$.TheOpenNetworkChain), t1, state); + }, + TonWeb3State_TonWeb3State(authenticated, chainHandler) { + var t2, t3, currentChain, permissionAccounts, defaultNetworkAddress, chainAddress, t4, t5, t6, t7, t8, _null = null, t1 = {}, + permission = authenticated.getChainFromNetworkType$1$1(B.NetworkType_66M, type$.Web3TonChain); + if (permission == null) + return A.TonWeb3State$_(_null, B.List_empty4, _null, _null, _null, B.List_empty1, B.JSNetworkState_2); + t2 = type$.WhereTypeIterable_TheOpenNetworkChain; + t3 = t2._eval$1("Iterable.E"); + currentChain = B.JSArray_methods.firstWhere$1(A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t2), true, t3), new A.TonWeb3State_TonWeb3State_closure(permission)); + permissionAccounts = permission.chainAccounts$1(currentChain); + t1.defaultAddress = null; + if (permissionAccounts.length !== 0) { + defaultNetworkAddress = B.JSArray_methods.firstWhere$2$orElse(permissionAccounts, new A.TonWeb3State_TonWeb3State_closure0(), new A.TonWeb3State_TonWeb3State_closure1(permissionAccounts)); + chainAddress = B.JSArray_methods.firstWhere$1(currentChain._addresses, new A.TonWeb3State_TonWeb3State_closure2(defaultNetworkAddress)); + t4 = chainAddress.networkAddress; + t5 = t4.toFriendlyAddress$0(); + t6 = A.TonChainId_fromNetworkId(currentChain.network.coinParam.workchain); + t7 = chainAddress.context; + t8 = chainAddress.publicKey; + t4 = t7.toWalletContract$2$chain$publicKey(A.TonChain_fromWorkchain(t4.workChain), t8).state.initialState$0(); + t7 = new A.Builder(A.BitBuilder$(1023), A._setArrayType([], type$.JSArray_Cell)); + t4.store$1(t7); + t7 = t7.endCell$0().toBase64$0(); + t4 = t7; + t1.defaultAddress = {name: "ton_addr", address: t5, network: t6.value, walletStateInit: t4, publicKey: A.BytesUtils_toHexString(t8, true, _null)}; + } + t2 = A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t2), true, t3); + t3 = A._arrayInstanceType(permissionAccounts); + t4 = t3._eval$1("MappedListIterable<1,String>"); + t4 = A.List_List$of(new A.MappedListIterable(permissionAccounts, t3._eval$1("String(1)")._as(new A.TonWeb3State_TonWeb3State_closure3()), t4), true, t4._eval$1("ListIterable.E")); + B.JSArray_methods.sort$1(t4, new A.TonWeb3State_TonWeb3State_closure4(t1)); + t1 = t1.defaultAddress; + return A.TonWeb3State$_(currentChain, t2, currentChain.getWeb3Provider$1$requestTimeout(B.Duration_1000000), t1, permission, t4, B.JSNetworkState_0); + }, + TonWeb3State: function TonWeb3State(t0, t1, t2, t3, t4, t5) { + var _ = this; + _.chain = t0; + _.defaultAddress = t1; + _.permission = t2; + _.chains = t3; + _.permissionAccounts = t4; + _.state = t5; + }, + TonWeb3State_TonWeb3State_closure: function TonWeb3State_TonWeb3State_closure(t0) { + this.permission = t0; + }, + TonWeb3State_TonWeb3State_closure0: function TonWeb3State_TonWeb3State_closure0() { + }, + TonWeb3State_TonWeb3State_closure1: function TonWeb3State_TonWeb3State_closure1(t0) { + this.permissionAccounts = t0; + }, + TonWeb3State_TonWeb3State_closure2: function TonWeb3State_TonWeb3State_closure2(t0) { + this.defaultNetworkAddress = t0; + }, + TonWeb3State_TonWeb3State_closure3: function TonWeb3State_TonWeb3State_closure3() { + }, + TonWeb3State_TonWeb3State_closure4: function TonWeb3State_TonWeb3State_closure4(t0) { + this._box_0 = t0; + }, + JSTonHandler: function JSTonHandler(t0, t1, t2) { + this.state = t0; + this.lock = t1; + this.sendMessageToClient = t2; + }, + JSTonHandler_initChain_closure: function JSTonHandler_initChain_closure(t0, t1, t2) { + this.$this = t0; + this.authenticated = t1; + this.chainHandler = t2; + }, + TronChainChanged_TronChainChanged$fromJson(json) { + var t1 = A._BigIntImpl_parse(A._asString(json.$index(0, "net_version")), null), + t2 = A._asString(json.$index(0, "fullNode")), + t3 = A._asString(json.$index(0, "solidityNode")); + return new A.TronChainChanged("0x" + t1.toRadixString$1(0, 16), t1, t3, t2); + }, + JSTronAddress: function JSTronAddress(t0, t1) { + this.base58 = t0; + this.hex = t1; }, TronWebNodeInfo: function TronWebNodeInfo(t0, t1, t2, t3, t4, t5) { var _ = this; @@ -23373,15 +24951,23 @@ TronWebNodeInfo_toTronWeb_closure: function TronWebNodeInfo_toTronWeb_closure(t0) { this.addr = t0; }, - JSWalletMessageResponseTron: function JSWalletMessageResponseTron(t0, t1, t2) { - this.event = t0; - this.client = t1; - this.data = t2; - }, TronAccountsChanged: function TronAccountsChanged(t0, t1) { this.accounts = t0; this.defaultAddress = t1; }, + TronChainChanged: function TronChainChanged(t0, t1, t2, t3) { + var _ = this; + _.chainId = t0; + _.netVersion = t1; + _.solidityNode = t2; + _.fullNode = t3; + }, + TronChainChanged_toJSEvent__closure: function TronChainChanged_toJSEvent__closure(t0) { + this._dartInstance = t0; + }, + TronChainChanged_toJSEvent_closure: function TronChainChanged_toJSEvent_closure(t0) { + this.$this = t0; + }, TronWeb3State$_(chain, chains, client, defaultAddress, permission, permissionAccounts, state) { var t1 = A.List_List$unmodifiable(permissionAccounts, type$.String); return new A.TronWeb3State(chain, defaultAddress, client, permission, A.List_List$unmodifiable(chains, type$.TronChain), t1, state); @@ -23394,7 +24980,7 @@ t1 = type$.WhereTypeIterable_TronChain; t2 = t1._eval$1("Iterable.E"); currentChain = B.JSArray_methods.firstWhere$1(A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2), new A.TronWeb3State_TronWeb3State_closure(permission)); - permissionAccounts = permission.currentChainAccounts$1(currentChain); + permissionAccounts = permission.chainAccounts$1(currentChain); defaultAddress = A.QuickImutableList_firstWhereOrNull(permissionAccounts, new A.TronWeb3State_TronWeb3State_closure0(), new A.TronWeb3State_TronWeb3State_closure1(permissionAccounts), type$.Web3TronChainAccount); t2 = A.List_List$of(new A.WhereTypeIterable(chainHandler.chains$0(), t1), true, t2); t1 = A._arrayInstanceType(permissionAccounts); @@ -23450,8 +25036,12 @@ }, JSWalletHandler: function JSWalletHandler() { }, + JSWalletHandler__onClientEvent_closure: function JSWalletHandler__onClientEvent_closure(t0, t1) { + this.$this = t0; + this.request = t1; + }, JSWebviewTraget: function JSWebviewTraget(t0) { - this._name = t0; + this._core$_name = t0; }, JSWebviewTraget_fromName_closure: function JSWebviewTraget_fromName_closure(t0) { this.name = t0; @@ -23461,7 +25051,7 @@ _.clientId = t0; _._chain = t1; _.target = t2; - _.__JSWalletHandler__id_FI = _.__JSWalletHandler_solanaHandler_FI = _.__JSWalletHandler_tronHandler_FI = _.__JSWalletHandler_ethereumHandler_FI = $; + _.__JSWalletHandler__id_FI = _.__JSWalletHandler__networks_FI = $; _.completer = t3; _._crypto = t4; }, @@ -24277,12 +25867,12 @@ case 0: return new A.Tuple(1, A._BigIntImpl__BigIntImpl$from(t1).$shr(0, 2), t2); case 1: - return new A.Tuple(2, A.BigintUtils_fromBytes(B.JSArray_methods.sublist$2(bytes, 0, 2), B.C_Endian0, false).$shr(0, 2), t2); + return new A.Tuple(2, A.BigintUtils_fromBytes(B.JSArray_methods.sublist$2(bytes, 0, 2), B.C_Endian, false).$shr(0, 2), t2); case 2: - return new A.Tuple(4, A.BigintUtils_fromBytes(B.JSArray_methods.sublist$2(bytes, 0, 4), B.C_Endian0, false).$shr(0, 2), t2); + return new A.Tuple(4, A.BigintUtils_fromBytes(B.JSArray_methods.sublist$2(bytes, 0, 4), B.C_Endian, false).$shr(0, 2), t2); default: offset = B.JSNumber_methods._shrOtherPositive$1(t1, 2) + 5; - return new A.Tuple(offset, A.BigintUtils_fromBytes(B.JSArray_methods.sublist$2(bytes, 1, offset), B.C_Endian0, false), t2); + return new A.Tuple(offset, A.BigintUtils_fromBytes(B.JSArray_methods.sublist$2(bytes, 1, offset), B.C_Endian, false), t2); } }, LayoutSerializationUtils_getDataCompactOffset(bytes) { @@ -24460,7 +26050,7 @@ B.JSArray_methods.$indexSet(byteList, $length - i - 1, val.$and(0, bigMaskEight).toInt$0(0)); val = val.$shr(0, 8); } - if (order === B.C_Endian0) { + if (order === B.C_Endian) { t2 = A._arrayInstanceType(byteList)._eval$1("ReversedListIterable<1>"); byteList = A.List_List$of(new A.ReversedListIterable(byteList, t2), true, t2._eval$1("ListIterable.E")); } @@ -24468,7 +26058,7 @@ }, BigintUtils_fromBytes(bytes, byteOrder, sign) { var t1, result, i, t2, t3; - if (byteOrder === B.C_Endian0) { + if (byteOrder === B.C_Endian) { t1 = J.get$reversed$ax(bytes); bytes = A.List_List$from(A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")), true, type$.int); } @@ -24500,7 +26090,7 @@ return t1; } if (type$.List_int._is(v)) { - t1 = A.BigintUtils_fromBytes(v, B.C_Endian, true); + t1 = A.BigintUtils_fromBytes(v, B.C_Endian0, true); return t1; } if (typeof v == "string") { @@ -24555,9 +26145,9 @@ IntUtils_toBytes(val, byteOrder, $length) { var t1, t2, byteList, i; if ($length > 4) { - t1 = A.List_List$of(A.IntUtils_toBytes(B.JSInt_methods._shrOtherPositive$1(val, 32), B.C_Endian, $length - 4), true, type$.int); - B.JSArray_methods.addAll$1(t1, A.IntUtils_toBytes(val >>> 0, B.C_Endian, 4)); - if (byteOrder === B.C_Endian0) { + t1 = A.List_List$of(A.IntUtils_toBytes(B.JSInt_methods._shrOtherPositive$1(val, 32), B.C_Endian0, $length - 4), true, type$.int); + B.JSArray_methods.addAll$1(t1, A.IntUtils_toBytes(val >>> 0, B.C_Endian0, 4)); + if (byteOrder === B.C_Endian) { t2 = A._arrayInstanceType(t1)._eval$1("ReversedListIterable<1>"); return A.List_List$of(new A.ReversedListIterable(t1, t2), true, t2._eval$1("ListIterable.E")); } @@ -24568,7 +26158,7 @@ B.JSArray_methods.$indexSet(byteList, $length - i - 1, val & 255); val = B.JSInt_methods._shrOtherPositive$1(val, 8); } - if (byteOrder === B.C_Endian0) { + if (byteOrder === B.C_Endian) { t1 = A._arrayInstanceType(byteList)._eval$1("ReversedListIterable<1>"); return A.List_List$of(new A.ReversedListIterable(byteList, t1), true, t1._eval$1("ListIterable.E")); } @@ -24576,14 +26166,14 @@ }, IntUtils_fromBytes(bytes, byteOrder, sign) { var t1, lowerPart, result, i, t2, signMask; - if (byteOrder === B.C_Endian0) { + if (byteOrder === B.C_Endian) { t1 = J.get$reversed$ax(bytes); bytes = A.List_List$from(A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")), true, type$.int); } t1 = J.getInterceptor$asx(bytes); if (t1.get$length(bytes) > 4) { - lowerPart = A.IntUtils_fromBytes(t1.sublist$2(bytes, t1.get$length(bytes) - 4, t1.get$length(bytes)), B.C_Endian, false); - result = (B.JSInt_methods._shlPositive$1(A.IntUtils_fromBytes(t1.sublist$2(bytes, 0, t1.get$length(bytes) - 4), B.C_Endian, false), 32) | lowerPart) >>> 0; + lowerPart = A.IntUtils_fromBytes(t1.sublist$2(bytes, t1.get$length(bytes) - 4, t1.get$length(bytes)), B.C_Endian0, false); + result = (B.JSInt_methods._shlPositive$1(A.IntUtils_fromBytes(t1.sublist$2(bytes, 0, t1.get$length(bytes) - 4), B.C_Endian0, false), 32) | lowerPart) >>> 0; } else for (result = 0, i = 0; i < t1.get$length(bytes); ++i) { t2 = t1.$index(bytes, t1.get$length(bytes) - i - 1); @@ -24614,7 +26204,7 @@ return t1; } if (type$.List_int._is(v)) { - t1 = A.IntUtils_fromBytes(v, B.C_Endian, true); + t1 = A.IntUtils_fromBytes(v, B.C_Endian0, true); return t1; } if (typeof v == "string") { @@ -25028,7 +26618,7 @@ t1 = serviceProvider.toProvider$1$0(type$.TonAPIProvider); t2 = network.toNetwork$1$0(type$.WalletTonNetwork); t3 = type$.void_Function; - client = new A.TonClient(new A.TonProvider(new A.TonHTTPService(t1, new A.APIServiceTracker(new A.Live(B.APIServiceStatus_0, A.LinkedHashSet_LinkedHashSet$_empty(t3), type$.Live_APIServiceStatus), A._setArrayType([], type$.JSArray_ApiRequest)), new A.SynchronizedLock())), t2, new A.Live(B.NodeClientStatus_1, A.LinkedHashSet_LinkedHashSet$_empty(t3), type$.Live_NodeClientStatus), new A.SynchronizedLock()); + client = new A.TonClient(new A.TonProvider(new A.TonHTTPService(t1, new A.APIServiceTracker(new A.Live(B.APIServiceStatus_0, A.LinkedHashSet_LinkedHashSet$_empty(t3), type$.Live_APIServiceStatus), A._setArrayType([], type$.JSArray_ApiRequest)), new A.SynchronizedLock())), t2, A.LinkedHashMap_LinkedHashMap$_empty(type$.TonAddress, type$.Cell), new A.Live(B.NodeClientStatus_1, A.LinkedHashSet_LinkedHashSet$_empty(t3), type$.Live_NodeClientStatus), new A.SynchronizedLock()); break; case B.NetworkType_GRA: case B.NetworkType_0: @@ -25066,13 +26656,16 @@ return new A.Web3RequestException(exception.message, exception.errorCode, "WALLET-001", t1); }, Web3RequestExceptionConst_invalidStringArgrument(parameterName) { - return new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0020", "Invalid string argument provided for " + parameterName + ". Please ensure the input is a valid string and try again."); + return new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0020", "Invalid string argument provided for " + parameterName + ". Please ensure the input is a valid string and try again."); }, - Web3RequestExceptionConst_invalidHexBytes(parameterName) { - return new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0040", "Invalid hex bytes for " + parameterName + ": Hex must be valid, start with '0x', and have an even length. Please check the input and try again."); + Web3RequestExceptionConst_invalidList(parameterName) { + return new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0050", "Invalid list argument provided" + (" for " + parameterName) + ". Please ensure the input is a valid list and try again."); + }, + Web3RequestExceptionConst_invalidMap(parameterName) { + return new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0060", "Invalid map argument provided" + (parameterName != null ? " for " + parameterName : "") + ". Please ensure the input is a valid map and try again."); }, Web3RequestExceptionConst_invalidMethodArgruments(methodName) { - return new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0080", "Invalid arguments provided for method '" + methodName + string$.x27__Ple + methodName + "' are correct and try again."); + return new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0080", "Invalid arguments provided for method '" + methodName + string$.x27__Ple + methodName + "' are correct and try again."); }, Web3RequestExceptionConst_disconnected(message) { return new A.Web3RequestException("The Provider is disconnected.", 4900, "WEB3-5090", message == null ? "The current blockchain network lacks an active provider. Please use 'wallet_addEthereumChain' to add a provider to the network." : message); @@ -25084,6 +26677,12 @@ var t1 = A.StringUtils_tryFromJson(null); return new A.Web3RequestException(message, -32602, "WEB3-5100", t1); }, + Web3SolanaExceptionConstant_invalidTransaction() { + return new A.Web3RequestException(string$.InvalitT, -32602, "WEB3-5100", "Transaction serialization failed"); + }, + Web3SolanaExceptionConstant_signleRequestInsteadBatchError() { + return new A.Web3RequestException("Invalid method parameters: For multiple requests, please use the signAllTransactions or sendAllTransactions method.", -32602, "WEB3-5100", "For multiple requests, please use the signAllTransactions or sendAllTransactions method."); + }, AdaAddressUtils_decodeAddres(address, addrType, network) { var t1 = type$.String, t2 = type$.dynamic, @@ -25445,26 +27044,26 @@ return index + 3; }, SubstrateMetadataLayouts_si1TypeParameter(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_optional(new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, null), "type")], type$.JSArray_Layout_dynamic), false, null); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_optional(new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, null), "type")], type$.JSArray_Layout_dynamic), false, null); }, SubstrateMetadataLayouts_si1Field(property) { var _null = null; - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_optional(A.LayoutConst_compactString(_null), "name"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "type"), A.LayoutConst_optional(A.LayoutConst_compactString(_null), "typeName"), A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, _null); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_optional(A.LayoutConst_compactString(_null), "name"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "type"), A.LayoutConst_optional(A.LayoutConst_compactString(_null), "typeName"), A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, _null); }, SubstrateMetadataLayouts_si1TypeDefComposite(property) { return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_si1Field(null), "fields", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_si1Variant(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_si1Field(null), "fields", type$.Map_String_dynamic), A.IntegerLayout$(1, B.C_Endian0, "index", false), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, null); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_si1Field(null), "fields", type$.Map_String_dynamic), A.IntegerLayout$(1, B.C_Endian, "index", false), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, null); }, SubstrateMetadataLayouts_si1TypeDefArray(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(4, B.C_Endian0, "len", false), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(4, B.C_Endian, "len", false), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_si0TypeDefPrimitive(property) { return A.LayoutConst_rustEnum(A._setArrayType([new A.NoneLayout(0, "Bool"), new A.NoneLayout(0, "Char"), new A.NoneLayout(0, "Str"), new A.NoneLayout(0, "U8"), new A.NoneLayout(0, "U16"), new A.NoneLayout(0, "U32"), new A.NoneLayout(0, "U64"), new A.NoneLayout(0, "U128"), new A.NoneLayout(0, "U256"), new A.NoneLayout(0, "I8"), new A.NoneLayout(0, "I16"), new A.NoneLayout(0, "I32"), new A.NoneLayout(0, "I64"), new A.NoneLayout(0, "I128"), new A.NoneLayout(0, "I256")], type$.JSArray_Layout_dynamic), property, false); }, SubstrateMetadataLayouts_si1TypeDefBitSequence(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "bitStoreType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "bitOrderType")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "bitStoreType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "bitOrderType")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_si1TypeDefVariant(property) { return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_si1Variant(null), "variants", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); @@ -25473,23 +27072,23 @@ var _null = null, t1 = type$.String, t2 = type$.JSArray_Layout_dynamic; - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "path", t1), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_si1TypeParameter(_null), "params", type$.Map_String_dynamic), A.LayoutConst_rustEnum(A._setArrayType([A.SubstrateMetadataLayouts_si1TypeDefComposite("Composite"), A.SubstrateMetadataLayouts_si1TypeDefVariant("Variant"), A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "type")], t2), false, "Sequence"), A.SubstrateMetadataLayouts_si1TypeDefArray("Array"), A.LayoutConst_compactVec(new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _null), "Tuple", type$.int), A.SubstrateMetadataLayouts_si0TypeDefPrimitive("Primitive"), A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "type")], t2), false, "Compact"), A.SubstrateMetadataLayouts_si1TypeDefBitSequence("BitSequence"), A.LayoutConst_compactString("HistoricMetaCompat")], t2), "def", false), A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "docs", t1)], t2), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "path", t1), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_si1TypeParameter(_null), "params", type$.Map_String_dynamic), A.LayoutConst_rustEnum(A._setArrayType([A.SubstrateMetadataLayouts_si1TypeDefComposite("Composite"), A.SubstrateMetadataLayouts_si1TypeDefVariant("Variant"), A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "type")], t2), false, "Sequence"), A.SubstrateMetadataLayouts_si1TypeDefArray("Array"), A.LayoutConst_compactVec(new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _null), "Tuple", type$.int), A.SubstrateMetadataLayouts_si0TypeDefPrimitive("Primitive"), A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "type")], t2), false, "Compact"), A.SubstrateMetadataLayouts_si1TypeDefBitSequence("BitSequence"), A.LayoutConst_compactString("HistoricMetaCompat")], t2), "def", false), A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "docs", t1)], t2), false, property); }, SubstrateMetadataLayouts_portableTypeV14(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "id"), A.SubstrateMetadataLayouts_si1Type("type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "id"), A.SubstrateMetadataLayouts_si1Type("type")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_portableRegistry(property) { return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_portableTypeV14(null), "types", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_signedExtensionMetadataV14(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("identifier"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "additionalSigned")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("identifier"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "additionalSigned")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_extrinsicMetadataV14(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type"), A.IntegerLayout$(1, B.C_Endian0, "version", false), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_signedExtensionMetadataV14(null), "signedExtensions", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type"), A.IntegerLayout$(1, B.C_Endian, "version", false), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_signedExtensionMetadataV14(null), "signedExtensions", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_extrinsicMetadataV15(property) { var _null = null; - return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(1, B.C_Endian0, "version", false), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "addressType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "callType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "signatureType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, "extraType"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_signedExtensionMetadataV14(_null), "signedExtensions", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(1, B.C_Endian, "version", false), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "addressType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "callType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "signatureType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, "extraType"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_signedExtensionMetadataV14(_null), "signedExtensions", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_storageEntryModifierV9(property) { return A.LayoutConst_rustEnum(A._setArrayType([new A.NoneLayout(0, "Optional"), new A.NoneLayout(0, "Default"), new A.NoneLayout(0, "Required")], type$.JSArray_Layout_dynamic), property, false); @@ -25498,39 +27097,39 @@ return A.LayoutConst_rustEnum(A._setArrayType([new A.NoneLayout(0, "Blake2128"), new A.NoneLayout(0, "Blake2256"), new A.NoneLayout(0, "Blake2128Concat"), new A.NoneLayout(0, "Twox128"), new A.NoneLayout(0, "Twox256"), new A.NoneLayout(0, "Twox64Concat"), new A.NoneLayout(0, "Identity")], type$.JSArray_Layout_dynamic), property, false); }, SubstrateMetadataLayouts_storageEnteryTypeMap(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_storageHasherV11(null), "hashers", type$.Map_String_dynamic), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "key"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "value")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_storageHasherV11(null), "hashers", type$.Map_String_dynamic), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "key"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "value")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_storageEntryMetadataV14(property) { var t1 = type$.JSArray_Layout_dynamic; - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.SubstrateMetadataLayouts_storageEntryModifierV9("modifier"), A.LayoutConst_rustEnum(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "Plain"), A.SubstrateMetadataLayouts_storageEnteryTypeMap("Map")], t1), "type", false), new A.CompactBytes(-1, "fallback"), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], t1), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.SubstrateMetadataLayouts_storageEntryModifierV9("modifier"), A.LayoutConst_rustEnum(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "Plain"), A.SubstrateMetadataLayouts_storageEnteryTypeMap("Map")], t1), "type", false), new A.CompactBytes(-1, "fallback"), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], t1), false, property); }, SubstrateMetadataLayouts_palletStorageMetadataV14(property) { return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("prefix"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_storageEntryMetadataV14(null), "items", type$.Map_String_dynamic)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_palletConstantMetadataV14(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type"), new A.CompactBytes(-1, "value"), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type"), new A.CompactBytes(-1, "value"), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_palletMetadataV14(property) { var _null = null, _s4_ = "type", t1 = type$.JSArray_Layout_dynamic; - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_optional(A.SubstrateMetadataLayouts_palletStorageMetadataV14(_null), "storage"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _s4_)], t1), false, _null), "calls"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _s4_)], t1), false, _null), "events"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletConstantMetadataV14(_null), "constants", type$.Map_String_dynamic), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _s4_)], t1), false, _null), "errors"), A.IntegerLayout$(1, B.C_Endian0, "index", false)], t1), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_optional(A.SubstrateMetadataLayouts_palletStorageMetadataV14(_null), "storage"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _s4_)], t1), false, _null), "calls"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _s4_)], t1), false, _null), "events"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletConstantMetadataV14(_null), "constants", type$.Map_String_dynamic), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _s4_)], t1), false, _null), "errors"), A.IntegerLayout$(1, B.C_Endian, "index", false)], t1), false, property); }, SubstrateMetadataLayouts_palletMetadataV15(property) { var _null = null, _s4_ = "type", t1 = type$.JSArray_Layout_dynamic; - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_optional(A.SubstrateMetadataLayouts_palletStorageMetadataV14(_null), "storage"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _s4_)], t1), false, _null), "calls"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _s4_)], t1), false, _null), "events"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletConstantMetadataV14(_null), "constants", type$.Map_String_dynamic), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, _null, false), -1, _s4_)], t1), false, _null), "errors"), A.IntegerLayout$(1, B.C_Endian0, "index", false), A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "docs", type$.String)], t1), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_optional(A.SubstrateMetadataLayouts_palletStorageMetadataV14(_null), "storage"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _s4_)], t1), false, _null), "calls"), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _s4_)], t1), false, _null), "events"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletConstantMetadataV14(_null), "constants", type$.Map_String_dynamic), A.LayoutConst_optional(A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, _null, false), -1, _s4_)], t1), false, _null), "errors"), A.IntegerLayout$(1, B.C_Endian, "index", false), A.LayoutConst_compactVec(A.LayoutConst_compactString(_null), "docs", type$.String)], t1), false, property); }, SubstrateMetadataLayouts_metadataV14(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.SubstrateMetadataLayouts_portableRegistry("lookup"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletMetadataV14(null), "pallets", type$.Map_String_dynamic), A.SubstrateMetadataLayouts_extrinsicMetadataV14("extrinsic"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.SubstrateMetadataLayouts_portableRegistry("lookup"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletMetadataV14(null), "pallets", type$.Map_String_dynamic), A.SubstrateMetadataLayouts_extrinsicMetadataV14("extrinsic"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_runtimeApiMethodParamMetadataV15(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_runtimeApiMethodMetadataV15(property) { - return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_runtimeApiMethodParamMetadataV15(null), "inputs", type$.Map_String_dynamic), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "output"), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_runtimeApiMethodParamMetadataV15(null), "inputs", type$.Map_String_dynamic), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "output"), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_outerEnums15(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "callType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "eventType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "errorType")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "callType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "eventType"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "errorType")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_runtimeApiMetadataV15(property) { return A.StructLayout_StructLayout(A._setArrayType([A.LayoutConst_compactString("name"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_runtimeApiMethodMetadataV15(null), "methods", type$.Map_String_dynamic), A.LayoutConst_compactVec(A.LayoutConst_compactString(null), "docs", type$.String)], type$.JSArray_Layout_dynamic), false, property); @@ -25540,10 +27139,10 @@ }, SubstrateMetadataLayouts_metadataV15(property) { var t1 = type$.Map_String_dynamic; - return A.StructLayout_StructLayout(A._setArrayType([A.SubstrateMetadataLayouts_portableRegistry("lookup"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletMetadataV15(null), "pallets", t1), A.SubstrateMetadataLayouts_extrinsicMetadataV15("extrinsic"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_runtimeApiMetadataV15(null), "apis", t1), A.SubstrateMetadataLayouts_outerEnums15("outerEnums"), A.SubstrateMetadataLayouts_customMetadata15("custom")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.SubstrateMetadataLayouts_portableRegistry("lookup"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_palletMetadataV15(null), "pallets", t1), A.SubstrateMetadataLayouts_extrinsicMetadataV15("extrinsic"), new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type"), A.LayoutConst_compactVec(A.SubstrateMetadataLayouts_runtimeApiMetadataV15(null), "apis", t1), A.SubstrateMetadataLayouts_outerEnums15("outerEnums"), A.SubstrateMetadataLayouts_customMetadata15("custom")], type$.JSArray_Layout_dynamic), false, property); }, SubstrateMetadataLayouts_customValueMetadata15(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type"), new A.CompactBytes(-1, "value")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type"), new A.CompactBytes(-1, "value")], type$.JSArray_Layout_dynamic), false, property); }, MetadataCastingUtils_mapOrNull(value, $K, $V) { var t1, exception; @@ -25659,6 +27258,109 @@ } return null; }, + BocUtils_bitsToPaddedBuffer(bits) { + var padding, i, + t1 = bits._bit_string$_length, + t2 = t1 / 8, + builder = A.BitBuilder$(B.JSNumber_methods.ceil$0(t2) * 8); + builder.writeBits$1(bits); + padding = B.JSNumber_methods.ceil$0(t2) * 8 - t1; + for (i = 0; i < padding; ++i) + builder.writeBit$1(i === 0); + return builder; + }, + BocUtils_paddedBufferToBits(buff) { + var bitLen, testByte, bitPos, + i = buff.length - 1; + while (true) { + if (!(i >= 0)) { + bitLen = 0; + break; + } + if (!(i < buff.length)) + return A.ioore(buff, i); + if (!J.$eq$(buff[i], 0)) { + if (!(i < buff.length)) + return A.ioore(buff, i); + testByte = buff[i]; + bitPos = (testByte & -testByte) >>> 0; + if ((bitPos & 1) === 0) + bitPos = B.JSNumber_methods.ceil$0(Math.log(bitPos) / Math.log(2)) + 1; + bitLen = i > 0 ? i << 3 >>> 0 : 0; + bitLen += 8 - bitPos; + break; + } + --i; + } + return A.BitString_BitString(buff, 0, bitLen); + }, + DictionaryUtils_findCommonPrefix(src, startPos) { + var r, i, s, + t1 = src.length; + if (t1 === 0) + return ""; + if (0 >= t1) + return A.ioore(src, 0); + r = J.substring$1$s(src[0], startPos); + for (t1 = src.length, i = 1; i < t1; ++i) { + s = src[i]; + for (; !B.JSString_methods.startsWith$2(s, r, startPos);) { + r = B.JSString_methods.substring$2(r, 0, r.length - 1); + if (r.length === 0) + return r; + } + } + return r; + }, + DictionaryUtils_serializeInternalKey(value) { + if (A._isInt(value)) { + if (!isFinite(value)) + throw A.wrapException(A.DictException$("Invalid key type. not a safe integer.", null)); + return "n:" + B.JSInt_methods.toString$0(value); + } else if (value instanceof A._BigIntImpl) + return "b:" + value.toString$0(0); + else if (value instanceof A.TonAddress) + return "a:" + value.toString$0(0); + else if (type$.List_int._is(value)) + return "f:" + A.BytesUtils_toHexString(value, true, null); + else if (value instanceof A.BitString) + return "B:" + value.toString$0(0); + else + throw A.wrapException(A.DictException$("Invalid key type.", A.LinkedHashMap_LinkedHashMap$_literal(["key", value, "type", J.get$runtimeType$(value).toString$0(0)], type$.String, type$.dynamic))); + }, + DictionaryUtils__deserializeInternalKey(value) { + var lastDash, t1, charLen, padded, + k = B.JSString_methods.substring$2(value, 0, 2), + v = B.JSString_methods.substring$1(value, 2); + switch (k) { + case "n:": + return A.int_parse(v, null); + case "b:": + return A._BigIntImpl_parse(v, null); + case "a:": + return A.TonAddress_TonAddress(v, null); + case "f:": + return A.BytesUtils_fromHexString(v); + case "B:": + lastDash = B.JSString_methods.endsWith$1(v, "_"); + t1 = !lastDash; + if (!t1 || B.JSInt_methods.$mod(v.length, 2) !== 0) { + charLen = v.length; + if (lastDash) + --charLen; + padded = B.JSString_methods.substring$2(v, 0, charLen) + "0"; + if (t1 && (charLen & 1) !== 0) + return A.BitString_BitString(A.BytesUtils_fromHexString(padded), 0, charLen << 2 >>> 0); + else { + t1 = padded.length; + return A.BocUtils_paddedBufferToBits(A.BytesUtils_fromHexString((t1 & 1) === 1 ? B.JSString_methods.substring$2(padded, 0, t1 - 1) : padded)); + } + } else + return A.BitString_BitString(A.BytesUtils_fromHexString(v), 0, v.length << 2 >>> 0); + default: + throw A.wrapException(A.DictException$("Invalid key type.", A.LinkedHashMap_LinkedHashMap$_literal(["key", k, "type", B.JSString_methods.get$runtimeType(k).toString$0(0)], type$.String, type$.dynamic))); + } + }, TonApiUtils_extractParams(url) { var t1, t2, match, t3, matches = $.$get$TonApiUtils__pathParamRegex().allMatches$1(0, url), @@ -25674,6 +27376,66 @@ } return A.List_List$unmodifiable(params, type$.String); }, + Base64Utils_encodeBase64(bytes, urlSafe) { + var encode = A.StringUtils_decode(bytes, false, B.StringEncoding_2); + return encode; + }, + Base64Utils_decodeBase64(base64) { + var b64, reminder, t1, t2, exception; + try { + b64 = base64; + reminder = B.JSInt_methods.$mod(J.get$length$asx(b64), 4); + if (!J.$eq$(reminder, 0) && !J.endsWith$1$s(b64, "=")) { + t1 = b64; + t2 = reminder; + if (typeof t2 !== "number") + return A.iae(t2); + b64 = J.$add$ansx(t1, B.JSString_methods.$mul("=", 4 - t2)); + } + t1 = A.StringUtils_encode(b64, B.StringEncoding_2); + return t1; + } catch (exception) { + t1 = A.TonDartPluginException$("Invalid base64 string.", A.LinkedHashMap_LinkedHashMap$_literal(["value", base64], type$.String, type$.dynamic)); + throw A.wrapException(t1); + } + }, + CryptoUtils_crc32c(source) { + var t1, crc, n, t2, i, crc0; + for (t1 = source.length, crc = 4294967295, n = 0; n < t1; ++n) { + t2 = source[n]; + if (typeof t2 !== "number") + return A.iae(t2); + crc ^= t2; + for (i = 0; i < 8; ++i) { + crc0 = crc >>> 1; + crc = (crc & 1) === 1 ? crc0 ^ 2197175160 : crc0; + } + } + return A.IntUtils_toBytes((crc ^ 4294967295) >>> 0, B.C_Endian, 4); + }, + MathUtils_clz32(x) { + var n; + if (x === 0) + return 32; + if (B.JSInt_methods._shrOtherPositive$1(x, 16) === 0) { + x = x << 16 >>> 0; + n = 17; + } else + n = 1; + if (B.JSInt_methods._shrOtherPositive$1(x, 24) === 0) { + n += 8; + x = x << 8 >>> 0; + } + if (B.JSInt_methods._shrOtherPositive$1(x, 28) === 0) { + n += 4; + x = x << 4 >>> 0; + } + if (B.JSInt_methods._shrOtherPositive$1(x, 30) === 0) { + n += 2; + x = x << 2 >>> 0; + } + return n - B.JSInt_methods._shrOtherPositive$1(x, 31); + }, MRTWallet_get_clientId(_this) { var t1 = type$.Object._as(_this.scriptId); if (t1 != null && A.JSAnyUtilityExtension_instanceOfString(t1, "Function")) @@ -25681,13 +27443,28 @@ else return A._asString(_this.scriptId); }, - JsUtils_toMap(object, error, $K, $V) { - var t1, exception; + JsUtils_compareAddress(a, b, defaultAddress) { + if (a === defaultAddress) + return -1; + else if (b === defaultAddress) + return 1; + return B.JSString_methods.compareTo$1(a, b); + }, + JsUtils_toMap(object, error) { + var exception, t1; object = object; try { - if (typeof object == "string") - object = A.StringUtils_toJson(object, type$.Map_dynamic_dynamic); - t1 = A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(object), $K, $V); + if (object != null) + try { + if (!(object != null && typeof object === "string")) + object = A._asString(type$.JSObject._as(self.JSON).stringify(object)); + } catch (exception) { + } + if (typeof object != "string") { + t1 = object; + object = B.C_JsonCodec.encode$2$toEncodable(t1 == null ? type$.Object._as(t1) : t1, null); + } + t1 = A.StringUtils_toJson(object, type$.Map_String_dynamic); return t1; } catch (exception) { if (error != null) @@ -25695,8 +27472,8 @@ throw exception; } }, - JsUtils_toList(object, $T) { - var t1, exception, error = null; + JsUtils_toList(object, error, $T) { + var t1, exception; object = object; try { if (typeof object == "string") @@ -25819,12 +27596,10 @@ return receiver.splice(index, 1)[0]; }, insert$2(receiver, index, value) { - var t1; A._arrayInstanceType(receiver)._precomputed1._as(value); if (!!receiver.fixed$length) A.throwExpression(A.UnsupportedError$("insert")); - t1 = receiver.length; - if (index > t1) + if (index < 0 || index > receiver.length) throw A.wrapException(A.RangeError$value(index, null)); receiver.splice(index, 0, value); }, @@ -26279,6 +28054,20 @@ return d; throw A.wrapException(A.UnsupportedError$("" + receiver + ".ceil()")); }, + floor$0(receiver) { + var truncated, d; + if (receiver >= 0) { + if (receiver <= 2147483647) + return receiver | 0; + } else if (receiver >= -2147483648) { + truncated = receiver | 0; + return receiver === truncated ? truncated : truncated - 1; + } + d = Math.floor(receiver); + if (isFinite(d)) + return d; + throw A.wrapException(A.UnsupportedError$("" + receiver + ".floor()")); + }, round$0(receiver) { if (receiver > 0) { if (receiver !== 1 / 0) @@ -26287,6 +28076,15 @@ return 0 - Math.round(0 - receiver); throw A.wrapException(A.UnsupportedError$("" + receiver + ".round()")); }, + clamp$2(receiver, lowerLimit, upperLimit) { + if (B.JSInt_methods.compareTo$1(lowerLimit, upperLimit) > 0) + throw A.wrapException(A.argumentErrorValue(lowerLimit)); + if (this.compareTo$1(receiver, lowerLimit) < 0) + return lowerLimit; + if (this.compareTo$1(receiver, upperLimit) > 0) + return upperLimit; + return receiver; + }, toRadixString$1(receiver, radix) { var result, t1, t2, match, exponent; if (radix < 2 || radix > 36) @@ -26371,6 +28169,18 @@ _shlPositive$1(receiver, other) { return other > 31 ? 0 : receiver << other >>> 0; }, + $shr(receiver, other) { + var t1; + if (other < 0) + throw A.wrapException(A.argumentErrorValue(other)); + if (receiver > 0) + t1 = this._shrBothPositive$1(receiver, other); + else { + t1 = other > 31 ? 31 : other; + t1 = receiver >> t1 >>> 0; + } + return t1; + }, _shrOtherPositive$1(receiver, other) { var t1; if (receiver > 0) @@ -26893,7 +28703,7 @@ call$0() { return A.Future_Future$value(null, type$.Null); }, - $signature: 16 + $signature: 14 }; A.SentinelValue.prototype = {}; A.EfficientLengthIterable.prototype = {}; @@ -27068,16 +28878,19 @@ end = endOrLength; $length = end - start; if ($length <= 0) { - t1 = J.JSArray_JSArray$fixed(0, _this.$ti._precomputed1); - return t1; + t1 = _this.$ti._precomputed1; + return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1); } - result = A.List_List$filled($length, t2.elementAt$1(t1, start), false, _this.$ti._precomputed1); + result = A.List_List$filled($length, t2.elementAt$1(t1, start), growable, _this.$ti._precomputed1); for (i = 1; i < $length; ++i) { B.JSArray_methods.$indexSet(result, i, t2.elementAt$1(t1, start + i)); if (t2.get$length(t1) < end) throw A.wrapException(A.ConcurrentModificationError$(_this)); } return result; + }, + toList$0(_) { + return this.toList$1$growable(0, true); } }; A.ListIterator.prototype = { @@ -27810,12 +29623,12 @@ containsKey$1(key) { var strings, nums; if (typeof key == "string") { - strings = this.__js_helper$_strings; + strings = this._strings; if (strings == null) return false; return strings[key] != null; } else if (typeof key == "number" && (key & 0x3fffffff) === key) { - nums = this.__js_helper$_nums; + nums = this._nums; if (nums == null) return false; return nums[key] != null; @@ -27834,14 +29647,14 @@ $index(_, key) { var strings, cell, t1, nums, _null = null; if (typeof key == "string") { - strings = this.__js_helper$_strings; + strings = this._strings; if (strings == null) return _null; cell = strings[key]; t1 = cell == null ? _null : cell.hashMapCellValue; return t1; } else if (typeof key == "number" && (key & 0x3fffffff) === key) { - nums = this.__js_helper$_nums; + nums = this._nums; if (nums == null) return _null; cell = nums[key]; @@ -27867,11 +29680,11 @@ t1._precomputed1._as(key); t1._rest[1]._as(value); if (typeof key == "string") { - strings = _this.__js_helper$_strings; - _this.__js_helper$_addHashTableEntry$3(strings == null ? _this.__js_helper$_strings = _this._newHashTable$0() : strings, key, value); + strings = _this._strings; + _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value); } else if (typeof key == "number" && (key & 0x3fffffff) === key) { - nums = _this.__js_helper$_nums; - _this.__js_helper$_addHashTableEntry$3(nums == null ? _this.__js_helper$_nums = _this._newHashTable$0() : nums, key, value); + nums = _this._nums; + _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value); } else _this.internalSet$2(key, value); }, @@ -27898,9 +29711,9 @@ remove$1(_, key) { var _this = this; if (typeof key == "string") - return _this.__js_helper$_removeHashTableEntry$2(_this.__js_helper$_strings, key); + return _this._removeHashTableEntry$2(_this._strings, key); else if (typeof key == "number" && (key & 0x3fffffff) === key) - return _this.__js_helper$_removeHashTableEntry$2(_this.__js_helper$_nums, key); + return _this._removeHashTableEntry$2(_this._nums, key); else return _this.internalRemove$1(key); }, @@ -27932,7 +29745,7 @@ cell = cell._next; } }, - __js_helper$_addHashTableEntry$3(table, key, value) { + _addHashTableEntry$3(table, key, value) { var cell, t1 = A._instanceType(this); t1._precomputed1._as(key); @@ -27943,7 +29756,7 @@ else cell.hashMapCellValue = value; }, - __js_helper$_removeHashTableEntry$2(table, key) { + _removeHashTableEntry$2(table, key) { var cell; if (table == null) return null; @@ -28036,19 +29849,19 @@ A.LinkedHashMapCell.prototype = {}; A.LinkedHashMapKeyIterable.prototype = { get$length(_) { - return this.__js_helper$_map.__js_helper$_length; + return this._map.__js_helper$_length; }, get$isEmpty(_) { - return this.__js_helper$_map.__js_helper$_length === 0; + return this._map.__js_helper$_length === 0; }, get$iterator(_) { - var t1 = this.__js_helper$_map, + var t1 = this._map, t2 = new A.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>")); t2._cell = t1._first; return t2; }, contains$1(_, element) { - return this.__js_helper$_map.containsKey$1(element); + return this._map.containsKey$1(element); } }; A.LinkedHashMapKeyIterator.prototype = { @@ -28057,7 +29870,7 @@ }, moveNext$0() { var cell, _this = this, - t1 = _this.__js_helper$_map; + t1 = _this._map; if (_this._modifications !== t1._modifications) throw A.wrapException(A.ConcurrentModificationError$(t1)); cell = _this._cell; @@ -28117,13 +29930,13 @@ call$2(o, tag) { return this.getUnknownTag(o, tag); }, - $signature: 400 + $signature: 419 }; A.initHooks_closure1.prototype = { call$1(tag) { return this.prototypeForTag(A._asString(tag)); }, - $signature: 115 + $signature: 88 }; A._Record.prototype = { get$runtimeType(_) { @@ -28412,7 +30225,7 @@ _readField$0() { var t1 = this._value; if (t1 === this) - throw A.wrapException(A.LateError$fieldNI(this.__late_helper$_name)); + throw A.wrapException(A.LateError$fieldNI(this._name)); return t1; } }; @@ -28709,7 +30522,7 @@ t1.storedCallback = null; f.call$0(); }, - $signature: 24 + $signature: 32 }; A._AsyncRun__initializeScheduleImmediate_closure.prototype = { call$1(callback) { @@ -28719,19 +30532,19 @@ t2 = this.span; t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2); }, - $signature: 399 + $signature: 397 }; A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = { call$0() { this.callback.call$0(); }, - $signature: 14 + $signature: 15 }; A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = { call$0() { this.callback.call$0(); }, - $signature: 14 + $signature: 15 }; A._TimerImpl.prototype = { _TimerImpl$2(milliseconds, callback) { @@ -28756,7 +30569,7 @@ this.$this._handle = null; this.callback.call$0(); }, - $signature: 1 + $signature: 0 }; A._AsyncAwaitCompleter.prototype = { complete$1(value) { @@ -28788,19 +30601,19 @@ call$1(result) { return this.bodyFunction.call$2(0, result); }, - $signature: 17 + $signature: 19 }; A._awaitOnObject_closure0.prototype = { call$2(error, stackTrace) { this.bodyFunction.call$2(1, new A.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace))); }, - $signature: 397 + $signature: 190 }; A._wrapJsFunctionForAsync_closure.prototype = { call$2(errorCode, result) { this.$protected(A._asInt(errorCode), result); }, - $signature: 396 + $signature: 209 }; A._SyncStarIterator.prototype = { get$current() { @@ -28921,7 +30734,7 @@ this.T._as(null); this.result._complete$1(null); }, - $signature: 1 + $signature: 0 }; A.TimeoutException.prototype = { toString$0(_) { @@ -29222,13 +31035,13 @@ call$0() { A._Future__propagateToListeners(this.$this, this.listener); }, - $signature: 1 + $signature: 0 }; A._Future__prependListeners_closure.prototype = { call$0() { A._Future__propagateToListeners(this.$this, this._box_0.listeners); }, - $signature: 1 + $signature: 0 }; A._Future__chainForeignFuture_closure.prototype = { call$1(value) { @@ -29243,37 +31056,37 @@ t1._completeError$2(error, stackTrace); } }, - $signature: 24 + $signature: 32 }; A._Future__chainForeignFuture_closure0.prototype = { call$2(error, stackTrace) { this.$this._completeError$2(type$.Object._as(error), type$.StackTrace._as(stackTrace)); }, - $signature: 134 + $signature: 109 }; A._Future__chainForeignFuture_closure1.prototype = { call$0() { this.$this._completeError$2(this.e, this.s); }, - $signature: 1 + $signature: 0 }; A._Future__chainCoreFutureAsync_closure.prototype = { call$0() { A._Future__chainCoreFutureSync(this._box_0.source, this.target); }, - $signature: 1 + $signature: 0 }; A._Future__asyncCompleteWithValue_closure.prototype = { call$0() { this.$this._completeWithValue$1(this.value); }, - $signature: 1 + $signature: 0 }; A._Future__asyncCompleteError_closure.prototype = { call$0() { this.$this._completeError$2(this.error, this.stackTrace); }, - $signature: 1 + $signature: 0 }; A._Future__propagateToListeners_handleWhenCompleteCallback.prototype = { call$0() { @@ -29308,13 +31121,13 @@ t1.listenerHasError = false; } }, - $signature: 1 + $signature: 0 }; A._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = { call$1(_) { return this.originalSource; }, - $signature: 394 + $signature: 310 }; A._Future__propagateToListeners_handleValueCallback.prototype = { call$0() { @@ -29334,7 +31147,7 @@ t1.listenerHasError = true; } }, - $signature: 1 + $signature: 0 }; A._Future__propagateToListeners_handleError.prototype = { call$0() { @@ -29358,13 +31171,13 @@ t2.listenerHasError = true; } }, - $signature: 1 + $signature: 0 }; A._Future_timeout_closure.prototype = { call$0() { this._future._completeError$2(new A.TimeoutException("Future not completed", this.timeLimit), B.C__StringStackTrace); }, - $signature: 1 + $signature: 0 }; A._Future_timeout_closure0.prototype = { call$1(v) { @@ -29391,7 +31204,7 @@ this._future._completeError$2(e, s); } }, - $signature: 134 + $signature: 109 }; A._AsyncCallbackEntry.prototype = {}; A.Stream.prototype = { @@ -29422,7 +31235,7 @@ call$0() { this.future._complete$1(this._box_0.count); }, - $signature: 1 + $signature: 0 }; A.Stream_first_closure.prototype = { call$0() { @@ -29436,7 +31249,7 @@ A._completeWithErrorCallback(this.future, e, s); } }, - $signature: 1 + $signature: 0 }; A.Stream_first_closure0.prototype = { call$1(value) { @@ -29600,7 +31413,7 @@ call$0() { A._runGuarded(this.$this.onListen); }, - $signature: 1 + $signature: 0 }; A._StreamController__recordCancel_complete.prototype = { call$0() { @@ -29608,7 +31421,7 @@ if (doneFuture != null && (doneFuture._state & 30) === 0) doneFuture._asyncComplete$1(null); }, - $signature: 1 + $signature: 0 }; A._SyncStreamControllerDispatch.prototype = { _sendData$1(data) { @@ -29882,7 +31695,7 @@ t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3); t1._state = (t1._state & 4294967231) >>> 0; }, - $signature: 1 + $signature: 0 }; A._BufferingStreamSubscription__sendDone_sendDone.prototype = { call$0() { @@ -29894,7 +31707,7 @@ t1._zone.runGuarded$1(t1._onDone); t1._state = (t1._state & 4294967231) >>> 0; }, - $signature: 1 + $signature: 0 }; A._StreamImpl.prototype = { listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) { @@ -29984,7 +31797,7 @@ t1.lastPendingEvent = null; $event.perform$1(t2); }, - $signature: 1 + $signature: 0 }; A._DoneStreamSubscription.prototype = { onData$1(handleData) { @@ -30034,14 +31847,14 @@ call$0() { return this.future._complete$1(this.value); }, - $signature: 1 + $signature: 0 }; A._Zone.prototype = {$isZone: 1}; A._rootHandleError_closure.prototype = { call$0() { A.Error_throwWithStackTrace(this.error, this.stackTrace); }, - $signature: 1 + $signature: 0 }; A._RootZone.prototype = { runGuarded$1(f) { @@ -30130,7 +31943,7 @@ call$0() { return this.$this.runGuarded$1(this.f); }, - $signature: 1 + $signature: 0 }; A._RootZone_bindUnaryCallbackGuarded_closure.prototype = { call$1(arg) { @@ -30161,10 +31974,10 @@ containsKey$1(key) { var strings, nums; if (typeof key == "string" && key !== "__proto__") { - strings = this._strings; + strings = this._collection$_strings; return strings == null ? false : strings[key] != null; } else if (typeof key == "number" && (key & 1073741823) === key) { - nums = this._nums; + nums = this._collection$_nums; return nums == null ? false : nums[key] != null; } else return this._containsKey$1(key); @@ -30178,11 +31991,11 @@ $index(_, key) { var strings, t1, nums; if (typeof key == "string" && key !== "__proto__") { - strings = this._strings; + strings = this._collection$_strings; t1 = strings == null ? null : A._HashMap__getTableEntry(strings, key); return t1; } else if (typeof key == "number" && (key & 1073741823) === key) { - nums = this._nums; + nums = this._collection$_nums; t1 = nums == null ? null : A._HashMap__getTableEntry(nums, key); return t1; } else @@ -30203,11 +32016,11 @@ t1._precomputed1._as(key); t1._rest[1]._as(value); if (typeof key == "string" && key !== "__proto__") { - strings = _this._strings; - _this._addHashTableEntry$3(strings == null ? _this._strings = A._HashMap__newHashTable() : strings, key, value); + strings = _this._collection$_strings; + _this._collection$_addHashTableEntry$3(strings == null ? _this._collection$_strings = A._HashMap__newHashTable() : strings, key, value); } else if (typeof key == "number" && (key & 1073741823) === key) { - nums = _this._nums; - _this._addHashTableEntry$3(nums == null ? _this._nums = A._HashMap__newHashTable() : nums, key, value); + nums = _this._collection$_nums; + _this._collection$_addHashTableEntry$3(nums == null ? _this._collection$_nums = A._HashMap__newHashTable() : nums, key, value); } else { rest = _this._collection$_rest; if (rest == null) @@ -30233,9 +32046,9 @@ remove$1(_, key) { var _this = this; if (typeof key == "string" && key !== "__proto__") - return _this._removeHashTableEntry$2(_this._strings, key); + return _this._collection$_removeHashTableEntry$2(_this._collection$_strings, key); else if (typeof key == "number" && (key & 1073741823) === key) - return _this._removeHashTableEntry$2(_this._nums, key); + return _this._collection$_removeHashTableEntry$2(_this._collection$_nums, key); else return _this._remove$1(key); }, @@ -30276,7 +32089,7 @@ if (result != null) return result; result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic); - strings = _this._strings; + strings = _this._collection$_strings; index = 0; if (strings != null) { names = Object.getOwnPropertyNames(strings); @@ -30286,7 +32099,7 @@ ++index; } } - nums = _this._nums; + nums = _this._collection$_nums; if (nums != null) { names = Object.getOwnPropertyNames(nums); entries = names.length; @@ -30310,7 +32123,7 @@ } return _this._keys = result; }, - _addHashTableEntry$3(table, key, value) { + _collection$_addHashTableEntry$3(table, key, value) { var t1 = this.$ti; t1._precomputed1._as(key); t1._rest[1]._as(value); @@ -30320,7 +32133,7 @@ } A._HashMap__setTableEntry(table, key, value); }, - _removeHashTableEntry$2(table, key) { + _collection$_removeHashTableEntry$2(table, key) { var value; if (table != null && table[key] != null) { value = this.$ti._rest[1]._as(A._HashMap__getTableEntry(table, key)); @@ -30362,20 +32175,20 @@ }; A._HashMapKeyIterable.prototype = { get$length(_) { - return this._map._collection$_length; + return this._collection$_map._collection$_length; }, get$isEmpty(_) { - return this._map._collection$_length === 0; + return this._collection$_map._collection$_length === 0; }, get$isNotEmpty(_) { - return this._map._collection$_length !== 0; + return this._collection$_map._collection$_length !== 0; }, get$iterator(_) { - var t1 = this._map; + var t1 = this._collection$_map; return new A._HashMapKeyIterator(t1, t1._computeKeys$0(), this.$ti._eval$1("_HashMapKeyIterator<1>")); }, contains$1(_, element) { - return this._map.containsKey$1(element); + return this._collection$_map.containsKey$1(element); } }; A._HashMapKeyIterator.prototype = { @@ -30387,7 +32200,7 @@ var _this = this, keys = _this._keys, offset = _this._offset, - t1 = _this._map; + t1 = _this._collection$_map; if (keys !== t1._keys) throw A.wrapException(A.ConcurrentModificationError$(t1)); else if (offset >= keys.length) { @@ -30442,7 +32255,7 @@ call$1(v) { return this.K._is(v); }, - $signature: 27 + $signature: 28 }; A._LinkedHashSet.prototype = { get$iterator(_) { @@ -30463,12 +32276,12 @@ contains$1(_, object) { var strings, nums; if (typeof object == "string" && object !== "__proto__") { - strings = this._strings; + strings = this._collection$_strings; if (strings == null) return false; return type$.nullable__LinkedHashSetCell._as(strings[object]) != null; } else if (typeof object == "number" && (object & 1073741823) === object) { - nums = this._nums; + nums = this._collection$_nums; if (nums == null) return false; return type$.nullable__LinkedHashSetCell._as(nums[object]) != null; @@ -30497,11 +32310,11 @@ var strings, nums, _this = this; A._instanceType(_this)._precomputed1._as(element); if (typeof element == "string" && element !== "__proto__") { - strings = _this._strings; - return _this._addHashTableEntry$2(strings == null ? _this._strings = A._LinkedHashSet__newHashTable() : strings, element); + strings = _this._collection$_strings; + return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._LinkedHashSet__newHashTable() : strings, element); } else if (typeof element == "number" && (element & 1073741823) === element) { - nums = _this._nums; - return _this._addHashTableEntry$2(nums == null ? _this._nums = A._LinkedHashSet__newHashTable() : nums, element); + nums = _this._collection$_nums; + return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._LinkedHashSet__newHashTable() : nums, element); } else return _this._add$1(element); }, @@ -30523,8 +32336,13 @@ return true; }, remove$1(_, object) { - var t1 = this._remove$1(object); - return t1; + var t1; + if (typeof object == "string" && object !== "__proto__") + return this._collection$_removeHashTableEntry$2(this._collection$_strings, object); + else { + t1 = this._remove$1(object); + return t1; + } }, _remove$1(object) { var hash, bucket, index, cell, _this = this, @@ -30542,13 +32360,24 @@ _this._collection$_unlinkCell$1(cell); return true; }, - _addHashTableEntry$2(table, element) { + _collection$_addHashTableEntry$2(table, element) { A._instanceType(this)._precomputed1._as(element); if (type$.nullable__LinkedHashSetCell._as(table[element]) != null) return false; table[element] = this._collection$_newLinkedCell$1(element); return true; }, + _collection$_removeHashTableEntry$2(table, element) { + var cell; + if (table == null) + return false; + cell = type$.nullable__LinkedHashSetCell._as(table[element]); + if (cell == null) + return false; + this._collection$_unlinkCell$1(cell); + delete table[element]; + return true; + }, _collection$_modified$0() { this._collection$_modifications = this._collection$_modifications + 1 & 1073741823; }, @@ -30626,7 +32455,7 @@ call$2(k, v) { this.result.$indexSet(0, this.K._as(k), this.V._as(v)); }, - $signature: 392 + $signature: 139 }; A.ListBase.prototype = { get$iterator(receiver) { @@ -30925,36 +32754,36 @@ t2 = A.S(v); t1._contents += t2; }, - $signature: 80 + $signature: 134 }; A.UnmodifiableMapBase.prototype = {}; A._MapBaseValueIterable.prototype = { get$length(_) { - var t1 = this._map; + var t1 = this._collection$_map; return t1.get$length(t1); }, get$isEmpty(_) { - var t1 = this._map; + var t1 = this._collection$_map; return t1.get$isEmpty(t1); }, get$isNotEmpty(_) { - var t1 = this._map; + var t1 = this._collection$_map; return t1.get$isNotEmpty(t1); }, get$first(_) { - var t1 = this._map, + var t1 = this._collection$_map, t2 = t1.get$keys(); t2 = t1.$index(0, t2.get$first(t2)); return t2 == null ? this.$ti._rest[1]._as(t2) : t2; }, get$last(_) { - var t1 = this._map, + var t1 = this._collection$_map, t2 = t1.get$keys(); t2 = t1.$index(0, t2.get$last(t2)); return t2 == null ? this.$ti._rest[1]._as(t2) : t2; }, get$iterator(_) { - var t1 = this._map, + var t1 = this._collection$_map, t2 = t1.get$keys(); return new A._MapBaseValueIterator(t2.get$iterator(t2), t1, this.$ti._eval$1("_MapBaseValueIterator<1,2>")); } @@ -30964,7 +32793,7 @@ var _this = this, t1 = _this._keys; if (t1.moveNext$0()) { - _this.set$_collection$_current(_this._map.$index(0, t1.get$current())); + _this.set$_collection$_current(_this._collection$_map.$index(0, t1.get$current())); return true; } _this.set$_collection$_current(null); @@ -30992,49 +32821,53 @@ }; A.MapView.prototype = { cast$2$0(_, RK, RV) { - return this._map.cast$2$0(0, RK, RV); + return this._collection$_map.cast$2$0(0, RK, RV); }, $index(_, key) { - return this._map.$index(0, key); + return this._collection$_map.$index(0, key); + }, + $indexSet(_, key, value) { + var t1 = A._instanceType(this); + this._collection$_map.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value)); }, containsKey$1(key) { - return this._map.containsKey$1(key); + return this._collection$_map.containsKey$1(key); }, forEach$1(_, action) { - this._map.forEach$1(0, A._instanceType(this)._eval$1("~(1,2)")._as(action)); + this._collection$_map.forEach$1(0, A._instanceType(this)._eval$1("~(1,2)")._as(action)); }, get$isEmpty(_) { - var t1 = this._map; + var t1 = this._collection$_map; return t1.get$isEmpty(t1); }, get$isNotEmpty(_) { - var t1 = this._map; + var t1 = this._collection$_map; return t1.get$isNotEmpty(t1); }, get$length(_) { - var t1 = this._map; + var t1 = this._collection$_map; return t1.get$length(t1); }, get$keys() { - return this._map.get$keys(); + return this._collection$_map.get$keys(); }, toString$0(_) { - return this._map.toString$0(0); + return this._collection$_map.toString$0(0); }, get$values() { - return this._map.get$values(); + return this._collection$_map.get$values(); }, get$entries() { - return this._map.get$entries(); + return this._collection$_map.get$entries(); }, map$2$1(_, transform, K2, V2) { - return this._map.map$2$1(0, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2); + return this._collection$_map.map$2$1(0, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2); }, $isMap: 1 }; A.UnmodifiableMapView.prototype = { cast$2$0(_, RK, RV) { - return new A.UnmodifiableMapView(this._map.cast$2$0(0, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>")); + return new A.UnmodifiableMapView(this._collection$_map.cast$2$0(0, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>")); } }; A.SetBase.prototype = { @@ -31129,7 +32962,7 @@ var result, t1 = this._processed; if (t1 == null) - return this._data.$index(0, key); + return this._convert$_data.$index(0, key); else if (typeof key != "string") return null; else { @@ -31138,7 +32971,7 @@ } }, get$length(_) { - return this._processed == null ? this._data.__js_helper$_length : this._convert$_computeKeys$0().length; + return this._processed == null ? this._convert$_data.__js_helper$_length : this._convert$_computeKeys$0().length; }, get$isEmpty(_) { return this.get$length(0) === 0; @@ -31148,7 +32981,7 @@ }, get$keys() { if (this._processed == null) { - var t1 = this._data; + var t1 = this._convert$_data; return new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")); } return new A._JsonMapKeyIterable(this); @@ -31156,14 +32989,14 @@ get$values() { var _this = this; if (_this._processed == null) - return _this._data.get$values(); + return _this._convert$_data.get$values(); return A.MappedIterable_MappedIterable(_this._convert$_computeKeys$0(), new A._JsonMap_values_closure(_this), type$.String, type$.dynamic); }, $indexSet(_, key, value) { var processed, original, _this = this; A._asString(key); if (_this._processed == null) - _this._data.$indexSet(0, key, value); + _this._convert$_data.$indexSet(0, key, value); else if (_this.containsKey$1(key)) { processed = _this._processed; processed[key] = value; @@ -31175,7 +33008,7 @@ }, containsKey$1(key) { if (this._processed == null) - return this._data.containsKey$1(key); + return this._convert$_data.containsKey$1(key); if (typeof key != "string") return false; return Object.prototype.hasOwnProperty.call(this._original, key); @@ -31189,7 +33022,7 @@ var keys, i, key, value, _this = this; type$.void_Function_String_dynamic._as(f); if (_this._processed == null) - return _this._data.forEach$1(0, f); + return _this._convert$_data.forEach$1(0, f); keys = _this._convert$_computeKeys$0(); for (i = 0; i < keys.length; ++i) { key = keys[i]; @@ -31199,20 +33032,20 @@ _this._processed[key] = value; } f.call$2(key, value); - if (keys !== _this._data) + if (keys !== _this._convert$_data) throw A.wrapException(A.ConcurrentModificationError$(_this)); } }, _convert$_computeKeys$0() { - var keys = type$.nullable_List_dynamic._as(this._data); + var keys = type$.nullable_List_dynamic._as(this._convert$_data); if (keys == null) - keys = this._data = A._setArrayType(Object.keys(this._original), type$.JSArray_String); + keys = this._convert$_data = A._setArrayType(Object.keys(this._original), type$.JSArray_String); return keys; }, _upgrade$0() { var result, keys, i, t1, key, _this = this; if (_this._processed == null) - return _this._data; + return _this._convert$_data; result = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic); keys = _this._convert$_computeKeys$0(); for (i = 0; t1 = keys.length, i < t1; ++i) { @@ -31224,7 +33057,7 @@ else B.JSArray_methods.clear$0(keys); _this._original = _this._processed = null; - return _this._data = result; + return _this._convert$_data = result; }, _process$1(key) { var result; @@ -31238,7 +33071,7 @@ call$1(each) { return this.$this.$index(0, A._asString(each)); }, - $signature: 115 + $signature: 88 }; A._JsonMapKeyIterable.prototype = { get$length(_) { @@ -31281,7 +33114,7 @@ } return null; }, - $signature: 82 + $signature: 129 }; A._Utf8Decoder__decoderNonfatal_closure.prototype = { call$0() { @@ -31293,7 +33126,7 @@ } return null; }, - $signature: 82 + $signature: 129 }; A.AsciiCodec.prototype = { get$name() { @@ -31823,7 +33656,7 @@ B.JSArray_methods.$indexSet(t1, t2.i++, key); B.JSArray_methods.$indexSet(t1, t2.i++, value); }, - $signature: 80 + $signature: 134 }; A._JsonStringStringifier.prototype = { get$_partialResult() { @@ -32950,7 +34783,7 @@ hash = hash + ((hash & 524287) << 10) & 536870911; return hash ^ hash >>> 6; }, - $signature: 26 + $signature: 25 }; A._BigIntImpl_hashCode_finish.prototype = { call$1(hash) { @@ -32958,7 +34791,7 @@ hash ^= hash >>> 11; return hash + ((hash & 16383) << 15) & 536870911; }, - $signature: 21 + $signature: 23 }; A._BigIntClassic.prototype = { convert$2(x, resultDigits) { @@ -33037,7 +34870,7 @@ A._asStringQ(value); } }, - $signature: 92 + $signature: 69 }; A.DateTime.prototype = { get$timeZoneOffset() { @@ -33115,7 +34948,7 @@ return 0; return A.int_parse(matched, null); }, - $signature: 104 + $signature: 70 }; A.DateTime_parse_parseMilliAndMicroseconds.prototype = { call$1(matched) { @@ -33132,7 +34965,7 @@ } return result; }, - $signature: 104 + $signature: 70 }; A.Duration.prototype = { $eq(_, other) { @@ -33621,13 +35454,13 @@ call$2(msg, position) { throw A.wrapException(A.FormatException$("Illegal IPv4 address, " + msg, this.host, position)); }, - $signature: 386 + $signature: 377 }; A.Uri_parseIPv6Address_error.prototype = { call$2(msg, position) { throw A.wrapException(A.FormatException$("Illegal IPv6 address, " + msg, this.host, position)); }, - $signature: 380 + $signature: 325 }; A.Uri_parseIPv6Address_parseHex.prototype = { call$2(start, end) { @@ -33639,7 +35472,7 @@ this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start); return value; }, - $signature: 26 + $signature: 25 }; A._Uri.prototype = { get$_text() { @@ -33970,7 +35803,7 @@ t1._contents += t2; } }, - $signature: 371 + $signature: 321 }; A._Uri__makeQueryFromParametersDefault_closure.prototype = { call$2(key, value) { @@ -33982,7 +35815,7 @@ for (t1 = J.get$iterator$ax(type$.Iterable_dynamic._as(value)), t2 = this.writeParameter; t1.moveNext$0();) t2.call$2(key, A._asString(t1.get$current())); }, - $signature: 92 + $signature: 69 }; A.UriData.prototype = { get$uri() { @@ -34023,7 +35856,7 @@ B.NativeUint8List_methods.fillRange$3(t1, 0, 96, defaultTransition); return t1; }, - $signature: 370 + $signature: 281 }; A._createTables_setChars.prototype = { call$3(target, chars, transition) { @@ -34035,7 +35868,7 @@ target[t2] = transition; } }, - $signature: 127 + $signature: 76 }; A._createTables_setRange.prototype = { call$3(target, range, transition) { @@ -34054,7 +35887,7 @@ target[t1] = transition; } }, - $signature: 127 + $signature: 76 }; A._SimpleUri.prototype = { get$hasAuthority() { @@ -34352,7 +36185,7 @@ call$1(rawSocket) { return A.SecureSocket_SecureSocket$_(rawSocket); }, - $signature: 369 + $signature: 279 }; A.RawSecureSocket_connect_closure.prototype = { call$1(socket) { @@ -34365,7 +36198,7 @@ address = socket.get$address(); return A._RawSecureSocket$(address, t2, false, _this.context, socket, null, null, false, false, _this.onBadCertificate, _this.keyLog, _this.supportedProtocols)._handshakeComplete.future; }, - $signature: 368 + $signature: 272 }; A._FilterStatus.prototype = {}; A._RawSecureSocket.prototype = { @@ -34883,7 +36716,7 @@ var t1 = this.$this; return t1._handshakeComplete.complete$1(t1); }, - $signature: 1 + $signature: 0 }; A.TlsException.prototype = { toString$0(_) { @@ -34929,13 +36762,13 @@ } else return o; }, - $signature: 46 + $signature: 24 }; A.promiseToFuture_closure.prototype = { call$1(r) { return this.completer.complete$1(this.T._eval$1("0/?")._as(r)); }, - $signature: 17 + $signature: 19 }; A.promiseToFuture_closure0.prototype = { call$1(e) { @@ -34943,7 +36776,7 @@ return this.completer.completeError$1(new A.NullRejectionException(e === undefined)); return this.completer.completeError$1(e); }, - $signature: 17 + $signature: 19 }; A.dartify_convert.prototype = { call$1(o) { @@ -34990,7 +36823,7 @@ } return o; }, - $signature: 46 + $signature: 24 }; A.NullRejectionException.prototype = { toString$0(_) { @@ -35024,7 +36857,7 @@ byteCount = 2; else byteCount = 1; - t1 = this._math$_buffer; + t1 = this._buffer; B.NativeByteData_methods._setUint32$3(t1, 0, 0, false); start = 4 - byteCount; randomLimit = A._asInt(Math.pow(256, byteCount)); @@ -35046,7 +36879,7 @@ call$1(element) { return type$.BitcoinAddressType._as(element).get$value() === this.value; }, - $signature: 353 + $signature: 206 }; A.BitcoinAddressType_fromValue_closure0.prototype = { call$0() { @@ -35300,7 +37133,7 @@ t1 = this.publicKey.pubKey, t2 = type$.ProjectiveECCPoint._as(t1.get$point()), h = A.P2TRUtils_calculateTweek(t2, null), - n = $.$get$Curves_generatorSecp256k1().$mul(0, A.BigintUtils_fromBytes(h, B.C_Endian, false)), + n = $.$get$Curves_generatorSecp256k1().$mul(0, A.BigintUtils_fromBytes(h, B.C_Endian0, false)), t3 = $.$get$Curves_curveSecp256k1(), p = t3.p, x = t2.get$x(); @@ -35313,7 +37146,7 @@ if (t4 !== 0) A.throwExpression(B.AddressConverterException_GJk); t4 = y.$and(0, t2).compareTo$1(0, $.$get$_BigIntImpl_zero()); - return A.BytesUtils_toHexString(A.BigintUtils_toBytes(new A.ProjectiveECCPoint(t3, null, false, B.List_empty13, A._setArrayType([x, t4 === 0 ? y : p.$sub(0, y), t2], type$.JSArray_BigInt)).$add(0, n).get$x(), t1.get$point().get$curve().get$baselen(), B.C_Endian), true, null); + return A.BytesUtils_toHexString(A.BigintUtils_toBytes(new A.ProjectiveECCPoint(t3, null, false, B.List_empty14, A._setArrayType([x, t4 === 0 ? y : p.$sub(0, y), t2], type$.JSArray_BigInt)).$add(0, n).get$x(), t1.get$point().get$curve().get$baselen(), B.C_Endian0), true, null); } }; A.BitcoinBasePluginException.prototype = { @@ -35325,7 +37158,7 @@ call$1(element) { return type$.BasedUtxoNetwork._as(element).get$value() === this.name; }, - $signature: 352 + $signature: 211 }; A.BitcoinSVNetwork.prototype = { get$p2pkhNetVer() { @@ -35693,7 +37526,7 @@ }; A.APIType.prototype = { _enumToString$0() { - return "APIType." + this._name; + return "APIType." + this._core$_name; } }; A.APIConfig.prototype = {}; @@ -35715,11 +37548,11 @@ call$1(v) { return v == null; }, - $signature: 27 + $signature: 28 }; A.Base58Alphabets.prototype = { _enumToString$0() { - return "Base58Alphabets." + this._name; + return "Base58Alphabets." + this._core$_name; } }; A.Base58ChecksumError.prototype = { @@ -35733,11 +37566,11 @@ call$1(rune) { return A._asInt(rune) & 31; }, - $signature: 21 + $signature: 23 }; A.Bech32Encodings.prototype = { _enumToString$0() { - return "Bech32Encodings." + this._name; + return "Bech32Encodings." + this._core$_name; } }; A.Bech32ChecksumError.prototype = { @@ -35755,26 +37588,26 @@ return A.ioore(_s32_, e); return _s32_[e]; }, - $signature: 89 + $signature: 127 }; A.Bech32DecoderBase_decodeBech32_closure.prototype = { call$1(x) { A._asInt(x); return x < 33 || x > 126; }, - $signature: 44 + $signature: 58 }; A.Bech32DecoderBase_decodeBech32_closure0.prototype = { call$1(x) { return !B.JSString_methods.contains$1("qpzry9x8gf2tvdw0s3jn54khce6mua7l", A.Primitives_stringFromCharCode(A._asInt(x))); }, - $signature: 44 + $signature: 58 }; A.Bech32DecoderBase_decodeBech32_closure1.prototype = { call$1(x) { return B.JSString_methods.indexOf$1("qpzry9x8gf2tvdw0s3jn54khce6mua7l", A.Primitives_stringFromCharCode(A._asInt(x))); }, - $signature: 21 + $signature: 23 }; A.ADAAddressType.prototype = { toString$0(_) { @@ -35785,7 +37618,7 @@ call$1(element) { return type$.ADAAddressType._as(element).header === this.header; }, - $signature: 349 + $signature: 231 }; A.ADAAddressType_fromHeader_closure0.prototype = { call$0() { @@ -35805,7 +37638,7 @@ call$1(element) { return type$.ADAByronAddrTypes._as(element).value === this.value.value; }, - $signature: 316 + $signature: 235 }; A.ADAByronAddrAttrs.prototype = { toJson$0() { @@ -35964,7 +37797,7 @@ call$1(element) { return type$.ADANetwork._as(element).value === this.tag; }, - $signature: 101 + $signature: 120 }; A.ADANetwork_fromTag_closure0.prototype = { call$0() { @@ -35976,7 +37809,7 @@ call$1(element) { return type$.ADANetwork._as(element).protocolMagic === this.protocolMagic; }, - $signature: 101 + $signature: 120 }; A.ADANetwork_fromProtocolMagic_closure0.prototype = { call$0() { @@ -36010,7 +37843,7 @@ return A.ioore(t1, i); return A.int_parse(t1[i], 16) >= 8 ? c.toUpperCase() : c.toLowerCase(); }, - $signature: 403 + $signature: 261 }; A.EthAddrDecoder.prototype = { decodeAddr$2(addr, kwargs) { @@ -36135,14 +37968,14 @@ call$1(elem) { return A._asString(elem).length !== 0; }, - $signature: 25 + $signature: 27 }; A.Bip32PathParser__parseElem_closure.prototype = { call$1(element) { A._asString(element); return B.JSString_methods.endsWith$1(this._box_0.pathElem, element); }, - $signature: 25 + $signature: 27 }; A.BipCoins.prototype = { toString$0(_) { @@ -36184,7 +38017,7 @@ call$1(element) { return type$.Bip44Coins._as(element).name === this.name; }, - $signature: 314 + $signature: 296 }; A.Bip44Conf_akashNetwork_closure.prototype = { call$1(kwargs) { @@ -36202,7 +38035,7 @@ call$0() { return this.call$1(null); }, - $signature: 310 + $signature: 347 }; A.Bip44Conf_aptos_closure.prototype = { call$1(kwargs) { @@ -36211,7 +38044,7 @@ call$0() { return this.call$1(null); }, - $signature: 309 + $signature: 372 }; A.Bip44Conf_avaxCChain_closure.prototype = { call$1(kwargs) { @@ -36220,7 +38053,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_avaxPChain_closure.prototype = { call$1(kwargs) { @@ -36229,7 +38062,7 @@ call$0() { return this.call$1(null); }, - $signature: 300 + $signature: 376 }; A.Bip44Conf_avaxXChain_closure.prototype = { call$1(kwargs) { @@ -36238,7 +38071,7 @@ call$0() { return this.call$1(null); }, - $signature: 299 + $signature: 380 }; A.Bip44Conf_axelar_closure.prototype = { call$1(kwargs) { @@ -36274,7 +38107,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_bitcoinMainNet_closure.prototype = { call$1(kwargs) { @@ -36283,7 +38116,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_bitcoinTestNet_closure.prototype = { call$1(kwargs) { @@ -36292,7 +38125,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_bitcoinCashMainNet_closure.prototype = { call$1(legacy) { @@ -36301,7 +38134,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip44Conf_bitcoinCashTestNet_closure.prototype = { call$1(legacy) { @@ -36310,7 +38143,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip44Conf_bitcoinCashSlpMainNet_closure.prototype = { call$1(legacy) { @@ -36319,7 +38152,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip44Conf_bitcoinCashSlpTestNet_closure.prototype = { call$1(legacy) { @@ -36328,7 +38161,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip44Conf_bitcoinSvMainNet_closure.prototype = { call$1(legacy) { @@ -36337,7 +38170,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_bitcoinSvTestNet_closure.prototype = { call$1(kwargs) { @@ -36346,7 +38179,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_cardanoByronIcarus_closure.prototype = { call$1(kwargs) { @@ -36355,7 +38188,7 @@ call$0() { return this.call$1(null); }, - $signature: 36 + $signature: 34 }; A.Bip44Conf_cardanoByronLedger_closure.prototype = { call$1(kwargs) { @@ -36364,7 +38197,7 @@ call$0() { return this.call$1(null); }, - $signature: 36 + $signature: 34 }; A.Bip44Conf_cardanoByronIcarusTestnet_closure.prototype = { call$1(kwargs) { @@ -36373,7 +38206,7 @@ call$0() { return this.call$1(null); }, - $signature: 36 + $signature: 34 }; A.Bip44Conf_cardanoByronLedgerTestnet_closure.prototype = { call$1(kwargs) { @@ -36382,7 +38215,7 @@ call$0() { return this.call$1(null); }, - $signature: 36 + $signature: 34 }; A.Bip44Conf_celo_closure.prototype = { call$1(kwargs) { @@ -36391,7 +38224,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_certik_closure.prototype = { call$1(kwargs) { @@ -36436,7 +38269,7 @@ call$0() { return this.call$1(null); }, - $signature: 137 + $signature: 121 }; A.Bip44Conf_cosmosTestnetNist256p1_closure.prototype = { call$1(kwargs) { @@ -36445,7 +38278,7 @@ call$0() { return this.call$1(null); }, - $signature: 137 + $signature: 121 }; A.Bip44Conf_dashMainNet_closure.prototype = { call$1(kwargs) { @@ -36454,7 +38287,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_dashTestNet_closure.prototype = { call$1(kwargs) { @@ -36463,7 +38296,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_dogecoinMainNet_closure.prototype = { call$1(kwargs) { @@ -36472,7 +38305,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_dogecoinTestNet_closure.prototype = { call$1(kwargs) { @@ -36481,7 +38314,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_pepeMainnet_closure.prototype = { call$1(kwargs) { @@ -36490,7 +38323,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_pepeTestnet_closure.prototype = { call$1(kwargs) { @@ -36499,7 +38332,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_ecashMainNet_closure.prototype = { call$1(legacy) { @@ -36508,7 +38341,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip44Conf_ecashTestNet_closure.prototype = { call$1(legacy) { @@ -36517,7 +38350,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip44Conf_elrond_closure.prototype = { call$1(kwargs) { @@ -36526,7 +38359,7 @@ call$0() { return this.call$1(null); }, - $signature: 297 + $signature: 399 }; A.Bip44Conf_eos_closure.prototype = { call$1(kwargs) { @@ -36535,7 +38368,7 @@ call$0() { return this.call$1(null); }, - $signature: 286 + $signature: 420 }; A.Bip44Conf_ergoMainNet_closure.prototype = { call$1(kwargs) { @@ -36562,7 +38395,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_ethereumTestnet_closure.prototype = { call$1(kwargs) { @@ -36571,7 +38404,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_ethereumClassic_closure.prototype = { call$1(kwargs) { @@ -36580,7 +38413,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_fantomOpera_closure.prototype = { call$1(kwargs) { @@ -36589,7 +38422,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_filecoin_closure.prototype = { call$1(kwargs) { @@ -36598,7 +38431,7 @@ call$0() { return this.call$1(null); }, - $signature: 285 + $signature: 425 }; A.Bip44Conf_harmonyOneMetamask_closure.prototype = { call$1(kwargs) { @@ -36607,7 +38440,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_harmonyOneEth_closure.prototype = { call$1(kwargs) { @@ -36616,7 +38449,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_harmonyOneAtom_closure.prototype = { call$1(kwargs) { @@ -36625,7 +38458,7 @@ call$0() { return this.call$1(null); }, - $signature: 279 + $signature: 424 }; A.Bip44Conf_huobiChain_closure.prototype = { call$1(kwargs) { @@ -36634,7 +38467,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_icon_closure.prototype = { call$1(kwargs) { @@ -36643,7 +38476,7 @@ call$0() { return this.call$1(null); }, - $signature: 277 + $signature: 422 }; A.Bip44Conf_injective_closure.prototype = { call$1(kwargs) { @@ -36652,7 +38485,7 @@ call$0() { return this.call$1(null); }, - $signature: 274 + $signature: 421 }; A.Bip44Conf_irisNet_closure.prototype = { call$1(kwargs) { @@ -36697,7 +38530,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_litecoinTestNet_closure.prototype = { call$1(kwargs) { @@ -36706,7 +38539,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_moneroEd25519Slip_closure.prototype = { call$1(kwargs) { @@ -36715,7 +38548,7 @@ call$0() { return this.call$1(null); }, - $signature: 117 + $signature: 62 }; A.Bip44Conf_moneroSecp256k1_closure.prototype = { call$1(kwargs) { @@ -36724,7 +38557,7 @@ call$0() { return this.call$1(null); }, - $signature: 117 + $signature: 62 }; A.Bip44Conf_nano_closure.prototype = { call$1(kwargs) { @@ -36733,7 +38566,7 @@ call$0() { return this.call$1(null); }, - $signature: 273 + $signature: 416 }; A.Bip44Conf_nearProtocol_closure.prototype = { call$1(kwargs) { @@ -36742,7 +38575,7 @@ call$0() { return this.call$1(null); }, - $signature: 270 + $signature: 405 }; A.Bip44Conf_neo_closure.prototype = { call$1(kwargs) { @@ -36751,7 +38584,7 @@ call$0() { return this.call$1(null); }, - $signature: 70 + $signature: 63 }; A.Bip44Conf_nineChroniclesGold_closure.prototype = { call$1(kwargs) { @@ -36760,7 +38593,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_okexChainEth_closure.prototype = { call$1(kwargs) { @@ -36769,7 +38602,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_okexChainAtom_closure.prototype = { call$1(kwargs) { @@ -36778,7 +38611,7 @@ call$0() { return this.call$1(null); }, - $signature: 71 + $signature: 64 }; A.Bip44Conf_okexChainAtomOld_closure.prototype = { call$1(kwargs) { @@ -36787,7 +38620,7 @@ call$0() { return this.call$1(null); }, - $signature: 71 + $signature: 64 }; A.Bip44Conf_ontology_closure.prototype = { call$1(kwargs) { @@ -36796,7 +38629,7 @@ call$0() { return this.call$1(null); }, - $signature: 70 + $signature: 63 }; A.Bip44Conf_osmosis_closure.prototype = { call$1(kwargs) { @@ -36814,7 +38647,7 @@ call$0() { return this.call$1(null); }, - $signature: 72 + $signature: 65 }; A.Bip44Conf_polkadotEd25519Slip_closure.prototype = { call$1(kwargs) { @@ -36841,7 +38674,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_ripple_closure.prototype = { call$1(kwargs) { @@ -36850,7 +38683,7 @@ call$0() { return this.call$1(null); }, - $signature: 38 + $signature: 37 }; A.Bip44Conf_rippleTestnet_closure.prototype = { call$1(kwargs) { @@ -36859,7 +38692,7 @@ call$0() { return this.call$1(null); }, - $signature: 38 + $signature: 37 }; A.Bip44Conf_rippleEd25519_closure.prototype = { call$1(kwargs) { @@ -36868,7 +38701,7 @@ call$0() { return this.call$1(null); }, - $signature: 38 + $signature: 37 }; A.Bip44Conf_rippleTestnetEd25519_closure.prototype = { call$1(kwargs) { @@ -36877,7 +38710,7 @@ call$0() { return this.call$1(null); }, - $signature: 38 + $signature: 37 }; A.Bip44Conf_secretNetworkOld_closure.prototype = { call$1(kwargs) { @@ -36904,7 +38737,7 @@ call$0() { return this.call$1(null); }, - $signature: 74 + $signature: 66 }; A.Bip44Conf_solanaTestnet_closure.prototype = { call$1(kwargs) { @@ -36913,7 +38746,7 @@ call$0() { return this.call$1(null); }, - $signature: 74 + $signature: 66 }; A.Bip44Conf_stellar_closure.prototype = { call$1(kwargs) { @@ -36922,7 +38755,7 @@ call$0() { return this.call$1(null); }, - $signature: 72 + $signature: 65 }; A.Bip44Conf_terra_closure.prototype = { call$1(kwargs) { @@ -36940,7 +38773,7 @@ call$0() { return this.call$1(null); }, - $signature: 269 + $signature: 393 }; A.Bip44Conf_theta_closure.prototype = { call$1(kwargs) { @@ -36949,7 +38782,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_tron_closure.prototype = { call$1(kwargs) { @@ -36958,7 +38791,7 @@ call$0() { return this.call$1(null); }, - $signature: 76 + $signature: 67 }; A.Bip44Conf_tronTestnet_closure.prototype = { call$1(kwargs) { @@ -36967,7 +38800,7 @@ call$0() { return this.call$1(null); }, - $signature: 76 + $signature: 67 }; A.Bip44Conf_vechain_closure.prototype = { call$1(kwargs) { @@ -36976,7 +38809,7 @@ call$0() { return this.call$1(null); }, - $signature: 4 + $signature: 6 }; A.Bip44Conf_verge_closure.prototype = { call$1(kwargs) { @@ -36985,7 +38818,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_zcashMainNet_closure.prototype = { call$1(kwargs) { @@ -36994,7 +38827,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_zcashTestNet_closure.prototype = { call$1(kwargs) { @@ -37003,7 +38836,7 @@ call$0() { return this.call$1(null); }, - $signature: 5 + $signature: 7 }; A.Bip44Conf_zilliqa_closure.prototype = { call$1(kwargs) { @@ -37012,7 +38845,7 @@ call$0() { return this.call$1(null); }, - $signature: 267 + $signature: 392 }; A.Bip44Conf_tonMainnet_closure.prototype = { call$1(kwargs) { @@ -37021,7 +38854,7 @@ call$0() { return this.call$1(null); }, - $signature: 78 + $signature: 68 }; A.Bip44Conf_tonTestnet_closure.prototype = { call$1(kwargs) { @@ -37030,7 +38863,7 @@ call$0() { return this.call$1(null); }, - $signature: 78 + $signature: 68 }; A.Bip49Coins.prototype = { get$value() { @@ -37052,7 +38885,7 @@ call$1(element) { return type$.Bip49Coins._as(element).name === this.name; }, - $signature: 266 + $signature: 391 }; A.Bip49Conf_dashMainNet_closure.prototype = { call$1(kwargs) { @@ -37061,7 +38894,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_dashTestNet_closure.prototype = { call$1(kwargs) { @@ -37070,7 +38903,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_dogecoinMainNet_closure.prototype = { call$1(kwargs) { @@ -37079,7 +38912,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_dogecoinTestNet_closure.prototype = { call$1(kwargs) { @@ -37088,7 +38921,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_litecoinMainNet_closure.prototype = { call$1(kwargs) { @@ -37097,7 +38930,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_litecoinTestNet_closure.prototype = { call$1(kwargs) { @@ -37106,7 +38939,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_zcashMainNet_closure.prototype = { call$1(kwargs) { @@ -37115,7 +38948,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_zcashTestNet_closure.prototype = { call$1(kwargs) { @@ -37124,7 +38957,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_bitcoinMainNet_closure.prototype = { call$1(kwargs) { @@ -37133,7 +38966,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_bitcoinTestNet_closure.prototype = { call$1(kwargs) { @@ -37142,7 +38975,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_bitcoinSvMainNet_closure.prototype = { call$1(kwargs) { @@ -37151,7 +38984,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_bitcoinSvTestNet_closure.prototype = { call$1(kwargs) { @@ -37160,7 +38993,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_bitcoinCashMainNet_closure.prototype = { call$1(legacy) { @@ -37169,7 +39002,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip49Conf_bitcoinCashTestNet_closure.prototype = { call$1(legacy) { @@ -37178,7 +39011,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip49Conf_bitcoinCashSlpMainNet_closure.prototype = { call$1(legacy) { @@ -37187,7 +39020,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip49Conf_bitcoinCashSlpTestNet_closure.prototype = { call$1(legacy) { @@ -37196,7 +39029,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip49Conf_ecashMainNet_closure.prototype = { call$1(legacy) { @@ -37205,7 +39038,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip49Conf_ecashTestNet_closure.prototype = { call$1(legacy) { @@ -37214,7 +39047,7 @@ call$0() { return this.call$1(null); }, - $signature: 11 + $signature: 12 }; A.Bip49Conf_pepeMainnet_closure.prototype = { call$1(kwargs) { @@ -37223,7 +39056,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip49Conf_pepeTestnet_closure.prototype = { call$1(kwargs) { @@ -37232,7 +39065,7 @@ call$0() { return this.call$1(null); }, - $signature: 10 + $signature: 9 }; A.Bip84Coins.prototype = { get$value() { @@ -37254,7 +39087,7 @@ call$1(element) { return type$.Bip84Coins._as(element).name === this.name; }, - $signature: 262 + $signature: 390 }; A.Bip84Conf_bitcoinMainNet_closure.prototype = { call$1(kwargs) { @@ -37312,7 +39145,7 @@ call$1(element) { return type$.Bip86Coins._as(element).name === this.name; }, - $signature: 261 + $signature: 389 }; A.Bip86Conf_bitcoinMainNet_closure.prototype = { call$1(kwargs) { @@ -37321,7 +39154,7 @@ call$0() { return this.call$1(null); }, - $signature: 84 + $signature: 71 }; A.Bip86Conf_bitcoinTestNet_closure.prototype = { call$1(kwargs) { @@ -37330,7 +39163,7 @@ call$0() { return this.call$1(null); }, - $signature: 84 + $signature: 71 }; A.BipBitcoinCashConf.prototype = {}; A.BipCoinConfig.prototype = {$isCoinConfig: 1, @@ -37343,7 +39176,7 @@ call$1(element) { return type$.BipProposal._as(element).get$name() === this.name; }, - $signature: 256 + $signature: 387 }; A.CoinProposal_fromName_closure0.prototype = { call$0() { @@ -37371,7 +39204,7 @@ call$1(element) { return type$.Cip1852Coins._as(element).name === this.name; }, - $signature: 254 + $signature: 385 }; A.CipProposal.prototype = { get$specName() { @@ -37392,7 +39225,7 @@ call$0() { return this.call$1(null); }, - $signature: 41 + $signature: 47 }; A.Cip1852Conf_cardanoIcarusTestNet_closure.prototype = { call$1(kwargs) { @@ -37401,7 +39234,7 @@ call$0() { return this.call$1(null); }, - $signature: 41 + $signature: 47 }; A.Cip1852Conf_cardanoLedgerMainNet_closure.prototype = { call$1(kwargs) { @@ -37410,7 +39243,7 @@ call$0() { return this.call$1(null); }, - $signature: 41 + $signature: 47 }; A.Cip1852Conf_cardanoLedgerTestNet_closure.prototype = { call$1(kwargs) { @@ -37419,7 +39252,7 @@ call$0() { return this.call$1(null); }, - $signature: 41 + $signature: 47 }; A.CoinConf.prototype = { toString$0(_) { @@ -37441,7 +39274,7 @@ call$1(element) { return type$.EllipticCurveTypes._as(element).name === this.name; }, - $signature: 251 + $signature: 375 }; A.Ed25519Blake2bPublicKey.prototype = { get$curve() { @@ -37454,7 +39287,7 @@ return this._ed25519_blake2b_keys$_publicKey._point; }, get$compressed() { - var t1 = A.List_List$of(B.List_0, true, type$.dynamic); + var t1 = A.List_List$of(B.List_00, true, type$.dynamic); B.JSArray_methods.addAll$1(t1, this._ed25519_blake2b_keys$_publicKey._point.toBytes$0()); return A.List_List$from(t1, true, type$.int); }, @@ -37471,7 +39304,7 @@ return this._publicKey._point; }, get$compressed() { - var t1 = A.List_List$of(B.List_0, true, type$.dynamic); + var t1 = A.List_List$of(B.List_00, true, type$.dynamic); B.JSArray_methods.addAll$1(t1, this._publicKey._point.toBytes$0()); return A.List_List$from(t1, true, type$.int); }, @@ -37488,7 +39321,7 @@ return B.EllipticCurveTypes_ed25519Kholaw; }, get$compressed() { - var t1 = A.List_List$of(B.List_0, true, type$.dynamic); + var t1 = A.List_List$of(B.List_00, true, type$.dynamic); B.JSArray_methods.addAll$1(t1, this._ed25519_kholaw_keys$_publicKey._point.toBytes$0()); return A.List_List$from(t1, true, type$.int); }, @@ -37505,7 +39338,7 @@ return this._ed25519_monero_keys$_publicKey._point; }, get$compressed() { - var t1 = A.List_List$of(B.List_0, true, type$.dynamic); + var t1 = A.List_List$of(B.List_00, true, type$.dynamic); B.JSArray_methods.addAll$1(t1, this._ed25519_monero_keys$_publicKey._point.toBytes$0()); return A.List_List$from(t1, true, type$.int); }, @@ -37583,7 +39416,7 @@ call$1(element) { return type$.MoneroCoins._as(element).name === this.name; }, - $signature: 250 + $signature: 327 }; A.MoneroProposal.prototype = { get$specName() { @@ -37641,7 +39474,7 @@ call$1(element) { return type$.SubstrateCoins._as(element).name === this.name; }, - $signature: 249 + $signature: 326 }; A.SubstratePropoosal.prototype = { get$specName() { @@ -37667,7 +39500,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_acalaSr25519_closure.prototype = { call$1(kwargs) { @@ -37676,7 +39509,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_bifrostEd25519_closure.prototype = { call$1(kwargs) { @@ -37694,7 +39527,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_bifrostSr25519_closure.prototype = { call$1(kwargs) { @@ -37703,7 +39536,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_chainXEd25519_closure.prototype = { call$1(kwargs) { @@ -37721,7 +39554,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_chainXSr25519_closure.prototype = { call$1(kwargs) { @@ -37730,7 +39563,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_edgewareEd25519_closure.prototype = { call$1(kwargs) { @@ -37748,7 +39581,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_edgewareSr25519_closure.prototype = { call$1(kwargs) { @@ -37757,7 +39590,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_genericEd25519_closure.prototype = { call$1(kwargs) { @@ -37775,7 +39608,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_genericSr25519_closure.prototype = { call$1(kwargs) { @@ -37784,7 +39617,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_karuraEd25519_closure.prototype = { call$1(kwargs) { @@ -37802,7 +39635,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_karuraSr25519_closure.prototype = { call$1(kwargs) { @@ -37811,7 +39644,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_kusamaEd25519_closure.prototype = { call$1(kwargs) { @@ -37829,7 +39662,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_kusamaSr25519_closure.prototype = { call$1(kwargs) { @@ -37838,7 +39671,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_moonbeamEd25519_closure.prototype = { call$1(kwargs) { @@ -37856,7 +39689,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_moonbeamSr25519_closure.prototype = { call$1(kwargs) { @@ -37865,7 +39698,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_moonriverEd25519_closure.prototype = { call$1(kwargs) { @@ -37883,7 +39716,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_moonriverSr25519_closure.prototype = { call$1(kwargs) { @@ -37892,7 +39725,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_phalaEd25519_closure.prototype = { call$1(kwargs) { @@ -37910,7 +39743,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_phalaSr25519_closure.prototype = { call$1(kwargs) { @@ -37919,7 +39752,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_plasmEd25519_closure.prototype = { call$1(kwargs) { @@ -37937,7 +39770,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_plasmSr25519_closure.prototype = { call$1(kwargs) { @@ -37946,7 +39779,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_polkadotEd25519_closure.prototype = { call$1(kwargs) { @@ -37964,7 +39797,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_polkadotSr25519_closure.prototype = { call$1(kwargs) { @@ -37973,7 +39806,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_soraEd25519_closure.prototype = { call$1(kwargs) { @@ -37991,7 +39824,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_soraSr25519_closure.prototype = { call$1(kwargs) { @@ -38000,7 +39833,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateConf_stafiEd25519_closure.prototype = { call$1(kwargs) { @@ -38018,7 +39851,7 @@ call$0() { return this.call$1(null); }, - $signature: 6 + $signature: 10 }; A.SubstrateConf_stafiSr25519_closure.prototype = { call$1(kwargs) { @@ -38027,7 +39860,7 @@ call$0() { return this.call$1(null); }, - $signature: 9 + $signature: 11 }; A.SubstrateScaleEncoderBase.prototype = {}; A.SubstrateScaleCUintEncoder.prototype = { @@ -38035,14 +39868,14 @@ var valueBytes, t1, v = A._BigIntImpl_parse(value, null); if (v.compareTo$1(0, $.$get$SubstrateScaleCUintEncoderConst_singleByteModeMaxVal()) <= 0) - return A.BigintUtils_toBytes(v.$shl(0, 2), 1, B.C_Endian0); + return A.BigintUtils_toBytes(v.$shl(0, 2), 1, B.C_Endian); if (v.compareTo$1(0, $.$get$SubstrateScaleCUintEncoderConst_twoByteModeMaxVal()) <= 0) - return A.BigintUtils_toBytes(v.$shl(0, 2).$or(0, A._BigIntImpl__BigIntImpl$from(1)), 2, B.C_Endian0); + return A.BigintUtils_toBytes(v.$shl(0, 2).$or(0, A._BigIntImpl__BigIntImpl$from(1)), 2, B.C_Endian); if (v.compareTo$1(0, $.$get$SubstrateScaleCUintEncoderConst_fourByteModeMaxVal()) <= 0) - return A.BigintUtils_toBytes(v.$shl(0, 2).$or(0, A._BigIntImpl__BigIntImpl$from(2)), 4, B.C_Endian0); + return A.BigintUtils_toBytes(v.$shl(0, 2).$or(0, A._BigIntImpl__BigIntImpl$from(2)), 4, B.C_Endian); if (v.compareTo$1(0, $.$get$SubstrateScaleCUintEncoderConst_bigIntegerModeMaxVal()) <= 0) { - valueBytes = A.BigintUtils_toBytes(v, A.BigintUtils_orderLen(v), B.C_Endian0); - t1 = A.List_List$of(A.IntUtils_toBytes((valueBytes.length - 4 << 2 | 3) >>> 0, B.C_Endian0, 1), true, type$.dynamic); + valueBytes = A.BigintUtils_toBytes(v, A.BigintUtils_orderLen(v), B.C_Endian); + t1 = A.List_List$of(A.IntUtils_toBytes((valueBytes.length - 4 << 2 | 3) >>> 0, B.C_Endian, 1), true, type$.dynamic); B.JSArray_methods.addAll$1(t1, valueBytes); return A.List_List$from(t1, true, type$.int); } @@ -38053,7 +39886,7 @@ call$1(e) { return A.CborObject_CborObject$fromDynamic(e); }, - $signature: 247 + $signature: 320 }; A.CborBase64Types.prototype = {}; A.CborBaseUrlValue.prototype = { @@ -38139,7 +39972,7 @@ v = v.$not(0); } else bytes.pushTags$1(B.List_2); - toBytes = A.BigintUtils_toBytes(v, B.JSInt_methods._tdivFast$1((v._isNegative ? v.$negate(0) : v).get$bitLength(0) + 7, 8), B.C_Endian); + toBytes = A.BigintUtils_toBytes(v, B.JSInt_methods._tdivFast$1((v._isNegative ? v.$negate(0) : v).get$bitLength(0) + 7, 8), B.C_Endian0); bytes.pushInt$2(2, toBytes.length); type$.List_int._as(toBytes); A.BytesUtils_validateBytes(toBytes, null); @@ -38281,7 +40114,7 @@ A._CborDate.prototype = { _getTags$0() { if (this instanceof A.CborStringDateValue) - return B.List_0; + return B.List_00; return B.List_1; }, encode$0() { @@ -38495,7 +40328,7 @@ t4 = t1._isNegative; t5 = t4 ? 1 : 0; new A.CborBytesTracker(new A.DynamicByteTracker(t3)).pushMajorTag$2(t5, 27); - t1 = type$.List_int._as(A.BigintUtils_toBytes(t4 ? t1.$not(0) : t1, 8, B.C_Endian)); + t1 = type$.List_int._as(A.BigintUtils_toBytes(t4 ? t1.$not(0) : t1, 8, B.C_Endian0)); A.BytesUtils_validateBytes(t1, null); B.JSArray_methods.addAll$1(t3, A.BytesUtils_toBytes(t1, false)); return A.List_List$from(t3, true, t2); @@ -38839,25 +40672,25 @@ call$1(e) { return type$.CborStringValue._as(e).value; }, - $signature: 241 + $signature: 311 }; A.CborUtils__toStringObject_closure.prototype = { call$1(element) { return A.BytesUtils_bytesEqual(this.tags, type$.CborBase64Types._as(element).tag); }, - $signature: 95 + $signature: 72 }; A.CborUtils__toStringObject_closure0.prototype = { call$1(element) { return A.BytesUtils_bytesEqual(this.tags, type$.CborBase64Types._as(element).tag); }, - $signature: 95 + $signature: 72 }; A.CborUtils__decodeBytesString_closure.prototype = { call$1(e) { return type$.CborBytesValue._as(e).value; }, - $signature: 231 + $signature: 308 }; A.CborBytesTracker.prototype = { pushTags$1(tags) { @@ -38869,12 +40702,12 @@ pushIndefinite$1(majorTag) { var t1 = type$.List_int._as(A._setArrayType([(majorTag << 5 | 31) >>> 0], type$.JSArray_int)); A.BytesUtils_validateBytes(t1, null); - B.JSArray_methods.addAll$1(this._dynamic_bytes$_buffer._buffer, A.BytesUtils_toBytes(t1, false)); + B.JSArray_methods.addAll$1(this._dynamic_bytes$_buffer._bytes_tracker$_buffer, A.BytesUtils_toBytes(t1, false)); }, pushMajorTag$2(majorTag, value) { var t1 = type$.List_int._as(A._setArrayType([(majorTag << 5 | value) >>> 0], type$.JSArray_int)); A.BytesUtils_validateBytes(t1, null); - B.JSArray_methods.addAll$1(this._dynamic_bytes$_buffer._buffer, A.BytesUtils_toBytes(t1, false)); + B.JSArray_methods.addAll$1(this._dynamic_bytes$_buffer._bytes_tracker$_buffer, A.BytesUtils_toBytes(t1, false)); }, pushInt$2(majorTag, value) { var t4, len, @@ -38884,17 +40717,17 @@ t3 = type$.List_int; t2 = t3._as(A._setArrayType([(majorTag << 5 | t2) >>> 0], type$.JSArray_int)); A.BytesUtils_validateBytes(t2, null); - t4 = this._dynamic_bytes$_buffer._buffer; + t4 = this._dynamic_bytes$_buffer._bytes_tracker$_buffer; B.JSArray_methods.addAll$1(t4, A.BytesUtils_toBytes(t2, false)); if (t1) return; len = B.JSInt_methods.$shl(1, $length - 24); if (len <= 4) { - t1 = t3._as(A.IntUtils_toBytes(value, B.C_Endian, len)); + t1 = t3._as(A.IntUtils_toBytes(value, B.C_Endian0, len)); A.BytesUtils_validateBytes(t1, null); B.JSArray_methods.addAll$1(t4, A.BytesUtils_toBytes(t1, false)); } else { - t1 = t3._as(A.BigintUtils_toBytes(A._BigIntImpl__BigIntImpl$from(value), 8, B.C_Endian)); + t1 = t3._as(A.BigintUtils_toBytes(A._BigIntImpl__BigIntImpl$from(value), 8, B.C_Endian0)); A.BytesUtils_validateBytes(t1, null); B.JSArray_methods.addAll$1(t4, A.BytesUtils_toBytes(t1, false)); } @@ -39341,13 +41174,13 @@ } return s; }, - $signature: 26 + $signature: 25 }; A.AESLib_initialize__rot24.prototype = { call$1(x) { return A.rotl32(x, 24); }, - $signature: 21 + $signature: 23 }; A.CurveFp.prototype = { $eq(_, other) { @@ -39446,7 +41279,7 @@ }; A.EncodeType.prototype = { _enumToString$0() { - return "EncodeType." + this._name; + return "EncodeType." + this._core$_name; } }; A.AbstractPoint.prototype = { @@ -39455,7 +41288,7 @@ if (_this instanceof A.EDPoint) { _this.scale$0(); encLen = B.JSInt_methods._tdivFast$1(_this.curve.p.get$bitLength(0) + 1 + 7, 8); - yStr = A.BigintUtils_toBytes(_this.get$y(), encLen, B.C_Endian0); + yStr = A.BigintUtils_toBytes(_this.get$y(), encLen, B.C_Endian); t1 = _this.get$x().$mod(0, $.$get$_BigIntImpl_two()).compareTo$1(0, $.$get$_BigIntImpl_one()); if (t1 === 0) { t1 = yStr.length; @@ -39485,7 +41318,7 @@ B.JSArray_methods.setAll$2(result, prefix.length, raw); return result; default: - xStr = A.BigintUtils_toBytes(_this.get$x(), A.BigintUtils_orderLen(_this.get$curve().get$p()), B.C_Endian); + xStr = A.BigintUtils_toBytes(_this.get$x(), A.BigintUtils_orderLen(_this.get$curve().get$p()), B.C_Endian0); t1 = _this.get$y().$and(0, $.$get$_BigIntImpl_one()).compareTo$1(0, $.$get$_BigIntImpl_zero()); t2 = type$.int; prefix = t1 !== 0 ? A.List_List$from([3], true, t2) : A.List_List$from([2], true, t2); @@ -39500,8 +41333,8 @@ }, _base$_encode$0() { var _this = this, - xBytes = A.BigintUtils_toBytes(_this.get$x(), A.BigintUtils_orderLen(_this.get$curve().get$p()), B.C_Endian), - yBytes = A.BigintUtils_toBytes(_this.get$y(), A.BigintUtils_orderLen(_this.get$curve().get$p()), B.C_Endian), + xBytes = A.BigintUtils_toBytes(_this.get$x(), A.BigintUtils_orderLen(_this.get$curve().get$p()), B.C_Endian0), + yBytes = A.BigintUtils_toBytes(_this.get$y(), A.BigintUtils_orderLen(_this.get$curve().get$p()), B.C_Endian0), t1 = A.List_List$of(xBytes, true, type$.dynamic); B.JSArray_methods.addAll$1(t1, yBytes); return A.List_List$from(t1, true, type$.int); @@ -39552,7 +41385,7 @@ if (2 >= t4) return A.ioore(t3, 2); t4 = type$.JSArray_BigInt; - doubler = new A.ProjectiveECCPoint(_this.curve, t1, false, B.List_empty13, A._setArrayType([xCoord, yCoord, t3[2]], t4)); + doubler = new A.ProjectiveECCPoint(_this.curve, t1, false, B.List_empty14, A._setArrayType([xCoord, yCoord, t3[2]], t4)); newOrder = newOrder.$mul(0, t2); B.JSArray_methods.add$1(precomputedPoints, A._setArrayType([doubler.get$x(), doubler.get$y()], t4)); for (; i.compareTo$1(0, newOrder) < 0;) { @@ -39728,7 +41561,7 @@ t1 = $.$get$_BigIntImpl_zero(); t2 = y1.compareTo$1(0, t1); if (t2 === 0) - return new A.ProjectiveECCPoint(_this.curve, null, false, B.List_empty13, A._setArrayType([t1, t1, t1], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(_this.curve, null, false, B.List_empty14, A._setArrayType([t1, t1, t1], type$.JSArray_BigInt)); t2 = _this.curve; result = _this._double$5(x1, y1, z1, t2.p, t2.a); t3 = result[1].compareTo$1(0, t1); @@ -39737,8 +41570,8 @@ else t3 = true; if (t3) - return new A.ProjectiveECCPoint(t2, null, false, B.List_empty13, A._setArrayType([t1, t1, t1], type$.JSArray_BigInt)); - return new A.ProjectiveECCPoint(t2, _this.order, false, B.List_empty13, A._setArrayType([result[0], result[1], result[2]], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t2, null, false, B.List_empty14, A._setArrayType([t1, t1, t1], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t2, _this.order, false, B.List_empty14, A._setArrayType([result[0], result[1], result[2]], type$.JSArray_BigInt)); }, _addPointsWithZ1$5(x1, y1, x2, y2, p) { var $V, x3, @@ -39895,8 +41728,8 @@ else t3 = true; if (t3) - return new A.ProjectiveECCPoint(t1, null, false, B.List_empty13, A._setArrayType([t2, t2, t2], type$.JSArray_BigInt)); - return new A.ProjectiveECCPoint(t1, _this.order, false, B.List_empty13, A._setArrayType([x3, y3, z3], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t1, null, false, B.List_empty14, A._setArrayType([t2, t2, t2], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t1, _this.order, false, B.List_empty14, A._setArrayType([x3, y3, z3], type$.JSArray_BigInt)); }, _multiplyWithPrecompute$1(scalar) { var resultY, i, t2, t3, x2, y2, t4, addResult, _this = this, @@ -39973,8 +41806,8 @@ else t3 = true; if (t3) - return new A.ProjectiveECCPoint(t1, null, false, B.List_empty13, A._setArrayType([t2, t2, t2], type$.JSArray_BigInt)); - return new A.ProjectiveECCPoint(t1, _this.order, false, B.List_empty13, A._setArrayType([resultX, resultY, resultZ], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t1, null, false, B.List_empty14, A._setArrayType([t2, t2, t2], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t1, _this.order, false, B.List_empty14, A._setArrayType([resultX, resultY, resultZ], type$.JSArray_BigInt)); }, $mul(_, scalar) { var x3, z3, t2, t3, x2, y2, primeField, curveA, nafList, i, y3, x30, double, add, _this = this, @@ -39989,7 +41822,7 @@ else t1 = true; if (t1) - return new A.ProjectiveECCPoint(_this.curve, null, false, B.List_empty13, A._setArrayType([x3, x3, x3], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(_this.curve, null, false, B.List_empty14, A._setArrayType([x3, x3, x3], type$.JSArray_BigInt)); z3 = $.$get$_BigIntImpl_one(); t1 = scalar.compareTo$1(0, z3); if (t1 === 0) @@ -40042,8 +41875,8 @@ else t3 = true; if (t3) - return new A.ProjectiveECCPoint(t2, null, false, B.List_empty13, A._setArrayType([x3, x3, x3], type$.JSArray_BigInt)); - return new A.ProjectiveECCPoint(t2, t1, false, B.List_empty13, A._setArrayType([x30, y3, z3], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t2, null, false, B.List_empty14, A._setArrayType([x3, x3, x3], type$.JSArray_BigInt)); + return new A.ProjectiveECCPoint(t2, t1, false, B.List_empty14, A._setArrayType([x30, y3, z3], type$.JSArray_BigInt)); }, get$hashCode(_) { return this.curve.get$hashCode(0) ^ this.get$x().get$hashCode(0) ^ this.get$y().get$hashCode(0); @@ -41367,6 +43200,17 @@ } }; A.SHA256.prototype = { + _initState$0() { + var t1 = this._hash$_state; + B.JSArray_methods.$indexSet(t1, 0, 1779033703); + B.JSArray_methods.$indexSet(t1, 1, 3144134277); + B.JSArray_methods.$indexSet(t1, 2, 1013904242); + B.JSArray_methods.$indexSet(t1, 3, 2773480762); + B.JSArray_methods.$indexSet(t1, 4, 1359893119); + B.JSArray_methods.$indexSet(t1, 5, 2600822924); + B.JSArray_methods.$indexSet(t1, 6, 528734635); + B.JSArray_methods.$indexSet(t1, 7, 1541459225); + }, update$1(data) { var dataLength, dataPos, t1, t2, dataPos0, t3, _this = this; type$.List_int._as(data); @@ -42033,7 +43877,7 @@ } return t1.nextBytes$1($length); }, - $signature: 228 + $signature: 297 }; A.BlockchainUtilsException.prototype = { toString$0(_) { @@ -42067,23 +43911,24 @@ }; A._Hex.prototype = { encode$2$lowerCase(data, lowerCase) { - var t1, $length, result, i, byte, t2, t3; + var table, t1, $length, result, t2, i, byte, t3, t4; type$.List_int._as(data); A.BytesUtils_validateBytes(data, "Invalid hex bytes"); + table = lowerCase ? B.List_bdS : B.List_o5Y; t1 = J.getInterceptor$asx(data); $length = t1.get$length(data); result = A.List_List$filled($length * 2, "", false, type$.String); - for (i = 0; i < $length; ++i) { + for (t2 = table.length, i = 0; i < $length; ++i) { byte = t1.$index(data, i); - t2 = i * 2; - t3 = B.JSInt_methods._shrOtherPositive$1(byte, 4); - if (!(t3 < 16)) - return A.ioore(B.List_bdS, t3); - B.JSArray_methods.$indexSet(result, t2, B.List_bdS[t3]); - t3 = byte & 15; - if (!(t3 < 16)) - return A.ioore(B.List_bdS, t3); - B.JSArray_methods.$indexSet(result, t2 + 1, B.List_bdS[t3]); + t3 = i * 2; + t4 = B.JSInt_methods._shrOtherPositive$1(byte, 4); + if (!(t4 < t2)) + return A.ioore(table, t4); + B.JSArray_methods.$indexSet(result, t3, table[t4]); + t4 = byte & 15; + if (!(t4 < t2)) + return A.ioore(table, t4); + B.JSArray_methods.$indexSet(result, t3 + 1, table[t4]); } return B.JSArray_methods.join$0(result); }, @@ -42115,7 +43960,7 @@ }; A.LayoutByteReader.prototype = { get$length(_) { - return this._bytes.length; + return this._byte_handler$_bytes.length; }, getCompactLengthInfos$2$sign(offset, sign) { var $length = A.LayoutSerializationUtils_decodeLength(this._maxOffset$2(offset, 12), false), @@ -42128,7 +43973,7 @@ return this.getCompactLengthInfos$2$sign(offset, false); }, _maxOffset$2(offset, need) { - var t1 = this._bytes, + var t1 = this._byte_handler$_bytes, t2 = offset + need; if (t1.length >= t2) return B.JSArray_methods.sublist$2(t1, offset, t2); @@ -42151,19 +43996,19 @@ }; A.LayoutByteWriter.prototype = { get$length(_) { - return this._byte_handler$_buffer._bytes.length; + return this._byte_handler$_buffer._byte_handler$_bytes.length; }, setAll$2(_, index, bytes) { var t1, t2, t3; type$.List_int._as(bytes); t1 = index + J.get$length$asx(bytes); if (this.growable) { - t2 = this._byte_handler$_buffer._bytes; + t2 = this._byte_handler$_buffer._byte_handler$_bytes; t3 = t2.length; if (t1 > t3) B.JSArray_methods.addAll$1(t2, A.List_List$filled(t1 - t3, 0, true, type$.int)); } - B.JSArray_methods.setAll$2(this._byte_handler$_buffer._bytes, index, bytes); + B.JSArray_methods.setAll$2(this._byte_handler$_buffer._byte_handler$_bytes, index, bytes); } }; A.LayoutConst_rustEnum_closure.prototype = { @@ -42181,32 +44026,32 @@ t1._registry.$indexSet(0, index, rv); return rv; }, - $signature: 226 + $signature: 290 }; A.LayoutConst_rustEnum_closure1.prototype = { call$1(value) { type$.Map_String_dynamic._as(value); return value; }, - $signature: 99 + $signature: 73 }; A.LayoutConst_rustEnum_closure0.prototype = { call$1(src) { return type$.Map_String_dynamic._as(src); }, - $signature: 99 + $signature: 73 }; A.LayoutConst_compactString_closure0.prototype = { call$1(bytes) { return A.StringUtils_decode(type$.List_int._as(bytes), false, B.StringEncoding_1); }, - $signature: 100 + $signature: 74 }; A.LayoutConst_compactString_closure.prototype = { call$1(src) { return A.StringUtils_encode(A._asString(src), B.StringEncoding_1); }, - $signature: 225 + $signature: 288 }; A.LayoutConst_compactMap_closure0.prototype = { call$1(data) { @@ -42230,13 +44075,13 @@ call$1(data) { return type$.Map_String_dynamic._as(data).$index(0, "values"); }, - $signature: 222 + $signature: 284 }; A.LayoutConst_array_closure.prototype = { call$1(values) { return A.LinkedHashMap_LinkedHashMap$_literal(["values", values], type$.String, type$.dynamic); }, - $signature: 20 + $signature: 26 }; A.LayoutConst_compactVec_closure.prototype = { call$1(data) { @@ -42270,7 +44115,7 @@ t1 = this.span; data = A.LayoutByteWriter$(t1); enc = this.encode$2(source, data); - encodeBytes = data._byte_handler$_buffer._bytes; + encodeBytes = data._byte_handler$_buffer._byte_handler$_bytes; return t1 > 0 ? encodeBytes : B.JSArray_methods.sublist$2(encodeBytes, 0, enc); }, deserialize$1(bytes) { @@ -42401,7 +44246,7 @@ t2 = decode.item2; if (typeof t2 !== "number") return A.iae(t2); - return new A.LayoutDecodeResult(t2, B.JSArray_methods.sublist$2(bytes._bytes, A._asInt(offset + t1), A._asIntQ(offset + t2)), type$.LayoutDecodeResult_List_int); + return new A.LayoutDecodeResult(t2, B.JSArray_methods.sublist$2(bytes._byte_handler$_bytes, A._asInt(offset + t1), A._asIntQ(offset + t2)), type$.LayoutDecodeResult_List_int); }, decode$1(bytes) { return this.decode$2$offset(bytes, 0); @@ -42512,7 +44357,7 @@ }, decode$2$offset(bytes, offset) { var t1 = this.span, - data = B.JSArray_methods.sublist$2(bytes._bytes, offset, offset + t1); + data = B.JSArray_methods.sublist$2(bytes._byte_handler$_bytes, offset, offset + t1); if (t1 > 4) return new A.LayoutDecodeResult(t1, A.BigintUtils_fromBytes(data, this.order, false).toInt$0(0), type$.LayoutDecodeResult_int); return new A.LayoutDecodeResult(t1, A.IntUtils_fromBytes(data, this.order, false), type$.LayoutDecodeResult_int); @@ -42565,7 +44410,7 @@ }; A.CompactIntLayout.prototype = { getSpan$2$offset(bytes, offset) { - var t1 = bytes._bytes; + var t1 = bytes._byte_handler$_bytes; if (!(offset >= 0 && offset < t1.length)) return A.ioore(t1, offset); return A.LayoutSerializationUtils_getDataCompactOffset(t1[offset]); @@ -42689,7 +44534,7 @@ }, decode$2$offset(bytes, offset) { var span = this.getSpan$2$offset(bytes, offset); - return new A.LayoutDecodeResult(span, B.JSArray_methods.sublist$2(bytes._bytes, offset, offset + span), type$.LayoutDecodeResult_List_int); + return new A.LayoutDecodeResult(span, B.JSArray_methods.sublist$2(bytes._byte_handler$_bytes, offset, offset + span), type$.LayoutDecodeResult_List_int); }, decode$1(bytes) { return this.decode$2$offset(bytes, 0); @@ -42701,7 +44546,7 @@ t1 = J.getInterceptor$asx(source); if (span !== t1.get$length(source)) throw A.wrapException(A.LayoutException$("encode requires a source with length " + span + ".", A.LinkedHashMap_LinkedHashMap$_literal(["property", this.property, "length", span, "sourceLength", t1.get$length(source)], type$.String, type$.dynamic), null)); - if (offset + span > writer._byte_handler$_buffer._bytes.length) + if (offset + span > writer._byte_handler$_buffer._byte_handler$_bytes.length) if (!writer.growable) throw A.wrapException(A.LayoutException$("Encoding overruns bytes", A.LinkedHashMap_LinkedHashMap$_literal(["property", this.property], type$.String, type$.dynamic), null)); writer.setAll$2(0, offset, t1.sublist$2(source, 0, span)); @@ -42780,13 +44625,13 @@ type$.Layout_dynamic._as(e); return A.getRuntimeTypeOfDartObject(e).toString$0(0) + ": " + A.S(e.property); }, - $signature: 221 + $signature: 280 }; A.StructLayout_StructLayout_closure0.prototype = { call$2(span, fd) { return A._asInt(span) + type$.Layout_dynamic._as(fd).getSpan$1(null); }, - $signature: 105 + $signature: 75 }; A.StructLayout_getSpan_closure.prototype = { call$2(span, fd) { @@ -42804,7 +44649,7 @@ return A.iae(t3); return span + t3; }, - $signature: 105 + $signature: 75 }; A.Union.prototype = { getSpan$2$offset(bytes, offset) { @@ -42891,7 +44736,7 @@ call$1(e) { return A._asString(e); }, - $signature: 15 + $signature: 16 }; A.VariantLayout.prototype = { getSpan$2$offset(bytes, offset) { @@ -42989,14 +44834,14 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.LayoutException_toString_closure.prototype = { call$1(e) { A._asString(e); return e + ": " + A.S(this.$this.details.$index(0, e)); }, - $signature: 15 + $signature: 16 }; A.SolanaVerifier.prototype = {}; A.SS58ChecksumError.prototype = { @@ -43011,7 +44856,7 @@ call$1(e) { return A._asInt(e) & 255; }, - $signature: 21 + $signature: 23 }; A.BigRational.prototype = { $mul(_, other) { @@ -43103,7 +44948,7 @@ }; A.StringEncoding.prototype = { _enumToString$0() { - return "StringEncoding." + this._name; + return "StringEncoding." + this._core$_name; } }; A.Tuple.prototype = {}; @@ -43120,13 +44965,13 @@ return t1.nextInt$1(256); } }, - $signature: 21 + $signature: 23 }; A.UUID_generateUUIDv4_closure0.prototype = { call$1(byte) { return B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(A._asInt(byte), 16), 2, "0"); }, - $signature: 89 + $signature: 127 }; A.CanonicalizedMap.prototype = { $index(_, key) { @@ -43289,7 +45134,7 @@ A._asString(key); return A._asStringQ(value) == null; }, - $signature: 214 + $signature: 278 }; A.TendermintRequestDetails.prototype = {}; A.TendermintRequestStatus.prototype = {}; @@ -43308,7 +45153,7 @@ $async$temp1 = A; $async$temp2 = request; $async$goto = 3; - return A._asyncAwait($async$self.rpc.$get$2(request.toRequest$1(++$async$self._provider3$_id), timeout), $async$requestDynamic$2); + return A._asyncAwait($async$self.rpc.$get$2(request.toRequest$1(++$async$self._provider5$_id), timeout), $async$requestDynamic$2); case 3: // returning from await. $async$returnValue = $async$temp1.TendermintProvider__findError($async$temp2, $async$result); @@ -43363,7 +45208,7 @@ call$1(e) { return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(e), type$.String, type$.dynamic); }, - $signature: 20 + $signature: 26 }; A.BaseClient.prototype = { _sendUnstreamed$5(method, url, headers, body, encoding) { @@ -43419,13 +45264,13 @@ call$2(key1, key2) { return A._asString(key1).toLowerCase() === A._asString(key2).toLowerCase(); }, - $signature: 211 + $signature: 277 }; A.BaseRequest_closure0.prototype = { call$1(key) { return B.JSString_methods.get$hashCode(A._asString(key).toLowerCase()); }, - $signature: 210 + $signature: 273 }; A.BaseResponse.prototype = { BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(statusCode, contentLength, headers, isRedirect, persistentConnection, reasonPhrase, request) { @@ -43538,14 +45383,14 @@ t2.BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(t3, t4, t6, false, true, t1, t5); _this.completer.complete$1(t2); }, - $signature: 29 + $signature: 35 }; A.BrowserClient_send_closure0.prototype = { call$1(_) { type$.JSObject._as(_); this.completer.completeError$2(new A.ClientException("XMLHttpRequest error.", this.request.url), A.StackTrace_current()); }, - $signature: 29 + $signature: 35 }; A.ByteStream.prototype = { toBytes$0() { @@ -43560,7 +45405,7 @@ call$1(bytes) { return this.completer.complete$1(new Uint8Array(A._ensureNativeList(type$.List_int._as(bytes)))); }, - $signature: 208 + $signature: 267 }; A.ClientException.prototype = { toString$0(_) { @@ -43572,9 +45417,9 @@ A.Request.prototype = { get$encoding() { var t1, t2, _this = this; - if (_this.get$_contentType() == null || !_this.get$_contentType().parameters._map.containsKey$1("charset")) + if (_this.get$_contentType() == null || !_this.get$_contentType().parameters._collection$_map.containsKey$1("charset")) return _this._defaultEncoding; - t1 = _this.get$_contentType().parameters._map.$index(0, "charset"); + t1 = _this.get$_contentType().parameters._collection$_map.$index(0, "charset"); t1.toString; t2 = A.Encoding_getByName(t1); return t2 == null ? A.throwExpression(A.FormatException$('Unsupported encoding "' + t1 + '".', null, null)) : t2; @@ -43588,7 +45433,7 @@ if (contentType == null) { t1 = type$.String; _this.set$_contentType(A.MediaType$("text", "plain", A.LinkedHashMap_LinkedHashMap$_literal(["charset", _this.get$encoding().get$name()], t1, t1))); - } else if (!contentType.parameters._map.containsKey$1("charset")) { + } else if (!contentType.parameters._collection$_map.containsKey$1("charset")) { t1 = type$.String; _this.set$_contentType(contentType.change$1$parameters(A.LinkedHashMap_LinkedHashMap$_literal(["charset", _this.get$encoding().get$name()], t1, t1))); } @@ -43610,7 +45455,7 @@ }; A.Response.prototype = { get$body() { - return A.encodingForCharset(A._contentTypeForHeaders(this.headers).parameters._map.$index(0, "charset")).decode$1(this.bodyBytes); + return A.encodingForCharset(A._contentTypeForHeaders(this.headers).parameters._collection$_map.$index(0, "charset")).decode$1(this.bodyBytes); } }; A.StreamedResponse.prototype = {}; @@ -43620,7 +45465,7 @@ call$1(key) { return A._asString(key).toLowerCase(); }, - $signature: 15 + $signature: 16 }; A.MediaType.prototype = { change$1$parameters(parameters) { @@ -43639,7 +45484,7 @@ buffer._contents = t1; buffer._contents = t1 + this.subtype; t1 = this.parameters; - t1._map.forEach$1(0, t1.$ti._eval$1("~(1,2)")._as(new A.MediaType_toString_closure(buffer))); + t1._collection$_map.forEach$1(0, t1.$ti._eval$1("~(1,2)")._as(new A.MediaType_toString_closure(buffer))); t1 = buffer._contents; return t1.charCodeAt(0) == 0 ? t1 : t1; } @@ -43704,7 +45549,7 @@ scanner.expectDone$0(); return A.MediaType$(t4, t5, parameters); }, - $signature: 206 + $signature: 265 }; A.MediaType_toString_closure.prototype = { call$2(attribute, value) { @@ -43724,13 +45569,13 @@ } else t1._contents = t3 + value; }, - $signature: 205 + $signature: 262 }; A.MediaType_toString__closure.prototype = { call$1(match) { return "\\" + A.S(match.$index(0, 0)); }, - $signature: 54 + $signature: 56 }; A.expectQuotedString_closure.prototype = { call$1(match) { @@ -43738,7 +45583,7 @@ t1.toString; return t1; }, - $signature: 54 + $signature: 56 }; A.MRTNativePluginException.prototype = { toString$0(_) { @@ -43748,19 +45593,19 @@ }; A.AppPlatform.prototype = { _enumToString$0() { - return "AppPlatform." + this._name; + return "AppPlatform." + this._core$_name; } }; A.WalletEventTypes.prototype = { _enumToString$0() { - return "WalletEventTypes." + this._name; + return "WalletEventTypes." + this._core$_name; } }; A.WalletEventTypes_fromName_closure.prototype = { call$1(e) { - return type$.WalletEventTypes._as(e)._name === this.name; + return type$.WalletEventTypes._as(e)._core$_name === this.name; }, - $signature: 203 + $signature: 258 }; A.WalletEventTypes_fromName_closure0.prototype = { call$0() { @@ -43771,7 +45616,7 @@ A.WalletEvent.prototype = { toJson$0() { var _this = this; - return A.LinkedHashMap_LinkedHashMap$_literal(["client_id", _this.clientId, "data", _this.data, "request_id", _this.requestId, "type", _this.type._name, "additional", _this.additional], type$.String, type$.dynamic); + return A.LinkedHashMap_LinkedHashMap$_literal(["client_id", _this.clientId, "data", _this.data, "request_id", _this.requestId, "type", _this.type._core$_name, "additional", _this.additional], type$.String, type$.dynamic); } }; A.MrtPlatformInterface.prototype = {}; @@ -43779,7 +45624,7 @@ call$1(e) { return A._asString(e); }, - $signature: 15 + $signature: 16 }; A.WebEventStream_stream_closure.prototype = { call$1($event) { @@ -43787,13 +45632,13 @@ t1 = t1 == null ? null : A.dartify(t1); this.controller.add$1(0, this.T._as(t1)); }, - $signature: 29 + $signature: 35 }; A.WebEventStream_stream_closure0.prototype = { call$0() { this._this.removeEventListener(this.type, this.callback); }, - $signature: 14 + $signature: 15 }; A.MrtNativeWeb.prototype = {}; A.ApiProviderException.prototype = { @@ -43933,7 +45778,7 @@ A._LiveListenable_Object__LiveListenable.prototype = {}; A.ContentType.prototype = { _enumToString$0() { - return "ContentType." + this._name; + return "ContentType." + this._core$_name; }, get$value() { return this.value; @@ -43943,13 +45788,13 @@ call$1(element) { return type$.ContentType._as(element).value === this.value; }, - $signature: 201 + $signature: 252 }; A.ContentType_fromValue_closure0.prototype = { call$0() { throw A.wrapException($.$get$WalletExceptionConst_dataVerificationFailed()); }, - $signature: 196 + $signature: 242 }; A.APPImage.prototype = { toCbor$0() { @@ -44096,13 +45941,13 @@ t1.last = null; t2.complete$0(); }, - $signature: 1 + $signature: 0 }; A.SynchronizedLock_synchronized_closure.prototype = { call$1(_) { this.complete.call$0(); }, - $signature: 24 + $signature: 32 }; A.MethodUtils_call_closure.prototype = { call$1$0($T) { @@ -44134,7 +45979,7 @@ call$1(match) { return "_" + match.group$1(0).toLowerCase(); }, - $signature: 54 + $signature: 56 }; A.WebsocketWeb.prototype = { WebsocketWeb$_$1(_socket) { @@ -44157,25 +46002,25 @@ t2.cancel$0(); t1._onOpen = null; }, - $signature: 17 + $signature: 19 }; A.WebsocketWeb$__closure0.prototype = { call$1($event) { this.$this._streamController.add$1(0, $event); }, - $signature: 17 + $signature: 19 }; A.WebsocketWeb$__closure1.prototype = { call$1($event) { this.$this._streamController.close$0(); }, - $signature: 17 + $signature: 19 }; A.WebsocketWeb_connect_closure.prototype = { call$1(_) { this.completer.complete$1(A.WebsocketWeb$_(this.socket)); }, - $signature: 195 + $signature: 239 }; A.CustomCoins.prototype = { get$coinName() { @@ -44195,7 +46040,7 @@ call$1(element) { return type$.CustomCoins._as(element).name === this.name; }, - $signature: 194 + $signature: 237 }; A.CustomProposal.prototype = { get$specName() { @@ -44216,7 +46061,7 @@ call$0() { return this.call$1(null); }, - $signature: 121 + $signature: 77 }; A.CustomCurrencyConf_byronLegacyTestnet_closure.prototype = { call$1(kwargs) { @@ -44225,18 +46070,18 @@ call$0() { return this.call$1(null); }, - $signature: 121 + $signature: 77 }; A.AddressDerivationType.prototype = { _enumToString$0() { - return "AddressDerivationType." + this._name; + return "AddressDerivationType." + this._core$_name; } }; A.AddressDerivationType_fromTag_closure.prototype = { call$1(e) { return A.BytesUtils_bytesEqual(type$.AddressDerivationType._as(e).tag, this.tag); }, - $signature: 193 + $signature: 232 }; A.AddressDerivationType_fromTag_closure0.prototype = { call$0() { @@ -44268,7 +46113,7 @@ call$1(element) { return A._asIntQ(element) != null; }, - $signature: 192 + $signature: 223 }; A.Bip32AddressIndex__toPath_closure0.prototype = { call$1(e) { @@ -44276,7 +46121,7 @@ e.toString; return A.Bip32KeyIndex_Bip32KeyIndex(e); }, - $signature: 191 + $signature: 215 }; A.MultiSigAddressIndex.prototype = { toCbor$0() { @@ -44311,14 +46156,14 @@ A.BrowserCryptoWorker.prototype = {}; A.SeedTypes.prototype = { _enumToString$0() { - return "SeedTypes." + this._name; + return "SeedTypes." + this._core$_name; } }; A.SeedTypes_fromName_closure.prototype = { call$1(e) { return type$.SeedTypes._as(e).name === this.name; }, - $signature: 190 + $signature: 214 }; A.SeedTypes_fromName_closure0.prototype = { call$0() { @@ -44332,7 +46177,7 @@ type$.NetworkType._as(e); return A.BytesUtils_bytesEqual(this._box_0.tag, e.tag); }, - $signature: 126 + $signature: 78 }; A.NetworkType_fromTag_closure0.prototype = { call$0() { @@ -44344,7 +46189,7 @@ call$1(e) { return type$.NetworkType._as(e).name === this.name; }, - $signature: 126 + $signature: 78 }; A.NetworkType_fromName_closure0.prototype = { call$0() { @@ -44355,7 +46200,7 @@ A.BaseRepository.prototype = {}; A.NodeClientStatus.prototype = { _enumToString$0() { - return "NodeClientStatus." + this._name; + return "NodeClientStatus." + this._core$_name; } }; A.NetworkClient.prototype = { @@ -44474,7 +46319,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 189 + $signature: 212 }; A.NetworkClient_init_closure.prototype = { call$0() { @@ -44503,7 +46348,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 181 + $signature: 207 }; A._NetworkClient_Object_BaseRepository.prototype = {}; A.BitcoinElectrumClient.prototype = { @@ -44612,7 +46457,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 56 + $signature: 55 }; A.BitcoinExplorerApiProvider.prototype = { get$service() { @@ -44774,7 +46619,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 157 + $signature: 204 }; A.EthereumClient.prototype = { get$service() { @@ -44943,7 +46788,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 131 + $signature: 80 }; A.RippleClient.prototype = { get$service() { @@ -45006,7 +46851,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 156 + $signature: 197 }; A.SolanaClient.prototype = { get$service() { @@ -45096,7 +46941,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 56 + $signature: 55 }; A.SubstrateClient.prototype = { get$service() { @@ -45246,7 +47091,7 @@ A._asInt(a); return B.JSInt_methods.compareTo$1(A._asInt(b), a); }, - $signature: 26 + $signature: 25 }; A._SubstrateClient_NetworkClient_SubstrateRepository.prototype = {}; A.SubstrateGetApiAt.prototype = { @@ -45254,7 +47099,7 @@ return "state_call"; }, toJson$0() { - return ["Metadata_metadata_at_version", A.BytesUtils_toHexString(A.IntegerLayout$(4, B.C_Endian0, null, false).serialize$1(this.version), true, "0x"), null]; + return ["Metadata_metadata_at_version", A.BytesUtils_toHexString(A.IntegerLayout$(4, B.C_Endian, null, false).serialize$1(this.version), true, "0x"), null]; }, onResonse$1(result) { var toBytes, decode, api, t1, exception, _null = null; @@ -45382,7 +47227,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 154 + $signature: 196 }; A.TronClient.prototype = { get$service() { @@ -45473,7 +47318,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 56 + $signature: 55 }; A._TronClient_NetworkClient_CryptoWokerImpl.prototype = {}; A.TronRequestGetAccountInfo.prototype = { @@ -45502,7 +47347,7 @@ $.$get$PlatformInterface_instance(); return B.JSArray_methods.contains$1(t1, B.AppPlatform_1); }, - $signature: 59 + $signature: 81 }; A.ProvidersConst_getDefaultService_closure0.prototype = { call$1(element) { @@ -45511,13 +47356,13 @@ t1 = this.service; return element.serviceName === t1.serviceName && element.get$protocol() === t1.get$protocol(); }, - $signature: 59 + $signature: 81 }; A.ProvidersConst_getDefaultService_closure1.prototype = { call$0() { return B.JSArray_methods.get$first(this.networkServices); }, - $signature: 135 + $signature: 82 }; A.APIProvider.prototype = { toProvider$1$0($T) { @@ -45537,7 +47382,7 @@ A._APIProvider_Object_Equatable_CborSerializable.prototype = {}; A.BitcoinExplorerProviderType.prototype = { _enumToString$0() { - return "BitcoinExplorerProviderType." + this._name; + return "BitcoinExplorerProviderType." + this._core$_name; }, get$type() { if (this === B.BitcoinExplorerProviderType_0) @@ -45547,9 +47392,9 @@ }; A.BitcoinExplorerProviderType_fromName_closure.prototype = { call$1(element) { - return type$.BitcoinExplorerProviderType._as(element)._name === this.name; + return type$.BitcoinExplorerProviderType._as(element)._core$_name === this.name; }, - $signature: 153 + $signature: 195 }; A.BitcoinExplorerProviderType_fromName_closure0.prototype = { call$0() { @@ -45711,7 +47556,7 @@ call$1(element) { return type$.ApiRequest._as(element).error == null; }, - $signature: 143 + $signature: 193 }; A.HTTPService.prototype = { get$protocol() { @@ -45793,7 +47638,7 @@ response = null; $async$handler = 4; $async$goto = 7; - return A._asyncAwait($async$self._callSynchronized$1$2$allowStatus(new A.HTTPService_providerPOST_closure($async$self, url, headers, params, timeout), allowStatus, $T._eval$1("0?")), $async$providerPOST$1$5$allowStatus$headers$timeout); + return A._asyncAwait($async$self._callSynchronized$1$2$allowStatus(new A.HTTPService_providerPOST_closure($async$self, url, headers, params, timeout), allowStatus, $T), $async$providerPOST$1$5$allowStatus$headers$timeout); case 7: // returning from await. response = $async$result; @@ -45967,7 +47812,7 @@ response = $async$result; if (!B.JSArray_methods.contains$1(allowStatus, response.statusCode)) { t1 = response; - decode = A.StringUtils_tryToJson(A.encodingForCharset(A._contentTypeForHeaders(t1.headers).parameters._map.$index(0, "charset")).decode$1(t1.bodyBytes), type$.dynamic); + decode = A.StringUtils_tryToJson(A.encodingForCharset(A._contentTypeForHeaders(t1.headers).parameters._collection$_map.$index(0, "charset")).decode$1(t1.bodyBytes), type$.dynamic); map = type$.nullable_Map_String_dynamic._is(decode) ? decode : null; t1 = response.statusCode; t2 = map == null ? response.get$body() : null; @@ -46062,7 +47907,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.HTTPService_providerPOST_closure.prototype = { call$0() { @@ -46108,7 +47953,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 139 + $signature: 83 }; A.HTTPService_providerGET_closure.prototype = { call$0() { @@ -46155,7 +48000,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 139 + $signature: 83 }; A.BaseSocketService.prototype = { providerCaller$2(t, param) { @@ -46419,7 +48264,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.SSLService_connect__closure.prototype = { call$0() { @@ -46452,13 +48297,13 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 315 + $signature: 192 }; A.SSLService_connect___closure.prototype = { call$1(certificate) { return true; }, - $signature: 66 + $signature: 79 }; A.SSLService_post_closure.prototype = { call$0() { @@ -46491,7 +48336,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 45 + $signature: 54 }; A.TCPService.prototype = { get$isConnected() { @@ -46597,7 +48442,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.TCPService_connect__closure.prototype = { call$0() { @@ -46630,7 +48475,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 229 + $signature: 181 }; A.TCPService_post_closure.prototype = { call$0() { @@ -46663,7 +48508,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 45 + $signature: 54 }; A.WebSocketService.prototype = { get$isConnected() { @@ -46779,7 +48624,7 @@ A.WebSocketService__onClose_closure.prototype = { call$1(e) { }, - $signature: 24 + $signature: 32 }; A.WebSocketService_connect_closure.prototype = { call$0() { @@ -46829,7 +48674,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.WebSocketService_connect__closure.prototype = { call$0() { @@ -46858,7 +48703,7 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 144 + $signature: 156 }; A.WebSocketService_addMessage_closure.prototype = { call$0() { @@ -46895,18 +48740,18 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 45 + $signature: 54 }; A.ProviderAuthType.prototype = { _enumToString$0() { - return "ProviderAuthType." + this._name; + return "ProviderAuthType." + this._core$_name; } }; A.ProviderAuthType_fromName_closure.prototype = { call$1(e) { - return type$.ProviderAuthType._as(e)._name === this.name; + return type$.ProviderAuthType._as(e)._core$_name === this.name; }, - $signature: 145 + $signature: 154 }; A.ProviderAuthType_fromName_closure0.prototype = { call$0() { @@ -46922,7 +48767,7 @@ A._ProviderAuth_Object_CborSerializable.prototype = {}; A.ServiceProtocol.prototype = { _enumToString$0() { - return "ServiceProtocol." + this._name; + return "ServiceProtocol." + this._core$_name; }, get$platforms() { switch (this) { @@ -46944,18 +48789,18 @@ call$1(element) { return type$.ServiceProtocol._as(element).id === this.id; }, - $signature: 146 + $signature: 153 }; A.ApiRequest.prototype = {}; A.SocketRequestCompeleter.prototype = {}; A.SocketStatus.prototype = { _enumToString$0() { - return "SocketStatus." + this._name; + return "SocketStatus." + this._core$_name; } }; A.APIServiceStatus.prototype = { _enumToString$0() { - return "APIServiceStatus." + this._name; + return "APIServiceStatus." + this._core$_name; } }; A.EthereumSubscribeResult.prototype = { @@ -47553,7 +49398,7 @@ call$0() { return this.i.call$1(this.result); }, - $signature: 1 + $signature: 0 }; A.EthereumWebsocketService_onMessge_closure.prototype = { call$0() { @@ -47780,7 +49625,7 @@ A._ISubstrateAddress_ChainAccount_Equatable.prototype = {}; A.ITonAddress.prototype = { get$variabels() { - return [this.keyIndex, this.network]; + return [this.keyIndex, this.network, this.context]; } }; A.ITonAddress_ITonAddress$fromCborBytesOrObject_closure.prototype = { @@ -47823,13 +49668,13 @@ call$1(e) { return A.TronTRC20Token_TronTRC20Token$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 136 + $signature: 125 }; A.ITronAddress_ITronAddress$fromCborBytesOrObject_closure0.prototype = { call$1(e) { return A.TronTRC10Token_TronTRC10Token$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 133 + $signature: 145 }; A.ITronMultisigAddress.prototype = { get$variabels() { @@ -47840,13 +49685,13 @@ call$1(e) { return A.TronTRC20Token_TronTRC20Token$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 136 + $signature: 125 }; A.ITronMultisigAddress_ITronMultisigAddress$fromCborBytesOrObject_closure0.prototype = { call$1(e) { return A.TronTRC10Token_TronTRC10Token$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 133 + $signature: 145 }; A._ITronAddress_ChainAccount_Equatable.prototype = {}; A.RippleMultiSigSignerDetais.prototype = { @@ -47882,13 +49727,13 @@ call$1(e) { return A.RippleIssueToken_RippleIssueToken$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 132 + $signature: 144 }; A.IXRPAddress_IXRPAddress$fromCborBytesOrObject_closure0.prototype = { call$1(e) { return A.RippleNFToken_RippleNFToken$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 130 + $signature: 143 }; A.IXRPMultisigAddress.prototype = { get$variabels() { @@ -47900,18 +49745,18 @@ call$1(e) { return A.RippleIssueToken_RippleIssueToken$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 132 + $signature: 144 }; A.IXRPMultisigAddress_IXRPMultisigAddress$fromCborBytesOrObject_closure0.prototype = { call$1(e) { return A.RippleNFToken_RippleNFToken$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 130 + $signature: 143 }; A._IXRPAddress_ChainAccount_Equatable.prototype = {}; A.Chain.prototype = { getWeb3Provider$1$requestTimeout(requestTimeout) { - var cl = this._client, + var cl = this._chain$_client, t1 = cl == null ? null : cl.get$service().get$provider().allowInWeb3; if (t1 === true) return cl; @@ -47930,7 +49775,7 @@ t1.toString; return A.APIProvider_APIProvider$fromCborBytesOrObject(t1, A.ExtractCborList_getCborTag(this.values, 7)); }, - $signature: 135 + $signature: 82 }; A.ADAChain.prototype = {}; A.ADAChain_ADAChain$deserialize_closure.prototype = { @@ -48010,14 +49855,14 @@ }, $signature: 170 }; - A.TonChain.prototype = {}; - A.TonChain_TonChain$deserialize_closure.prototype = { + A.TheOpenNetworkChain.prototype = {}; + A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure.prototype = { call$0() { return A.CryptoAddress_fromCbor(this.network, this.i).cast$1$0(0, type$.ITonAddress); }, $signature: 171 }; - A.TonChain_TonChain$deserialize_closure0.prototype = { + A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure0.prototype = { call$1(e) { return A.ContactCore_fromCborBytesOrObject(this.network, type$.nullable_CborObject._as(e), type$.TonAddress); }, @@ -48422,7 +50267,7 @@ call$1(e) { return A.EthereumAPIProvider_EthereumAPIProvider$fromCborBytesOrObject(null, type$.nullable_CborObject._as(e)); }, - $signature: 128 + $signature: 142 }; A.RippleNetworkParams.prototype = { updateProviders$1(updateProviders) { @@ -48494,7 +50339,7 @@ call$1(e) { return A.EthereumAPIProvider_EthereumAPIProvider$fromCborBytesOrObject(null, type$.nullable_CborObject._as(e)); }, - $signature: 128 + $signature: 142 }; A.CardanoAddrDetails.prototype = { toAddress$2(coin, testnet) { @@ -48572,12 +50417,12 @@ A.EIP712Domain.prototype = {}; A.SolanaWeb3TransactionResponseType.prototype = { _enumToString$0() { - return "SolanaWeb3TransactionResponseType." + this._name; + return "SolanaWeb3TransactionResponseType." + this._core$_name; } }; A.SolanaWeb3TransactionResponseType_fromName_closure.prototype = { call$1(e) { - return type$.SolanaWeb3TransactionResponseType._as(e)._name === this.name; + return type$.SolanaWeb3TransactionResponseType._as(e)._core$_name === this.name; }, $signature: 188 }; @@ -48608,6 +50453,118 @@ return A.LinkedHashMap_LinkedHashMap$_literal(["id", _this.id, "type", "send", "tx_id", _this.txHash, "signer", _this.signer, "signerAddressBytes", _this.signerAddressBytes], type$.String, type$.dynamic); } }; + A.TonAccountContextType.prototype = { + _enumToString$0() { + return "TonAccountContextType." + this._core$_name; + } + }; + A.TonAccountContextType_fromTag_closure.prototype = { + call$1(e) { + return A.BytesUtils_bytesEqual(type$.TonAccountContextType._as(e).tag, this.tag); + }, + $signature: 189 + }; + A.TonAccountContextType_fromTag_closure0.prototype = { + call$0() { + return A.throwExpression($.$get$WalletExceptionConst_invalidAccountDetails()); + }, + $signature: 2 + }; + A.TonAccountContext.prototype = {}; + A.TonAccountLegacyContext.prototype = { + toWalletContract$2$chain$publicKey(chain, publicKey) { + var _0_0, state, t1, _this = this; + type$.List_int._as(publicKey); + _0_0 = _this.version; + $label0$0: { + if (B.WalletVersion_v1R1_1 === _0_0) { + state = A.NoneSubWalletVersionedWalletState$(publicKey, B.WalletVersion_v1R1_1); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV1R1(state); + break $label0$0; + } + if (B.WalletVersion_v1R2_1 === _0_0) { + state = A.NoneSubWalletVersionedWalletState$(publicKey, B.WalletVersion_v1R2_1); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV1R2(state); + break $label0$0; + } + if (B.WalletVersion_v1R3_1 === _0_0) { + state = A.NoneSubWalletVersionedWalletState$(publicKey, B.WalletVersion_v1R3_1); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV1R3(state); + break $label0$0; + } + if (B.WalletVersion_v2R1_2 === _0_0) { + state = A.NoneSubWalletVersionedWalletState$(publicKey, B.WalletVersion_v2R1_2); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV2R1(state); + break $label0$0; + } + if (B.WalletVersion_v2R2_2 === _0_0) { + state = A.NoneSubWalletVersionedWalletState$(publicKey, B.WalletVersion_v2R2_2); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV2R2(state); + break $label0$0; + } + t1 = A.throwExpression($.$get$WalletExceptionConst_invalidAccountDetails()); + } + return t1; + }, + get$variabels() { + return [this.version.name]; + } + }; + A.TonAccountSubWalletContext.prototype = { + toWalletContract$2$chain$publicKey(chain, publicKey) { + var _0_0, state, t1, _this = this; + type$.List_int._as(publicKey); + _0_0 = _this.version; + $label0$0: { + if (B.WalletVersion_v3R1_3 === _0_0) { + state = A.SubWalletVersionedWalletState$(publicKey, _this.subwalletId, B.WalletVersion_v3R1_3); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV3R1(state); + break $label0$0; + } + if (B.WalletVersion_v3R2_3 === _0_0) { + state = A.SubWalletVersionedWalletState$(publicKey, _this.subwalletId, B.WalletVersion_v3R2_3); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV3R2(state); + break $label0$0; + } + if (B.WalletVersion_v4_4 === _0_0) { + state = A.SubWalletVersionedWalletState$(publicKey, _this.subwalletId, B.WalletVersion_v4_4); + A.TonAddress_TonAddress$fromState(_this.bouncable, state.initialState$0(), chain.workchain); + t1 = new A.WalletV4(state); + break $label0$0; + } + t1 = A.throwExpression($.$get$WalletExceptionConst_invalidAccountDetails()); + } + return t1; + }, + get$variabels() { + return [this.version.name, this.subwalletId]; + } + }; + A.TonAccountV5CustomContext.prototype = { + toWalletContract$2$chain$publicKey(chain, publicKey) { + return A.WalletV5R1_WalletV5R1$create(this.bouncable, chain, new A.V5R1CustomContext(this.walletId, chain), type$.List_int._as(publicKey)); + }, + get$variabels() { + return [this.version.name, this.walletId]; + } + }; + A.TonAccountV5SubWalletContext.prototype = { + toWalletContract$2$chain$publicKey(chain, publicKey) { + return A.WalletV5R1_WalletV5R1$create(this.bouncable, chain, new A.V5R1ClientContext(this.subwalletId, chain), type$.List_int._as(publicKey)); + }, + get$variabels() { + return [this.version.name, this.subwalletId]; + } + }; + A._TonAccountContext_Object_CborSerializable.prototype = {}; + A._TonAccountContext_Object_CborSerializable_Equatable.prototype = {}; A.TronAccountResourceInfo.prototype = { toString$0(_) { var t8, t9, t10, t11, t12, _this = this, @@ -48638,14 +50595,14 @@ A._TronAccountResourceInfo_Object_CborSerializable.prototype = {}; A.TronChainType.prototype = { _enumToString$0() { - return "TronChainType." + this._name; + return "TronChainType." + this._core$_name; } }; A.TronChainType_fromName_closure.prototype = { call$1(e) { - return type$.TronChainType._as(e)._name === this.lower; + return type$.TronChainType._as(e)._core$_name === this.lower; }, - $signature: 55 + $signature: 52 }; A.TronChainType_fromName_closure0.prototype = { call$0() { @@ -48657,7 +50614,7 @@ call$1(e) { return type$.TronChainType._as(e).id === this.id; }, - $signature: 55 + $signature: 52 }; A.TronChainType_fromId_closure0.prototype = { call$0() { @@ -48669,7 +50626,7 @@ call$1(e) { return type$.TronChainType._as(e).genesisBlockNumber === this.id; }, - $signature: 55 + $signature: 52 }; A.TronChainType_fromGenesis_closure0.prototype = { call$0() { @@ -48689,13 +50646,13 @@ t1 = type$.BigInt; return new A.FrozenSupply(A.ExtractCborList_elementAt(cbor, 0, t1), A.ExtractCborList_elementAt(cbor, 1, t1)); }, - $signature: 125 + $signature: 141 }; A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure0.prototype = { call$1(e) { return A.AccountPermission_AccountPermission$fromCborBytesOrObject(type$.nullable_CborObject._as(e)); }, - $signature: 124 + $signature: 140 }; A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure1.prototype = { call$1(e) { @@ -48704,7 +50661,7 @@ t1.toString; return new A.FrozenV2(A.ExtractCborList_elementAt(cbor, 0, type$.BigInt), t1); }, - $signature: 123 + $signature: 138 }; A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure2.prototype = { call$1(e) { @@ -48712,34 +50669,34 @@ t1 = type$.BigInt; return new A.UnfrozenV2(A.ExtractCborList_elementAt(cbor, 0, type$.nullable_String), A.ExtractCborList_elementAt(cbor, 1, t1), A.ExtractCborList_elementAt(cbor, 2, t1)); }, - $signature: 122 + $signature: 137 }; A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure3.prototype = { call$1(e) { var cbor = A.CborSerializable_decodeCborTags(null, type$.nullable_CborObject._as(e), B.List_200_195_100_3, type$.CborListValue_dynamic); return new A.AssetV2(A.ExtractCborList_elementAt(cbor, 0, type$.String), A.ExtractCborList_elementAt(cbor, 1, type$.BigInt)); }, - $signature: 120 + $signature: 136 }; A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure4.prototype = { call$1(e) { var cbor = A.CborSerializable_decodeCborTags(null, type$.nullable_CborObject._as(e), B.List_200_195_100_2, type$.CborListValue_dynamic); return new A.FreeAssetNetUsageV2(A.ExtractCborList_elementAt(cbor, 0, type$.String), A.ExtractCborList_elementAt(cbor, 1, type$.BigInt)); }, - $signature: 119 + $signature: 133 }; A.TronAccountInfo_TronAccountInfo$fromJson_closure.prototype = { call$1(supply) { type$.Map_String_dynamic._as(supply); return new A.FrozenSupply(A._BigIntImpl__BigIntImpl$from(A._asNum(supply.$index(0, "frozen_balance"))), A._BigIntImpl__BigIntImpl$from(A._asNum(supply.$index(0, "expire_time")))); }, - $signature: 125 + $signature: 141 }; A.TronAccountInfo_TronAccountInfo$fromJson_closure0.prototype = { call$1(permission) { return A.AccountPermission_AccountPermission$fromJson(type$.Map_String_dynamic._as(permission)); }, - $signature: 124 + $signature: 140 }; A.TronAccountInfo_TronAccountInfo$fromJson_closure1.prototype = { call$1(frozen) { @@ -48752,28 +50709,28 @@ t2.toString; return new A.FrozenV2(t1, t2); }, - $signature: 123 + $signature: 138 }; A.TronAccountInfo_TronAccountInfo$fromJson_closure2.prototype = { call$1(unfrozen) { type$.Map_String_dynamic._as(unfrozen); return new A.UnfrozenV2(A._asStringQ(unfrozen.$index(0, "type")), A.BigintUtils_parse(unfrozen.$index(0, "unfreeze_amount")), A.BigintUtils_parse(unfrozen.$index(0, "unfreeze_expire_time"))); }, - $signature: 122 + $signature: 137 }; A.TronAccountInfo_TronAccountInfo$fromJson_closure3.prototype = { call$1(asset) { type$.Map_String_dynamic._as(asset); return new A.AssetV2(A._asString(asset.$index(0, "key")), A.BigintUtils_parse(asset.$index(0, "value"))); }, - $signature: 120 + $signature: 136 }; A.TronAccountInfo_TronAccountInfo$fromJson_closure4.prototype = { call$1(usage) { type$.Map_String_dynamic._as(usage); return new A.FreeAssetNetUsageV2(A._asString(usage.$index(0, "key")), A.BigintUtils_parse(usage.$index(0, "value"))); }, - $signature: 119 + $signature: 133 }; A.AccountPermission.prototype = { toString$0(_) { @@ -48786,14 +50743,14 @@ var cbor = A.CborSerializable_decodeCborTags(null, type$.nullable_CborObject._as(e), B.List_200_195_100_7, type$.CborListValue_dynamic); return new A.PermissionKeys(A.TronAddress_TronAddress(A.ExtractCborList_elementAt(cbor, 0, type$.String)), A.ExtractCborList_elementAt(cbor, 1, type$.BigInt)); }, - $signature: 118 + $signature: 132 }; A.AccountPermission_AccountPermission$fromJson_closure.prototype = { call$1(e) { type$.Map_String_dynamic._as(e); return new A.PermissionKeys(A.TronAddress_TronAddress(A._asString(e.$index(0, "address"))), A.BigintUtils_parse(e.$index(0, "weight"))); }, - $signature: 118 + $signature: 132 }; A.PermissionKeys.prototype = { toString$0(_) { @@ -48922,7 +50879,7 @@ t1 = type$.nullable_String; return new A.CoingeckoCoin(A.ExtractCborList_elementAt(cbor, 0, type$.String), A.ExtractCborList_elementAt(cbor, 1, t1), A.ExtractCborList_elementAt(cbor, 2, t1)); }, - $signature: 197 + $signature: 198 }; A._Token_Object_CborSerializable.prototype = {}; A._Token_Object_CborSerializable_Equatable.prototype = {}; @@ -48936,7 +50893,7 @@ call$1(e) { return A.Chain_Chain$deserialize(this.id, type$.nullable_CborObject._as(e), type$.APIProvider, type$.NetworkCoinParams_APIProvider, type$.dynamic, type$.TokenCore_dynamic, type$.NFTCore, type$.ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore, type$.WalletNetwork_NetworkCoinParams_APIProvider, type$.NetworkClient_of_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_APIProvider); }, - $signature: 198 + $signature: 199 }; A._ChainsHandler_Object_CborSerializable.prototype = {}; A.Web3RequestException.prototype = { @@ -48946,7 +50903,7 @@ }, toResponseMessage$1$requestId(requestId) { var _this = this; - return new A.Web3ExceptionMessage(_this.message, _this.code, _this.walletCode, _this.data, requestId, A.StringUtils_tryFromJson(null)); + return new A.Web3ExceptionMessage(_this.message, _this.code, _this.walletCode, _this.data); }, toResponseMessage$0() { return this.toResponseMessage$1$requestId(null); @@ -48958,12 +50915,11 @@ }; A.Web3ChainMessage.prototype = { toCbor$0() { - var _this = this, - t1 = _this.authenticated.toCbor$0(), - t2 = _this.response; - t2 = t2 == null ? null : t2.toCbor$0(); - t2 = A._setArrayType([new A.CborBytesValue(_this.message), t1, t2], type$.JSArray_nullable_CborObject); - return new A.CborTagValue(A.List_List$unmodifiable(_this.type.tag, type$.int), new A.CborListValue(t2, true, type$.CborListValue_nullable_CborObject), type$.CborTagValue_dynamic); + var t1 = A._setArrayType([new A.CborBytesValue(this.message), this.authenticated.toCbor$0()], type$.JSArray_CborObject); + return new A.CborTagValue(A.List_List$unmodifiable(this.type.tag, type$.int), new A.CborListValue(t1, true, type$.CborListValue_CborObject), type$.CborTagValue_dynamic); + }, + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["type", this.type._core$_name], type$.String, type$.dynamic); }, get$type() { return this.type; @@ -48979,13 +50935,11 @@ A.Web3ExceptionMessage.prototype = { toCbor$0() { var _this = this; - return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_15, type$.int), new A.CborListValue([_this.message, _this.code, _this.walletCode, _this.data, _this.request, _this.requestId], true, type$.CborListValue_nullable_Object), type$.CborTagValue_dynamic); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_15, type$.int), new A.CborListValue([_this.message, _this.code, _this.walletCode, _this.data], true, type$.CborListValue_nullable_Object), type$.CborTagValue_dynamic); }, toJson$0() { var _this = this, - t1 = _this.request; - t1 = t1 == null ? null : A.StringUtils_tryToJson(t1, type$.dynamic); - t1 = A.LinkedHashMap_LinkedHashMap$_literal(["message", _this.message, "code", _this.code, "walletCode", _this.walletCode, "data", _this.data, "request", t1, "requestId", _this.requestId], type$.String, type$.dynamic); + t1 = A.LinkedHashMap_LinkedHashMap$_literal(["message", _this.message, "code", _this.code, "walletCode", _this.walletCode, "data", _this.data], type$.String, type$.dynamic); t1.removeWhere$1(0, new A.Web3ExceptionMessage_toJson_closure()); return t1; }, @@ -48998,7 +50952,7 @@ A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.Web3ResponseMessage.prototype = { toCbor$0() { @@ -49007,12 +50961,39 @@ }, get$type() { return B.Web3MessageTypes_List_100_13_response; + }, + resultAsList$1$1$length($length, $T) { + var list, t1, exception; + try { + list = J.cast$1$0$ax(type$.List_dynamic._as(this.result), $T); + t1 = J.sublist$2$ax(list, 0, $length); + return t1; + } catch (exception) { + throw A.wrapException(B.Web3RequestException_chs); + } + }, + resultAsMap$0() { + var t1, exception; + try { + t1 = type$.Map_dynamic_dynamic._as(this.result).cast$2$0(0, type$.String, type$.dynamic); + return t1; + } catch (exception) { + throw A.wrapException(B.Web3RequestException_chs); + } + }, + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["type", this.get$type()._core$_name, "result", this.result, "network", this.network.name], type$.String, type$.dynamic); } }; A.Web3WalletResponseMessage.prototype = { toCbor$0() { - var t1 = A._setArrayType([B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.result], type$.String, type$.nullable_Object), null), this.authenticated.toCbor$0(), new A.CborBytesValue(this.network.tag)], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_14, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); + var _this = this, + t1 = B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", _this.result], type$.String, type$.nullable_Object), null), + t2 = _this.authenticated.toCbor$0(), + t3 = _this.chain; + t3 = t3 == null ? B.C_CborNullValue : new A.CborBytesValue(t3); + t3 = A._setArrayType([t1, t2, new A.CborBytesValue(_this.network.tag), t3], type$.JSArray_Object); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_14, type$.int), new A.CborListValue(t3, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, get$type() { return B.Web3MessageTypes_List_100_14_walletResponse; @@ -49027,16 +51008,17 @@ } }; A._Web3MessageCore_Object_CborSerializable.prototype = {}; + A._Web3MessageCore_Object_CborSerializable_JsonSerialization.prototype = {}; A.Web3MessageTypes.prototype = { _enumToString$0() { - return "Web3MessageTypes." + this._name; + return "Web3MessageTypes." + this._core$_name; } }; A.Web3MessageTypes_fromTag_closure.prototype = { call$1(e) { return A.BytesUtils_bytesEqual(type$.Web3MessageTypes._as(e).tag, this.tags); }, - $signature: 199 + $signature: 200 }; A.Web3MessageTypes_fromTag_closure0.prototype = { call$0() { @@ -49092,6 +51074,10 @@ if (chain == null) chain = new A.Web3SolanaChain(string$.x35eykt4, A.List_List$unmodifiable(B.List_empty10, type$.Web3SolanaChainAccount), A.List_List$unmodifiable(B.List_empty8, type$.Web3AccountAcitvity)); break; + case B.NetworkType_66M: + if (chain == null) + chain = new A.Web3TonChain(0, A.List_List$unmodifiable(B.List_empty11, type$.Web3TonChainAccount), A.List_List$unmodifiable(B.List_empty8, type$.Web3AccountAcitvity)); + break; default: throw A.wrapException(B.Web3RequestException_IAR); } @@ -49104,26 +51090,26 @@ call$1(e) { return A.APPImage_APPImage$fromCborBytesOrObject(e); }, - $signature: 200 + $signature: 201 }; A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure0.prototype = { call$1(e) { return A.NetworkType_fromName(A._asStringQ(e.get$value())); }, - $signature: 336 + $signature: 202 }; A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure1.prototype = { call$1(p0) { return A.Web3Chain_Web3Chain$deserialize(p0, type$.dynamic, type$.Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider, type$.Web3ChainAccount_dynamic); }, - $signature: 202 + $signature: 203 }; A._Web3APPAuthentication_Object_CborSerializable.prototype = {}; A.Web3ChainAccount.prototype = {}; A._Web3ChainAccount_Object_CborSerializable.prototype = {}; A._Web3ChainAccount_Object_CborSerializable_Equatable.prototype = {}; A.Web3Chain.prototype = { - get$accounts() { + get$activeAccounts() { return this._accounts; } }; @@ -49148,7 +51134,7 @@ call$1(e) { return type$.Web3EthereumRequestMethods._as(e).id === this.id; }, - $signature: 116 + $signature: 130 }; A.Web3EthereumRequestMethods_fromId_closure0.prototype = { call$0() { @@ -49163,7 +51149,7 @@ t1 = this.name; return e.name === t1 || B.JSArray_methods.contains$1(e.methodsName, t1); }, - $signature: 116 + $signature: 130 }; A.Web3EthereumPermissionRequestParam.prototype = {}; A.Web3EthereumRequestParam.prototype = {}; @@ -49207,7 +51193,7 @@ identifier = A.BlockchainUtils_generateRandomString(8); return A.EthereumAPIProvider_EthereumAPIProvider(identifier, t1, e, t2); }, - $signature: 204 + $signature: 205 }; A.Web3EthreumPersonalSign.prototype = { toCbor$0() { @@ -49223,7 +51209,7 @@ call$1(obj) { return A.ETHAddress_ETHAddress(obj); }, - $signature: 35 + $signature: 40 }; A.Web3EthreumRequestAccounts.prototype = { toCbor$0() { @@ -49270,19 +51256,19 @@ call$1(e) { return type$.ETHTransactionType._as(e).prefix === this.transactionType; }, - $signature: 113 + $signature: 128 }; A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure0.prototype = { call$1(c) { return A.ETHAddress_ETHAddress(c); }, - $signature: 35 + $signature: 40 }; A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure1.prototype = { call$1(c) { return A.ETHAddress_ETHAddress(c); }, - $signature: 35 + $signature: 40 }; A.Web3EthreumTypdedData.prototype = { toCbor$0() { @@ -49300,7 +51286,7 @@ call$1(c) { return A.ETHAddress_ETHAddress(c); }, - $signature: 35 + $signature: 40 }; A.Web3EthreumSwitchChain.prototype = { toCbor$0() { @@ -49314,7 +51300,7 @@ A.Web3EthereumChainAccount.prototype = { toCbor$0() { var _this = this, - t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.address, _this.chainId, _this.defaultAddress], type$.JSArray_Object); + t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.address, _this.chainId, _this._defaultAddress], type$.JSArray_Object); return new A.CborTagValue(A.List_List$unmodifiable(B.List_161_1_1, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, get$variabels() { @@ -49323,7 +51309,7 @@ }; A.Web3EthereumChain.prototype = { toCbor$0() { - var t1 = A.Web3Chain.prototype.get$accounts.call(this), + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3EthereumChainAccount>"), t3 = t2._eval$1("MappedListIterable>"), t4 = type$.CborListValue_CborTagValue_dynamic, @@ -49333,15 +51319,15 @@ t4 = A._setArrayType([new A.CborListValue(A.List_List$of(new A.MappedListIterable(new A.CastList(t1, t2), t2._eval$1("CborTagValue<@>(ListBase.E)")._as(new A.Web3EthereumChain_toCbor_closure()), t3), true, t3._eval$1("ListIterable.E")), true, t4), this._permission$_currentChain, new A.CborListValue(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("CborTagValue<@>(1)")._as(new A.Web3EthereumChain_toCbor_closure0()), t7), true, t7._eval$1("ListIterable.E")), true, t4)], type$.JSArray_Object); return new A.CborTagValue(A.List_List$unmodifiable(B.List_80_0_3, type$.int), new A.CborListValue(t4, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, - currentChainAccounts$1(chain) { + chainAccounts$1(chain) { var _i, chainAccount, - t1 = A.Web3Chain.prototype.get$accounts.call(this), + t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3EthereumChainAccount>"), t3 = t2._eval$1("WhereIterable"), - currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3EthereumChain_currentChainAccounts_closure(this)), t3), true, t3._eval$1("Iterable.E")), + currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3EthereumChain_chainAccounts_closure(chain)), t3), true, t3._eval$1("Iterable.E")), existsAccounts = A._setArrayType([], type$.JSArray_Web3EthereumChainAccount); for (t1 = chain._addresses, t2 = t1.length, t3 = type$.Web3EthereumChainAccount, _i = 0; _i < t2; ++_i) { - chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3EthereumChain_currentChainAccounts_closure0(t1[_i]), null, t3); + chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3EthereumChain_chainAccounts_closure0(t1[_i]), null, t3); if (chainAccount != null) B.JSArray_methods.add$1(existsAccounts, chainAccount); } @@ -49355,47 +51341,47 @@ t2 = A.ETHAddress_ETHAddress(A.ExtractCborList_elementAt(values, 1, type$.String)); return new A.Web3EthereumChainAccount(A.ExtractCborList_elementAt(values, 2, type$.BigInt), t1, t2, A.ExtractCborList_elementAt(values, 3, type$.bool)); }, - $signature: 207 + $signature: 208 }; A.Web3EthereumChain_Web3EthereumChain$deserialize_closure0.prototype = { call$1(e) { return A.Web3AccountAcitvity_Web3AccountAcitvity$deserialize(type$.nullable_CborObject._as(e)); }, - $signature: 52 + $signature: 41 }; A.Web3EthereumChain_toCbor_closure.prototype = { call$1(e) { return type$.Web3EthereumChainAccount._as(e).toCbor$0(); }, - $signature: 209 + $signature: 210 }; A.Web3EthereumChain_toCbor_closure0.prototype = { call$1(e) { return type$.Web3AccountAcitvity._as(e).toCbor$0(); }, - $signature: 50 + $signature: 49 }; - A.Web3EthereumChain_currentChainAccounts_closure.prototype = { + A.Web3EthereumChain_chainAccounts_closure.prototype = { call$1(e) { - var t1 = type$.Web3EthereumChainAccount._as(e).chainId.compareTo$1(0, this.$this._permission$_currentChain); + var t1 = type$.Web3EthereumChainAccount._as(e).chainId.compareTo$1(0, this.chain.network.coinParam.chainId); return t1 === 0; }, - $signature: 49 + $signature: 59 }; - A.Web3EthereumChain_currentChainAccounts_closure0.prototype = { + A.Web3EthereumChain_chainAccounts_closure0.prototype = { call$1(e) { var t1; type$.Web3EthereumChainAccount._as(e); t1 = this.i; return e.address.address === t1.address.address && e.keyIndex.$eq(0, t1.keyIndex); }, - $signature: 49 + $signature: 59 }; A.Web3EthereumValidator_parseTypedData_closure.prototype = { call$0() { return A.EIP712Base_EIP712Base$fromJson(A.StringUtils_toJson(this.data, type$.Map_String_dynamic)); }, - $signature: 212 + $signature: 213 }; A.Web3GlobalRequestMethods.prototype = { get$network() { @@ -49406,7 +51392,7 @@ call$1(e) { return type$.Web3GlobalRequestMethods._as(e).id === this.id; }, - $signature: 213 + $signature: 428 }; A.Web3GlobalRequestMethods_fromId_closure0.prototype = { call$0() { @@ -49432,7 +51418,7 @@ call$1(e) { return type$.Web3SolanaRequestMethods._as(e).id === this.id; }, - $signature: 108 + $signature: 124 }; A.Web3SolanaRequestMethods_fromId_closure0.prototype = { call$0() { @@ -49447,7 +51433,7 @@ t1 = this.name; return e.name === t1 || B.JSArray_methods.contains$1(e.methodsName, t1); }, - $signature: 108 + $signature: 124 }; A.Web3SolanaPermissionRequestParam.prototype = {}; A.Web3SolanaRequestParam.prototype = {}; @@ -49460,6 +51446,12 @@ return A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic); } }; + A.Web3SolanaSignMessageResponse.prototype = { + toJson$0() { + var t1 = this.address.address; + return A.LinkedHashMap_LinkedHashMap$_literal(["signer", t1, "signerAddressBytes", A.List_List$from(new A.SolAddrDecoder().decodeAddr$1(t1), true, type$.int), "signature", this.signature], type$.String, type$.dynamic); + } + }; A.Web3SolanaSignMessage.prototype = { toCbor$0() { var t1 = B.Web3SolanaRequestMethods_102_solana_signMessage_List_empty.get$tag(), @@ -49491,7 +51483,7 @@ }; A.Web3SolanaSendTransaction.prototype = { toCbor$0() { - var t1 = B.Web3SolanaRequestMethods_6YB.get$tag(), + var t1 = this.method.get$tag(), t2 = this.messages, t3 = A._arrayInstanceType(t2), t4 = t3._eval$1("MappedListIterable<1,CborTagValue<@>>"); @@ -49516,7 +51508,7 @@ t2 = A.ExtractCborList_elementAt(values, 1, type$.List_int); return new A.Web3SolanaSendTransactionData(new A.SolAddress(t1), A.ExtractCborList_elementAt(values, 2, type$.int), A.BytesUtils_toBytes(t2, true)); }, - $signature: 215 + $signature: 216 }; A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure0.prototype = { call$1(e) { @@ -49524,27 +51516,27 @@ t1 = type$.nullable_int; return new A.Web3SolanaSendTransactionOptions(A.ExtractCborList_elemetAs(values, 0, t1), A.ExtractCborList_elemetAs(values, 1, type$.bool), A.ExtractCborList_elemetAs(values, 2, type$.nullable_String), A.ExtractCborList_elementAt(values, 3, t1), false); }, - $signature: 216 + $signature: 217 }; A.Web3SolanaSendTransaction_toCbor_closure.prototype = { call$1(e) { return type$.Web3SolanaSendTransactionData._as(e).toCbor$0(); }, - $signature: 217 + $signature: 218 }; A.Web3SolanaSendTransaction_toJson_closure.prototype = { call$1(e) { return type$.Web3SolanaSendTransactionData._as(e).toJson$0(); }, - $signature: 218 + $signature: 219 }; A._Web3SolanaSendTransactionData_Object_CborSerializable.prototype = {}; A._Web3SolanaSendTransactionOptions_Object_CborSerializable.prototype = {}; A.Web3SolanaChainAccount.prototype = { toCbor$0() { var _this = this, - t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.address, _this.genesis, _this.defaultAddress], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_161_2_1, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); + t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.address, _this.genesis, _this._defaultAddress], type$.JSArray_Object); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_161_2_2, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, get$variabels() { return [this.keyIndex, this.address.address, this.genesis]; @@ -49552,7 +51544,7 @@ }; A.Web3SolanaChain.prototype = { toCbor$0() { - var t1 = A.Web3Chain.prototype.get$accounts.call(this), + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3SolanaChainAccount>"), t3 = t2._eval$1("MappedListIterable>"), t4 = type$.CborListValue_CborTagValue_dynamic, @@ -49562,75 +51554,281 @@ t4 = A._setArrayType([new A.CborListValue(A.List_List$of(new A.MappedListIterable(new A.CastList(t1, t2), t2._eval$1("CborTagValue<@>(ListBase.E)")._as(new A.Web3SolanaChain_toCbor_closure()), t3), true, t3._eval$1("ListIterable.E")), true, t4), this._genesis, new A.CborListValue(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("CborTagValue<@>(1)")._as(new A.Web3SolanaChain_toCbor_closure0()), t7), true, t7._eval$1("ListIterable.E")), true, t4)], type$.JSArray_Object); return new A.CborTagValue(A.List_List$unmodifiable(B.List_80_0_5, type$.int), new A.CborListValue(t4, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, - currentChainAccounts$1(chain) { + getPermission$1(address) { + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this); + return A.QuickImutableList_firstWhereOrNull(new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,Web3SolanaChainAccount>")), new A.Web3SolanaChain_getPermission_closure(address), null, type$.Web3SolanaChainAccount); + }, + chainAccounts$1(chain) { var _i, chainAccount, - t1 = A.Web3Chain.prototype.get$accounts.call(this), + t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3SolanaChainAccount>"), t3 = t2._eval$1("WhereIterable"), - currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3SolanaChain_currentChainAccounts_closure(this)), t3), true, t3._eval$1("Iterable.E")), + currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3SolanaChain_chainAccounts_closure(chain)), t3), true, t3._eval$1("Iterable.E")), existsAccounts = A._setArrayType([], type$.JSArray_Web3SolanaChainAccount); for (t1 = chain._addresses, t2 = t1.length, t3 = type$.Web3SolanaChainAccount, _i = 0; _i < t2; ++_i) { - chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3SolanaChain_currentChainAccounts_closure0(t1[_i]), null, t3); + chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3SolanaChain_chainAccounts_closure0(t1[_i]), null, t3); if (chainAccount != null) B.JSArray_methods.add$1(existsAccounts, chainAccount); } return existsAccounts; - }, - getPermission$1(address) { - var t1 = A.Web3Chain.prototype.get$accounts.call(this); - return A.QuickImutableList_firstWhereOrNull(new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,Web3SolanaChainAccount>")), new A.Web3SolanaChain_getPermission_closure(address), null, type$.Web3SolanaChainAccount); } }; A.Web3SolanaChain_Web3SolanaChain$deserialize_closure.prototype = { call$1(e) { - var values = A.CborSerializable_cborTagValue(null, null, type$.nullable_CborObject._as(e), B.List_161_2_1, type$.CborListValue_dynamic), + var values = A.CborSerializable_cborTagValue(null, null, type$.nullable_CborObject._as(e), B.List_161_2_2, type$.CborListValue_dynamic), t1 = A.AddressDerivationIndex_fromCborBytesOrObject(A.ExtractCborList_getCborTag(values, 0)), t2 = type$.String, t3 = A.ExtractCborList_elementAt(values, 1, t2); new A.SolAddrDecoder().decodeAddr$1(t3); return new A.Web3SolanaChainAccount(A.ExtractCborList_elementAt(values, 2, t2), t1, new A.SolAddress(t3), A.ExtractCborList_elementAt(values, 3, type$.bool)); }, - $signature: 219 + $signature: 220 }; A.Web3SolanaChain_Web3SolanaChain$deserialize_closure0.prototype = { call$1(e) { return A.Web3AccountAcitvity_Web3AccountAcitvity$deserialize(type$.nullable_CborObject._as(e)); }, - $signature: 52 + $signature: 41 }; A.Web3SolanaChain_toCbor_closure.prototype = { call$1(e) { return type$.Web3SolanaChainAccount._as(e).toCbor$0(); }, - $signature: 220 + $signature: 221 }; A.Web3SolanaChain_toCbor_closure0.prototype = { call$1(e) { return type$.Web3AccountAcitvity._as(e).toCbor$0(); }, - $signature: 50 + $signature: 49 + }; + A.Web3SolanaChain_getPermission_closure.prototype = { + call$1(e) { + type$.Web3SolanaChainAccount._as(e); + return this.address.address === e.address.address; + }, + $signature: 43 }; - A.Web3SolanaChain_currentChainAccounts_closure.prototype = { + A.Web3SolanaChain_chainAccounts_closure.prototype = { call$1(e) { - return type$.Web3SolanaChainAccount._as(e).genesis === this.$this._genesis; + return type$.Web3SolanaChainAccount._as(e).genesis === this.chain.network.coinParam.genesis; }, - $signature: 30 + $signature: 43 }; - A.Web3SolanaChain_currentChainAccounts_closure0.prototype = { + A.Web3SolanaChain_chainAccounts_closure0.prototype = { call$1(e) { var t1; type$.Web3SolanaChainAccount._as(e); t1 = this.i; return e.address.address === t1.address.address && e.keyIndex.$eq(0, t1.keyIndex); }, - $signature: 30 + $signature: 43 }; - A.Web3SolanaChain_getPermission_closure.prototype = { + A.Web3TonRequestMethods.prototype = { + get$network() { + return B.NetworkType_66M; + } + }; + A.Web3TonRequestMethods_fromId_closure.prototype = { call$1(e) { - type$.Web3SolanaChainAccount._as(e); - return this.address.address === e.address.address; + return type$.Web3TonRequestMethods._as(e).id === this.id; }, - $signature: 30 + $signature: 123 + }; + A.Web3TonRequestMethods_fromId_closure0.prototype = { + call$0() { + return A.throwExpression(B.Web3RequestException_imj); + }, + $signature: 2 + }; + A.Web3TonRequestMethods_fromName_closure.prototype = { + call$1(e) { + var t1; + type$.Web3TonRequestMethods._as(e); + t1 = this.name; + return e.name === t1 || B.JSArray_methods.contains$1(e.methodsName, t1); + }, + $signature: 123 + }; + A.Web3TonPermissionRequestParam.prototype = {}; + A.Web3TonRequestParam.prototype = {}; + A.Web3TonRequestAccounts.prototype = { + toCbor$0() { + var t1 = A._setArrayType([B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty.get$tag()], type$.JSArray_List_int); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_12, type$.int), new A.CborListValue(t1, true, type$.CborListValue_List_int), type$.CborTagValue_dynamic); + }, + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic); + } + }; + A.Web3TonSignMessage.prototype = { + toCbor$0() { + var t1 = B.Web3TonRequestMethods_102_ton_signMessage_List_empty.get$tag(), + t2 = this.address.toFriendlyAddress$0(), + t3 = A.BytesUtils_fromHexString(this.challeng); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_12, type$.int), new A.CborListValue([t1, t2, new A.CborBytesValue(t3), this.content], true, type$.CborListValue_nullable_Object), type$.CborTagValue_dynamic); + }, + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["address", this.address.toFriendlyAddress$0(), "challeng", this.challeng], type$.String, type$.dynamic); + } + }; + A.Web3TonTransactionMessage.prototype = { + toCbor$0() { + var t3, _this = this, + t1 = _this.address.toFriendlyAddress$0(), + t2 = _this.stateInit; + t2 = t2 == null ? null : new A.CborBytesValue(A.BocSerialization_serialize(true, false, t2)); + t3 = _this.payload; + t3 = t3 == null ? null : new A.CborBytesValue(A.BocSerialization_serialize(true, false, t3)); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_3_1, type$.int), new A.CborListValue([t1, _this.amount, t2, t3], true, type$.CborListValue_nullable_Object), type$.CborTagValue_dynamic); + }, + toJson$0() { + var _this = this; + return A.LinkedHashMap_LinkedHashMap$_literal(["address", _this.address.toFriendlyAddress$0(), "amount", _this.amount, "stateInit", _this.stateInit, "payload", _this.payload], type$.String, type$.dynamic); + } + }; + A.Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson_closure.prototype = { + call$1(address) { + return A.TonAddress_TonAddress(address, this.workchain); + }, + $signature: 224 + }; + A.Web3TonSendTransaction.prototype = { + toCbor$0() { + var t1 = this.messages, + t2 = A._arrayInstanceType(t1), + t3 = t2._eval$1("MappedListIterable<1,CborTagValue<@>>"); + t3 = A._setArrayType([B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty.get$tag(), this.account.toFriendlyAddress$0(), new A.CborListValue(A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("CborTagValue<@>(1)")._as(new A.Web3TonSendTransaction_toCbor_closure()), t3), true, t3._eval$1("ListIterable.E")), true, type$.CborListValue_CborTagValue_dynamic), this.validUntil], type$.JSArray_Object); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_12, type$.int), new A.CborListValue(t3, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); + }, + toJson$0() { + var t1 = this.messages, + t2 = A._arrayInstanceType(t1), + t3 = t2._eval$1("MappedListIterable<1,Map>"); + return A.LinkedHashMap_LinkedHashMap$_literal(["account", this.account.toFriendlyAddress$0(), "messages", B.C_JsonCodec.encode$2$toEncodable(A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("Map(1)")._as(new A.Web3TonSendTransaction_toJson_closure()), t3), true, t3._eval$1("ListIterable.E")), null), "validUntil", "0x" + B.JSInt_methods.toRadixString$1(this.validUntil, 16)], type$.String, type$.nullable_String); + } + }; + A.Web3TonSendTransaction_Web3TonSendTransaction$fromJson_closure.prototype = { + call$1(e) { + return A.Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson(A.Web3ValidatorUtils_isValidMap(e, type$.String, type$.dynamic, type$.Map_String_dynamic), this.account.workChain); + }, + $signature: 225 + }; + A.Web3TonSendTransaction_Web3TonSendTransaction$deserialize_closure.prototype = { + call$1(e) { + var t2, t3, _null = null, + values = A.CborSerializable_cborTagValue(_null, _null, type$.CborTagValue_dynamic._as(e), B.List_3_1, type$.CborListValue_dynamic), + t1 = type$.nullable_List_int, + stateInitBytes = A.ExtractCborList_elementAt(values, 2, t1), + payloadBytes = A.ExtractCborList_elementAt(values, 3, t1); + t1 = A.TonAddress_TonAddress(A.ExtractCborList_elementAt(values, 0, type$.String), _null); + t2 = A.ExtractCborList_elementAt(values, 1, type$.BigInt); + t3 = stateInitBytes == null ? _null : A.Cell_Cell$fromBytes(stateInitBytes); + return new A.Web3TonTransactionMessage(t1, t2, t3, payloadBytes == null ? _null : A.Cell_Cell$fromBytes(payloadBytes)); + }, + $signature: 226 + }; + A.Web3TonSendTransaction_toCbor_closure.prototype = { + call$1(e) { + return type$.Web3TonTransactionMessage._as(e).toCbor$0(); + }, + $signature: 227 + }; + A.Web3TonSendTransaction_toJson_closure.prototype = { + call$1(e) { + return type$.Web3TonTransactionMessage._as(e).toJson$0(); + }, + $signature: 228 + }; + A._Web3TonTransactionMessage_Object_CborSerializable.prototype = {}; + A.Web3TonChainAccount.prototype = { + toCbor$0() { + var _this = this, + t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.toFriendlyAddress$0(), _this.workChain, _this._defaultAddress], type$.JSArray_Object); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_161_2_3, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); + }, + get$variabels() { + return [this.keyIndex, this.address.toFriendlyAddress$0(), this.workChain]; + } + }; + A.Web3TonChain.prototype = { + toCbor$0() { + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), + t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TonChainAccount>"), + t3 = t2._eval$1("MappedListIterable>"), + t4 = type$.CborListValue_CborTagValue_dynamic, + t5 = this._activities, + t6 = A._arrayInstanceType(t5), + t7 = t6._eval$1("MappedListIterable<1,CborTagValue<@>>"); + t4 = A._setArrayType([new A.CborListValue(A.List_List$of(new A.MappedListIterable(new A.CastList(t1, t2), t2._eval$1("CborTagValue<@>(ListBase.E)")._as(new A.Web3TonChain_toCbor_closure()), t3), true, t3._eval$1("ListIterable.E")), true, t4), this._workChain, new A.CborListValue(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("CborTagValue<@>(1)")._as(new A.Web3TonChain_toCbor_closure0()), t7), true, t7._eval$1("ListIterable.E")), true, t4)], type$.JSArray_Object); + return new A.CborTagValue(A.List_List$unmodifiable(B.List_80_0_11, type$.int), new A.CborListValue(t4, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); + }, + getPermission$1(address) { + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this); + return A.QuickImutableList_firstWhereOrNull(new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TonChainAccount>")), new A.Web3TonChain_getPermission_closure(address), null, type$.Web3TonChainAccount); + }, + chainAccounts$1(chain) { + var _i, chainAccount, + t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), + t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TonChainAccount>"), + t3 = t2._eval$1("WhereIterable"), + currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3TonChain_chainAccounts_closure(chain)), t3), true, t3._eval$1("Iterable.E")), + existsAccounts = A._setArrayType([], type$.JSArray_Web3TonChainAccount); + for (t1 = chain._addresses, t2 = t1.length, t3 = type$.Web3TonChainAccount, _i = 0; _i < t2; ++_i) { + chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3TonChain_chainAccounts_closure0(t1[_i]), null, t3); + if (chainAccount != null) + B.JSArray_methods.add$1(existsAccounts, chainAccount); + } + return existsAccounts; + } + }; + A.Web3TonChain_Web3TonChain$deserialize_closure.prototype = { + call$1(e) { + var values = A.CborSerializable_cborTagValue(null, null, type$.nullable_CborObject._as(e), B.List_161_2_3, type$.CborListValue_dynamic), + t1 = A.AddressDerivationIndex_fromCborBytesOrObject(A.ExtractCborList_getCborTag(values, 0)), + t2 = A.TonAddress_TonAddress(A.ExtractCborList_elementAt(values, 1, type$.String), null); + return new A.Web3TonChainAccount(A.ExtractCborList_elementAt(values, 2, type$.int), t1, t2, A.ExtractCborList_elementAt(values, 3, type$.bool)); + }, + $signature: 229 + }; + A.Web3TonChain_Web3TonChain$deserialize_closure0.prototype = { + call$1(e) { + return A.Web3AccountAcitvity_Web3AccountAcitvity$deserialize(type$.nullable_CborObject._as(e)); + }, + $signature: 41 + }; + A.Web3TonChain_toCbor_closure.prototype = { + call$1(e) { + return type$.Web3TonChainAccount._as(e).toCbor$0(); + }, + $signature: 230 + }; + A.Web3TonChain_toCbor_closure0.prototype = { + call$1(e) { + return type$.Web3AccountAcitvity._as(e).toCbor$0(); + }, + $signature: 49 + }; + A.Web3TonChain_getPermission_closure.prototype = { + call$1(e) { + return type$.Web3TonChainAccount._as(e).address.$eq(0, this.address); + }, + $signature: 44 + }; + A.Web3TonChain_chainAccounts_closure.prototype = { + call$1(e) { + return type$.Web3TonChainAccount._as(e).workChain === this.chain.network.coinParam.workchain; + }, + $signature: 44 + }; + A.Web3TonChain_chainAccounts_closure0.prototype = { + call$1(e) { + var t1; + type$.Web3TonChainAccount._as(e); + t1 = this.i; + return e.address.toFriendlyAddress$0() === t1.address.address && e.keyIndex.$eq(0, t1.keyIndex); + }, + $signature: 44 }; A.Web3TronRequestMethods.prototype = { get$network() { @@ -49641,7 +51839,7 @@ call$1(e) { return type$.Web3TronRequestMethods._as(e).id === this.id; }, - $signature: 102 + $signature: 122 }; A.Web3TronRequestMethods_fromId_closure0.prototype = { call$0() { @@ -49656,7 +51854,7 @@ t1 = this.name; return e.name === t1 || B.JSArray_methods.contains$1(e.methodsName, t1); }, - $signature: 102 + $signature: 122 }; A.Web3TronPermissionRequestParam.prototype = {}; A.Web3TronRequestParam.prototype = {}; @@ -49694,7 +51892,7 @@ A.Web3TronChainAccount.prototype = { toCbor$0() { var _this = this, - t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.toAddress$0(), _this.chain._name, _this.defaultAddress], type$.JSArray_Object); + t1 = A._setArrayType([_this.keyIndex.toCbor$0(), _this.address.toAddress$0(), _this.chain._core$_name, _this._defaultAddress], type$.JSArray_Object); return new A.CborTagValue(A.List_List$unmodifiable(B.List_161_2_1, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, get$variabels() { @@ -49703,7 +51901,7 @@ }; A.Web3TronChain.prototype = { toCbor$0() { - var t1 = A.Web3Chain.prototype.get$accounts.call(this), + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TronChainAccount>"), t3 = t2._eval$1("MappedListIterable>"), t4 = type$.CborListValue_CborTagValue_dynamic, @@ -49713,23 +51911,23 @@ t4 = A._setArrayType([new A.CborListValue(A.List_List$of(new A.MappedListIterable(new A.CastList(t1, t2), t2._eval$1("CborTagValue<@>(ListBase.E)")._as(new A.Web3TronChain_toCbor_closure()), t3), true, t3._eval$1("ListIterable.E")), true, t4), this._currentChain.genesisBlockNumber, new A.CborListValue(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("CborTagValue<@>(1)")._as(new A.Web3TronChain_toCbor_closure0()), t7), true, t7._eval$1("ListIterable.E")), true, t4)], type$.JSArray_Object); return new A.CborTagValue(A.List_List$unmodifiable(B.List_80_0_4, type$.int), new A.CborListValue(t4, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); }, - currentChainAccounts$1(chain) { + getPermission$1(address) { + var t1 = A.Web3Chain.prototype.get$activeAccounts.call(this); + return A.QuickImutableList_firstWhereOrNull(new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TronChainAccount>")), new A.Web3TronChain_getPermission_closure(address), null, type$.Web3TronChainAccount); + }, + chainAccounts$1(chain) { var _i, chainAccount, - t1 = A.Web3Chain.prototype.get$accounts.call(this), + t1 = A.Web3Chain.prototype.get$activeAccounts.call(this), t2 = A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TronChainAccount>"), t3 = t2._eval$1("WhereIterable"), - currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3TronChain_currentChainAccounts_closure(this)), t3), true, t3._eval$1("Iterable.E")), + currentAccounts = A.List_List$of(new A.WhereIterable(new A.CastList(t1, t2), t2._eval$1("bool(ListBase.E)")._as(new A.Web3TronChain_chainAccounts_closure(chain)), t3), true, t3._eval$1("Iterable.E")), existsAccounts = A._setArrayType([], type$.JSArray_Web3TronChainAccount); for (t1 = chain._addresses, t2 = t1.length, t3 = type$.Web3TronChainAccount, _i = 0; _i < t2; ++_i) { - chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3TronChain_currentChainAccounts_closure0(t1[_i]), null, t3); + chainAccount = A.QuickImutableList_firstWhereOrNull(currentAccounts, new A.Web3TronChain_chainAccounts_closure0(t1[_i]), null, t3); if (chainAccount != null) B.JSArray_methods.add$1(existsAccounts, chainAccount); } return existsAccounts; - }, - getPermission$1(address) { - var t1 = A.Web3Chain.prototype.get$accounts.call(this); - return A.QuickImutableList_firstWhereOrNull(new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,Web3TronChainAccount>")), new A.Web3TronChain_getPermission_closure(address), null, type$.Web3TronChainAccount); } }; A.Web3TronChain_Web3TronChain$deserialize_closure.prototype = { @@ -49739,46 +51937,54 @@ t2 = A.TronAddress_TronAddress(A.ExtractCborList_elementAt(values, 1, type$.String)); return new A.Web3TronChainAccount(A.TronChainType_fromName(A.ExtractCborList_elementAt(values, 2, type$.nullable_String)), t1, t2, A.ExtractCborList_elementAt(values, 3, type$.bool)); }, - $signature: 223 + $signature: 233 }; A.Web3TronChain_Web3TronChain$deserialize_closure0.prototype = { call$1(e) { return A.Web3AccountAcitvity_Web3AccountAcitvity$deserialize(type$.nullable_CborObject._as(e)); }, - $signature: 52 + $signature: 41 }; A.Web3TronChain_toCbor_closure.prototype = { call$1(e) { return type$.Web3TronChainAccount._as(e).toCbor$0(); }, - $signature: 224 + $signature: 234 }; A.Web3TronChain_toCbor_closure0.prototype = { call$1(e) { return type$.Web3AccountAcitvity._as(e).toCbor$0(); }, - $signature: 50 + $signature: 49 }; - A.Web3TronChain_currentChainAccounts_closure.prototype = { + A.Web3TronChain_getPermission_closure.prototype = { call$1(e) { - return type$.Web3TronChainAccount._as(e).chain === this.$this._currentChain; + return type$.Web3TronChainAccount._as(e).address.$eq(0, this.address); }, - $signature: 31 + $signature: 45 + }; + A.Web3TronChain_chainAccounts_closure.prototype = { + call$1(e) { + return type$.Web3TronChainAccount._as(e).chain === A.TronChainType_fromId(this.chain.network.value); + }, + $signature: 45 }; - A.Web3TronChain_currentChainAccounts_closure0.prototype = { + A.Web3TronChain_chainAccounts_closure0.prototype = { call$1(e) { var t1; type$.Web3TronChainAccount._as(e); t1 = this.i; return e.address.toAddress$0() === t1.address.address && e.keyIndex.$eq(0, t1.keyIndex); }, - $signature: 31 + $signature: 45 }; - A.Web3TronChain_getPermission_closure.prototype = { - call$1(e) { - return type$.Web3TronChainAccount._as(e).address.$eq(0, this.address); + A.Web3ValidatorUtils_isValidMap_closure.prototype = { + call$0() { + return type$.Map_dynamic_dynamic._as(this.data).cast$2$0(0, this.K, this.V); }, - $signature: 31 + $signature() { + return this.K._eval$1("@<0>")._bind$1(this.V)._eval$1("Map<1,2>()"); + } }; A.Web3ValidatorUtils_parseAddress_closure.prototype = { call$0() { @@ -49788,9 +51994,17 @@ return this.T._eval$1("0()"); } }; + A.Web3ValidatorUtils_parseTonCell_closure.prototype = { + call$0() { + var t1 = this._box_0.value; + t1.toString; + return A.Cell_Cell$fromBytes(A.Base64Utils_decodeBase64(t1)); + }, + $signature: 236 + }; A.Web3ValidatorUtils_parseList_closure.prototype = { call$0() { - return A.List_List$from(type$.Iterable_dynamic._as(this.value), true, this.E); + return J.cast$1$0$ax(type$.List_dynamic._as(this.value), this.E); }, $signature() { return this.E._eval$1("List<0>()"); @@ -49798,9 +52012,9 @@ }; A.Web3ValidatorUtils_parseMap_closure.prototype = { call$0() { - return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(this.value), type$.String, type$.dynamic); + return type$.Map_dynamic_dynamic._as(this.value).cast$2$0(0, type$.String, type$.dynamic); }, - $signature: 33 + $signature: 46 }; A.ADAByronAddress.prototype = { get$addressType() { @@ -49943,7 +52157,7 @@ call$2(previousValue, element) { return (A._asInt(previousValue) ^ B.JSInt_methods.get$hashCode(A._asInt(element))) >>> 0; }, - $signature: 26 + $signature: 25 }; A._FixedBytes_Object_ADASerialization.prototype = {}; A.BlockforestRequestParam.prototype = { @@ -49998,7 +52212,7 @@ case 0: // Function start $async$goto = 3; - return A._asyncAwait($async$self.rpc.$get$2(request.toRequest$1(++$async$self._provider4$_id), timeout), $async$requestDynamic$2); + return A._asyncAwait($async$self.rpc.$get$2(request.toRequest$1(++$async$self._provider6$_id), timeout), $async$requestDynamic$2); case 3: // returning from await. data = $async$result; @@ -50061,7 +52275,7 @@ call$1(e) { return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(e), type$.String, type$.dynamic); }, - $signature: 20 + $signature: 26 }; A.ADASerialization.prototype = { toString$0(_) { @@ -50102,7 +52316,7 @@ call$1(v) { return v == null; }, - $signature: 27 + $signature: 28 }; A.ETHRPCRequest_toRequest_closure0.prototype = { call$1(e) { @@ -50121,7 +52335,7 @@ call$1(e) { return type$.EthereumMethods._as(e).value === this.name; }, - $signature: 227 + $signature: 238 }; A.RPCGetChainId.prototype = { toJson$0() { @@ -50172,7 +52386,7 @@ switch ($async$goto) { case 0: // Function start - params = request.toRequest$1(++$async$self._provider$_id); + params = request.toRequest$1(++$async$self._provider0$_id); $async$temp1 = A; $async$goto = 3; return A._asyncAwait($async$self.rpc.call$2(params, null), $async$request$1$1); @@ -50200,7 +52414,7 @@ switch ($async$goto) { case 0: // Function start - t1 = ++$async$self._provider$_id; + t1 = ++$async$self._provider0$_id; request = new A.ETHRequestDetails(t1, B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["jsonrpc", "2.0", "method", method, "params", params, "id", t1], type$.String, type$.dynamic), null)); $async$goto = 3; return A._asyncAwait($async$self.rpc.call$2(request, null), $async$requestDynamic$2); @@ -50227,11 +52441,11 @@ call$1(element) { return type$.ETHTransactionType._as(element).prefix === this.prefix; }, - $signature: 113 + $signature: 128 }; A.HTTPRequestType.prototype = { _enumToString$0() { - return "HTTPRequestType." + this._name; + return "HTTPRequestType." + this._core$_name; } }; A.SolAddress.prototype = { @@ -50299,7 +52513,7 @@ call$1(v) { return v == null; }, - $signature: 27 + $signature: 28 }; A.SolanaRPCGetGenesisHash.prototype = { toJson$0() { @@ -50321,7 +52535,7 @@ switch ($async$goto) { case 0: // Function start - params = request.toRequest$1(++$async$self._provider2$_id); + params = request.toRequest$1(++$async$self._provider3$_id); t1 = type$.Map_String_dynamic; $async$temp1 = t1; $async$goto = 3; @@ -50444,13 +52658,13 @@ call$1(pubkey) { return type$.SolAddress._as(pubkey).address === this.address.address; }, - $signature: 97 + $signature: 119 }; A.SolanaTransactionUtils_serializeV0_closure.prototype = { call$1(key) { return type$.SolAddress._as(key); }, - $signature: 142 + $signature: 240 }; A.SolanaTransactionUtils_serializeLegacy_closure.prototype = { call$1(instruction) { @@ -50460,25 +52674,25 @@ data = A.List_List$from(instruction.data, true, type$.int); return A.LinkedHashMap_LinkedHashMap$_literal(["programIdIndex", instruction.programIdIndex, "keyIndicesCount", A.SolanaTransactionUtils__encodeLength(accounts.length), "keyIndices", accounts, "dataLength", A.SolanaTransactionUtils__encodeLength(data.length), "data", data], type$.String, type$.Object); }, - $signature: 230 + $signature: 241 }; A.SolanaTransactionUtils_serializeLegacy_closure0.prototype = { call$1(key) { return A.List_List$from(new A.SolAddrDecoder().decodeAddr$1(type$.SolAddress._as(key).address), true, type$.int); }, - $signature: 96 + $signature: 118 }; A.SolanaLayoutUtils_publicKey_closure0.prototype = { call$1(data) { return A.SolAddress_SolAddress$uncheckBytes(type$.List_int._as(data)); }, - $signature: 232 + $signature: 243 }; A.SolanaLayoutUtils_publicKey_closure.prototype = { call$1(src) { return A.List_List$from(new A.SolAddrDecoder().decodeAddr$1(type$.SolAddress._as(src).address), true, type$.int); }, - $signature: 96 + $signature: 118 }; A.AbiParameter.prototype = { legacyEip712Encode$2(value, keepSize) { @@ -50502,7 +52716,7 @@ call$1(component) { return type$.AbiParameter._as(component).get$isDynamic(); }, - $signature: 233 + $signature: 244 }; A.EncoderResult.prototype = {}; A.EIP712Version.prototype = {}; @@ -50510,7 +52724,7 @@ call$1(e) { return type$.EIP712Version._as(e).version === this.version; }, - $signature: 234 + $signature: 245 }; A.EIP712Version_fromVersion_closure0.prototype = { call$0() { @@ -50522,7 +52736,7 @@ call$1(e) { return type$.EIP712Version._as(e).version; }, - $signature: 235 + $signature: 246 }; A.Eip712TypeDetails.prototype = { toString$0(_) { @@ -50556,7 +52770,7 @@ type$.Map_String_dynamic._as(e); return new A.Eip712TypeDetails(A._asString(e.$index(0, "name")), A._asString(e.$index(0, "type"))); }, - $signature: 236 + $signature: 247 }; A.Eip712TypedData_toJson_closure.prototype = { call$2(k, v) { @@ -50565,13 +52779,13 @@ t1 = J.map$1$1$ax(type$.List_Eip712TypeDetails._as(v), new A.Eip712TypedData_toJson__closure(), type$.Map_String_dynamic); return new A.MapEntry(k, A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")), type$.MapEntry_of_String_and_List_Map_String_dynamic); }, - $signature: 237 + $signature: 248 }; A.Eip712TypedData_toJson__closure.prototype = { call$1(e) { return type$.Eip712TypeDetails._as(e).toJson$0(); }, - $signature: 238 + $signature: 249 }; A.Eip712TypedDataV1.prototype = { toJson$0() { @@ -50620,32 +52834,32 @@ t2 = A._asString(t1.$index(0, "type")); return new A.Eip712TypedDataV1(A._asString(t1.$index(0, "name")), t2, A._EIP712Utils_ensureCorrectValues(t2, t1.$index(0, "value"))); }, - $signature: 239 + $signature: 250 }; A.EIP712Legacy_encode_closure.prototype = { call$1(e) { return type$.Eip712TypedDataV1._as(e).value; }, - $signature: 240 + $signature: 251 }; A.EIP712Legacy_encode_closure0.prototype = { call$1(e) { return type$.Eip712TypedDataV1._as(e).type; }, - $signature: 94 + $signature: 117 }; A.EIP712Legacy_encode_closure1.prototype = { call$1(e) { type$.Eip712TypedDataV1._as(e); return e.type + " " + e.name; }, - $signature: 94 + $signature: 117 }; A.EIP712Legacy_toJson_closure.prototype = { call$1(e) { return type$.Eip712TypedDataV1._as(e).toJson$0(); }, - $signature: 242 + $signature: 253 }; A._EIP712Utils_ensureCorrectValues_closure.prototype = { call$1(e) { @@ -50672,43 +52886,43 @@ B.JSArray_methods.addAll$1(t1, J.where$1$ax(A._EIP712Utils_getDependencies(this.typedData, t.type, previous), new A._EIP712Utils_getDependencies__closure(previous))); return t1; }, - $signature: 243 + $signature: 254 }; A._EIP712Utils_getDependencies__closure.prototype = { call$1(dependency) { return !J.contains$1$asx(this.previous, A._asString(dependency)); }, - $signature: 25 + $signature: 27 }; A._EIP712Utils_encodeValue_closure.prototype = { call$1(item) { return A._EIP712Utils_encodeValue(this.typedData, this.isArray.item1, item); }, - $signature: 244 + $signature: 255 }; A._EIP712Utils_encodeValue_closure0.prototype = { call$1(item) { return type$.Tuple_String_dynamic._as(item).item1; }, - $signature: 245 + $signature: 256 }; A._EIP712Utils_encodeValue_closure1.prototype = { call$1(item) { return type$.Tuple_String_dynamic._as(item).item2; }, - $signature: 246 + $signature: 257 }; A._EIP712Utils_abiEncode_closure.prototype = { call$1(e) { - return new A.AbiParameter("", A._asString(e), B.List_empty5); + return new A.AbiParameter("", A._asString(e), B.List_empty6); }, - $signature: 93 + $signature: 116 }; A._EIP712Utils_legacyV1encode_closure.prototype = { call$1(e) { - return new A.AbiParameter("", A._asString(e), B.List_empty5); + return new A.AbiParameter("", A._asString(e), B.List_empty6); }, - $signature: 93 + $signature: 116 }; A._EIP712Utils_getMethodSigature_closure.prototype = { call$1(dependency) { @@ -50718,14 +52932,14 @@ t1.toString; return dependency + "(" + J.map$1$1$ax(t1, new A._EIP712Utils_getMethodSigature__closure(), type$.String).join$1(0, ",") + ")"; }, - $signature: 15 + $signature: 16 }; A._EIP712Utils_getMethodSigature__closure.prototype = { call$1(t) { type$.Eip712TypeDetails._as(t); return t.type + " " + t.name; }, - $signature: 248 + $signature: 259 }; A.SolidityAbiException.prototype = { toString$0(_) { @@ -50817,7 +53031,7 @@ call$1(e) { return this.param.item1.abiEncode$1(e); }, - $signature: 90 + $signature: 115 }; A.ArrayCoder_abiEncode_closure0.prototype = { call$1(e) { @@ -50829,7 +53043,7 @@ call$1(e) { return this.param.item1.legacyEip712Encode$2(e, true); }, - $signature: 90 + $signature: 115 }; A.ArrayCoder_legacyEip712Encode_closure0.prototype = { call$1(e) { @@ -50899,7 +53113,7 @@ abiEncode$2(params, input) { type$.BigInt._as(input); A._ABIValidator_isValidNumber(params.type, input); - return new A.EncoderResult(false, A.BigintUtils_toBytes(input, 32, B.C_Endian)); + return new A.EncoderResult(false, A.BigintUtils_toBytes(input, 32, B.C_Endian0)); }, legacyEip712Encode$3(params, input, keepSize) { var t1, size; @@ -50911,7 +53125,7 @@ size = 32; t1 = $.$get$_BigIntImpl_one(); t1 = input.$and(0, t1.$shl(0, size * 8).$sub(0, t1)); - return new A.EncoderResult(false, A.BigintUtils_toBytes(t1, keepSize ? 32 : size, B.C_Endian)); + return new A.EncoderResult(false, A.BigintUtils_toBytes(t1, keepSize ? 32 : size, B.C_Endian0)); }, $isABICoder: 1 }; @@ -50994,7 +53208,7 @@ call$1(element) { return type$.List_int._as(element); }, - $signature: 58 + $signature: 30 }; A._ABIUtils_encodeDynamicParams_closure1.prototype = { call$1(p) { @@ -51006,7 +53220,7 @@ call$1(element) { return type$.List_int._as(element); }, - $signature: 58 + $signature: 30 }; A.SolidityAddress.prototype = { toString$0(_) { @@ -51068,14 +53282,14 @@ call$1(e) { return A.AccountType_fromValue(A._asInt(e)); }, - $signature: 252 + $signature: 263 }; A.AccountCreateContract_toJson_closure.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.AccountId.prototype = { get$fieldIds() { @@ -51098,7 +53312,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.AccountPermissionUpdateContract.prototype = { toJson$0() { @@ -51132,32 +53346,32 @@ call$1(e) { return A.Permission_Permission$fromJson(type$.Map_String_dynamic._as(e)); }, - $signature: 253 + $signature: 264 }; A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$deserialize_closure.prototype = { call$1(e) { return A.Permission_Permission$deserialize(type$.List_int._as(e)); }, - $signature: 86 + $signature: 113 }; A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$deserialize_closure0.prototype = { call$1(e) { return A.Permission_Permission$deserialize(type$.List_int._as(e)); }, - $signature: 86 + $signature: 113 }; A.AccountPermissionUpdateContract_toJson_closure.prototype = { call$1(e) { return type$.Permission._as(e).toJson$0(); }, - $signature: 255 + $signature: 266 }; A.AccountPermissionUpdateContract_toJson_closure0.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.AccountType.prototype = {$isTronEnumerate: 1, get$value() { @@ -51168,13 +53382,13 @@ call$1(element) { return type$.AccountType._as(element).name === this.name; }, - $signature: 85 + $signature: 112 }; A.AccountType_fromValue_closure.prototype = { call$1(element) { return type$.AccountType._as(element).value === this.value; }, - $signature: 85 + $signature: 112 }; A.AccountUpdateContract.prototype = { get$fieldIds() { @@ -51217,7 +53431,7 @@ t1 = A.QuickProtocolBufferResults_getField(decode, 2, t1); return new A.AccountId(new A.TronAddress(A.TrxAddressUtils_fromHexBytes(t1), A.BytesUtils_toHexString(t1, true, null)), A.BytesUtils_tryToBytes(t2, true)); }, - $signature: 257 + $signature: 268 }; A.TronKey.prototype = { get$fieldIds() { @@ -51268,7 +53482,7 @@ type$.Map_String_dynamic._as(e); return new A.TronKey(A.OnChainUtils_parseTronAddress("address", e.$index(0, "address"), type$.TronAddress), A.OnChainUtils_parseBigInt("weight", e.$index(0, "weight"), type$.BigInt)); }, - $signature: 258 + $signature: 269 }; A.Permission_Permission$deserialize_closure.prototype = { call$1(e) { @@ -51277,20 +53491,20 @@ t1 = A.QuickProtocolBufferResults_getField(decode, 1, t1); return new A.TronKey(new A.TronAddress(A.TrxAddressUtils_fromHexBytes(t1), A.BytesUtils_toHexString(t1, true, null)), A.QuickProtocolBufferResults_getField(decode, 2, type$.BigInt)); }, - $signature: 259 + $signature: 270 }; A.Permission_toJson_closure.prototype = { call$1(e) { return type$.TronKey._as(e).toJson$0(); }, - $signature: 260 + $signature: 271 }; A.Permission_toJson_closure0.prototype = { call$2(k, v) { A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.PermissionType.prototype = { toString$0(_) { @@ -51305,25 +53519,25 @@ call$1(element) { return type$.PermissionType._as(element).name === this.name; }, - $signature: 83 + $signature: 111 }; A.PermissionType_fromName_closure0.prototype = { call$0() { return this.defaultPermission; }, - $signature: 81 + $signature: 110 }; A.PermissionType_fromValue_closure.prototype = { call$1(element) { return type$.PermissionType._as(element).value === this.value; }, - $signature: 83 + $signature: 111 }; A.PermissionType_fromValue_closure0.prototype = { call$0() { return this.defaultPermission; }, - $signature: 81 + $signature: 110 }; A.SetAccountIdContract.prototype = { get$fieldIds() { @@ -51393,7 +53607,7 @@ t1 = type$.BigInt; return new A.AssetIssueContractFrozenSupply(A.OnChainUtils_parseBigInt(_s13_, frozenSupplyJson.$index(0, _s13_), t1), A.OnChainUtils_parseBigInt(_s11_, frozenSupplyJson.$index(0, _s11_), t1)); }, - $signature: 263 + $signature: 274 }; A.AssetIssueContract_AssetIssueContract$deserialize_closure.prototype = { call$1(e) { @@ -51401,20 +53615,20 @@ t1 = type$.BigInt; return new A.AssetIssueContractFrozenSupply(A.QuickProtocolBufferResults_getField(decode, 1, t1), A.QuickProtocolBufferResults_getField(decode, 2, t1)); }, - $signature: 264 + $signature: 275 }; A.AssetIssueContract_toJson_closure.prototype = { call$1(e) { return type$.AssetIssueContractFrozenSupply._as(e).toJson$0(); }, - $signature: 265 + $signature: 276 }; A.AssetIssueContract_toJson_closure0.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.AssetIssueContractFrozenSupply.prototype = { get$fieldIds() { @@ -51475,7 +53689,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.UnfreezeAssetContract.prototype = { get$fieldIds() { @@ -51526,7 +53740,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.CancelAllUnfreezeV2Contract.prototype = { get$fieldIds() { @@ -51584,14 +53798,14 @@ A._asInt(e); return A.ResourceCode_fromValue(A.QuickProtocolBufferResults_getField(this.decode, 2, type$.nullable_int), null); }, - $signature: 28 + $signature: 31 }; A.DelegateResourceContract_toJson_closure.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.FreezeBalanceContract.prototype = { get$fieldIds() { @@ -51625,7 +53839,7 @@ type$.List_int._as(e); return new A.TronAddress(A.TrxAddressUtils_fromHexBytes(e), A.BytesUtils_toHexString(e, true, null)); }, - $signature: 77 + $signature: 108 }; A.FreezeBalanceV2Contract.prototype = { get$fieldIds() { @@ -51656,14 +53870,14 @@ call$1(e) { return A.ResourceCode_fromValue(A._asInt(e), null); }, - $signature: 28 + $signature: 31 }; A.FreezeBalanceV2Contract_toJson_closure.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.TransferContract.prototype = { get$fieldIds() { @@ -51689,7 +53903,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.UnDelegateResourceContract.prototype = { get$fieldIds() { @@ -51723,14 +53937,14 @@ call$1(e) { return A.ResourceCode_fromValue(A._asInt(e), null); }, - $signature: 28 + $signature: 31 }; A.UnDelegateResourceContract_toJson_closure.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.UnfreezeBalanceContract.prototype = { get$fieldIds() { @@ -51761,7 +53975,7 @@ call$1(e) { return A.ResourceCode_fromValue(A._asInt(e), null); }, - $signature: 28 + $signature: 31 }; A.UnfreezeBalanceV2Contract.prototype = { get$fieldIds() { @@ -51792,14 +54006,14 @@ call$1(e) { return A.ResourceCode_fromValue(A._asInt(e), null); }, - $signature: 28 + $signature: 31 }; A.UnfreezeBalanceV2Contract_toJson_closure.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.WithdrawBalanceContract.prototype = { get$fieldIds() { @@ -51876,25 +54090,25 @@ call$1(element) { return type$.ResourceCode._as(element).name === this.name; }, - $signature: 141 + $signature: 107 }; A.ResourceCode_fromName_closure.prototype = { call$0() { return this.orElse; }, - $signature: 75 + $signature: 104 }; A.ResourceCode_fromValue_closure0.prototype = { call$1(element) { return type$.ResourceCode._as(element).value === this.val; }, - $signature: 141 + $signature: 107 }; A.ResourceCode_fromValue_closure.prototype = { call$0() { return this.orElse; }, - $signature: 75 + $signature: 104 }; A.TransactionContractType.prototype = { toString$0(_) { @@ -51909,7 +54123,7 @@ call$1(element) { return type$.TransactionContractType._as(element).name === this.name; }, - $signature: 69 + $signature: 103 }; A.TransactionContractType_findByName_closure0.prototype = { call$0() { @@ -51921,7 +54135,7 @@ call$1(element) { return type$.TransactionContractType._as(element).value === this.value; }, - $signature: 69 + $signature: 103 }; A.ExchangeCreateContract.prototype = { get$fieldIds() { @@ -51955,7 +54169,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.ExchangeInjectContract.prototype = { get$fieldIds() { @@ -51988,7 +54202,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.ExchangeTransactionContract.prototype = { get$fieldIds() { @@ -52023,7 +54237,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.ExchangeWithdrawContract.prototype = { get$fieldIds() { @@ -52051,7 +54265,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.MarketCancelOrderContract.prototype = { get$fieldIds() { @@ -52077,7 +54291,7 @@ A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.MarketSellAssetContract.prototype = { get$fieldIds() { @@ -52111,7 +54325,7 @@ A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.ProposalApproveContract.prototype = { get$fieldIds() { @@ -52140,7 +54354,7 @@ A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.ProposalCreateContract.prototype = { get$fieldIds() { @@ -52175,7 +54389,7 @@ t1 = type$.BigInt; return new A.MapEntry(A.OnChainUtils_parseBigInt(_s10_, key, t1), A.OnChainUtils_parseBigInt(_s10_, value, t1), type$.MapEntry_BigInt_BigInt); }, - $signature: 271 + $signature: 282 }; A.ProposalCreateContract_toJson_closure.prototype = { call$2(key, value) { @@ -52184,7 +54398,7 @@ t1._as(value); return new A.MapEntry(key.toString$0(0), value.toString$0(0), type$.MapEntry_String_String); }, - $signature: 272 + $signature: 283 }; A.ProposalDeleteContract.prototype = { get$fieldIds() { @@ -52228,7 +54442,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.ShieldedTransferContract.prototype = { get$fieldIds() { @@ -52286,7 +54500,7 @@ t5 = A.BytesUtils_tryFromHexString(A._asStringQ(desc.$index(0, "zkproof"))); return A.SpendDescription$(t2, t3, t4, A.BytesUtils_tryFromHexString(A._asStringQ(desc.$index(0, "spend_authority_signature"))), t1, t5); }, - $signature: 68 + $signature: 102 }; A.ShieldedTransferContract_ShieldedTransferContract$fromJson_closure0.prototype = { call$1(desc) { @@ -52297,7 +54511,7 @@ t3 = A.BytesUtils_tryFromHexString(A._asStringQ(desc.$index(0, "epk"))); return A.ReceiveDescription$(A.BytesUtils_tryFromHexString(A._asStringQ(desc.$index(0, "c_enc"))), A.BytesUtils_tryFromHexString(A._asStringQ(desc.$index(0, "c_out"))), t3, t2, t1, A.BytesUtils_tryFromHexString(A._asStringQ(desc.$index(0, "zkproof")))); }, - $signature: 65 + $signature: 146 }; A.ShieldedTransferContract_ShieldedTransferContract$deserialize_closure.prototype = { call$1(e) { @@ -52310,7 +54524,7 @@ t6 = A.QuickProtocolBufferResults_getField(decode, 5, t1); return A.SpendDescription$(t3, t4, t5, A.QuickProtocolBufferResults_getField(decode, 6, t1), t2, t6); }, - $signature: 68 + $signature: 102 }; A.ShieldedTransferContract_ShieldedTransferContract$deserialize_closure0.prototype = { call$1(e) { @@ -52321,26 +54535,26 @@ t4 = A.QuickProtocolBufferResults_getField(decode, 3, t1); return A.ReceiveDescription$(A.QuickProtocolBufferResults_getField(decode, 4, t1), A.QuickProtocolBufferResults_getField(decode, 5, t1), t4, t3, t2, A.QuickProtocolBufferResults_getField(decode, 6, t1)); }, - $signature: 65 + $signature: 146 }; A.ShieldedTransferContract_toJson_closure.prototype = { call$1(desc) { return type$.SpendDescription._as(desc).toJson$0(); }, - $signature: 275 + $signature: 286 }; A.ShieldedTransferContract_toJson_closure0.prototype = { call$1(desc) { return type$.ReceiveDescription._as(desc).toJson$0(); }, - $signature: 276 + $signature: 287 }; A.ShieldedTransferContract_toJson_closure1.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.SpendDescription.prototype = { get$fieldIds() { @@ -52365,7 +54579,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.SmartContractAbiEntryType.prototype = { toString$0(_) { @@ -52380,7 +54594,7 @@ call$1(element) { return type$.SmartContractAbiEntryType._as(element).name.toLowerCase() === this.name.toLowerCase(); }, - $signature: 64 + $signature: 101 }; A.SmartContractAbiEntryType_fromName_closure0.prototype = { call$0() { @@ -52392,13 +54606,13 @@ call$1(element) { return type$.SmartContractAbiEntryType._as(element).value === this.value; }, - $signature: 64 + $signature: 101 }; A.SmartContractAbiEntryType_fromValue_closure0.prototype = { call$0() { throw A.wrapException(B.TronPluginException_B6W); }, - $signature: 278 + $signature: 289 }; A.SmartContractAbiStateMutabilityType.prototype = { toString$0(_) { @@ -52413,7 +54627,7 @@ call$1(element) { return type$.SmartContractAbiStateMutabilityType._as(element).name.toLowerCase() === this.name.toLowerCase(); }, - $signature: 63 + $signature: 98 }; A.SmartContractAbiStateMutabilityType_fromName_closure0.prototype = { call$0() { @@ -52425,13 +54639,13 @@ call$1(element) { return type$.SmartContractAbiStateMutabilityType._as(element).value === this.value; }, - $signature: 63 + $signature: 98 }; A.SmartContractAbiStateMutabilityType_fromValue_closure0.prototype = { call$0() { throw A.wrapException(B.TronPluginException_awe); }, - $signature: 280 + $signature: 291 }; A.ClearABIContract.prototype = { get$fieldIds() { @@ -52481,7 +54695,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.SmartContract.prototype = { get$fieldIds() { @@ -52520,21 +54734,21 @@ call$1(e) { return A.SmartContractABI_SmartContractABI$deserialize(type$.List_int._as(e)); }, - $signature: 281 + $signature: 292 }; A.SmartContract_SmartContract$deserialize_closure0.prototype = { call$1(e) { type$.List_int._as(e); return new A.TronAddress(A.TrxAddressUtils_fromHexBytes(e), A.BytesUtils_toHexString(e, true, null)); }, - $signature: 77 + $signature: 108 }; A.SmartContract_toJson_closure.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.SmartContractABI.prototype = { get$fieldIds() { @@ -52557,19 +54771,19 @@ call$1(e) { return A.SmartContractABIEntry_SmartContractABIEntry$fromJson(type$.Map_String_dynamic._as(e)); }, - $signature: 282 + $signature: 293 }; A.SmartContractABI_SmartContractABI$deserialize_closure.prototype = { call$1(e) { return A.SmartContractABIEntry_SmartContractABIEntry$deserialize(type$.List_int._as(e)); }, - $signature: 283 + $signature: 294 }; A.SmartContractABI_toJson_closure.prototype = { call$1(e) { return type$.SmartContractABIEntry._as(e).toJson$0(); }, - $signature: 284 + $signature: 295 }; A.SmartContractABIEntry.prototype = { get$fieldIds() { @@ -52614,37 +54828,37 @@ call$1(e) { return A.SmartContractBABIEntryParam_SmartContractBABIEntryParam$fromJson(type$.Map_String_dynamic._as(e)); }, - $signature: 37 + $signature: 48 }; A.SmartContractABIEntry_SmartContractABIEntry$fromJson_closure0.prototype = { call$1(e) { return A.SmartContractBABIEntryParam_SmartContractBABIEntryParam$fromJson(type$.Map_String_dynamic._as(e)); }, - $signature: 37 + $signature: 48 }; A.SmartContractABIEntry_SmartContractABIEntry$deserialize_closure.prototype = { call$1(e) { return A.SmartContractBABIEntryParam_SmartContractBABIEntryParam$deserialize(type$.List_int._as(e)); }, - $signature: 37 + $signature: 48 }; A.SmartContractABIEntry_SmartContractABIEntry$deserialize_closure0.prototype = { call$1(e) { return A.SmartContractBABIEntryParam_SmartContractBABIEntryParam$deserialize(type$.List_int._as(e)); }, - $signature: 37 + $signature: 48 }; A.SmartContractABIEntry_toJson_closure.prototype = { call$1(e) { return type$.SmartContractBABIEntryParam._as(e).toJson$0(); }, - $signature: 60 + $signature: 97 }; A.SmartContractABIEntry_toJson_closure0.prototype = { call$1(e) { return type$.SmartContractBABIEntryParam._as(e).toJson$0(); }, - $signature: 60 + $signature: 97 }; A.SmartContractBABIEntryParam.prototype = { get$fieldIds() { @@ -52675,7 +54889,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.TriggerSmartContract.prototype = { get$fieldIds() { @@ -52711,7 +54925,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.UpdateEnergyLimitContract.prototype = { get$fieldIds() { @@ -52740,7 +54954,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.UpdateSettingContract.prototype = { get$fieldIds() { @@ -52769,7 +54983,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.UpdateBrokerageContract.prototype = { get$fieldIds() { @@ -52837,19 +55051,19 @@ call$1(s) { return A.BytesUtils_fromHexString(A._asString(s)); }, - $signature: 287 + $signature: 298 }; A.Transaction_closure.prototype = { call$1(e) { return A.BytesUtils_toBytes(type$.List_int._as(e), true); }, - $signature: 58 + $signature: 30 }; A.Transaction_toJson_closure.prototype = { call$1(s) { return A.BytesUtils_toHexString(type$.List_int._as(s), true, null); }, - $signature: 100 + $signature: 74 }; A.TransactionContract.prototype = { toJson$0() { @@ -52877,7 +55091,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.TransactionRaw.prototype = { toJson$0() { @@ -52961,7 +55175,7 @@ t1 = A.OnChainUtils_parseBytes(_s13_0, t3.$index(0, _s13_0), t1); return new A.TransactionContract(type, any, A.BytesUtils_tryToBytes(t2, true), A.BytesUtils_tryToBytes(t1, true), permissionId); }, - $signature: 288 + $signature: 299 }; A.TransactionRaw_TransactionRaw$fromJson_closure0.prototype = { call$1(e) { @@ -52977,7 +55191,7 @@ } return new A.Authority(t2, A.BytesUtils_tryToBytes(A.StringUtils_tryEncode(A._asStringQ(t1.$index(0, "permission_name"))), true)); }, - $signature: 289 + $signature: 300 }; A.TransactionRaw_TransactionRaw$deserialize_closure.prototype = { call$1(e) { @@ -52994,32 +55208,32 @@ t5 = A.QuickProtocolBufferResults_getField(decode, 5, type$.nullable_int); return new A.TransactionContract(t2, t1, A.BytesUtils_tryToBytes(t4, true), A.BytesUtils_tryToBytes(t3, true), t5); }, - $signature: 290 + $signature: 301 }; A.TransactionRaw_TransactionRaw$deserialize_closure0.prototype = { call$1(e) { return A.Authority_Authority$deserialize(type$.List_int._as(e)); }, - $signature: 291 + $signature: 302 }; A.TransactionRaw_toJson_closure.prototype = { call$1(auth) { return type$.Authority._as(auth).toJson$0(); }, - $signature: 292 + $signature: 303 }; A.TransactionRaw_toJson_closure0.prototype = { call$1(c) { return type$.TransactionContract._as(c).toJson$0(); }, - $signature: 293 + $signature: 304 }; A.TransactionRaw_toJson_closure1.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.VoteAssetContract.prototype = { get$fieldIds() { @@ -53049,27 +55263,27 @@ call$1(address) { return A.TronAddress_TronAddress(A._asString(address)); }, - $signature: 294 + $signature: 305 }; A.VoteAssetContract_VoteAssetContract$deserialize_closure.prototype = { call$1(e) { type$.List_int._as(e); return new A.TronAddress(A.TrxAddressUtils_fromHexBytes(e), A.BytesUtils_toHexString(e, true, null)); }, - $signature: 295 + $signature: 306 }; A.VoteAssetContract_toJson_closure.prototype = { call$1(address) { return type$.TronAddress._as(address).toAddress$1(true); }, - $signature: 296 + $signature: 307 }; A.VoteAssetContract_toJson_closure0.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.VoteWitnessContract.prototype = { get$fieldIds() { @@ -53108,7 +55322,7 @@ t1 = A.OnChainUtils_parseMap("vote", true, vote, type$.String, type$.dynamic); return new A.VoteWitnessContractVote(A.OnChainUtils_parseTronAddress(_s12_, t1.$index(0, _s12_), type$.TronAddress), A.OnChainUtils_parseBigInt(_s10_, t1.$index(0, _s10_), type$.BigInt)); }, - $signature: 140 + $signature: 96 }; A.VoteWitnessContract_VoteWitnessContract$deserialize_closure.prototype = { call$1(e) { @@ -53117,20 +55331,20 @@ t1 = A.QuickProtocolBufferResults_getField(decode, 1, t1); return new A.VoteWitnessContractVote(new A.TronAddress(A.TrxAddressUtils_fromHexBytes(t1), A.BytesUtils_toHexString(t1, true, null)), A.QuickProtocolBufferResults_getField(decode, 2, type$.BigInt)); }, - $signature: 140 + $signature: 96 }; A.VoteWitnessContract_toJson_closure.prototype = { call$1(vote) { return type$.VoteWitnessContractVote._as(vote).toJson$0(); }, - $signature: 298 + $signature: 309 }; A.VoteWitnessContract_toJson_closure0.prototype = { call$2(key, value) { A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.VoteWitnessContractVote.prototype = { get$fieldIds() { @@ -53170,7 +55384,7 @@ A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.WitnessCreateContract.prototype = { get$fieldIds() { @@ -53196,13 +55410,13 @@ A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.ProtocolBufferDecoder__decodeInt_closure.prototype = { call$1(element) { return (A._asInt(element) & 128) === 0; }, - $signature: 44 + $signature: 58 }; A.ProtocolBufferDecoderResult.prototype = { toString$0(_) { @@ -53224,31 +55438,31 @@ call$1(element) { return type$.ProtocolBufferDecoderResult_dynamic._as(element).tagNumber === this.tag; }, - $signature: 34 + $signature: 42 }; A.QuickProtocolBufferResults_getField_closure0.prototype = { call$1(e) { return type$.ProtocolBufferDecoderResult_dynamic._as(e).tagNumber; }, - $signature: 114 + $signature: 94 }; A.QuickProtocolBufferResults_getResult_closure.prototype = { call$1(element) { return type$.ProtocolBufferDecoderResult_dynamic._as(element).tagNumber === this.id; }, - $signature: 34 + $signature: 42 }; A.QuickProtocolBufferResults_getResult_closure0.prototype = { call$1(e) { return type$.ProtocolBufferDecoderResult_dynamic._as(e).tagNumber; }, - $signature: 114 + $signature: 94 }; A.QuickProtocolBufferResults_getFields_closure.prototype = { call$1(element) { return type$.ProtocolBufferDecoderResult_dynamic._as(element).tagNumber === this.tag; }, - $signature: 34 + $signature: 42 }; A.QuickProtocolBufferResults_getFields_closure0.prototype = { call$1(e) { @@ -53262,7 +55476,7 @@ call$1(element) { return type$.ProtocolBufferDecoderResult_dynamic._as(element).tagNumber === this.tagId; }, - $signature: 34 + $signature: 42 }; A.TVMRequestParam.prototype = { get$visible() { @@ -53293,7 +55507,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.TVMRequestParam_toRequest_closure0.prototype = { call$1(object) { @@ -53309,7 +55523,7 @@ this.replace.$indexSet(0, n, object); return n; }, - $signature: 301 + $signature: 312 }; A.TronRequestDetails.prototype = { url$1(uri) { @@ -53345,7 +55559,7 @@ switch ($async$goto) { case 0: // Function start - params = request.toRequest$1(++$async$self._id); + params = request.toRequest$1(++$async$self._provider$_id); request.get$method(); $async$goto = 3; return A._asyncAwait($async$self.rpc.post$2(params, null), $async$request$1$1); @@ -53588,20 +55802,20 @@ call$1(part) { return A._asString(part) !== ""; }, - $signature: 25 + $signature: 27 }; A.Context_split_closure.prototype = { call$1(part) { return A._asString(part).length !== 0; }, - $signature: 25 + $signature: 27 }; A._validateArgList_closure.prototype = { call$1(arg) { A._asStringQ(arg); return arg == null ? "null" : '"' + arg + '"'; }, - $signature: 302 + $signature: 313 }; A.InternalStyle.prototype = { getRoot$1(path) { @@ -53994,14 +56208,14 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.MetadataException_toString_closure.prototype = { call$1(e) { A._asString(e); return e + ": " + A.S(this.$this.details.$index(0, e)); }, - $signature: 15 + $signature: 16 }; A.MetadataApiInterface.prototype = {}; A.LatestMetadataInterface.prototype = {}; @@ -54032,7 +56246,7 @@ call$1(element) { return type$.PrimitiveTypes._as(element).name === this.value; }, - $signature: 303 + $signature: 314 }; A.PrimitiveTypes_fromValue_closure0.prototype = { call$0() { @@ -54076,7 +56290,7 @@ call$1(e) { return type$.PrimitiveTypes._as(e).name; }, - $signature: 304 + $signature: 315 }; A.Si1Field.prototype = { layout$1$property(property) { @@ -54150,19 +56364,19 @@ type$.Map_String_dynamic._as(e); return new A.Si1TypeParameter(A._asString(e.$index(0, "name")), A._asIntQ(e.$index(0, "type"))); }, - $signature: 305 + $signature: 316 }; A.Si1Type$deserializeJson_closure0.prototype = { call$1(e) { return type$.Si1TypeParameter._as(e).type; }, - $signature: 306 + $signature: 317 }; A.Si1Type_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.Si1TypeParameter._as(e).scaleJsonSerialize$0(); }, - $signature: 307 + $signature: 318 }; A.Si1TypeDefsIndexesConst.prototype = { toString$0(_) { @@ -54173,7 +56387,7 @@ call$1(element) { return type$.Si1TypeDefsIndexesConst._as(element).name === this.name; }, - $signature: 308 + $signature: 319 }; A.Si1TypeDefsIndexesConst_fromValue_closure0.prototype = { call$0() { @@ -54218,7 +56432,7 @@ }; A.Si1TypeDefCompact.prototype = { layout$1$property(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, layout$0() { return this.layout$1$property(null); @@ -54263,13 +56477,13 @@ call$1(e) { return A.Si1Field$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 111 + $signature: 93 }; A.Si1TypeDefComposite_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.Si1Field._as(e).scaleJsonSerialize$0(); }, - $signature: 110 + $signature: 92 }; A.Si1TypeDefPrimitive.prototype = { get$typeName() { @@ -54279,7 +56493,7 @@ }; A.Si1TypeDefSequence.prototype = { layout$1$property(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, layout$0() { return this.layout$1$property(null); @@ -54296,7 +56510,7 @@ }; A.Si1TypeDefTuple.prototype = { layout$1$property(property) { - return A.LayoutConst_compactVec(new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, null), property, type$.int); + return A.LayoutConst_compactVec(new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, null), property, type$.int); }, layout$0() { return this.layout$1$property(null); @@ -54341,13 +56555,13 @@ call$1(e) { return A.Si1Variant$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 311 + $signature: 322 }; A.Si1TypeDefVariant_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.Si1Variant._as(e).scaleJsonSerialize$0(); }, - $signature: 312 + $signature: 323 }; A.Si1TypeParameter.prototype = { layout$1$property(property) { @@ -54385,20 +56599,20 @@ call$1(e) { return A.Si1Field$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 111 + $signature: 93 }; A.Si1Variant_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.Si1Field._as(e).scaleJsonSerialize$0(); }, - $signature: 110 + $signature: 92 }; A.StorageHasherV11Options.prototype = {}; A.StorageHasherV11Options_fromValue_closure.prototype = { call$1(element) { return type$.StorageHasherV11Options._as(element).name === this.value; }, - $signature: 313 + $signature: 324 }; A.StorageHasherV11Options_fromValue_closure0.prototype = { call$0() { @@ -54450,13 +56664,13 @@ call$1(e) { return A.SignedExtensionMetadataV14$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 107 + $signature: 91 }; A.ExtrinsicMetadataV14_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.SignedExtensionMetadataV14._as(e).scaleJsonSerialize$0(); }, - $signature: 103 + $signature: 90 }; A.MetadataV14.prototype = { layout$1$property(property) { @@ -54482,18 +56696,18 @@ var decode = A.PalletMetadataV14$deserializeJson(type$.Map_String_dynamic._as(e)); return new A.MapEntry(decode.index, decode, type$.MapEntry_dynamic_dynamic); }, - $signature: 98 + $signature: 89 }; A.MetadataV14_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.PalletMetadataV14._as(e).scaleJsonSerialize$0(); }, - $signature: 317 + $signature: 328 }; A._MetadataV14_SubstrateMetadata_LatestMetadataInterface.prototype = {}; A.PalletCallMetadataV14.prototype = { layout$1$property(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, layout$0() { return this.layout$1$property(null); @@ -54525,7 +56739,7 @@ }; A.PalletErrorMetadataV14.prototype = { layout$1$property(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, layout$0() { return this.layout$1$property(null); @@ -54539,7 +56753,7 @@ }; A.PalletEventMetadataV14.prototype = { layout$1$property(property) { - return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, "type")], type$.JSArray_Layout_dynamic), false, property); }, layout$0() { return this.layout$1$property(null); @@ -54583,13 +56797,13 @@ type$.Map_String_dynamic._as(e); return new A.PalletConstantMetadataV14(A._asString(e.$index(0, "name")), A._asInt(e.$index(0, "type")), A.BytesUtils_toBytes(type$.List_int._as(e.$index(0, "value")), true), A.List_List$unmodifiable(type$.Iterable_dynamic._as(e.$index(0, "docs")), type$.String)); }, - $signature: 318 + $signature: 329 }; A.PalletMetadataV14_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.PalletConstantMetadataV14._as(e).scaleJsonSerialize$0(); }, - $signature: 319 + $signature: 330 }; A.PalletStorageMetadataV14.prototype = { layout$1$property(property) { @@ -54614,13 +56828,13 @@ t1._as(e); return new A.StorageEntryMetadataV14(A._asString(e.$index(0, "name")), new A.StorageEntryModifierV14(A.StorageEntryModifierV9_fromValue(A.SubstrateEnumSerializationUtils_getScaleEnumKey(t1._as(e.$index(0, "modifier")), null, null)).name), A.StorageEntryTypeV14_StorageEntryTypeV14$deserializeJson(t1._as(e.$index(0, "type")), type$.dynamic), A.BytesUtils_toBytes(type$.List_int._as(e.$index(0, "fallback")), true), A.List_List$unmodifiable(type$.Iterable_dynamic._as(e.$index(0, "docs")), type$.String)); }, - $signature: 320 + $signature: 331 }; A.PalletStorageMetadataV14_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.StorageEntryMetadataV14._as(e).scaleJsonSerialize$0(); }, - $signature: 321 + $signature: 332 }; A.PortableRegistryV14.prototype = { layout$1$property(property) { @@ -54648,13 +56862,13 @@ t2 = A._asInt(e.$index(0, "id")); return new A.MapEntry(t2, new A.PortableTypeV14(t2, t1), type$.MapEntry_int_PortableTypeV14); }, - $signature: 322 + $signature: 333 }; A.PortableRegistryV14_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.PortableTypeV14._as(e).scaleJsonSerialize$0(); }, - $signature: 323 + $signature: 334 }; A.PortableTypeV14.prototype = { layout$1$property(property) { @@ -54712,20 +56926,20 @@ call$1(e) { return new A.StorageHasherV14(A.StorageHasherV11Options_fromValue(A.SubstrateEnumSerializationUtils_getScaleEnumKey(type$.Map_String_dynamic._as(e), null, null))); }, - $signature: 324 + $signature: 335 }; A.StorageEntryTypeV14Map_scaleJsonSerialize_closure.prototype = { call$1(e) { return A.LinkedHashMap_LinkedHashMap$_literal([type$.StorageHasherV14._as(e).option.name, null], type$.String, type$.dynamic); }, - $signature: 325 + $signature: 336 }; A.StorageEntryTypeV14Plain.prototype = { get$typeName() { return "Plain"; }, layout$1$property(property) { - return new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian0, null, false), -1, property); + return new A.CompactIntLayout(A.IntegerLayout$(4, B.C_Endian, null, false), -1, property); }, layout$0() { return this.layout$1$property(null); @@ -54817,13 +57031,13 @@ call$1(e) { return A.SignedExtensionMetadataV14$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 107 + $signature: 91 }; A.ExtrinsicMetadataV15_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.SignedExtensionMetadataV14._as(e).scaleJsonSerialize$0(); }, - $signature: 103 + $signature: 90 }; A.MetadataV15.prototype = { layout$1$property(property) { @@ -54852,25 +57066,25 @@ var decode = A.PalletMetadataV15$deserializeJson(type$.Map_String_dynamic._as(e)); return new A.MapEntry(decode.index, decode, type$.MapEntry_dynamic_dynamic); }, - $signature: 98 + $signature: 89 }; A.MetadataV15$deserializeJson_closure0.prototype = { call$1(e) { return A.RuntimeApiMetadataV15$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 326 + $signature: 337 }; A.MetadataV15_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.PalletMetadataV15._as(e).scaleJsonSerialize$0(); }, - $signature: 327 + $signature: 338 }; A.MetadataV15_scaleJsonSerialize_closure0.prototype = { call$1(e) { return type$.RuntimeApiMetadataV15._as(e).scaleJsonSerialize$0(); }, - $signature: 328 + $signature: 339 }; A._MetadataV15_SubstrateMetadata_LatestMetadataInterface.prototype = {}; A.OuterEnums15.prototype = { @@ -54926,13 +57140,13 @@ call$1(e) { return A.RuntimeApiMethodMetadataV15$deserializeJson(type$.Map_String_dynamic._as(e)); }, - $signature: 329 + $signature: 340 }; A.RuntimeApiMetadataV15_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.RuntimeApiMethodMetadataV15._as(e).scaleJsonSerialize$0(); }, - $signature: 330 + $signature: 341 }; A.RuntimeApiMethodMetadataV15.prototype = { layout$1$property(property) { @@ -54957,13 +57171,13 @@ type$.Map_String_dynamic._as(e); return new A.RuntimeApiMethodParamMetadataV15(A._asString(e.$index(0, "name")), A._asInt(e.$index(0, "type"))); }, - $signature: 331 + $signature: 342 }; A.RuntimeApiMethodMetadataV15_scaleJsonSerialize_closure.prototype = { call$1(e) { return type$.RuntimeApiMethodParamMetadataV15._as(e).scaleJsonSerialize$0(); }, - $signature: 332 + $signature: 343 }; A.RuntimeApiMethodParamMetadataV15.prototype = { layout$1$property(property) { @@ -55000,7 +57214,7 @@ call$1(element) { return type$.StorageEntryModifierV9._as(element).name === this.value; }, - $signature: 333 + $signature: 344 }; A.StorageEntryModifierV9_fromValue_closure0.prototype = { call$0() { @@ -55011,7 +57225,7 @@ A.VersionedMetadata.prototype = { layout$1$property(property) { var t1 = this.metadata.layout$1$property("metadata"); - return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(4, B.C_Endian0, "magicNumber", false), A.IntegerLayout$(1, B.C_Endian0, "version", false), t1], type$.JSArray_Layout_dynamic), false, property); + return A.StructLayout_StructLayout(A._setArrayType([A.IntegerLayout$(4, B.C_Endian, "magicNumber", false), A.IntegerLayout$(1, B.C_Endian, "version", false), t1], type$.JSArray_Layout_dynamic), false, property); }, layout$0() { return this.layout$1$property(null); @@ -55077,7 +57291,7 @@ call$1(v) { return v == null; }, - $signature: 27 + $signature: 28 }; A.SubstrateRPCRequest_toRequest_closure0.prototype = { call$1(e) { @@ -55103,7 +57317,7 @@ }, onResonse$1(result) { A._asString(result); - return A.List_List$from(type$.Iterable_dynamic._as(A.LayoutConst_compactVec(A.IntegerLayout$(4, B.C_Endian0, null, false), null, type$.dynamic).deserialize$1(A.BytesUtils_fromHexString(result)).value), true, type$.int); + return A.List_List$from(type$.Iterable_dynamic._as(A.LayoutConst_compactVec(A.IntegerLayout$(4, B.C_Endian, null, false), null, type$.dynamic).deserialize$1(A.BytesUtils_fromHexString(result)).value), true, type$.int); } }; A.SubstrateRPC.prototype = { @@ -55121,7 +57335,7 @@ switch ($async$goto) { case 0: // Function start - params = request.toRequest$1(++$async$self._provider0$_id); + params = request.toRequest$1(++$async$self._provider1$_id); t1 = type$.Map_String_dynamic; $async$temp1 = t1; $async$goto = 3; @@ -55168,8 +57382,8 @@ data = A.LayoutByteWriter$(t1), size = scaleLayout.encode$2(this.scaleJsonSerialize$1$property(null), data); if (t1 < 0) - return B.JSArray_methods.sublist$2(data._byte_handler$_buffer._bytes, 0, size); - return data._byte_handler$_buffer._bytes; + return B.JSArray_methods.sublist$2(data._byte_handler$_buffer._byte_handler$_bytes, 0, size); + return data._byte_handler$_buffer._byte_handler$_bytes; }, toString$0(_) { return A.getRuntimeTypeOfDartObject(this).toString$0(0) + A.S(this.scaleJsonSerialize$0()); @@ -55609,7 +57823,7 @@ call$0() { return this.color; }, - $signature: 334 + $signature: 345 }; A.Highlighter$__closure.prototype = { call$1(line) { @@ -55617,34 +57831,34 @@ t2 = A._arrayInstanceType(t1); return new A.WhereIterable(t1, t2._eval$1("bool(1)")._as(new A.Highlighter$___closure()), t2._eval$1("WhereIterable<1>")).get$length(0); }, - $signature: 335 + $signature: 346 }; A.Highlighter$___closure.prototype = { call$1(highlight) { var t1 = type$._Highlight._as(highlight).span; return t1.get$start().get$line() !== t1.get$end().get$line(); }, - $signature: 42 + $signature: 50 }; A.Highlighter$__closure0.prototype = { call$1(line) { return type$._Line._as(line).url; }, - $signature: 337 + $signature: 348 }; A.Highlighter__collateLines_closure.prototype = { call$1(highlight) { var t1 = type$._Highlight._as(highlight).span.get$sourceUrl(); return t1 == null ? new A.Object() : t1; }, - $signature: 338 + $signature: 349 }; A.Highlighter__collateLines_closure0.prototype = { call$2(highlight1, highlight2) { var t1 = type$._Highlight; return t1._as(highlight1).span.compareTo$1(0, t1._as(highlight2).span); }, - $signature: 339 + $signature: 350 }; A.Highlighter__collateLines_closure1.prototype = { call$1(entry) { @@ -55688,20 +57902,20 @@ } return lines; }, - $signature: 340 + $signature: 351 }; A.Highlighter__collateLines__closure.prototype = { call$1(highlight) { return type$._Highlight._as(highlight).span.get$end().get$line() < this.line.number; }, - $signature: 42 + $signature: 50 }; A.Highlighter_highlight_closure.prototype = { call$1(highlight) { type$._Highlight._as(highlight); return true; }, - $signature: 42 + $signature: 50 }; A.Highlighter__writeFileStart_closure.prototype = { call$0() { @@ -55710,7 +57924,7 @@ t1._contents += t2; return null; }, - $signature: 1 + $signature: 0 }; A.Highlighter__writeMultilineHighlights_closure.prototype = { call$0() { @@ -55718,7 +57932,7 @@ t2 = this.startLine === this.line.number ? "\u250c" : "\u2514"; t1._contents += t2; }, - $signature: 14 + $signature: 15 }; A.Highlighter__writeMultilineHighlights_closure0.prototype = { call$0() { @@ -55726,14 +57940,14 @@ t2 = this.highlight == null ? "\u2500" : "\u253c"; t1._contents += t2; }, - $signature: 14 + $signature: 15 }; A.Highlighter__writeMultilineHighlights_closure1.prototype = { call$0() { this.$this._highlighter$_buffer._contents += "\u2500"; return null; }, - $signature: 1 + $signature: 0 }; A.Highlighter__writeMultilineHighlights_closure2.prototype = { call$0() { @@ -55761,7 +57975,7 @@ } } }, - $signature: 14 + $signature: 15 }; A.Highlighter__writeMultilineHighlights__closure.prototype = { call$0() { @@ -55769,20 +57983,20 @@ t2 = this._box_0.openedOnThisLine ? "\u252c" : "\u250c"; t1._contents += t2; }, - $signature: 14 + $signature: 15 }; A.Highlighter__writeMultilineHighlights__closure0.prototype = { call$0() { this.$this._highlighter$_buffer._contents += this.vertical; }, - $signature: 14 + $signature: 15 }; A.Highlighter__writeHighlightedText_closure.prototype = { call$0() { var _this = this; return _this.$this._writeText$1(B.JSString_methods.substring$2(_this.text, _this.startColumn, _this.endColumn)); }, - $signature: 1 + $signature: 0 }; A.Highlighter__writeIndicator_closure.prototype = { call$0() { @@ -55803,13 +58017,13 @@ t4 = t2._contents += t4; return t4.length - t3.length; }, - $signature: 43 + $signature: 33 }; A.Highlighter__writeIndicator_closure0.prototype = { call$0() { return this.$this._writeArrow$2(this.line, this.highlight.span.get$start().get$column()); }, - $signature: 1 + $signature: 0 }; A.Highlighter__writeIndicator_closure1.prototype = { call$0() { @@ -55824,7 +58038,7 @@ t1._writeArrow$3$beginning(_this.line, Math.max(_this.highlight.span.get$end().get$column() - 1, 0), false); return t2._contents.length - t3.length; }, - $signature: 43 + $signature: 33 }; A.Highlighter__writeSidebar_closure.prototype = { call$0() { @@ -55838,7 +58052,7 @@ t3 = this.end; t2._contents = t1 + (t3 == null ? "\u2502" : t3); }, - $signature: 14 + $signature: 15 }; A._Highlight.prototype = { toString$0(_) { @@ -55860,7 +58074,7 @@ } return A._Highlight__normalizeEndOfLine(A._Highlight__normalizeTrailingNewline(A._Highlight__normalizeNewlines(t1))); }, - $signature: 341 + $signature: 352 }; A._Line.prototype = { toString$0(_) { @@ -56116,15 +58330,18 @@ } }; A.TonAddress.prototype = { - toString$0(_) { + toFriendlyAddress$0() { var t2, _this = this, t1 = _this.defaultFlags; - if (t1.length === 0) + t1 = t1.length === 0 || B.JSArray_methods.contains$1(t1, B.FriendlyAddressFlags_17); + t2 = B.JSArray_methods.contains$1(_this.defaultFlags, B.FriendlyAddressFlags_128); + return A.TonAddressUtils_encodeAddress(t1, _this.hash, t2, true, _this.workChain); + }, + toString$0(_) { + var _this = this; + if (_this.defaultFlags.length === 0) return A.BytesUtils_toHexString(_this.hash, true, "" + _this.workChain + ":"); - t2 = B.JSArray_methods.contains$1(t1, B.FriendlyAddressFlags_17); - t2 = t2; - t1 = B.JSArray_methods.contains$1(t1, B.FriendlyAddressFlags_128); - return A.TonAddressUtils_encodeAddress(t2, _this.hash, t1, true, _this.workChain); + return _this.toFriendlyAddress$0(); }, $eq(_, other) { if (other == null) @@ -56137,8 +58354,596 @@ return A.Object_hash(this.hash, this.workChain, B.C_SentinelValue, B.C_SentinelValue); } }; + A.BitBuilder.prototype = { + get$length(_) { + return this._bit_builder$_length; + }, + writeBit$1(value) { + var _this = this, + t1 = _this._bit_builder$_length, + t2 = _this._bytes, + t3 = t2.length, + t4 = t3 * 8; + if (t1 > t4) + throw A.wrapException(A.BocException$("Overflow bytes", A.LinkedHashMap_LinkedHashMap$_literal(["offset", t1, "length", t4], type$.String, type$.dynamic))); + if (value) { + t1 = B.JSNumber_methods.floor$0(t1 / 8); + if (!(t1 >= 0 && t1 < t3)) + return A.ioore(t2, t1); + t3 = t2[t1]; + t4 = B.JSInt_methods.$shl(1, 7 - B.JSInt_methods.$mod(_this._bit_builder$_length, 8)); + if (typeof t3 !== "number") + return t3.$or(); + B.JSArray_methods.$indexSet(t2, t1, (t3 | t4) >>> 0); + } + ++_this._bit_builder$_length; + }, + writeBits$1(src) { + var t1, i; + for (t1 = src._bit_string$_length, i = 0; i < t1; ++i) + this.writeBit$1(src.at$1(i)); + }, + writeBuffer$1(src) { + var t1, t2, t3, t4, t5, i, _this = this; + type$.List_int._as(src); + A.BytesUtils_validateBytes(src, null); + t1 = _this._bit_builder$_length; + if (B.JSInt_methods.$mod(t1, 8) === 0) { + t2 = src.length; + t3 = t1 + t2 * 8; + t4 = _this._bytes; + t5 = t4.length * 8; + if (t3 > t5) + throw A.wrapException(A.BocException$("Overflow bytes", A.LinkedHashMap_LinkedHashMap$_literal(["offset", t3, "length", t5], type$.String, type$.dynamic))); + t1 = B.JSInt_methods._tdivFast$1(t1, 8); + B.JSArray_methods.setRange$3(t4, t1, t1 + t2, src); + _this._bit_builder$_length = _this._bit_builder$_length + src.length * 8; + } else + for (i = 0; i < src.length; ++i) + _this.writeUint$2(src[i], 8); + }, + writeUint$2(value, bits) { + var v, t1, t2, t3, tillByte, bidx, wb, _this = this; + A._BitBuilderUtils_validateBits(bits); + v = A._BitBuilderUtils_parseBigint(value, false); + if (bits === 0) { + t1 = v.compareTo$1(0, $.$get$_BigIntImpl_zero()); + if (t1 !== 0) + throw A.wrapException(A.BocException$("value is not zero for " + bits + " bits.", A.LinkedHashMap_LinkedHashMap$_literal(["value", v], type$.String, type$.dynamic))); + else + return; + } + if (v.get$bitLength(0) > bits) + throw A.wrapException(A.BocException$("BitLength is too small for a value.", A.LinkedHashMap_LinkedHashMap$_literal(["value", v, "bits", bits, "value_bitLength", v.get$bitLength(0)], type$.String, type$.dynamic))); + t1 = _this._bit_builder$_length; + t2 = _this._bytes; + t3 = t2.length; + if (t1 + bits > t3 * 8) + throw A.wrapException(A.BocException$("BitBuilder overflow", null)); + tillByte = 8 - B.JSInt_methods.$mod(t1, 8); + bidx = B.JSNumber_methods.floor$0(t1 / 8); + if (bits < tillByte) { + wb = v.toInt$0(0); + if (!(bidx >= 0 && bidx < t3)) + return A.ioore(t2, bidx); + t1 = t2[bidx]; + t3 = B.JSInt_methods.$shl(wb, tillByte - bits); + if (typeof t1 !== "number") + return t1.$or(); + B.JSArray_methods.$indexSet(t2, bidx, (t1 | t3) >>> 0); + t3 = _this._bit_builder$_length += bits; + t1 = t3; + } else { + wb = v.$shr(0, bits - tillByte).toInt$0(0); + if (!(bidx >= 0 && bidx < t3)) + return A.ioore(t2, bidx); + t1 = t2[bidx]; + if (typeof t1 !== "number") + return t1.$or(); + B.JSArray_methods.$indexSet(t2, bidx, (t1 | wb) >>> 0); + t1 = _this._bit_builder$_length += tillByte; + } + bits -= tillByte; + for (; bits > 0;) + if (bits >= 8) { + bits -= 8; + B.JSArray_methods.$indexSet(t2, B.JSInt_methods._tdivFast$1(t1, 8), v.$shr(0, bits).$and(0, $.$get$_BitBuilderUtils_mask8Big()).toInt$0(0)); + t1 = _this._bit_builder$_length += 8; + } else { + B.JSArray_methods.$indexSet(t2, B.JSInt_methods._tdivFast$1(t1, 8), v.$shl(0, 8 - bits).$and(0, $.$get$_BitBuilderUtils_mask8Big()).toInt$0(0)); + t1 = _this._bit_builder$_length += bits; + bits = 0; + } + }, + writeInt$2(value, bits) { + var v, t1, vBits; + A._BitBuilderUtils_validateBits(bits); + v = A._BitBuilderUtils_parseBigint(value, true); + if (bits === 0) { + $.$get$_BigIntImpl_zero(); + t1 = A.BocException$("value is not zero for " + bits + " bits.", A.LinkedHashMap_LinkedHashMap$_literal(["value", v], type$.String, type$.dynamic)); + throw A.wrapException(t1); + } + if (bits === 1) { + $.$get$_BigIntImpl_one().$negate(0); + $.$get$_BigIntImpl_zero(); + t1 = A.BocException$("value is not zero or -1 for " + bits + " bits.", A.LinkedHashMap_LinkedHashMap$_literal(["value", v], type$.String, type$.dynamic)); + throw A.wrapException(t1); + } + t1 = bits - 1; + vBits = $.$get$_BigIntImpl_one().$shl(0, t1); + if (v.compareTo$1(0, vBits.$negate(0)) < 0 || v.compareTo$1(0, vBits) >= 0) + throw A.wrapException(A.BocException$("Out of range.", A.LinkedHashMap_LinkedHashMap$_literal(["value", v, "length", bits], type$.String, type$.dynamic))); + if (v.compareTo$1(0, $.$get$_BigIntImpl_zero()) < 0) { + this.writeBit$1(true); + v = vBits.$add(0, v); + } else + this.writeBit$1(false); + this.writeUint$2(v, t1); + }, + buffer$0(_) { + var t1 = this._bit_builder$_length; + if (B.JSInt_methods.$mod(t1, 8) !== 0) + throw A.wrapException(A.BocException$("Buffer is not byte aligned", null)); + return A.List_List$unmodifiable(B.JSArray_methods.sublist$2(this._bytes, 0, B.JSInt_methods._tdivFast$1(t1, 8)), type$.int); + } + }; + A.BitReader.prototype = { + skip$1(_, bits) { + var t1 = this._bit_reader$_offset, + t2 = t1 + bits; + if (t2 > this._bits._bit_string$_length) + throw A.wrapException(A.BocException$("Index out of bounds", A.LinkedHashMap_LinkedHashMap$_literal(["length", bits, "offset", t1, "index", t2], type$.String, type$.dynamic))); + this._bit_reader$_offset = t2; + }, + loadBit$0() { + var r = this._bits.at$1(this._bit_reader$_offset); + ++this._bit_reader$_offset; + return r; + }, + loadBits$1(bits) { + var r = this._bits.substring$2(0, this._bit_reader$_offset, bits); + this._bit_reader$_offset += bits; + return r; + }, + loadBuffer$1(bytes) { + var _this = this, + buf = _this._preloadBuffer$2(bytes, _this._bit_reader$_offset); + _this._bit_reader$_offset = _this._bit_reader$_offset + bytes * 8; + return buf; + }, + loadUintBig$1(bits) { + var loaded = this._preloadUint$2(bits, this._bit_reader$_offset); + this._bit_reader$_offset += bits; + return loaded; + }, + loadIntBig$1(bits) { + var res = this._preloadInt$2(bits, this._bit_reader$_offset); + this._bit_reader$_offset += bits; + return res; + }, + loadPaddedBits$1(bits) { + var t1, $length, length0, r, _this = this; + if (B.JSInt_methods.$mod(bits, 8) !== 0) + throw A.wrapException(A.BocException$("Invalid number of bits", A.LinkedHashMap_LinkedHashMap$_literal(["bits", bits], type$.String, type$.dynamic))); + for (t1 = _this._bits, $length = bits; true; $length = length0) { + length0 = $length - 1; + if (t1.at$1(_this._bit_reader$_offset + $length - 1)) { + $length = length0; + break; + } + } + r = t1.substring$2(0, _this._bit_reader$_offset, $length); + _this._bit_reader$_offset += bits; + return r; + }, + _preloadInt$2(bits, offset) { + var t1, sign, res, t2, t3, i; + if (bits === 0) + return $.$get$_BigIntImpl_zero(); + t1 = this._bits; + sign = t1.at$1(offset); + res = $.$get$_BigIntImpl_zero(); + for (t2 = bits - 1, t3 = offset + 1, i = 0; i < t2; ++i) + if (t1.at$1(t3 + i)) + res = res.$add(0, $.$get$_BigIntImpl_one().$shl(0, bits - i - 1 - 1)); + return sign ? res.$sub(0, $.$get$_BigIntImpl_one().$shl(0, t2)) : res; + }, + _preloadUint$2(bits, offset) { + var res, t1, i; + if (bits === 0) + return $.$get$_BigIntImpl_zero(); + res = $.$get$_BigIntImpl_zero(); + for (t1 = this._bits, i = 0; i < bits; ++i) + if (t1.at$1(offset + i)) + res = res.$add(0, $.$get$_BigIntImpl_one().$shl(0, bits - i - 1)); + return res; + }, + _preloadBuffer$2(bytes, offset) { + var buf, i, + fastBuffer = this._bits.subbuffer$2(offset, bytes * 8); + if (fastBuffer != null) + return fastBuffer; + buf = A.List_List$filled(bytes, 0, false, type$.int); + for (i = 0; i < bytes; ++i) + B.JSArray_methods.$indexSet(buf, i, this._preloadUint$2(8, offset + i * 8).toInt$0(0)); + return buf; + } + }; + A.BitString.prototype = { + get$length(_) { + return this._bit_string$_length; + }, + clone$0() { + return A.BitString_BitString(A.List_List$from(this._data, true, type$.int), this._bit_string$_offset, this._bit_string$_length); + }, + at$1(index) { + var byteIndex, t2, + t1 = this._bit_string$_length; + A._BitStringUtils_validateOffset(index, t1, null); + if (index >= t1) + throw A.wrapException(A.BocException$("index is out of bounds", A.LinkedHashMap_LinkedHashMap$_literal(["index", index, "length", t1], type$.String, type$.dynamic))); + t1 = this._bit_string$_offset + index; + byteIndex = B.JSInt_methods._shrOtherPositive$1(t1, 3); + t1 = B.JSInt_methods.$mod(t1, 8); + t2 = this._data; + if (!(byteIndex < t2.length)) + return A.ioore(t2, byteIndex); + t2 = t2[byteIndex]; + t1 = B.JSInt_methods.$shl(1, 7 - t1); + if (typeof t2 !== "number") + return t2.$and(); + return (t2 & t1) >>> 0 !== 0; + }, + substring$2(_, offset, $length) { + A._BitStringUtils_validateOffset(offset, this._bit_string$_length, $length); + if ($length === 0) + return B.BitString_0_0_List_empty; + return A.BitString_BitString(this._data, this._bit_string$_offset + offset, $length); + }, + subbuffer$2(offset, $length) { + var t1, start; + A._BitStringUtils_validateOffset(offset, this._bit_string$_length, $length); + if (B.JSInt_methods.$mod($length, 8) !== 0) + return null; + t1 = this._bit_string$_offset + offset; + if (B.JSInt_methods.$mod(t1, 8) !== 0) + return null; + start = B.JSInt_methods._shrOtherPositive$1(t1, 3); + return B.JSArray_methods.sublist$2(this._data, start, start + B.JSInt_methods._shrOtherPositive$1($length, 3)); + }, + toString$0(_) { + var hex, + padded = A.BocUtils_bitsToPaddedBuffer(this).buffer$0(0), + t1 = this._bit_string$_length; + if (B.JSInt_methods.$mod(t1, 4) === 0) { + hex = A.BytesUtils_toHexString(B.JSArray_methods.sublist$2(padded, 0, B.JSNumber_methods.ceil$0(t1 / 8)), false, null); + if (B.JSInt_methods.$mod(t1, 8) === 0) + return hex; + else + return B.JSString_methods.substring$2(hex, 0, hex.length - 1); + } else { + hex = A.BytesUtils_toHexString(padded, false, null); + if (B.JSInt_methods.$mod(t1, 8) <= 4) + return B.JSString_methods.substring$2(hex, 0, hex.length - 1) + "_"; + else + return hex + "_"; + } + }, + $eq(_, other) { + var t1, i; + if (other == null) + return false; + if (!(other instanceof A.BitString)) + return false; + t1 = this._bit_string$_length; + if (other._bit_string$_length !== t1) + return false; + for (i = 0; i < t1; ++i) + if (this.at$1(i) !== other.at$1(i)) + return false; + return true; + }, + get$hashCode(_) { + return A.Object_hash(this._data, this._bit_string$_length, B.C_SentinelValue, B.C_SentinelValue); + } + }; + A.Builder.prototype = { + storeBit$1(value) { + this._builder$_bits.writeBit$1(value > 0); + return this; + }, + storeRef$1(cell) { + var t1 = this._refs, + t2 = t1.length; + if (t2 >= 4) + throw A.wrapException(A.BocException$("Too many references.", A.LinkedHashMap_LinkedHashMap$_literal(["maximum", 4, "refrence", t2], type$.String, type$.dynamic))); + B.JSArray_methods.add$1(t1, cell); + return this; + }, + storeMaybeRef$1$cell(cell) { + this.storeBit$1(1); + this.storeRef$1(cell); + return this; + }, + storeSlice$1(src) { + var t3, + c = src.clone$0(), + t1 = c._reader, + t2 = t1._bits._bit_string$_length - t1._bit_reader$_offset; + if (t2 > 0) + this._builder$_bits.writeBits$1(t1.loadBits$1(t2)); + for (t1 = c._slice$_refs, t2 = t1.length; t3 = c._refsOffset, t2 - t3 > 0;) { + if (t3 >= t2) + A.throwExpression(A.BocException$("No more references", null)); + c._refsOffset = t3 + 1; + if (!(t3 < t2)) + return A.ioore(t1, t3); + this.storeRef$1(t1[t3]); + } + return this; + }, + endCell$0() { + var t1 = this._builder$_bits; + t1 = A.BitString_BitString(t1._bytes, 0, t1._bit_builder$_length); + return A.Cell_Cell(t1, false, this._refs); + } + }; + A.Cell.prototype = { + beginParse$0() { + if (this.type !== B.CellType_Ordinary_m1) + throw A.wrapException(A.BocException$("Exotic cells cannot be parsed", null)); + var t1 = this.bits.clone$0(); + return new A.Slice(new A.BitReader(A._setArrayType([], type$.JSArray_int), t1, 0), A.List_List$unmodifiable(this.refs, type$.Cell)); + }, + hash$1$level(level) { + var t1 = this._hashes, + t2 = t1.length, + t3 = Math.min(t2 - 1, level); + if (t3 >>> 0 !== t3 || t3 >= t2) + return A.ioore(t1, t3); + return t1[t3]; + }, + hash$0() { + return this.hash$1$level(3); + }, + depth$1$level(level) { + var t1 = this._depths, + t2 = t1.length, + t3 = Math.min(t2 - 1, level); + if (t3 >>> 0 !== t3 || t3 >= t2) + return A.ioore(t1, t3); + return t1[t3]; + }, + toBase64$0() { + return A.Base64Utils_encodeBase64(A.BocSerialization_serialize(true, false, this), false); + }, + toString$1$indent(_, indent) { + var t, s, t2, t3, _i, + t1 = this.type; + if (t1 !== B.CellType_Ordinary_m1) + if (t1 === B.CellType_MerkleProof_3) + t = "p"; + else if (t1 === B.CellType_MerkleUpdate_4) + t = "u"; + else + t = t1 === B.CellType_PrunedBranch_1 ? "p" : "x"; + else + t = "x"; + s = indent + t + "{" + this.bits.toString$0(0) + "}"; + for (t1 = this.refs, t2 = t1.length, t3 = indent + " ", _i = 0; _i < t2; ++_i) + s += "\n" + J.toString$1$indent$(t1[_i], t3); + return s; + }, + toString$0(_) { + return this.toString$1$indent(0, ""); + }, + $eq(_, other) { + var t1, t2, t3, t4, i; + if (other == null) + return false; + if (!(other instanceof A.Cell)) + return false; + t1 = other._hashes; + t2 = t1.length; + t3 = this._hashes; + t4 = t3.length; + if (t2 !== t4) + return false; + for (i = 0; i < t4; ++i) { + if (!(i < t2)) + return A.ioore(t1, i); + if (!A.BytesUtils_bytesEqual(t1[i], t3[i])) + return false; + } + return true; + }, + get$hashCode(_) { + return A.Object_hashAll(this._hashes); + } + }; + A.Cell$__closure.prototype = { + call$1(e) { + return A.BytesUtils_toBytes(type$.List_int._as(e), true); + }, + $signature: 30 + }; + A.CellType.prototype = { + toString$0(_) { + return "CellType." + this.name; + } + }; + A.CellType_fromValue_closure.prototype = { + call$1(element) { + return type$.CellType._as(element).tag === this.tag; + }, + $signature: 353 + }; + A.Slice.prototype = { + clone$0() { + var res, + t1 = this._reader, + t2 = t1._bits.clone$0(); + t1 = t1._bit_reader$_offset; + res = new A.Slice(new A.BitReader(A._setArrayType([], type$.JSArray_int), t2, t1), A.List_List$unmodifiable(this._slice$_refs, type$.Cell)); + res._refsOffset = this._refsOffset; + return res; + }, + toString$0(_) { + return new A.Builder(A.BitBuilder$(1023), A._setArrayType([], type$.JSArray_Cell)).storeSlice$1(this).endCell$0().toString$0(0); + } + }; + A.BocException.prototype = {}; + A.ExoticMerkleProof.prototype = {}; + A.ExoticMerkleUpdate.prototype = {}; + A.Pruned.prototype = {}; + A.ExoticPruned.prototype = {}; + A.LevelMask.prototype = { + get$value() { + return this._mask; + }, + get$level() { + var t1, _this = this, + value = _this.__LevelMask_level_FI; + if (value === $) { + t1 = A.MathUtils_clz32(_this._mask); + _this.__LevelMask_level_FI !== $ && A.throwLateFieldADI("level"); + value = _this.__LevelMask_level_FI = 32 - t1; + } + return value; + }, + apply$1(level) { + return A.LevelMask_LevelMask((this._mask & B.JSInt_methods.$shl(1, level) - 1) >>> 0); + } + }; + A.ResolvedCellResult.prototype = {}; + A.ResolvedCellResult_closure.prototype = { + call$1(e) { + return A.BytesUtils_toBytes(type$.List_int._as(e), true); + }, + $signature: 30 + }; + A.CellTopoloigicalSort.prototype = {}; + A._ParseBocResult.prototype = {}; + A._ReadCellResult.prototype = {}; + A.CellUtils_topologicalSort_closure.prototype = { + call$1(v) { + return A.BytesUtils_toHexString(type$.Cell._as(v).hash$0(), true, null); + }, + $signature: 354 + }; + A.CellUtils_topologicalSort_visit.prototype = { + call$1(hash) { + var t2, refs, ci, _this = this, + t1 = _this.notPermCells; + if (!t1.contains$1(0, hash)) + return; + t2 = _this.tempMark; + if (t2.contains$1(0, hash)) + throw A.wrapException(A.BocException$("Not a DAG", null)); + t2.add$1(0, hash); + refs = A.List_List$from(type$.Iterable_dynamic._as(_this.allCells.$index(0, hash).$index(0, "refs")), true, type$.String); + for (ci = refs.length - 1; ci >= 0; --ci) + _this.call$1(refs[ci]); + B.JSArray_methods.add$1(_this.sorted, hash); + t2.remove$1(0, hash); + t1.remove$1(0, hash); + }, + $signature: 355 + }; + A.CellUtils_topologicalSort_closure0.prototype = { + call$1(e) { + var cels = this.allCells.$index(0, A._asString(e)), + t1 = type$.Cell._as(cels.$index(0, "cell")), + t2 = type$.int, + t3 = J.map$1$1$ax(type$.List_dynamic._as(cels.$index(0, "refs")), new A.CellUtils_topologicalSort__closure(this.indexes), t2); + return new A.CellTopoloigicalSort(t1, A.List_List$unmodifiable(A.List_List$of(t3, true, t3.$ti._eval$1("ListIterable.E")), t2)); + }, + $signature: 356 + }; + A.CellUtils_topologicalSort__closure.prototype = { + call$1(v) { + var t1 = this.indexes.$index(0, v); + t1.toString; + return t1; + }, + $signature: 357 + }; + A.CellUtils_resolveExotic_closure.prototype = { + call$1(e) { + return type$.Pruned._as(e).hash; + }, + $signature: 358 + }; + A.CellUtils_resolveExotic_closure0.prototype = { + call$1(e) { + return type$.Pruned._as(e).depth; + }, + $signature: 359 + }; + A.TonChain.prototype = { + $eq(_, other) { + if (other == null) + return false; + if (!(other instanceof A.TonChain)) + return false; + return this.workchain === other.workchain && this.id === other.id; + }, + get$hashCode(_) { + return B.JSInt_methods.get$hashCode(this.workchain) ^ B.JSInt_methods.get$hashCode(this.id); + } + }; + A.TonChain_fromWorkchain_closure.prototype = { + call$1(e) { + return type$.TonChain._as(e).workchain === this.workchain; + }, + $signature: 360 + }; + A.TonChain_fromWorkchain_closure0.prototype = { + call$0() { + return A.throwExpression(B.TonContractException_V43); + }, + $signature: 2 + }; + A.TonContract.prototype = {}; + A._TonContract_Object_ContractProvider.prototype = {}; + A.ContractProvider.prototype = {}; A.TonContractException.prototype = {}; + A.WalletV1R1.prototype = {}; + A.WalletV1R2.prototype = {}; + A.WalletV1R3.prototype = {}; + A.WalletV2R1.prototype = {}; + A.WalletV2R2.prototype = {}; + A.WalletV3R1.prototype = {}; + A.WalletV3R2.prototype = {}; + A.WalletV4.prototype = {}; + A.WalletV5R1.prototype = {}; + A.WalletContract.prototype = {}; A.WalletVersion.prototype = { + get$state() { + switch (this) { + case B.WalletVersion_v1R1_1: + return "te6cckEBAQEARAAAhP8AIN2k8mCBAgDXGCDXCx/tRNDTH9P/0VESuvKhIvkBVBBE+RDyovgAAdMfMSDXSpbTB9QC+wDe0aTIyx/L/8ntVEH98Ik="; + case B.WalletVersion_v1R2_1: + return "te6cckEBAQEAUwAAov8AIN0gggFMl7qXMO1E0NcLH+Ck8mCBAgDXGCDXCx/tRNDTH9P/0VESuvKhIvkBVBBE+RDyovgAAdMfMSDXSpbTB9QC+wDe0aTIyx/L/8ntVNDieG8="; + case B.WalletVersion_v1R3_1: + return "te6cckEBAQEAXwAAuv8AIN0gggFMl7ohggEznLqxnHGw7UTQ0x/XC//jBOCk8mCBAgDXGCDXCx/tRNDTH9P/0VESuvKhIvkBVBBE+RDyovgAAdMfMSDXSpbTB9QC+wDe0aTIyx/L/8ntVLW4bkI="; + case B.WalletVersion_v2R1_2: + return "te6cckEBAQEAVwAAqv8AIN0gggFMl7qXMO1E0NcLH+Ck8mCDCNcYINMf0x8B+CO78mPtRNDTH9P/0VExuvKhA/kBVBBC+RDyovgAApMg10qW0wfUAvsA6NGkyMsfy//J7VShNwu2"; + case B.WalletVersion_v2R2_2: + return "te6cckEBAQEAYwAAwv8AIN0gggFMl7ohggEznLqxnHGw7UTQ0x/XC//jBOCk8mCDCNcYINMf0x8B+CO78mPtRNDTH9P/0VExuvKhA/kBVBBC+RDyovgAApMg10qW0wfUAvsA6NGkyMsfy//J7VQETNeh"; + case B.WalletVersion_v3R1_3: + return "te6cckEBAQEAYgAAwP8AIN0gggFMl7qXMO1E0NcLH+Ck8mCDCNcYINMf0x/TH/gjE7vyY+1E0NMf0x/T/9FRMrryoVFEuvKiBPkBVBBV+RDyo/gAkyDXSpbTB9QC+wDo0QGkyMsfyx/L/8ntVD++buA="; + case B.WalletVersion_v3R2_3: + return "te6cckEBAQEAcQAA3v8AIN0gggFMl7ohggEznLqxn3Gw7UTQ0x/THzHXC//jBOCk8mCDCNcYINMf0x/TH/gjE7vyY+1E0NMf0x/T/9FRMrryoVFEuvKiBPkBVBBV+RDyo/gAkyDXSpbTB9QC+wDo0QGkyMsfyx/L/8ntVBC9ba0="; + case B.WalletVersion_v4_4: + return "te6ccgECFAEAAtQAART/APSkE/S88sgLAQIBIAIDAgFIBAUE+PKDCNcYINMf0x/THwL4I7vyZO1E0NMf0x/T//QE0VFDuvKhUVG68qIF+QFUEGT5EPKj+AAkpMjLH1JAyx9SMMv/UhD0AMntVPgPAdMHIcAAn2xRkyDXSpbTB9QC+wDoMOAhwAHjACHAAuMAAcADkTDjDQOkyMsfEssfy/8QERITAubQAdDTAyFxsJJfBOAi10nBIJJfBOAC0x8hghBwbHVnvSKCEGRzdHK9sJJfBeAD+kAwIPpEAcjKB8v/ydDtRNCBAUDXIfQEMFyBAQj0Cm+hMbOSXwfgBdM/yCWCEHBsdWe6kjgw4w0DghBkc3RyupJfBuMNBgcCASAICQB4AfoA9AQw+CdvIjBQCqEhvvLgUIIQcGx1Z4MesXCAGFAEywUmzxZY+gIZ9ADLaRfLH1Jgyz8gyYBA+wAGAIpQBIEBCPRZMO1E0IEBQNcgyAHPFvQAye1UAXKwjiOCEGRzdHKDHrFwgBhQBcsFUAPPFiP6AhPLassfyz/JgED7AJJfA+ICASAKCwBZvSQrb2omhAgKBrkPoCGEcNQICEekk30pkQzmkD6f+YN4EoAbeBAUiYcVnzGEAgFYDA0AEbjJftRNDXCx+AA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA4PABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AAG7SB/oA1NQi+QAFyMoHFcv/ydB3dIAYyMsFywIizxZQBfoCFMtrEszMyXP7AMhAFIEBCPRR8qcCAHCBAQjXGPoA0z/IVCBHgQEI9FHyp4IQbm90ZXB0gBjIywXLAlAGzxZQBPoCFMtqEssfyz/Jc/sAAgBsgQEI1xj6ANM/MFIkgQEI9Fnyp4IQZHN0cnB0gBjIywXLAlAFzxZQA/oCE8tqyx8Syz/Jc/sAAAr0AMntVA=="; + case B.WalletVersion_v5R1_5: + return "te6cckECFAEAAoEAART/APSkE/S88sgLAQIBIAINAgFIAwQC3NAg10nBIJFbj2Mg1wsfIIIQZXh0br0hghBzaW50vbCSXwPgghBleHRuuo60gCDXIQHQdNch+kAw+kT4KPpEMFi9kVvg7UTQgQFB1yH0BYMH9A5voTGRMOGAQNchcH/bPOAxINdJgQKAuZEw4HDiEA8CASAFDAIBIAYJAgFuBwgAGa3OdqJoQCDrkOuF/8AAGa8d9qJoQBDrkOuFj8ACAUgKCwAXsyX7UTQcdch1wsfgABGyYvtRNDXCgCAAGb5fD2omhAgKDrkPoCwBAvIOAR4g1wsfghBzaWduuvLgin8PAeaO8O2i7fshgwjXIgKDCNcjIIAg1yHTH9Mf0x/tRNDSANMfINMf0//XCgAK+QFAzPkQmiiUXwrbMeHywIffArNQB7Dy0IRRJbry4IVQNrry4Ib4I7vy0IgikvgA3gGkf8jKAMsfAc8Wye1UIJL4D95w2zzYEAP27aLt+wL0BCFukmwhjkwCIdc5MHCUIccAs44tAdcoIHYeQ2wg10nACPLgkyDXSsAC8uCTINcdBscSwgBSMLDy0InXTNc5MAGk6GwShAe78uCT10rAAPLgk+1V4tIAAcAAkVvg69csCBQgkXCWAdcsCBwS4lIQseMPINdKERITAJYB+kAB+kT4KPpEMFi68uCR7UTQgQFB1xj0BQSdf8jKAEAEgwf0U/Lgi44UA4MH9Fvy4Iwi1woAIW4Bs7Dy0JDiyFADzxYS9ADJ7VQAcjDXLAgkji0h8uCS0gDtRNDSAFETuvLQj1RQMJExnAGBAUDXIdcKAPLgjuLIygBYzxbJ7VST8sCN4gAQk1vbMeHXTNC01sNe"; + default: + throw A.wrapException(A.UnimplementedError$(null)); + } + }, toString$0(_) { return "WalletVersion." + this.name; } @@ -56147,7 +58952,7 @@ call$1(element) { return type$.WalletVersion._as(element).name === this.name; }, - $signature: 342 + $signature: 361 }; A.WalletVersion_WalletVersion$fromValue_closure0.prototype = { call$0() { @@ -56155,6 +58960,210 @@ }, $signature: 2 }; + A.VersionedWalletContract.prototype = {}; + A._VersionedWalletContract_WalletContract_VerionedProviderImpl.prototype = {}; + A.VerionedProviderImpl.prototype = {}; + A.V5R1Context.prototype = { + store$1(builder) { + builder._builder$_bits.writeInt$2(A._BigIntImpl__BigIntImpl$from(this.chain.id).$xor(0, A._BigIntImpl__BigIntImpl$from(this.get$contextID())).toInt$0(0), 32); + } + }; + A.V5R1CustomContext.prototype = { + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["context", this.context, "networkGlobalId", this.chain.id], type$.String, type$.dynamic); + }, + get$contextID() { + var t1 = A.BitBuilder$(1023), + t2 = A._setArrayType([], type$.JSArray_Cell); + t1.writeUint$2(0, 1); + t1.writeUint$2(this.context, 31); + return new A.Builder(t1, t2).endCell$0().beginParse$0()._reader.loadIntBig$1(32).toInt$0(0); + }, + $eq(_, other) { + if (other == null) + return false; + if (!(other instanceof A.V5R1CustomContext)) + return false; + return other.context === this.context && other.chain.$eq(0, this.chain); + }, + get$hashCode(_) { + return A.Object_hashAll([this.context, this.chain.id]); + } + }; + A.V5R1ClientContext.prototype = { + toJson$0() { + var t1 = this.chain; + return A.LinkedHashMap_LinkedHashMap$_literal(["networkGlobalId", t1.id, "subwalletNumber", this.subwalletNumber, "workchain", t1.workchain], type$.String, type$.dynamic); + }, + get$contextID() { + var t1 = A.BitBuilder$(1023), + t2 = A._setArrayType([], type$.JSArray_Cell); + t1.writeUint$2(1, 1); + t1.writeInt$2(this.chain.workchain, 8); + t1.writeUint$2(0, 8); + t1.writeUint$2(this.subwalletNumber, 15); + return new A.Builder(t1, t2).endCell$0().beginParse$0()._reader.loadIntBig$1(32).toInt$0(0); + }, + $eq(_, other) { + if (other == null) + return false; + if (!(other instanceof A.V5R1ClientContext)) + return false; + return other.subwalletNumber === this.subwalletNumber && other.chain.$eq(0, this.chain); + }, + get$hashCode(_) { + return A.Object_hashAll([this.subwalletNumber, this.chain.id]); + } + }; + A.VersionedWalletState.prototype = { + initialState$0() { + var t1 = A.Cell_Cell$fromBytes(A.Base64Utils_decodeBase64(this.version.get$state())), + t2 = this.initialData$0(); + return new A.StateInit(t1, t2, null); + } + }; + A.NoneSubWalletVersionedWalletState.prototype = { + initialData$0() { + var t1 = A.BitBuilder$(1023), + t2 = A._setArrayType([], type$.JSArray_Cell); + t1.writeUint$2(0, 32); + t1.writeBuffer$1(type$.List_int._as(B.JSArray_methods.sublist$1(this.publicKey._publickKey.get$compressed(), 1))); + return new A.Builder(t1, t2).endCell$0(); + } + }; + A.SubWalletVersionedWalletState.prototype = { + initialData$0() { + var t1, t2, _this = this; + switch (_this.version) { + case B.WalletVersion_v3R1_3: + case B.WalletVersion_v3R2_3: + t1 = A.BitBuilder$(1023); + t2 = A._setArrayType([], type$.JSArray_Cell); + t1.writeUint$2(0, 32); + t1.writeUint$2(_this.subwallet, 32); + t1.writeBuffer$1(type$.List_int._as(B.JSArray_methods.sublist$1(_this.publicKey._publickKey.get$compressed(), 1))); + return new A.Builder(t1, t2).endCell$0(); + case B.WalletVersion_v4_4: + t1 = A.BitBuilder$(1023); + t2 = A._setArrayType([], type$.JSArray_Cell); + t1.writeUint$2(0, 32); + t1.writeUint$2(_this.subwallet, 32); + t1.writeBuffer$1(type$.List_int._as(B.JSArray_methods.sublist$1(_this.publicKey._publickKey.get$compressed(), 1))); + return new A.Builder(t1, t2).storeBit$1(0).endCell$0(); + default: + throw A.wrapException(B.TonContractException_8TW); + } + } + }; + A.V5VersionedWalletState.prototype = { + initialData$0() { + var t1 = A.BitBuilder$(1023), + t2 = new A.Builder(t1, A._setArrayType([], type$.JSArray_Cell)); + t1.writeUint$2(1, 1); + t1.writeUint$2(0, 32); + this.context.store$1(t2); + t1.writeBuffer$1(type$.List_int._as(B.JSArray_methods.sublist$1(this.publicKey._publickKey.get$compressed(), 1))); + return t2.storeBit$1(0).endCell$0(); + } + }; + A.KeyException.prototype = {}; + A.TonPublicKey.prototype = {}; + A.DictionaryCodecs_createBigUintKey_closure.prototype = { + call$1(src) { + var t1, t2, t3; + type$.BigInt._as(src); + if (src._isNegative) + throw A.wrapException(A.DictException$("Key is negative.", A.LinkedHashMap_LinkedHashMap$_literal(["key", src], type$.String, type$.dynamic))); + t1 = A.BitBuilder$(1023); + t2 = A._setArrayType([], type$.JSArray_Cell); + t3 = this.bits; + t1.writeUint$2(src, t3); + return new A.Builder(t1, t2).endCell$0().beginParse$0()._reader.loadUintBig$1(t3); + }, + $signature: 362 + }; + A.Dictionary.prototype = { + $index(_, key) { + return this._dictionary$_map.$index(0, A.DictionaryUtils_serializeInternalKey(this.$ti._precomputed1._as(key))); + }, + store$3$key$value(builder, key, value) { + var resolvedKey, resolvedValue, t2, t3, prepared, dd, _this = this, + t1 = _this._dictionary$_map; + if (t1.__js_helper$_length === 0) + builder.storeBit$1(0); + else { + resolvedKey = _this._dictionary$_key; + resolvedValue = _this._dictionary$_value; + if (resolvedKey == null) + throw A.wrapException(A.DictException$("Key serializer is not defined", null)); + if (resolvedValue == null) + throw A.wrapException(A.DictException$("Value serializer is not defined", null)); + t2 = _this.$ti; + t3 = t2._rest[1]; + prepared = A.Map_Map$fromEntries(t1.get$entries().map$1$1(0, new A.Dictionary_store_closure(_this, resolvedKey), t2._eval$1("MapEntry")), type$.BigInt, t3); + builder.storeBit$1(1); + dd = new A.Builder(A.BitBuilder$(1023), A._setArrayType([], type$.JSArray_Cell)); + t1 = resolvedKey.bits; + t2 = t2._eval$1("~(2,Builder)")._as(resolvedValue.serialize); + A._DictSerializationUtils_writeEdge(A._DictSerializationUtils_buildTree(prepared, t1, t3), t1, t2, dd, t3); + builder.storeRef$1(dd.endCell$0()); + } + } + }; + A.Dictionary_store_closure.prototype = { + call$1(entry) { + var t2, decode, + t1 = this.$this.$ti; + t1._eval$1("MapEntry")._as(entry); + t2 = t1._precomputed1; + decode = A.DictionaryUtils__deserializeInternalKey(entry.key); + if (!t2._is(decode)) + A.throwExpression(A.DictException$("Invalid key type.", A.LinkedHashMap_LinkedHashMap$_literal(["value", decode, "excepted", A.createRuntimeType(t2).toString$0(0), "key", J.get$runtimeType$(decode).toString$0(0)], type$.String, type$.dynamic))); + return new A.MapEntry(t1._eval$1("BigInt(1)")._as(this.resolvedKey.serialize).call$1(decode), entry.value, type$.$env_1_1_BigInt._bind$1(t1._rest[1])._eval$1("MapEntry<1,2>")); + }, + $signature() { + return this.$this.$ti._eval$1("MapEntry(MapEntry)"); + } + }; + A.DictionaryKey.prototype = {}; + A.DictionaryValue.prototype = {}; + A.DictException.prototype = {}; + A._Node.prototype = { + get$value() { + var t1 = this.___Node_value_F; + t1 === $ && A.throwLateFieldNI("value"); + return t1; + }, + toJson$0() { + var t1, t2, _this = this; + if (_this.isLeaf) { + t1 = _this.___Node_value_F; + t1 === $ && A.throwLateFieldNI("value"); + return A.LinkedHashMap_LinkedHashMap$_literal(["value", t1, "type", "leaf"], type$.String, type$.dynamic); + } + t1 = _this.___Node_left_A; + t1 === $ && A.throwLateFieldNI("left"); + t1 = t1.toJson$0(); + t2 = _this.___Node_right_A; + t2 === $ && A.throwLateFieldNI("right"); + return A.LinkedHashMap_LinkedHashMap$_literal(["left", t1, "right", t2.toJson$0(), "type", "fork"], type$.String, type$.dynamic); + } + }; + A._Edge.prototype = { + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["label", this.label, "node", this.node.toJson$0()], type$.String, type$.dynamic); + } + }; + A._DictSerializationUtils_buildTree_closure.prototype = { + call$2(k, v) { + type$.BigInt._as(k); + this.T._as(v); + this.converted.$indexSet(0, A._DictSerializationUtils_pad(k.toRadixString$1(0, 2), this.keyLength), v); + }, + $signature() { + return this.T._eval$1("~(BigInt,0)"); + } + }; A.TonDartPluginException.prototype = { toString$0(_) { var t2, infos, _this = this, @@ -56177,18 +59186,66 @@ call$1(element) { return type$.MapEntry_String_dynamic._as(element).value != null; }, - $signature: 343 + $signature: 363 }; A.TonDartPluginException_toString_closure0.prototype = { call$1(e) { type$.MapEntry_String_dynamic._as(e); return A.S(e.key) + ": " + A.S(e.value); }, - $signature: 344 + $signature: 364 + }; + A.SimpleLibraryCodecs_codec_closure.prototype = { + call$2(p0, p1) { + type$.SimpleLibrary._as(p0).store$1(p1); + }, + $signature: 365 + }; + A.StateInit.prototype = { + store$1(builder) { + var dict, + t1 = builder._builder$_bits; + t1.writeBit$1(false); + t1.writeBit$1(false); + builder.storeMaybeRef$1$cell(this.code); + builder.storeMaybeRef$1$cell(this.data); + t1 = this.libraries; + dict = t1 == null ? null : new A.StateInit_store_closure().call$1(type$.Map_BigInt_SimpleLibrary._as(t1)); + A.checkTypeBound(type$.BigInt, type$.Object, "K", "storeDict"); + type$.nullable_Dictionary_BigInt_SimpleLibrary._as(dict); + if (dict != null) + dict.store$3$key$value(builder, null, null); + else + builder.storeBit$1(0); + }, + toJson$0() { + var t1 = this.code.toBase64$0(), + t2 = this.data.toBase64$0(), + t3 = this.libraries; + return A.LinkedHashMap_LinkedHashMap$_literal(["splitDepth", null, "special", null, "code", t1, "data", t2, "libraries", t3 == null ? null : t3.map$2$1(0, new A.StateInit_toJson_closure(), type$.String, type$.Map_String_dynamic)], type$.String, type$.dynamic); + } + }; + A.StateInit_store_closure.prototype = { + call$1(p0) { + var t1, t2; + type$.Map_BigInt_SimpleLibrary._as(p0); + t1 = A.DictionaryCodecs_createBigUintKey(256); + t2 = $.$get$SimpleLibraryCodecs_codec(); + return A.Dictionary_fromEnteries(t1, p0, t2, type$.BigInt, type$.SimpleLibrary); + }, + $signature: 366 + }; + A.StateInit_toJson_closure.prototype = { + call$2(key, value) { + type$.BigInt._as(key); + type$.SimpleLibrary._as(value); + return new A.MapEntry(key.toString$0(0), value.toJson$0(), type$.MapEntry_of_String_and_Map_String_dynamic); + }, + $signature: 367 }; A.RequestMethod.prototype = { _enumToString$0() { - return "RequestMethod." + this._name; + return "RequestMethod." + this._core$_name; } }; A.TonApiType.prototype = {}; @@ -56196,7 +59253,7 @@ call$1(element) { return type$.TonApiType._as(element).name === this.name; }, - $signature: 345 + $signature: 368 }; A.TonApiType_TonApiType$fromValue_closure0.prototype = { call$0() { @@ -56253,13 +59310,13 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.TonApiRequestParam_toRequest_closure0.prototype = { call$1(element) { return type$.MapEntry_of_String_and_nullable_String._as(element).value != null; }, - $signature: 346 + $signature: 369 }; A.TonCenterPostRequestParam.prototype = { toRequest$1(v) { @@ -56275,7 +59332,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.TonRequestInfo.prototype = { url$2$tonApiUrl$tonCenterUrl(tonApiUrl, tonCenterUrl) { @@ -56333,13 +59390,13 @@ type$.Map_String_dynamic._as(item); return new A.BlockCurrencyCollectionOtherItemResponse(A.BigintUtils_parse(item.$index(0, "id")), A._asString(item.$index(0, "value"))); }, - $signature: 347 + $signature: 370 }; A.BlockCurrencyCollectionResponse_toJson_closure.prototype = { call$1(item) { return type$.BlockCurrencyCollectionOtherItemResponse._as(item).toJson$0(); }, - $signature: 348 + $signature: 371 }; A._BlockCurrencyCollectionResponse_Object_JsonSerialization.prototype = {}; A.BlockCurrencyCollectionOtherItemResponse.prototype = { @@ -56390,7 +59447,7 @@ switch ($async$goto) { case 0: // Function start - params = request.toRequest$1(++$async$self._provider1$_id); + params = request.toRequest$1(++$async$self._provider2$_id); t1 = $async$self.rpc; case 3: // switch @@ -56478,7 +59535,7 @@ call$1(e) { return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(e), type$.String, type$.dynamic); }, - $signature: 20 + $signature: 26 }; A.JsonSerialization0.prototype = { toString$0(_) { @@ -56486,6 +59543,8 @@ return A.getRuntimeTypeOfDartObject(this).toString$0(0) + A.MapBase_mapToString(js); } }; + A.TonSerialization.prototype = {$isBocSerializableObject: 1}; + A._TonSerialization_Object_JsonSerialization.prototype = {}; A.EventStreamProvider.prototype = {}; A._EventStream.prototype = { listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) { @@ -56538,13 +59597,13 @@ call$1(e) { return this.onData.call$1(type$.JSObject._as(e)); }, - $signature: 32 + $signature: 29 }; A._EventStreamSubscription_onData_closure.prototype = { call$1(e) { return this.handleData.call$1(type$.JSObject._as(e)); }, - $signature: 32 + $signature: 29 }; A.RPCRequestDetails.prototype = {}; A.LookupByLedgerRequest.prototype = {}; @@ -56566,7 +59625,7 @@ A._asString(key); return value == null; }, - $signature: 0 + $signature: 1 }; A.RPCServerState.prototype = { toJson$0() { @@ -56680,7 +59739,7 @@ t1 = type$.Map_String_dynamic; $async$temp1 = t1; $async$goto = 3; - return A._asyncAwait($async$self._makeCustomCall$1$1(request.toRequest$1(++$async$self._requestId), t1), $async$request$1$1); + return A._asyncAwait($async$self._makeCustomCall$1$1(request.toRequest$1(++$async$self._provider4$_requestId), t1), $async$request$1$1); case 3: // returning from await. t2 = $async$temp1._as($async$result); @@ -56754,18 +59813,7 @@ } }; A.MessageCompleter.prototype = {}; - A.PageRequestCompeleter.prototype = { - completeMessage$1(response) { - switch (response.status) { - case B.JSWalletResponseType_List_50_success: - this._completer.complete$1(A.jsify(response.data)); - break; - case B.JSWalletResponseType_List_51_failed: - this._completer.completeError$1(A.JSWalletError_constructor_fromJson(type$.Map_String_dynamic._as(response.data))); - break; - } - } - }; + A.PageRequestCompeleter.prototype = {}; A.ProxyMethodHandler.prototype = { $set$4(object, prop, value, receiver) { var t1 = type$.Object; @@ -56786,51 +59834,7 @@ t1._as(r); t1._as(self.window).dispatchEvent(this.event); }, - $signature: 29 - }; - A.ClientMessageEthereum.prototype = { - get$type() { - return B.JSClientType_List_111_ethereum; - }, - toCbor$0() { - var t1 = A._setArrayType([this.method, B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.params], type$.String, type$.nullable_Object), null)], type$.JSArray_String); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_111, type$.int), new A.CborListValue(t1, true, type$.CborListValue_String), type$.CborTagValue_dynamic); - } - }; - A.EthereumEventTypes.prototype = { - _enumToString$0() { - return "EthereumEventTypes." + this._name; - } - }; - A.EthereumEventTypes_fromTag_closure.prototype = { - call$1(e) { - return A.BytesUtils_bytesEqual(type$.EthereumEventTypes._as(e).tag, this.tag); - }, - $signature: 88 - }; - A.EthereumEventTypes_fromTag_closure0.prototype = { - call$0() { - return A.throwExpression(B.Web3RequestException_chs); - }, - $signature: 2 - }; - A.EthereumEventTypes_fromName_closure.prototype = { - call$1(e) { - return type$.EthereumEventTypes._as(e)._name === this.name; - }, - $signature: 88 - }; - A.EthereumEventTypes_fromName_closure0.prototype = { - call$0() { - return A.throwExpression(B.Web3RequestException_chs); - }, - $signature: 2 - }; - A.JSWalletMessageResponseEthereum.prototype = { - toCbor$0() { - var t1 = A._setArrayType([new A.CborBytesValue(this.client.tag), new A.CborBytesValue(this.event.tag), B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.data], type$.String, type$.nullable_Object), null)], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_101, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); - } + $signature: 35 }; A.EthereumAccountsChanged.prototype = { toJson$0() { @@ -56848,14 +59852,15 @@ return new A.ProviderConnectInfo_toJSEvent_closure(this).call$0(); }, toString$0(_) { - return "ProviderConnectInfo" + A.LinkedHashMap_LinkedHashMap$_literal(["net_version", this.netVersion.toString$0(0)], type$.String, type$.dynamic).toString$0(0); + var t1 = type$.String; + return "ProviderConnectInfo" + A.LinkedHashMap_LinkedHashMap$_literal(["chainId", this.chainId], t1, t1).toString$0(0); } }; A.ProviderConnectInfo_toJSEvent__closure.prototype = { call$0() { return this._dartInstance.chainId; }, - $signature: 7 + $signature: 4 }; A.ProviderConnectInfo_toJSEvent_closure.prototype = { call$0() { @@ -56873,7 +59878,7 @@ t2.defineProperty.apply(t2, [_jsExporter, "chainId", _chainIdMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.EthereumWeb3State.prototype = {}; A.EthereumWeb3State_EthereumWeb3State_closure.prototype = { @@ -56881,13 +59886,13 @@ var t1 = type$.EthereumChain._as(e).network.coinParam.chainId.compareTo$1(0, this.permission._permission$_currentChain); return t1 === 0; }, - $signature: 73 + $signature: 87 }; A.EthereumWeb3State_EthereumWeb3State_closure0.prototype = { call$1(e) { - return type$.Web3EthereumChainAccount._as(e).defaultAddress; + return type$.Web3EthereumChainAccount._as(e)._defaultAddress; }, - $signature: 49 + $signature: 59 }; A.EthereumWeb3State_EthereumWeb3State_closure1.prototype = { call$0() { @@ -56896,39 +59901,37 @@ return null; return B.JSArray_methods.get$first(t1); }, - $signature: 356 + $signature: 378 }; A.EthereumWeb3State_EthereumWeb3State_closure2.prototype = { call$1(e) { return type$.Web3EthereumChainAccount._as(e).address.address; }, - $signature: 357 + $signature: 379 }; A.EthereumWeb3State_EthereumWeb3State_closure3.prototype = { call$2(a, b) { - var t1, t2; + var t1; A._asString(a); A._asString(b); t1 = this.defaultAddress; - t2 = t1 == null; - if (a === (t2 ? null : t1.address.address)) - return -1; - else if (b === (t2 ? null : t1.address.address)) - return 1; - return B.JSString_methods.compareTo$1(a, b); + return A.JsUtils_compareAddress(a, b, t1 == null ? null : t1.address.address); }, - $signature: 47 + $signature: 38 }; A.JSEthereumHandler.prototype = { + _ethereum$_sendEvent$2$data$event(data, $event) { + this.sendMessageToClient.call$2(A.WalletMessageEvent_constructor_build(data, $event), B.JSClientType_Ethereum_ethereum); + }, + _ethereum$_sendEvent$1$event($event) { + return this._ethereum$_sendEvent$2$data$event(null, $event); + }, _onSubscribe$1(result) { - this.sendMessageToClient.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_102_message, B.JSClientType_List_111_ethereum, type$.EthereumSubscribeResult._as(result).toJson$0())); + this._ethereum$_sendEvent$2$data$event(type$.EthereumSubscribeResult._as(result).toJson$0(), B.JSEventType_message); }, initChain$2$authenticated$chainHandler(authenticated, chainHandler) { this.lock.synchronized$1$1(new A.JSEthereumHandler_initChain_closure(this, authenticated, chainHandler), type$.Null); }, - _ethereum$_disconnect$0() { - this.sendMessageToClient.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_104_disconnect, B.JSClientType_List_111_ethereum, B.Web3RequestException_ww8.toJson$0())); - }, _ethereum$_connect$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), @@ -56940,15 +59943,14 @@ switch ($async$goto) { case 0: // Function start - t1 = state.chain; - if (t1 == null) { + if (state.client == null) { // goto return $async$goto = 1; break; } - t1 = t1.network.coinParam.chainId; + t1 = state.chain.network.coinParam.chainId; t1.toRadixString$1(0, 16); - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_103_connect, B.JSClientType_List_111_ethereum, A.LinkedHashMap_LinkedHashMap$_literal(["net_version", t1.toString$0(0)], type$.String, type$.dynamic))); + $async$self._ethereum$_sendEvent$2$data$event(A.LinkedHashMap_LinkedHashMap$_literal(["net_version", t1.toString$0(0)], type$.String, type$.dynamic), B.JSEventType_connect); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); @@ -56967,18 +59969,18 @@ switch ($async$goto) { case 0: // Function start - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_100_accountsChanged, B.JSClientType_List_111_ethereum, new A.EthereumAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), state.defaultAddress).toJson$0())); + $async$self._ethereum$_sendEvent$2$data$event(new A.EthereumAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), state.defaultAddress).toJson$0(), B.JSEventType_accountsChanged); // implicit return return A._asyncReturn(null, $async$completer); } }); return A._asyncStartSync($async$_ethereum$_accountChanged$1, $async$completer); }, - _chainChanged$1(state) { + _ethereum$_chainChanged$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), $async$returnValue, $async$self = this, t1; - var $async$_chainChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + var $async$_ethereum$_chainChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); while (true) @@ -56993,31 +59995,18 @@ } t1 = t1.network.coinParam.chainId; t1.toRadixString$1(0, 16); - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_101_chainChanged, B.JSClientType_List_111_ethereum, A.LinkedHashMap_LinkedHashMap$_literal(["net_version", t1.toString$0(0)], type$.String, type$.dynamic))); + $async$self._ethereum$_sendEvent$2$data$event(A.LinkedHashMap_LinkedHashMap$_literal(["net_version", t1.toString$0(0)], type$.String, type$.dynamic), B.JSEventType_chainChanged); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); } }); - return A._asyncStartSync($async$_chainChanged$1, $async$completer); - }, - _ethereum$_eventMessage$2(type, state) { - switch (type) { - case B.EthereumEventTypes_List_100_accountsChanged: - this._ethereum$_accountChanged$1(state); - break; - case B.EthereumEventTypes_List_101_chainChanged: - this._chainChanged$1(state); - break; - default: - break; - } - return new A.Web3ResponseMessage(null, this.get$networkType()); + return A._asyncStartSync($async$_ethereum$_chainChanged$1, $async$completer); }, request$1(params) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Web3MessageCore), - $async$returnValue, $async$self = this, method, t2, toList, parse, transaction, state, t1, isEvent; + $async$returnValue, $async$self = this, t1, toList, parse, t2, items, address, challeng, t3, transaction, state, method; var $async$request$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -57027,15 +60016,7 @@ case 0: // Function start state = $async$self.state; - t1 = params.method; - isEvent = A.EthereumEventTypes_fromName(t1); - if (isEvent != null) { - $async$returnValue = $async$self._ethereum$_eventMessage$2(isEvent, state); - // goto return - $async$goto = 1; - break; - } - method = A.Web3EthereumRequestMethods_fromName(t1); + method = A.Web3EthereumRequestMethods_fromName(A._asString(params.method)); if (method == null) { $async$returnValue = $async$self._rpcCall$2(params, state); // goto return @@ -57056,17 +60037,11 @@ $async$goto = 1; break $async$outer; case B.Web3EthereumRequestMethods_EuK: - t2 = type$.dynamic; - toList = params.paramsAsList$1$1$length(1, t2); + toList = A.PageMessageRequest_get_getFirstParam(params); if (toList == null) - A.throwExpression(A.Web3RequestException$(-32602, "Invalid list argument provided for " + t1 + ". Please ensure the input is a valid list and try again.", "Invalid method parameters\t", "WEB3-0050")); - if (0 >= toList.length) { - $async$returnValue = A.ioore(toList, 0); - // goto return - $async$goto = 1; - break $async$outer; - } - t1 = A.Web3ValidatorUtils_parseBigInt(A.JsUtils_toMap(toList[0], new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0080", "Invalid arguments provided for method '" + t1 + string$.x27__Ple + t1 + "' are correct and try again."), type$.String, t2), "chainId", B.Web3EthereumRequestMethods_EuK, type$.BigInt); + A.throwExpression(A.Web3RequestExceptionConst_invalidList(A.getProperty(params, "method", type$.String))); + t1 = A._asString(params.method); + t1 = A.Web3ValidatorUtils_parseBigInt(A.JsUtils_toMap(toList, new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0080", "Invalid arguments provided for method '" + t1 + string$.x27__Ple + t1 + "' are correct and try again.")), "chainId", B.Web3EthereumRequestMethods_EuK, type$.BigInt); parse = new A.Web3EthreumSwitchChain(t1); t2 = state.chain; if (t1.$eq(0, t2 == null ? null : t2.network.coinParam.chainId)) { @@ -57082,7 +60057,33 @@ $async$goto = 1; break $async$outer; case B.Web3EthereumRequestMethods_1_personal_sign_List_empty: - $async$returnValue = $async$self._ethereum$_personalSign$1(params); + items = A.PageMessageRequest_getElements(params, 2); + t1 = items == null; + if (t1) + address = null; + else { + if (0 >= items.length) { + $async$returnValue = A.ioore(items, 0); + // goto return + $async$goto = 1; + break $async$outer; + } + address = items[0]; + } + if (t1) + challeng = null; + else { + if (1 >= items.length) { + $async$returnValue = A.ioore(items, 1); + // goto return + $async$goto = 1; + break $async$outer; + } + challeng = items[1]; + } + if (address == null || challeng == null) + A.throwExpression(A.Web3RequestExceptionConst_invalidMethodArgruments(A.getProperty(params, "method", type$.String))); + $async$returnValue = A.Web3EthreumPersonalSign_Web3EthreumPersonalSign$fromJson(A.LinkedHashMap_LinkedHashMap$_literal(["address", address, "challeng", challeng], type$.String, type$.dynamic)); // goto return $async$goto = 1; break $async$outer; @@ -57097,9 +60098,12 @@ $async$goto = 1; break $async$outer; case B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty: - t1 = state.chain.network.coinParam; - transaction = A.JSEthereumHandler__parseTransaction(params, t1.chainId); - if (transaction.transactionType === B.ETHTransactionType_2 && !t1.supportEIP1559) + t1 = state.chain; + t1.toString; + t2 = A.PageMessageRequest_get_getFirstParam(params); + t3 = A._asString(params.method); + transaction = A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson(A.JsUtils_toMap(t2, new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0080", "Invalid arguments provided for method '" + t3 + string$.x27__Ple + t3 + "' are correct and try again."))); + if (transaction.transactionType === B.ETHTransactionType_2 && !t1.network.coinParam.supportEIP1559) throw A.wrapException(A.Web3RequestExceptionConst_invalidParameters("The current network does not support EIP-1559 transactions.")); $async$returnValue = transaction; // goto return @@ -57152,7 +60156,7 @@ A.LiveListenable__addListener(t1); if (t1._live$_value !== B.NodeClientStatus_0) throw A.wrapException(B.Web3RequestException_ww8); - method = A.EthereumMethods_fromName(params.method); + method = A.EthereumMethods_fromName(A._asString(params.method)); if (method == null) throw A.wrapException(B.Web3RequestException_imj); $async$handler = 5; @@ -57162,11 +60166,8 @@ // then if (type$.BaseServiceProtocol_EthereumAPIProvider._as(cl.provider.rpc).get$protocol() !== B.ServiceProtocol_WebSocket_3_websocket) throw A.wrapException(B.Web3RequestException_23B); - t1 = params.paramsAsList$1$0(type$.dynamic); - if (t1 == null) - t1 = B.List_empty6; $async$goto = 10; - return A._asyncAwait(cl.subscribe$1$params(t1), $async$_rpcCall$2); + return A._asyncAwait(cl.subscribe$1$params(A.PageMessageRequest_get_dartParams(params)), $async$_rpcCall$2); case 10: // returning from await. result = $async$result; @@ -57178,7 +60179,7 @@ case 9: // join $async$goto = 11; - return A._asyncAwait(cl.dynamicCall$2(method.value, params.params), $async$_rpcCall$2); + return A._asyncAwait(cl.dynamicCall$2(method.value, A.PageMessageRequest_get_dartParams(params)), $async$_rpcCall$2); case 11: // returning from await. $call = $async$result; @@ -57234,7 +60235,7 @@ _parseAddEthereumChain$1(params) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Web3EthereumAddNewChain), - $async$returnValue, t2, t3, toObject, nativeCurrency, decimals, t4, t5, t6, t7, t8, t9, t10, newChain, network, rpcsUrls, hasWrongChainId, _i, i, chainId, t1, toList; + $async$returnValue, t1, toObject, nativeCurrency, decimals, t2, t3, t4, t5, t6, t7, t8, t9, t10, newChain, network, rpcsUrls, hasWrongChainId, _i, i, chainId, toList; var $async$_parseAddEthereumChain$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -57242,34 +60243,27 @@ switch ($async$goto) { case 0: // Function start - t1 = type$.dynamic; - toList = params.paramsAsList$1$1$length(1, t1); + toList = A.PageMessageRequest_get_getFirstParam(params); if (toList == null) - throw A.wrapException(A.Web3RequestExceptionConst_invalidMethodArgruments(params.method)); - if (0 >= toList.length) { - $async$returnValue = A.ioore(toList, 0); - // goto return - $async$goto = 1; - break; - } - t2 = params.method; - t3 = type$.String; - toObject = A.JsUtils_toMap(toList[0], new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0080", "Invalid arguments provided for method '" + t2 + string$.x27__Ple + t2 + "' are correct and try again."), t3, t1); + throw A.wrapException(A.Web3RequestExceptionConst_invalidMethodArgruments(A.getProperty(params, "method", type$.String))); + t1 = A._asString(params.method); + toObject = A.JsUtils_toMap(toList, new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0080", "Invalid arguments provided for method '" + t1 + string$.x27__Ple + t1 + "' are correct and try again.")); nativeCurrency = A.Web3ValidatorUtils_parseMap(toObject, "nativeCurrency", B.Web3EthereumRequestMethods_7xV, type$.Map_String_dynamic); decimals = A.Web3ValidatorUtils_parseInt(nativeCurrency, "decimals", B.Web3EthereumRequestMethods_7xV, type$.nullable_int); t1 = decimals == null; if (!t1 && decimals !== 18) A.throwExpression(B.Web3RequestException_yre); t2 = type$.BigInt; - t4 = A.Web3ValidatorUtils_parseBigInt(toObject, "chainId", B.Web3EthereumRequestMethods_7xV, t2); - t5 = A.Web3ValidatorUtils_parseString(toObject, "chainName", B.Web3EthereumRequestMethods_7xV, t3); - t6 = A.Web3ValidatorUtils_parseString(nativeCurrency, "name", B.Web3EthereumRequestMethods_7xV, t3); - t7 = A.Web3ValidatorUtils_parseString(nativeCurrency, "symbol", B.Web3EthereumRequestMethods_7xV, t3); + t3 = A.Web3ValidatorUtils_parseBigInt(toObject, "chainId", B.Web3EthereumRequestMethods_7xV, t2); + t4 = type$.String; + t5 = A.Web3ValidatorUtils_parseString(toObject, "chainName", B.Web3EthereumRequestMethods_7xV, t4); + t6 = A.Web3ValidatorUtils_parseString(nativeCurrency, "name", B.Web3EthereumRequestMethods_7xV, t4); + t7 = A.Web3ValidatorUtils_parseString(nativeCurrency, "symbol", B.Web3EthereumRequestMethods_7xV, t4); t1 = t1 ? 18 : decimals; t8 = type$.List_String; - t9 = A.Web3EthereumValidator_validateRpcs(A.Web3ValidatorUtils_parseList(toObject, "rpcUrls", B.Web3EthereumRequestMethods_7xV, t8, t3)); + t9 = A.Web3EthereumValidator_validateRpcs(A.Web3ValidatorUtils_parseList(toObject, "rpcUrls", B.Web3EthereumRequestMethods_7xV, t8, t4)); t10 = type$.nullable_List_String; - newChain = A.Web3EthereumAddNewChain$(A.Web3ValidatorUtils_parseList(toObject, "blockExplorerUrls", B.Web3EthereumRequestMethods_7xV, t10, t3), t5, t1, A.Web3ValidatorUtils_parseList(toObject, "iconUrls", B.Web3EthereumRequestMethods_7xV, t10, t3), t6, t4, t9, t7); + newChain = A.Web3EthereumAddNewChain$(A.Web3ValidatorUtils_parseList(toObject, "blockExplorerUrls", B.Web3EthereumRequestMethods_7xV, t10, t4), t5, t1, A.Web3ValidatorUtils_parseList(toObject, "iconUrls", B.Web3EthereumRequestMethods_7xV, t10, t4), t6, t3, t9, t7); network = newChain.toNewNetwork$0(); rpcsUrls = A._setArrayType([], type$.JSArray_String); t1 = network.coinParam._providers, t3 = t1.length, t4 = newChain.newChainId, hasWrongChainId = false, _i = 0; @@ -57319,29 +60313,13 @@ }); return A._asyncStartSync($async$_parseAddEthereumChain$1, $async$completer); }, - _ethereum$_personalSign$1(params) { - var toList, message, t1, exception; - try { - t1 = type$.dynamic; - toList = params.paramsAsList$1$1$length(2, t1); - if (toList == null) { - t1 = A.Web3RequestExceptionConst_invalidMethodArgruments(params.method); - throw A.wrapException(t1); - } - message = A.LinkedHashMap_LinkedHashMap$_literal(["address", J.$index$asx(toList, 0), "challeng", J.$index$asx(toList, 1)], type$.String, t1); - t1 = A.Web3EthreumPersonalSign_Web3EthreumPersonalSign$fromJson(message); - return t1; - } catch (exception) { - throw exception; - } - }, onRequestDone$1(message) { var _this = this; - switch (A.Web3EthereumRequestMethods_fromName(message.method)) { + switch (A.Web3EthereumRequestMethods_fromName(A._asString(message.method))) { case B.Web3EthereumRequestMethods_7xV: case B.Web3EthereumRequestMethods_EuK: case B.Web3EthereumRequestMethods_8_eth_chainId_List_empty: - _this._chainChanged$1(_this.state); + _this._ethereum$_chainChanged$1(_this.state); break; case B.Web3EthereumRequestMethods_5_eth_requestAccounts_List_empty: case B.Web3EthereumRequestMethods_7_eth_accounts_List_empty: @@ -57351,6 +60329,34 @@ }, get$networkType() { return B.NetworkType_iDZ; + }, + finilizeWalletResponse$3$message$params$response(message, params, response) { + var t1; + type$.Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(params); + switch (A.Web3EthereumRequestMethods_fromName(A._asString(message.method))) { + case B.Web3EthereumRequestMethods_5_eth_requestAccounts_List_empty: + t1 = this.state.permissionAccounts; + if (t1.length !== 0) + return {type: "response", status: "success", data: A.jsify(t1)}; + return {type: "response", status: "failed", data: A.jsify(B.Web3RequestException_qx4.toResponseMessage$0().toJson$0())}; + } + return this.super$JSNetworkHandler$finilizeWalletResponse(message, params, response); + }, + event$1($event) { + var _this = this; + switch (A.JSEventType_name(A._asString($event.event))) { + case B.JSEventType_accountsChanged: + _this._ethereum$_accountChanged$1(_this.state); + break; + case B.JSEventType_chainChanged: + _this._ethereum$_chainChanged$1(_this.state); + break; + case B.JSEventType_connect: + _this._ethereum$_connect$1(_this.state); + break; + default: + break; + } } }; A.JSEthereumHandler_initChain_closure.prototype = { @@ -57369,16 +60375,15 @@ currentState = t1.state; t2 = t1.state = A.EthereumWeb3State_EthereumWeb3State($async$self.authenticated, $async$self.chainHandler); if (currentState.state !== t2.state) { - t3 = t1.sendMessageToClient; if (t2.chain != null) - t3.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_105_active, B.JSClientType_List_111_ethereum, null)); + t1._ethereum$_sendEvent$1$event(B.JSEventType_active); else - t3.call$1(new A.JSWalletMessageResponseEthereum(B.EthereumEventTypes_List_106_disable, B.JSClientType_List_111_ethereum, string$.The_UR)); - t1._ethereum$_disconnect$0(); + t1._ethereum$_sendEvent$2$data$event(string$.The_UR, B.JSEventType_disable); + t1._ethereum$_sendEvent$2$data$event(B.Web3RequestException_ww8.toJson$0(), B.JSEventType_disconnect); t2 = t1.state; - if (t2.chain != null) { + if (t2.client != null) { t1._ethereum$_connect$1(t2); - t1._chainChanged$1(t1.state); + t1._ethereum$_chainChanged$1(t1.state); if (type$.BaseServiceProtocol_EthereumAPIProvider._as(t1.state.client.provider.rpc).get$protocol() === B.ServiceProtocol_WebSocket_3_websocket) t1.state.client.addSubscriptionListener$1(t1.get$_onSubscribe()); } @@ -57391,14 +60396,14 @@ t3 = t3 == null ? null : t3.network.coinParam.chainId; t2 = t2.chain; if (!J.$eq$(t3, t2 == null ? null : t2.network.coinParam.chainId)) { - t1._ethereum$_disconnect$0(); + t1._ethereum$_sendEvent$2$data$event(B.Web3RequestException_ww8.toJson$0(), B.JSEventType_disconnect); t2 = t1.state; - if (t2.chain != null) { + if (t2.client != null) { t1._ethereum$_connect$1(t2); if (type$.BaseServiceProtocol_EthereumAPIProvider._as(t1.state.client.provider.rpc).get$protocol() === B.ServiceProtocol_WebSocket_3_websocket) t1.state.client.addSubscriptionListener$1(t1.get$_onSubscribe()); } - t1._chainChanged$1(t1.state); + t1._ethereum$_chainChanged$1(t1.state); } t2 = t1.state; if (!(A.CompareUtils_iterableIsEqual(t2.permissionAccounts, currentState.permissionAccounts, type$.String) && t2.defaultAddress == currentState.defaultAddress)) @@ -57410,20 +60415,20 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.JSEthereumHandler_request_closure.prototype = { call$1(e) { var t1 = type$.EthereumChain._as(e).network.coinParam.chainId.compareTo$1(0, this.parse.chainId); return t1 === 0; }, - $signature: 73 + $signature: 87 }; A.JSEthereumHandler__parseTypedData_closure.prototype = { call$1(e) { return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(e), type$.String, type$.dynamic); }, - $signature: 20 + $signature: 26 }; A.JSEthereumHandler__parseAddEthereumChain_closure.prototype = { call$0() { @@ -57452,43 +60457,26 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 131 - }; - A.JSEthereumHandler__parseTransaction_closure.prototype = { - call$0() { - var t1 = this.transactionParam; - if (typeof t1 == "string") - return A.StringUtils_tryToJson(t1, type$.Map_String_dynamic); - else - return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(t1), type$.String, type$.dynamic); - }, - $signature: 360 + $signature: 80 }; A.JSWalletError_constructor_fromMessage_toString.prototype = { call$0() { return "MRT: " + this.message.message; }, - $signature: 7 + $signature: 4 }; A.JSWalletError_constructor_fromJson_closure.prototype = { call$2(k, v) { A._asString(k); return v == null; }, - $signature: 0 + $signature: 1 }; A.JSWalletError_constructor_fromJson_toString.prototype = { call$0() { - return this.message.toString$0(0); + return A.MapBase_mapToString(this.message); }, - $signature: 7 - }; - A.ChainWeb3State.prototype = {}; - A.JSNetworkHandler.prototype = {}; - A.JSNetworkState.prototype = { - _enumToString$0() { - return "JSNetworkState." + this._name; - } + $signature: 4 }; A.WalletPromise_get_toPromise_closure.prototype = { call$2(resolve, reject) { @@ -57497,7 +60485,7 @@ t1._as(reject); this._this.then$1$2$onError(new A.WalletPromise_get_toPromise__closure(resolve), new A.WalletPromise_get_toPromise__closure0(reject), type$.nullable_Object).catchError$1(new A.WalletPromise_get_toPromise__closure1(reject, resolve)); }, - $signature: 361 + $signature: 382 }; A.WalletPromise_get_toPromise__closure.prototype = { call$1(value) { @@ -57505,7 +60493,7 @@ t1.call(t1, value); return value; }, - $signature: 46 + $signature: 24 }; A.WalletPromise_get_toPromise__closure0.prototype = { call$2(error, stackTrace) { @@ -57516,7 +60504,7 @@ t1.call(t1, error); return error; }, - $signature: 362 + $signature: 383 }; A.WalletPromise_get_toPromise__closure1.prototype = { call$1(e) { @@ -57525,135 +60513,190 @@ }, $signature: 18 }; + A.ChainWeb3State.prototype = {}; + A.JSNetworkHandler.prototype = { + finilizeWalletResponse$3$message$params$response(message, params, response) { + type$.Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(params); + return {type: "response", status: "success", data: A.jsify(response.result)}; + } + }; + A.JSNetworkState.prototype = { + _enumToString$0() { + return "JSNetworkState." + this._core$_name; + } + }; A.JSWalletMessageType.prototype = { _enumToString$0() { - return "JSWalletMessageType." + this._name; + return "JSWalletMessageType." + this._core$_name; } }; - A.JSWalletMessageType_fromTag_closure.prototype = { + A.JSWalletMessageType_fromName_closure.prototype = { call$1(e) { - return A.BytesUtils_bytesEqual(type$.JSWalletMessageType._as(e).tag, this.tag); + return type$.JSWalletMessageType._as(e)._core$_name === this.name; }, - $signature: 363 + $signature: 384 }; - A.JSWalletMessageType_fromTag_closure0.prototype = { + A.JSWalletMessageType_fromName_closure0.prototype = { call$0() { return A.throwExpression(B.Web3RequestException_chs); }, $signature: 2 }; - A.JSWalletMessage.prototype = { - cast$1$0(_, $T) { - A.checkTypeBound($T, type$.JSWalletMessage, "T", "cast"); - if (!$T._is(this)) - throw A.wrapException(B.Web3RequestException_chs); - return $T._as(this); - } - }; - A.JSWalletNetworkEvent.prototype = { - get$type() { - return B.JSWalletMessageType_List_101_event; + A.WalletMessageData__convertMap_closure.prototype = { + call$2(key, value) { + if (type$.Map_dynamic_dynamic._is(value)) + this.map.$indexSet(0, key, A.WalletMessageData__convertMap(this._this, value)); }, - get$requestId() { - return null; - } + $signature: 139 }; - A.JSWalletResponseType.prototype = { + A.JSEventType.prototype = { _enumToString$0() { - return "JSWalletResponseType." + this._name; + return "JSEventType." + this._core$_name; } }; - A.JSWalletResponseType_fromTag_closure.prototype = { + A.JSEventType_name_closure.prototype = { call$1(e) { - return A.BytesUtils_bytesEqual(type$.JSWalletResponseType._as(e).tag, this.tag); + return type$.JSEventType._as(e)._core$_name === this.name; }, - $signature: 364 + $signature: 86 }; - A.JSWalletResponseType_fromTag_closure0.prototype = { + A.JSEventType_name_closure0.prototype = { call$0() { return A.throwExpression(B.Web3RequestException_chs); }, $signature: 2 }; - A.JSWalletMessageResponse.prototype = { - toCbor$0() { - var _this = this, - t1 = A._setArrayType([new A.CborBytesValue(_this.client.tag), _this.requestId, B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", _this.data], type$.String, type$.nullable_Object), null), new A.CborBytesValue(_this.status.tag)], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_100, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); - }, - get$type() { - return B.JSWalletMessageType_List_100_response; + A.JSEventType_fromName_closure.prototype = { + call$1(e) { + return type$.JSEventType._as(e)._core$_name === this.name; }, - get$requestId() { - return this.requestId; + $signature: 86 + }; + A.JSWalletResponseType.prototype = { + _enumToString$0() { + return "JSWalletResponseType." + this._core$_name; } }; + A.JSWalletResponseType_fromName_closure.prototype = { + call$1(e) { + return type$.JSWalletResponseType._as(e)._core$_name === this.name; + }, + $signature: 386 + }; + A.JSWalletResponseType_fromName_closure0.prototype = { + call$0() { + return A.throwExpression(B.Web3RequestException_chs); + }, + $signature: 2 + }; A.JSClientType.prototype = { _enumToString$0() { - return "JSClientType." + this._name; + return "JSClientType." + this._core$_name; } }; - A.JSClientType_fromTag_closure.prototype = { + A.JSClientType_fronNetworkName_closure.prototype = { call$1(e) { - return A.BytesUtils_bytesEqual(type$.JSClientType._as(e).tag, this.tag); + return type$.JSClientType._as(e).networkName === this.name; }, - $signature: 365 + $signature: 85 }; - A.JSClientType_fromTag_closure0.prototype = { + A.JSClientType_fronNetworkName_closure0.prototype = { call$0() { return A.throwExpression(B.Web3RequestException_chs); }, $signature: 2 }; - A.JSPageRequest.prototype = { - toCbor$0() { - var t1 = A._setArrayType([this.message.toCbor$0(), this.id], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_100_100, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); + A.JSClientType_fromName_closure.prototype = { + call$1(e) { + return type$.JSClientType._as(e)._core$_name === this.name; + }, + $signature: 85 + }; + A.JSClientType_fromName_closure0.prototype = { + call$0() { + return A.throwExpression(B.Web3RequestException_chs); + }, + $signature: 2 + }; + A.PageMessageType.prototype = { + _enumToString$0() { + return "PageMessageType." + this._core$_name; } }; - A.PageMessage.prototype = { - paramsAsList$1$1$length($length, $T) { - var listParam, exception; - try { - listParam = A.List_List$from(type$.List_dynamic._as(this.params), true, $T); - if ($length != null && J.get$length$asx(listParam) < $length) - return null; - return listParam; - } catch (exception) { - return null; - } + A.PageMessageType_fromName_closure.prototype = { + call$1(e) { + return type$.PageMessageType._as(e)._core$_name === this.name; }, - paramsAsList$1$0($T) { - return this.paramsAsList$1$1$length(null, $T); + $signature: 388 + }; + A.PageMessageType_fromName_closure0.prototype = { + call$0() { + return A.throwExpression(B.Web3RequestException_chs); }, - paramsAsMap$2$0($K, $V) { - var t1, exception; + $signature: 2 + }; + A.PageMessageRequest_get_dartParams_closure.prototype = { + call$1(e) { + return A.dartify(e); + }, + $signature: 24 + }; + A.JSPageController.prototype = { + _onWalletEvent$1(response) { + var walletResponse, $event, t2, exception, _this = this, + t1 = type$.JSObject; + t1._as(response); try { - t1 = A.JsUtils_toMap(this.params, null, $K, $V); - return t1; + walletResponse = t1._as(response.detail); + if (A.JSWalletMessageType_fromName(A._asString(t1._as(walletResponse.data).type)) === B.JSWalletMessageType_response) { + t2 = A._asString(walletResponse.requestId); + t1 = t1._as(walletResponse.data); + t2 = $.PageNetworkController__waitingRequest.$index(0, t2); + if (t2 != null) + t2._completer.complete$1(t1); + return; + } + $event = t1._as(walletResponse.data); + switch (A.JSClientType_fromName(A._asString(walletResponse.client))) { + case B.JSClientType_Ethereum_ethereum: + _this.ethereumPageController.onEvent$1($event); + break; + case B.JSClientType_Tron_tron: + _this.tronPageController.onEvent$1($event); + break; + case B.JSClientType_Solana_solana: + _this.solanaPageController.onEvent$1($event); + break; + case B.JSClientType_TON_ton: + _this.tonPageController.onEvent$1($event); + break; + default: + break; + } } catch (exception) { - return null; + throw exception; } - }, - cast$1$0(_, $T) { - A.checkTypeBound($T, type$.PageMessage, "T", "cast"); - if (!$T._is(this)) - throw A.wrapException(B.Web3RequestException_chs); - return $T._as(this); } }; - A._JSPageRequest_Object_CborSerializable.prototype = {}; - A._JSWalletMessage_Object_CborSerializable.prototype = {}; - A._PageMessage_Object_CborSerializable.prototype = {}; - A.JSPageController.prototype = { - _getResult$1(message) { - return this._getResult$body$JSPageController(type$.PageMessage._as(message)); - }, - _getResult$body$JSPageController(message) { + A.PageNetworkController.prototype = { + _onWalletRequest$1(params) { + var t2, t3, t4, + t1 = type$.JSObject; + t1._as(params); + A.print("its called here " + A._asString(params.method)); + t2 = A._asString(params.method); + t3 = type$.nullable_JSArray_nullable_Object._as(params.params); + t4 = A._asStringQ(params.id); + return A.WalletPromise_get_toPromise(this._onWalletRequest_$1(A.PageMessageRequest_constructor_create(null, t4 == null ? B.JSInt_methods.toString$0(this._id++) : t4, t2, t3)), t1); + }, + _getWalleResponse$1(message) { + return this._getWalleResponse$body$PageNetworkController(message); + }, + _getWalleResponse$body$PageNetworkController(message) { var $async$goto = 0, - $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Object), - $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, toWalletRequest, result, t1, value, $event, t2, request; - var $async$_getResult$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + $async$completer = A._makeAsyncAwaitCompleter(type$.JSObject), + $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, toWalletRequest, $event, t1, t2, request; + var $async$_getWalleResponse$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) { $async$currentError = $async$result; $async$goto = $async$handler; @@ -57662,27 +60705,22 @@ switch ($async$goto) { case 0: // Function start - request = new A.PageRequestCompeleter(A.UUID_generateUUIDv4(), new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_nullable_Object), type$._AsyncCompleter_nullable_Object)); + request = new A.PageRequestCompeleter(A.UUID_generateUUIDv4(), new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_JSObject), type$._AsyncCompleter_JSObject)); $async$handler = 3; - toWalletRequest = new A.JSPageRequest(request.id, message); - t1 = type$.JSPageRequest._as(toWalletRequest); - value = $async$self.__JSPageController__walletId_FI; - if (value === $) { - value !== $ && A.throwLateFieldADI("_walletId"); - value = $async$self.__JSPageController__walletId_FI = "WALLET_" + $async$self.clientId; - } - $event = A.CustomEvent_constructor_create(false, t1.toCbor$0().encode$0(), value); + t1 = request.id; + t2 = $async$self.get$_client(); + toWalletRequest = {id: t1, client: t2._core$_name, data: message}; + $event = A.CustomEvent_constructor_create(false, toWalletRequest, $.PageNetworkController____walletId._readField$0()); type$.JSObject._as(self.window).dispatchEvent($event); - t1 = $async$self._waitingRequest; - t2 = request.id; - if (t1.$index(0, t2) == null) - t1.$indexSet(0, t2, request); + t1 = request.id; + if ($.PageNetworkController__waitingRequest.$index(0, t1) == null) + $.PageNetworkController__waitingRequest.$indexSet(0, t1, request); $async$goto = 6; - return A._asyncAwait(request._completer.future, $async$_getResult$1); + return A._asyncAwait(request._completer.future, $async$_getWalleResponse$1); case 6: // returning from await. - result = $async$result; - $async$returnValue = result; + t1 = $async$result; + $async$returnValue = t1; $async$next = [1]; // goto finally $async$goto = 4; @@ -57697,7 +60735,7 @@ case 4: // finally $async$handler = 2; - $async$self._waitingRequest.remove$1(0, request.id); + $.PageNetworkController__waitingRequest.remove$1(0, request.id); // goto the next finally handler $async$goto = $async$next.pop(); break; @@ -57711,69 +60749,109 @@ return A._asyncRethrow($async$currentError, $async$completer); } }); - return A._asyncStartSync($async$_getResult$1, $async$completer); + return A._asyncStartSync($async$_getWalleResponse$1, $async$completer); }, - _onWalletEvent$1(response) { - var t1, value, _this = this, - walletResponse = A.JSWalletMessage_deserialize(A.EventInit_detailBytes(type$.JSObject._as(response)), type$.JSWalletMessage); - if (walletResponse.get$type() === B.JSWalletMessageType_List_100_response) { - t1 = _this._waitingRequest.$index(0, walletResponse.get$requestId()); - if (t1 != null) - t1.completeMessage$1(walletResponse.cast$1$0(0, type$.JSWalletMessageResponse)); + _emitEvent$1(message) { + var $event, + t1 = A.JSEventType_name(A._asString(message.event)); + if (!(t1 === B.JSEventType_accountsChanged || t1 === B.JSEventType_chainChanged || t1 === B.JSEventType_connect)) return; - } - switch (walletResponse.client) { - case B.JSClientType_List_111_ethereum: - value = _this.__JSPageController_ethereumPageController_FI; - if (value === $) { - t1 = type$.JSArray_JavaScriptFunction; - t1 = A.LinkedHashMap_LinkedHashMap$_literal([B.EthereumEventTypes_List_100_accountsChanged, A._setArrayType([], t1), B.EthereumEventTypes_List_101_chainChanged, A._setArrayType([], t1), B.EthereumEventTypes_List_103_connect, A._setArrayType([], t1), B.EthereumEventTypes_List_102_message, A._setArrayType([], t1), B.EthereumEventTypes_List_104_disconnect, A._setArrayType([], t1)], type$.EthereumEventTypes, type$.List_JavaScriptFunction); - _this.__JSPageController_ethereumPageController_FI !== $ && A.throwLateFieldADI("ethereumPageController"); - value = _this.__JSPageController_ethereumPageController_FI = new A.EthereumPageController(t1, _this.get$_getResult()); - } - value.onEvent$1(walletResponse.cast$1$0(0, type$.JSWalletMessageResponseEthereum)); - break; - case B.JSClientType_List_112_tron: - value = _this.__JSPageController_tronPageController_FI; - if (value === $) { - t1 = type$.JSArray_JavaScriptFunction; - t1 = A.LinkedHashMap_LinkedHashMap$_literal([B.TronEventTypes_List_110_accountsChanged, A._setArrayType([], t1), B.TronEventTypes_List_111_chainChanged, A._setArrayType([], t1), B.TronEventTypes_List_113_connect, A._setArrayType([], t1), B.TronEventTypes_List_112_message, A._setArrayType([], t1), B.TronEventTypes_List_114_disconnect, A._setArrayType([], t1)], type$.TronEventTypes, type$.List_JavaScriptFunction); - _this.__JSPageController_tronPageController_FI !== $ && A.throwLateFieldADI("tronPageController"); - value = _this.__JSPageController_tronPageController_FI = new A.TronPageController(t1, _this.get$_getResult()); - } - value.onEvent$1(walletResponse.cast$1$0(0, type$.JSWalletMessageResponseTron)); - break; - case B.JSClientType_List_113_solana: - value = _this.__JSPageController_solanaPageController_FI; - if (value === $) { - t1 = type$.JSArray_JavaScriptFunction; - t1 = A.LinkedHashMap_LinkedHashMap$_literal([B.SolanaEventTypes_List_113_connect, A._setArrayType([], t1), B.SolanaEventTypes_List_112_message, A._setArrayType([], t1), B.SolanaEventTypes_List_114_disconnect, A._setArrayType([], t1), B.SolanaEventTypes_List_101_chainChanged, A._setArrayType([], t1), B.SolanaEventTypes_List_100_accountsChanged, A._setArrayType([], t1)], type$.SolanaEventTypes, type$.List_JavaScriptFunction); - _this.__JSPageController_solanaPageController_FI !== $ && A.throwLateFieldADI("solanaPageController"); - value = _this.__JSPageController_solanaPageController_FI = new A.SolanaPageController(t1, _this.get$_getResult()); - } - value.onEvent$1(walletResponse.cast$1$0(0, type$.JSWalletMessageResponseSolana)); - break; - default: - break; - } + t1 = this.get$_client(); + $event = A.CustomEvent_constructor_create(false, {id: "", client: t1._core$_name, data: message}, $.PageNetworkController____walletId._readField$0()); + type$.JSObject._as(self.window).dispatchEvent($event); + }, + _onNetworkRequest$1$1(message, $T) { + return this._onNetworkRequest$body$PageNetworkController(message, $T, $T); + }, + _onNetworkRequest$body$PageNetworkController(message, $T, $async$type) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter($async$type), + $async$returnValue, $async$self = this, response; + var $async$_onNetworkRequest$1$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + $async$outer: + switch ($async$goto) { + case 0: + // Function start + $async$goto = 3; + return A._asyncAwait($async$self._getWalleResponse$1(message), $async$_onNetworkRequest$1$1); + case 3: + // returning from await. + response = $async$result; + switch (A.JSWalletResponseType_fromName(A._asString(response.status))) { + case B.JSWalletResponseType_success: + $async$returnValue = $T._as(response.data); + // goto return + $async$goto = 1; + break $async$outer; + case B.JSWalletResponseType_failed: + throw A.wrapException(A.JSWalletError_constructor_fromJson(A.WalletMessageData_asMap(response))); + } + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$_onNetworkRequest$1$1, $async$completer); + }, + _onWalletRequest_$1(message) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.JSObject), + $async$returnValue, $async$self = this, response; + var $async$_onWalletRequest_$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + $async$outer: + switch ($async$goto) { + case 0: + // Function start + $async$goto = 3; + return A._asyncAwait($async$self._getWalleResponse$1(message), $async$_onWalletRequest_$1); + case 3: + // returning from await. + response = $async$result; + switch (A.JSWalletResponseType_fromName(A._asString(response.status))) { + case B.JSWalletResponseType_success: + $async$returnValue = {id: A._asString(message.id), result: response.data}; + // goto return + $async$goto = 1; + break $async$outer; + case B.JSWalletResponseType_failed: + $async$returnValue = {id: A._asString(message.id), error: A.JSWalletError_constructor_fromJson(A.WalletMessageData_asMap(response))}; + // goto return + $async$goto = 1; + break $async$outer; + } + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$_onWalletRequest_$1, $async$completer); } }; - A.PageNetworkController.prototype = {}; A.EthereumPageController.prototype = { _init$0() { - var t1, t2, t3, t4, _this0, proxy, _this = this; + var t1, t2, t3, t4, t5, _this0, proxy, _this = this; if (_this._ethereum == null) { t1 = A._functionToJS1(_this.get$_onRequest()); t2 = A._functionToJS2(_this.get$_scripts$_addListener()); t3 = A._functionToJS2(_this.get$_removeListener()); A._functionToJS0(_this.get$_disconnect()); t4 = A._functionToJS0(_this.get$_enable()); + t5 = A._functionToJS0(_this.get$_cancelAllListeners()); _this0 = {}; + _this0.sendWalletRequest = A._functionToJS1(_this.get$_onWalletRequest()); + _this0.cancelListener = t3; _this0.request = t1; _this0.on = t2; _this0.removeListener = t3; _this0.providerInfo = $.$get$EIP6963ProviderInfo_providerInfo(); _this0.enable = t4; + _this0.cancelAllListener = t5; _this.set$_ethereum(new A.ProxyMethodHandler(_this0, type$.ProxyMethodHandler_JSObject)); } t1 = self; @@ -57782,70 +60860,68 @@ A.EIP6963ProviderDetail_setup(proxy); }, onEvent$1(message) { - var t2, t3, t4, _this = this, _null = null, + var t1, t2, t3, _this = this, _s11_ = "net_version", - eventMessage = message.cast$1$0(0, type$.JSWalletMessageResponseEthereum), - t1 = eventMessage.event, - eventData = _null; - switch (t1) { - case B.EthereumEventTypes_List_103_connect: - t2 = A._BigIntImpl_parse(A._asString(type$.Map_String_dynamic._as(eventMessage.data).$index(0, _s11_)), _null); - t3 = "0x" + t2.toRadixString$1(0, 16); - eventData = new A.ProviderConnectInfo(t3, t2).get$toJSEvent(); - t4 = _this._ethereum; - if (t4 != null) - t4.object.chainId = t3; - t3 = _this._ethereum; - if (t3 != null) - t3.object.networkVersion = t2.toString$0(0); - break; - case B.EthereumEventTypes_List_101_chainChanged: - t2 = A._BigIntImpl_parse(A._asString(type$.Map_String_dynamic._as(eventMessage.data).$index(0, _s11_)), _null); - t3 = "0x" + t2.toRadixString$1(0, 16); - eventData = A.jsify(t3); - t4 = _this._ethereum; - if (t4 != null) - t4.object.chainId = t3; + eventData = message.data; + switch (A.JSEventType_name(A._asString(message.event))) { + case B.JSEventType_connect: + t1 = A._BigIntImpl_parse(A._asString(A.WalletMessageData_asMap(message).$index(0, _s11_)), null); + t2 = "0x" + t1.toRadixString$1(0, 16); + eventData = new A.ProviderConnectInfo(t2, t1).get$toJSEvent(); t3 = _this._ethereum; if (t3 != null) - t3.object.networkVersion = t2.toString$0(0); - break; - case B.EthereumEventTypes_List_104_disconnect: - t2 = _this._ethereum; - if (t2 != null) - t2.object.chainId = null; + t3.object.chainId = t2; t2 = _this._ethereum; if (t2 != null) - t2.object.networkVersion = null; + t2.object.networkVersion = t1.toString$0(0); + break; + case B.JSEventType_chainChanged: + t1 = A._BigIntImpl_parse(A._asString(A.WalletMessageData_asMap(message).$index(0, _s11_)), null); + t2 = "0x" + t1.toRadixString$1(0, 16); + eventData = A.jsify(t2); + t3 = _this._ethereum; + if (t3 != null) + t3.object.chainId = t2; t2 = _this._ethereum; if (t2 != null) - t2.object.selectedAddress = null; + t2.object.networkVersion = t1.toString$0(0); break; - case B.EthereumEventTypes_List_100_accountsChanged: - t2 = type$.Map_String_dynamic._as(eventMessage.data); - t3 = type$.String; - t4 = J.cast$1$0$ax(type$.List_dynamic._as(t2.$index(0, "accounts")), t3); - t2 = A._asStringQ(t2.$index(0, "defaultAddress")); - eventData = A.jsify(A.List_List$unmodifiable(t4, t3)); - t3 = _this._ethereum; - if (t3 != null) { - t3 = t3.object; - if (t2 == null) - t2 = _null; - t3.selectedAddress = t2; + case B.JSEventType_disconnect: + t1 = _this._ethereum; + if (t1 != null) + t1.object.chainId = null; + t1 = _this._ethereum; + if (t1 != null) + t1.object.networkVersion = null; + t1 = _this._ethereum; + if (t1 != null) + t1.object.selectedAddress = null; + break; + case B.JSEventType_accountsChanged: + t1 = A.WalletMessageData_asMap(message); + t2 = type$.String; + t3 = J.cast$1$0$ax(type$.List_dynamic._as(t1.$index(0, "accounts")), t2); + t1 = A._asStringQ(t1.$index(0, "defaultAddress")); + eventData = A.jsify(A.List_List$unmodifiable(t3, t2)); + t2 = _this._ethereum; + if (t2 != null) { + t2 = t2.object; + if (t1 == null) + t1 = null; + t2.selectedAddress = t1; } break; - case B.EthereumEventTypes_List_106_disable: - t2 = A._asStringQ(eventMessage.data); - t3 = self; - t3.ethereum = null; - type$.JSObject._as(t3.console).error(t2); + case B.JSEventType_disable: + t1 = A.WalletMessageData_asString(message); + t2 = self; + t2.ethereum = null; + type$.JSObject._as(t2.console).error(t1); break; - case B.EthereumEventTypes_List_105_active: + case B.JSEventType_active: _this._init$0(); break; } - _this._eventListeners$2$jsObject(t1, eventData); + _this._eventListeners$2$jsObject(A.JSEventType_name(A._asString(message.event)), eventData); }, _eventListeners$2$jsObject(type, jsObject) { var t1, t2, _i, i; @@ -57865,20 +60941,27 @@ var $event, t1; A._asString(type); type$.JavaScriptFunction._as(listener); - $event = A.EthereumEventTypes_fromName(type); + $event = A.JSEventType_fromName(type); if ($event == null) return; t1 = this._listeners.$index(0, $event); if (t1 != null) B.JSArray_methods.add$1(t1, listener); - if ($event !== B.EthereumEventTypes_List_102_message && $event !== B.EthereumEventTypes_List_104_disconnect) - this.getWalletMessage.call$1(new A.ClientMessageEthereum($event._name, null)); + this._emitEvent$1(A.PageMessageEvent_constructor_build($event)); + }, + _cancelAllListeners$0() { + var t1, t2, t3, _i, t4; + for (t1 = this._listeners, t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>"), t2 = A.List_List$of(new A.LinkedHashMapKeyIterable(t1, t2), true, t2._eval$1("Iterable.E")), t3 = t2.length, _i = 0; _i < t3; ++_i) { + t4 = t1.$index(0, t2[_i]); + t4.toString; + B.JSArray_methods.clear$0(t4); + } }, _removeListener$2(type, listener) { var t1; A._asString(type); type$.JavaScriptFunction._as(listener); - t1 = this._listeners.$index(0, A.EthereumEventTypes_fromName(type)); + t1 = this._listeners.$index(0, A.JSEventType_fromName(type)); if (t1 != null) B.JSArray_methods.remove$1(t1, listener); }, @@ -57886,12 +60969,15 @@ return this._onRequest$1({method: "eth_requestAccounts"}); }, _onRequest$1(params) { - var t1, t2; + var t1, t2, t3; type$.JSObject._as(params); t1 = A._asString(params.method); - t2 = params.params; - t2 = t2 == null ? null : A.dartify(t2); - return A.WalletPromise_get_toPromise(this.getWalletMessage.call$1(new A.ClientMessageEthereum(t1, t2)), type$.nullable_Object); + t2 = type$.nullable_JSArray_nullable_Object._as(params.params); + t3 = type$.nullable_Object; + return A.WalletPromise_get_toPromise(this._onNetworkRequest$1$1(A.PageMessageRequest_constructor_create(null, B.JSInt_methods.toString$0(this._requestId++), t1, t2), t3), t3); + }, + get$_client() { + return B.JSClientType_Ethereum_ethereum; }, set$_ethereum(_ethereum) { this._ethereum = type$.nullable_ProxyMethodHandler_JSObject._as(_ethereum); @@ -57901,7 +60987,7 @@ call$0() { return this._dartInstance.object; }, - $signature: 23 + $signature: 20 }; A.EthereumPageController__init_closure.prototype = { call$0() { @@ -57921,69 +61007,48 @@ t3.defineProperty.apply(t3, [_jsExporter, "object", _objectMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.SolanaPageController.prototype = { _init$0() { - var handler, t1, proxy, _this = this, _this0 = {}; - _this0.signAndSendTransaction = A._functionToJS1(_this.get$_signTranaction()); - _this0.signAllTransactions = A._functionToJS1(_this.get$_signAllTransactions()); - _this0.signAndSendTransaction = A._functionToJS2(_this.get$_signAndSendTransaction()); - _this0.signAndSendAllTransactions = A._functionToJS2(_this.get$_signAndSendAllTransactions()); - _this0.on = A._functionToJS2(_this.get$_scripts$_addListener()); - _this0.removeListener = A._functionToJS2(_this.get$_removeListener()); - _this0.signMessage = A._functionToJS1(_this.get$_signMessage()); - _this0.connect = A._functionToJS0(_this.get$_connect()); - _this0.isConnected = false; - handler = new A.ProxyMethodHandler(_this0, type$.ProxyMethodHandler_JSObject); + var _this0, t1, t2, _this = this; + if (_this._solana == null) { + _this0 = {}; + _this0.signTransaction = A._functionToJS1(_this.get$_signTranaction()); + _this0.signAllTransactions = A._functionToJS1(_this.get$_signAllTransactions()); + _this0.signAndSendTransaction = A._functionToJS2(_this.get$_signAndSendTransaction()); + _this0.signAndSendAllTransactions = A._functionToJS2(_this.get$_signAndSendAllTransactions()); + t1 = _this.get$_scripts$_addListener(); + _this0.on = A._functionToJS2(t1); + t2 = _this.get$_removeListener(); + _this0.removeListener = A._functionToJS2(t2); + _this0.signMessage = A._functionToJS1(_this.get$_signMessage()); + _this0.connect = A._functionToJS0(_this.get$_connect()); + _this0.isConnected = false; + _this0.on = A._functionToJS2(t1); + _this0.cancelListener = A._functionToJS2(t2); + _this0.sendWalletRequest = A._functionToJS1(_this.get$_buildWalletRequest()); + _this.set$_solana(new A.ProxyMethodHandler(_this0, type$.ProxyMethodHandler_JSObject)); + } t1 = self; - proxy = A.callConstructor(t1.Proxy, [_this0, new A.SolanaPageController__init_closure(handler).call$0()], type$.JSObject); - _this.set$_solana(handler); - t1.solana = proxy; - }, - _signMessage$1(transaction) { - return A.WalletPromise_get_toPromise(this._personalSign$1(type$.Object._as(transaction)), type$.nullable_JSObject); + t1.solana = A.callConstructor(t1.Proxy, [_this._solana.object, new A.SolanaPageController__init_closure(_this).call$0()], type$.JSObject); }, - _personalSign$1(transaction) { - var $async$goto = 0, - $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_JSObject), - $async$returnValue, $async$self = this, result; - var $async$_personalSign$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { - if ($async$errorCode === 1) - return A._asyncRethrow($async$result, $async$completer); - while (true) - switch ($async$goto) { - case 0: - // Function start - $async$goto = 3; - return A._asyncAwait($async$self.getWalletMessage.call$1(new A.ClientMessageSolana("solana_signMessage", A.JSUint8Array_toListInt(transaction))), $async$_personalSign$1); - case 3: - // returning from await. - result = $async$result; - A.printString("dartify " + A.S(A.dartify(result))); - $async$returnValue = {signature: type$.Object._as(self.Uint8Array.from(result))}; - // goto return - $async$goto = 1; - break; - case 1: - // return - return A._asyncReturn($async$returnValue, $async$completer); - } - }); - return A._asyncStartSync($async$_personalSign$1, $async$completer); + _signMessage$1(message) { + var t1 = type$.JSObject; + return A.WalletPromise_get_toPromise(this._onNetworkRequest$1$1(A.PageMessageRequest_constructor_create(null, null, "solana_signMessage", [message]), type$.nullable_Object).then$1$1(new A.SolanaPageController__signMessage_closure(), t1), t1); }, _signTranaction$1(transaction) { - return A.WalletPromise_get_toPromise(this._buildTransaction$2$batch$transactions(false, A._setArrayType([type$.JSObject._as(transaction)], type$.JSArray_JSObject)), type$.nullable_Object); + return A.WalletPromise_get_toPromise(this._buildTransaction$2$method$transactions("solana_signTransaction", A._setArrayType([type$.JSObject._as(transaction)], type$.JSArray_JSObject)), type$.nullable_Object); }, _signAllTransactions$1(transaction) { - return A.WalletPromise_get_toPromise(this._buildTransaction$2$batch$transactions(true, type$.JSArray_nullable_Object._as(transaction)), type$.nullable_Object); + return A.WalletPromise_get_toPromise(this._buildTransaction$2$method$transactions("solana_signAllTransactions", type$.JSArray_nullable_Object._as(transaction)), type$.nullable_Object); }, _signAndSendTransaction$2(transaction, options) { var t1; type$.JSObject._as(transaction); type$.nullable_JSObject._as(options); t1 = A._setArrayType([transaction], type$.JSArray_JSObject); - return A.WalletPromise_get_toPromise(this._buildTransaction$3$batch$option$transactions(false, options == null ? {skipPreflight: false} : options, t1), type$.nullable_Object); + return A.WalletPromise_get_toPromise(this._buildTransaction$3$method$option$transactions("solana_sendTransaction", options == null ? {skipPreflight: false} : options, t1), type$.nullable_Object); }, _signAndSendTransaction$1(transaction) { return this._signAndSendTransaction$2(transaction, null); @@ -57991,54 +61056,128 @@ _signAndSendAllTransactions$2(transaction, options) { type$.JSArray_nullable_Object._as(transaction); type$.nullable_JSObject._as(options); - return A.WalletPromise_get_toPromise(this._buildTransaction$3$batch$option$transactions(true, options == null ? {skipPreflight: false} : options, transaction), type$.nullable_Object); + return A.WalletPromise_get_toPromise(this._buildTransaction$3$method$option$transactions("solana_sendAllTransactions", options == null ? {skipPreflight: false} : options, transaction), type$.nullable_Object); }, _signAndSendAllTransactions$1(transaction) { return this._signAndSendAllTransactions$2(transaction, null); }, - _buildTransaction$3$batch$option$transactions(batch, option, transactions) { + _buildWalletRequest$1(request) { + var t2, t3, t4, _this = this, + t1 = type$.JSObject; + t1._as(request); + switch (A._asString(request.method)) { + case "solana_requestAccounts": + return _this._onWalletRequest$1(request); + case "solana_signMessage": + t2 = A._asString(request.method); + t3 = type$.nullable_JSArray_nullable_Object._as(request.params); + t4 = A._asStringQ(request.id); + return A.WalletPromise_get_toPromise(_this._onWalletRequest_$1(A.PageMessageRequest_constructor_create(null, t4 == null ? B.JSInt_methods.toString$0(_this._id++) : t4, t2, t3)).then$1$1(new A.SolanaPageController__buildWalletRequest_closure(), t1), t1); + default: + return A.WalletPromise_get_toPromise(_this._toWalletRequest$1(request), type$.nullable_Object); + } + }, + _toWalletRequest$1(request) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Object), - $async$returnValue, $async$self = this, t2, t3, t4, t5, t6, t7, t8, t9, t10, index, t11, t12, t13, t14, t15, completer, result, toDart, t1, _length, messages; - var $async$_buildTransaction$3$batch$option$transactions = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + $async$returnValue, $async$self = this, params, transactions, options, t1, items, t2, item, method, id; + var $async$_toWalletRequest$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + $async$outer: + switch ($async$goto) { + case 0: + // Function start + method = A.Web3SolanaRequestMethods_fromName(A._asString(request.method)); + id = A._asStringQ(request.id); + if (id == null) + id = B.JSInt_methods.toString$0($async$self._id++); + if (method == null) { + $async$returnValue = {id: id, error: A.JSWalletError_constructor_fromJson(B.Web3RequestException_imj.toJson$0())}; + // goto return + $async$goto = 1; + break; + } + params = type$.nullable_JSArray_nullable_Object._as(request.params); + if (params == null || A._asInt(params.length) === 0) { + $async$returnValue = {id: id, error: A.JSWalletError_constructor_fromJson(new A.Web3RequestException(string$.InvalitT, -32602, "WEB3-5100", "Transaction serialization failed").toJson$0())}; + // goto return + $async$goto = 1; + break; + } + transactions = A._setArrayType([], type$.JSArray_JSObject); + options = null; + switch (method) { + case B.Web3SolanaRequestMethods_a3R: + case B.Web3SolanaRequestMethods_upD: + t1 = type$.Object; + items = A.JSArrayFuture_elemetAt(params, 0, t1, type$.JSArray_nullable_Object); + if (items == null) { + $async$returnValue = {id: id, error: A.JSWalletError_constructor_fromJson(new A.Web3RequestException("Invalid method parameters: Invalid batch transaction request. The first parameter must be a list of transactions when sending a batch request.", -32602, "WEB3-5100", "Invalid batch transaction request. The first parameter must be a list of transactions when sending a batch request.").toJson$0())}; + // goto return + $async$goto = 1; + break $async$outer; + } + B.JSArray_methods.addAll$1(transactions, type$.List_JSObject._is(items) ? items : new A.CastList(items, A._arrayInstanceType(items)._eval$1("CastList<1,JSObject>"))); + if (method === B.Web3SolanaRequestMethods_a3R) { + options = A.JSArrayFuture_elemetAt(params, 1, t1, type$.JSObject); + if (options == null) + options = {skipPreflight: false}; + } + break; + case B.Web3SolanaRequestMethods_mJH: + case B.Web3SolanaRequestMethods_6YB: + t1 = type$.Object; + t2 = type$.JSObject; + item = A.JSArrayFuture_elemetAt(params, 0, t1, t2); + if (item == null) { + $async$returnValue = {id: id, error: A.JSWalletError_constructor_fromJson(new A.Web3RequestException(string$.InvalitT, -32602, "WEB3-5100", "Transaction serialization failed").toJson$0())}; + // goto return + $async$goto = 1; + break $async$outer; + } + B.JSArray_methods.add$1(transactions, item); + if (method === B.Web3SolanaRequestMethods_mJH) { + options = A.JSArrayFuture_elemetAt(params, 1, t1, t2); + if (options == null) + options = {skipPreflight: false}; + } + break; + default: + $async$returnValue = {id: id, error: A.JSWalletError_constructor_fromJson(B.Web3RequestException_imj.toJson$0())}; + // goto return + $async$goto = 1; + break $async$outer; + } + t1 = type$.MappedListIterable_JSObject_Object; + t2 = type$.JSObject; + $async$returnValue = A.WalletPromise_get_toPromise($async$self._onWalletRequest_$1(A.PageMessageRequest_constructor_create(options, id, A._asString(request.method), A.List_List$of(new A.MappedListIterable(transactions, type$.Object_Function_JSObject._as(new A.SolanaPageController__toWalletRequest_closure()), t1), true, t1._eval$1("ListIterable.E")))).then$1$1(new A.SolanaPageController__toWalletRequest_closure0($async$self, request, transactions), t2), t2); + // goto return + $async$goto = 1; + break; + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$_toWalletRequest$1, $async$completer); + }, + _buildTransaction$3$method$option$transactions(method, option, transactions) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Object), + $async$returnValue, $async$self = this, t2, t1; + var $async$_buildTransaction$3$method$option$transactions = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); while (true) switch ($async$goto) { case 0: // Function start - toDart = type$.List_JSObject._is(transactions) ? transactions : new A.CastList(transactions, A._arrayInstanceType(transactions)._eval$1("CastList<1,JSObject>")); - t1 = J.getInterceptor$asx(toDart); - _length = t1.get$length(toDart); - messages = J.JSArray_JSArray$allocateGrowable(_length, type$.ClientSolanaTransactionMessage); - for (t2 = type$.String, t3 = type$.dynamic, t4 = type$.List_Object, t5 = type$.nullable_JSArray_nullable_Object, t6 = option == null, t7 = type$.int, t8 = type$.Object, t9 = type$.nullable_List_dynamic, t10 = type$.JSArray_int, index = 0; index < _length; ++index) { - t11 = t9._as(A.dartify(t8._as(t1.$index(toDart, index).serialize({verifySignatures: false})))); - t11 = t11 == null ? null : J.cast$1$0$ax(t11, t7); - if (t11 == null) - t11 = A._setArrayType([], t10); - if (t6) - t12 = null; - else { - t12 = A._asBoolQ(option.skipPreflight); - t13 = A._asStringQ(option.preflightCommitment); - t14 = A._asIntQ(option.minContextSlot); - t15 = t5._as(option.signers); - if (t15 == null) - t15 = null; - else - t15 = J.get$isNotEmpty$asx(t4._is(t15) ? t15 : new A.CastList(t15, A._arrayInstanceType(t15)._eval$1("CastList<1,Object>"))); - t12 = A.LinkedHashMap_LinkedHashMap$_literal(["skipPreflight", t12, "preflightCommitment", t13, "minContextSlot", t14, "signers", t15 === true, "maxRetries", A._asIntQ(option.maxRetries)], t2, t3); - } - messages[index] = new A.ClientSolanaTransactionMessage(index, A.BytesUtils_toBytes(t11, true), t12); - } - t1 = new A._Future($.Zone__current, type$._Future_nullable_Object); - completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_nullable_Object); - t2 = A._arrayInstanceType(messages); - t3 = t2._eval$1("MappedListIterable<1,Map>"); - result = $async$self.getWalletMessage.call$1(new A.ClientMessageSolana("solana_signTransaction", A.List_List$of(new A.MappedListIterable(messages, t2._eval$1("Map(1)")._as(new A.SolanaPageController__buildTransaction_closure()), t3), true, t3._eval$1("ListIterable.E")))); - result.catchError$1(new A.SolanaPageController__buildTransaction_closure0(completer)); - result.then$1$1(new A.SolanaPageController__buildTransaction_closure1(option, toDart, batch, completer), type$.Null); - $async$returnValue = t1; + t1 = type$.List_JSObject._is(transactions) ? transactions : new A.CastList(transactions, A._arrayInstanceType(transactions)._eval$1("CastList<1,JSObject>")); + t1 = J.map$1$1$ax(t1, new A.SolanaPageController__buildTransaction_closure(), type$.Object); + t2 = type$.nullable_Object; + $async$returnValue = A.WalletPromise_get_toPromise($async$self._onNetworkRequest$1$1(A.PageMessageRequest_constructor_create(option, null, method, A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E"))), t2).then$1$1(new A.SolanaPageController__buildTransaction_closure0($async$self, method, transactions), t2), t2); // goto return $async$goto = 1; break; @@ -58047,70 +61186,114 @@ return A._asyncReturn($async$returnValue, $async$completer); } }); - return A._asyncStartSync($async$_buildTransaction$3$batch$option$transactions, $async$completer); - }, - _buildTransaction$2$batch$transactions(batch, transactions) { - return this._buildTransaction$3$batch$option$transactions(batch, null, transactions); + return A._asyncStartSync($async$_buildTransaction$3$method$option$transactions, $async$completer); + }, + _buildTransaction$2$method$transactions(method, transactions) { + return this._buildTransaction$3$method$option$transactions(method, null, transactions); + }, + _onTransactionResponse$3$method$result$transactions(method, result, transactions) { + var t1, toDart, t2, i, signature, t3, t4, t5, t6, jsBuffer, + _s22_ = "solana_signTransaction"; + switch (method) { + case "solana_signTransaction": + case "solana_signAllTransactions": + t1 = J.map$1$1$ax(type$.List_dynamic._as(A.dartify(result)), new A.SolanaPageController__onTransactionResponse_closure(), type$.nullable_JSSolanaSignTransactionResponse); + toDart = A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")); + for (t1 = type$.Object, t2 = type$.nullable_JSObject, i = 0; i < A._asInt(transactions.length); ++i) { + if (!(i < toDart.length)) + return A.ioore(toDart, i); + signature = toDart[i]; + if (signature == null) + continue; + t3 = t2._as(transactions[i]); + if (t3 != null) { + t4 = signature.address; + t5 = signature.addressBytes; + t6 = self; + jsBuffer = t1._as(t6.Uint8Array.from(A.jsify(t5))); + t4 = new A.JSSolanaPublicKey(t4, jsBuffer, new t6.BN(t1._as(jsBuffer.slice()))).get$toJS(); + t5 = signature.signature; + t3.addSignature(t4, t1._as(t6.Uint8Array.from(A.jsify(t5)))); + } + } + if (method === _s22_) + return t2._as(transactions[0]); + return transactions; + case "solana_requestAccounts": + case "solana_sendTransaction": + case "solana_sendAllTransactions": + return result; + default: + return null; + } }, _connect$0() { - return A.WalletPromise_get_toPromise(this.getWalletMessage.call$1(B.ClientMessageSolana_solana_requestAccounts_null), type$.nullable_Object); + var t1 = type$.nullable_Object; + return A.WalletPromise_get_toPromise(this._onNetworkRequest$1$1(A.PageMessageRequest_constructor_create(null, null, "solana_requestAccounts", null), t1), t1); }, onEvent$1(message) { - var t2, addr, eventData, changeInfo, t3, t4, _this = this, - eventMessage = message.cast$1$0(0, type$.JSWalletMessageResponseSolana), - t1 = eventMessage.event; - switch (t1) { - case B.SolanaEventTypes_List_113_connect: - t2 = A.SolanaAccountsChanged_SolanaAccountsChanged$fromJson(type$.Map_String_dynamic._as(eventMessage.data)).defaultAddress; - addr = t2 == null ? null : t2.get$toJS(); - t2 = _this._solana; - if (t2 != null) - t2.object.publicKey = addr; - t2 = _this._solana; - if (t2 != null) - t2.object.isConnected = addr != null; - eventData = addr; - break; - case B.SolanaEventTypes_List_101_chainChanged: - eventData = new A.SolanaProviderConnectInfo(A._asString(type$.Map_String_dynamic._as(eventMessage.data).$index(0, "genesisBlock"))).get$toJS(); - break; - case B.SolanaEventTypes_List_100_accountsChanged: - changeInfo = A.SolanaAccountsChanged_SolanaAccountsChanged$fromJson(type$.Map_String_dynamic._as(eventMessage.data)); - t2 = changeInfo.defaultAddress; - addr = t2 == null ? null : t2.get$toJS(); - t2 = changeInfo.accounts; - t3 = A._arrayInstanceType(t2); - t4 = t3._eval$1("MappedListIterable<1,String>"); - eventData = A.List_List$of(new A.MappedListIterable(t2, t3._eval$1("String(1)")._as(new A.SolanaPageController_onEvent_closure()), t4), true, t4._eval$1("ListIterable.E")); - t4 = _this._solana; - if (t4 != null) - t4.object.publicKey = addr; - t2 = _this._solana; - if (t2 != null) - t2.object.isConnected = addr != null; + var changeInfo, t1, addr, addr0, t2, _this = this, _null = null, + eventData = message.data; + switch (A.JSEventType_name(A._asString(message.event))) { + case B.JSEventType_connect: + changeInfo = A.SolanaAccountsChanged_SolanaAccountsChanged$fromJson(A.WalletMessageData_asMap(message)); + t1 = changeInfo.toJSPublicKey$0(); + addr = t1 == null ? _null : t1.get$toJS(); + eventData = changeInfo.connectInfo.get$toJS(); + t1 = _this._solana; + if (t1 != null) + t1.object.publicKey = addr; + t1 = _this._solana; + if (t1 != null) + t1.object.isConnected = addr != null; break; - case B.SolanaEventTypes_List_114_disconnect: - t2 = _this._solana; - if (t2 != null) - t2.object.publicKey = null; + case B.JSEventType_chainChanged: + eventData = new A.SolanaProviderConnectInfo(A._asString(A.WalletMessageData_asMap(message).$index(0, "genesisBlock"))).get$toJS(); + break; + case B.JSEventType_accountsChanged: + changeInfo = A.SolanaAccountsChanged_SolanaAccountsChanged$fromJson(A.WalletMessageData_asMap(message)); + addr = changeInfo.defaultAddress; + t1 = addr == null; + addr0 = t1 ? _null : addr; + eventData = changeInfo.get$accountJS(); t2 = _this._solana; - if (t2 != null) - t2.object.isConnected = false; - eventData = null; + if (t2 != null) { + t2 = t2.object; + t1 = t1 ? _null : addr; + t2.selectedAddress = t1; + } + t1 = _this._solana; + if (t1 != null) { + t1 = t1.object; + t2 = changeInfo.toJSPublicKey$0(); + t2 = t2 == null ? _null : t2.get$toJS(); + t1.publicKey = t2; + } + t1 = _this._solana; + if (t1 != null) + t1.object.isConnected = addr0 != null; + break; + case B.JSEventType_disconnect: + t1 = _this._solana; + if (t1 != null) + t1.object.publicKey = null; + t1 = _this._solana; + if (t1 != null) + t1.object.isConnected = false; break; - case B.SolanaEventTypes_List_116_disable: - t1 = A._asStringQ(eventMessage.data); + case B.JSEventType_disable: + t1 = A.WalletMessageData_asString(message); t2 = self; t2.solana = null; type$.JSObject._as(t2.console).error(t1); return; - case B.SolanaEventTypes_List_115_active: + case B.JSEventType_active: _this._init$0(); return; default: return; } - _this._eventListeners$2$jsObject(t1, eventData); + _this._eventListeners$2$jsObject(A.JSEventType_name(A._asString(message.event)), eventData); }, _eventListeners$2$jsObject(type, jsObject) { var t2, _i, i, @@ -58129,23 +61312,25 @@ var $event, t1; A._asString(type); type$.JavaScriptFunction._as(listener); - $event = A.SolanaEventTypes_fromName(type); + $event = A.JSEventType_fromName(type); if ($event == null || !this._listeners.containsKey$1($event)) return; t1 = this._listeners.$index(0, $event); if (t1 != null) B.JSArray_methods.add$1(t1, listener); - if ($event !== B.SolanaEventTypes_List_112_message && $event !== B.SolanaEventTypes_List_114_disconnect) - this.getWalletMessage.call$1(new A.ClientMessageSolana($event._name, null)); + this._emitEvent$1(A.PageMessageEvent_constructor_build($event)); }, _removeListener$2(type, listener) { var t1; A._asString(type); type$.JavaScriptFunction._as(listener); - t1 = this._listeners.$index(0, A.SolanaEventTypes_fromName(type)); + t1 = this._listeners.$index(0, A.JSEventType_fromName(type)); if (t1 != null) B.JSArray_methods.remove$1(t1, listener); }, + get$_client() { + return B.JSClientType_Solana_solana; + }, set$_solana(_solana) { this._solana = type$.nullable_ProxyMethodHandler_JSObject._as(_solana); } @@ -58154,126 +61339,235 @@ call$0() { return this._dartInstance.object; }, - $signature: 23 + $signature: 20 }; A.SolanaPageController__init_closure.prototype = { call$0() { - var _objectMapping, - _dartInstance = this.handler, - t1 = type$.JSObject, - t2 = t1._as(self), - t3 = t1._as(t2.Object), - _jsExporter = t1._as(t3.create.apply(t3, [null])); - _jsExporter.set = A._functionToJS4(_dartInstance.get$set()); - _jsExporter.get = A._functionToJS2(_dartInstance.get$get()); - t3 = t1._as(t2.Object); - _objectMapping = t1._as(t3.create.apply(t3, [null])); - _objectMapping.get = A._functionToJS0(new A.SolanaPageController__init__closure(_dartInstance)); - t2 = t1._as(t2.Object); - t2.defineProperty.apply(t2, [_jsExporter, "object", _objectMapping]); + var t2, t3, t4, _jsExporter, _objectMapping, + t1 = this.$this._solana; + t1.toString; + t2 = type$.JSObject; + t3 = t2._as(self); + t4 = t2._as(t3.Object); + _jsExporter = t2._as(t4.create.apply(t4, [null])); + _jsExporter.set = A._functionToJS4(t1.get$set()); + _jsExporter.get = A._functionToJS2(t1.get$get()); + t4 = t2._as(t3.Object); + _objectMapping = t2._as(t4.create.apply(t4, [null])); + _objectMapping.get = A._functionToJS0(new A.SolanaPageController__init__closure(t1)); + t3 = t2._as(t3.Object); + t3.defineProperty.apply(t3, [_jsExporter, "object", _objectMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; - A.SolanaPageController__buildTransaction_closure.prototype = { + A.SolanaPageController__signMessage_closure.prototype = { call$1(e) { - return type$.ClientSolanaTransactionMessage._as(e).toJson$0(); + return A.JSSolanaSignMessageResponse_constructor_fromJson(type$.Map_dynamic_dynamic._as(A.dartify(e)).cast$2$0(0, type$.String, type$.dynamic)); }, - $signature: 375 + $signature: 84 }; - A.SolanaPageController__buildTransaction_closure0.prototype = { + A.SolanaPageController__buildWalletRequest_closure.prototype = { call$1(e) { - var t1 = e == null ? type$.Object._as(e) : e; - this.completer.completeError$1(t1); - return null; + var t1; + type$.JSObject._as(e); + if (e.error != null) + return e; + t1 = A.JSSolanaSignMessageResponse_constructor_fromJson(type$.Map_dynamic_dynamic._as(A.dartify(e.result)).cast$2$0(0, type$.String, type$.dynamic)); + return {id: A._asString(e.id), result: t1}; }, - $signature: 24 + $signature: 21 }; - A.SolanaPageController__buildTransaction_closure1.prototype = { - call$1(e) { - var _length, txHash, t3, _i, i, t4, t5, t6, t7, t8, jsBuffer, _this = this, - response = J.map$1$1$ax(type$.List_dynamic._as(A.dartify(e)), new A.SolanaPageController__buildTransaction__closure(), type$.Map_String_dynamic), - t1 = response.$ti, - t2 = t1._eval$1("MappedListIterable"), - results = A.List_List$of(new A.MappedListIterable(response, t1._eval$1("SolanaWeb3TransactionResponse(ListIterable.E)")._as(new A.SolanaPageController__buildTransaction__closure0()), t2), true, t2._eval$1("ListIterable.E")); - if (_this.option != null) { - _length = J.get$length$asx(_this.toDart); - txHash = J.JSArray_JSArray$allocateGrowable(_length, type$.nullable_String); - for (e = 0; e < _length; ++e) - txHash[e] = null; - for (t1 = results.length, t2 = type$.SolanaWeb3TransactionSendResponse, t3 = type$.SolanaWeb3TransactionResponse, _i = 0; _i < t1; ++_i) { - i = results[_i]; - switch (i.get$type()) { - case B.SolanaWeb3TransactionResponseType_0: - t4 = i.id; - if (!(t4 >= 0 && t4 < t1)) - return A.ioore(results, t4); - t5 = results[t4]; - A.checkTypeBound(t2, t3, "T", "cast"); - B.JSArray_methods.$indexSet(txHash, t4, t2._as(t5).txHash); - break; - } - } - t1 = _this.completer; - if (_this.batch) { - t2 = A._arrayInstanceType(txHash); - t3 = t2._eval$1("MappedListIterable<1,String?>"); - t1.complete$1(A.List_List$of(new A.MappedListIterable(txHash, t2._eval$1("String?(1)")._as(new A.SolanaPageController__buildTransaction__closure1()), t3), true, t3._eval$1("ListIterable.E"))); - } else { - t2 = B.JSArray_methods.get$first(txHash); - t1.complete$1(t2 == null ? null : t2); - } - } else { - for (t1 = results.length, t2 = type$.SolanaWeb3TransactionSignResponse, t3 = type$.SolanaWeb3TransactionResponse, t4 = _this.toDart, t5 = J.getInterceptor$asx(t4), t6 = type$.Object, _i = 0; _i < t1; ++_i) { - i = results[_i]; - switch (i.get$type()) { - case B.SolanaWeb3TransactionResponseType_1: - A.checkTypeBound(t2, t3, "T", "cast"); - t2._as(i); - t7 = t5.$index(t4, i.id); - t8 = self; - jsBuffer = t6._as(t8.Uint8Array.from(A.jsify(i.signerAddressBytes))); - t7.addSignature(new A.JSSolanaPublicKey(i.signer, jsBuffer, new t8.BN(t6._as(jsBuffer.slice()))).get$toJS(), t6._as(t8.Uint8Array.from(A.jsify(i.signature)))); - break; - } - } - t1 = _this.completer; - if (_this.batch) - t1.complete$1(A.List_List$from(t4, true, t6)); - else - t1.complete$1(t5.$index(t4, 0)); - } + A.SolanaPageController__toWalletRequest_closure.prototype = { + call$1(e) { + return type$.Object._as(type$.JSObject._as(e).serialize({verifySignatures: false})); }, - $signature: 376 + $signature: 99 }; - A.SolanaPageController__buildTransaction__closure.prototype = { + A.SolanaPageController__toWalletRequest_closure0.prototype = { call$1(e) { - return A.LinkedHashMap_LinkedHashMap$from(type$.Map_dynamic_dynamic._as(e), type$.String, type$.dynamic); + type$.JSObject._as(e); + if (e.error != null) + return e; + return {id: A._asString(e.id), result: this.$this._onTransactionResponse$3$method$result$transactions(A._asString(this.request.method), e.result, this.transactions)}; }, - $signature: 20 + $signature: 21 }; - A.SolanaPageController__buildTransaction__closure0.prototype = { + A.SolanaPageController__buildTransaction_closure.prototype = { call$1(e) { - return A.SolanaWeb3TransactionResponse_SolanaWeb3TransactionResponse$fromJson(type$.Map_String_dynamic._as(e)); + return type$.Object._as(type$.JSObject._as(e).serialize({verifySignatures: false})); }, - $signature: 377 + $signature: 99 }; - A.SolanaPageController__buildTransaction__closure1.prototype = { + A.SolanaPageController__buildTransaction_closure0.prototype = { call$1(e) { - A._asStringQ(e); - return e == null ? null : e; + return this.$this._onTransactionResponse$3$method$result$transactions(this.method, e, this.transactions); }, - $signature: 378 + $signature: 24 }; - A.SolanaPageController_onEvent_closure.prototype = { + A.SolanaPageController__onTransactionResponse_closure.prototype = { call$1(e) { - return A._asString(e); + var t1, t2, t3, t4; + if (e == null) + return null; + t1 = type$.Map_dynamic_dynamic._as(e).cast$2$0(0, type$.String, type$.dynamic); + t2 = type$.List_dynamic; + t3 = type$.int; + t4 = J.cast$1$0$ax(t2._as(t1.$index(0, "signature")), t3); + t3 = J.cast$1$0$ax(t2._as(t1.$index(0, "signerAddressBytes")), t3); + t1 = A._asString(t1.$index(0, "signer")); + return new A.JSSolanaSignTransactionResponse(A.BytesUtils_toBytes(t4, true), A.BytesUtils_toBytes(t3, true), t1); }, - $signature: 15 + $signature: 398 + }; + A.TonPageController.prototype = { + _init$0() { + var _this0, t1, _this = this; + if (_this._ton == null) { + _this0 = {}; + _this0.enable = A._functionToJS0(_this.get$_requestAccount()); + t1 = _this.get$_scripts$_addListener(); + _this0.on = A._functionToJS2(t1); + _this0.on = A._functionToJS2(t1); + t1 = _this.get$_removeListener(); + _this0.removeListener = A._functionToJS2(t1); + _this0.cancelListener = A._functionToJS2(t1); + _this0.sendWalletRequest = A._functionToJS1(_this.get$_onWalletRequest()); + _this0.cancelAllListener = A._functionToJS0(_this.get$_cancelAllListeners()); + _this.set$_ton(new A.ProxyMethodHandler(_this0, type$.ProxyMethodHandler_JSObject)); + } + t1 = self; + t1.ton = A.callConstructor(t1.Proxy, [_this._ton.object, new A.TonPageController__init_closure(_this).call$0()], type$.JSObject); + }, + _requestAccount$0() { + return this._onWalletRequest$1({method: "ton_requestAccounts"}); + }, + onEvent$1(message) { + var t1, t2, t3, _this = this, + _s9_ = "workChain", + eventData = message.data; + switch (A.JSEventType_name(A._asString(message.event))) { + case B.JSEventType_connect: + eventData = A._asInt(A.WalletMessageData_asMap(message).$index(0, _s9_)); + break; + case B.JSEventType_chainChanged: + eventData = new A.TonChainChanged(A._asInt(A.WalletMessageData_asMap(message).$index(0, _s9_))).get$toJS(); + break; + case B.JSEventType_accountsChanged: + t1 = A.WalletMessageData_asMap(message); + t2 = type$.String; + t3 = J.cast$1$0$ax(type$.List_dynamic._as(t1.$index(0, "accounts")), t2); + t1 = A._asStringQ(t1.$index(0, "defaultAddress")); + eventData = A.jsify(A.List_List$unmodifiable(t3, t2)); + t2 = _this._ton; + if (t2 != null) { + t2 = t2.object; + if (t1 == null) + t1 = null; + t2.selectedAddress = t1; + } + break; + case B.JSEventType_disconnect: + t1 = _this._ton; + if (t1 != null) + t1.object.selectedAddress = null; + break; + case B.JSEventType_disable: + t1 = A.WalletMessageData_asString(message); + t2 = self; + t2.ton = null; + type$.JSObject._as(t2.console).error(t1); + return; + case B.JSEventType_active: + _this._init$0(); + return; + default: + return; + } + _this._eventListeners$2$jsObject(A.JSEventType_name(A._asString(message.event)), eventData); + }, + _eventListeners$2$jsObject(type, jsObject) { + var t2, _i, i, + t1 = this._listeners; + if (!t1.containsKey$1(type)) + return; + t1 = t1.$index(0, type); + t1.toString; + t1 = A.List_List$of(t1, true, type$.JavaScriptFunction); + for (t2 = t1.length, _i = 0; _i < t2; ++_i) { + i = t1[_i]; + i.call(i, jsObject); + } + }, + _scripts$_addListener$2(type, listener) { + var $event, t1; + A._asString(type); + type$.JavaScriptFunction._as(listener); + $event = A.JSEventType_fromName(type); + if ($event == null || !this._listeners.containsKey$1($event)) + return; + t1 = this._listeners.$index(0, $event); + if (t1 != null) + B.JSArray_methods.add$1(t1, listener); + this._emitEvent$1(A.PageMessageEvent_constructor_build($event)); + }, + _removeListener$2(type, listener) { + var t1; + A._asString(type); + type$.JavaScriptFunction._as(listener); + t1 = this._listeners.$index(0, A.JSEventType_fromName(type)); + if (t1 != null) + B.JSArray_methods.remove$1(t1, listener); + }, + _cancelAllListeners$0() { + var t1, t2, t3, _i, t4; + for (t1 = this._listeners, t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>"), t2 = A.List_List$of(new A.LinkedHashMapKeyIterable(t1, t2), true, t2._eval$1("Iterable.E")), t3 = t2.length, _i = 0; _i < t3; ++_i) { + t4 = t1.$index(0, t2[_i]); + t4.toString; + B.JSArray_methods.clear$0(t4); + } + }, + get$_client() { + return B.JSClientType_TON_ton; + }, + set$_ton(_ton) { + this._ton = type$.nullable_ProxyMethodHandler_JSObject._as(_ton); + } + }; + A.TonPageController__init__closure.prototype = { + call$0() { + return this._dartInstance.object; + }, + $signature: 20 + }; + A.TonPageController__init_closure.prototype = { + call$0() { + var t2, t3, t4, _jsExporter, _objectMapping, + t1 = this.$this._ton; + t1.toString; + t2 = type$.JSObject; + t3 = t2._as(self); + t4 = t2._as(t3.Object); + _jsExporter = t2._as(t4.create.apply(t4, [null])); + _jsExporter.set = A._functionToJS4(t1.get$set()); + _jsExporter.get = A._functionToJS2(t1.get$get()); + t4 = t2._as(t3.Object); + _objectMapping = t2._as(t4.create.apply(t4, [null])); + _objectMapping.get = A._functionToJS0(new A.TonPageController__init__closure(t1)); + t3 = t2._as(t3.Object); + t3.defineProperty.apply(t3, [_jsExporter, "object", _objectMapping]); + return _jsExporter; + }, + $signature: 5 }; A.TronPageController.prototype = { _init$1(info) { - var t1, tronWeb, t2, t3, t4, tronWebMethodHandler, t5, t6, t7, t8, _this0, eth, adapter, proxy, _this = this; + var t2, tronWeb, t3, t4, tronWebMethodHandler, t5, t6, t7, t8, t9, _this0, eth, adapter, proxy, _this = this, + t1 = _this._tron; + if (t1 != null && _this._tronWeb != null) { + t2 = self; + t2.tron = A.callConstructor(t2.Proxy, [t1.object, new A.TronPageController__init_closure(_this).call$0()], type$.JSObject); + } if (_this._tron != null) { t1 = _this._tronWeb; if (t1 != null) @@ -58287,9 +61581,9 @@ t1 = type$.JSObject; t2 = t1._as(tronWeb.trx); t3 = type$.ProxyMethodHandler_JSObject; - t1._as(tronWeb.trx).sign = A._functionToJS1(_this.get$_signTransaction_()); - t1._as(tronWeb.trx).signMessageV2 = A._functionToJS1(_this.get$_signMessageV2_()); - t1._as(tronWeb.trx).multiSign = A._functionToJS1(_this.get$_multiSign()); + t1._as(tronWeb.trx).sign = A._functionToJS2(_this.get$_signTransaction_()); + t1._as(tronWeb.trx).signMessageV2 = A._functionToJS2(_this.get$_signMessageV2_()); + t1._as(tronWeb.trx).multiSign = A._functionToJS2(_this.get$_multiSign()); t4 = _this.get$_disabledFeature(); tronWeb.setPrivateKey = A._functionToJS1(t4); tronWeb.setAddress = A._functionToJS1(t4); @@ -58300,15 +61594,19 @@ tronWeb.setFullNodeHeader = A._functionToJS1(t4); tronWeb.setDefaultBlock = A._functionToJS1(t4); t4 = self; - tronWeb.trx = A.callConstructor(t4.Proxy, [t1._as(tronWeb.trx), new A.TronPageController__init_closure(new A.ProxyMethodHandler(t2, t3)).call$0()], t1); + tronWeb.trx = A.callConstructor(t4.Proxy, [t1._as(tronWeb.trx), new A.TronPageController__init_closure0(new A.ProxyMethodHandler(t2, t3)).call$0()], t1); tronWebMethodHandler = new A.ProxyMethodHandler(tronWeb, type$.ProxyMethodHandler_Object); - t2 = t1._as(A.callConstructor(t4.Proxy, [tronWeb, new A.TronPageController__init_closure0(tronWebMethodHandler).call$0()], t1)); + t2 = t1._as(A.callConstructor(t4.Proxy, [tronWeb, new A.TronPageController__init_closure1(tronWebMethodHandler).call$0()], t1)); t5 = A._functionToJS1(_this.get$_onRequest()); t6 = A._functionToJS2(_this.get$_scripts$_addListener()); t7 = A._functionToJS2(_this.get$_removeListener()); A._functionToJS0(_this.get$_disconnect()); t8 = A._functionToJS0(_this.get$_enable()); + t9 = A._functionToJS0(_this.get$_cancelAllListeners()); _this0 = {}; + _this0.sendWalletRequest = A._functionToJS1(_this.get$_onWalletRequest()); + _this0.cancelAllListener = t9; + _this0.cancelAllListener = t7; _this0.request = t5; _this0.on = t6; _this0.removeListener = t7; @@ -58318,90 +61616,119 @@ _this0.enable = t8; eth = t1._as(t4.Object.freeze(_this0)); adapter = new A.ProxyMethodHandler(eth, t3); - proxy = A.callConstructor(t4.Proxy, [eth, new A.TronPageController__init_closure1(adapter).call$0()], t1); + proxy = A.callConstructor(t4.Proxy, [eth, new A.TronPageController__init_closure2(adapter).call$0()], t1); _this.set$_tron(adapter); _this.set$_tronWeb(tronWebMethodHandler); t4.tron = proxy; }, _disabledFeature$1(args) { - throw A.wrapException(A.Exception_Exception("this feature disabled by wallet provider.")); + throw A.wrapException({message: "this feature disabled by wallet provider."}); + }, + _signMessageV2_$2(message, privateKey) { + type$.Object._as(message); + if (A._asStringQ(privateKey) != null) + throw A.wrapException({message: string$.Please}); + return this._sendRequest$2$method$params("tron_signMessageV2", A.dartify(message)); }, _signMessageV2_$1(message) { - return this._onRequest$1({method: "tron_signMessageV2", params: type$.Object._as(message)}); + return this._signMessageV2_$2(message, null); + }, + _signTransaction_$2(message, privateKey) { + type$.Object._as(message); + if (A._asStringQ(privateKey) != null) + throw A.wrapException({message: string$.Please}); + return this._sendRequest$2$method$params("tron_signTransaction", A.dartify(message)); }, _signTransaction_$1(message) { - return this._onRequest$1({method: "tron_signTransaction", params: type$.Object._as(message)}); + return this._signTransaction_$2(message, null); + }, + _multiSign$2(message, privateKey) { + type$.Object._as(message); + if (A._asStringQ(privateKey) != null) + throw A.wrapException({message: string$.Please}); + return this._sendRequest$2$method$params("tron_signTransaction", A.dartify(message)); }, _multiSign$1(message) { - return this._onRequest$1({method: "tron_signTransaction", params: type$.Object._as(message)}); + return this._multiSign$2(message, null); }, - onEvent$1(eventMessage) { - var t2, t3, t4, t5, t6, _this = this, _null = null, - _s11_ = "net_version", + onEvent$1(message) { + var connectionInfo, t1, t2, t3, t4, t5, _this = this, _s14_ = "defaultAddress", - t1 = eventMessage.event, - eventData = _null; - switch (t1) { - case B.TronEventTypes_List_113_connect: - t2 = A._BigIntImpl_parse(A._asString(type$.Map_String_dynamic._as(eventMessage.data).$index(0, _s11_)), _null); - t3 = "0x" + t2.toRadixString$1(0, 16); - t4 = _this._tron; - if (t4 != null) - t4.object.chainId = t3; - eventData = new A.ProviderConnectInfo(t3, t2).get$toJSEvent(); - break; - case B.TronEventTypes_List_111_chainChanged: - t2 = "0x" + A._BigIntImpl_parse(A._asString(type$.Map_String_dynamic._as(eventMessage.data).$index(0, _s11_)), _null).toRadixString$1(0, 16); - t3 = _this._tron; - if (t3 != null) - t3.object.chainId = t2; - eventData = A.jsify(t2); + eventData = message.data; + switch (A.JSEventType_name(A._asString(message.event))) { + case B.JSEventType_connect: + connectionInfo = A.TronChainChanged_TronChainChanged$fromJson(A.WalletMessageData_asMap(message)); + t1 = _this._tron; + if (t1 != null) + t1.object.chainId = connectionInfo.chainId; + eventData = connectionInfo.get$toJSEvent(); break; - case B.TronEventTypes_List_114_disconnect: - t2 = _this._tron; - if (t2 != null) - t2.object.chainId = null; - break; - case B.TronEventTypes_List_110_accountsChanged: - t2 = type$.Map_String_dynamic; - t3 = t2._as(eventMessage.data); - t4 = type$.String; - t5 = J.cast$1$0$ax(type$.List_dynamic._as(t3.$index(0, "accounts")), t4); - if (t3.$index(0, _s14_) == null) - t2 = _null; + case B.JSEventType_chainChanged: + connectionInfo = A.TronChainChanged_TronChainChanged$fromJson(A.WalletMessageData_asMap(message)); + t1 = _this._tron; + if (t1 != null) + t1.object.chainId = connectionInfo.chainId; + t1 = _this._tronWeb; + if (t1 != null) + t1.object.fullNode = new self.TronWeb.providers.HttpProvider(connectionInfo.fullNode); + t1 = _this._tronWeb; + if (t1 != null) + t1.object.solidityNode = new self.TronWeb.providers.HttpProvider(connectionInfo.fullNode); + eventData = A.jsify(connectionInfo.chainId); + break; + case B.JSEventType_disconnect: + t1 = _this._tron; + if (t1 != null) + t1.object.chainId = null; + t1 = _this._tronWeb; + if (t1 != null) + t1.object.defaultAddress = null; + break; + case B.JSEventType_accountsChanged: + t1 = A.WalletMessageData_asMap(message); + t2 = type$.String; + t3 = J.cast$1$0$ax(type$.List_dynamic._as(t1.$index(0, "accounts")), t2); + if (t1.$index(0, _s14_) == null) + t1 = null; else { - t2 = t2._as(t3.$index(0, _s14_)); - t2 = new A.JSTronAddress(A._asString(t2.$index(0, "base58")), A._asString(t2.$index(0, "hex"))); + t1 = type$.Map_String_dynamic._as(t1.$index(0, _s14_)); + t1 = new A.JSTronAddress(A._asString(t1.$index(0, "base58")), A._asString(t1.$index(0, "hex"))); } - t4 = A.List_List$unmodifiable(t5, t4); - t5 = _this._tronWeb; - if (t5 != null) { - t3 = t5.object; - t2 = t2 == null ? _null : new A.TronPageController_onEvent_closure(new A.TronAccountsChanged(t4, t2)).call$0(); - t3.defaultAddress = t2; + t2 = A.List_List$unmodifiable(t3, t2); + t3 = _this._tronWeb; + if (t3 != null) { + t3 = t3.object; + t4 = t1 == null ? null : new A.TronPageController_onEvent_closure(new A.TronAccountsChanged(t2, t1)).call$0(); + t3.defaultAddress = t4; } - eventData = A.jsify(t4); + t3 = _this._tron; + if (t3 != null) { + t3 = t3.object; + t1 = t1 == null ? null : t1.base58; + t3.selectedAddress = t1; + } + eventData = A.jsify(t2); break; - case B.TronEventTypes_List_116_disable: - t2 = A._asStringQ(eventMessage.data); - t3 = self; - t3.tron = null; - type$.JSObject._as(t3.console).error(t2); + case B.JSEventType_disable: + t1 = A.WalletMessageData_asString(message); + t2 = self; + t2.tron = null; + type$.JSObject._as(t2.console).error(t1); break; - case B.TronEventTypes_List_115_active: - t2 = type$.Map_String_dynamic._as(eventMessage.data); - t3 = A._asString(t2.$index(0, "solidityNode")); - t4 = A._asString(t2.$index(0, "fullNode")); - t5 = A._asString(t2.$index(0, "chainId")); - t6 = A._asStringQ(t2.$index(0, "hex")); - _this._init$1(new A.TronWebNodeInfo(t3, t4, t5, A._asStringQ(t2.$index(0, "base58")), t6, A._asStringQ(t2.$index(0, "eventServer")))); + case B.JSEventType_active: + t1 = A.WalletMessageData_asMap(message); + t2 = A._asString(t1.$index(0, "solidityNode")); + t3 = A._asString(t1.$index(0, "fullNode")); + t4 = A._asString(t1.$index(0, "chainId")); + t5 = A._asStringQ(t1.$index(0, "hex")); + _this._init$1(new A.TronWebNodeInfo(t2, t3, t4, A._asStringQ(t1.$index(0, "base58")), t5, A._asStringQ(t1.$index(0, "eventServer")))); break; } - _this._eventListeners$2$jsObject(t1, eventData); + _this._eventListeners$2$jsObject(A.JSEventType_name(A._asString(message.event)), eventData); }, _eventListeners$2$jsObject(type, jsObject) { var t1, t2, _i, i; - if (type === B.TronEventTypes_List_114_disconnect) + if (type === B.JSEventType_disconnect) return; if (jsObject == null || !this._listeners.containsKey$1(type)) return; @@ -58419,33 +61746,48 @@ var $event, t1; A._asString(type); type$.JavaScriptFunction._as(listener); - $event = A.TronEventTypes_fromName(type); + $event = A.JSEventType_fromName(type); if ($event == null) return; t1 = this._listeners.$index(0, $event); if (t1 != null) B.JSArray_methods.add$1(t1, listener); - if ($event !== B.TronEventTypes_List_112_message && $event !== B.TronEventTypes_List_114_disconnect) - this.getWalletMessage.call$1(new A.ClientMessageTron($event._name, null)); + this._emitEvent$1(A.PageMessageEvent_constructor_build($event)); }, _removeListener$2(type, listener) { var t1; A._asString(type); type$.JavaScriptFunction._as(listener); - t1 = this._listeners.$index(0, A.TronEventTypes_fromName(type)); + t1 = this._listeners.$index(0, A.JSEventType_fromName(type)); if (t1 != null) B.JSArray_methods.remove$1(t1, listener); }, + _cancelAllListeners$0() { + var t1, t2, t3, _i, t4; + for (t1 = this._listeners, t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>"), t2 = A.List_List$of(new A.LinkedHashMapKeyIterable(t1, t2), true, t2._eval$1("Iterable.E")), t3 = t2.length, _i = 0; _i < t3; ++_i) { + t4 = t1.$index(0, t2[_i]); + t4.toString; + B.JSArray_methods.clear$0(t4); + } + }, _enable$0() { - return this._onRequest$1({method: "eth_requestAccounts"}); + return this._sendRequest$1$method("tron_requestAccounts"); + }, + _sendRequest$2$method$params(method, params) { + var t1 = type$.nullable_Object; + return A.WalletPromise_get_toPromise(this._onNetworkRequest$1$1(A.PageMessageRequest_constructor_create(null, null, method, [params == null ? null : A.jsify(params)]), t1), t1); + }, + _sendRequest$1$method(method) { + return this._sendRequest$2$method$params(method, null); }, _onRequest$1(params) { - var t1, t2; + var t1; type$.JSObject._as(params); - t1 = A._asString(params.method); - t2 = params.params; - t2 = t2 == null ? null : A.dartify(t2); - return A.WalletPromise_get_toPromise(this.getWalletMessage.call$1(new A.ClientMessageTron(t1, t2)), type$.nullable_Object); + t1 = type$.nullable_Object; + return A.WalletPromise_get_toPromise(this._onNetworkRequest$1$1(A.PageMessageRequest_constructor_create(null, null, A._asString(params.method), type$.nullable_JSArray_nullable_Object._as(params.params)), t1), t1); + }, + get$_client() { + return B.JSClientType_Tron_tron; }, set$_tron(_tron) { this._tron = type$.nullable_ProxyMethodHandler_JSObject._as(_tron); @@ -58454,13 +61796,39 @@ this._tronWeb = type$.nullable_ProxyMethodHandler_Object._as(_tronWeb); } }; - A.TronPageController__init__closure1.prototype = { + A.TronPageController__init__closure2.prototype = { call$0() { return this._dartInstance.object; }, - $signature: 23 + $signature: 20 }; A.TronPageController__init_closure.prototype = { + call$0() { + var t2, t3, t4, _jsExporter, _objectMapping, + t1 = this.$this._tron; + t1.toString; + t2 = type$.JSObject; + t3 = t2._as(self); + t4 = t2._as(t3.Object); + _jsExporter = t2._as(t4.create.apply(t4, [null])); + _jsExporter.set = A._functionToJS4(t1.get$set()); + _jsExporter.get = A._functionToJS2(t1.get$get()); + t4 = t2._as(t3.Object); + _objectMapping = t2._as(t4.create.apply(t4, [null])); + _objectMapping.get = A._functionToJS0(new A.TronPageController__init__closure2(t1)); + t3 = t2._as(t3.Object); + t3.defineProperty.apply(t3, [_jsExporter, "object", _objectMapping]); + return _jsExporter; + }, + $signature: 5 + }; + A.TronPageController__init__closure1.prototype = { + call$0() { + return this._dartInstance.object; + }, + $signature: 20 + }; + A.TronPageController__init_closure0.prototype = { call$0() { var _objectMapping, _dartInstance = this.trxHandler, @@ -58477,15 +61845,15 @@ t2.defineProperty.apply(t2, [_jsExporter, "object", _objectMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.TronPageController__init__closure0.prototype = { call$0() { return this._dartInstance.object; }, - $signature: 23 + $signature: 20 }; - A.TronPageController__init_closure0.prototype = { + A.TronPageController__init_closure1.prototype = { call$0() { var _objectMapping, _dartInstance = this.tronWebMethodHandler, @@ -58502,15 +61870,15 @@ t2.defineProperty.apply(t2, [_jsExporter, "object", _objectMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.TronPageController__init__closure.prototype = { call$0() { return this._dartInstance.object; }, - $signature: 23 + $signature: 20 }; - A.TronPageController__init_closure1.prototype = { + A.TronPageController__init_closure2.prototype = { call$0() { var _objectMapping, _dartInstance = this.adapter, @@ -58527,19 +61895,19 @@ t2.defineProperty.apply(t2, [_jsExporter, "object", _objectMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.TronPageController_onEvent__closure.prototype = { call$0() { return this._dartInstance.base58; }, - $signature: 7 + $signature: 4 }; A.TronPageController_onEvent__closure0.prototype = { call$0() { return this._dartInstance.hex; }, - $signature: 7 + $signature: 4 }; A.TronPageController_onEvent_closure.prototype = { call$0() { @@ -58563,8 +61931,9 @@ t3.defineProperty.apply(t3, [_jsExporter, "hex", _hexMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; + A.JSSolanaSignTransactionResponse.prototype = {}; A.JSSolanaPublicKey.prototype = { toJson$0() { return A.LinkedHashMap_LinkedHashMap$_literal(["base58", this.base58, "bytes", this.bytes], type$.String, type$.dynamic); @@ -58595,7 +61964,7 @@ call$0() { return this._dartInstance._bn; }, - $signature: 12 + $signature: 5 }; A.JSSolanaPublicKey_toJS_closure.prototype = { call$0() { @@ -58617,63 +61986,41 @@ t2.defineProperty.apply(t2, [_jsExporter, "_bn", __bnMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.SolanaAccountsChanged.prototype = { toJson$0() { - var t2, t3, + var _this = this, + t1 = type$.String, + t2 = type$.dynamic; + return A.LinkedHashMap_LinkedHashMap$_literal(["accounts", _this.accounts, "defaultAddress", _this.defaultAddress, "defaultAddressBytes", _this.defaultAddressBytes, "connectInfo", A.LinkedHashMap_LinkedHashMap$_literal(["genesisBlock", _this.connectInfo.genesisBlock], t1, t2)], t1, t2); + }, + get$accountJS() { + var t1 = this.accounts, + t2 = A._arrayInstanceType(t1), + t3 = t2._eval$1("MappedListIterable<1,String>"); + return A.List_List$of(new A.MappedListIterable(t1, t2._eval$1("String(1)")._as(new A.SolanaAccountsChanged_accountJS_closure()), t3), true, t3._eval$1("ListIterable.E")); + }, + toJSPublicKey$0() { + var t2, t1 = this.defaultAddress; - t1 = t1 == null ? null : t1.toJson$0(); - t2 = type$.String; - t3 = type$.dynamic; - return A.LinkedHashMap_LinkedHashMap$_literal(["accounts", this.accounts, "defaultAddress", t1, "connectInfo", A.LinkedHashMap_LinkedHashMap$_literal(["genesisBlock", this.connectInfo.genesisBlock], t2, t3)], t2, t3); + if (t1 != null && this.defaultAddressBytes != null) { + t1.toString; + t2 = this.defaultAddressBytes; + t2.toString; + return A.JSSolanaPublicKey_JSSolanaPublicKey(t1, t2); + } + return null; }, toString$0(_) { return "SolanaAccountsChanged" + this.toJson$0().toString$0(0); } }; - A.SolanaEventTypes.prototype = { - _enumToString$0() { - return "SolanaEventTypes." + this._name; - } - }; - A.SolanaEventTypes_fromTag_closure.prototype = { + A.SolanaAccountsChanged_accountJS_closure.prototype = { call$1(e) { - return A.BytesUtils_bytesEqual(type$.SolanaEventTypes._as(e).tag, this.tag); - }, - $signature: 109 - }; - A.SolanaEventTypes_fromTag_closure0.prototype = { - call$0() { - return A.throwExpression(B.Web3RequestException_chs); - }, - $signature: 2 - }; - A.SolanaEventTypes_fromName_closure.prototype = { - call$1(e) { - return type$.SolanaEventTypes._as(e)._name === this.name; - }, - $signature: 109 - }; - A.ClientMessageSolana.prototype = { - get$type() { - return B.JSClientType_List_113_solana; + return A._asString(e); }, - toCbor$0() { - var t1 = A._setArrayType([this.method, B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.params], type$.String, type$.nullable_Object), null)], type$.JSArray_String); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_113, type$.int), new A.CborListValue(t1, true, type$.CborListValue_String), type$.CborTagValue_dynamic); - } - }; - A.ClientSolanaTransactionMessage.prototype = { - toJson$0() { - return A.LinkedHashMap_LinkedHashMap$_literal(["id", this.id, "message", this.message, "sendOption", this.sendOption], type$.String, type$.dynamic); - } - }; - A.JSWalletMessageResponseSolana.prototype = { - toCbor$0() { - var t1 = A._setArrayType([new A.CborBytesValue(this.client.tag), new A.CborBytesValue(this.event.tag), B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.data], type$.String, type$.nullable_Object), null)], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_101, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); - } + $signature: 16 }; A.SolanaProviderConnectInfo.prototype = { toJson$0() { @@ -58690,7 +62037,7 @@ call$0() { return this._dartInstance.genesisBlock; }, - $signature: 7 + $signature: 4 }; A.SolanaProviderConnectInfo_toJS_closure.prototype = { call$0() { @@ -58708,7 +62055,7 @@ t2.defineProperty.apply(t2, [_jsExporter, "genesisBlock", _genesisBlockMapping]); return _jsExporter; }, - $signature: 12 + $signature: 5 }; A.SolanaWeb3State.prototype = { chainChanged$1(other) { @@ -58717,19 +62064,27 @@ t1 = t1 == null ? null : t1.network.coinParam.genesis; t2 = this.chain; return t1 != (t2 == null ? null : t2.network.coinParam.genesis); + }, + get$accountsChange() { + var t1 = this.defaultAddress, + t2 = t1 == null, + t3 = t2 ? null : t1.address; + t1 = t2 ? null : A.List_List$from(new A.SolAddrDecoder().decodeAddr$1(t1.address), true, type$.int); + t2 = this.chain.network; + return new A.SolanaAccountsChanged(A.List_List$unmodifiable(this.permissionAccounts, type$.String), t3, A.BytesUtils_tryToBytes(t1, true), new A.SolanaProviderConnectInfo(t2.coinParam.genesis)); } }; A.SolanaWeb3State_SolanaWeb3State_closure.prototype = { call$1(e) { return type$.SolanaChain._as(e).network.coinParam.genesis === this.permission._genesis; }, - $signature: 381 + $signature: 401 }; A.SolanaWeb3State_SolanaWeb3State_closure0.prototype = { call$1(e) { - return type$.Web3SolanaChainAccount._as(e).defaultAddress; + return type$.Web3SolanaChainAccount._as(e)._defaultAddress; }, - $signature: 30 + $signature: 43 }; A.SolanaWeb3State_SolanaWeb3State_closure1.prototype = { call$0() { @@ -58738,47 +62093,38 @@ return null; return B.JSArray_methods.get$first(t1); }, - $signature: 382 + $signature: 402 }; A.SolanaWeb3State_SolanaWeb3State_closure2.prototype = { call$1(e) { return type$.Web3SolanaChainAccount._as(e).address.address; }, - $signature: 383 + $signature: 403 }; A.SolanaWeb3State_SolanaWeb3State_closure3.prototype = { call$2(a, b) { - var t1, t2; + var t1; A._asString(a); A._asString(b); t1 = this.defaultAddress; - t2 = t1 == null; - if (a === (t2 ? null : t1.address.address)) - return -1; - else if (b === (t2 ? null : t1.address.address)) - return 1; - return B.JSString_methods.compareTo$1(a, b); + return A.JsUtils_compareAddress(a, b, t1 == null ? null : t1.address.address); }, - $signature: 47 + $signature: 38 }; A.JSSolanaHandler.prototype = { + _solana$_sendEvent$2$data$event(data, $event) { + this.sendMessageToClient.call$2(A.WalletMessageEvent_constructor_build(data, $event), B.JSClientType_Solana_solana); + }, + _solana$_sendEvent$1$event($event) { + return this._solana$_sendEvent$2$data$event(null, $event); + }, initChain$2$authenticated$chainHandler(authenticated, chainHandler) { this.lock.synchronized$1$1(new A.JSSolanaHandler_initChain_closure(this, authenticated, chainHandler), type$.Null); }, - _eventMessage$2(type, state) { - switch (type) { - case B.SolanaEventTypes_List_113_connect: - this._solana$_connect$1(state); - break; - default: - break; - } - return new A.Web3ResponseMessage(null, this.get$networkType()); - }, request$1(params) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Web3MessageCore), - $async$returnValue, $async$self = this, state, t1, isEvent; + $async$returnValue, $async$self = this, t1, state, method; var $async$request$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -58788,15 +62134,8 @@ case 0: // Function start state = $async$self.state; - t1 = params.method; - isEvent = A.SolanaEventTypes_fromName(t1); - if (isEvent != null) { - $async$returnValue = $async$self._eventMessage$2(isEvent, state); - // goto return - $async$goto = 1; - break; - } - switch (A.Web3SolanaRequestMethods_fromName(t1)) { + method = A.Web3SolanaRequestMethods_fromName(A._asString(params.method)); + switch (method) { case B.Web3SolanaRequestMethods_A0N: t1 = state.permissionAccounts; if (t1.length !== 0) { @@ -58810,7 +62149,11 @@ $async$goto = 1; break $async$outer; case B.Web3SolanaRequestMethods_6YB: - $async$returnValue = $async$self._parseTransaction$2(params, state); + case B.Web3SolanaRequestMethods_upD: + case B.Web3SolanaRequestMethods_mJH: + case B.Web3SolanaRequestMethods_a3R: + method.toString; + $async$returnValue = $async$self._solana$_parseTransaction$3$method$params$state(method, params, state); // goto return $async$goto = 1; break $async$outer; @@ -58834,99 +62177,130 @@ t1 = state.defaultAddress; if (t1 == null) throw A.wrapException(B.Web3RequestException_CeF); - data = A.List_List$from(type$.List_dynamic._as(params.params), true, type$.int); + data = A.JsUtils_toList(A.PageMessageRequest_get_getFirstParam(params), new A.Web3RequestException(string$.InvalitI, -32602, "WEB3-5100", string$.Invalis), type$.int); try { A.VersionedMessage_VersionedMessage$fromBuffer(data); - t2 = A.Web3RequestExceptionConst_invalidParameters("for signing a transaction using the signTransaction method."); + t2 = A.Web3RequestExceptionConst_invalidParameters("for signing a transaction using the `solana_signTransaction` method."); throw A.wrapException(t2); } catch (exception) { if (A.unwrapException(exception) instanceof A.Web3RequestException) throw exception; } - t1 = t1.base58; + t1 = t1.address; new A.SolAddrDecoder().decodeAddr$1(t1); return new A.Web3SolanaSignMessage(new A.SolAddress(t1), A.BytesUtils_toHexString(data, true, null), A.StringUtils_tryDecode(data)); }, - _parseTransaction$2(params, state) { - return this._parseTransaction$body$JSSolanaHandler(params, state); + _solana$_parseTransaction$3$method$params$state(method, params, state) { + return this._parseTransaction$body$JSSolanaHandler(method, params, state); }, - _parseTransaction$body$JSSolanaHandler(params, state) { + _parseTransaction$body$JSSolanaHandler(method, params, state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Web3SolanaSendTransaction), - $async$returnValue, requests, messages, i, activeAccounts, message, signers, i0, account, option, t1, requests0, t2, t3, t4, t5, _i, t6, t7, _i0, t8, option0, exception; - var $async$_parseTransaction$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + $async$returnValue, transactions, messages, i, messageBytes, activeAccounts, message, signers, i0, account, option, t1, t2, t3, t4, t5, t6, t7, t8, _i, t9, exception; + var $async$_solana$_parseTransaction$3$method$params$state = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); while (true) - switch ($async$goto) { - case 0: - // Function start - try { - t1 = type$.nullable_List_dynamic._as(params.params); - if (t1 == null) - requests0 = null; - else { - t1 = J.map$1$1$ax(t1, new A.JSSolanaHandler__parseTransaction_closure(), type$.ClientSolanaTransactionMessage); - t1 = A.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")); - requests0 = t1; - } - requests = requests0 == null ? A._setArrayType([], type$.JSArray_ClientSolanaTransactionMessage) : requests0; - if (J.get$length$asx(requests) === 0) { - t1 = A.Web3RequestExceptionConst_invalidParameters("At least one transaction is required for signing."); - throw A.wrapException(t1); - } - messages = A._setArrayType([], type$.JSArray_Web3SolanaSendTransactionData); - for (t1 = requests, t2 = t1.length, t3 = type$.SolAddress, t4 = state.permission, t5 = type$.JSArray_SolAddress, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) { - i = t1[_i]; - activeAccounts = A._setArrayType([], t5); - message = A.SolanaTransaction_SolanaTransaction$deserialize(i.message); - t6 = message.message; - signers = B.JSArray_methods.sublist$2(t6.get$accountKeys(), 0, t6.get$header().numRequiredSignatures); - for (t6 = signers, t7 = t6.length, _i0 = 0; _i0 < t6.length; t6.length === t7 || (0, A.throwConcurrentModificationError)(t6), ++_i0) { - i0 = t6[_i0]; - t8 = t3._as(i0); - if ((t4 == null ? null : t4.getPermission$1(t8)) != null) - J.add$1$ax(activeAccounts, i0); + $async$outer: + switch ($async$goto) { + case 0: + // Function start + try { + transactions = A.PageMessageRequest_getJSParamsAs(params, type$.Object); + t1 = transactions; + t1 = t1 == null ? null : J.get$length$asx(t1) === 0; + if (t1 !== false) { + t1 = A.Web3RequestExceptionConst_invalidParameters("At least one transaction is required for signing."); + throw A.wrapException(t1); } - if (J.get$length$asx(activeAccounts) === 0) - throw A.wrapException(B.Web3RequestException_CeF); - account = J.firstWhere$2$orElse$ax(activeAccounts, new A.JSSolanaHandler__parseTransaction_closure0(state), new A.JSSolanaHandler__parseTransaction_closure1(activeAccounts)); - t6 = i.message; - J.add$1$ax(messages, new A.Web3SolanaSendTransactionData(account, i.id, A.BytesUtils_toBytes(t6, true))); - } - if (J.get$first$ax(requests).sendOption == null) - option0 = null; - else { - t1 = J.get$first$ax(requests).sendOption; - t2 = A._asStringQ(t1.$index(0, "preflightCommitment")); - t3 = A._asBool(t1.$index(0, "skipPreflight")); - option0 = new A.Web3SolanaSendTransactionOptions(A._asIntQ(t1.$index(0, "maxRetries")), t3, t2, A._asIntQ(t1.$index(0, "minContextSlot")), A._asBool(t1.$index(0, "signers"))); - } - option = option0; - t1 = option; - t1 = t1 == null ? null : t1.signers; - if (t1 === true) { - t1 = A.Web3RequestExceptionConst_invalidParameters("Signers do not have any effect. Please ensure all signatures are added to the transaction before signing, and remove any unused fields."); - throw A.wrapException(t1); - } - $async$returnValue = new A.Web3SolanaSendTransaction(messages, option); - // goto return - $async$goto = 1; - break; - } catch (exception) { - if (A.unwrapException(exception) instanceof A.Web3RequestException) - throw exception; - else { - t1 = A.Web3RequestExceptionConst_invalidParameters("Transaction serialization failed"); - throw A.wrapException(t1); + messages = A._setArrayType([], type$.JSArray_Web3SolanaSendTransactionData); + i = 0; + t1 = type$.SolAddress; + t2 = state.permission; + t3 = type$.JSArray_SolAddress; + t4 = type$.int; + t5 = type$.nullable_List_dynamic; + t6 = type$.JSArray_int; + while (true) { + t7 = i; + t8 = transactions; + t8.toString; + t8 = J.get$length$asx(t8); + if (typeof t7 !== "number") { + $async$returnValue = t7.$lt(); + // goto return + $async$goto = 1; + break $async$outer; + } + if (!(t7 < t8)) + break; + t7 = t5._as(A.dartify(J.$index$asx(transactions, i))); + t7 = t7 == null ? null : J.cast$1$0$ax(t7, t4); + messageBytes = t7 == null ? A._setArrayType([], t6) : t7; + activeAccounts = A._setArrayType([], t3); + message = A.SolanaTransaction_SolanaTransaction$deserialize(messageBytes); + t7 = message.message; + signers = B.JSArray_methods.sublist$2(t7.get$accountKeys(), 0, t7.get$header().numRequiredSignatures); + for (t7 = signers, t8 = t7.length, _i = 0; _i < t7.length; t7.length === t8 || (0, A.throwConcurrentModificationError)(t7), ++_i) { + i0 = t7[_i]; + t9 = t1._as(i0); + if ((t2 == null ? null : t2.getPermission$1(t9)) != null) + J.add$1$ax(activeAccounts, i0); + } + if (J.get$length$asx(activeAccounts) === 0) + throw A.wrapException(B.Web3RequestException_CeF); + account = J.firstWhere$2$orElse$ax(activeAccounts, new A.JSSolanaHandler__parseTransaction_closure(state), new A.JSSolanaHandler__parseTransaction_closure0(activeAccounts)); + J.add$1$ax(messages, new A.Web3SolanaSendTransactionData(account, i, A.BytesUtils_toBytes(messageBytes, true))); + t7 = i; + if (typeof t7 !== "number") { + $async$returnValue = t7.$add(); + // goto return + $async$goto = 1; + break $async$outer; + } + i = t7 + 1; + } + option = null; + switch (method) { + case B.Web3SolanaRequestMethods_6YB: + if (J.get$length$asx(messages) > 1) { + t1 = A.Web3SolanaExceptionConstant_signleRequestInsteadBatchError(); + throw A.wrapException(t1); + } + break; + case B.Web3SolanaRequestMethods_mJH: + if (J.get$length$asx(messages) > 1) { + t1 = A.Web3SolanaExceptionConstant_signleRequestInsteadBatchError(); + throw A.wrapException(t1); + } + option = A.Web3SolanaSendTransactionOptions_Web3SolanaSendTransactionOptions$fromJson(A.JSSolanaTranasctionSendOptions_toJson(type$.JSObject._as(params.additionalData))); + break; + case B.Web3SolanaRequestMethods_a3R: + option = A.Web3SolanaSendTransactionOptions_Web3SolanaSendTransactionOptions$fromJson(A.JSSolanaTranasctionSendOptions_toJson(type$.JSObject._as(params.additionalData))); + break; + } + t1 = option; + t1 = t1 == null ? null : t1.signers; + if (t1 === true) { + t1 = A.Web3RequestExceptionConst_invalidParameters("Signers do not have any effect. Please ensure all signatures are added to the transaction before signing, and remove any unused fields."); + throw A.wrapException(t1); + } + t1 = A.Web3SolanaSendTransaction_Web3SolanaSendTransaction(messages, method, option); + $async$returnValue = t1; + // goto return + $async$goto = 1; + break; + } catch (exception) { + if (A.unwrapException(exception) instanceof A.Web3RequestException) + throw exception; } - } - case 1: - // return - return A._asyncReturn($async$returnValue, $async$completer); - } + throw A.wrapException(A.Web3SolanaExceptionConstant_invalidTransaction()); + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } }); - return A._asyncStartSync($async$_parseTransaction$2, $async$completer); + return A._asyncStartSync($async$_solana$_parseTransaction$3$method$params$state, $async$completer); }, _solana$_disconnect$0() { var $async$goto = 0, @@ -58939,7 +62313,7 @@ switch ($async$goto) { case 0: // Function start - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseSolana(B.SolanaEventTypes_List_114_disconnect, B.JSClientType_List_113_solana, B.Web3RequestException_ww8.toJson$0())); + $async$self._solana$_sendEvent$2$data$event(B.Web3RequestException_ww8.toJson$0(), B.JSEventType_disconnect); // implicit return return A._asyncReturn(null, $async$completer); } @@ -58949,7 +62323,7 @@ _solana$_connect$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$returnValue, $async$self = this, t2, t1; + $async$returnValue, $async$self = this; var $async$_solana$_connect$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -58957,14 +62331,12 @@ switch ($async$goto) { case 0: // Function start - t1 = state.defaultAddress; - if (t1 == null) { + if (state.defaultAddress == null) { // goto return $async$goto = 1; break; } - t2 = state.chain.network; - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseSolana(B.SolanaEventTypes_List_113_connect, B.JSClientType_List_113_solana, new A.SolanaAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), t1, new A.SolanaProviderConnectInfo(t2.coinParam.genesis)).toJson$0())); + $async$self._solana$_sendEvent$2$data$event(state.get$accountsChange().toJson$0(), B.JSEventType_connect); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); @@ -58975,7 +62347,7 @@ _solana$_accountChanged$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$self = this, t1; + $async$self = this; var $async$_solana$_accountChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -58983,8 +62355,7 @@ switch ($async$goto) { case 0: // Function start - t1 = state.chain.network; - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseSolana(B.SolanaEventTypes_List_100_accountsChanged, B.JSClientType_List_113_solana, new A.SolanaAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), state.defaultAddress, new A.SolanaProviderConnectInfo(t1.coinParam.genesis)).toJson$0())); + $async$self._solana$_sendEvent$2$data$event(state.get$accountsChange().toJson$0(), B.JSEventType_accountsChanged); // implicit return return A._asyncReturn(null, $async$completer); } @@ -59008,7 +62379,7 @@ $async$goto = 1; break; } - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseSolana(B.SolanaEventTypes_List_101_chainChanged, B.JSClientType_List_113_solana, A.LinkedHashMap_LinkedHashMap$_literal(["genesisBlock", t1.network.coinParam.genesis], type$.String, type$.dynamic))); + $async$self._solana$_sendEvent$2$data$event(A.LinkedHashMap_LinkedHashMap$_literal(["genesisBlock", t1.network.coinParam.genesis], type$.String, type$.dynamic), B.JSEventType_chainChanged); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); @@ -59017,7 +62388,7 @@ return A._asyncStartSync($async$_solana$_chainChanged$1, $async$completer); }, onRequestDone$1(message) { - switch (A.Web3SolanaRequestMethods_fromName(message.method)) { + switch (A.Web3SolanaRequestMethods_fromName(A._asString(message.method))) { case B.Web3SolanaRequestMethods_A0N: this._solana$_connect$1(this.state); break; @@ -59025,13 +62396,79 @@ }, get$networkType() { return B.NetworkType_4QF; + }, + finilizeWalletResponse$3$message$params$response(message, params, response) { + var t1, transactions, transactionResponse, result, t2, t3, t4, t5, t6, t7, i, item, txHashes, _s4_ = "cast"; + type$.Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(params); + switch (A.Web3SolanaRequestMethods_fromName(A._asString(message.method))) { + case B.Web3SolanaRequestMethods_A0N: + t1 = this.state.permissionAccounts; + if (t1.length !== 0) + return {type: "response", status: "success", data: A.jsify(t1)}; + return {type: "response", status: "failed", data: A.jsify(B.Web3RequestException_qx4.toResponseMessage$0().toJson$0())}; + case B.Web3SolanaRequestMethods_6YB: + case B.Web3SolanaRequestMethods_upD: + transactions = A.PageMessageRequest_getJSParamsAs(message, type$.Object); + t1 = type$.SolanaWeb3TransactionResponse; + transactionResponse = J.map$1$1$ax(response.resultAsList$1$1$length(transactions.length, type$.Map_String_dynamic), new A.JSSolanaHandler_finilizeWalletResponse_closure(), t1); + result = A.List_List$filled(transactions.length, null, false, type$.nullable_Map_String_dynamic); + for (t2 = transactionResponse._source, t3 = J.getInterceptor$asx(t2), t4 = type$.SolanaWeb3TransactionSignResponse, t5 = type$.String, t6 = type$.dynamic, t7 = transactionResponse._f, i = 0; i < t3.get$length(t2); ++i) { + item = t7.call$1(t3.elementAt$1(t2, i)); + if (item.get$type() !== B.SolanaWeb3TransactionResponseType_1) + continue; + A.checkTypeBound(t4, t1, "T", _s4_); + t4._as(item); + B.JSArray_methods.$indexSet(result, i, A.LinkedHashMap_LinkedHashMap$_literal(["type", "sign", "id", item.id, "signature", item.signature, "signer", item.signer, "signerAddressBytes", item.signerAddressBytes], t5, t6)); + } + return {type: "response", status: "success", data: A.jsify(result)}; + case B.Web3SolanaRequestMethods_mJH: + t1 = A.SolanaWeb3TransactionResponse_SolanaWeb3TransactionResponse$fromJson(J.$index$asx(response.resultAsList$1$1$length(1, type$.Map_String_dynamic), 0)); + t2 = type$.SolanaWeb3TransactionSendResponse; + A.checkTypeBound(t2, type$.SolanaWeb3TransactionResponse, "T", _s4_); + return {type: "response", status: "success", data: t2._as(t1).txHash}; + case B.Web3SolanaRequestMethods_a3R: + transactions = A.PageMessageRequest_getJSParamsAs(message, type$.Object); + t1 = type$.SolanaWeb3TransactionResponse; + transactionResponse = J.map$1$1$ax(response.resultAsList$1$1$length(transactions.length, type$.Map_String_dynamic), new A.JSSolanaHandler_finilizeWalletResponse_closure0(), t1); + txHashes = A.List_List$filled(transactions.length, null, false, type$.nullable_String); + for (t2 = transactionResponse._source, t3 = J.getInterceptor$asx(t2), t4 = type$.SolanaWeb3TransactionSendResponse, t5 = transactionResponse._f, i = 0; i < t3.get$length(t2); ++i) { + item = t5.call$1(t3.elementAt$1(t2, i)); + if (item.get$type() !== B.SolanaWeb3TransactionResponseType_0) + continue; + A.checkTypeBound(t4, t1, "T", _s4_); + B.JSArray_methods.$indexSet(txHashes, i, t4._as(item).txHash); + } + return {type: "response", status: "success", data: A.jsify(txHashes)}; + case B.Web3SolanaRequestMethods_102_solana_signMessage_List_empty: + t1 = response.resultAsMap$0(); + t2 = A._asString(t1.$index(0, "signer")); + new A.SolAddrDecoder().decodeAddr$1(t2); + return {type: "response", status: "success", data: A.jsify(new A.Web3SolanaSignMessageResponse(new A.SolAddress(t2), A.BytesUtils_toBytes(J.cast$1$0$ax(type$.List_dynamic._as(t1.$index(0, "signature")), type$.int), true)).toJson$0())}; + } + return this.super$JSNetworkHandler$finilizeWalletResponse(message, params, response); + }, + event$1($event) { + var _this = this; + switch (A.JSEventType_name(A._asString($event.event))) { + case B.JSEventType_connect: + _this._solana$_connect$1(_this.state); + break; + case B.JSEventType_accountsChanged: + _this._solana$_accountChanged$1(_this.state); + break; + case B.JSEventType_chainChanged: + _this._solana$_chainChanged$1(_this.state); + break; + default: + break; + } } }; A.JSSolanaHandler_initChain_closure.prototype = { call$0() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Null), - $async$returnValue, $async$self = this, t3, t1, currentState, t2; + $async$returnValue, $async$self = this, t1, currentState, t2; var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -59043,11 +62480,10 @@ currentState = t1.state; t2 = t1.state = A.SolanaWeb3State_SolanaWeb3State($async$self.authenticated, $async$self.chainHandler); if (currentState.state !== t2.state) { - t3 = t1.sendMessageToClient; if (t2.chain != null) - t3.call$1(new A.JSWalletMessageResponseSolana(B.SolanaEventTypes_List_115_active, B.JSClientType_List_113_solana, null)); + t1._solana$_sendEvent$1$event(B.JSEventType_active); else - t3.call$1(new A.JSWalletMessageResponseSolana(B.SolanaEventTypes_List_116_disable, B.JSClientType_List_113_solana, string$.The_UR)); + t1._solana$_sendEvent$2$data$event(string$.The_UR, B.JSEventType_disable); t1._solana$_disconnect$0(); t2 = t1.state; if (t2.defaultAddress != null) { @@ -59067,7 +62503,7 @@ t1._solana$_chainChanged$1(t1.state); } t2 = t1.state; - if (!(A.CompareUtils_iterableIsEqual(t2.permissionAccounts, currentState.permissionAccounts, type$.String) && t2.defaultAddress == currentState.defaultAddress)) { + if (!(A.CompareUtils_iterableIsEqual(t2.permissionAccounts, currentState.permissionAccounts, type$.String) && J.$eq$(t2.defaultAddress, currentState.defaultAddress))) { if (!t1.state.chainChanged$1(currentState)) { t2 = t1.state; if (t2.defaultAddress != null) @@ -59084,84 +62520,465 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.JSSolanaHandler__parseTransaction_closure.prototype = { - call$1(e) { - var t1, t2, t3; - type$.Map_String_dynamic._as(e); - t1 = A._asInt(e.$index(0, "id")); - t2 = J.cast$1$0$ax(type$.List_dynamic._as(e.$index(0, "message")), type$.int); - t3 = type$.nullable_Map_dynamic_dynamic._as(e.$index(0, "sendOption")); - t3 = t3 == null ? null : t3.cast$2$0(0, type$.String, type$.dynamic); - return new A.ClientSolanaTransactionMessage(t1, A.BytesUtils_toBytes(t2, true), t3); - }, - $signature: 384 - }; - A.JSSolanaHandler__parseTransaction_closure0.prototype = { call$1(e) { var t1; type$.SolAddress._as(e); t1 = this.state.defaultAddress; - t1 = t1 == null ? null : t1.base58; + t1 = t1 == null ? null : t1.address; return e.address === t1; }, - $signature: 97 + $signature: 119 }; - A.JSSolanaHandler__parseTransaction_closure1.prototype = { + A.JSSolanaHandler__parseTransaction_closure0.prototype = { call$0() { return B.JSArray_methods.get$first(this.activeAccounts); }, - $signature: 385 + $signature: 404 }; - A.JSTronAddress.prototype = { + A.JSSolanaHandler_finilizeWalletResponse_closure.prototype = { + call$1(e) { + return A.SolanaWeb3TransactionResponse_SolanaWeb3TransactionResponse$fromJson(type$.Map_String_dynamic._as(e)); + }, + $signature: 131 + }; + A.JSSolanaHandler_finilizeWalletResponse_closure0.prototype = { + call$1(e) { + return A.SolanaWeb3TransactionResponse_SolanaWeb3TransactionResponse$fromJson(type$.Map_String_dynamic._as(e)); + }, + $signature: 131 + }; + A.TonChainId.prototype = { + _enumToString$0() { + return "TonChainId." + this._core$_name; + }, + get$value() { + return this.value; + } + }; + A.TonChainId_fromNetworkId_closure.prototype = { + call$1(e) { + return type$.TonChainId._as(e).workchain === this.id; + }, + $signature: 406 + }; + A.TonChainId_fromNetworkId_closure0.prototype = { + call$0() { + return A.throwExpression(B.Web3RequestException_1yC); + }, + $signature: 2 + }; + A.TonAccountsChanged.prototype = { toJson$0() { - return A.LinkedHashMap_LinkedHashMap$_literal(["base58", this.base58, "hex", this.hex], type$.String, type$.dynamic); + return A.LinkedHashMap_LinkedHashMap$_literal(["accounts", this.accounts, "defaultAddress", this.defaultAddress], type$.String, type$.dynamic); }, toString$0(_) { - return this.base58; + return "TonAccountsChanged" + this.toJson$0().toString$0(0); + } + }; + A.TonChainChanged.prototype = { + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["workChain", this.workChain], type$.String, type$.dynamic); }, - $eq(_, other) { - if (other == null) - return false; - if (!(other instanceof A.JSTronAddress)) - return false; - return this.hex === other.hex; + get$toJS() { + return new A.TonChainChanged_toJS_closure(this).call$0(); }, - get$hashCode(_) { - return B.JSString_methods.get$hashCode(this.hex) ^ B.JSString_methods.get$hashCode(this.base58); + toString$0(_) { + return "TonChainChanged" + A.LinkedHashMap_LinkedHashMap$_literal(["workChain", this.workChain], type$.String, type$.dynamic).toString$0(0); } }; - A.TronEventTypes.prototype = { - _enumToString$0() { - return "TronEventTypes." + this._name; + A.TonChainChanged_toJS__closure.prototype = { + call$0() { + return this._dartInstance.workChain; + }, + $signature: 33 + }; + A.TonChainChanged_toJS_closure.prototype = { + call$0() { + var _workChainMapping, + _dartInstance = this.$this, + t1 = type$.JSObject, + t2 = t1._as(self), + t3 = t1._as(t2.Object), + _jsExporter = t1._as(t3.create.apply(t3, [null])); + _jsExporter.toString = A._functionToJS0(_dartInstance.get$toString(_dartInstance)); + t3 = t1._as(t2.Object); + _workChainMapping = t1._as(t3.create.apply(t3, [null])); + _workChainMapping.get = A._functionToJS0(new A.TonChainChanged_toJS__closure(_dartInstance)); + t2 = t1._as(t2.Object); + t2.defineProperty.apply(t2, [_jsExporter, "workChain", _workChainMapping]); + return _jsExporter; + }, + $signature: 5 + }; + A.TonWeb3State.prototype = { + get$isConnect() { + var t1 = this.chain; + return (t1 == null ? null : t1._chain$_client) != null; } }; - A.TronEventTypes_fromTag_closure.prototype = { + A.TonWeb3State_TonWeb3State_closure.prototype = { + call$1(e) { + return type$.TheOpenNetworkChain._as(e).network.coinParam.workchain === this.permission._workChain; + }, + $signature: 407 + }; + A.TonWeb3State_TonWeb3State_closure0.prototype = { call$1(e) { - return A.BytesUtils_bytesEqual(type$.TronEventTypes._as(e).tag, this.tag); + return type$.Web3TonChainAccount._as(e)._defaultAddress; }, - $signature: 106 + $signature: 44 }; - A.TronEventTypes_fromTag_closure0.prototype = { + A.TonWeb3State_TonWeb3State_closure1.prototype = { call$0() { - return A.throwExpression(B.Web3RequestException_chs); + return B.JSArray_methods.get$first(this.permissionAccounts); }, - $signature: 2 + $signature: 408 }; - A.TronEventTypes_fromName_closure.prototype = { + A.TonWeb3State_TonWeb3State_closure2.prototype = { call$1(e) { - return type$.TronEventTypes._as(e)._name === this.name; + var t1; + type$.ITonAddress._as(e); + t1 = this.defaultNetworkAddress; + return e.networkAddress.$eq(0, t1.address) && e.keyIndex.$eq(0, t1.keyIndex); }, - $signature: 106 + $signature: 409 }; - A.ClientMessageTron.prototype = { - get$type() { - return B.JSClientType_List_112_tron; + A.TonWeb3State_TonWeb3State_closure3.prototype = { + call$1(e) { + return type$.Web3TonChainAccount._as(e).address.toFriendlyAddress$0(); }, - toCbor$0() { - var t1 = A._setArrayType([this.method, B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.params], type$.String, type$.nullable_Object), null)], type$.JSArray_String); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_112, type$.int), new A.CborListValue(t1, true, type$.CborListValue_String), type$.CborTagValue_dynamic); + $signature: 410 + }; + A.TonWeb3State_TonWeb3State_closure4.prototype = { + call$2(a, b) { + var t1; + A._asString(a); + A._asString(b); + t1 = this._box_0.defaultAddress; + return A.JsUtils_compareAddress(a, b, t1 == null ? null : A._asString(t1.address)); + }, + $signature: 38 + }; + A.JSTonHandler.prototype = { + initChain$2$authenticated$chainHandler(authenticated, chainHandler) { + this.lock.synchronized$1$1(new A.JSTonHandler_initChain_closure(this, authenticated, chainHandler), type$.Null); + }, + _sendEvent$2$data$event(data, $event) { + this.sendMessageToClient.call$2(A.WalletMessageEvent_constructor_build(data, $event), B.JSClientType_TON_ton); + }, + _sendEvent$1$event($event) { + return this._sendEvent$2$data$event(null, $event); + }, + request$1(params) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.Web3MessageCore), + $async$returnValue, $async$self = this, t1, data, t2, t3, state, method; + var $async$request$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + $async$outer: + switch ($async$goto) { + case 0: + // Function start + state = $async$self.state; + method = A.Web3TonRequestMethods_fromName(A._asString(params.method)); + A.print("come here " + A.S(method)); + switch (method) { + case B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty: + t1 = state.permissionAccounts; + if (t1.length !== 0) { + $async$returnValue = new A.Web3ResponseMessage(t1, $async$self.get$networkType()); + // goto return + $async$goto = 1; + break $async$outer; + } + $async$returnValue = new A.Web3TonRequestAccounts(); + // goto return + $async$goto = 1; + break $async$outer; + case B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty: + $async$returnValue = $async$self._parseTransaction$2(params, state); + // goto return + $async$goto = 1; + break $async$outer; + case B.Web3TonRequestMethods_102_ton_signMessage_List_empty: + t1 = state.defaultAddress; + if (t1 == null) + A.throwExpression(B.Web3RequestException_CeF); + data = A.JsUtils_toList(A.PageMessageRequest_get_getFirstParam(params), new A.Web3RequestException(string$.InvalitI, -32602, "WEB3-5100", string$.Invalis), type$.int); + t1 = A.TonAddress_TonAddress(A._asString(t1.address), null); + t2 = A.BytesUtils_toHexString(data, true, null); + t3 = A.StringUtils_tryDecode(data); + A.print("message create?D1"); + $async$returnValue = new A.Web3TonSignMessage(t1, t2, t3); + // goto return + $async$goto = 1; + break $async$outer; + default: + throw A.wrapException(B.Web3RequestException_imj); + } + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$request$1, $async$completer); + }, + _parseTransaction$2(params, state) { + return this._parseTransaction$body$JSTonHandler(params, state); + }, + _parseTransaction$body$JSTonHandler(params, state) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.Web3TonSendTransaction), + $async$returnValue, json, from, account, t1, t2, exception; + var $async$_parseTransaction$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + try { + json = A.JsUtils_toMap(A.PageMessageRequest_get_getFirstParam(params), null); + from = A._asStringQ(J.$index$asx(json, "from")); + account = null; + t1 = state.defaultAddress; + if (t1 == null) + throw A.wrapException(B.Web3RequestException_CeF); + if (from == null) + account = A.TonAddress_TonAddress(A._asString(t1.address), null); + else { + account = A.TonAddress_TonAddress(from, null); + t1 = type$.TonAddress._as(account); + t2 = state.permission; + if ((t2 == null ? null : t2.getPermission$1(t1)) == null) + throw A.wrapException(B.Web3RequestException_CeF); + } + t1 = A.Web3TonSendTransaction_Web3TonSendTransaction$fromJson(account, json); + $async$returnValue = t1; + // goto return + $async$goto = 1; + break; + } catch (exception) { + if (A.unwrapException(exception) instanceof A.Web3RequestException) + throw exception; + else { + t1 = A.Web3RequestExceptionConst_invalidParameters("Transaction serialization failed"); + throw A.wrapException(t1); + } + } + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$_parseTransaction$2, $async$completer); + }, + _ton$_disconnect$0() { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + $async$self = this; + var $async$_ton$_disconnect$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + $async$self._sendEvent$2$data$event(B.Web3RequestException_ww8.toJson$0(), B.JSEventType_disconnect); + // implicit return + return A._asyncReturn(null, $async$completer); + } + }); + return A._asyncStartSync($async$_ton$_disconnect$0, $async$completer); + }, + _ton$_connect$1(state) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + $async$returnValue, $async$self = this, t1; + var $async$_ton$_connect$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + t1 = state.chain; + if (t1 == null) { + // goto return + $async$goto = 1; + break; + } + $async$self._sendEvent$2$data$event(A.LinkedHashMap_LinkedHashMap$_literal(["workChain", t1.network.coinParam.workchain], type$.String, type$.dynamic), B.JSEventType_connect); + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$_ton$_connect$1, $async$completer); + }, + _accountChanged$1(state) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + $async$self = this, t1; + var $async$_accountChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + t1 = state.defaultAddress; + t1 = t1 == null ? null : A._asString(t1.address); + $async$self._sendEvent$2$data$event(new A.TonAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), t1).toJson$0(), B.JSEventType_accountsChanged); + // implicit return + return A._asyncReturn(null, $async$completer); + } + }); + return A._asyncStartSync($async$_accountChanged$1, $async$completer); + }, + _chainChanged$1(state) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + $async$returnValue, $async$self = this, t1; + var $async$_chainChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + t1 = state.chain; + if (t1 == null) { + // goto return + $async$goto = 1; + break; + } + $async$self._sendEvent$2$data$event(A.LinkedHashMap_LinkedHashMap$_literal(["workChain", t1.network.coinParam.workchain], type$.String, type$.dynamic), B.JSEventType_chainChanged); + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$_chainChanged$1, $async$completer); + }, + onRequestDone$1(message) { + switch (A.Web3TonRequestMethods_fromName(A._asString(message.method))) { + case B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty: + this._accountChanged$1(this.state); + break; + } + }, + get$networkType() { + return B.NetworkType_66M; + }, + finilizeWalletResponse$3$message$params$response(message, params, response) { + var t1; + type$.Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(params); + switch (A.Web3TonRequestMethods_fromName(A._asString(message.method))) { + case B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty: + t1 = this.state.permissionAccounts; + if (t1.length !== 0) + return {type: "response", status: "success", data: A.jsify(t1)}; + return {type: "response", status: "failed", data: A.jsify(B.Web3RequestException_qx4.toResponseMessage$0().toJson$0())}; + } + return this.super$JSNetworkHandler$finilizeWalletResponse(message, params, response); + }, + event$1($event) { + var _this = this; + switch (A.JSEventType_name(A._asString($event.event))) { + case B.JSEventType_accountsChanged: + _this._accountChanged$1(_this.state); + break; + case B.JSEventType_chainChanged: + _this._chainChanged$1(_this.state); + break; + case B.JSEventType_connect: + _this._ton$_connect$1(_this.state); + break; + default: + break; + } + } + }; + A.JSTonHandler_initChain_closure.prototype = { + call$0() { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.Null), + $async$returnValue, $async$self = this, t3, t1, currentState, t2; + var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + t1 = $async$self.$this; + currentState = t1.state; + t2 = t1.state = A.TonWeb3State_TonWeb3State($async$self.authenticated, $async$self.chainHandler); + if (currentState.state !== t2.state) { + if (t2.chain != null) + t1._sendEvent$1$event(B.JSEventType_active); + else + t1._sendEvent$2$data$event(string$.The_UR, B.JSEventType_disable); + t1._ton$_disconnect$0(); + if (t1.state.get$isConnect()) { + t1._ton$_connect$1(t1.state); + t1._chainChanged$1(t1.state); + } + t1._accountChanged$1(t1.state); + // goto return + $async$goto = 1; + break; + } + t3 = currentState.chain; + t3 = t3 == null ? null : t3.network; + t2 = t2.chain; + if (!J.$eq$(t3, t2 == null ? null : t2.network)) { + t1._ton$_disconnect$0(); + if (t1.state.get$isConnect()) + t1._ton$_connect$1(t1.state); + t1._chainChanged$1(t1.state); + } + t2 = t1.state; + if (A.CompareUtils_iterableIsEqual(t2.permissionAccounts, currentState.permissionAccounts, type$.String)) { + t2 = t2.defaultAddress; + t2 = t2 == null ? null : A._asString(t2.address); + t3 = currentState.defaultAddress; + t2 = t2 == (t3 == null ? null : A._asString(t3.address)); + } else + t2 = false; + if (!t2) + t1._accountChanged$1(t1.state); + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$call$0, $async$completer); + }, + $signature: 14 + }; + A.JSTronAddress.prototype = { + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["base58", this.base58, "hex", this.hex], type$.String, type$.dynamic); + }, + toString$0(_) { + return this.base58; + }, + $eq(_, other) { + if (other == null) + return false; + if (!(other instanceof A.JSTronAddress)) + return false; + return this.hex === other.hex; + }, + get$hashCode(_) { + return B.JSString_methods.get$hashCode(this.hex) ^ B.JSString_methods.get$hashCode(this.base58); } }; A.TronWebNodeInfo.prototype = { @@ -59197,13 +63014,13 @@ call$0() { return this._dartInstance.base58; }, - $signature: 7 + $signature: 4 }; A.TronWebNodeInfo_toTronWeb__closure0.prototype = { call$0() { return this._dartInstance.hex; }, - $signature: 7 + $signature: 4 }; A.TronWebNodeInfo_toTronWeb_closure.prototype = { call$0() { @@ -59226,13 +63043,7 @@ t2.defineProperty.apply(t2, [_jsExporter, "hex", _hexMapping]); return _jsExporter; }, - $signature: 12 - }; - A.JSWalletMessageResponseTron.prototype = { - toCbor$0() { - var t1 = A._setArrayType([new A.CborBytesValue(this.client.tag), new A.CborBytesValue(this.event.tag), B.C_JsonCodec.encode$2$toEncodable(A.LinkedHashMap_LinkedHashMap$_literal(["result", this.data], type$.String, type$.nullable_Object), null)], type$.JSArray_Object); - return new A.CborTagValue(A.List_List$unmodifiable(B.List_101, type$.int), new A.CborListValue(t1, true, type$.CborListValue_Object), type$.CborTagValue_dynamic); - } + $signature: 5 }; A.TronAccountsChanged.prototype = { toJson$0() { @@ -59244,10 +63055,53 @@ return "TronAccountsChanged" + this.toJson$0().toString$0(0); } }; + A.TronChainChanged.prototype = { + toJson$0() { + return A.LinkedHashMap_LinkedHashMap$_literal(["net_version", this.netVersion.toString$0(0), "fullNode", this.fullNode, "solidityNode", this.solidityNode], type$.String, type$.dynamic); + }, + get$toJSEvent() { + return new A.TronChainChanged_toJSEvent_closure(this).call$0(); + }, + toString$0(_) { + var t1 = type$.String; + return "ProviderConnectInfo" + A.LinkedHashMap_LinkedHashMap$_literal(["chainId", this.chainId], t1, t1).toString$0(0); + } + }; + A.TronChainChanged_toJSEvent__closure.prototype = { + call$0() { + return this._dartInstance.chainId; + }, + $signature: 4 + }; + A.TronChainChanged_toJSEvent_closure.prototype = { + call$0() { + var _chainIdMapping, + _dartInstance = this.$this, + t1 = type$.JSObject, + t2 = t1._as(self), + t3 = t1._as(t2.Object), + _jsExporter = t1._as(t3.create.apply(t3, [null])); + _jsExporter.toString = A._functionToJS0(_dartInstance.get$toString(_dartInstance)); + t3 = t1._as(t2.Object); + _chainIdMapping = t1._as(t3.create.apply(t3, [null])); + _chainIdMapping.get = A._functionToJS0(new A.TronChainChanged_toJSEvent__closure(_dartInstance)); + t2 = t1._as(t2.Object); + t2.defineProperty.apply(t2, [_jsExporter, "chainId", _chainIdMapping]); + return _jsExporter; + }, + $signature: 5 + }; A.TronWeb3State.prototype = { get$isConnect() { var t1 = this.chain; - return (t1 == null ? null : t1._client) != null; + return (t1 == null ? null : t1._chain$_client) != null; + }, + get$chainChangedEvent() { + var t1 = A._BigIntImpl__BigIntImpl$from(A.TronChainType_fromId(this.chain.network.value).genesisBlockNumber), + t2 = this.client, + t3 = type$.BaseServiceProtocol_TronAPIProvider._as(t2.provider.rpc); + t2 = type$.BaseServiceProtocol_EthereumAPIProvider._as(t2.solidityProvider.provider.rpc).get$provider(); + return new A.TronChainChanged("0x" + t1.toRadixString$1(0, 16), t1, t2.uri, t3.provider.httpNodeUri); }, hasPermission$1(address) { var t1 = this.permission; @@ -59258,13 +63112,13 @@ call$1(e) { return A.TronChainType_fromId(type$.TronChain._as(e).network.value) === this.permission._currentChain; }, - $signature: 387 + $signature: 411 }; A.TronWeb3State_TronWeb3State_closure0.prototype = { call$1(e) { - return type$.Web3TronChainAccount._as(e).defaultAddress; + return type$.Web3TronChainAccount._as(e)._defaultAddress; }, - $signature: 31 + $signature: 45 }; A.TronWeb3State_TronWeb3State_closure1.prototype = { call$0() { @@ -59273,50 +63127,32 @@ return null; return B.JSArray_methods.get$first(t1); }, - $signature: 388 + $signature: 412 }; A.TronWeb3State_TronWeb3State_closure2.prototype = { call$1(e) { return type$.Web3TronChainAccount._as(e).address.toAddress$0(); }, - $signature: 389 + $signature: 413 }; A.TronWeb3State_TronWeb3State_closure3.prototype = { call$2(a, b) { - var t1, t2; + var t1; A._asString(a); A._asString(b); t1 = this.defaultAddress; - t2 = t1 == null; - if (a === (t2 ? null : t1.address.toAddress$0())) - return -1; - else if (b === (t2 ? null : t1.address.toAddress$0())) - return 1; - return B.JSString_methods.compareTo$1(a, b); + return A.JsUtils_compareAddress(a, b, t1 == null ? null : t1.address.toAddress$0()); }, - $signature: 47 + $signature: 38 }; A.JSTronHandler.prototype = { initChain$2$authenticated$chainHandler(authenticated, chainHandler) { this.lock.synchronized$1$1(new A.JSTronHandler_initChain_closure(this, authenticated, chainHandler), type$.Null); }, - _tron$_eventMessage$2(type, state) { - switch (type) { - case B.TronEventTypes_List_110_accountsChanged: - this._accountChanged$1(state); - break; - case B.TronEventTypes_List_111_chainChanged: - this._tron$_chainChanged$1(state); - break; - default: - break; - } - return new A.Web3ResponseMessage(null, this.get$networkType()); - }, request$1(params) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Web3MessageCore), - $async$returnValue, $async$self = this, state, t1, isEvent; + $async$returnValue, $async$self = this, t1, state; var $async$request$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -59326,15 +63162,7 @@ case 0: // Function start state = $async$self.state; - t1 = params.method; - isEvent = A.TronEventTypes_fromName(t1); - if (isEvent != null) { - $async$returnValue = $async$self._tron$_eventMessage$2(isEvent, state); - // goto return - $async$goto = 1; - break; - } - switch (A.Web3TronRequestMethods_fromName(t1)) { + switch (A.Web3TronRequestMethods_fromName(A._asString(params.method))) { case B.Web3TronRequestMethods_nIp: t1 = state.permissionAccounts; if (t1.length !== 0) { @@ -59368,18 +63196,17 @@ return A._asyncStartSync($async$request$1, $async$completer); }, _signMessageV2$2(params, state) { - var address, bytes, t1, exception, _null = null; + var address, data, bytes, t1, exception, _null = null; try { address = A.TronAddress_TronAddress(state.defaultAddress.base58); - t1 = params.params; - if (Array.isArray(t1)) { - bytes = A.List_List$from(t1, true, type$.int); - t1 = A.BytesUtils_toHexString(bytes, true, _null); - return new A.Web3TronSignMessageV2(address, t1, _null); - } else if (typeof t1 == "string") { - t1 = A.BytesUtils_toHexString(A.StringUtils_encode(t1, B.StringEncoding_1), true, _null); + data = A.PageMessageRequest_get_getFirstParam(params); + if (typeof data == "string") { + t1 = A.BytesUtils_toHexString(A.StringUtils_encode(data, B.StringEncoding_1), true, _null); return new A.Web3TronSignMessageV2(address, t1, _null); } + bytes = A.List_List$from(type$.List_dynamic._as(data), true, type$.int); + t1 = A.BytesUtils_toHexString(bytes, true, _null); + return new A.Web3TronSignMessageV2(address, t1, _null); } catch (exception) { } throw A.wrapException(A.Web3RequestExceptionConst_invalidParameters("Invalid transaction. signed message only accepts bytes or string.")); @@ -59387,7 +63214,7 @@ _tron$_parseTransaction$2(params, state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Web3TronSendTransaction), - $async$returnValue, transaction, txId, t1, value, result, owner, t2, permissionId, accountInfo, permission, activeAddressees, t3, _i, t4, transactionData; + $async$returnValue, t1, value, result, owner, t2, permissionId, accountInfo, permission, activeAddressees, t3, _i, t4, transactionData, transaction, txId; var $async$_tron$_parseTransaction$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -59395,9 +63222,7 @@ switch ($async$goto) { case 0: // Function start - transactionData = params.paramsAsMap$2$0(type$.String, type$.dynamic); - if (transactionData == null) - throw A.wrapException(A.Web3RequestExceptionConst_invalidParameters("Invalid transaction JSON. Parsing unsuccessful.")); + transactionData = A.JsUtils_toMap(A.PageMessageRequest_get_getFirstParam(params), new A.Web3RequestException("Invalid method parameters: Invalid transaction JSON. Parsing unsuccessful.", -32602, "WEB3-5100", "Invalid transaction JSON. Parsing unsuccessful.")); transaction = A.Transaction_Transaction$fromJson(transactionData); txId = transactionData.$index(0, "txID"); if (txId != null) { @@ -59431,8 +63256,6 @@ break; case 3: // then - if (permissionId == null) - throw A.wrapException(B.Web3RequestException_CeF); $async$goto = 5; return A._asyncAwait(state.client.getAccount$1(owner), $async$_tron$_parseTransaction$2); case 5: @@ -59474,6 +63297,9 @@ }); return A._asyncStartSync($async$_tron$_parseTransaction$2, $async$completer); }, + _tron$_sendEvent$2$data$event(data, $event) { + this.sendMessageToClient.call$2(A.WalletMessageEvent_constructor_build(data, $event), B.JSClientType_Tron_tron); + }, _tron$_disconnect$0() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), @@ -59485,7 +63311,7 @@ switch ($async$goto) { case 0: // Function start - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseTron(B.TronEventTypes_List_114_disconnect, B.JSClientType_List_112_tron, B.Web3RequestException_ww8.toJson$0())); + $async$self._tron$_sendEvent$2$data$event(B.Web3RequestException_ww8.toJson$0(), B.JSEventType_disconnect); // implicit return return A._asyncReturn(null, $async$completer); } @@ -59495,7 +63321,7 @@ _tron$_connect$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$returnValue, $async$self = this, t1; + $async$returnValue, $async$self = this; var $async$_tron$_connect$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -59503,15 +63329,12 @@ switch ($async$goto) { case 0: // Function start - t1 = state.chain; - if (t1 == null) { + if (state.chain == null) { // goto return $async$goto = 1; break; } - t1 = A._BigIntImpl__BigIntImpl$from(A.TronChainType_fromId(t1.network.value).genesisBlockNumber); - t1.toRadixString$1(0, 16); - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseTron(B.TronEventTypes_List_113_connect, B.JSClientType_List_112_tron, A.LinkedHashMap_LinkedHashMap$_literal(["net_version", t1.toString$0(0)], type$.String, type$.dynamic))); + $async$self._tron$_sendEvent$2$data$event(state.get$chainChangedEvent().toJson$0(), B.JSEventType_connect); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); @@ -59519,28 +63342,28 @@ }); return A._asyncStartSync($async$_tron$_connect$1, $async$completer); }, - _accountChanged$1(state) { + _tron$_accountChanged$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), $async$self = this; - var $async$_accountChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + var $async$_tron$_accountChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); while (true) switch ($async$goto) { case 0: // Function start - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseTron(B.TronEventTypes_List_110_accountsChanged, B.JSClientType_List_112_tron, new A.TronAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), state.defaultAddress).toJson$0())); + $async$self._tron$_sendEvent$2$data$event(new A.TronAccountsChanged(A.List_List$unmodifiable(state.permissionAccounts, type$.String), state.defaultAddress).toJson$0(), B.JSEventType_accountsChanged); // implicit return return A._asyncReturn(null, $async$completer); } }); - return A._asyncStartSync($async$_accountChanged$1, $async$completer); + return A._asyncStartSync($async$_tron$_accountChanged$1, $async$completer); }, _tron$_chainChanged$1(state) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$returnValue, $async$self = this, t1; + $async$returnValue, $async$self = this; var $async$_tron$_chainChanged$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -59548,15 +63371,12 @@ switch ($async$goto) { case 0: // Function start - t1 = state.chain; - if (t1 == null) { + if (state.chain == null) { // goto return $async$goto = 1; break; } - t1 = A._BigIntImpl__BigIntImpl$from(A.TronChainType_fromId(t1.network.value).genesisBlockNumber); - t1.toRadixString$1(0, 16); - $async$self.sendMessageToClient.call$1(new A.JSWalletMessageResponseTron(B.TronEventTypes_List_111_chainChanged, B.JSClientType_List_112_tron, A.LinkedHashMap_LinkedHashMap$_literal(["net_version", t1.toString$0(0)], type$.String, type$.dynamic))); + $async$self._tron$_sendEvent$2$data$event(state.get$chainChangedEvent().toJson$0(), B.JSEventType_chainChanged); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); @@ -59564,32 +63384,50 @@ }); return A._asyncStartSync($async$_tron$_chainChanged$1, $async$completer); }, - _toggleTron$1(state) { - var _null = null, - t1 = state.client, - nodeInfo = t1 == null ? _null : new A.TronWebNodeInfo(type$.BaseServiceProtocol_EthereumAPIProvider._as(t1.solidityProvider.provider.rpc).get$provider().uri, type$.BaseServiceProtocol_TronAPIProvider._as(t1.provider.rpc).provider.httpNodeUri, "0x" + B.JSInt_methods.toRadixString$1(A.TronChainType_fromId(t1.network.value).genesisBlockNumber, 16), _null, _null, _null); - t1 = this.sendMessageToClient; - if (nodeInfo != null) - t1.call$1(new A.JSWalletMessageResponseTron(B.TronEventTypes_List_115_active, B.JSClientType_List_112_tron, nodeInfo.toJson$0())); - else - t1.call$1(new A.JSWalletMessageResponseTron(B.TronEventTypes_List_116_disable, B.JSClientType_List_112_tron, string$.The_UR)); - }, onRequestDone$1(message) { - switch (A.Web3TronRequestMethods_fromName(message.method)) { + switch (A.Web3TronRequestMethods_fromName(A._asString(message.method))) { case B.Web3TronRequestMethods_nIp: - this._accountChanged$1(this.state); + this._tron$_accountChanged$1(this.state); break; } }, + finilizeWalletResponse$3$message$params$response(message, params, response) { + var t1; + type$.Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(params); + switch (A.Web3TronRequestMethods_fromName(A._asString(message.method))) { + case B.Web3TronRequestMethods_nIp: + t1 = this.state.permissionAccounts; + if (t1.length !== 0) + return {type: "response", status: "success", data: A.jsify(t1)}; + return {type: "response", status: "failed", data: A.jsify(B.Web3RequestException_qx4.toResponseMessage$0().toJson$0())}; + } + return this.super$JSNetworkHandler$finilizeWalletResponse(message, params, response); + }, get$networkType() { return B.NetworkType_SkF; + }, + event$1($event) { + var _this = this; + switch (A.JSEventType_name(A._asString($event.event))) { + case B.JSEventType_accountsChanged: + _this._tron$_accountChanged$1(_this.state); + break; + case B.JSEventType_chainChanged: + _this._tron$_chainChanged$1(_this.state); + break; + case B.JSEventType_connect: + _this._tron$_connect$1(_this.state); + break; + default: + break; + } } }; A.JSTronHandler_initChain_closure.prototype = { call$0() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Null), - $async$returnValue, $async$self = this, t3, t1, currentState, t2; + $async$returnValue, $async$self = this, nodeInfo, t3, t1, currentState, t2; var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -59601,13 +63439,18 @@ currentState = t1.state; t2 = t1.state = A.TronWeb3State_TronWeb3State($async$self.authenticated, $async$self.chainHandler); if (currentState.state !== t2.state) { - t1._toggleTron$1(t2); + t2 = t2.client; + nodeInfo = t2 == null ? null : new A.TronWebNodeInfo(type$.BaseServiceProtocol_EthereumAPIProvider._as(t2.solidityProvider.provider.rpc).get$provider().uri, type$.BaseServiceProtocol_TronAPIProvider._as(t2.provider.rpc).provider.httpNodeUri, "0x" + B.JSInt_methods.toRadixString$1(A.TronChainType_fromId(t2.network.value).genesisBlockNumber, 16), null, null, null); + if (nodeInfo != null) + t1._tron$_sendEvent$2$data$event(nodeInfo.toJson$0(), B.JSEventType_active); + else + t1._tron$_sendEvent$2$data$event(string$.The_UR, B.JSEventType_active); t1._tron$_disconnect$0(); if (t1.state.get$isConnect()) { t1._tron$_connect$1(t1.state); t1._tron$_chainChanged$1(t1.state); } - t1._accountChanged$1(t1.state); + t1._tron$_accountChanged$1(t1.state); // goto return $async$goto = 1; break; @@ -59617,9 +63460,9 @@ t2 = t2.chain; if (t3 != (t2 == null ? null : A.TronChainType_fromId(t2.network.value))) { t1._tron$_disconnect$0(); - t1._toggleTron$1(t1.state); if (t1.state.get$isConnect()) t1._tron$_connect$1(t1.state); + t1._tron$_chainChanged$1(t1.state); } t2 = t1.state; if (A.CompareUtils_iterableIsEqual(t2.permissionAccounts, currentState.permissionAccounts, type$.String)) { @@ -59630,7 +63473,7 @@ } else t2 = false; if (!t2) - t1._accountChanged$1(t1.state); + t1._tron$_accountChanged$1(t1.state); case 1: // return return A._asyncReturn($async$returnValue, $async$completer); @@ -59638,62 +63481,63 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 16 + $signature: 14 }; A.JSTronHandler__parseTransaction_closure.prototype = { call$1(e) { - return type$.AccountPermission._as(e).id === this.permissionId; + type$.AccountPermission._as(e); + return e.type !== B.PermissionType_Witness_1 && e.id == this.permissionId; }, - $signature: 390 + $signature: 414 }; A.JSWalletHandler.prototype = { - get$ethereumHandler() { - var t1, _this = this, _null = null, - value = _this.__JSWalletHandler_ethereumHandler_FI; - if (value === $) { - t1 = A.EthereumWeb3State$_(_null, B.List_empty3, _null, _null, _null, B.List_empty1, B.JSNetworkState_1); - _this.__JSWalletHandler_ethereumHandler_FI !== $ && A.throwLateFieldADI("ethereumHandler"); - value = _this.__JSWalletHandler_ethereumHandler_FI = new A.JSEthereumHandler(t1, new A.SynchronizedLock(), _this.get$_sendMessageToClient()); - } - return value; - }, - get$tronHandler() { - var t1, _this = this, _null = null, - value = _this.__JSWalletHandler_tronHandler_FI; - if (value === $) { - t1 = A.TronWeb3State$_(_null, B.List_empty2, _null, _null, _null, B.List_empty1, B.JSNetworkState_1); - _this.__JSWalletHandler_tronHandler_FI !== $ && A.throwLateFieldADI("tronHandler"); - value = _this.__JSWalletHandler_tronHandler_FI = new A.JSTronHandler(t1, new A.SynchronizedLock(), _this.get$_sendMessageToClient()); - } - return value; - }, - get$solanaHandler() { - var t1, _this = this, _null = null, - value = _this.__JSWalletHandler_solanaHandler_FI; + get$_wallet$_networks() { + var t1, result, _this = this, _null = null, + value = _this.__JSWalletHandler__networks_FI; if (value === $) { - t1 = A.SolanaWeb3State$_(_null, B.List_empty0, _null, _null, _null, B.List_empty1, B.JSNetworkState_1); - _this.__JSWalletHandler_solanaHandler_FI !== $ && A.throwLateFieldADI("solanaHandler"); - value = _this.__JSWalletHandler_solanaHandler_FI = new A.JSSolanaHandler(t1, new A.SynchronizedLock(), _this.get$_sendMessageToClient()); + t1 = _this.get$_sendEventToClient(); + result = A.LinkedHashMap_LinkedHashMap$_literal([B.JSClientType_Ethereum_ethereum, new A.JSEthereumHandler(A.EthereumWeb3State$_(_null, B.List_empty0, _null, _null, _null, B.List_empty1, B.JSNetworkState_1), new A.SynchronizedLock(), t1), B.JSClientType_Tron_tron, new A.JSTronHandler(A.TronWeb3State$_(_null, B.List_empty2, _null, _null, _null, B.List_empty1, B.JSNetworkState_1), new A.SynchronizedLock(), t1), B.JSClientType_Solana_solana, new A.JSSolanaHandler(A.SolanaWeb3State$_(_null, B.List_empty3, _null, _null, _null, B.List_empty1, B.JSNetworkState_1), new A.SynchronizedLock(), t1), B.JSClientType_TON_ton, new A.JSTonHandler(A.TonWeb3State$_(_null, B.List_empty4, _null, _null, _null, B.List_empty1, B.JSNetworkState_1), new A.SynchronizedLock(), t1)], type$.JSClientType, type$.JSNetworkHandler_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_ChainWeb3State_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic); + _this.__JSWalletHandler__networks_FI !== $ && A.throwLateFieldADI("_networks"); + _this.set$__JSWalletHandler__networks_FI(result); + value = result; } return value; }, _onClientEvent$1(response) { - var values = A.CborSerializable_cborTagValue(A.EventInit_detailBytes(type$.JSObject._as(response)), null, null, B.List_100_100, type$.CborListValue_dynamic), - t1 = A.PageMessage_PageMessage$deserialize(A.ExtractCborList_getCborTag(values, 0)); - this._completeJsRequest$1(new A.JSPageRequest(A.ExtractCborList_elementAt(values, 1, type$.String), t1)).then$1$1(this.get$_sendMessageToClient(), type$.void); + var t2, result, _this = this, + t1 = type$.JSObject, + request = t1._as(t1._as(response).detail); + switch (A.PageMessageType_fromName(A._asString(t1._as(request.data).type))) { + case B.PageMessageType_event: + t2 = _this.get$_wallet$_networks().$index(0, A.JSClientType_fromName(A._asString(request.client))); + if (t2 != null) + t2.event$1(A.PageMessageData_cast(t1._as(request.data), t1)); + break; + case B.PageMessageType_request: + result = _this._completeJsRequest$1(request); + result.then$1$1(_this.get$_sendMessageToClient(), type$.void); + result.catchError$1(new A.JSWalletHandler__onClientEvent_closure(_this, request)); + break; + default: + throw A.wrapException(A.UnimplementedError$("Invalid page request.")); + } }, _sendMessageToClient$1(response) { - var $event = A.CustomEvent_constructor_create(true, type$.JSWalletMessage._as(response).toCbor$0().encode$0(), "ETH_" + this.clientId); - type$.JSObject._as(self.window).dispatchEvent($event); + var t1 = type$.JSObject, + $event = A.CustomEvent_constructor_create(true, t1._as(response), "ETH_" + this.clientId); + t1._as(self.window).dispatchEvent($event); }, - _buildAndSendMessage$2$params$requestId(params, requestId) { - return this._buildAndSendMessage$body$JSWalletHandler(params, requestId); + _sendEventToClient$2($event, client) { + this._sendMessageToClient$1({requestId: "", id: "", client: client._core$_name, data: $event}); }, - _buildAndSendMessage$body$JSWalletHandler(params, requestId) { + _buildAndSendMessage$2$client$params(client, params) { + return this._buildAndSendMessage$body$JSWalletHandler(client, params); + }, + _buildAndSendMessage$body$JSWalletHandler(client, params) { var $async$goto = 0, - $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$handler = 1, $async$currentError, $async$self = this, t1, _0_0, message, e, exception, exception0, exception1, $async$exception1; - var $async$_buildAndSendMessage$2$params$requestId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + $async$completer = A._makeAsyncAwaitCompleter(type$.Record_2_Web3MessageCore_and_nullable_Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic), + $async$returnValue, $async$handler = 2, $async$currentError, $async$self = this, requestId, message, handler, e, exception, exception0, t2, exception1, response, t1, requestId0, completer, $async$exception1; + var $async$_buildAndSendMessage$2$client$params = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) { $async$currentError = $async$result; $async$goto = $async$handler; @@ -59702,134 +63546,121 @@ switch ($async$goto) { case 0: // Function start - $async$handler = 3; - t1 = null; - _0_0 = params.message.get$type(); - $async$goto = B.JSClientType_List_111_ethereum === _0_0 ? 7 : 8; - break; + t1 = $async$self.completer; + requestId0 = A.UUID_generateUUIDv4(); + completer = new A.MessageCompleter(requestId0, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_Web3MessageCore), type$._AsyncCompleter_Web3MessageCore)); + t1._awaitingMessages.$indexSet(0, requestId0, completer); + requestId = requestId0; + message = null; + $async$handler = 4; + handler = $async$self.get$_wallet$_networks().$index(0, client); + if (handler == null) { + t2 = $.$get$WalletExceptionConst_invalidRequest(); + throw A.wrapException(t2); + } + t2 = type$.JSObject; + $async$goto = 7; + return A._asyncAwait(handler.request$1(A.PageMessageData_cast(t2._as(params.data), t2)), $async$_buildAndSendMessage$2$client$params); case 7: - // then - $async$goto = 9; - return A._asyncAwait($async$self.get$ethereumHandler().request$1(params.message.cast$1$0(0, type$.ClientMessageEthereum)), $async$_buildAndSendMessage$2$params$requestId); - case 9: // returning from await. - t1 = $async$result; - // goto break $label0$0 - $async$goto = 6; - break; + message = $async$result; case 8: - // join - $async$goto = B.JSClientType_List_112_tron === _0_0 ? 10 : 11; - break; - case 10: - // then - $async$goto = 12; - return A._asyncAwait($async$self.get$tronHandler().request$1(params.message.cast$1$0(0, type$.ClientMessageTron)), $async$_buildAndSendMessage$2$params$requestId); - case 12: - // returning from await. - t1 = $async$result; - // goto break $label0$0 - $async$goto = 6; - break; - case 11: - // join - $async$goto = B.JSClientType_List_113_solana === _0_0 ? 13 : 14; - break; - case 13: - // then - $async$goto = 15; - return A._asyncAwait($async$self.get$solanaHandler().request$1(params.message.cast$1$0(0, type$.ClientMessageSolana)), $async$_buildAndSendMessage$2$params$requestId); - case 15: - // returning from await. - t1 = $async$result; - // goto break $label0$0 - $async$goto = 6; - break; - case 14: - // join - t1 = A.throwExpression(B.Web3RequestException_NOa); - case 6: - // break $label0$0 - message = t1; - case 16: // switch switch (message.get$type()) { case B.Web3MessageTypes_List_100_13_response: // goto case - $async$goto = 18; + $async$goto = 10; break; case B.Web3MessageTypes_List_100_14_walletResponse: // goto case - $async$goto = 19; + $async$goto = 11; break; default: // goto default - $async$goto = 20; + $async$goto = 12; break; } break; - case 18: + case 10: // case - case 19: + case 11: // case - $async$self.completer.complete$2$requestId$response(requestId, message); + t1.complete$2$requestId$response(requestId, message); // goto after switch - $async$goto = 17; + $async$goto = 9; break; - case 20: + case 12: // default - $async$goto = 21; - return A._asyncAwait($async$self._sendMessageToWallet$2$message$requestId(message, requestId), $async$_buildAndSendMessage$2$params$requestId); - case 21: + $async$goto = 13; + return A._asyncAwait($async$self._sendMessageToWallet$2$message$requestId(message, requestId), $async$_buildAndSendMessage$2$client$params); + case 13: // returning from await. // goto after switch - $async$goto = 17; + $async$goto = 9; break; - case 17: + case 9: // after switch - $async$handler = 1; + $async$handler = 2; // goto after finally - $async$goto = 5; + $async$goto = 6; break; - case 3: + case 4: // catch - $async$handler = 2; + $async$handler = 3; $async$exception1 = $async$currentError; - t1 = A.unwrapException($async$exception1); - if (t1 instanceof A.Web3RequestException) { - e = t1; + t2 = A.unwrapException($async$exception1); + if (t2 instanceof A.Web3RequestException) { + e = t2; exception = e.toResponseMessage$0(); - $async$self.completer.complete$2$requestId$response(requestId, exception); + t1.complete$2$requestId$response(requestId, exception); } else { exception0 = B.Web3RequestException_chs.toResponseMessage$0(); - $async$self.completer.complete$2$requestId$response(requestId, exception0); + t1.complete$2$requestId$response(requestId, exception0); } // goto after finally - $async$goto = 5; + $async$goto = 6; break; - case 2: + case 3: // uncaught // goto rethrow - $async$goto = 1; + $async$goto = 2; break; - case 5: + case 6: // after finally - // implicit return - return A._asyncReturn(null, $async$completer); + $async$goto = 14; + return A._asyncAwait(completer._completer.future, $async$_buildAndSendMessage$2$client$params); + case 14: + // returning from await. + response = $async$result; + t1 = message; + if ((t1 == null ? null : t1.get$type()) !== B.Web3MessageTypes_List_100_12_walletRequest) { + $async$returnValue = new A._Record_2(response, null); + // goto return + $async$goto = 1; + break; + } + t1 = message; + $async$returnValue = new A._Record_2(response, t1 == null ? null : J.cast$1$0$ax(t1, type$.Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic)); + // goto return + $async$goto = 1; + break; case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + case 2: // rethrow return A._asyncRethrow($async$currentError, $async$completer); } }); - return A._asyncStartSync($async$_buildAndSendMessage$2$params$requestId, $async$completer); + return A._asyncStartSync($async$_buildAndSendMessage$2$client$params, $async$completer); }, _completeJsRequest$1(params) { return this._completeJsRequest$body$JSWalletHandler(params); }, _completeJsRequest$body$JSWalletHandler(params) { var $async$goto = 0, - $async$completer = A._makeAsyncAwaitCompleter(type$.JSWalletMessageResponse), - $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, request, message, t1, _0_0, requestId, completer, t2, t3, t4, t5; + $async$completer = A._makeAsyncAwaitCompleter(type$.JSObject), + $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, result, response, request, t1, _0_0, message, t2, t3, t4, t5, client, handler; var $async$_completeJsRequest$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) { $async$currentError = $async$result; @@ -59839,65 +63670,60 @@ switch ($async$goto) { case 0: // Function start + client = A.JSClientType_fromName(A._asString(params.client)); + handler = $async$self.get$_wallet$_networks().$index(0, client); $async$handler = 3; - requestId = A.UUID_generateUUIDv4(); - completer = new A.MessageCompleter(requestId, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_Web3MessageCore), type$._AsyncCompleter_Web3MessageCore)); - $async$self.completer._awaitingMessages.$indexSet(0, requestId, completer); - request = completer; - $async$self._buildAndSendMessage$2$params$requestId(params, request.id); $async$goto = 6; - return A._asyncAwait(request._completer.future, $async$_completeJsRequest$1); + return A._asyncAwait($async$self._buildAndSendMessage$2$client$params(client, params), $async$_completeJsRequest$1); case 6: // returning from await. - message = $async$result; - t2 = params.message; - switch (t2.get$type()) { - case B.JSClientType_List_111_ethereum: - $async$self.get$ethereumHandler(); - t3 = type$.ClientMessageEthereum; - t4 = t2.cast$1$0(0, t3); - t5 = message; - t3._as(t4); - message = type$.Web3MessageCore._as(t5); - break; - case B.JSClientType_List_112_tron: - $async$self.get$tronHandler(); - t3 = type$.ClientMessageTron; - t4 = t2.cast$1$0(0, t3); - t5 = message; - t3._as(t4); - message = type$.Web3MessageCore._as(t5); - break; - case B.JSClientType_List_113_solana: - $async$self.get$solanaHandler(); - t3 = type$.ClientMessageSolana; - t4 = t2.cast$1$0(0, t3); - t5 = message; - t3._as(t4); - message = type$.Web3MessageCore._as(t5); - break; - } + result = $async$result; + response = result._0; + request = result._1; t1 = null; - _0_0 = message.get$type(); - $label0$1: { + _0_0 = response.get$type(); + $label0$0: { if (B.Web3MessageTypes_List_100_13_response === _0_0) { - t3 = J.cast$1$0$ax(message, type$.Web3ResponseMessage); - t1 = new A.JSWalletMessageResponse(params.id, B.JSWalletResponseType_List_50_success, t2.get$type(), t3.result); - break $label0$1; + handler.toString; + t2 = type$.JSObject; + A.PageMessageData_cast(t2._as(params.data), t2); + t2 = type$.Web3ResponseMessage; + t1 = {type: "response", status: "success", data: A.jsify(t2._as(J.cast$1$0$ax(response, t2)).result)}; + break $label0$0; } if (B.Web3MessageTypes_List_100_14_walletResponse === _0_0) { - t3 = J.cast$1$0$ax(message, type$.Web3WalletResponseMessage); - t1 = new A.JSWalletMessageResponse(params.id, B.JSWalletResponseType_List_50_success, t2.get$type(), t3.result); - break $label0$1; + t2 = handler; + t2.toString; + t3 = type$.JSObject; + t3 = A.PageMessageData_cast(t3._as(params.data), t3); + t4 = J.cast$1$0$ax(response, type$.Web3WalletResponseMessage); + t5 = request; + t5.toString; + t1 = t2.finilizeWalletResponse$3$message$params$response(t3, t5, t4); + break $label0$0; } if (B.Web3MessageTypes_List_100_15_error === _0_0) { - t3 = J.cast$1$0$ax(message, type$.Web3ExceptionMessage).toJson$0(); - t1 = new A.JSWalletMessageResponse(params.id, B.JSWalletResponseType_List_51_failed, t2.get$type(), t3); - break $label0$1; + if (handler == null) + t2 = null; + else { + t2 = type$.JSObject; + A.PageMessageData_cast(t2._as(params.data), t2); + t2 = type$.Web3ExceptionMessage; + t2 = t2._as(J.cast$1$0$ax(response, t2)); + type$.nullable_Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(request); + t2 = {type: "response", status: "failed", data: A.jsify(t2.toJson$0())}; + } + t1 = t2 == null ? {type: "response", status: "failed", data: A.jsify(response.toJson$0())} : t2; + break $label0$0; } - t1 = A.throwExpression(B.Web3RequestException_NOa); + t1 = {type: "response", status: "failed", data: A.jsify(B.Web3RequestException_NOa.toJson$0())}; + break $label0$0; } - t1 = t1; + message = t1; + t1 = A._asString(params.id); + t2 = type$.JSObject; + t2 = A._asString(A.PageMessageData_cast(t2._as(params.data), t2).id); + t1 = A.WalletMessage_constructor_response(A.JSClientType_fromName(A._asString(params.client)), message, t2, t1); $async$returnValue = t1; $async$next = [1]; // goto finally @@ -59913,17 +63739,10 @@ case 4: // finally $async$handler = 2; - t1 = params.message; - switch (t1.get$type()) { - case B.JSClientType_List_111_ethereum: - $async$self.get$ethereumHandler().onRequestDone$1(t1.cast$1$0(0, type$.ClientMessageEthereum)); - break; - case B.JSClientType_List_112_tron: - $async$self.get$tronHandler().onRequestDone$1(t1.cast$1$0(0, type$.ClientMessageTron)); - break; - case B.JSClientType_List_113_solana: - $async$self.get$solanaHandler().onRequestDone$1(t1.cast$1$0(0, type$.ClientMessageSolana)); - break; + t1 = handler; + if (t1 != null) { + t2 = type$.JSObject; + t1.onRequestDone$1(A.PageMessageData_cast(t2._as(params.data), t2)); } // goto the next finally handler $async$goto = $async$next.pop(); @@ -59941,26 +63760,23 @@ return A._asyncStartSync($async$_completeJsRequest$1, $async$completer); }, _updateAuthenticated$2$network(authenticated, network) { - var _this = this; - switch (network) { - case B.NetworkType_iDZ: - _this.get$ethereumHandler().initChain$2$authenticated$chainHandler(authenticated, _this._chain); - break; - case B.NetworkType_SkF: - _this.get$tronHandler().initChain$2$authenticated$chainHandler(authenticated, _this._chain); - break; - case B.NetworkType_4QF: - _this.get$solanaHandler().initChain$2$authenticated$chainHandler(authenticated, _this._chain); - break; - default: - _this.get$tronHandler().initChain$2$authenticated$chainHandler(authenticated, _this._chain); - _this.get$ethereumHandler().initChain$2$authenticated$chainHandler(authenticated, _this._chain); - _this.get$solanaHandler().initChain$2$authenticated$chainHandler(authenticated, _this._chain); - break; + var t1, t2, t3, _this = this, + client = A.JSClientType_fronNetworkName(network == null ? null : network.name); + if (client === B.JSClientType_AOw) { + for (t1 = _this.get$_wallet$_networks().get$values(), t2 = A._instanceType(t1), t1 = new A.MappedIterator(J.get$iterator$ax(t1.__internal$_iterable), t1._f, t2._eval$1("MappedIterator<1,2>")), t2 = t2._rest[1]; t1.moveNext$0();) { + t3 = t1.__internal$_current; + if (t3 == null) + t3 = t2._as(t3); + t3.initChain$2$authenticated$chainHandler(authenticated, _this._chain); + } + return; } + t1 = _this.get$_wallet$_networks().$index(0, client); + if (t1 != null) + t1.initChain$2$authenticated$chainHandler(authenticated, _this._chain); }, _handleOnResponse$1(request) { - var data, encryptedMessage, decode, message, msg, msg0, msg1, chains, e, toMessage, toMessage0, t1, exception, _this = this; + var data, encryptedMessage, decode, message, msg, msg0, e, toMessage, toMessage0, exception, t1, _this = this; type$.WalletEvent._as(request); try { data = A.List_List$from(request.data, true, type$.int); @@ -59968,28 +63784,20 @@ decode = _this._crypto.decrypt$2(encryptedMessage.nonce, encryptedMessage.message); message = A.Web3MessageCore_Web3MessageCore$deserialize(decode); switch (message.get$type()) { - case B.Web3MessageTypes_List_100_13_response: - msg = J.cast$1$0$ax(message, type$.Web3ResponseMessage); - _this.completer.complete$2$requestId$response(request.requestId, msg); - break; case B.Web3MessageTypes_List_100_14_walletResponse: - msg0 = J.cast$1$0$ax(message, type$.Web3WalletResponseMessage); - _this._updateAuthenticated$2$network(msg0.authenticated, msg0.network); - _this.completer.complete$2$requestId$response(request.requestId, msg0); + msg = J.cast$1$0$ax(message, type$.Web3WalletResponseMessage); + if (msg.chain != null) + _this._chain = A.ChainsHandler_ChainsHandler$deserialize(msg.chain); + _this._updateAuthenticated$2$network(msg.authenticated, msg.network); + _this.completer.complete$2$requestId$response(request.requestId, msg); break; case B.Web3MessageTypes_List_100_15_error: _this.completer.complete$2$requestId$response(request.requestId, J.cast$1$0$ax(message, type$.Web3ExceptionMessage)); break; case B.Web3MessageTypes_List_100_11_chains: - msg1 = J.cast$1$0$ax(message, type$.Web3ChainMessage); - chains = A.ChainsHandler_ChainsHandler$deserialize(msg1.message); - _this.set$_chain(chains); - _this._updateAuthenticated$2$network(msg1.authenticated, null); - if (msg1.response != null) { - t1 = msg1.response; - t1.toString; - _this.completer.complete$2$requestId$response(request.requestId, t1); - } + msg0 = J.cast$1$0$ax(message, type$.Web3ChainMessage); + _this._chain = A.ChainsHandler_ChainsHandler$deserialize(msg0.message); + _this._updateAuthenticated$2$network(msg0.authenticated, null); break; } } catch (exception) { @@ -60022,18 +63830,35 @@ break; } return true; + }, + set$__JSWalletHandler__networks_FI(__JSWalletHandler__networks_FI) { + this.__JSWalletHandler__networks_FI = type$.Map_of_JSClientType_and_JSNetworkHandler_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_ChainWeb3State_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic._as(__JSWalletHandler__networks_FI); } }; + A.JSWalletHandler__onClientEvent_closure.prototype = { + call$1(e) { + var message, + t1 = this.request, + t2 = A.JSClientType_fromName(A._asString(t1.client)), + t3 = A._asString(t1.id), + t4 = type$.JSObject; + t4 = A._asString(A.PageMessageData_cast(t4._as(t1.data), t4).id); + message = A.WalletMessage_constructor_response(t2, {type: "response", status: "failed", data: A.jsify(B.Web3RequestException_chs.toJson$0())}, t4, t3); + this.$this._sendMessageToClient$1(message); + return message; + }, + $signature: 417 + }; A.JSWebviewTraget.prototype = { _enumToString$0() { - return "JSWebviewTraget." + this._name; + return "JSWebviewTraget." + this._core$_name; } }; A.JSWebviewTraget_fromName_closure.prototype = { call$1(e) { - return type$.JSWebviewTraget._as(e)._name === this.name; + return type$.JSWebviewTraget._as(e)._core$_name === this.name; }, - $signature: 393 + $signature: 418 }; A.JSWebviewWallet.prototype = { _sendMessageToWallet$2$message$requestId(message, requestId) { @@ -60064,14 +63889,11 @@ } }); return A._asyncStartSync($async$_sendMessageToWallet$2$message$requestId, $async$completer); - }, - set$_chain(_chain) { - this._chain = type$.ChainsHandler._as(_chain); } }; A.main_onActivation.prototype = { call$1(data) { - var target, t2, chacha, encryptedMessage, message, t3, t4, t5, handler, client, result, value, _null = null, + var target, t2, chacha, encryptedMessage, message, t3, t4, handler, t5, t6, t7, t8, t9, value, value0, _null = null, t1 = type$.JSObject, walletEvent = A.JSWalletEvent_toEvent(t1._as(data)); if (walletEvent == null || walletEvent.clientId !== A.MRTWallet_get_clientId(t1._as(self.MRT))) @@ -60090,22 +63912,28 @@ message = A.Web3ChainMessage_Web3ChainMessage$deserialize(chacha.decrypt$2(encryptedMessage.nonce, encryptedMessage.message), _null); t3 = message.authenticated; t4 = A.ChaCha20Poly1305$(t3.token); - t5 = type$.String; - handler = new A.JSWebviewWallet(t2, A.ChainsHandler_ChainsHandler$deserialize(message.message), target, new A.MessageCompleterHandler(A.LinkedHashMap_LinkedHashMap$_empty(t5, type$.MessageCompleter)), t4); - client = new A.JSPageController(t2, A.LinkedHashMap_LinkedHashMap$_empty(t5, type$.PageRequestCompeleter)); - t5 = self; - t4 = t1._as(t5.window); - result = "ETH_" + t2; - client.__JSPageController__id_FI = result; - t4.addEventListener(result, A._functionToJS1(client.get$_onWalletEvent())); - t1._as(t5.MRT).onMrtMessage = A._functionToJS1(handler.get$_onResponse()); - t1 = t1._as(t5.window); - value = handler.__JSWalletHandler__id_FI; - if (value === $) { - value !== $ && A.throwLateFieldADI("_id"); - value = handler.__JSWalletHandler__id_FI = "WALLET_" + t2; - } - t1.addEventListener(value, A._functionToJS1(handler.get$_onClientEvent())); + handler = new A.JSWebviewWallet(t2, A.ChainsHandler_ChainsHandler$deserialize(message.message), target, new A.MessageCompleterHandler(A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.MessageCompleter)), t4); + t4 = type$.JSArray_JavaScriptFunction; + t5 = type$.JSEventType; + t6 = type$.List_JavaScriptFunction; + t7 = A.LinkedHashMap_LinkedHashMap$_literal([B.JSEventType_accountsChanged, A._setArrayType([], t4), B.JSEventType_chainChanged, A._setArrayType([], t4), B.JSEventType_connect, A._setArrayType([], t4), B.JSEventType_message, A._setArrayType([], t4), B.JSEventType_disconnect, A._setArrayType([], t4)], t5, t6); + t8 = A.LinkedHashMap_LinkedHashMap$_literal([B.JSEventType_accountsChanged, A._setArrayType([], t4), B.JSEventType_chainChanged, A._setArrayType([], t4), B.JSEventType_connect, A._setArrayType([], t4), B.JSEventType_message, A._setArrayType([], t4), B.JSEventType_disconnect, A._setArrayType([], t4)], t5, t6); + t9 = A.LinkedHashMap_LinkedHashMap$_literal([B.JSEventType_accountsChanged, A._setArrayType([], t4), B.JSEventType_chainChanged, A._setArrayType([], t4), B.JSEventType_connect, A._setArrayType([], t4), B.JSEventType_message, A._setArrayType([], t4), B.JSEventType_disconnect, A._setArrayType([], t4)], t5, t6); + t6 = A.LinkedHashMap_LinkedHashMap$_literal([B.JSEventType_accountsChanged, A._setArrayType([], t4), B.JSEventType_chainChanged, A._setArrayType([], t4), B.JSEventType_connect, A._setArrayType([], t4), B.JSEventType_message, A._setArrayType([], t4), B.JSEventType_disconnect, A._setArrayType([], t4)], t5, t6); + if ($.PageNetworkController____walletId._value !== $.PageNetworkController____walletId) + A.throwExpression(A.LateError$fieldAI($.PageNetworkController____walletId._name)); + value = $.PageNetworkController____walletId._value = "WALLET_" + t2; + t4 = self; + t1._as(t4.window).addEventListener("ETH_" + t2, A._functionToJS1(new A.JSPageController(new A.EthereumPageController(t7), new A.TronPageController(t8), new A.SolanaPageController(t9), new A.TonPageController(t6)).get$_onWalletEvent())); + t1._as(t4.MRT).onMrtMessage = A._functionToJS1(handler.get$_onResponse()); + t4 = t1._as(t4.window); + value0 = handler.__JSWalletHandler__id_FI; + if (value0 === $) { + value0 !== $ && A.throwLateFieldADI("_id"); + handler.__JSWalletHandler__id_FI = value; + } else + value = value0; + t4.addEventListener(value, A._functionToJS1(handler.get$_onClientEvent())); handler._updateAuthenticated$2$network(t3, _null); this.completer.complete$1(handler); return true; @@ -60113,7 +63941,7 @@ return false; } }, - $signature: 79 + $signature: 126 }; (function aliases() { var _ = J.LegacyJavaScriptObject.prototype; @@ -60147,6 +63975,8 @@ _ = A.SourceSpanMixin.prototype; _.super$SourceSpanMixin$compareTo = _.compareTo$1; _.super$SourceSpanMixin$$eq = _.$eq; + _ = A.JSNetworkHandler.prototype; + _.super$JSNetworkHandler$finilizeWalletResponse = _.finilizeWalletResponse$3$message$params$response; })(); (function installTearOffs() { var _static_2 = hunkHelpers._static_2, @@ -60159,103 +63989,113 @@ _instance_1_i = hunkHelpers._instance_1i, _static = hunkHelpers.installStaticTearOff, _instance_0_i = hunkHelpers._instance_0i; - _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 62); - _instance_1_u(A.CastStreamSubscription.prototype, "get$__internal$_onData", "__internal$_onData$1", 57); - _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 53); - _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 53); - _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 53); - _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 1); - _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 17); - _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 129); - _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 1); - _instance(A._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 395, 0, 0); - _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 129); - _instance_0_u(A._DoneStreamSubscription.prototype, "get$_onMicrotask", "_onMicrotask$0", 1); - _static_2(A, "collection___defaultEquals$closure", "_defaultEquals", 112); - _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 91); - _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 62); + _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 100); + _instance_1_u(A.CastStreamSubscription.prototype, "get$__internal$_onData", "__internal$_onData$1", 53); + _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 57); + _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 57); + _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 57); + _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0); + _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 19); + _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 114); + _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 0); + _instance(A._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 222, 0, 0); + _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 114); + _instance_0_u(A._DoneStreamSubscription.prototype, "get$_onMicrotask", "_onMicrotask$0", 0); + _static_2(A, "collection___defaultEquals$closure", "_defaultEquals", 95); + _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 105); + _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 100); _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 18); var _; - _instance_1_i(_ = A._ByteCallbackSink.prototype, "get$add", "add$1", 57); - _instance_0_u(_, "get$close", "close$0", 1); - _static_1(A, "core__identityHashCode$closure", "identityHashCode", 91); - _static_2(A, "core__identical$closure", "identical", 112); - _static_1(A, "core_Uri_decodeComponent$closure", "Uri_decodeComponent", 15); - _instance(_ = A._RawSecureSocket.prototype, "get$_completeCloseCompleter", 0, 0, null, ["call$1", "call$0"], ["_completeCloseCompleter$1", "_completeCloseCompleter$0"], 367, 0, 0); - _instance_1_u(_, "get$_onBadCertificateWrapper", "_onBadCertificateWrapper$1", 66); - _instance_1_u(_, "get$_eventDispatcher", "_eventDispatcher$1", 358); - _instance_0_u(_, "get$_doneHandler", "_doneHandler$0", 1); - _instance(_, "get$_reportError", 0, 1, null, ["call$2", "call$1"], ["_reportError$2", "_reportError$1"], 355, 0, 0); - _instance_0_u(_, "get$_secureHandshakeCompleteHandler", "_secureHandshakeCompleteHandler$0", 1); - _instance_0_u(_, "get$_onPauseStateChange", "_onPauseStateChange$0", 1); - _instance_0_u(_, "get$_onSubscriptionStateChange", "_onSubscriptionStateChange$0", 1); - _instance_1_u(_, "get$_readSocketOrBufferedData", "_readSocketOrBufferedData$1", 354); + _instance_1_i(_ = A._ByteCallbackSink.prototype, "get$add", "add$1", 53); + _instance_0_u(_, "get$close", "close$0", 0); + _static_1(A, "core__identityHashCode$closure", "identityHashCode", 105); + _static_2(A, "core__identical$closure", "identical", 95); + _static_1(A, "core_Uri_decodeComponent$closure", "Uri_decodeComponent", 16); + _instance(_ = A._RawSecureSocket.prototype, "get$_completeCloseCompleter", 0, 0, null, ["call$1", "call$0"], ["_completeCloseCompleter$1", "_completeCloseCompleter$0"], 260, 0, 0); + _instance_1_u(_, "get$_onBadCertificateWrapper", "_onBadCertificateWrapper$1", 79); + _instance_1_u(_, "get$_eventDispatcher", "_eventDispatcher$1", 194); + _instance_0_u(_, "get$_doneHandler", "_doneHandler$0", 0); + _instance(_, "get$_reportError", 0, 1, null, ["call$2", "call$1"], ["_reportError$2", "_reportError$1"], 191, 0, 0); + _instance_0_u(_, "get$_secureHandshakeCompleteHandler", "_secureHandshakeCompleteHandler$0", 0); + _instance_0_u(_, "get$_onPauseStateChange", "_onPauseStateChange$0", 0); + _instance_0_u(_, "get$_onSubscriptionStateChange", "_onSubscriptionStateChange$0", 0); + _instance_1_u(_, "get$_readSocketOrBufferedData", "_readSocketOrBufferedData$1", 157); _static(A, "math__max$closure", 2, null, ["call$1$2", "call$2"], ["max", function(a, b) { return A.max(a, b, type$.num); - }], 398, 0); - _static_2(A, "bch_bech32__BchBech32Utils_computeChecksum$closure", "_BchBech32Utils_computeChecksum", 87); - _static_2(A, "bch_bech32__BchBech32Utils_verifyChecksum$closure", "_BchBech32Utils_verifyChecksum", 67); + }], 423, 0); + _static_2(A, "bch_bech32__BchBech32Utils_computeChecksum$closure", "_BchBech32Utils_computeChecksum", 135); + _static_2(A, "bch_bech32__BchBech32Utils_verifyChecksum$closure", "_BchBech32Utils_verifyChecksum", 106); _static(A, "bech32_base_Bech32Utils_computeChecksum$closure", 2, null, ["call$3", "call$2"], ["Bech32Utils_computeChecksum", function(hrp, data) { return A.Bech32Utils_computeChecksum(hrp, data, B.Bech32Encodings_0); - }], 401, 0); + }], 426, 0); _static(A, "bech32_base_Bech32Utils_verifyChecksum$closure", 2, null, ["call$3", "call$2"], ["Bech32Utils_verifyChecksum", function(hrp, data) { return A.Bech32Utils_verifyChecksum(hrp, data, B.Bech32Encodings_0); - }], 402, 0); - _static_1(A, "bip32_path_Bip32PathParser__parseElem$closure", "Bip32PathParser__parseElem", 268); - _instance_0_i(A.Bip32Path.prototype, "get$length", "length$0", 43); - _instance_0_u(_ = A.WebSocketService.prototype, "get$_onClose", "_onClose$0", 1); - _instance_1_u(_, "get$onMessge", "onMessge$1", 138); - _instance_1_u(A.EthereumWebsocketService.prototype, "get$onMessge", "onMessge$1", 138); - _instance_0_u(A.WithdrawExpireUnfreezeContract.prototype, "get$toJson", "toJson$0", 33); - _instance_0_u(A.ReceiveDescription.prototype, "get$toJson", "toJson$0", 33); - _instance_0_u(A.SpendDescription.prototype, "get$toJson", "toJson$0", 33); - _instance(_ = A.ProxyMethodHandler.prototype, "get$set", 0, 4, null, ["call$4"], ["$set$4"], 350, 0, 0); - _instance_2_u(_, "get$get", "$get$2", 351); - _instance_0_i(A.ProviderConnectInfo.prototype, "get$toString", "toString$0", 7); - _instance_1_u(A.JSEthereumHandler.prototype, "get$_onSubscribe", "_onSubscribe$1", 359); - _instance_1_u(_ = A.JSPageController.prototype, "get$_getResult", "_getResult$1", 366); - _instance_1_u(_, "get$_onWalletEvent", "_onWalletEvent$1", 32); - _instance_0_u(_ = A.EthereumPageController.prototype, "get$_disconnect", "_disconnect$0", 1); - _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 19); - _instance_2_u(_, "get$_removeListener", "_removeListener$2", 19); - _instance_0_u(_, "get$_enable", "_enable$0", 48); - _instance_1_u(_, "get$_onRequest", "_onRequest$1", 51); - _instance_1_u(_ = A.SolanaPageController.prototype, "get$_signMessage", "_signMessage$1", 40); - _instance_1_u(_, "get$_signTranaction", "_signTranaction$1", 51); - _instance_1_u(_, "get$_signAllTransactions", "_signAllTransactions$1", 372); - _instance(_, "get$_signAndSendTransaction", 0, 1, null, ["call$2", "call$1"], ["_signAndSendTransaction$2", "_signAndSendTransaction$1"], 373, 0, 0); - _instance(_, "get$_signAndSendAllTransactions", 0, 1, null, ["call$2", "call$1"], ["_signAndSendAllTransactions$2", "_signAndSendAllTransactions$1"], 374, 0, 0); - _instance_0_u(_, "get$_connect", "_connect$0", 48); - _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 19); - _instance_2_u(_, "get$_removeListener", "_removeListener$2", 19); - _instance_1_u(_ = A.TronPageController.prototype, "get$_disabledFeature", "_disabledFeature$1", 57); - _instance_1_u(_, "get$_signMessageV2_", "_signMessageV2_$1", 40); - _instance_1_u(_, "get$_signTransaction_", "_signTransaction_$1", 40); - _instance_1_u(_, "get$_multiSign", "_multiSign$1", 40); - _instance_0_u(_, "get$_disconnect", "_disconnect$0", 1); - _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 19); - _instance_2_u(_, "get$_removeListener", "_removeListener$2", 19); - _instance_0_u(_, "get$_enable", "_enable$0", 48); - _instance_1_u(_, "get$_onRequest", "_onRequest$1", 51); - _instance_1_u(_ = A.JSSolanaPublicKey.prototype, "get$equals", "equals$1", 379); - _instance_0_u(_, "get$toBase58", "toBase58$0", 7); - _instance_0_u(_, "get$toJSON", "toJSON$0", 7); - _instance_0_i(_, "get$toString", "toString$0", 7); - _instance_0_u(_, "get$toBytes", "toBytes$0", 12); - _instance_0_i(A.SolanaProviderConnectInfo.prototype, "get$toString", "toString$0", 7); - _instance_0_i(A.JSTronAddress.prototype, "get$toString", "toString$0", 7); - _instance_1_u(_ = A.JSWalletHandler.prototype, "get$_onClientEvent", "_onClientEvent$1", 32); - _instance_1_u(_, "get$_sendMessageToClient", "_sendMessageToClient$1", 391); - _instance_1_u(_, "get$_onResponse", "_onResponse$1", 79); - _static_2(A, "segwit_bech32_SegwitBech32Encoder__computeChecksum$closure", "SegwitBech32Encoder__computeChecksum", 87); - _static_2(A, "segwit_bech32_SegwitBech32Decoder__verifyChecksum$closure", "SegwitBech32Decoder__verifyChecksum", 67); + }], 427, 0); + _static_1(A, "bip32_path_Bip32PathParser__parseElem$closure", "Bip32PathParser__parseElem", 285); + _instance_0_i(A.Bip32Path.prototype, "get$length", "length$0", 33); + _instance_0_u(_ = A.WebSocketService.prototype, "get$_onClose", "_onClose$0", 0); + _instance_1_u(_, "get$onMessge", "onMessge$1", 60); + _instance_1_u(A.EthereumWebsocketService.prototype, "get$onMessge", "onMessge$1", 60); + _instance_0_u(A.WithdrawExpireUnfreezeContract.prototype, "get$toJson", "toJson$0", 46); + _instance_0_u(A.ReceiveDescription.prototype, "get$toJson", "toJson$0", 46); + _instance_0_u(A.SpendDescription.prototype, "get$toJson", "toJson$0", 46); + _instance(_ = A.ProxyMethodHandler.prototype, "get$set", 0, 4, null, ["call$4"], ["$set$4"], 373, 0, 0); + _instance_2_u(_, "get$get", "$get$2", 374); + _instance_0_i(A.ProviderConnectInfo.prototype, "get$toString", "toString$0", 4); + _instance_1_u(A.JSEthereumHandler.prototype, "get$_onSubscribe", "_onSubscribe$1", 381); + _instance_1_u(A.JSPageController.prototype, "get$_onWalletEvent", "_onWalletEvent$1", 29); + _instance_1_u(A.PageNetworkController.prototype, "get$_onWalletRequest", "_onWalletRequest$1", 21); + _instance_0_u(_ = A.EthereumPageController.prototype, "get$_disconnect", "_disconnect$0", 0); + _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 17); + _instance_0_u(_, "get$_cancelAllListeners", "_cancelAllListeners$0", 0); + _instance_2_u(_, "get$_removeListener", "_removeListener$2", 17); + _instance_0_u(_, "get$_enable", "_enable$0", 36); + _instance_1_u(_, "get$_onRequest", "_onRequest$1", 21); + _instance_1_u(_ = A.SolanaPageController.prototype, "get$_signMessage", "_signMessage$1", 84); + _instance_1_u(_, "get$_signTranaction", "_signTranaction$1", 21); + _instance_1_u(_, "get$_signAllTransactions", "_signAllTransactions$1", 394); + _instance(_, "get$_signAndSendTransaction", 0, 1, null, ["call$2", "call$1"], ["_signAndSendTransaction$2", "_signAndSendTransaction$1"], 395, 0, 0); + _instance(_, "get$_signAndSendAllTransactions", 0, 1, null, ["call$2", "call$1"], ["_signAndSendAllTransactions$2", "_signAndSendAllTransactions$1"], 396, 0, 0); + _instance_1_u(_, "get$_buildWalletRequest", "_buildWalletRequest$1", 21); + _instance_0_u(_, "get$_connect", "_connect$0", 36); + _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 17); + _instance_2_u(_, "get$_removeListener", "_removeListener$2", 17); + _instance_0_u(_ = A.TonPageController.prototype, "get$_requestAccount", "_requestAccount$0", 36); + _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 17); + _instance_2_u(_, "get$_removeListener", "_removeListener$2", 17); + _instance_0_u(_, "get$_cancelAllListeners", "_cancelAllListeners$0", 0); + _instance_1_u(_ = A.TronPageController.prototype, "get$_disabledFeature", "_disabledFeature$1", 53); + _instance(_, "get$_signMessageV2_", 0, 1, null, ["call$2", "call$1"], ["_signMessageV2_$2", "_signMessageV2_$1"], 51, 0, 0); + _instance(_, "get$_signTransaction_", 0, 1, null, ["call$2", "call$1"], ["_signTransaction_$2", "_signTransaction_$1"], 51, 0, 0); + _instance(_, "get$_multiSign", 0, 1, null, ["call$2", "call$1"], ["_multiSign$2", "_multiSign$1"], 51, 0, 0); + _instance_0_u(_, "get$_disconnect", "_disconnect$0", 0); + _instance_2_u(_, "get$_scripts$_addListener", "_scripts$_addListener$2", 17); + _instance_2_u(_, "get$_removeListener", "_removeListener$2", 17); + _instance_0_u(_, "get$_cancelAllListeners", "_cancelAllListeners$0", 0); + _instance_0_u(_, "get$_enable", "_enable$0", 36); + _instance_1_u(_, "get$_onRequest", "_onRequest$1", 21); + _instance_1_u(_ = A.JSSolanaPublicKey.prototype, "get$equals", "equals$1", 400); + _instance_0_u(_, "get$toBase58", "toBase58$0", 4); + _instance_0_u(_, "get$toJSON", "toJSON$0", 4); + _instance_0_i(_, "get$toString", "toString$0", 4); + _instance_0_u(_, "get$toBytes", "toBytes$0", 5); + _instance_0_i(A.SolanaProviderConnectInfo.prototype, "get$toString", "toString$0", 4); + _instance_0_i(A.TonChainChanged.prototype, "get$toString", "toString$0", 4); + _instance_0_i(A.JSTronAddress.prototype, "get$toString", "toString$0", 4); + _instance_0_i(A.TronChainChanged.prototype, "get$toString", "toString$0", 4); + _instance_1_u(_ = A.JSWalletHandler.prototype, "get$_onClientEvent", "_onClientEvent$1", 29); + _instance_1_u(_, "get$_sendMessageToClient", "_sendMessageToClient$1", 29); + _instance_2_u(_, "get$_sendEventToClient", "_sendEventToClient$2", 415); + _instance_1_u(_, "get$_onResponse", "_onResponse$1", 126); + _static_2(A, "segwit_bech32_SegwitBech32Encoder__computeChecksum$closure", "SegwitBech32Encoder__computeChecksum", 135); + _static_2(A, "segwit_bech32_SegwitBech32Decoder__verifyChecksum$closure", "SegwitBech32Decoder__verifyChecksum", 106); })(); (function inheritance() { var _mixin = hunkHelpers.mixin, _inherit = hunkHelpers.inherit, _inheritMany = hunkHelpers.inheritMany; _inherit(A.Object, null); - _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, J.ArrayIterator, A.Stream, A.CastStreamSubscription, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A.Symbol, A._Record, A.MapView, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A._SyncStarIterator, A.AsyncError, A.TimeoutException, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._Zone, A._HashMapKeyIterator, A.SetBase, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._MapBaseValueIterator, A._UnmodifiableMapMixin, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A._BigIntImpl, A._BigIntClassic, A.DateTime, A.Duration, A._Enum, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.MapEntry, A.Null, A._StringStackTrace, A.RuneIterator, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.Expando, A._FilterStatus, A.TlsException, A.SocketDirection, A.RawSocketEvent, A.NullRejectionException, A._JSRandom, A._JSSecureRandom, A.Endian, A.PubKeyAddressType, A.P2pkhAddressType, A.P2shAddressType, A.SegwitAddresType, A.LegacyAddress, A.BitcoinNetworkAddress, A.SegwitAddress, A.Script, A.ECPublic, A.BlockchainUtilsException, A.BitcoinSVNetwork, A.BitcoinNetwork, A.LitecoinNetwork, A.DashNetwork, A.DogecoinNetwork, A.BitcoinCashNetwork, A.PepeNetwork, A.ApiProvider, A.ElectrumApiProvider, A.ElectrumRequest, A.APIConfig, A.ElectrumRequestDetails, A.Base58ChecksumError, A.Bech32ChecksumError, A.ADAAddressType, A.ADAByronAddrTypes, A.ADAByronAddrAttrs, A.ADAByronAddrPayload, A.ADAByronAddr, A.AdaByronIcarusAddrEncoder, A.AdaByronLegacyAddrEncoder, A.Pointer, A.AdaStakeCredType, A.AdaStakeCredential, A.AdaShelleyAddrEncoder, A.AdaShelleyStakingAddrEncoder, A.AdaGenericAddrDecoderResult, A.AdaGenericAddrDecoder, A.ADANetwork, A.AlgoAddrEncoder, A.AptosAddrEncoder, A.AtomAddrEncoder, A.AtomNist256P1AddrEncoder, A.AvaxPChainAddrEncoder, A.AvaxXChainAddrEncoder, A.EgldAddrEncoder, A.BlockchainAddressEncoder, A.EosAddrEncoder, A.ErgoNetworkTypes, A.ErgoP2PKHAddrEncoder, A.EthAddrDecoder, A.EthAddrEncoder, A.AddressConverterException, A.FilSecp256k1AddrEncoder, A.IcxAddrEncoder, A.InjAddrEncoder, A.NanoAddrEncoder, A.NearAddrEncoder, A.NeoAddrEncoder, A.OkexAddrEncoder, A.OneAddrEncoder, A.P2PKHAddrEncoder, A.BchP2PKHAddrEncoder, A.P2SHAddrEncoder, A.BchP2SHAddrEncoder, A.P2TRAddrEncoder, A.P2WPKHAddrEncoder, A.SolAddrDecoder, A.SolAddrEncoder, A.SubstrateEd25519AddrEncoder, A.SubstrateSr25519AddrEncoder, A.SubstrateSecp256k1AddrEncoder, A.DecodeAddressResult, A.FriendlyAddressFlags, A.TonAddrDecoder, A.TonAddrEncoder, A.TrxAddrDecoder, A.TrxAddrEncoder, A.XlmAddrTypes, A.XlmAddrEncoder, A.XRPXAddressDecodeResult, A.XrpAddrEncoder, A.XtzAddrPrefixes, A.XtzAddrEncoder, A.ZilAddrEncoder, A.Bip32PathError, A.Bip32ChainCode, A.Bip32FingerPrint, A.Bip32KeyIndex, A.Bip32KeyData, A.Bip32KeyNetVersions, A.Bip32KeyBase, A.Bip32Path, A.BipCoins, A.BipProposal, A.BipCoinConfig, A.CipProposal, A.CoinConf, A.CoinParams, A.CoinNames, A.EllipticCurveTypes, A.Ed25519Blake2bPublicKey, A.Ed25519PublicKey, A.Ed25519KholawPublicKey, A.Ed25519MoneroPublicKey, A.Nist256p1PublicKey, A.Secp256k1PublicKeyEcdsa, A.Sr25519PublicKey, A.MoneroCoinConf, A.MoneroCoins, A.MoneroProposal, A.MoneroKeyError, A.MoneroPublicKey, A.SubstrateCoinConf, A.SubstrateCoins, A.SubstratePropoosal, A.SubstrateScaleEncoderBase, A.CborBase64Types, A.CborBaseUrlValue, A.CborBigFloatValue, A.CborBigIntValue, A.CborBoleanValue, A.CborBytesValue, A.CborDynamicBytesValue, A.CborTagValue, A._CborDate, A.CborDecimalFracValue, A.CborFloatValue, A.CborIntValue, A.CborSafeIntValue, A.CborListValue, A.CborMapValue, A.CborMimeValue, A.CborNullValue, A.CborUndefinedValue, A.CborRegxpValue, A.CborSetValue, A.CborString, A.CborUriValue, A.CborBytesTracker, A.FloatLength, A.FloatUtils, A.AES, A.AESLib, A.Curve, A.ECDSAPublicKey, A.EDDSAPublicKey, A.AbstractPoint, A.SquareRootError, A.JacobiError, A.ChaCha20Poly1305, A.CTR, A.BLAKE2b, A._Keccack, A._RIPEMD, A.SHA256, A.Poly1305, A.FortunaPRNG, A.SchnorrkelPublicKey, A.ArgumentException, A.MessageException, A.RPCError, A._Hex, A.LayoutByteReader, A.LayoutByteWriter, A.Layout, A.LayoutDecodeResult, A.LayoutException, A.SolanaVerifier, A.SS58ChecksumError, A.DynamicByteTracker, A.BigRational, A.Tuple, A.CanonicalizedMap, A.CosmosBaseAddress, A.TendermintRequestParam, A.TendermintRequestDetails, A.TendermintProvider, A.BaseClient, A.BaseRequest, A.BaseResponse, A.ClientException, A.MediaType, A.MRTNativePluginException, A.WalletEvent, A.PlatformInterface, A.ApiProviderException, A.WalletException, A.Equatable, A._LiveListenable_Object__LiveListenable, A._LiveListenable, A._APPImage_Object_CborSerializable, A.CborSerializable, A.JsonSerialization, A.SynchronizedLock, A.MethodResult, A.WebsocketWeb, A.CustomProposal, A._AddressDerivationIndex_Object_CborSerializable, A.CryptoWokerImpl, A.IsolateCryptoWoker, A.NetworkType, A.BaseRepository, A._NetworkClient_Object_BaseRepository, A.LookupBlockRequest0, A.SubstrateRepository, A.TVMRequestParam, A._APIProvider_Object_Equatable, A.APIServiceTracker, A.HTTPService, A.BaseSocketService, A._ProviderAuth_Object_CborSerializable, A.ApiRequest, A.SocketRequestCompeleter, A.EthereumSubscribeResult, A.DecimalBalance, A.IntegerBalance, A._CryptoAddress_Object_CborSerializable, A.AccountBalance, A.BitcoinMultiSigBase, A._BitcoinMultiSigSignerDetais_Object_Equatable, A._BitcoinMultiSignatureAddress_Object_CborSerializable, A._TronMultiSigSignerDetais_Object_Equatable, A._TronMultiSignatureAddress_Object_Equatable, A._RippleMultiSigSignerDetais_Object_Equatable, A._RippleMultiSignatureAddress_Object_Equatable, A._Chain_Object_CborSerializable, A._BitcoinContact_Object_Equatable, A._CardanoContact_Object_Equatable, A._CosmosContact_Object_Equatable, A._EthereumContract_Object_Equatable, A._SolanaContact_Object_Equatable, A._SubstrateContact_Object_Equatable, A._TonContact_Object_Equatable, A._TronContact_Object_Equatable, A._RippleContact_Object_Equatable, A._WalletNetwork_Object_Equatable, A._NetworkCoinParams_Object_CborSerializable, A._CardanoAddrDetails_Object_Equatable, A._CosmosNativeCoin_Object_CborSerializable, A.CosmosNetworkTypes, A.EIP712Domain, A.SolanaWeb3TransactionResponse, A._TronAccountResourceInfo_Object_CborSerializable, A._TronAccountInfo_Object_CborSerializable, A._AccountPermission_Object_CborSerializable, A._PermissionKeys_Object_CborSerializable, A._FrozenSupply_Object_CborSerializable, A._FrozenV2_Object_CborSerializable, A._UnfrozenV2_Object_CborSerializable, A._AssetV2_Object_CborSerializable, A._FreeAssetNetUsageV2_Object_CborSerializable, A._TronAccountResource_Object_CborSerializable, A._RippleNFToken_Object_Equatable, A._ETHERC20Token_Object_Equatable, A._RippleIssueToken_Object_Equatable, A._TonJettonToken_Object_Equatable, A._SolanaSPLToken_Object_Equatable, A._TronTRC10Token_Object_Equatable, A._TronTRC20Token_Object_Equatable, A._CoingeckoCoin_Object_CborSerializable, A._Token_Object_CborSerializable, A._ChainsHandler_Object_CborSerializable, A.Web3RequestException, A._Web3MessageCore_Object_CborSerializable, A._Web3EncryptedMessage_Object_CborSerializable, A.Web3RequestMethods, A._Web3AccountAcitvity_Object_CborSerializable, A._Web3APPAuthentication_Object_CborSerializable, A._Web3ChainAccount_Object_CborSerializable, A._Web3Chain_Object_CborSerializable, A._Web3SolanaSendTransactionOptions_Object_CborSerializable, A._Web3SolanaSendTransactionData_Object_CborSerializable, A._ADAAddress_Object_ADASerialization, A._FixedBytes_Object_ADASerialization, A._StakeCredType_Object_ADASerialization, A.BlockforestRequestParam, A.BlockforestRequestDetails, A.BlockfrostError, A.BlockforestProvider, A.ADASerialization, A.SolidityAddress, A.BlockTagOrNumber, A.ETHRequestDetails, A.LookupBlockRequest, A.EthereumMethods, A.EVMRPC, A.ETHTransactionType, A.SolAddress, A.SolanaPublicKey, A.AddressTableLookup, A.CompiledInstruction, A.MessageHeader, A.SolanaRequestDetails, A.LoockupLedgerRequest, A.SolanaRPC, A.Message, A.MessageV0, A.SolanaTransaction, A.AbiParameter, A.EncoderResult, A.EIP712Version, A.Eip712TypeDetails, A.Eip712TypedData, A.Eip712TypedDataV1, A.EIP712Legacy, A.AddressCoder, A.ArrayCoder, A.BooleanCoder, A.BytesCoder, A.FunctionCoder, A.NumbersCoder, A.StringCoder, A.TupleCoder, A.TronProtocolBufferImpl, A.AccountType, A.PermissionType, A.ResourceCode, A.TransactionContractType, A.SmartContractAbiEntryType, A.SmartContractAbiStateMutabilityType, A.ProtocolBufferDecoderResult, A._Result, A.TronRequestDetails, A.TronHTTPMethods, A.TronProvider, A.Context, A.Style, A.ParsedPath, A.PathException, A.SubstrateAddress, A._MetadataApi_Object_MetadataApiInterface, A.SubstrateSerialization, A.MetadataApiInterface, A.LatestMetadataInterface, A.PrimitiveTypes, A.Si1TypeDefsIndexesConst, A.StorageHasherV11Options, A.SubstrateRequestDetails, A.SubstrateRPCService, A.SubstrateRPC, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StringScanner, A.TonAddress, A.WalletVersion, A.TonApiType, A.TonApiRequestParam, A.TonRequestInfo, A._BlockCurrencyCollectionResponse_Object_JsonSerialization, A._BlockCurrencyCollectionOtherItemResponse_Object_JsonSerialization, A._BlockValueFlowResponse_Object_JsonSerialization, A._BlockchainBlockResponse_Object_JsonSerialization, A.TonProvider, A.JsonSerialization0, A.EventStreamProvider, A._EventStreamSubscription, A.RPCRequestDetails, A.LookupByLedgerRequest, A.XRPLedgerState, A.XRPLedgerStateDetails, A.XRPLastClose, A.XRPLedgerStateAccounting, A.XRPLedgerStateAccountingDuration, A.XRPLedgerValidatedLedger, A.XRPLRpc, A.XRPAddress, A.XRPLAddressCodecException, A.MessageCompleterHandler, A.MessageCompleter, A.PageRequestCompeleter, A.ProxyMethodHandler, A._PageMessage_Object_CborSerializable, A._JSWalletMessage_Object_CborSerializable, A.EthereumAccountsChanged, A.ProviderConnectInfo, A.ChainWeb3State, A.JSNetworkHandler, A._JSPageRequest_Object_CborSerializable, A.JSPageController, A.PageNetworkController, A.JSSolanaPublicKey, A.SolanaAccountsChanged, A.ClientSolanaTransactionMessage, A.SolanaProviderConnectInfo, A.JSTronAddress, A.TronWebNodeInfo, A.TronAccountsChanged, A.JSWalletHandler]); + _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, J.ArrayIterator, A.Stream, A.CastStreamSubscription, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A.Symbol, A._Record, A.MapView, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A._SyncStarIterator, A.AsyncError, A.TimeoutException, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._Zone, A._HashMapKeyIterator, A.SetBase, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._MapBaseValueIterator, A._UnmodifiableMapMixin, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A._BigIntImpl, A._BigIntClassic, A.DateTime, A.Duration, A._Enum, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.MapEntry, A.Null, A._StringStackTrace, A.RuneIterator, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.Expando, A._FilterStatus, A.TlsException, A.SocketDirection, A.RawSocketEvent, A.NullRejectionException, A._JSRandom, A._JSSecureRandom, A.Endian, A.PubKeyAddressType, A.P2pkhAddressType, A.P2shAddressType, A.SegwitAddresType, A.LegacyAddress, A.BitcoinNetworkAddress, A.SegwitAddress, A.Script, A.ECPublic, A.BlockchainUtilsException, A.BitcoinSVNetwork, A.BitcoinNetwork, A.LitecoinNetwork, A.DashNetwork, A.DogecoinNetwork, A.BitcoinCashNetwork, A.PepeNetwork, A.ApiProvider, A.ElectrumApiProvider, A.ElectrumRequest, A.APIConfig, A.ElectrumRequestDetails, A.Base58ChecksumError, A.Bech32ChecksumError, A.ADAAddressType, A.ADAByronAddrTypes, A.ADAByronAddrAttrs, A.ADAByronAddrPayload, A.ADAByronAddr, A.AdaByronIcarusAddrEncoder, A.AdaByronLegacyAddrEncoder, A.Pointer, A.AdaStakeCredType, A.AdaStakeCredential, A.AdaShelleyAddrEncoder, A.AdaShelleyStakingAddrEncoder, A.AdaGenericAddrDecoderResult, A.AdaGenericAddrDecoder, A.ADANetwork, A.AlgoAddrEncoder, A.AptosAddrEncoder, A.AtomAddrEncoder, A.AtomNist256P1AddrEncoder, A.AvaxPChainAddrEncoder, A.AvaxXChainAddrEncoder, A.EgldAddrEncoder, A.BlockchainAddressEncoder, A.EosAddrEncoder, A.ErgoNetworkTypes, A.ErgoP2PKHAddrEncoder, A.EthAddrDecoder, A.EthAddrEncoder, A.AddressConverterException, A.FilSecp256k1AddrEncoder, A.IcxAddrEncoder, A.InjAddrEncoder, A.NanoAddrEncoder, A.NearAddrEncoder, A.NeoAddrEncoder, A.OkexAddrEncoder, A.OneAddrEncoder, A.P2PKHAddrEncoder, A.BchP2PKHAddrEncoder, A.P2SHAddrEncoder, A.BchP2SHAddrEncoder, A.P2TRAddrEncoder, A.P2WPKHAddrEncoder, A.SolAddrDecoder, A.SolAddrEncoder, A.SubstrateEd25519AddrEncoder, A.SubstrateSr25519AddrEncoder, A.SubstrateSecp256k1AddrEncoder, A.DecodeAddressResult, A.FriendlyAddressFlags, A.TonAddrDecoder, A.TonAddrEncoder, A.TrxAddrDecoder, A.TrxAddrEncoder, A.XlmAddrTypes, A.XlmAddrEncoder, A.XRPXAddressDecodeResult, A.XrpAddrEncoder, A.XtzAddrPrefixes, A.XtzAddrEncoder, A.ZilAddrEncoder, A.Bip32PathError, A.Bip32ChainCode, A.Bip32FingerPrint, A.Bip32KeyIndex, A.Bip32KeyData, A.Bip32KeyNetVersions, A.Bip32KeyBase, A.Bip32Path, A.BipCoins, A.BipProposal, A.BipCoinConfig, A.CipProposal, A.CoinConf, A.CoinParams, A.CoinNames, A.EllipticCurveTypes, A.Ed25519Blake2bPublicKey, A.Ed25519PublicKey, A.Ed25519KholawPublicKey, A.Ed25519MoneroPublicKey, A.Nist256p1PublicKey, A.Secp256k1PublicKeyEcdsa, A.Sr25519PublicKey, A.MoneroCoinConf, A.MoneroCoins, A.MoneroProposal, A.MoneroKeyError, A.MoneroPublicKey, A.SubstrateCoinConf, A.SubstrateCoins, A.SubstratePropoosal, A.SubstrateScaleEncoderBase, A.CborBase64Types, A.CborBaseUrlValue, A.CborBigFloatValue, A.CborBigIntValue, A.CborBoleanValue, A.CborBytesValue, A.CborDynamicBytesValue, A.CborTagValue, A._CborDate, A.CborDecimalFracValue, A.CborFloatValue, A.CborIntValue, A.CborSafeIntValue, A.CborListValue, A.CborMapValue, A.CborMimeValue, A.CborNullValue, A.CborUndefinedValue, A.CborRegxpValue, A.CborSetValue, A.CborString, A.CborUriValue, A.CborBytesTracker, A.FloatLength, A.FloatUtils, A.AES, A.AESLib, A.Curve, A.ECDSAPublicKey, A.EDDSAPublicKey, A.AbstractPoint, A.SquareRootError, A.JacobiError, A.ChaCha20Poly1305, A.CTR, A.BLAKE2b, A._Keccack, A._RIPEMD, A.SHA256, A.Poly1305, A.FortunaPRNG, A.SchnorrkelPublicKey, A.ArgumentException, A.MessageException, A.RPCError, A._Hex, A.LayoutByteReader, A.LayoutByteWriter, A.Layout, A.LayoutDecodeResult, A.LayoutException, A.SolanaVerifier, A.SS58ChecksumError, A.DynamicByteTracker, A.BigRational, A.Tuple, A.CanonicalizedMap, A.CosmosBaseAddress, A.TendermintRequestParam, A.TendermintRequestDetails, A.TendermintProvider, A.BaseClient, A.BaseRequest, A.BaseResponse, A.ClientException, A.MediaType, A.MRTNativePluginException, A.WalletEvent, A.PlatformInterface, A.ApiProviderException, A.WalletException, A.Equatable, A._LiveListenable_Object__LiveListenable, A._LiveListenable, A._APPImage_Object_CborSerializable, A.CborSerializable, A.JsonSerialization, A.SynchronizedLock, A.MethodResult, A.WebsocketWeb, A.CustomProposal, A._AddressDerivationIndex_Object_CborSerializable, A.CryptoWokerImpl, A.IsolateCryptoWoker, A.NetworkType, A.BaseRepository, A._NetworkClient_Object_BaseRepository, A.LookupBlockRequest0, A.SubstrateRepository, A.TVMRequestParam, A._APIProvider_Object_Equatable, A.APIServiceTracker, A.HTTPService, A.BaseSocketService, A._ProviderAuth_Object_CborSerializable, A.ApiRequest, A.SocketRequestCompeleter, A.EthereumSubscribeResult, A.DecimalBalance, A.IntegerBalance, A._CryptoAddress_Object_CborSerializable, A.AccountBalance, A.BitcoinMultiSigBase, A._BitcoinMultiSigSignerDetais_Object_Equatable, A._BitcoinMultiSignatureAddress_Object_CborSerializable, A._TronMultiSigSignerDetais_Object_Equatable, A._TronMultiSignatureAddress_Object_Equatable, A._RippleMultiSigSignerDetais_Object_Equatable, A._RippleMultiSignatureAddress_Object_Equatable, A._Chain_Object_CborSerializable, A._BitcoinContact_Object_Equatable, A._CardanoContact_Object_Equatable, A._CosmosContact_Object_Equatable, A._EthereumContract_Object_Equatable, A._SolanaContact_Object_Equatable, A._SubstrateContact_Object_Equatable, A._TonContact_Object_Equatable, A._TronContact_Object_Equatable, A._RippleContact_Object_Equatable, A._WalletNetwork_Object_Equatable, A._NetworkCoinParams_Object_CborSerializable, A._CardanoAddrDetails_Object_Equatable, A._CosmosNativeCoin_Object_CborSerializable, A.CosmosNetworkTypes, A.EIP712Domain, A.SolanaWeb3TransactionResponse, A._TonAccountContext_Object_CborSerializable, A._TronAccountResourceInfo_Object_CborSerializable, A._TronAccountInfo_Object_CborSerializable, A._AccountPermission_Object_CborSerializable, A._PermissionKeys_Object_CborSerializable, A._FrozenSupply_Object_CborSerializable, A._FrozenV2_Object_CborSerializable, A._UnfrozenV2_Object_CborSerializable, A._AssetV2_Object_CborSerializable, A._FreeAssetNetUsageV2_Object_CborSerializable, A._TronAccountResource_Object_CborSerializable, A._RippleNFToken_Object_Equatable, A._ETHERC20Token_Object_Equatable, A._RippleIssueToken_Object_Equatable, A._TonJettonToken_Object_Equatable, A._SolanaSPLToken_Object_Equatable, A._TronTRC10Token_Object_Equatable, A._TronTRC20Token_Object_Equatable, A._CoingeckoCoin_Object_CborSerializable, A._Token_Object_CborSerializable, A._ChainsHandler_Object_CborSerializable, A.Web3RequestException, A._Web3MessageCore_Object_CborSerializable, A._Web3EncryptedMessage_Object_CborSerializable, A.Web3RequestMethods, A._Web3AccountAcitvity_Object_CborSerializable, A._Web3APPAuthentication_Object_CborSerializable, A._Web3ChainAccount_Object_CborSerializable, A._Web3Chain_Object_CborSerializable, A.Web3SolanaSignMessageResponse, A._Web3SolanaSendTransactionOptions_Object_CborSerializable, A._Web3SolanaSendTransactionData_Object_CborSerializable, A._Web3TonTransactionMessage_Object_CborSerializable, A._ADAAddress_Object_ADASerialization, A._FixedBytes_Object_ADASerialization, A._StakeCredType_Object_ADASerialization, A.BlockforestRequestParam, A.BlockforestRequestDetails, A.BlockfrostError, A.BlockforestProvider, A.ADASerialization, A.SolidityAddress, A.BlockTagOrNumber, A.ETHRequestDetails, A.LookupBlockRequest, A.EthereumMethods, A.EVMRPC, A.ETHTransactionType, A.SolAddress, A.SolanaPublicKey, A.AddressTableLookup, A.CompiledInstruction, A.MessageHeader, A.SolanaRequestDetails, A.LoockupLedgerRequest, A.SolanaRPC, A.Message, A.MessageV0, A.SolanaTransaction, A.AbiParameter, A.EncoderResult, A.EIP712Version, A.Eip712TypeDetails, A.Eip712TypedData, A.Eip712TypedDataV1, A.EIP712Legacy, A.AddressCoder, A.ArrayCoder, A.BooleanCoder, A.BytesCoder, A.FunctionCoder, A.NumbersCoder, A.StringCoder, A.TupleCoder, A.TronProtocolBufferImpl, A.AccountType, A.PermissionType, A.ResourceCode, A.TransactionContractType, A.SmartContractAbiEntryType, A.SmartContractAbiStateMutabilityType, A.ProtocolBufferDecoderResult, A._Result, A.TronRequestDetails, A.TronHTTPMethods, A.TronProvider, A.Context, A.Style, A.ParsedPath, A.PathException, A.SubstrateAddress, A._MetadataApi_Object_MetadataApiInterface, A.SubstrateSerialization, A.MetadataApiInterface, A.LatestMetadataInterface, A.PrimitiveTypes, A.Si1TypeDefsIndexesConst, A.StorageHasherV11Options, A.SubstrateRequestDetails, A.SubstrateRPCService, A.SubstrateRPC, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StringScanner, A.TonAddress, A.BitBuilder, A.BitReader, A.BitString, A.Builder, A.Cell, A.CellType, A.Slice, A.ExoticMerkleProof, A.ExoticMerkleUpdate, A.Pruned, A.ExoticPruned, A.LevelMask, A.ResolvedCellResult, A.CellTopoloigicalSort, A._ParseBocResult, A._ReadCellResult, A.TonChain, A._TonContract_Object_ContractProvider, A.ContractProvider, A.WalletVersion, A.VerionedProviderImpl, A._TonSerialization_Object_JsonSerialization, A.VersionedWalletState, A.TonPublicKey, A.Dictionary, A.DictionaryKey, A.DictionaryValue, A._Node, A._Edge, A.TonApiType, A.TonApiRequestParam, A.TonRequestInfo, A._BlockCurrencyCollectionResponse_Object_JsonSerialization, A._BlockCurrencyCollectionOtherItemResponse_Object_JsonSerialization, A._BlockValueFlowResponse_Object_JsonSerialization, A._BlockchainBlockResponse_Object_JsonSerialization, A.TonProvider, A.JsonSerialization0, A.EventStreamProvider, A._EventStreamSubscription, A.RPCRequestDetails, A.LookupByLedgerRequest, A.XRPLedgerState, A.XRPLedgerStateDetails, A.XRPLastClose, A.XRPLedgerStateAccounting, A.XRPLedgerStateAccountingDuration, A.XRPLedgerValidatedLedger, A.XRPLRpc, A.XRPAddress, A.XRPLAddressCodecException, A.MessageCompleterHandler, A.MessageCompleter, A.PageRequestCompeleter, A.ProxyMethodHandler, A.EthereumAccountsChanged, A.ProviderConnectInfo, A.ChainWeb3State, A.JSNetworkHandler, A.JSPageController, A.PageNetworkController, A.JSSolanaSignTransactionResponse, A.JSSolanaPublicKey, A.SolanaAccountsChanged, A.SolanaProviderConnectInfo, A.TonAccountsChanged, A.TonChainChanged, A.JSTronAddress, A.TronWebNodeInfo, A.TronAccountsChanged, A.TronChainChanged, A.JSWalletHandler]); _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JavaScriptBigInt, J.JavaScriptSymbol, J.JSNumber, J.JSString]); _inheritMany(J.JavaScriptObject, [J.LegacyJavaScriptObject, J.JSArray, A.NativeByteBuffer, A.NativeTypedData]); _inheritMany(J.LegacyJavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]); @@ -60266,14 +64106,14 @@ _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]); _inherit(A._EfficientLengthCastIterable, A.CastIterable); _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin); - _inheritMany(A.Closure, [A.Closure2Args, A.CastMap_entries_closure, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.JsLinkedHashMap_values_closure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__chainForeignFuture_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._RootZone_bindUnaryCallbackGuarded_closure, A._HashMap_values_closure, A._LinkedCustomHashMap_closure, A.MapBase_entries_closure, A._JsonMap_values_closure, A._BigIntImpl_hashCode_finish, A.DateTime_parse_parseIntOrZero, A.DateTime_parse_parseMilliAndMicroseconds, A._createTables_setChars, A._createTables_setRange, A.SecureSocket_connect_closure, A.RawSecureSocket_connect_closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.BitcoinAddressType_fromValue_closure, A.BasedUtxoNetwork_fromName_closure, A.ElectrumRequest_toRequest_closure, A._BchBech32Utils_hrpExpand_closure, A.Bech32EncoderBase_encodeBech32_closure, A.Bech32DecoderBase_decodeBech32_closure, A.Bech32DecoderBase_decodeBech32_closure0, A.Bech32DecoderBase_decodeBech32_closure1, A.ADAAddressType_fromHeader_closure, A.ADAByronAddrTypes_ADAByronAddrTypes$fromCbor_closure, A.ADANetwork_fromTag_closure, A.ADANetwork_fromProtocolMagic_closure, A.EthAddrUtils__checksumEncode_closure, A.Bip32PathParser_parse_closure, A.Bip32PathParser__parseElem_closure, A.Bip44Coins_fromName_closure, A.Bip44Conf_akashNetwork_closure, A.Bip44Conf_algorand_closure, A.Bip44Conf_aptos_closure, A.Bip44Conf_avaxCChain_closure, A.Bip44Conf_avaxPChain_closure, A.Bip44Conf_avaxXChain_closure, A.Bip44Conf_axelar_closure, A.Bip44Conf_bandProtocol_closure, A.Bip44Conf_binanceChain_closure, A.Bip44Conf_binanceSmartChain_closure, A.Bip44Conf_bitcoinMainNet_closure, A.Bip44Conf_bitcoinTestNet_closure, A.Bip44Conf_bitcoinCashMainNet_closure, A.Bip44Conf_bitcoinCashTestNet_closure, A.Bip44Conf_bitcoinCashSlpMainNet_closure, A.Bip44Conf_bitcoinCashSlpTestNet_closure, A.Bip44Conf_bitcoinSvMainNet_closure, A.Bip44Conf_bitcoinSvTestNet_closure, A.Bip44Conf_cardanoByronIcarus_closure, A.Bip44Conf_cardanoByronLedger_closure, A.Bip44Conf_cardanoByronIcarusTestnet_closure, A.Bip44Conf_cardanoByronLedgerTestnet_closure, A.Bip44Conf_celo_closure, A.Bip44Conf_certik_closure, A.Bip44Conf_chihuahua_closure, A.Bip44Conf_cosmos_closure, A.Bip44Conf_cosmosTestnet_closure, A.Bip44Conf_cosmosNist256p1_closure, A.Bip44Conf_cosmosTestnetNist256p1_closure, A.Bip44Conf_dashMainNet_closure, A.Bip44Conf_dashTestNet_closure, A.Bip44Conf_dogecoinMainNet_closure, A.Bip44Conf_dogecoinTestNet_closure, A.Bip44Conf_pepeMainnet_closure, A.Bip44Conf_pepeTestnet_closure, A.Bip44Conf_ecashMainNet_closure, A.Bip44Conf_ecashTestNet_closure, A.Bip44Conf_elrond_closure, A.Bip44Conf_eos_closure, A.Bip44Conf_ergoMainNet_closure, A.Bip44Conf_ergoTestNet_closure, A.Bip44Conf_ethereum_closure, A.Bip44Conf_ethereumTestnet_closure, A.Bip44Conf_ethereumClassic_closure, A.Bip44Conf_fantomOpera_closure, A.Bip44Conf_filecoin_closure, A.Bip44Conf_harmonyOneMetamask_closure, A.Bip44Conf_harmonyOneEth_closure, A.Bip44Conf_harmonyOneAtom_closure, A.Bip44Conf_huobiChain_closure, A.Bip44Conf_icon_closure, A.Bip44Conf_injective_closure, A.Bip44Conf_irisNet_closure, A.Bip44Conf_kava_closure, A.Bip44Conf_kusamaEd25519Slip_closure, A.Bip44Conf_kusamaTestnetEd25519Slip_closure, A.Bip44Conf_litecoinMainNet_closure, A.Bip44Conf_litecoinTestNet_closure, A.Bip44Conf_moneroEd25519Slip_closure, A.Bip44Conf_moneroSecp256k1_closure, A.Bip44Conf_nano_closure, A.Bip44Conf_nearProtocol_closure, A.Bip44Conf_neo_closure, A.Bip44Conf_nineChroniclesGold_closure, A.Bip44Conf_okexChainEth_closure, A.Bip44Conf_okexChainAtom_closure, A.Bip44Conf_okexChainAtomOld_closure, A.Bip44Conf_ontology_closure, A.Bip44Conf_osmosis_closure, A.Bip44Conf_piNetwork_closure, A.Bip44Conf_polkadotEd25519Slip_closure, A.Bip44Conf_polkadotTestnetEd25519Slip_closure, A.Bip44Conf_polygon_closure, A.Bip44Conf_ripple_closure, A.Bip44Conf_rippleTestnet_closure, A.Bip44Conf_rippleEd25519_closure, A.Bip44Conf_rippleTestnetEd25519_closure, A.Bip44Conf_secretNetworkOld_closure, A.Bip44Conf_secretNetworkNew_closure, A.Bip44Conf_solana_closure, A.Bip44Conf_solanaTestnet_closure, A.Bip44Conf_stellar_closure, A.Bip44Conf_terra_closure, A.Bip44Conf_tezos_closure, A.Bip44Conf_theta_closure, A.Bip44Conf_tron_closure, A.Bip44Conf_tronTestnet_closure, A.Bip44Conf_vechain_closure, A.Bip44Conf_verge_closure, A.Bip44Conf_zcashMainNet_closure, A.Bip44Conf_zcashTestNet_closure, A.Bip44Conf_zilliqa_closure, A.Bip44Conf_tonMainnet_closure, A.Bip44Conf_tonTestnet_closure, A.Bip49Coins_fromName_closure, A.Bip49Conf_dashMainNet_closure, A.Bip49Conf_dashTestNet_closure, A.Bip49Conf_dogecoinMainNet_closure, A.Bip49Conf_dogecoinTestNet_closure, A.Bip49Conf_litecoinMainNet_closure, A.Bip49Conf_litecoinTestNet_closure, A.Bip49Conf_zcashMainNet_closure, A.Bip49Conf_zcashTestNet_closure, A.Bip49Conf_bitcoinMainNet_closure, A.Bip49Conf_bitcoinTestNet_closure, A.Bip49Conf_bitcoinSvMainNet_closure, A.Bip49Conf_bitcoinSvTestNet_closure, A.Bip49Conf_bitcoinCashMainNet_closure, A.Bip49Conf_bitcoinCashTestNet_closure, A.Bip49Conf_bitcoinCashSlpMainNet_closure, A.Bip49Conf_bitcoinCashSlpTestNet_closure, A.Bip49Conf_ecashMainNet_closure, A.Bip49Conf_ecashTestNet_closure, A.Bip49Conf_pepeMainnet_closure, A.Bip49Conf_pepeTestnet_closure, A.Bip84Coins_fromName_closure, A.Bip84Conf_bitcoinMainNet_closure, A.Bip84Conf_bitcoinTestNet_closure, A.Bip84Conf_litecoinMainNet_closure, A.Bip84Conf_litecoinTestNet_closure, A.Bip86Coins_fromName_closure, A.Bip86Conf_bitcoinMainNet_closure, A.Bip86Conf_bitcoinTestNet_closure, A.CoinProposal_fromName_closure, A.Cip1852Coins_fromName_closure, A.Cip1852Conf_cardanoIcarusMainNet_closure, A.Cip1852Conf_cardanoIcarusTestNet_closure, A.Cip1852Conf_cardanoLedgerMainNet_closure, A.Cip1852Conf_cardanoLedgerTestNet_closure, A.EllipticCurveTypes_fromName_closure, A.MoneroCoins_fromName_closure, A.SubstrateCoins_fromName_closure, A.SubstrateConf_acalaEd25519_closure, A.SubstrateConf_acalaSecp256k1_closure, A.SubstrateConf_acalaSr25519_closure, A.SubstrateConf_bifrostEd25519_closure, A.SubstrateConf_bifrostSecp256k1_closure, A.SubstrateConf_bifrostSr25519_closure, A.SubstrateConf_chainXEd25519_closure, A.SubstrateConf_chainXSecp256k1_closure, A.SubstrateConf_chainXSr25519_closure, A.SubstrateConf_edgewareEd25519_closure, A.SubstrateConf_edgewareSecp256k1_closure, A.SubstrateConf_edgewareSr25519_closure, A.SubstrateConf_genericEd25519_closure, A.SubstrateConf_genericSecp256k1_closure, A.SubstrateConf_genericSr25519_closure, A.SubstrateConf_karuraEd25519_closure, A.SubstrateConf_karuraSecp256k1_closure, A.SubstrateConf_karuraSr25519_closure, A.SubstrateConf_kusamaEd25519_closure, A.SubstrateConf_kusamaSecp256k1_closure, A.SubstrateConf_kusamaSr25519_closure, A.SubstrateConf_moonbeamEd25519_closure, A.SubstrateConf_moonbeamSecp256k1_closure, A.SubstrateConf_moonbeamSr25519_closure, A.SubstrateConf_moonriverEd25519_closure, A.SubstrateConf_moonriverSecp256k1_closure, A.SubstrateConf_moonriverSr25519_closure, A.SubstrateConf_phalaEd25519_closure, A.SubstrateConf_phalaSecp256k1_closure, A.SubstrateConf_phalaSr25519_closure, A.SubstrateConf_plasmEd25519_closure, A.SubstrateConf_plasmSecp256k1_closure, A.SubstrateConf_plasmSr25519_closure, A.SubstrateConf_polkadotEd25519_closure, A.SubstrateConf_polkadotSecp256k1_closure, A.SubstrateConf_polkadotSr25519_closure, A.SubstrateConf_soraEd25519_closure, A.SubstrateConf_soraSecp256k1_closure, A.SubstrateConf_soraSr25519_closure, A.SubstrateConf_stafiEd25519_closure, A.SubstrateConf_stafiSecp256k1_closure, A.SubstrateConf_stafiSr25519_closure, A.CborObject_CborObject$fromDynamic_closure, A.CborUtils__decodeUtf8String_closure, A.CborUtils__toStringObject_closure, A.CborUtils__toStringObject_closure0, A.CborUtils__decodeBytesString_closure, A.AESLib_initialize__rot24, A.QuickCrypto__generateRandom_closure, A.LayoutConst_rustEnum_closure1, A.LayoutConst_rustEnum_closure0, A.LayoutConst_compactString_closure0, A.LayoutConst_compactString_closure, A.LayoutConst_compactMap_closure0, A.LayoutConst_compactMap_closure, A.LayoutConst_array_closure0, A.LayoutConst_array_closure, A.LayoutConst_compactVec_closure, A.LayoutConst_compactVec_closure0, A.StructLayout_StructLayout_closure, A.Union_defaultGetSourceVariant_closure, A.LayoutException_toString_closure, A.BytesUtils_toBytes_closure, A.UUID_generateUUIDv4_closure, A.UUID_generateUUIDv4_closure0, A.CanonicalizedMap_entries_closure, A.CanonicalizedMap_keys_closure, A.CanonicalizedMap_values_closure, A.TendermintProvider_request_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A.BrowserClient_send_closure0, A.ByteStream_toBytes_closure, A.CaseInsensitiveMap$from_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.WalletEventTypes_fromName_closure, A.JSWebSocket_constructor_create_closure, A.WebEventStream_stream_closure, A.ContentType_fromValue_closure, A.ExtractCborMap_generateMap_closure, A.SynchronizedLock_synchronized_closure, A.MethodUtils_call_closure, A.StrUtils_toSnakeCase_closure, A.WebsocketWeb$__closure, A.WebsocketWeb$__closure0, A.WebsocketWeb$__closure1, A.WebsocketWeb_connect_closure, A.CustomCoins_fromName_closure, A.CustomCurrencyConf_byronLegacy_closure, A.CustomCurrencyConf_byronLegacyTestnet_closure, A.AddressDerivationType_fromTag_closure, A.Bip32AddressIndex__toPath_closure, A.Bip32AddressIndex__toPath_closure0, A.SeedTypes_fromName_closure, A.NetworkType_fromTag_closure, A.NetworkType_fromName_closure, A.ProvidersConst_getDefaultService_closure, A.ProvidersConst_getDefaultService_closure0, A.BitcoinExplorerProviderType_fromName_closure, A.BitcoinExplorerAPIProvider_BitcoinExplorerAPIProvider$fromCborBytesOrObject_closure, A.ElectrumAPIProvider_ElectrumAPIProvider$fromCborBytesOrObject_closure, A.CardanoAPIProvider_CardanoAPIProvider$fromCborBytesOrObject_closure, A.CosmosAPIProvider_CosmosAPIProvider$fromCborBytesOrObject_closure, A.EthereumAPIProvider_EthereumAPIProvider$fromCborBytesOrObject_closure, A.RippleAPIProvider_RippleAPIProvider$fromCborBytesOrObject_closure, A.SolanaAPIProvider_SolanaAPIProvider$fromCborBytesOrObject_closure, A.SubstrateAPIProvider_SubstrateAPIProvider$fromCborBytesOrObject_closure, A.TonAPIProvider_TonAPIProvider$fromCborBytesOrObject_closure, A.TronAPIProvider_TronAPIProvider$fromCborBytesOrObject_closure, A.APIServiceTracker__checkStatus_closure, A.SSLService_connect___closure, A.WebSocketService__onClose_closure, A.ProviderAuthType_fromName_closure, A.ServiceProtocol_fromID_closure, A.BitcoinMultiSignatureAddress_BitcoinMultiSignatureAddress$fromCborBytesOrObject_closure, A.BitcoinMultiSignatureAddress_BitcoinMultiSignatureAddress$fromCborBytesOrObject_closure0, A.BitcoinMultiSignatureAddress_toP2shAddress_closure, A.ITonAddress_ITonAddress$fromCborBytesOrObject_closure, A.TronMultiSignatureAddress_TronMultiSignatureAddress$fromCborBytesOrObject_closure, A.ITronAddress_ITronAddress$fromCborBytesOrObject_closure, A.ITronAddress_ITronAddress$fromCborBytesOrObject_closure0, A.ITronMultisigAddress_ITronMultisigAddress$fromCborBytesOrObject_closure, A.ITronMultisigAddress_ITronMultisigAddress$fromCborBytesOrObject_closure0, A.RippleMultiSignatureAddress_RippleMultiSignatureAddress$fromCborBytesOrObject_closure, A.IXRPAddress_IXRPAddress$fromCborBytesOrObject_closure, A.IXRPAddress_IXRPAddress$fromCborBytesOrObject_closure0, A.IXRPMultisigAddress_IXRPMultisigAddress$fromCborBytesOrObject_closure, A.IXRPMultisigAddress_IXRPMultisigAddress$fromCborBytesOrObject_closure0, A.ADAChain_ADAChain$deserialize_closure0, A.BitcoinChain_BitcoinChain$deserialize_closure0, A.CosmosChain_CosmosChain$deserialize_closure0, A.EthereumChain_EthereumChain$deserialize_closure0, A.SolanaChain_SolanaChain$deserialize_closure0, A.SubstrateChain_SubstrateChain$deserialize_closure0, A.TonChain_TonChain$deserialize_closure0, A.TronChain_TronChain$deserialize_closure0, A.RippleChain_RippleChain$deserialize_closure0, A.WalletNetwork_getProvider_closure, A.WalletNetwork_getProvider_closure0, A.WalletNetwork_getProvider_closure1, A.BitcoinParams_BitcoinParams$fromCborBytesOrObject_closure, A.CardanoNetworkParams_CardanoNetworkParams$fromCborBytesOrObject_closure, A.CosmosNetworkParams_CosmosNetworkParams$fromCborBytesOrObject_closure, A.CosmosNetworkParams_CosmosNetworkParams$fromCborBytesOrObject_closure0, A.EthereumNetworkParams_EthereumNetworkParams$fromCborBytesOrObject_closure, A.RippleNetworkParams_RippleNetworkParams$fromCborBytesOrObject_closure, A.SolanaNetworkParams_SolanaNetworkParams$fromCborBytesOrObject_closure, A.SubstrateNetworkParams_SubstrateNetworkParams$fromCborBytesOrObject_closure, A.TonNetworkParams_TonNetworkParams$fromCborBytesOrObject_closure, A.TronNetworkParams_TronNetworkParams$fromCborBytesOrObject_closure, A.TronNetworkParams_TronNetworkParams$fromCborBytesOrObject_closure0, A.CosmosNetworkTypes_CosmosNetworkTypes$fromValue_closure, A.SolanaWeb3TransactionResponseType_fromName_closure, A.TronChainType_fromName_closure, A.TronChainType_fromId_closure, A.TronChainType_fromGenesis_closure, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure0, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure1, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure2, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure3, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure4, A.TronAccountInfo_TronAccountInfo$fromJson_closure, A.TronAccountInfo_TronAccountInfo$fromJson_closure0, A.TronAccountInfo_TronAccountInfo$fromJson_closure1, A.TronAccountInfo_TronAccountInfo$fromJson_closure2, A.TronAccountInfo_TronAccountInfo$fromJson_closure3, A.TronAccountInfo_TronAccountInfo$fromJson_closure4, A.AccountPermission_AccountPermission$fromCborBytesOrObject_closure, A.AccountPermission_AccountPermission$fromJson_closure, A.Token_Token$fromCborBytesOrObject_closure, A.ChainsHandler_ChainsHandler$deserialize_closure, A.Web3MessageTypes_fromTag_closure, A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure, A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure0, A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure1, A.Web3EthereumRequestMethods_fromId_closure, A.Web3EthereumRequestMethods_fromName_closure, A.Web3EthereumAddNewChain_toNewNetwork_closure, A.Web3EthreumPersonalSign_Web3EthreumPersonalSign$fromJson_closure, A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure, A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure0, A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure1, A.Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson_closure, A.Web3EthereumChain_Web3EthereumChain$deserialize_closure, A.Web3EthereumChain_Web3EthereumChain$deserialize_closure0, A.Web3EthereumChain_toCbor_closure, A.Web3EthereumChain_toCbor_closure0, A.Web3EthereumChain_currentChainAccounts_closure, A.Web3EthereumChain_currentChainAccounts_closure0, A.Web3GlobalRequestMethods_fromId_closure, A.Web3SolanaRequestMethods_fromId_closure, A.Web3SolanaRequestMethods_fromName_closure, A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure, A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure0, A.Web3SolanaSendTransaction_toCbor_closure, A.Web3SolanaSendTransaction_toJson_closure, A.Web3SolanaChain_Web3SolanaChain$deserialize_closure, A.Web3SolanaChain_Web3SolanaChain$deserialize_closure0, A.Web3SolanaChain_toCbor_closure, A.Web3SolanaChain_toCbor_closure0, A.Web3SolanaChain_currentChainAccounts_closure, A.Web3SolanaChain_currentChainAccounts_closure0, A.Web3SolanaChain_getPermission_closure, A.Web3TronRequestMethods_fromId_closure, A.Web3TronRequestMethods_fromName_closure, A.Web3TronChain_Web3TronChain$deserialize_closure, A.Web3TronChain_Web3TronChain$deserialize_closure0, A.Web3TronChain_toCbor_closure, A.Web3TronChain_toCbor_closure0, A.Web3TronChain_currentChainAccounts_closure, A.Web3TronChain_currentChainAccounts_closure0, A.Web3TronChain_getPermission_closure, A.BlockforestProvider_request_closure, A.ETHRPCRequest_toRequest_closure, A.ETHRPCRequest_toRequest_closure0, A.EthereumMethods_fromName_closure, A.ETHTransactionType_fromPrefix_closure, A.SolanaRPCRequest_toRequest_closure, A.SolanaTransaction_addSignature_closure, A.SolanaTransactionUtils_serializeV0_closure, A.SolanaTransactionUtils_serializeLegacy_closure, A.SolanaTransactionUtils_serializeLegacy_closure0, A.SolanaLayoutUtils_publicKey_closure0, A.SolanaLayoutUtils_publicKey_closure, A.AbiParameter_isDynamic_closure, A.EIP712Version_fromVersion_closure, A.EIP712Version_fromVersion__closure, A.Eip712TypedData_Eip712TypedData$fromJson_closure, A.Eip712TypedData_toJson__closure, A.EIP712Legacy_EIP712Legacy$fromJson_closure, A.EIP712Legacy_encode_closure, A.EIP712Legacy_encode_closure0, A.EIP712Legacy_encode_closure1, A.EIP712Legacy_toJson_closure, A._EIP712Utils_ensureCorrectValues_closure, A._EIP712Utils_eip712TypedDataV1ValueToJson_closure, A._EIP712Utils_getDependencies__closure, A._EIP712Utils_encodeValue_closure, A._EIP712Utils_encodeValue_closure0, A._EIP712Utils_encodeValue_closure1, A._EIP712Utils_abiEncode_closure, A._EIP712Utils_legacyV1encode_closure, A._EIP712Utils_getMethodSigature_closure, A._EIP712Utils_getMethodSigature__closure, A.ArrayCoder_abiEncode_closure, A.ArrayCoder_abiEncode_closure0, A.ArrayCoder_legacyEip712Encode_closure, A.ArrayCoder_legacyEip712Encode_closure0, A.TupleCoder_abiEncode_closure, A.TupleCoder_legacyEip712Encode_closure, A._ABIUtils_encodeDynamicParams_closure, A._ABIUtils_encodeDynamicParams_closure0, A._ABIUtils_encodeDynamicParams_closure1, A._ABIUtils_encodeDynamicParams_closure2, A.AccountCreateContract_AccountCreateContract$deserialize_closure, A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$fromJson_closure, A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$deserialize_closure, A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$deserialize_closure0, A.AccountPermissionUpdateContract_toJson_closure, A.AccountType_fromName_closure, A.AccountType_fromValue_closure, A.Authority_Authority$deserialize_closure, A.Permission_Permission$fromJson_closure, A.Permission_Permission$deserialize_closure, A.Permission_toJson_closure, A.PermissionType_fromName_closure, A.PermissionType_fromValue_closure, A.AssetIssueContract_AssetIssueContract$fromJson_closure, A.AssetIssueContract_AssetIssueContract$deserialize_closure, A.AssetIssueContract_toJson_closure, A.DelegateResourceContract_DelegateResourceContract$deserialize_closure, A.FreezeBalanceContract_FreezeBalanceContract$deserialize_closure, A.FreezeBalanceV2Contract_FreezeBalanceV2Contract$deserialize_closure, A.UnDelegateResourceContract_UnDelegateResourceContract$deserialize_closure, A.UnfreezeBalanceContract_UnfreezeBalanceContract$deserialize_closure, A.UnfreezeBalanceV2Contract_UnfreezeBalanceV2Contract$deserialize_closure, A.ResourceCode_fromName_closure0, A.ResourceCode_fromValue_closure0, A.TransactionContractType_findByName_closure, A.TransactionContractType_findByValue_closure, A.ShieldedTransferContract_ShieldedTransferContract$fromJson_closure, A.ShieldedTransferContract_ShieldedTransferContract$fromJson_closure0, A.ShieldedTransferContract_ShieldedTransferContract$deserialize_closure, A.ShieldedTransferContract_ShieldedTransferContract$deserialize_closure0, A.ShieldedTransferContract_toJson_closure, A.ShieldedTransferContract_toJson_closure0, A.SmartContractAbiEntryType_fromName_closure, A.SmartContractAbiEntryType_fromValue_closure, A.SmartContractAbiStateMutabilityType_fromName_closure, A.SmartContractAbiStateMutabilityType_fromValue_closure, A.SmartContract_SmartContract$deserialize_closure, A.SmartContract_SmartContract$deserialize_closure0, A.SmartContractABI_SmartContractABI$fromJson_closure, A.SmartContractABI_SmartContractABI$deserialize_closure, A.SmartContractABI_toJson_closure, A.SmartContractABIEntry_SmartContractABIEntry$fromJson_closure, A.SmartContractABIEntry_SmartContractABIEntry$fromJson_closure0, A.SmartContractABIEntry_SmartContractABIEntry$deserialize_closure, A.SmartContractABIEntry_SmartContractABIEntry$deserialize_closure0, A.SmartContractABIEntry_toJson_closure, A.SmartContractABIEntry_toJson_closure0, A.Transaction_Transaction$fromJson_closure, A.Transaction_closure, A.Transaction_toJson_closure, A.TransactionRaw_TransactionRaw$fromJson_closure, A.TransactionRaw_TransactionRaw$fromJson_closure0, A.TransactionRaw_TransactionRaw$deserialize_closure, A.TransactionRaw_TransactionRaw$deserialize_closure0, A.TransactionRaw_toJson_closure, A.TransactionRaw_toJson_closure0, A.VoteAssetContract_VoteAssetContract$fromJson_closure, A.VoteAssetContract_VoteAssetContract$deserialize_closure, A.VoteAssetContract_toJson_closure, A.VoteWitnessContract_VoteWitnessContract$fromJson_closure, A.VoteWitnessContract_VoteWitnessContract$deserialize_closure, A.VoteWitnessContract_toJson_closure, A.ProtocolBufferDecoder__decodeInt_closure, A.QuickProtocolBufferResults_getField_closure, A.QuickProtocolBufferResults_getField_closure0, A.QuickProtocolBufferResults_getResult_closure, A.QuickProtocolBufferResults_getResult_closure0, A.QuickProtocolBufferResults_getFields_closure, A.QuickProtocolBufferResults_getFields_closure0, A.QuickProtocolBufferResults_getMap_closure, A.TVMRequestParam_toRequest_closure0, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.MetadataException_toString_closure, A.PrimitiveTypes_fromValue_closure, A.Si0TypeDefPrimitive$deserializeJson_closure, A.Si1Type$deserializeJson_closure, A.Si1Type$deserializeJson_closure0, A.Si1Type_scaleJsonSerialize_closure, A.Si1TypeDefsIndexesConst_fromValue_closure, A.Si1TypeDefComposite$deserializeJson_closure, A.Si1TypeDefComposite_scaleJsonSerialize_closure, A.Si1TypeDefVariant$deserializeJson_closure, A.Si1TypeDefVariant_scaleJsonSerialize_closure, A.Si1Variant$deserializeJson_closure, A.Si1Variant_scaleJsonSerialize_closure, A.StorageHasherV11Options_fromValue_closure, A.ExtrinsicMetadataV14$deserializeJson_closure, A.ExtrinsicMetadataV14_scaleJsonSerialize_closure, A.MetadataV14$deserializeJson_closure, A.MetadataV14_scaleJsonSerialize_closure, A.PalletMetadataV14$deserializeJson_closure, A.PalletMetadataV14_scaleJsonSerialize_closure, A.PalletStorageMetadataV14$deserializeJson_closure, A.PalletStorageMetadataV14_scaleJsonSerialize_closure, A.PortableRegistryV14$deserializeJson_closure, A.PortableRegistryV14_scaleJsonSerialize_closure, A.StorageEntryTypeV14Map$deserializeJson_closure, A.StorageEntryTypeV14Map_scaleJsonSerialize_closure, A.ExtrinsicMetadataV15$deserializeJson_closure, A.ExtrinsicMetadataV15_scaleJsonSerialize_closure, A.MetadataV15$deserializeJson_closure, A.MetadataV15$deserializeJson_closure0, A.MetadataV15_scaleJsonSerialize_closure, A.MetadataV15_scaleJsonSerialize_closure0, A.RuntimeApiMetadataV15$deserializeJson_closure, A.RuntimeApiMetadataV15_scaleJsonSerialize_closure, A.RuntimeApiMethodMetadataV15$deserializeJson_closure, A.RuntimeApiMethodMetadataV15_scaleJsonSerialize_closure, A.StorageEntryModifierV9_fromValue_closure, A.SubstrateRPCRequest_toRequest_closure, A.SubstrateRPCRequest_toRequest_closure0, A.Highlighter$__closure, A.Highlighter$___closure, A.Highlighter$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.WalletVersion_WalletVersion$fromValue_closure, A.TonDartPluginException_toString_closure, A.TonDartPluginException_toString_closure0, A.TonApiType_TonApiType$fromValue_closure, A.TonApiRequestParam_toRequest_closure0, A.BlockCurrencyCollectionResponse_BlockCurrencyCollectionResponse$fromJson_closure, A.BlockCurrencyCollectionResponse_toJson_closure, A.TonProvider_request_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.EIP6963ProviderDetail_setup_closure, A.EthereumEventTypes_fromTag_closure, A.EthereumEventTypes_fromName_closure, A.EthereumWeb3State_EthereumWeb3State_closure, A.EthereumWeb3State_EthereumWeb3State_closure0, A.EthereumWeb3State_EthereumWeb3State_closure2, A.JSEthereumHandler_request_closure, A.JSEthereumHandler__parseTypedData_closure, A.WalletPromise_get_toPromise__closure, A.WalletPromise_get_toPromise__closure1, A.JSWalletMessageType_fromTag_closure, A.JSWalletResponseType_fromTag_closure, A.JSClientType_fromTag_closure, A.SolanaPageController__buildTransaction_closure, A.SolanaPageController__buildTransaction_closure0, A.SolanaPageController__buildTransaction_closure1, A.SolanaPageController__buildTransaction__closure, A.SolanaPageController__buildTransaction__closure0, A.SolanaPageController__buildTransaction__closure1, A.SolanaPageController_onEvent_closure, A.SolanaEventTypes_fromTag_closure, A.SolanaEventTypes_fromName_closure, A.SolanaWeb3State_SolanaWeb3State_closure, A.SolanaWeb3State_SolanaWeb3State_closure0, A.SolanaWeb3State_SolanaWeb3State_closure2, A.JSSolanaHandler__parseTransaction_closure, A.JSSolanaHandler__parseTransaction_closure0, A.TronEventTypes_fromTag_closure, A.TronEventTypes_fromName_closure, A.TronWeb3State_TronWeb3State_closure, A.TronWeb3State_TronWeb3State_closure0, A.TronWeb3State_TronWeb3State_closure2, A.JSTronHandler__parseTransaction_closure, A.JSWebviewTraget_fromName_closure, A.main_onActivation]); - _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__chainForeignFuture_closure0, A._Future_timeout_closure1, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A._Uri__makeQueryFromParameters_closure, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_error, A.Uri_parseIPv6Address_parseHex, A._Uri__makeQueryFromParametersDefault_writeParameter, A._Uri__makeQueryFromParametersDefault_closure, A._createTables_build, A.AESLib_initialize_mul, A.LayoutConst_rustEnum_closure, A.SequenceLayout_encode_closure, A.StructLayout_StructLayout_closure0, A.StructLayout_getSpan_closure, A.LayoutException_closure, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.CanonicalizedMap_map_closure, A.TendermintRequestParam_toRequest_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.SubstrateClient__loadApi_closure, A.Web3ExceptionMessage_toJson_closure, A.FixedBytes_hashCode_closure, A.Eip712TypedData_toJson_closure, A._EIP712Utils_getDependencies_closure, A.AccountCreateContract_toJson_closure, A.AccountId_toJson_closure, A.AccountPermissionUpdateContract_toJson_closure0, A.Permission_toJson_closure0, A.AssetIssueContract_toJson_closure0, A.TransferAssetContract_toJson_closure, A.UpdateAssetContract_toJson_closure, A.DelegateResourceContract_toJson_closure, A.FreezeBalanceV2Contract_toJson_closure, A.TransferContract_toJson_closure, A.UnDelegateResourceContract_toJson_closure, A.UnfreezeBalanceV2Contract_toJson_closure, A.ExchangeCreateContract_toJson_closure, A.ExchangeInjectContract_toJson_closure, A.ExchangeTransactionContract_toJson_closure, A.ExchangeWithdrawContract_toJson_closure, A.MarketCancelOrderContract_toJson_closure, A.MarketSellAssetContract_toJson_closure, A.ProposalApproveContract_toJson_closure, A.ProposalCreateContract_ProposalCreateContract$fromJson_closure, A.ProposalCreateContract_toJson_closure, A.ReceiveDescription_toJson_closure, A.ShieldedTransferContract_toJson_closure1, A.SpendDescription_toJson_closure, A.CreateSmartContract_toJson_closure, A.SmartContract_toJson_closure, A.SmartContractBABIEntryParam_toJson_closure, A.TriggerSmartContract_toJson_closure, A.UpdateEnergyLimitContract_toJson_closure, A.UpdateSettingContract_toJson_closure, A.TransactionContract_toJson_closure, A.TransactionRaw_toJson_closure1, A.VoteAssetContract_toJson_closure0, A.VoteWitnessContract_toJson_closure0, A.WitnessUpdateContract_toJson_closure, A.WitnessCreateContract_toJson_closure, A.TVMRequestParam_toRequest_closure, A.MetadataException_closure, A.Highlighter__collateLines_closure0, A.TonApiRequestParam_toRequest_closure, A.TonCenterPostRequestParam_toRequest_closure, A.XRPLedgerRequest_toRequest_closure, A.EthereumWeb3State_EthereumWeb3State_closure3, A.JSWalletError_constructor_fromJson_closure, A.WalletPromise_get_toPromise_closure, A.WalletPromise_get_toPromise__closure0, A.SolanaWeb3State_SolanaWeb3State_closure3, A.TronWeb3State_TronWeb3State_closure3]); + _inheritMany(A.Closure, [A.Closure2Args, A.CastMap_entries_closure, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.JsLinkedHashMap_values_closure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__chainForeignFuture_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._RootZone_bindUnaryCallbackGuarded_closure, A._HashMap_values_closure, A._LinkedCustomHashMap_closure, A.MapBase_entries_closure, A._JsonMap_values_closure, A._BigIntImpl_hashCode_finish, A.DateTime_parse_parseIntOrZero, A.DateTime_parse_parseMilliAndMicroseconds, A._createTables_setChars, A._createTables_setRange, A.SecureSocket_connect_closure, A.RawSecureSocket_connect_closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.BitcoinAddressType_fromValue_closure, A.BasedUtxoNetwork_fromName_closure, A.ElectrumRequest_toRequest_closure, A._BchBech32Utils_hrpExpand_closure, A.Bech32EncoderBase_encodeBech32_closure, A.Bech32DecoderBase_decodeBech32_closure, A.Bech32DecoderBase_decodeBech32_closure0, A.Bech32DecoderBase_decodeBech32_closure1, A.ADAAddressType_fromHeader_closure, A.ADAByronAddrTypes_ADAByronAddrTypes$fromCbor_closure, A.ADANetwork_fromTag_closure, A.ADANetwork_fromProtocolMagic_closure, A.EthAddrUtils__checksumEncode_closure, A.Bip32PathParser_parse_closure, A.Bip32PathParser__parseElem_closure, A.Bip44Coins_fromName_closure, A.Bip44Conf_akashNetwork_closure, A.Bip44Conf_algorand_closure, A.Bip44Conf_aptos_closure, A.Bip44Conf_avaxCChain_closure, A.Bip44Conf_avaxPChain_closure, A.Bip44Conf_avaxXChain_closure, A.Bip44Conf_axelar_closure, A.Bip44Conf_bandProtocol_closure, A.Bip44Conf_binanceChain_closure, A.Bip44Conf_binanceSmartChain_closure, A.Bip44Conf_bitcoinMainNet_closure, A.Bip44Conf_bitcoinTestNet_closure, A.Bip44Conf_bitcoinCashMainNet_closure, A.Bip44Conf_bitcoinCashTestNet_closure, A.Bip44Conf_bitcoinCashSlpMainNet_closure, A.Bip44Conf_bitcoinCashSlpTestNet_closure, A.Bip44Conf_bitcoinSvMainNet_closure, A.Bip44Conf_bitcoinSvTestNet_closure, A.Bip44Conf_cardanoByronIcarus_closure, A.Bip44Conf_cardanoByronLedger_closure, A.Bip44Conf_cardanoByronIcarusTestnet_closure, A.Bip44Conf_cardanoByronLedgerTestnet_closure, A.Bip44Conf_celo_closure, A.Bip44Conf_certik_closure, A.Bip44Conf_chihuahua_closure, A.Bip44Conf_cosmos_closure, A.Bip44Conf_cosmosTestnet_closure, A.Bip44Conf_cosmosNist256p1_closure, A.Bip44Conf_cosmosTestnetNist256p1_closure, A.Bip44Conf_dashMainNet_closure, A.Bip44Conf_dashTestNet_closure, A.Bip44Conf_dogecoinMainNet_closure, A.Bip44Conf_dogecoinTestNet_closure, A.Bip44Conf_pepeMainnet_closure, A.Bip44Conf_pepeTestnet_closure, A.Bip44Conf_ecashMainNet_closure, A.Bip44Conf_ecashTestNet_closure, A.Bip44Conf_elrond_closure, A.Bip44Conf_eos_closure, A.Bip44Conf_ergoMainNet_closure, A.Bip44Conf_ergoTestNet_closure, A.Bip44Conf_ethereum_closure, A.Bip44Conf_ethereumTestnet_closure, A.Bip44Conf_ethereumClassic_closure, A.Bip44Conf_fantomOpera_closure, A.Bip44Conf_filecoin_closure, A.Bip44Conf_harmonyOneMetamask_closure, A.Bip44Conf_harmonyOneEth_closure, A.Bip44Conf_harmonyOneAtom_closure, A.Bip44Conf_huobiChain_closure, A.Bip44Conf_icon_closure, A.Bip44Conf_injective_closure, A.Bip44Conf_irisNet_closure, A.Bip44Conf_kava_closure, A.Bip44Conf_kusamaEd25519Slip_closure, A.Bip44Conf_kusamaTestnetEd25519Slip_closure, A.Bip44Conf_litecoinMainNet_closure, A.Bip44Conf_litecoinTestNet_closure, A.Bip44Conf_moneroEd25519Slip_closure, A.Bip44Conf_moneroSecp256k1_closure, A.Bip44Conf_nano_closure, A.Bip44Conf_nearProtocol_closure, A.Bip44Conf_neo_closure, A.Bip44Conf_nineChroniclesGold_closure, A.Bip44Conf_okexChainEth_closure, A.Bip44Conf_okexChainAtom_closure, A.Bip44Conf_okexChainAtomOld_closure, A.Bip44Conf_ontology_closure, A.Bip44Conf_osmosis_closure, A.Bip44Conf_piNetwork_closure, A.Bip44Conf_polkadotEd25519Slip_closure, A.Bip44Conf_polkadotTestnetEd25519Slip_closure, A.Bip44Conf_polygon_closure, A.Bip44Conf_ripple_closure, A.Bip44Conf_rippleTestnet_closure, A.Bip44Conf_rippleEd25519_closure, A.Bip44Conf_rippleTestnetEd25519_closure, A.Bip44Conf_secretNetworkOld_closure, A.Bip44Conf_secretNetworkNew_closure, A.Bip44Conf_solana_closure, A.Bip44Conf_solanaTestnet_closure, A.Bip44Conf_stellar_closure, A.Bip44Conf_terra_closure, A.Bip44Conf_tezos_closure, A.Bip44Conf_theta_closure, A.Bip44Conf_tron_closure, A.Bip44Conf_tronTestnet_closure, A.Bip44Conf_vechain_closure, A.Bip44Conf_verge_closure, A.Bip44Conf_zcashMainNet_closure, A.Bip44Conf_zcashTestNet_closure, A.Bip44Conf_zilliqa_closure, A.Bip44Conf_tonMainnet_closure, A.Bip44Conf_tonTestnet_closure, A.Bip49Coins_fromName_closure, A.Bip49Conf_dashMainNet_closure, A.Bip49Conf_dashTestNet_closure, A.Bip49Conf_dogecoinMainNet_closure, A.Bip49Conf_dogecoinTestNet_closure, A.Bip49Conf_litecoinMainNet_closure, A.Bip49Conf_litecoinTestNet_closure, A.Bip49Conf_zcashMainNet_closure, A.Bip49Conf_zcashTestNet_closure, A.Bip49Conf_bitcoinMainNet_closure, A.Bip49Conf_bitcoinTestNet_closure, A.Bip49Conf_bitcoinSvMainNet_closure, A.Bip49Conf_bitcoinSvTestNet_closure, A.Bip49Conf_bitcoinCashMainNet_closure, A.Bip49Conf_bitcoinCashTestNet_closure, A.Bip49Conf_bitcoinCashSlpMainNet_closure, A.Bip49Conf_bitcoinCashSlpTestNet_closure, A.Bip49Conf_ecashMainNet_closure, A.Bip49Conf_ecashTestNet_closure, A.Bip49Conf_pepeMainnet_closure, A.Bip49Conf_pepeTestnet_closure, A.Bip84Coins_fromName_closure, A.Bip84Conf_bitcoinMainNet_closure, A.Bip84Conf_bitcoinTestNet_closure, A.Bip84Conf_litecoinMainNet_closure, A.Bip84Conf_litecoinTestNet_closure, A.Bip86Coins_fromName_closure, A.Bip86Conf_bitcoinMainNet_closure, A.Bip86Conf_bitcoinTestNet_closure, A.CoinProposal_fromName_closure, A.Cip1852Coins_fromName_closure, A.Cip1852Conf_cardanoIcarusMainNet_closure, A.Cip1852Conf_cardanoIcarusTestNet_closure, A.Cip1852Conf_cardanoLedgerMainNet_closure, A.Cip1852Conf_cardanoLedgerTestNet_closure, A.EllipticCurveTypes_fromName_closure, A.MoneroCoins_fromName_closure, A.SubstrateCoins_fromName_closure, A.SubstrateConf_acalaEd25519_closure, A.SubstrateConf_acalaSecp256k1_closure, A.SubstrateConf_acalaSr25519_closure, A.SubstrateConf_bifrostEd25519_closure, A.SubstrateConf_bifrostSecp256k1_closure, A.SubstrateConf_bifrostSr25519_closure, A.SubstrateConf_chainXEd25519_closure, A.SubstrateConf_chainXSecp256k1_closure, A.SubstrateConf_chainXSr25519_closure, A.SubstrateConf_edgewareEd25519_closure, A.SubstrateConf_edgewareSecp256k1_closure, A.SubstrateConf_edgewareSr25519_closure, A.SubstrateConf_genericEd25519_closure, A.SubstrateConf_genericSecp256k1_closure, A.SubstrateConf_genericSr25519_closure, A.SubstrateConf_karuraEd25519_closure, A.SubstrateConf_karuraSecp256k1_closure, A.SubstrateConf_karuraSr25519_closure, A.SubstrateConf_kusamaEd25519_closure, A.SubstrateConf_kusamaSecp256k1_closure, A.SubstrateConf_kusamaSr25519_closure, A.SubstrateConf_moonbeamEd25519_closure, A.SubstrateConf_moonbeamSecp256k1_closure, A.SubstrateConf_moonbeamSr25519_closure, A.SubstrateConf_moonriverEd25519_closure, A.SubstrateConf_moonriverSecp256k1_closure, A.SubstrateConf_moonriverSr25519_closure, A.SubstrateConf_phalaEd25519_closure, A.SubstrateConf_phalaSecp256k1_closure, A.SubstrateConf_phalaSr25519_closure, A.SubstrateConf_plasmEd25519_closure, A.SubstrateConf_plasmSecp256k1_closure, A.SubstrateConf_plasmSr25519_closure, A.SubstrateConf_polkadotEd25519_closure, A.SubstrateConf_polkadotSecp256k1_closure, A.SubstrateConf_polkadotSr25519_closure, A.SubstrateConf_soraEd25519_closure, A.SubstrateConf_soraSecp256k1_closure, A.SubstrateConf_soraSr25519_closure, A.SubstrateConf_stafiEd25519_closure, A.SubstrateConf_stafiSecp256k1_closure, A.SubstrateConf_stafiSr25519_closure, A.CborObject_CborObject$fromDynamic_closure, A.CborUtils__decodeUtf8String_closure, A.CborUtils__toStringObject_closure, A.CborUtils__toStringObject_closure0, A.CborUtils__decodeBytesString_closure, A.AESLib_initialize__rot24, A.QuickCrypto__generateRandom_closure, A.LayoutConst_rustEnum_closure1, A.LayoutConst_rustEnum_closure0, A.LayoutConst_compactString_closure0, A.LayoutConst_compactString_closure, A.LayoutConst_compactMap_closure0, A.LayoutConst_compactMap_closure, A.LayoutConst_array_closure0, A.LayoutConst_array_closure, A.LayoutConst_compactVec_closure, A.LayoutConst_compactVec_closure0, A.StructLayout_StructLayout_closure, A.Union_defaultGetSourceVariant_closure, A.LayoutException_toString_closure, A.BytesUtils_toBytes_closure, A.UUID_generateUUIDv4_closure, A.UUID_generateUUIDv4_closure0, A.CanonicalizedMap_entries_closure, A.CanonicalizedMap_keys_closure, A.CanonicalizedMap_values_closure, A.TendermintProvider_request_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A.BrowserClient_send_closure0, A.ByteStream_toBytes_closure, A.CaseInsensitiveMap$from_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.WalletEventTypes_fromName_closure, A.JSWebSocket_constructor_create_closure, A.WebEventStream_stream_closure, A.ContentType_fromValue_closure, A.ExtractCborMap_generateMap_closure, A.SynchronizedLock_synchronized_closure, A.MethodUtils_call_closure, A.StrUtils_toSnakeCase_closure, A.WebsocketWeb$__closure, A.WebsocketWeb$__closure0, A.WebsocketWeb$__closure1, A.WebsocketWeb_connect_closure, A.CustomCoins_fromName_closure, A.CustomCurrencyConf_byronLegacy_closure, A.CustomCurrencyConf_byronLegacyTestnet_closure, A.AddressDerivationType_fromTag_closure, A.Bip32AddressIndex__toPath_closure, A.Bip32AddressIndex__toPath_closure0, A.SeedTypes_fromName_closure, A.NetworkType_fromTag_closure, A.NetworkType_fromName_closure, A.ProvidersConst_getDefaultService_closure, A.ProvidersConst_getDefaultService_closure0, A.BitcoinExplorerProviderType_fromName_closure, A.BitcoinExplorerAPIProvider_BitcoinExplorerAPIProvider$fromCborBytesOrObject_closure, A.ElectrumAPIProvider_ElectrumAPIProvider$fromCborBytesOrObject_closure, A.CardanoAPIProvider_CardanoAPIProvider$fromCborBytesOrObject_closure, A.CosmosAPIProvider_CosmosAPIProvider$fromCborBytesOrObject_closure, A.EthereumAPIProvider_EthereumAPIProvider$fromCborBytesOrObject_closure, A.RippleAPIProvider_RippleAPIProvider$fromCborBytesOrObject_closure, A.SolanaAPIProvider_SolanaAPIProvider$fromCborBytesOrObject_closure, A.SubstrateAPIProvider_SubstrateAPIProvider$fromCborBytesOrObject_closure, A.TonAPIProvider_TonAPIProvider$fromCborBytesOrObject_closure, A.TronAPIProvider_TronAPIProvider$fromCborBytesOrObject_closure, A.APIServiceTracker__checkStatus_closure, A.SSLService_connect___closure, A.WebSocketService__onClose_closure, A.ProviderAuthType_fromName_closure, A.ServiceProtocol_fromID_closure, A.BitcoinMultiSignatureAddress_BitcoinMultiSignatureAddress$fromCborBytesOrObject_closure, A.BitcoinMultiSignatureAddress_BitcoinMultiSignatureAddress$fromCborBytesOrObject_closure0, A.BitcoinMultiSignatureAddress_toP2shAddress_closure, A.ITonAddress_ITonAddress$fromCborBytesOrObject_closure, A.TronMultiSignatureAddress_TronMultiSignatureAddress$fromCborBytesOrObject_closure, A.ITronAddress_ITronAddress$fromCborBytesOrObject_closure, A.ITronAddress_ITronAddress$fromCborBytesOrObject_closure0, A.ITronMultisigAddress_ITronMultisigAddress$fromCborBytesOrObject_closure, A.ITronMultisigAddress_ITronMultisigAddress$fromCborBytesOrObject_closure0, A.RippleMultiSignatureAddress_RippleMultiSignatureAddress$fromCborBytesOrObject_closure, A.IXRPAddress_IXRPAddress$fromCborBytesOrObject_closure, A.IXRPAddress_IXRPAddress$fromCborBytesOrObject_closure0, A.IXRPMultisigAddress_IXRPMultisigAddress$fromCborBytesOrObject_closure, A.IXRPMultisigAddress_IXRPMultisigAddress$fromCborBytesOrObject_closure0, A.ADAChain_ADAChain$deserialize_closure0, A.BitcoinChain_BitcoinChain$deserialize_closure0, A.CosmosChain_CosmosChain$deserialize_closure0, A.EthereumChain_EthereumChain$deserialize_closure0, A.SolanaChain_SolanaChain$deserialize_closure0, A.SubstrateChain_SubstrateChain$deserialize_closure0, A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure0, A.TronChain_TronChain$deserialize_closure0, A.RippleChain_RippleChain$deserialize_closure0, A.WalletNetwork_getProvider_closure, A.WalletNetwork_getProvider_closure0, A.WalletNetwork_getProvider_closure1, A.BitcoinParams_BitcoinParams$fromCborBytesOrObject_closure, A.CardanoNetworkParams_CardanoNetworkParams$fromCborBytesOrObject_closure, A.CosmosNetworkParams_CosmosNetworkParams$fromCborBytesOrObject_closure, A.CosmosNetworkParams_CosmosNetworkParams$fromCborBytesOrObject_closure0, A.EthereumNetworkParams_EthereumNetworkParams$fromCborBytesOrObject_closure, A.RippleNetworkParams_RippleNetworkParams$fromCborBytesOrObject_closure, A.SolanaNetworkParams_SolanaNetworkParams$fromCborBytesOrObject_closure, A.SubstrateNetworkParams_SubstrateNetworkParams$fromCborBytesOrObject_closure, A.TonNetworkParams_TonNetworkParams$fromCborBytesOrObject_closure, A.TronNetworkParams_TronNetworkParams$fromCborBytesOrObject_closure, A.TronNetworkParams_TronNetworkParams$fromCborBytesOrObject_closure0, A.CosmosNetworkTypes_CosmosNetworkTypes$fromValue_closure, A.SolanaWeb3TransactionResponseType_fromName_closure, A.TonAccountContextType_fromTag_closure, A.TronChainType_fromName_closure, A.TronChainType_fromId_closure, A.TronChainType_fromGenesis_closure, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure0, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure1, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure2, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure3, A.TronAccountInfo_TronAccountInfo$fromCborBytesOrObject_closure4, A.TronAccountInfo_TronAccountInfo$fromJson_closure, A.TronAccountInfo_TronAccountInfo$fromJson_closure0, A.TronAccountInfo_TronAccountInfo$fromJson_closure1, A.TronAccountInfo_TronAccountInfo$fromJson_closure2, A.TronAccountInfo_TronAccountInfo$fromJson_closure3, A.TronAccountInfo_TronAccountInfo$fromJson_closure4, A.AccountPermission_AccountPermission$fromCborBytesOrObject_closure, A.AccountPermission_AccountPermission$fromJson_closure, A.Token_Token$fromCborBytesOrObject_closure, A.ChainsHandler_ChainsHandler$deserialize_closure, A.Web3MessageTypes_fromTag_closure, A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure, A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure0, A.Web3APPAuthentication_Web3APPAuthentication$deserialize_closure1, A.Web3EthereumRequestMethods_fromId_closure, A.Web3EthereumRequestMethods_fromName_closure, A.Web3EthereumAddNewChain_toNewNetwork_closure, A.Web3EthreumPersonalSign_Web3EthreumPersonalSign$fromJson_closure, A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure, A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure0, A.Web3EthreumSendTransaction_Web3EthreumSendTransaction$fromJson_closure1, A.Web3EthreumTypdedData_Web3EthreumTypdedData$fromJson_closure, A.Web3EthereumChain_Web3EthereumChain$deserialize_closure, A.Web3EthereumChain_Web3EthereumChain$deserialize_closure0, A.Web3EthereumChain_toCbor_closure, A.Web3EthereumChain_toCbor_closure0, A.Web3EthereumChain_chainAccounts_closure, A.Web3EthereumChain_chainAccounts_closure0, A.Web3GlobalRequestMethods_fromId_closure, A.Web3SolanaRequestMethods_fromId_closure, A.Web3SolanaRequestMethods_fromName_closure, A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure, A.Web3SolanaSendTransaction_Web3SolanaSendTransaction$deserialize_closure0, A.Web3SolanaSendTransaction_toCbor_closure, A.Web3SolanaSendTransaction_toJson_closure, A.Web3SolanaChain_Web3SolanaChain$deserialize_closure, A.Web3SolanaChain_Web3SolanaChain$deserialize_closure0, A.Web3SolanaChain_toCbor_closure, A.Web3SolanaChain_toCbor_closure0, A.Web3SolanaChain_getPermission_closure, A.Web3SolanaChain_chainAccounts_closure, A.Web3SolanaChain_chainAccounts_closure0, A.Web3TonRequestMethods_fromId_closure, A.Web3TonRequestMethods_fromName_closure, A.Web3TonTransactionMessage_Web3TonTransactionMessage$fromJson_closure, A.Web3TonSendTransaction_Web3TonSendTransaction$fromJson_closure, A.Web3TonSendTransaction_Web3TonSendTransaction$deserialize_closure, A.Web3TonSendTransaction_toCbor_closure, A.Web3TonSendTransaction_toJson_closure, A.Web3TonChain_Web3TonChain$deserialize_closure, A.Web3TonChain_Web3TonChain$deserialize_closure0, A.Web3TonChain_toCbor_closure, A.Web3TonChain_toCbor_closure0, A.Web3TonChain_getPermission_closure, A.Web3TonChain_chainAccounts_closure, A.Web3TonChain_chainAccounts_closure0, A.Web3TronRequestMethods_fromId_closure, A.Web3TronRequestMethods_fromName_closure, A.Web3TronChain_Web3TronChain$deserialize_closure, A.Web3TronChain_Web3TronChain$deserialize_closure0, A.Web3TronChain_toCbor_closure, A.Web3TronChain_toCbor_closure0, A.Web3TronChain_getPermission_closure, A.Web3TronChain_chainAccounts_closure, A.Web3TronChain_chainAccounts_closure0, A.BlockforestProvider_request_closure, A.ETHRPCRequest_toRequest_closure, A.ETHRPCRequest_toRequest_closure0, A.EthereumMethods_fromName_closure, A.ETHTransactionType_fromPrefix_closure, A.SolanaRPCRequest_toRequest_closure, A.SolanaTransaction_addSignature_closure, A.SolanaTransactionUtils_serializeV0_closure, A.SolanaTransactionUtils_serializeLegacy_closure, A.SolanaTransactionUtils_serializeLegacy_closure0, A.SolanaLayoutUtils_publicKey_closure0, A.SolanaLayoutUtils_publicKey_closure, A.AbiParameter_isDynamic_closure, A.EIP712Version_fromVersion_closure, A.EIP712Version_fromVersion__closure, A.Eip712TypedData_Eip712TypedData$fromJson_closure, A.Eip712TypedData_toJson__closure, A.EIP712Legacy_EIP712Legacy$fromJson_closure, A.EIP712Legacy_encode_closure, A.EIP712Legacy_encode_closure0, A.EIP712Legacy_encode_closure1, A.EIP712Legacy_toJson_closure, A._EIP712Utils_ensureCorrectValues_closure, A._EIP712Utils_eip712TypedDataV1ValueToJson_closure, A._EIP712Utils_getDependencies__closure, A._EIP712Utils_encodeValue_closure, A._EIP712Utils_encodeValue_closure0, A._EIP712Utils_encodeValue_closure1, A._EIP712Utils_abiEncode_closure, A._EIP712Utils_legacyV1encode_closure, A._EIP712Utils_getMethodSigature_closure, A._EIP712Utils_getMethodSigature__closure, A.ArrayCoder_abiEncode_closure, A.ArrayCoder_abiEncode_closure0, A.ArrayCoder_legacyEip712Encode_closure, A.ArrayCoder_legacyEip712Encode_closure0, A.TupleCoder_abiEncode_closure, A.TupleCoder_legacyEip712Encode_closure, A._ABIUtils_encodeDynamicParams_closure, A._ABIUtils_encodeDynamicParams_closure0, A._ABIUtils_encodeDynamicParams_closure1, A._ABIUtils_encodeDynamicParams_closure2, A.AccountCreateContract_AccountCreateContract$deserialize_closure, A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$fromJson_closure, A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$deserialize_closure, A.AccountPermissionUpdateContract_AccountPermissionUpdateContract$deserialize_closure0, A.AccountPermissionUpdateContract_toJson_closure, A.AccountType_fromName_closure, A.AccountType_fromValue_closure, A.Authority_Authority$deserialize_closure, A.Permission_Permission$fromJson_closure, A.Permission_Permission$deserialize_closure, A.Permission_toJson_closure, A.PermissionType_fromName_closure, A.PermissionType_fromValue_closure, A.AssetIssueContract_AssetIssueContract$fromJson_closure, A.AssetIssueContract_AssetIssueContract$deserialize_closure, A.AssetIssueContract_toJson_closure, A.DelegateResourceContract_DelegateResourceContract$deserialize_closure, A.FreezeBalanceContract_FreezeBalanceContract$deserialize_closure, A.FreezeBalanceV2Contract_FreezeBalanceV2Contract$deserialize_closure, A.UnDelegateResourceContract_UnDelegateResourceContract$deserialize_closure, A.UnfreezeBalanceContract_UnfreezeBalanceContract$deserialize_closure, A.UnfreezeBalanceV2Contract_UnfreezeBalanceV2Contract$deserialize_closure, A.ResourceCode_fromName_closure0, A.ResourceCode_fromValue_closure0, A.TransactionContractType_findByName_closure, A.TransactionContractType_findByValue_closure, A.ShieldedTransferContract_ShieldedTransferContract$fromJson_closure, A.ShieldedTransferContract_ShieldedTransferContract$fromJson_closure0, A.ShieldedTransferContract_ShieldedTransferContract$deserialize_closure, A.ShieldedTransferContract_ShieldedTransferContract$deserialize_closure0, A.ShieldedTransferContract_toJson_closure, A.ShieldedTransferContract_toJson_closure0, A.SmartContractAbiEntryType_fromName_closure, A.SmartContractAbiEntryType_fromValue_closure, A.SmartContractAbiStateMutabilityType_fromName_closure, A.SmartContractAbiStateMutabilityType_fromValue_closure, A.SmartContract_SmartContract$deserialize_closure, A.SmartContract_SmartContract$deserialize_closure0, A.SmartContractABI_SmartContractABI$fromJson_closure, A.SmartContractABI_SmartContractABI$deserialize_closure, A.SmartContractABI_toJson_closure, A.SmartContractABIEntry_SmartContractABIEntry$fromJson_closure, A.SmartContractABIEntry_SmartContractABIEntry$fromJson_closure0, A.SmartContractABIEntry_SmartContractABIEntry$deserialize_closure, A.SmartContractABIEntry_SmartContractABIEntry$deserialize_closure0, A.SmartContractABIEntry_toJson_closure, A.SmartContractABIEntry_toJson_closure0, A.Transaction_Transaction$fromJson_closure, A.Transaction_closure, A.Transaction_toJson_closure, A.TransactionRaw_TransactionRaw$fromJson_closure, A.TransactionRaw_TransactionRaw$fromJson_closure0, A.TransactionRaw_TransactionRaw$deserialize_closure, A.TransactionRaw_TransactionRaw$deserialize_closure0, A.TransactionRaw_toJson_closure, A.TransactionRaw_toJson_closure0, A.VoteAssetContract_VoteAssetContract$fromJson_closure, A.VoteAssetContract_VoteAssetContract$deserialize_closure, A.VoteAssetContract_toJson_closure, A.VoteWitnessContract_VoteWitnessContract$fromJson_closure, A.VoteWitnessContract_VoteWitnessContract$deserialize_closure, A.VoteWitnessContract_toJson_closure, A.ProtocolBufferDecoder__decodeInt_closure, A.QuickProtocolBufferResults_getField_closure, A.QuickProtocolBufferResults_getField_closure0, A.QuickProtocolBufferResults_getResult_closure, A.QuickProtocolBufferResults_getResult_closure0, A.QuickProtocolBufferResults_getFields_closure, A.QuickProtocolBufferResults_getFields_closure0, A.QuickProtocolBufferResults_getMap_closure, A.TVMRequestParam_toRequest_closure0, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.MetadataException_toString_closure, A.PrimitiveTypes_fromValue_closure, A.Si0TypeDefPrimitive$deserializeJson_closure, A.Si1Type$deserializeJson_closure, A.Si1Type$deserializeJson_closure0, A.Si1Type_scaleJsonSerialize_closure, A.Si1TypeDefsIndexesConst_fromValue_closure, A.Si1TypeDefComposite$deserializeJson_closure, A.Si1TypeDefComposite_scaleJsonSerialize_closure, A.Si1TypeDefVariant$deserializeJson_closure, A.Si1TypeDefVariant_scaleJsonSerialize_closure, A.Si1Variant$deserializeJson_closure, A.Si1Variant_scaleJsonSerialize_closure, A.StorageHasherV11Options_fromValue_closure, A.ExtrinsicMetadataV14$deserializeJson_closure, A.ExtrinsicMetadataV14_scaleJsonSerialize_closure, A.MetadataV14$deserializeJson_closure, A.MetadataV14_scaleJsonSerialize_closure, A.PalletMetadataV14$deserializeJson_closure, A.PalletMetadataV14_scaleJsonSerialize_closure, A.PalletStorageMetadataV14$deserializeJson_closure, A.PalletStorageMetadataV14_scaleJsonSerialize_closure, A.PortableRegistryV14$deserializeJson_closure, A.PortableRegistryV14_scaleJsonSerialize_closure, A.StorageEntryTypeV14Map$deserializeJson_closure, A.StorageEntryTypeV14Map_scaleJsonSerialize_closure, A.ExtrinsicMetadataV15$deserializeJson_closure, A.ExtrinsicMetadataV15_scaleJsonSerialize_closure, A.MetadataV15$deserializeJson_closure, A.MetadataV15$deserializeJson_closure0, A.MetadataV15_scaleJsonSerialize_closure, A.MetadataV15_scaleJsonSerialize_closure0, A.RuntimeApiMetadataV15$deserializeJson_closure, A.RuntimeApiMetadataV15_scaleJsonSerialize_closure, A.RuntimeApiMethodMetadataV15$deserializeJson_closure, A.RuntimeApiMethodMetadataV15_scaleJsonSerialize_closure, A.StorageEntryModifierV9_fromValue_closure, A.SubstrateRPCRequest_toRequest_closure, A.SubstrateRPCRequest_toRequest_closure0, A.Highlighter$__closure, A.Highlighter$___closure, A.Highlighter$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.Cell$__closure, A.CellType_fromValue_closure, A.ResolvedCellResult_closure, A.CellUtils_topologicalSort_closure, A.CellUtils_topologicalSort_visit, A.CellUtils_topologicalSort_closure0, A.CellUtils_topologicalSort__closure, A.CellUtils_resolveExotic_closure, A.CellUtils_resolveExotic_closure0, A.TonChain_fromWorkchain_closure, A.WalletVersion_WalletVersion$fromValue_closure, A.DictionaryCodecs_createBigUintKey_closure, A.Dictionary_store_closure, A.TonDartPluginException_toString_closure, A.TonDartPluginException_toString_closure0, A.StateInit_store_closure, A.TonApiType_TonApiType$fromValue_closure, A.TonApiRequestParam_toRequest_closure0, A.BlockCurrencyCollectionResponse_BlockCurrencyCollectionResponse$fromJson_closure, A.BlockCurrencyCollectionResponse_toJson_closure, A.TonProvider_request_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.EIP6963ProviderDetail_setup_closure, A.EthereumWeb3State_EthereumWeb3State_closure, A.EthereumWeb3State_EthereumWeb3State_closure0, A.EthereumWeb3State_EthereumWeb3State_closure2, A.JSEthereumHandler_request_closure, A.JSEthereumHandler__parseTypedData_closure, A.WalletPromise_get_toPromise__closure, A.WalletPromise_get_toPromise__closure1, A.JSWalletMessageType_fromName_closure, A.JSEventType_name_closure, A.JSEventType_fromName_closure, A.JSWalletResponseType_fromName_closure, A.JSClientType_fronNetworkName_closure, A.JSClientType_fromName_closure, A.PageMessageType_fromName_closure, A.PageMessageRequest_get_dartParams_closure, A.SolanaPageController__signMessage_closure, A.SolanaPageController__buildWalletRequest_closure, A.SolanaPageController__toWalletRequest_closure, A.SolanaPageController__toWalletRequest_closure0, A.SolanaPageController__buildTransaction_closure, A.SolanaPageController__buildTransaction_closure0, A.SolanaPageController__onTransactionResponse_closure, A.SolanaAccountsChanged_accountJS_closure, A.SolanaWeb3State_SolanaWeb3State_closure, A.SolanaWeb3State_SolanaWeb3State_closure0, A.SolanaWeb3State_SolanaWeb3State_closure2, A.JSSolanaHandler__parseTransaction_closure, A.JSSolanaHandler_finilizeWalletResponse_closure, A.JSSolanaHandler_finilizeWalletResponse_closure0, A.TonChainId_fromNetworkId_closure, A.TonWeb3State_TonWeb3State_closure, A.TonWeb3State_TonWeb3State_closure0, A.TonWeb3State_TonWeb3State_closure2, A.TonWeb3State_TonWeb3State_closure3, A.TronWeb3State_TronWeb3State_closure, A.TronWeb3State_TronWeb3State_closure0, A.TronWeb3State_TronWeb3State_closure2, A.JSTronHandler__parseTransaction_closure, A.JSWalletHandler__onClientEvent_closure, A.JSWebviewTraget_fromName_closure, A.main_onActivation]); + _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__chainForeignFuture_closure0, A._Future_timeout_closure1, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A._Uri__makeQueryFromParameters_closure, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_error, A.Uri_parseIPv6Address_parseHex, A._Uri__makeQueryFromParametersDefault_writeParameter, A._Uri__makeQueryFromParametersDefault_closure, A._createTables_build, A.AESLib_initialize_mul, A.LayoutConst_rustEnum_closure, A.SequenceLayout_encode_closure, A.StructLayout_StructLayout_closure0, A.StructLayout_getSpan_closure, A.LayoutException_closure, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.CanonicalizedMap_map_closure, A.TendermintRequestParam_toRequest_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.SubstrateClient__loadApi_closure, A.Web3ExceptionMessage_toJson_closure, A.FixedBytes_hashCode_closure, A.Eip712TypedData_toJson_closure, A._EIP712Utils_getDependencies_closure, A.AccountCreateContract_toJson_closure, A.AccountId_toJson_closure, A.AccountPermissionUpdateContract_toJson_closure0, A.Permission_toJson_closure0, A.AssetIssueContract_toJson_closure0, A.TransferAssetContract_toJson_closure, A.UpdateAssetContract_toJson_closure, A.DelegateResourceContract_toJson_closure, A.FreezeBalanceV2Contract_toJson_closure, A.TransferContract_toJson_closure, A.UnDelegateResourceContract_toJson_closure, A.UnfreezeBalanceV2Contract_toJson_closure, A.ExchangeCreateContract_toJson_closure, A.ExchangeInjectContract_toJson_closure, A.ExchangeTransactionContract_toJson_closure, A.ExchangeWithdrawContract_toJson_closure, A.MarketCancelOrderContract_toJson_closure, A.MarketSellAssetContract_toJson_closure, A.ProposalApproveContract_toJson_closure, A.ProposalCreateContract_ProposalCreateContract$fromJson_closure, A.ProposalCreateContract_toJson_closure, A.ReceiveDescription_toJson_closure, A.ShieldedTransferContract_toJson_closure1, A.SpendDescription_toJson_closure, A.CreateSmartContract_toJson_closure, A.SmartContract_toJson_closure, A.SmartContractBABIEntryParam_toJson_closure, A.TriggerSmartContract_toJson_closure, A.UpdateEnergyLimitContract_toJson_closure, A.UpdateSettingContract_toJson_closure, A.TransactionContract_toJson_closure, A.TransactionRaw_toJson_closure1, A.VoteAssetContract_toJson_closure0, A.VoteWitnessContract_toJson_closure0, A.WitnessUpdateContract_toJson_closure, A.WitnessCreateContract_toJson_closure, A.TVMRequestParam_toRequest_closure, A.MetadataException_closure, A.Highlighter__collateLines_closure0, A._DictSerializationUtils_buildTree_closure, A.SimpleLibraryCodecs_codec_closure, A.StateInit_toJson_closure, A.TonApiRequestParam_toRequest_closure, A.TonCenterPostRequestParam_toRequest_closure, A.XRPLedgerRequest_toRequest_closure, A.EthereumWeb3State_EthereumWeb3State_closure3, A.JSWalletError_constructor_fromJson_closure, A.WalletPromise_get_toPromise_closure, A.WalletPromise_get_toPromise__closure0, A.WalletMessageData__convertMap_closure, A.SolanaWeb3State_SolanaWeb3State_closure3, A.TonWeb3State_TonWeb3State_closure4, A.TronWeb3State_TronWeb3State_closure3]); _inherit(A.CastList, A._CastListBase); _inheritMany(A.MapBase, [A.CastMap, A.UnmodifiableMapBase, A.JsLinkedHashMap, A._HashMap, A._JsonMap]); _inheritMany(A.Error, [A.LateError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A._CyclicInitializationError, A.RuntimeError, A.AssertionError, A._Error, A.JsonUnsupportedObjectError, A.ArgumentError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError]); _inherit(A.UnmodifiableListBase, A.ListBase); _inherit(A.CodeUnits, A.UnmodifiableListBase); - _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A.Future_Future$delayed_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__chainCoreFutureAsync_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteError_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._rootHandleError_closure, A._RootZone_bindCallbackGuarded_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A._RawSecureSocket__secureHandshakeCompleteHandler_closure, A.BitcoinAddressType_fromValue_closure0, A.ADAAddressType_fromHeader_closure0, A.ADANetwork_fromTag_closure0, A.ADANetwork_fromProtocolMagic_closure0, A.CoinProposal_fromName_closure0, A.MediaType_MediaType$parse_closure, A.WalletEventTypes_fromName_closure0, A.WebEventStream_stream_closure0, A.ContentType_fromValue_closure0, A.SynchronizedLock_synchronized_complete, A.AddressDerivationType_fromTag_closure0, A.SeedTypes_fromName_closure0, A.NetworkType_fromTag_closure0, A.NetworkType_fromName_closure0, A.NetworkClient__init_closure, A.NetworkClient_init_closure, A.BitcoinElectrumClient_genesis_closure, A.CosmosClient_onInit_closure, A.EthereumClient_onInit_closure, A.RippleClient_onInit_closure, A.SolanaClient_onInit_closure, A.TonClient_onInit_closure, A.TronClient_onInit_closure, A.ProvidersConst_getDefaultService_closure1, A.BitcoinExplorerProviderType_fromName_closure0, A.HTTPService__callSynchronized_closure, A.HTTPService_providerPOST_closure, A.HTTPService_providerGET_closure, A.SSLService_connect_closure, A.SSLService_connect__closure, A.SSLService_post_closure, A.TCPService_connect_closure, A.TCPService_connect__closure, A.TCPService_post_closure, A.WebSocketService_connect_closure, A.WebSocketService_connect__closure, A.WebSocketService_addMessage_closure, A.ProviderAuthType_fromName_closure0, A.EthereumWebsocketService__emitListeners_closure, A.EthereumWebsocketService_onMessge_closure, A.Chain_Chain$deserialize_closure, A.Chain_Chain$deserialize_closure0, A.ADAChain_ADAChain$deserialize_closure, A.BitcoinChain_BitcoinChain$deserialize_closure, A.CosmosChain_CosmosChain$deserialize_closure, A.EthereumChain_EthereumChain$deserialize_closure, A.SolanaChain_SolanaChain$deserialize_closure, A.SubstrateChain_SubstrateChain$deserialize_closure, A.TonChain_TonChain$deserialize_closure, A.TronChain_TronChain$deserialize_closure, A.RippleChain_RippleChain$deserialize_closure, A.WalletNetwork_getProvider_closure2, A.CosmosNetworkTypes_CosmosNetworkTypes$fromValue_closure0, A.TronChainType_fromName_closure0, A.TronChainType_fromId_closure0, A.TronChainType_fromGenesis_closure0, A.Web3MessageTypes_fromTag_closure0, A.Web3EthereumRequestMethods_fromId_closure0, A.Web3EthereumValidator_parseTypedData_closure, A.Web3GlobalRequestMethods_fromId_closure0, A.Web3SolanaRequestMethods_fromId_closure0, A.Web3TronRequestMethods_fromId_closure0, A.Web3ValidatorUtils_parseAddress_closure, A.Web3ValidatorUtils_parseList_closure, A.Web3ValidatorUtils_parseMap_closure, A.EIP712Version_fromVersion_closure0, A.PermissionType_fromName_closure0, A.PermissionType_fromValue_closure0, A.ResourceCode_fromName_closure, A.ResourceCode_fromValue_closure, A.TransactionContractType_findByName_closure0, A.SmartContractAbiEntryType_fromName_closure0, A.SmartContractAbiEntryType_fromValue_closure0, A.SmartContractAbiStateMutabilityType_fromName_closure0, A.SmartContractAbiStateMutabilityType_fromValue_closure0, A.PrimitiveTypes_fromValue_closure0, A.Si1TypeDefsIndexesConst_fromValue_closure0, A.StorageHasherV11Options_fromValue_closure0, A.StorageEntryModifierV9_fromValue_closure0, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.WalletVersion_WalletVersion$fromValue_closure0, A.TonApiType_TonApiType$fromValue_closure0, A.EthereumEventTypes_fromTag_closure0, A.EthereumEventTypes_fromName_closure0, A.ProviderConnectInfo_toJSEvent__closure, A.ProviderConnectInfo_toJSEvent_closure, A.EthereumWeb3State_EthereumWeb3State_closure1, A.JSEthereumHandler_initChain_closure, A.JSEthereumHandler__parseAddEthereumChain_closure, A.JSEthereumHandler__parseTransaction_closure, A.JSWalletError_constructor_fromMessage_toString, A.JSWalletError_constructor_fromJson_toString, A.JSWalletMessageType_fromTag_closure0, A.JSWalletResponseType_fromTag_closure0, A.JSClientType_fromTag_closure0, A.EthereumPageController__init__closure, A.EthereumPageController__init_closure, A.SolanaPageController__init__closure, A.SolanaPageController__init_closure, A.TronPageController__init__closure1, A.TronPageController__init_closure, A.TronPageController__init__closure0, A.TronPageController__init_closure0, A.TronPageController__init__closure, A.TronPageController__init_closure1, A.TronPageController_onEvent__closure, A.TronPageController_onEvent__closure0, A.TronPageController_onEvent_closure, A.JSSolanaPublicKey_toJS__closure, A.JSSolanaPublicKey_toJS_closure, A.SolanaEventTypes_fromTag_closure0, A.SolanaProviderConnectInfo_toJS__closure, A.SolanaProviderConnectInfo_toJS_closure, A.SolanaWeb3State_SolanaWeb3State_closure1, A.JSSolanaHandler_initChain_closure, A.JSSolanaHandler__parseTransaction_closure1, A.TronEventTypes_fromTag_closure0, A.TronWebNodeInfo_toTronWeb__closure, A.TronWebNodeInfo_toTronWeb__closure0, A.TronWebNodeInfo_toTronWeb_closure, A.TronWeb3State_TronWeb3State_closure1, A.JSTronHandler_initChain_closure]); + _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A.Future_Future$delayed_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__chainCoreFutureAsync_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteError_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._rootHandleError_closure, A._RootZone_bindCallbackGuarded_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A._RawSecureSocket__secureHandshakeCompleteHandler_closure, A.BitcoinAddressType_fromValue_closure0, A.ADAAddressType_fromHeader_closure0, A.ADANetwork_fromTag_closure0, A.ADANetwork_fromProtocolMagic_closure0, A.CoinProposal_fromName_closure0, A.MediaType_MediaType$parse_closure, A.WalletEventTypes_fromName_closure0, A.WebEventStream_stream_closure0, A.ContentType_fromValue_closure0, A.SynchronizedLock_synchronized_complete, A.AddressDerivationType_fromTag_closure0, A.SeedTypes_fromName_closure0, A.NetworkType_fromTag_closure0, A.NetworkType_fromName_closure0, A.NetworkClient__init_closure, A.NetworkClient_init_closure, A.BitcoinElectrumClient_genesis_closure, A.CosmosClient_onInit_closure, A.EthereumClient_onInit_closure, A.RippleClient_onInit_closure, A.SolanaClient_onInit_closure, A.TonClient_onInit_closure, A.TronClient_onInit_closure, A.ProvidersConst_getDefaultService_closure1, A.BitcoinExplorerProviderType_fromName_closure0, A.HTTPService__callSynchronized_closure, A.HTTPService_providerPOST_closure, A.HTTPService_providerGET_closure, A.SSLService_connect_closure, A.SSLService_connect__closure, A.SSLService_post_closure, A.TCPService_connect_closure, A.TCPService_connect__closure, A.TCPService_post_closure, A.WebSocketService_connect_closure, A.WebSocketService_connect__closure, A.WebSocketService_addMessage_closure, A.ProviderAuthType_fromName_closure0, A.EthereumWebsocketService__emitListeners_closure, A.EthereumWebsocketService_onMessge_closure, A.Chain_Chain$deserialize_closure, A.Chain_Chain$deserialize_closure0, A.ADAChain_ADAChain$deserialize_closure, A.BitcoinChain_BitcoinChain$deserialize_closure, A.CosmosChain_CosmosChain$deserialize_closure, A.EthereumChain_EthereumChain$deserialize_closure, A.SolanaChain_SolanaChain$deserialize_closure, A.SubstrateChain_SubstrateChain$deserialize_closure, A.TheOpenNetworkChain_TheOpenNetworkChain$deserialize_closure, A.TronChain_TronChain$deserialize_closure, A.RippleChain_RippleChain$deserialize_closure, A.WalletNetwork_getProvider_closure2, A.CosmosNetworkTypes_CosmosNetworkTypes$fromValue_closure0, A.TonAccountContextType_fromTag_closure0, A.TronChainType_fromName_closure0, A.TronChainType_fromId_closure0, A.TronChainType_fromGenesis_closure0, A.Web3MessageTypes_fromTag_closure0, A.Web3EthereumRequestMethods_fromId_closure0, A.Web3EthereumValidator_parseTypedData_closure, A.Web3GlobalRequestMethods_fromId_closure0, A.Web3SolanaRequestMethods_fromId_closure0, A.Web3TonRequestMethods_fromId_closure0, A.Web3TronRequestMethods_fromId_closure0, A.Web3ValidatorUtils_isValidMap_closure, A.Web3ValidatorUtils_parseAddress_closure, A.Web3ValidatorUtils_parseTonCell_closure, A.Web3ValidatorUtils_parseList_closure, A.Web3ValidatorUtils_parseMap_closure, A.EIP712Version_fromVersion_closure0, A.PermissionType_fromName_closure0, A.PermissionType_fromValue_closure0, A.ResourceCode_fromName_closure, A.ResourceCode_fromValue_closure, A.TransactionContractType_findByName_closure0, A.SmartContractAbiEntryType_fromName_closure0, A.SmartContractAbiEntryType_fromValue_closure0, A.SmartContractAbiStateMutabilityType_fromName_closure0, A.SmartContractAbiStateMutabilityType_fromValue_closure0, A.PrimitiveTypes_fromValue_closure0, A.Si1TypeDefsIndexesConst_fromValue_closure0, A.StorageHasherV11Options_fromValue_closure0, A.StorageEntryModifierV9_fromValue_closure0, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.TonChain_fromWorkchain_closure0, A.WalletVersion_WalletVersion$fromValue_closure0, A.TonApiType_TonApiType$fromValue_closure0, A.ProviderConnectInfo_toJSEvent__closure, A.ProviderConnectInfo_toJSEvent_closure, A.EthereumWeb3State_EthereumWeb3State_closure1, A.JSEthereumHandler_initChain_closure, A.JSEthereumHandler__parseAddEthereumChain_closure, A.JSWalletError_constructor_fromMessage_toString, A.JSWalletError_constructor_fromJson_toString, A.JSWalletMessageType_fromName_closure0, A.JSEventType_name_closure0, A.JSWalletResponseType_fromName_closure0, A.JSClientType_fronNetworkName_closure0, A.JSClientType_fromName_closure0, A.PageMessageType_fromName_closure0, A.EthereumPageController__init__closure, A.EthereumPageController__init_closure, A.SolanaPageController__init__closure, A.SolanaPageController__init_closure, A.TonPageController__init__closure, A.TonPageController__init_closure, A.TronPageController__init__closure2, A.TronPageController__init_closure, A.TronPageController__init__closure1, A.TronPageController__init_closure0, A.TronPageController__init__closure0, A.TronPageController__init_closure1, A.TronPageController__init__closure, A.TronPageController__init_closure2, A.TronPageController_onEvent__closure, A.TronPageController_onEvent__closure0, A.TronPageController_onEvent_closure, A.JSSolanaPublicKey_toJS__closure, A.JSSolanaPublicKey_toJS_closure, A.SolanaProviderConnectInfo_toJS__closure, A.SolanaProviderConnectInfo_toJS_closure, A.SolanaWeb3State_SolanaWeb3State_closure1, A.JSSolanaHandler_initChain_closure, A.JSSolanaHandler__parseTransaction_closure0, A.TonChainId_fromNetworkId_closure0, A.TonChainChanged_toJS__closure, A.TonChainChanged_toJS_closure, A.TonWeb3State_TonWeb3State_closure1, A.JSTonHandler_initChain_closure, A.TronWebNodeInfo_toTronWeb__closure, A.TronWebNodeInfo_toTronWeb__closure0, A.TronWebNodeInfo_toTronWeb_closure, A.TronChainChanged_toJSEvent__closure, A.TronChainChanged_toJSEvent_closure, A.TronWeb3State_TronWeb3State_closure1, A.JSTronHandler_initChain_closure]); _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeyIterable, A._HashMapKeyIterable, A._MapBaseValueIterable]); _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A._ListIndicesIterable, A.ReversedListIterable, A._JsonMapKeyIterable]); _inherit(A.EfficientLengthMappedIterable, A.MappedIterable); @@ -60325,7 +64165,7 @@ _inheritMany(A.SegwitAddress, [A.P2wpkhAddress, A.P2trAddress, A.P2wshAddress]); _inheritMany(A.BlockchainUtilsException, [A.BitcoinBasePluginException, A.SolanaPluginException, A.SolidityAbiException, A.TronPluginException, A.MetadataException, A.TonDartPluginException]); _inheritMany(A.ElectrumRequest, [A.ElectrumBlockHeader, A.ElectrumServerFeatures]); - _inheritMany(A._Enum, [A.APIType, A.Base58Alphabets, A.Bech32Encodings, A.EncodeType, A.StringEncoding, A.AppPlatform, A.WalletEventTypes, A.ContentType, A.AddressDerivationType, A.SeedTypes, A.NodeClientStatus, A.BitcoinExplorerProviderType, A.ProviderAuthType, A.ServiceProtocol, A.SocketStatus, A.APIServiceStatus, A.SolanaWeb3TransactionResponseType, A.TronChainType, A.Web3MessageTypes, A.HTTPRequestType, A.RequestMethod, A.EthereumEventTypes, A.JSNetworkState, A.JSWalletMessageType, A.JSWalletResponseType, A.JSClientType, A.SolanaEventTypes, A.TronEventTypes, A.JSWebviewTraget]); + _inheritMany(A._Enum, [A.APIType, A.Base58Alphabets, A.Bech32Encodings, A.EncodeType, A.StringEncoding, A.AppPlatform, A.WalletEventTypes, A.ContentType, A.AddressDerivationType, A.SeedTypes, A.NodeClientStatus, A.BitcoinExplorerProviderType, A.ProviderAuthType, A.ServiceProtocol, A.SocketStatus, A.APIServiceStatus, A.SolanaWeb3TransactionResponseType, A.TonAccountContextType, A.TronChainType, A.Web3MessageTypes, A.HTTPRequestType, A.RequestMethod, A.JSNetworkState, A.JSWalletMessageType, A.JSEventType, A.JSWalletResponseType, A.JSClientType, A.PageMessageType, A.TonChainId, A.JSWebviewTraget]); _inherit(A.XmrAddrEncoder, A.BlockchainAddressEncoder); _inherit(A.Bip32PublicKey, A.Bip32KeyBase); _inheritMany(A.BipCoins, [A.Bip44Coins, A.Bip49Coins, A.Bip84Coins, A.Bip86Coins, A.Cip1852Coins, A.CustomCoins]); @@ -60411,7 +64251,7 @@ _inherit(A.IXRPAddress, A._IXRPAddress_ChainAccount_Equatable); _inherit(A.IXRPMultisigAddress, A.IXRPAddress); _inherit(A.Chain, A._Chain_Object_CborSerializable); - _inheritMany(A.Chain, [A.ADAChain, A.BitcoinChain, A.CosmosChain, A.EthereumChain, A.SolanaChain, A.SubstrateChain, A.TonChain, A.TronChain, A.RippleChain]); + _inheritMany(A.Chain, [A.ADAChain, A.BitcoinChain, A.CosmosChain, A.EthereumChain, A.SolanaChain, A.SubstrateChain, A.TheOpenNetworkChain, A.TronChain, A.RippleChain]); _inherit(A.BitcoinContact, A._BitcoinContact_Object_Equatable); _inherit(A.CardanoContact, A._CardanoContact_Object_Equatable); _inherit(A.CosmosContact, A._CosmosContact_Object_Equatable); @@ -60432,6 +64272,9 @@ _inherit(A.CardanoAddrDetails, A._CardanoAddrDetails_Object_Equatable_CborSerializable); _inherit(A.CosmosNativeCoin, A._CosmosNativeCoin_Object_CborSerializable); _inheritMany(A.SolanaWeb3TransactionResponse, [A.SolanaWeb3TransactionErrorResponse, A.SolanaWeb3TransactionSignResponse, A.SolanaWeb3TransactionSendResponse]); + _inherit(A._TonAccountContext_Object_CborSerializable_Equatable, A._TonAccountContext_Object_CborSerializable); + _inherit(A.TonAccountContext, A._TonAccountContext_Object_CborSerializable_Equatable); + _inheritMany(A.TonAccountContext, [A.TonAccountLegacyContext, A.TonAccountSubWalletContext, A.TonAccountV5CustomContext, A.TonAccountV5SubWalletContext]); _inherit(A.TronAccountResourceInfo, A._TronAccountResourceInfo_Object_CborSerializable); _inherit(A.TronAccountInfo, A._TronAccountInfo_Object_CborSerializable); _inherit(A.AccountPermission, A._AccountPermission_Object_CborSerializable); @@ -60455,7 +64298,8 @@ _inherit(A._Token_Object_CborSerializable_Equatable, A._Token_Object_CborSerializable); _inherit(A.Token, A._Token_Object_CborSerializable_Equatable); _inherit(A.ChainsHandler, A._ChainsHandler_Object_CborSerializable); - _inherit(A.Web3MessageCore, A._Web3MessageCore_Object_CborSerializable); + _inherit(A._Web3MessageCore_Object_CborSerializable_JsonSerialization, A._Web3MessageCore_Object_CborSerializable); + _inherit(A.Web3MessageCore, A._Web3MessageCore_Object_CborSerializable_JsonSerialization); _inheritMany(A.Web3MessageCore, [A.Web3ChainMessage, A.Web3ExceptionMessage, A.Web3ResponseMessage, A._Web3GlobalRequestParams_Web3MessageCore_JsonSerialization]); _inherit(A.Web3EncryptedMessage, A._Web3EncryptedMessage_Object_CborSerializable); _inherit(A.Web3WalletResponseMessage, A.Web3ResponseMessage); @@ -60466,16 +64310,19 @@ _inherit(A.Web3Chain, A._Web3Chain_Object_CborSerializable); _inherit(A.Web3GlobalRequestParams, A._Web3GlobalRequestParams_Web3MessageCore_JsonSerialization); _inheritMany(A.Web3GlobalRequestParams, [A.Web3RequestParams, A.Web3DisconnectApplication]); - _inheritMany(A.Web3RequestMethods, [A.Web3EthereumRequestMethods, A.Web3GlobalRequestMethods, A.Web3SolanaRequestMethods, A.Web3TronRequestMethods]); - _inheritMany(A.Web3RequestParams, [A.Web3EthereumRequestParam, A.Web3SolanaRequestParam, A.Web3TronRequestParam]); + _inheritMany(A.Web3RequestMethods, [A.Web3EthereumRequestMethods, A.Web3GlobalRequestMethods, A.Web3SolanaRequestMethods, A.Web3TonRequestMethods, A.Web3TronRequestMethods]); + _inheritMany(A.Web3RequestParams, [A.Web3EthereumRequestParam, A.Web3SolanaRequestParam, A.Web3TonRequestParam, A.Web3TronRequestParam]); _inheritMany(A.Web3EthereumRequestParam, [A.Web3EthereumPermissionRequestParam, A.Web3EthereumAddNewChain, A.Web3EthreumPersonalSign, A.Web3EthreumSendTransaction, A.Web3EthreumTypdedData, A.Web3EthreumSwitchChain]); _inherit(A.Web3EthreumRequestAccounts, A.Web3EthereumPermissionRequestParam); - _inheritMany(A.Web3ChainAccount, [A.Web3EthereumChainAccount, A.Web3SolanaChainAccount, A.Web3TronChainAccount]); - _inheritMany(A.Web3Chain, [A.Web3EthereumChain, A.Web3SolanaChain, A.Web3TronChain]); + _inheritMany(A.Web3ChainAccount, [A.Web3EthereumChainAccount, A.Web3SolanaChainAccount, A.Web3TonChainAccount, A.Web3TronChainAccount]); + _inheritMany(A.Web3Chain, [A.Web3EthereumChain, A.Web3SolanaChain, A.Web3TonChain, A.Web3TronChain]); _inheritMany(A.Web3SolanaRequestParam, [A.Web3SolanaPermissionRequestParam, A.Web3SolanaSignMessage, A.Web3SolanaSendTransaction]); _inherit(A.Web3SolanaRequestAccounts, A.Web3SolanaPermissionRequestParam); _inherit(A.Web3SolanaSendTransactionOptions, A._Web3SolanaSendTransactionOptions_Object_CborSerializable); _inherit(A.Web3SolanaSendTransactionData, A._Web3SolanaSendTransactionData_Object_CborSerializable); + _inheritMany(A.Web3TonRequestParam, [A.Web3TonPermissionRequestParam, A.Web3TonSignMessage, A.Web3TonSendTransaction]); + _inherit(A.Web3TonRequestAccounts, A.Web3TonPermissionRequestParam); + _inherit(A.Web3TonTransactionMessage, A._Web3TonTransactionMessage_Object_CborSerializable); _inheritMany(A.Web3TronRequestParam, [A.Web3TronPermissionRequestParam, A.Web3TronSignMessageV2, A.Web3TronSendTransaction]); _inherit(A.Web3TronRequestAccounts, A.Web3TronPermissionRequestParam); _inherit(A.ADAAddress, A._ADAAddress_Object_ADASerialization); @@ -60513,7 +64360,16 @@ _inherit(A.SourceSpanFormatException, A.SourceSpanException); _inherit(A.SourceSpanWithContext, A.SourceSpanBase); _inherit(A.StringScannerException, A.SourceSpanFormatException); - _inherit(A.TonContractException, A.TonDartPluginException); + _inheritMany(A.TonDartPluginException, [A.BocException, A.TonContractException, A.KeyException, A.DictException]); + _inherit(A.TonContract, A._TonContract_Object_ContractProvider); + _inherit(A.WalletContract, A.TonContract); + _inherit(A._VersionedWalletContract_WalletContract_VerionedProviderImpl, A.WalletContract); + _inherit(A.VersionedWalletContract, A._VersionedWalletContract_WalletContract_VerionedProviderImpl); + _inheritMany(A.VersionedWalletContract, [A.WalletV1R1, A.WalletV1R2, A.WalletV1R3, A.WalletV2R1, A.WalletV2R2, A.WalletV3R1, A.WalletV3R2, A.WalletV4, A.WalletV5R1]); + _inherit(A.TonSerialization, A._TonSerialization_Object_JsonSerialization); + _inheritMany(A.TonSerialization, [A.V5R1Context, A.StateInit]); + _inheritMany(A.V5R1Context, [A.V5R1CustomContext, A.V5R1ClientContext]); + _inheritMany(A.VersionedWalletState, [A.NoneSubWalletVersionedWalletState, A.SubWalletVersionedWalletState, A.V5VersionedWalletState]); _inheritMany(A.TonApiRequestParam, [A.TonCenterPostRequestParam, A.TonApiGetBlockchainMasterchainHead]); _inherit(A.TonApiError, A.RPCError); _inherit(A.TonCenterGetMasterchainInfo, A.TonCenterPostRequestParam); @@ -60523,15 +64379,9 @@ _inherit(A.BlockchainBlockResponse, A._BlockchainBlockResponse_Object_JsonSerialization); _inherit(A.XRPLedgerRequest, A.LookupByLedgerRequest); _inherit(A.RPCServerState, A.XRPLedgerRequest); - _inherit(A.PageMessage, A._PageMessage_Object_CborSerializable); - _inheritMany(A.PageMessage, [A.ClientMessageEthereum, A.ClientMessageSolana, A.ClientMessageTron]); - _inherit(A.JSWalletMessage, A._JSWalletMessage_Object_CborSerializable); - _inheritMany(A.JSWalletMessage, [A.JSWalletNetworkEvent, A.JSWalletMessageResponse]); - _inheritMany(A.JSWalletNetworkEvent, [A.JSWalletMessageResponseEthereum, A.JSWalletMessageResponseSolana, A.JSWalletMessageResponseTron]); - _inheritMany(A.ChainWeb3State, [A.EthereumWeb3State, A.SolanaWeb3State, A.TronWeb3State]); - _inheritMany(A.JSNetworkHandler, [A.JSEthereumHandler, A.JSSolanaHandler, A.JSTronHandler]); - _inherit(A.JSPageRequest, A._JSPageRequest_Object_CborSerializable); - _inheritMany(A.PageNetworkController, [A.EthereumPageController, A.SolanaPageController, A.TronPageController]); + _inheritMany(A.ChainWeb3State, [A.EthereumWeb3State, A.SolanaWeb3State, A.TonWeb3State, A.TronWeb3State]); + _inheritMany(A.JSNetworkHandler, [A.JSEthereumHandler, A.JSSolanaHandler, A.JSTonHandler, A.JSTronHandler]); + _inheritMany(A.PageNetworkController, [A.EthereumPageController, A.SolanaPageController, A.TonPageController, A.TronPageController]); _inherit(A.JSWebviewWallet, A.JSWalletHandler); _mixin(A.UnmodifiableListBase, A.UnmodifiableListMixin); _mixin(A.__CastListBase__CastIterableBase_ListMixin, A.ListBase); @@ -60594,6 +64444,8 @@ _mixin(A._CardanoAddrDetails_Object_Equatable, A.Equatable); _mixin(A._CardanoAddrDetails_Object_Equatable_CborSerializable, A.CborSerializable); _mixin(A._CosmosNativeCoin_Object_CborSerializable, A.CborSerializable); + _mixin(A._TonAccountContext_Object_CborSerializable, A.CborSerializable); + _mixin(A._TonAccountContext_Object_CborSerializable_Equatable, A.Equatable); _mixin(A._TronAccountResourceInfo_Object_CborSerializable, A.CborSerializable); _mixin(A._AccountPermission_Object_CborSerializable, A.CborSerializable); _mixin(A._AssetV2_Object_CborSerializable, A.CborSerializable); @@ -60619,6 +64471,7 @@ _mixin(A._ChainsHandler_Object_CborSerializable, A.CborSerializable); _mixin(A._Web3EncryptedMessage_Object_CborSerializable, A.CborSerializable); _mixin(A._Web3MessageCore_Object_CborSerializable, A.CborSerializable); + _mixin(A._Web3MessageCore_Object_CborSerializable_JsonSerialization, A.JsonSerialization); _mixin(A._Web3AccountAcitvity_Object_CborSerializable, A.CborSerializable); _mixin(A._Web3APPAuthentication_Object_CborSerializable, A.CborSerializable); _mixin(A._Web3ChainAccount_Object_CborSerializable, A.CborSerializable); @@ -60627,25 +64480,26 @@ _mixin(A._Web3GlobalRequestParams_Web3MessageCore_JsonSerialization, A.JsonSerialization); _mixin(A._Web3SolanaSendTransactionData_Object_CborSerializable, A.CborSerializable); _mixin(A._Web3SolanaSendTransactionOptions_Object_CborSerializable, A.CborSerializable); + _mixin(A._Web3TonTransactionMessage_Object_CborSerializable, A.CborSerializable); _mixin(A._ADAAddress_Object_ADASerialization, A.ADASerialization); _mixin(A._StakeCredType_Object_ADASerialization, A.ADASerialization); _mixin(A._FixedBytes_Object_ADASerialization, A.ADASerialization); _mixin(A._MetadataApi_Object_MetadataApiInterface, A.MetadataApiInterface); _mixin(A._MetadataV14_SubstrateMetadata_LatestMetadataInterface, A.LatestMetadataInterface); _mixin(A._MetadataV15_SubstrateMetadata_LatestMetadataInterface, A.LatestMetadataInterface); + _mixin(A._TonContract_Object_ContractProvider, A.ContractProvider); + _mixin(A._VersionedWalletContract_WalletContract_VerionedProviderImpl, A.VerionedProviderImpl); _mixin(A._BlockCurrencyCollectionResponse_Object_JsonSerialization, A.JsonSerialization0); _mixin(A._BlockCurrencyCollectionOtherItemResponse_Object_JsonSerialization, A.JsonSerialization0); _mixin(A._BlockValueFlowResponse_Object_JsonSerialization, A.JsonSerialization0); _mixin(A._BlockchainBlockResponse_Object_JsonSerialization, A.JsonSerialization0); - _mixin(A._JSPageRequest_Object_CborSerializable, A.CborSerializable); - _mixin(A._JSWalletMessage_Object_CborSerializable, A.CborSerializable); - _mixin(A._PageMessage_Object_CborSerializable, A.CborSerializable); + _mixin(A._TonSerialization_Object_JsonSerialization, A.JsonSerialization0); })(); var init = { typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []}, mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List", Object: "Object", Map: "Map"}, mangledNames: {}, - types: ["bool(String,@)", "~()", "0&()", "SubstrateEd25519AddrEncoder([@])", "EthAddrEncoder([@])", "P2PKHAddrEncoder([@])", "SubstrateSecp256k1AddrEncoder([@])", "String()", "AtomAddrEncoder([@])", "SubstrateSr25519AddrEncoder([@])", "P2SHAddrEncoder([@])", "BlockchainAddressEncoder([@])", "Object()", "ProviderAuth(CborObject)", "Null()", "String(String)", "Future()", "~(@)", "@(@)", "~(String,JavaScriptFunction)", "Map(@)", "int(int)", "List(EncoderResult)", "Object?()", "Null(@)", "bool(String)", "int(int,int)", "bool(@)", "ResourceCode(int)", "Null(JSObject)", "bool(Web3SolanaChainAccount)", "bool(Web3TronChainAccount)", "~(JSObject)", "Map()", "bool(ProtocolBufferDecoderResult<@>)", "ETHAddress(String)", "AdaByronIcarusAddrEncoder([@])", "SmartContractBABIEntryParam(@)", "XrpAddrEncoder([@])", "P2WPKHAddrEncoder([@])", "JSObject(Object)", "AdaShelleyAddrEncoder([@])", "bool(_Highlight)", "int()", "bool(int)", "Future>()", "Object?(Object?)", "int(String,String)", "JSObject()", "bool(Web3EthereumChainAccount)", "CborTagValue<@>(Web3AccountAcitvity)", "JSObject(JSObject)", "Web3AccountAcitvity(@)", "~(~())", "String(Match)", "bool(TronChainType)", "Future()", "~(Object?)", "List(List)", "bool(APIProvider)", "Map(SmartContractBABIEntryParam)", "ErgoP2PKHAddrEncoder([@])", "int(@,@)", "bool(SmartContractAbiStateMutabilityType)", "bool(SmartContractAbiEntryType)", "ReceiveDescription(@)", "bool(X509Certificate)", "bool(String,List)", "SpendDescription(@)", "bool(TransactionContractType)", "NeoAddrEncoder([@])", "OkexAddrEncoder([@])", "XlmAddrEncoder([@])", "bool(EthereumChain)", "SolAddrEncoder([@])", "ResourceCode()", "TrxAddrEncoder([@])", "TronAddress(List)", "TonAddrEncoder([@])", "bool(JSObject)", "~(Object?,Object?)", "PermissionType()", "@()", "bool(PermissionType)", "P2TRAddrEncoder([@])", "bool(AccountType)", "Permission(List)", "List(String,List)", "bool(EthereumEventTypes)", "String(int)", "EncoderResult(@)", "int(Object?)", "~(String,@)", "AbiParameter(String)", "String(Eip712TypedDataV1)", "bool(CborBase64Types)", "List(SolAddress)", "bool(SolAddress)", "MapEntry<@,@>(@)", "Map(Map)", "String(List)", "bool(ADANetwork)", "bool(Web3TronRequestMethods)", "Map(SignedExtensionMetadataV14)", "int(String?)", "int(int,Layout<@>)", "bool(TronEventTypes)", "SignedExtensionMetadataV14(@)", "bool(Web3SolanaRequestMethods)", "bool(SolanaEventTypes)", "Map(Si1Field)", "Si1Field(@)", "bool(Object?,Object?)", "bool(ETHTransactionType)", "int(ProtocolBufferDecoderResult<@>)", "@(String)", "bool(Web3EthereumRequestMethods)", "XmrAddrEncoder([@])", "PermissionKeys(@)", "FreeAssetNetUsageV2(@)", "AssetV2(@)", "AdaByronLegacyAddrEncoder([@])", "UnfrozenV2(@)", "FrozenV2(@)", "AccountPermission(@)", "FrozenSupply(@)", "bool(NetworkType)", "~(Uint8List,String,int)", "EthereumAPIProvider(@)", "~(Object,StackTrace)", "RippleNFToken(@)", "Future()", "RippleIssueToken(@)", "TronTRC10Token(@)", "Null(Object,StackTrace)", "APIProvider()", "TronTRC20Token(@)", "AtomNist256P1AddrEncoder([@])", "Map?(String)", "Future()", "VoteWitnessContractVote(@)", "bool(ResourceCode)", "SolAddress(SolAddress)", "bool(ApiRequest)", "Future()", "bool(ProviderAuthType)", "bool(ServiceProtocol)", "EthereumSubscribeResult()", "BitcoinMultiSigSignerDetais(@)", "String(@)", "String(P2shAddressType)", "TonJettonToken(@)", "TronMultiSigSignerDetais(@)", "bool(BitcoinExplorerProviderType)", "Future()", "RippleMultiSigSignerDetais(@)", "Future()", "Future<@>()", "WalletNetwork>()", "ICardanoAddress()", "ContactCore(@)", "IBitcoinAddress()", "ContactCore(@)", "ICosmosAddress()", "ContactCore(@)", "IEthAddress()", "ContactCore(@)", "ISolanaAddress()", "ContactCore(@)", "ISubstrateAddress()", "ContactCore(@)", "ITonAddress()", "ContactCore(@)", "ITronAddress()", "ContactCore(@)", "IXRPAddress()", "ContactCore(@)", "BaseBitcoinAPIProvider(@)", "CardanoAPIProvider(@)", "CosmosAPIProvider(@)", "CosmosNativeCoin(@)", "Future<~>()", "RippleAPIProvider(@)", "SolanaAPIProvider(@)", "SubstrateAPIProvider(@)", "TonAPIProvider(@)", "TronAPIProvider(@)", "bool(CosmosNetworkTypes)", "bool(SolanaWeb3TransactionResponseType)", "Future()", "bool(SeedTypes)", "Bip32KeyIndex(int?)", "bool(int?)", "bool(AddressDerivationType)", "bool(CustomCoins)", "Null(~)", "ContentType()", "CoingeckoCoin(CborObject)", "Chain,@,TokenCore<@>,NFTCore,ChainAccount,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>(@)", "bool(Web3MessageTypes)", "APPImage(CborObject)", "bool(ContentType)", "Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>(CborObject)", "bool(WalletEventTypes)", "EthereumAPIProvider(String)", "~(String,String)", "MediaType()", "Web3EthereumChainAccount(@)", "~(List)", "CborTagValue<@>(Web3EthereumChainAccount)", "int(String)", "bool(String,String)", "EIP712Base()", "bool(Web3GlobalRequestMethods)", "bool(String,String?)", "Web3SolanaSendTransactionData(CborTagValue<@>)", "Web3SolanaSendTransactionOptions(CborObject)", "CborTagValue<@>(Web3SolanaSendTransactionData)", "Map(Web3SolanaSendTransactionData)", "Web3SolanaChainAccount(@)", "CborTagValue<@>(Web3SolanaChainAccount)", "String(Layout<@>)", "@(Map)", "Web3TronChainAccount(@)", "CborTagValue<@>(Web3TronChainAccount)", "List(String)", "~(int,Layout<@>)", "bool(EthereumMethods)", "List(int)", "Future()", "Map(CompiledInstruction)", "List(CborBytesValue)", "SolAddress(List)", "bool(AbiParameter)", "bool(EIP712Version)", "int(EIP712Version)", "Eip712TypeDetails(@)", "MapEntry>>(String,List)", "Map(Eip712TypeDetails)", "Eip712TypedDataV1(@)", "@(Eip712TypedDataV1)", "String(CborStringValue)", "Map(Eip712TypedDataV1)", "List(List,Eip712TypeDetails)", "Tuple(@)", "String(Tuple)", "@(Tuple)", "CborObject(@)", "String(Eip712TypeDetails)", "bool(SubstrateCoins)", "bool(MoneroCoins)", "bool(EllipticCurveTypes)", "AccountType(int)", "Permission(@)", "bool(Cip1852Coins)", "Map(Permission)", "bool(BipProposal)", "AccountId(List)", "TronKey(@)", "TronKey(List)", "Map(TronKey)", "bool(Bip86Coins)", "bool(Bip84Coins)", "AssetIssueContractFrozenSupply(@)", "AssetIssueContractFrozenSupply(List)", "Map(AssetIssueContractFrozenSupply)", "bool(Bip49Coins)", "ZilAddrEncoder([@])", "Bip32KeyIndex(String)", "XtzAddrEncoder([@])", "NearAddrEncoder([@])", "MapEntry(@,@)", "MapEntry(BigInt,BigInt)", "NanoAddrEncoder([@])", "InjAddrEncoder([@])", "Map(SpendDescription)", "Map(ReceiveDescription)", "IcxAddrEncoder([@])", "SmartContractAbiEntryType()", "OneAddrEncoder([@])", "SmartContractAbiStateMutabilityType()", "SmartContractABI(List)", "SmartContractABIEntry(@)", "SmartContractABIEntry(List)", "Map(SmartContractABIEntry)", "FilSecp256k1AddrEncoder([@])", "EosAddrEncoder([@])", "List(@)", "TransactionContract(@)", "Authority(@)", "TransactionContract(List)", "Authority(List)", "Map(Authority)", "Map(TransactionContract)", "TronAddress(String)", "TronAddress(@)", "String(TronAddress)", "EgldAddrEncoder([@])", "Map(VoteWitnessContractVote)", "AvaxXChainAddrEncoder([@])", "AvaxPChainAddrEncoder([@])", "Object(@)", "String(String?)", "bool(PrimitiveTypes)", "String(PrimitiveTypes)", "Si1TypeParameter(@)", "int?(Si1TypeParameter)", "Map(Si1TypeParameter)", "bool(Si1TypeDefsIndexesConst)", "AptosAddrEncoder([@])", "AlgoAddrEncoder([@])", "Si1Variant(@)", "Map(Si1Variant)", "bool(StorageHasherV11Options)", "bool(Bip44Coins)", "Future()", "bool(ADAByronAddrTypes)", "Map(PalletMetadataV14)", "PalletConstantMetadataV14(@)", "Map(PalletConstantMetadataV14)", "StorageEntryMetadataV14(@)", "Map(StorageEntryMetadataV14)", "MapEntry(@)", "Map(PortableTypeV14)", "StorageHasherV14(@)", "Map(StorageHasherV14)", "RuntimeApiMetadataV15(@)", "Map(PalletMetadataV15)", "Map(RuntimeApiMetadataV15)", "RuntimeApiMethodMetadataV15(@)", "Map(RuntimeApiMethodMetadataV15)", "RuntimeApiMethodParamMetadataV15(@)", "Map(RuntimeApiMethodParamMetadataV15)", "bool(StorageEntryModifierV9)", "String?()", "int(_Line)", "NetworkType(CborObject)", "Object(_Line)", "Object(_Highlight)", "int(_Highlight,_Highlight)", "List<_Line>(MapEntry>)", "SourceSpanWithContext()", "bool(WalletVersion)", "bool(MapEntry)", "String(MapEntry)", "bool(TonApiType)", "bool(MapEntry)", "BlockCurrencyCollectionOtherItemResponse(@)", "Map(BlockCurrencyCollectionOtherItemResponse)", "bool(ADAAddressType)", "bool(Object,Object,Object?,Object?)", "Object?(Object,Object)", "bool(BasedUtxoNetwork)", "bool(BitcoinAddressType)", "List?(int)", "~(@[StackTrace?])", "Web3EthereumChainAccount?()", "String(Web3EthereumChainAccount)", "~(RawSocketEvent)", "~(EthereumSubscribeResult)", "Map?()", "Null(JavaScriptFunction,JavaScriptFunction)", "Object(Object,StackTrace)", "bool(JSWalletMessageType)", "bool(JSWalletResponseType)", "bool(JSClientType)", "Future(PageMessage)", "~([RawSocket?])", "Future(RawSocket)", "SecureSocket(RawSecureSocket)", "Uint8List(@,@)", "~(String,String?)", "JSObject(JSArray)", "JSObject(JSObject[JSObject?])", "JSObject(JSArray[JSObject?])", "Map(ClientSolanaTransactionMessage)", "Null(Object?)", "SolanaWeb3TransactionResponse(Map)", "String?(String?)", "bool(JSObject?)", "~(String,int?)", "bool(SolanaChain)", "Web3SolanaChainAccount?()", "String(Web3SolanaChainAccount)", "ClientSolanaTransactionMessage(@)", "SolAddress()", "~(String,int)", "bool(TronChain)", "Web3TronChainAccount?()", "String(Web3TronChainAccount)", "bool(AccountPermission)", "~(JSWalletMessage)", "~(@,@)", "bool(JSWebviewTraget)", "_Future<@>(@)", "~(Object[StackTrace?])", "~(int,@)", "Null(@,StackTrace)", "0^(0^,0^)", "Null(~())", "@(@,String)", "List(String,List[Bech32Encodings])", "bool(String,List[Bech32Encodings])", "String(MapEntry)"], + types: ["~()", "bool(String,@)", "0&()", "SubstrateEd25519AddrEncoder([@])", "String()", "Object()", "EthAddrEncoder([@])", "P2PKHAddrEncoder([@])", "AtomAddrEncoder([@])", "P2SHAddrEncoder([@])", "SubstrateSecp256k1AddrEncoder([@])", "SubstrateSr25519AddrEncoder([@])", "BlockchainAddressEncoder([@])", "ProviderAuth(CborObject)", "Future()", "Null()", "String(String)", "~(String,JavaScriptFunction)", "@(@)", "~(@)", "Object?()", "JSObject(JSObject)", "List(EncoderResult)", "int(int)", "Object?(Object?)", "int(int,int)", "Map(@)", "bool(String)", "bool(@)", "~(JSObject)", "List(List)", "ResourceCode(int)", "Null(@)", "int()", "AdaByronIcarusAddrEncoder([@])", "Null(JSObject)", "JSObject()", "XrpAddrEncoder([@])", "int(String,String)", "P2WPKHAddrEncoder([@])", "ETHAddress(String)", "Web3AccountAcitvity(@)", "bool(ProtocolBufferDecoderResult<@>)", "bool(Web3SolanaChainAccount)", "bool(Web3TonChainAccount)", "bool(Web3TronChainAccount)", "Map()", "AdaShelleyAddrEncoder([@])", "SmartContractBABIEntryParam(@)", "CborTagValue<@>(Web3AccountAcitvity)", "bool(_Highlight)", "JSObject(Object[String?])", "bool(TronChainType)", "~(Object?)", "Future>()", "Future()", "String(Match)", "~(~())", "bool(int)", "bool(Web3EthereumChainAccount)", "Map?(String)", "ErgoP2PKHAddrEncoder([@])", "XmrAddrEncoder([@])", "NeoAddrEncoder([@])", "OkexAddrEncoder([@])", "XlmAddrEncoder([@])", "SolAddrEncoder([@])", "TrxAddrEncoder([@])", "TonAddrEncoder([@])", "~(String,@)", "int(String?)", "P2TRAddrEncoder([@])", "bool(CborBase64Types)", "Map(Map)", "String(List)", "int(int,Layout<@>)", "~(Uint8List,String,int)", "AdaByronLegacyAddrEncoder([@])", "bool(NetworkType)", "bool(X509Certificate)", "Future()", "bool(APIProvider)", "APIProvider()", "Future()", "JSObject(Object?)", "bool(JSClientType)", "bool(JSEventType)", "bool(EthereumChain)", "@(String)", "MapEntry<@,@>(@)", "Map(SignedExtensionMetadataV14)", "SignedExtensionMetadataV14(@)", "Map(Si1Field)", "Si1Field(@)", "int(ProtocolBufferDecoderResult<@>)", "bool(Object?,Object?)", "VoteWitnessContractVote(@)", "Map(SmartContractBABIEntryParam)", "bool(SmartContractAbiStateMutabilityType)", "Object(JSObject)", "int(@,@)", "bool(SmartContractAbiEntryType)", "SpendDescription(@)", "bool(TransactionContractType)", "ResourceCode()", "int(Object?)", "bool(String,List)", "bool(ResourceCode)", "TronAddress(List)", "Null(Object,StackTrace)", "PermissionType()", "bool(PermissionType)", "bool(AccountType)", "Permission(List)", "~(Object,StackTrace)", "EncoderResult(@)", "AbiParameter(String)", "String(Eip712TypedDataV1)", "List(SolAddress)", "bool(SolAddress)", "bool(ADANetwork)", "AtomNist256P1AddrEncoder([@])", "bool(Web3TronRequestMethods)", "bool(Web3TonRequestMethods)", "bool(Web3SolanaRequestMethods)", "TronTRC20Token(@)", "bool(JSObject)", "String(int)", "bool(ETHTransactionType)", "@()", "bool(Web3EthereumRequestMethods)", "SolanaWeb3TransactionResponse(Map)", "PermissionKeys(@)", "FreeAssetNetUsageV2(@)", "~(Object?,Object?)", "List(String,List)", "AssetV2(@)", "UnfrozenV2(@)", "FrozenV2(@)", "~(@,@)", "AccountPermission(@)", "FrozenSupply(@)", "EthereumAPIProvider(@)", "RippleNFToken(@)", "RippleIssueToken(@)", "TronTRC10Token(@)", "ReceiveDescription(@)", "EthereumSubscribeResult()", "BitcoinMultiSigSignerDetais(@)", "String(@)", "String(P2shAddressType)", "TonJettonToken(@)", "TronMultiSigSignerDetais(@)", "bool(ServiceProtocol)", "bool(ProviderAuthType)", "RippleMultiSigSignerDetais(@)", "Future()", "List?(int)", "WalletNetwork>()", "ICardanoAddress()", "ContactCore(@)", "IBitcoinAddress()", "ContactCore(@)", "ICosmosAddress()", "ContactCore(@)", "IEthAddress()", "ContactCore(@)", "ISolanaAddress()", "ContactCore(@)", "ISubstrateAddress()", "ContactCore(@)", "ITonAddress()", "ContactCore(@)", "ITronAddress()", "ContactCore(@)", "IXRPAddress()", "ContactCore(@)", "BaseBitcoinAPIProvider(@)", "CardanoAPIProvider(@)", "CosmosAPIProvider(@)", "CosmosNativeCoin(@)", "Future()", "RippleAPIProvider(@)", "SolanaAPIProvider(@)", "SubstrateAPIProvider(@)", "TonAPIProvider(@)", "TronAPIProvider(@)", "bool(CosmosNetworkTypes)", "bool(SolanaWeb3TransactionResponseType)", "bool(TonAccountContextType)", "Null(@,StackTrace)", "~(@[StackTrace?])", "Future()", "bool(ApiRequest)", "~(RawSocketEvent)", "bool(BitcoinExplorerProviderType)", "Future()", "Future()", "CoingeckoCoin(CborObject)", "Chain,@,TokenCore<@>,NFTCore,ChainAccount,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>(@)", "bool(Web3MessageTypes)", "APPImage(CborObject)", "NetworkType(CborObject)", "Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>(CborObject)", "Future<@>()", "EthereumAPIProvider(String)", "bool(BitcoinAddressType)", "Future<~>()", "Web3EthereumChainAccount(@)", "~(int,@)", "CborTagValue<@>(Web3EthereumChainAccount)", "bool(BasedUtxoNetwork)", "Future()", "EIP712Base()", "bool(SeedTypes)", "Bip32KeyIndex(int?)", "Web3SolanaSendTransactionData(CborTagValue<@>)", "Web3SolanaSendTransactionOptions(CborObject)", "CborTagValue<@>(Web3SolanaSendTransactionData)", "Map(Web3SolanaSendTransactionData)", "Web3SolanaChainAccount(@)", "CborTagValue<@>(Web3SolanaChainAccount)", "~(Object[StackTrace?])", "bool(int?)", "TonAddress(String)", "Web3TonTransactionMessage(@)", "Web3TonTransactionMessage(CborTagValue<@>)", "CborTagValue<@>(Web3TonTransactionMessage)", "Map(Web3TonTransactionMessage)", "Web3TonChainAccount(@)", "CborTagValue<@>(Web3TonChainAccount)", "bool(ADAAddressType)", "bool(AddressDerivationType)", "Web3TronChainAccount(@)", "CborTagValue<@>(Web3TronChainAccount)", "bool(ADAByronAddrTypes)", "Cell()", "bool(CustomCoins)", "bool(EthereumMethods)", "Null(~)", "SolAddress(SolAddress)", "Map(CompiledInstruction)", "ContentType()", "SolAddress(List)", "bool(AbiParameter)", "bool(EIP712Version)", "int(EIP712Version)", "Eip712TypeDetails(@)", "MapEntry>>(String,List)", "Map(Eip712TypeDetails)", "Eip712TypedDataV1(@)", "@(Eip712TypedDataV1)", "bool(ContentType)", "Map(Eip712TypedDataV1)", "List(List,Eip712TypeDetails)", "Tuple(@)", "String(Tuple)", "@(Tuple)", "bool(WalletEventTypes)", "String(Eip712TypeDetails)", "~([RawSocket?])", "String(MapEntry)", "~(String,String)", "AccountType(int)", "Permission(@)", "MediaType()", "Map(Permission)", "~(List)", "AccountId(List)", "TronKey(@)", "TronKey(List)", "Map(TronKey)", "Future(RawSocket)", "int(String)", "AssetIssueContractFrozenSupply(@)", "AssetIssueContractFrozenSupply(List)", "Map(AssetIssueContractFrozenSupply)", "bool(String,String)", "bool(String,String?)", "SecureSocket(RawSecureSocket)", "String(Layout<@>)", "Uint8List(@,@)", "MapEntry(@,@)", "MapEntry(BigInt,BigInt)", "@(Map)", "Bip32KeyIndex(String)", "Map(SpendDescription)", "Map(ReceiveDescription)", "List(String)", "SmartContractAbiEntryType()", "~(int,Layout<@>)", "SmartContractAbiStateMutabilityType()", "SmartContractABI(List)", "SmartContractABIEntry(@)", "SmartContractABIEntry(List)", "Map(SmartContractABIEntry)", "bool(Bip44Coins)", "List(int)", "List(@)", "TransactionContract(@)", "Authority(@)", "TransactionContract(List)", "Authority(List)", "Map(Authority)", "Map(TransactionContract)", "TronAddress(String)", "TronAddress(@)", "String(TronAddress)", "List(CborBytesValue)", "Map(VoteWitnessContractVote)", "_Future<@>(@)", "String(CborStringValue)", "Object(@)", "String(String?)", "bool(PrimitiveTypes)", "String(PrimitiveTypes)", "Si1TypeParameter(@)", "int?(Si1TypeParameter)", "Map(Si1TypeParameter)", "bool(Si1TypeDefsIndexesConst)", "CborObject(@)", "~(String,String?)", "Si1Variant(@)", "Map(Si1Variant)", "bool(StorageHasherV11Options)", "~(String,int?)", "bool(SubstrateCoins)", "bool(MoneroCoins)", "Map(PalletMetadataV14)", "PalletConstantMetadataV14(@)", "Map(PalletConstantMetadataV14)", "StorageEntryMetadataV14(@)", "Map(StorageEntryMetadataV14)", "MapEntry(@)", "Map(PortableTypeV14)", "StorageHasherV14(@)", "Map(StorageHasherV14)", "RuntimeApiMetadataV15(@)", "Map(PalletMetadataV15)", "Map(RuntimeApiMetadataV15)", "RuntimeApiMethodMetadataV15(@)", "Map(RuntimeApiMethodMetadataV15)", "RuntimeApiMethodParamMetadataV15(@)", "Map(RuntimeApiMethodParamMetadataV15)", "bool(StorageEntryModifierV9)", "String?()", "int(_Line)", "AlgoAddrEncoder([@])", "Object(_Line)", "Object(_Highlight)", "int(_Highlight,_Highlight)", "List<_Line>(MapEntry>)", "SourceSpanWithContext()", "bool(CellType)", "String(Cell)", "~(String)", "CellTopoloigicalSort(String)", "int(@)", "List(Pruned)", "int(Pruned)", "bool(TonChain)", "bool(WalletVersion)", "BigInt(BigInt)", "bool(MapEntry)", "String(MapEntry)", "~(SimpleLibrary,Builder)", "Dictionary(Map)", "MapEntry>(BigInt,SimpleLibrary)", "bool(TonApiType)", "bool(MapEntry)", "BlockCurrencyCollectionOtherItemResponse(@)", "Map(BlockCurrencyCollectionOtherItemResponse)", "AptosAddrEncoder([@])", "bool(Object,Object,Object?,Object?)", "Object?(Object,Object)", "bool(EllipticCurveTypes)", "AvaxPChainAddrEncoder([@])", "~(String,int)", "Web3EthereumChainAccount?()", "String(Web3EthereumChainAccount)", "AvaxXChainAddrEncoder([@])", "~(EthereumSubscribeResult)", "Null(JavaScriptFunction,JavaScriptFunction)", "Object(Object,StackTrace)", "bool(JSWalletMessageType)", "bool(Cip1852Coins)", "bool(JSWalletResponseType)", "bool(BipProposal)", "bool(PageMessageType)", "bool(Bip86Coins)", "bool(Bip84Coins)", "bool(Bip49Coins)", "ZilAddrEncoder([@])", "XtzAddrEncoder([@])", "JSObject(JSArray)", "JSObject(JSObject[JSObject?])", "JSObject(JSArray[JSObject?])", "Null(~())", "JSSolanaSignTransactionResponse?(@)", "EgldAddrEncoder([@])", "bool(JSObject?)", "bool(SolanaChain)", "Web3SolanaChainAccount?()", "String(Web3SolanaChainAccount)", "SolAddress()", "NearAddrEncoder([@])", "bool(TonChainId)", "bool(TheOpenNetworkChain)", "Web3TonChainAccount()", "bool(ITonAddress)", "String(Web3TonChainAccount)", "bool(TronChain)", "Web3TronChainAccount?()", "String(Web3TronChainAccount)", "bool(AccountPermission)", "~(JSObject,JSClientType)", "NanoAddrEncoder([@])", "JSObject(@)", "bool(JSWebviewTraget)", "@(@,String)", "EosAddrEncoder([@])", "InjAddrEncoder([@])", "IcxAddrEncoder([@])", "0^(0^,0^)", "OneAddrEncoder([@])", "FilSecp256k1AddrEncoder([@])", "List(String,List[Bech32Encodings])", "bool(String,List[Bech32Encodings])", "bool(Web3GlobalRequestMethods)"], interceptorsByTag: null, leafTags: null, arrayRti: Symbol("$ti"), @@ -60653,8 +64507,8 @@ "2;": (t1, t2) => o => o instanceof A._Record_2 && t1._is(o._0) && t2._is(o._1) } }; - A._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"LegacyJavaScriptObject","PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"]},"JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"JavaScriptObject":{"JSObject":[]},"LegacyJavaScriptObject":{"JSObject":[]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"]},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"TrustedGetRuntimeType":[]},"CastStream":{"Stream":["2"],"Stream.T":"2"},"CastStreamSubscription":{"StreamSubscription":["2"]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"CodeUnits":{"ListBase":["int"],"UnmodifiableListMixin":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListBase.E":"int","UnmodifiableListMixin.E":"int"},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1","ListIterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2","ListIterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"ExpandIterable":{"Iterable":["2"],"Iterable.E":"2"},"ExpandIterator":{"Iterator":["2"]},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"TakeIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"WhereTypeIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereTypeIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_ListIndicesIterable":{"ListIterable":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"Iterable.E":"int","ListIterable.E":"int"},"ListMapView":{"MapBase":["int","1"],"_UnmodifiableMapMixin":["int","1"],"Map":["int","1"],"MapBase.K":"int","MapBase.V":"1","_UnmodifiableMapMixin.K":"int","_UnmodifiableMapMixin.V":"1"},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1","ListIterable.E":"1"},"_Record_2":{"_Record2":[],"_Record":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"],"_UnmodifiableMapMixin.K":"1","_UnmodifiableMapMixin.V":"2"},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"GeneralConstantMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"Instantiation":{"Closure":[],"Function":[]},"Instantiation1":{"Closure":[],"Function":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"NullThrownFromJavaScriptException":{"Exception":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Closure":[],"Function":[]},"Closure2Args":{"Closure":[],"Function":[]},"TearOffClosure":{"Closure":[],"Function":[]},"StaticClosure":{"Closure":[],"Function":[]},"BoundClosure":{"Closure":[],"Function":[]},"_CyclicInitializationError":{"Error":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"JsIdentityLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"JsConstantLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_Record2":{"_Record":[]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JSObject":[]},"NativeByteData":{"ByteData":[],"JSObject":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"JSObject":[]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"Float32List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","FixedLengthListMixin.E":"double"},"NativeFloat64List":{"Float64List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","FixedLengthListMixin.E":"double"},"NativeInt16List":{"NativeTypedArrayOfInt":[],"Int16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeInt32List":{"NativeTypedArrayOfInt":[],"Int32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeInt8List":{"NativeTypedArrayOfInt":[],"Int8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint16List":{"NativeTypedArrayOfInt":[],"Uint16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint32List":{"NativeTypedArrayOfInt":[],"Uint32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8ClampedList":{"NativeTypedArrayOfInt":[],"Uint8ClampedList":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8List":{"NativeTypedArrayOfInt":[],"Uint8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"_Future":{"Future":["1"]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_SyncStarIterator":{"Iterator":["1"]},"_SyncStarIterable":{"Iterable":["1"],"Iterable.E":"1"},"AsyncError":{"Error":[]},"TimeoutException":{"Exception":[]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"StreamView":{"Stream":["1"]},"_StreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventDispatch":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventDispatch":["1"]},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_EmptyStream":{"Stream":["1"],"Stream.T":"1"},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_HashMap":{"MapBase":["1","2"],"Map":["1","2"]},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_LinkedHashSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_LinkedHashSetIterator":{"Iterator":["1"]},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"UnmodifiableMapBase":{"MapBase":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"_MapBaseValueIterable":{"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_MapBaseValueIterator":{"Iterator":["2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"],"_UnmodifiableMapMixin.K":"1","_UnmodifiableMapMixin.V":"2"},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"Encoding":{"Codec":["String","List"]},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"Iterable.E":"String","ListIterable.E":"String"},"AsciiCodec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Base64Codec":{"Codec":["List","String"],"Codec.S":"List"},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"Latin1Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Utf8Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExpMatch":{"Match":[]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"_Exception":{"Exception":[]},"FormatException":{"Exception":[]},"IntegerDivisionByZeroException":{"Exception":[],"Error":[]},"_StringStackTrace":{"StackTrace":[]},"Runes":{"Iterable":["int"],"Iterable.E":"int"},"RuneIterator":{"Iterator":["int"]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"SecureSocket":{"Socket":[],"Stream":["Uint8List"],"StringSink":[]},"RawSecureSocket":{"RawSocket":[],"Stream":["RawSocketEvent"]},"_RawSecureSocket":{"RawSecureSocket":[],"RawSocket":[],"Stream":["RawSocketEvent"],"Stream.T":"RawSocketEvent"},"RawSocket":{"Stream":["RawSocketEvent"]},"Socket":{"Stream":["Uint8List"],"StringSink":[]},"TlsException":{"Exception":[]},"HandshakeException":{"Exception":[]},"NullRejectionException":{"Exception":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"P2shAddressType":{"BitcoinAddressType":[]},"PubKeyAddressType":{"BitcoinAddressType":[]},"P2pkhAddressType":{"BitcoinAddressType":[]},"SegwitAddresType":{"BitcoinAddressType":[]},"LegacyAddress":{"BitcoinBaseAddress":[]},"P2shAddress":{"BitcoinBaseAddress":[]},"P2pkhAddress":{"BitcoinBaseAddress":[]},"P2pkAddress":{"BitcoinBaseAddress":[]},"SegwitAddress":{"BitcoinBaseAddress":[]},"P2wpkhAddress":{"BitcoinBaseAddress":[]},"P2trAddress":{"BitcoinBaseAddress":[]},"P2wshAddress":{"BitcoinBaseAddress":[]},"BitcoinBasePluginException":{"BlockchainUtilsException":[],"Exception":[]},"BitcoinNetwork":{"BasedUtxoNetwork":[]},"LitecoinNetwork":{"BasedUtxoNetwork":[]},"DashNetwork":{"BasedUtxoNetwork":[]},"DogecoinNetwork":{"BasedUtxoNetwork":[]},"BitcoinCashNetwork":{"BasedUtxoNetwork":[]},"PepeNetwork":{"BasedUtxoNetwork":[]},"BitcoinSVNetwork":{"BasedUtxoNetwork":[]},"ElectrumBlockHeader":{"ElectrumRequest":["@","@"]},"ElectrumServerFeatures":{"ElectrumRequest":["@","@"]},"Base58ChecksumError":{"BlockchainUtilsException":[],"Exception":[]},"Bech32ChecksumError":{"BlockchainUtilsException":[],"Exception":[]},"AdaByronIcarusAddrEncoder":{"BlockchainAddressEncoder":[]},"AdaByronLegacyAddrEncoder":{"BlockchainAddressEncoder":[]},"AdaShelleyAddrEncoder":{"BlockchainAddressEncoder":[]},"AdaShelleyStakingAddrEncoder":{"BlockchainAddressEncoder":[]},"AlgoAddrEncoder":{"BlockchainAddressEncoder":[]},"AptosAddrEncoder":{"BlockchainAddressEncoder":[]},"AtomAddrEncoder":{"BlockchainAddressEncoder":[]},"AtomNist256P1AddrEncoder":{"BlockchainAddressEncoder":[]},"AvaxPChainAddrEncoder":{"BlockchainAddressEncoder":[]},"AvaxXChainAddrEncoder":{"BlockchainAddressEncoder":[]},"EgldAddrEncoder":{"BlockchainAddressEncoder":[]},"EosAddrEncoder":{"BlockchainAddressEncoder":[]},"ErgoP2PKHAddrEncoder":{"BlockchainAddressEncoder":[]},"EthAddrEncoder":{"BlockchainAddressEncoder":[]},"AddressConverterException":{"BlockchainUtilsException":[],"Exception":[]},"FilSecp256k1AddrEncoder":{"BlockchainAddressEncoder":[]},"IcxAddrEncoder":{"BlockchainAddressEncoder":[]},"InjAddrEncoder":{"BlockchainAddressEncoder":[]},"NanoAddrEncoder":{"BlockchainAddressEncoder":[]},"NearAddrEncoder":{"BlockchainAddressEncoder":[]},"NeoAddrEncoder":{"BlockchainAddressEncoder":[]},"OkexAddrEncoder":{"BlockchainAddressEncoder":[]},"OneAddrEncoder":{"BlockchainAddressEncoder":[]},"P2PKHAddrEncoder":{"BlockchainAddressEncoder":[]},"BchP2PKHAddrEncoder":{"BlockchainAddressEncoder":[]},"P2SHAddrEncoder":{"BlockchainAddressEncoder":[]},"BchP2SHAddrEncoder":{"BlockchainAddressEncoder":[]},"P2TRAddrEncoder":{"BlockchainAddressEncoder":[]},"P2WPKHAddrEncoder":{"BlockchainAddressEncoder":[]},"SolAddrEncoder":{"BlockchainAddressEncoder":[]},"SubstrateEd25519AddrEncoder":{"BlockchainAddressEncoder":[]},"SubstrateSr25519AddrEncoder":{"BlockchainAddressEncoder":[]},"SubstrateSecp256k1AddrEncoder":{"BlockchainAddressEncoder":[]},"TonAddrEncoder":{"BlockchainAddressEncoder":[]},"TrxAddrEncoder":{"BlockchainAddressEncoder":[]},"XlmAddrEncoder":{"BlockchainAddressEncoder":[]},"XmrAddrEncoder":{"BlockchainAddressEncoder":[]},"XrpAddrEncoder":{"BlockchainAddressEncoder":[]},"XtzAddrEncoder":{"BlockchainAddressEncoder":[]},"ZilAddrEncoder":{"BlockchainAddressEncoder":[]},"Bip32PathError":{"BlockchainUtilsException":[],"Exception":[]},"BipCoins":{"CryptoCoins":["BipCoinConfig"]},"Bip44Coins":{"CryptoCoins":["BipCoinConfig"]},"Bip49Coins":{"CryptoCoins":["BipCoinConfig"]},"Bip84Coins":{"CryptoCoins":["BipCoinConfig"]},"Bip86Coins":{"CryptoCoins":["BipCoinConfig"]},"BipBitcoinCashConf":{"BipCoinConfig":[],"CoinConfig":[]},"BipCoinConfig":{"CoinConfig":[]},"BipLitecoinConf":{"BipCoinConfig":[],"CoinConfig":[]},"Cip1852Coins":{"CryptoCoins":["BipCoinConfig"]},"CipProposal":{"BipProposal":[]},"Ed25519Blake2bPublicKey":{"IPublicKey":[]},"Ed25519PublicKey":{"IPublicKey":[]},"Ed25519KholawPublicKey":{"IPublicKey":[]},"Ed25519MoneroPublicKey":{"IPublicKey":[]},"Nist256p1PublicKey":{"IPublicKey":[]},"Secp256k1PublicKeyEcdsa":{"IPublicKey":[]},"Sr25519PublicKey":{"IPublicKey":[]},"MoneroCoinConf":{"CoinConfig":[]},"MoneroCoins":{"CryptoCoins":["MoneroCoinConf"]},"MoneroKeyError":{"BlockchainUtilsException":[],"Exception":[]},"MoneroPublicKey":{"IPublicKey":[]},"SubstrateCoinConf":{"CoinConfig":[]},"SubstrateCoins":{"CryptoCoins":["SubstrateCoinConf"]},"CborNumeric":{"CborObject":[]},"CborBaseUrlValue":{"CborObject":[]},"CborBigFloatValue":{"CborObject":[]},"CborBigIntValue":{"CborNumeric":[],"CborObject":[]},"CborBoleanValue":{"CborObject":[]},"CborBytesValue":{"CborObject":[]},"CborDynamicBytesValue":{"CborObject":[]},"CborTagValue":{"CborObject":[]},"CborEpochIntValue":{"CborObject":[]},"_CborDate":{"CborObject":[]},"CborStringDateValue":{"CborObject":[]},"CborEpochFloatValue":{"CborObject":[]},"CborDecimalFracValue":{"CborObject":[]},"CborFloatValue":{"CborObject":[]},"CborIntValue":{"CborNumeric":[],"CborObject":[]},"CborSafeIntValue":{"CborNumeric":[],"CborObject":[]},"CborListValue":{"CborObject":[]},"CborMapValue":{"CborObject":[]},"CborMimeValue":{"CborObject":[]},"CborNullValue":{"CborObject":[]},"CborUndefinedValue":{"CborObject":[]},"CborRegxpValue":{"CborObject":[]},"CborSetValue":{"CborObject":[]},"CborStringValue":{"CborObject":[]},"CborIndefiniteStringValue":{"CborObject":[]},"CborString":{"CborObject":[]},"CborUriValue":{"CborObject":[]},"AES":{"BlockCipher":[]},"ProjectiveECCPoint":{"AbstractPoint":[]},"EDPoint":{"AbstractPoint":[]},"RistrettoPoint":{"EDPoint":[],"AbstractPoint":[]},"SquareRootError":{"BlockchainUtilsException":[],"Exception":[]},"JacobiError":{"BlockchainUtilsException":[],"Exception":[]},"BlockchainUtilsException":{"Exception":[]},"ArgumentException":{"BlockchainUtilsException":[],"Exception":[]},"MessageException":{"BlockchainUtilsException":[],"Exception":[]},"RPCError":{"BlockchainUtilsException":[],"Exception":[]},"SequenceLayout":{"Layout":["List<1>"],"Layout.T":"List<1>"},"CompactOffsetLayout":{"ExternalLayout":[],"Layout":["int"],"Layout.T":"int"},"CompactBytes":{"Layout":["List"],"Layout.T":"List"},"ConstantLayout":{"Layout":["1"],"Layout.T":"1"},"CustomLayout":{"Layout":["2"],"Layout.T":"2"},"MapEntryLayout":{"Layout":["MapEntry<@,@>"],"Layout.T":"MapEntry<@,@>"},"NoneLayout":{"Layout":["@"],"Layout.T":"@"},"ExternalLayout":{"Layout":["int"]},"BaseIntiger":{"Layout":["1"]},"IntegerLayout":{"BaseIntiger":["int"],"Layout":["int"],"Layout.T":"int"},"UnionDiscriminatorLayout":{"Layout":["int"]},"UnionLayoutDiscriminatorLayout":{"Layout":["int"],"Layout.T":"int"},"OffsetLayout":{"ExternalLayout":[],"Layout":["int"],"Layout.T":"int"},"CompactIntLayout":{"Layout":["int"],"Layout.T":"int"},"OptionalLayout":{"Layout":["1?"],"Layout.T":"1?"},"PaddingLayout":{"Layout":["1"],"Layout.T":"1"},"RawBytesLayout":{"Layout":["List"],"Layout.T":"List"},"StructLayout":{"Layout":["Map"],"Layout.T":"Map"},"VariantLayout":{"Layout":["Map"],"Layout.T":"Map"},"Union":{"Layout":["Map"],"Layout.T":"Map"},"LayoutException":{"BlockchainUtilsException":[],"Exception":[]},"SS58ChecksumError":{"BlockchainUtilsException":[],"Exception":[]},"CanonicalizedMap":{"Map":["2","3"]},"TendermintRequestStatus":{"TendermintRequestParam":["Map","Map"],"TendermintRequestParam.0":"Map","TendermintRequestParam.1":"Map"},"ByteStream":{"StreamView":["List"],"Stream":["List"],"StreamView.T":"List","Stream.T":"List"},"ClientException":{"Exception":[]},"Request":{"BaseRequest":[]},"StreamedResponseV2":{"StreamedResponse":[]},"CaseInsensitiveMap":{"CanonicalizedMap":["String","String","1"],"Map":["String","1"],"CanonicalizedMap.K":"String","CanonicalizedMap.V":"1","CanonicalizedMap.C":"String"},"MRTNativePluginException":{"Exception":[]},"ApiProviderException":{"Exception":[]},"WalletException":{"Exception":[]},"_Live":{"LiveListenable":["1"]},"Live":{"_Live":["1"],"LiveListenable":["1"]},"APPImage":{"Equatable":[]},"WebsocketWeb":{"PlatformWebScoket":[]},"CustomCoins":{"CryptoCoins":["BipCoinConfig"]},"CustomProposal":{"BipProposal":[]},"AddressDerivationIndex":{"Equatable":[]},"Bip32AddressIndex":{"AddressDerivationIndex":[],"Equatable":[]},"MultiSigAddressIndex":{"AddressDerivationIndex":[],"Equatable":[]},"SubstrateAddressIndex":{"AddressDerivationIndex":[],"Equatable":[]},"BrowserCryptoWorker":{"IsolateCryptoWoker":[]},"BitcoinElectrumClient":{"BitcoinClient":["IBitcoinAddress"],"NetworkClient":["IBitcoinAddress","BaseBitcoinAPIProvider"]},"BitcoinExplorerApiProvider":{"BitcoinClient":["IBitcoinAddress"],"NetworkClient":["IBitcoinAddress","BaseBitcoinAPIProvider"]},"BitcoinClient":{"NetworkClient":["1","BaseBitcoinAPIProvider"]},"CardanoClient":{"NetworkClient":["ICardanoAddress","CardanoAPIProvider"]},"CosmosClient":{"NetworkClient":["ICosmosAddress","CosmosAPIProvider"]},"EthereumClient":{"NetworkClient":["IEthAddress","EthereumAPIProvider"]},"RippleClient":{"NetworkClient":["IXRPAddress","RippleAPIProvider"]},"SolanaClient":{"NetworkClient":["ISolanaAddress","SolanaAPIProvider"]},"SubstrateClient":{"NetworkClient":["ISubstrateAddress","SubstrateAPIProvider"]},"SubstrateGetApiAt":{"SubstrateRPCRequest":["String","+(MetadataApi,String)?"],"SubstrateRPCRequest.1":"+(MetadataApi,String)?","SubstrateRPCRequest.0":"String"},"SubstrateGetStateApi":{"SubstrateRPCRequest":["String","+(MetadataApi,String)?"],"SubstrateRPCRequest.1":"+(MetadataApi,String)?","SubstrateRPCRequest.0":"String"},"TonClient":{"NetworkClient":["ITonAddress","TonAPIProvider"]},"TronClient":{"NetworkClient":["ITronAddress","TronAPIProvider"]},"TronRequestGetAccountInfo":{"TVMRequestParam":["TronAccountInfo?","Map"],"TVMRequestParam.0":"TronAccountInfo?","TVMRequestParam.1":"Map"},"APIProvider":{"Equatable":[]},"BitcoinExplorerAPIProvider":{"BaseBitcoinAPIProvider":[],"APIProvider":[],"Equatable":[]},"ElectrumAPIProvider":{"BaseBitcoinAPIProvider":[],"APIProvider":[],"Equatable":[]},"BaseBitcoinAPIProvider":{"APIProvider":[],"Equatable":[]},"CardanoAPIProvider":{"APIProvider":[],"Equatable":[]},"CosmosAPIProvider":{"APIProvider":[],"Equatable":[]},"EthereumAPIProvider":{"APIProvider":[],"Equatable":[]},"RippleAPIProvider":{"APIProvider":[],"Equatable":[]},"SolanaAPIProvider":{"APIProvider":[],"Equatable":[]},"SubstrateAPIProvider":{"APIProvider":[],"Equatable":[]},"TonAPIProvider":{"APIProvider":[],"Equatable":[]},"TronAPIProvider":{"APIProvider":[],"Equatable":[]},"HTTPService":{"BaseServiceProtocol":["1"]},"BaseSocketService":{"BaseServiceProtocol":["1"]},"SSLService":{"BaseServiceProtocol":["1"]},"TCPService":{"BaseServiceProtocol":["1"]},"WebSocketService":{"BaseServiceProtocol":["1"]},"ElectrumSSLSocketService":{"SSLService":["ElectrumAPIProvider"],"BaseServiceProtocol":["ElectrumAPIProvider"],"BitcoinBaseElectrumRPCService":[],"SSLService.T":"ElectrumAPIProvider"},"ElectrumSocketService":{"TCPService":["ElectrumAPIProvider"],"BaseServiceProtocol":["ElectrumAPIProvider"],"BitcoinBaseElectrumRPCService":[],"TCPService.T":"ElectrumAPIProvider"},"ElectrumWebsocketService":{"WebSocketService":["ElectrumAPIProvider"],"BaseServiceProtocol":["ElectrumAPIProvider"],"BitcoinBaseElectrumRPCService":[],"WebSocketService.T":"ElectrumAPIProvider"},"BitcoinHTTPService":{"BaseServiceProtocol":["BitcoinExplorerAPIProvider"],"ApiService":[]},"CardanoHTTPService":{"BaseServiceProtocol":["CardanoAPIProvider"],"BlockfrostServiceProvider":[]},"TendermintHTTPService":{"BaseServiceProtocol":["CosmosAPIProvider"],"TendermintServiceProvider":[]},"EthereumHTTPService":{"BaseServiceProtocol":["EthereumAPIProvider"],"JSONRPCService":[]},"RippleHTTPService":{"BaseServiceProtocol":["RippleAPIProvider"],"RpcService":[]},"SolanaHTTPService":{"BaseServiceProtocol":["SolanaAPIProvider"],"SolanaJSONRPCService":[]},"SubstrateHttpService":{"BaseServiceProtocol":["SubstrateAPIProvider"],"SubstrateRPCService":[]},"TonHTTPService":{"BaseServiceProtocol":["TonAPIProvider"],"TonServiceProvider":[]},"TronHTTPService":{"BaseServiceProtocol":["TronAPIProvider"],"TronServiceProvider":[]},"EthereumWebsocketService":{"WebSocketService":["EthereumAPIProvider"],"BaseServiceProtocol":["EthereumAPIProvider"],"JSONRPCService":[],"WebSocketService.T":"EthereumAPIProvider"},"RippleWebsocketService":{"WebSocketService":["RippleAPIProvider"],"BaseServiceProtocol":["RippleAPIProvider"],"RpcService":[],"WebSocketService.T":"RippleAPIProvider"},"IBitcoinCashAddress":{"IBitcoinAddress":[],"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IBitcoinCashMultiSigAddress":{"IBitcoinAddress":[],"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IBitcoinAddress":{"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IBitcoinMultiSigAddress":{"IBitcoinAddress":[],"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"BitcoinMultiSigSignerDetais":{"Equatable":[]},"ICardanoAddress":{"ChainAccount":["ADAAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"ICosmosAddress":{"ChainAccount":["CosmosBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IEthAddress":{"ChainAccount":["ETHAddress","ETHERC20Token","NFTCore"],"Equatable":[]},"ISolanaAddress":{"ChainAccount":["SolAddress","SolanaSPLToken","NFTCore"],"Equatable":[]},"ISubstrateAddress":{"ChainAccount":["SubstrateAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"ITonAddress":{"ChainAccount":["TonAddress","TonJettonToken","NFTCore"],"Equatable":[]},"TronMultiSigSignerDetais":{"Equatable":[]},"TronMultiSignatureAddress":{"Equatable":[]},"ITronAddress":{"ChainAccount":["TronAddress","TronToken","NFTCore"],"Equatable":[]},"ITronMultisigAddress":{"ITronAddress":[],"ChainAccount":["TronAddress","TronToken","NFTCore"],"Equatable":[]},"RippleMultiSigSignerDetais":{"Equatable":[]},"RippleMultiSignatureAddress":{"Equatable":[]},"IXRPAddress":{"ChainAccount":["XRPAddress","RippleIssueToken","RippleNFToken"],"Equatable":[]},"IXRPMultisigAddress":{"IXRPAddress":[],"ChainAccount":["XRPAddress","RippleIssueToken","RippleNFToken"],"Equatable":[]},"EthereumChain":{"Chain":["EthereumAPIProvider","EthereumNetworkParams","ETHAddress","ETHERC20Token","NFTCore","IEthAddress","WalletEthereumNetwork","EthereumClient"],"Chain.6":"WalletEthereumNetwork","Chain.7":"EthereumClient","Chain.5":"IEthAddress","Chain.2":"ETHAddress"},"SolanaChain":{"Chain":["SolanaAPIProvider","SolanaNetworkParams","SolAddress","SolanaSPLToken","NFTCore","ISolanaAddress","WalletSolanaNetwork","SolanaClient"],"Chain.6":"WalletSolanaNetwork","Chain.7":"SolanaClient","Chain.5":"ISolanaAddress","Chain.2":"SolAddress"},"TronChain":{"Chain":["TronAPIProvider","TronNetworkParams","TronAddress","TronToken","NFTCore","ITronAddress","WalletTronNetwork","TronClient"],"Chain.6":"WalletTronNetwork","Chain.7":"TronClient","Chain.5":"ITronAddress","Chain.2":"TronAddress"},"ADAChain":{"Chain":["CardanoAPIProvider","CardanoNetworkParams","ADAAddress","TokenCore<@>","NFTCore","ICardanoAddress","WalletCardanoNetwork","CardanoClient"],"Chain.6":"WalletCardanoNetwork","Chain.7":"CardanoClient","Chain.5":"ICardanoAddress","Chain.2":"ADAAddress"},"BitcoinChain":{"Chain":["BaseBitcoinAPIProvider","BitcoinParams","BitcoinBaseAddress","TokenCore<@>","NFTCore","IBitcoinAddress","WalletBitcoinNetwork","BitcoinClient"],"Chain.6":"WalletBitcoinNetwork","Chain.7":"BitcoinClient","Chain.5":"IBitcoinAddress","Chain.2":"BitcoinBaseAddress"},"CosmosChain":{"Chain":["CosmosAPIProvider","CosmosNetworkParams","CosmosBaseAddress","TokenCore<@>","NFTCore","ICosmosAddress","WalletCosmosNetwork","CosmosClient"],"Chain.6":"WalletCosmosNetwork","Chain.7":"CosmosClient","Chain.5":"ICosmosAddress","Chain.2":"CosmosBaseAddress"},"SubstrateChain":{"Chain":["SubstrateAPIProvider","SubstrateNetworkParams","SubstrateAddress","TokenCore<@>","NFTCore","ISubstrateAddress","WalletPolkadotNetwork","SubstrateClient"],"Chain.6":"WalletPolkadotNetwork","Chain.7":"SubstrateClient","Chain.5":"ISubstrateAddress","Chain.2":"SubstrateAddress"},"TonChain":{"Chain":["TonAPIProvider","TonNetworkParams","TonAddress","TonJettonToken","NFTCore","ITonAddress","WalletTonNetwork","TonClient"],"Chain.6":"WalletTonNetwork","Chain.7":"TonClient","Chain.5":"ITonAddress","Chain.2":"TonAddress"},"RippleChain":{"Chain":["RippleAPIProvider","RippleNetworkParams","XRPAddress","RippleIssueToken","RippleNFToken","IXRPAddress","WalletXRPNetwork","RippleClient"],"Chain.6":"WalletXRPNetwork","Chain.7":"RippleClient","Chain.5":"IXRPAddress","Chain.2":"XRPAddress"},"BitcoinContact":{"ContactCore":["BitcoinBaseAddress"],"Equatable":[]},"CardanoContact":{"ContactCore":["ADAAddress"],"Equatable":[]},"CosmosContact":{"ContactCore":["CosmosBaseAddress"],"Equatable":[]},"EthereumContract":{"ContactCore":["ETHAddress"],"Equatable":[]},"SolanaContact":{"ContactCore":["SolAddress"],"Equatable":[]},"SubstrateContact":{"ContactCore":["SubstrateAddress"],"Equatable":[]},"TonContact":{"ContactCore":["TonAddress"],"Equatable":[]},"TronContact":{"ContactCore":["TronAddress"],"Equatable":[]},"RippleContact":{"ContactCore":["XRPAddress"],"Equatable":[]},"WalletNetwork":{"Equatable":[]},"WalletBitcoinNetwork":{"WalletNetwork":["BitcoinParams"],"Equatable":[]},"WalletXRPNetwork":{"WalletNetwork":["RippleNetworkParams"],"Equatable":[]},"WalletEthereumNetwork":{"WalletNetwork":["EthereumNetworkParams"],"Equatable":[]},"WalletTronNetwork":{"WalletNetwork":["TronNetworkParams"],"Equatable":[]},"WalletSolanaNetwork":{"WalletNetwork":["SolanaNetworkParams"],"Equatable":[]},"WalletCardanoNetwork":{"WalletNetwork":["CardanoNetworkParams"],"Equatable":[]},"WalletCosmosNetwork":{"WalletNetwork":["CosmosNetworkParams"],"Equatable":[]},"WalletTonNetwork":{"WalletNetwork":["TonNetworkParams"],"Equatable":[]},"WalletPolkadotNetwork":{"WalletNetwork":["SubstrateNetworkParams"],"Equatable":[]},"WalletBitcoinCashNetwork":{"WalletBitcoinNetwork":[],"WalletNetwork":["BitcoinParams"],"Equatable":[]},"WalletKusamaNetwork":{"WalletPolkadotNetwork":[],"WalletNetwork":["SubstrateNetworkParams"],"Equatable":[]},"BitcoinParams":{"NetworkCoinParams":["BaseBitcoinAPIProvider"],"NetworkCoinParams.0":"BaseBitcoinAPIProvider"},"CardanoNetworkParams":{"NetworkCoinParams":["CardanoAPIProvider"],"NetworkCoinParams.0":"CardanoAPIProvider"},"CosmosNetworkParams":{"NetworkCoinParams":["CosmosAPIProvider"],"NetworkCoinParams.0":"CosmosAPIProvider"},"EthereumNetworkParams":{"NetworkCoinParams":["EthereumAPIProvider"],"NetworkCoinParams.0":"EthereumAPIProvider"},"RippleNetworkParams":{"NetworkCoinParams":["RippleAPIProvider"],"NetworkCoinParams.0":"RippleAPIProvider"},"SolanaNetworkParams":{"NetworkCoinParams":["SolanaAPIProvider"],"NetworkCoinParams.0":"SolanaAPIProvider"},"SubstrateNetworkParams":{"NetworkCoinParams":["SubstrateAPIProvider"],"NetworkCoinParams.0":"SubstrateAPIProvider"},"TonNetworkParams":{"NetworkCoinParams":["TonAPIProvider"],"NetworkCoinParams.0":"TonAPIProvider"},"TronNetworkParams":{"NetworkCoinParams":["TronAPIProvider"],"NetworkCoinParams.0":"TronAPIProvider"},"CardanoAddrDetails":{"Equatable":[]},"SolanaWeb3TransactionSignResponse":{"SolanaWeb3TransactionResponse":[]},"SolanaWeb3TransactionSendResponse":{"SolanaWeb3TransactionResponse":[]},"SolanaWeb3TransactionErrorResponse":{"SolanaWeb3TransactionResponse":[]},"PermissionKeys":{"Equatable":[]},"RippleNFToken":{"NFTCore":[],"Equatable":[]},"ETHERC20Token":{"TokenCore":["BigInt"],"Equatable":[]},"RippleIssueToken":{"TokenCore":["BigRational"],"Equatable":[]},"TonJettonToken":{"TokenCore":["BigInt"],"Equatable":[]},"SolanaSPLToken":{"TokenCore":["BigInt"],"Equatable":[]},"TronTRC10Token":{"TronToken":[],"TokenCore":["BigInt"],"Equatable":[]},"TronToken":{"TokenCore":["BigInt"]},"TronTRC20Token":{"TronToken":[],"TokenCore":["BigInt"],"Equatable":[]},"Token":{"Equatable":[]},"Web3RequestException":{"Exception":[]},"Web3ChainMessage":{"Web3MessageCore":[]},"Web3ExceptionMessage":{"Web3MessageCore":[]},"Web3ResponseMessage":{"Web3MessageCore":[]},"Web3WalletResponseMessage":{"Web3ResponseMessage":[],"Web3MessageCore":[]},"Web3ChainAccount":{"Equatable":[]},"Web3GlobalRequestParams":{"Web3MessageCore":[]},"Web3RequestParams":{"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3EthereumPermissionRequestParam":{"Web3EthereumRequestParam":["Web3EthereumChain"],"Web3RequestParams":["Web3EthereumChain","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["Web3EthereumChain"],"Web3MessageCore":[]},"Web3EthereumRequestParam":{"Web3RequestParams":["1","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3EthereumAddNewChain":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumPersonalSign":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumRequestAccounts":{"Web3EthereumRequestParam":["Web3EthereumChain"],"Web3RequestParams":["Web3EthereumChain","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["Web3EthereumChain"],"Web3MessageCore":[]},"Web3EthreumSendTransaction":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumTypdedData":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumSwitchChain":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthereumChainAccount":{"Web3ChainAccount":["ETHAddress"],"Equatable":[],"Web3ChainAccount.0":"ETHAddress"},"Web3EthereumChain":{"Web3Chain":["ETHAddress","EthereumChain","Web3EthereumChainAccount"],"Web3Chain.2":"Web3EthereumChainAccount"},"Web3DisconnectApplication":{"Web3GlobalRequestParams":["@"],"Web3MessageCore":[]},"Web3SolanaPermissionRequestParam":{"Web3SolanaRequestParam":["Web3SolanaChain"],"Web3RequestParams":["Web3SolanaChain","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["Web3SolanaChain"],"Web3MessageCore":[]},"Web3SolanaRequestParam":{"Web3RequestParams":["1","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3SolanaRequestAccounts":{"Web3SolanaRequestParam":["Web3SolanaChain"],"Web3RequestParams":["Web3SolanaChain","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["Web3SolanaChain"],"Web3MessageCore":[]},"Web3SolanaSignMessage":{"Web3SolanaRequestParam":["List"],"Web3RequestParams":["List","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["List"],"Web3MessageCore":[]},"Web3SolanaSendTransaction":{"Web3SolanaRequestParam":["List>"],"Web3RequestParams":["List>","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["List>"],"Web3MessageCore":[]},"Web3SolanaChainAccount":{"Web3ChainAccount":["SolAddress"],"Equatable":[],"Web3ChainAccount.0":"SolAddress"},"Web3SolanaChain":{"Web3Chain":["SolAddress","SolanaChain","Web3SolanaChainAccount"],"Web3Chain.2":"Web3SolanaChainAccount"},"Web3TronPermissionRequestParam":{"Web3TronRequestParam":["Web3TronChain"],"Web3RequestParams":["Web3TronChain","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["Web3TronChain"],"Web3MessageCore":[]},"Web3TronRequestParam":{"Web3RequestParams":["1","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3TronRequestAccounts":{"Web3TronRequestParam":["Web3TronChain"],"Web3RequestParams":["Web3TronChain","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["Web3TronChain"],"Web3MessageCore":[]},"Web3TronSignMessageV2":{"Web3TronRequestParam":["String"],"Web3RequestParams":["String","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3TronSendTransaction":{"Web3TronRequestParam":["Map"],"Web3RequestParams":["Map","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["Map"],"Web3MessageCore":[]},"Web3TronChainAccount":{"Web3ChainAccount":["TronAddress"],"Equatable":[],"Web3ChainAccount.0":"TronAddress"},"Web3TronChain":{"Web3Chain":["TronAddress","TronChain","Web3TronChainAccount"],"Web3Chain.2":"Web3TronChainAccount"},"ADAByronAddress":{"ADAAddress":[]},"ADAPointerAddress":{"ADAAddress":[]},"ADARewardAddress":{"ADAAddress":[]},"ADABaseAddress":{"ADAAddress":[]},"ADAShellyAddress":{"ADAAddress":[]},"ADAEnterpriseAddress":{"ADAAddress":[]},"StakeCred":{"FixedBytes":[],"Comparable":["FixedBytes"]},"StakeCredKey":{"StakeCred":[],"FixedBytes":[],"Comparable":["FixedBytes"]},"StakeCredScript":{"StakeCred":[],"FixedBytes":[],"Comparable":["FixedBytes"]},"FixedBytes":{"Comparable":["FixedBytes"]},"BlockfrostRequestBackendHealthStatus":{"BlockforestRequestParam":["bool","Map"]},"BlockfrostError":{"BlockchainUtilsException":[],"Exception":[]},"ETHAddress":{"SolidityAddress":[]},"RPCGetChainId":{"ETHRPCRequest":["BigInt"]},"SolanaPluginException":{"BlockchainUtilsException":[],"Exception":[]},"SolanaRPCGetGenesisHash":{"SolanaRPCRequest":["String"],"SolanaRPCRequest.T":"String"},"Message":{"VersionedMessage":[]},"MessageV0":{"VersionedMessage":[]},"Eip712TypedData":{"EIP712Base":[]},"EIP712Legacy":{"EIP712Base":[]},"SolidityAbiException":{"BlockchainUtilsException":[],"Exception":[]},"AddressCoder":{"ABICoder":["SolidityAddress"]},"ArrayCoder":{"ABICoder":["List<@>"]},"BooleanCoder":{"ABICoder":["bool"]},"BytesCoder":{"ABICoder":["List"]},"FunctionCoder":{"ABICoder":["List"]},"NumbersCoder":{"ABICoder":["BigInt"]},"StringCoder":{"ABICoder":["String"]},"TupleCoder":{"ABICoder":["List<@>"]},"TronAddress":{"SolidityAddress":[]},"TronPluginException":{"BlockchainUtilsException":[],"Exception":[]},"AccountCreateContract":{"TronBaseContract":[]},"AccountPermissionUpdateContract":{"TronBaseContract":[]},"AccountType":{"TronEnumerate":[]},"AccountUpdateContract":{"TronBaseContract":[]},"PermissionType":{"TronEnumerate":[]},"SetAccountIdContract":{"TronBaseContract":[]},"AssetIssueContract":{"TronBaseContract":[]},"ParticipateAssetIssueContract":{"TronBaseContract":[]},"TransferAssetContract":{"TronBaseContract":[]},"UnfreezeAssetContract":{"TronBaseContract":[]},"UpdateAssetContract":{"TronBaseContract":[]},"CancelAllUnfreezeV2Contract":{"TronBaseContract":[]},"DelegateResourceContract":{"TronBaseContract":[]},"FreezeBalanceContract":{"TronBaseContract":[]},"FreezeBalanceV2Contract":{"TronBaseContract":[]},"TransferContract":{"TronBaseContract":[]},"UnDelegateResourceContract":{"TronBaseContract":[]},"UnfreezeBalanceContract":{"TronBaseContract":[]},"UnfreezeBalanceV2Contract":{"TronBaseContract":[]},"WithdrawBalanceContract":{"TronBaseContract":[]},"WithdrawExpireUnfreezeContract":{"TronBaseContract":[]},"ResourceCode":{"TronEnumerate":[]},"TransactionContractType":{"TronEnumerate":[]},"ExchangeCreateContract":{"TronBaseContract":[]},"ExchangeInjectContract":{"TronBaseContract":[]},"ExchangeTransactionContract":{"TronBaseContract":[]},"ExchangeWithdrawContract":{"TronBaseContract":[]},"MarketCancelOrderContract":{"TronBaseContract":[]},"MarketSellAssetContract":{"TronBaseContract":[]},"ProposalApproveContract":{"TronBaseContract":[]},"ProposalCreateContract":{"TronBaseContract":[]},"ProposalDeleteContract":{"TronBaseContract":[]},"ShieldedTransferContract":{"TronBaseContract":[]},"SmartContractAbiEntryType":{"TronEnumerate":[]},"SmartContractAbiStateMutabilityType":{"TronEnumerate":[]},"ClearABIContract":{"TronBaseContract":[]},"CreateSmartContract":{"TronBaseContract":[]},"TriggerSmartContract":{"TronBaseContract":[]},"UpdateEnergyLimitContract":{"TronBaseContract":[]},"UpdateSettingContract":{"TronBaseContract":[]},"UpdateBrokerageContract":{"TronBaseContract":[]},"VoteAssetContract":{"TronBaseContract":[]},"VoteWitnessContract":{"TronBaseContract":[]},"WitnessUpdateContract":{"TronBaseContract":[]},"WitnessCreateContract":{"TronBaseContract":[]},"TronRequestGetBlockByNum":{"TVMRequestParam":["Map","Map"],"TVMRequestParam.0":"Map","TVMRequestParam.1":"Map"},"PathException":{"Exception":[]},"PosixStyle":{"InternalStyle":[]},"UrlStyle":{"InternalStyle":[]},"WindowsStyle":{"InternalStyle":[]},"SubstrateMetadata":{"SubstrateSerialization":["1"]},"MetadataException":{"BlockchainUtilsException":[],"Exception":[]},"TypeDefOption":{"SubstrateSerialization":["1"],"ScaleTypeDef":[]},"UnsupportedMetadata":{"SubstrateMetadata":["List"],"SubstrateSerialization":["List"]},"Si0TypeDefPrimitive":{"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1Field":{"SubstrateSerialization":["Map"]},"Si1TypeDefHistoricMetaCompat":{"Si1TypeDef":["String"],"SubstrateSerialization":["String"],"ScaleTypeDef":[]},"Si1Type":{"SubstrateSerialization":["Map"]},"Si1TypeDef":{"SubstrateSerialization":["1"],"ScaleTypeDef":[]},"Si1TypeDefArray":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefBitSequence":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefCompact":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefComposite":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefPrimitive":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefSequence":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefTuple":{"Si1TypeDef":["List"],"SubstrateSerialization":["List"],"ScaleTypeDef":[]},"Si1TypeDefVariant":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeParameter":{"SubstrateSerialization":["Map"]},"Si1Variant":{"SubstrateSerialization":["Map"]},"StorageHasherV14":{"SubstrateSerialization":["Map"]},"StorageHasherV11":{"SubstrateSerialization":["Map"]},"StorageEntryModifierV14":{"StorageEntryModifierV9":[],"SubstrateSerialization":["Map"]},"ExtrinsicMetadataV14":{"SubstrateSerialization":["Map"]},"MetadataV14":{"SubstrateMetadata":["Map"],"SubstrateSerialization":["Map"],"LatestMetadataInterface":[]},"PalletCallMetadataV14":{"SubstrateSerialization":["Map"]},"PalletConstantMetadataV14":{"SubstrateSerialization":["Map"]},"PalletErrorMetadataV14":{"SubstrateSerialization":["Map"]},"PalletEventMetadataV14":{"SubstrateSerialization":["Map"]},"PalletMetadataV14":{"SubstrateSerialization":["Map"]},"PalletStorageMetadataV14":{"SubstrateSerialization":["Map"]},"PortableRegistryV14":{"SubstrateSerialization":["Map"]},"PortableTypeV14":{"SubstrateSerialization":["Map"]},"SignedExtensionMetadataV14":{"SubstrateSerialization":["Map"]},"StorageEntryTypeV14":{"SubstrateSerialization":["1"]},"StorageEntryTypeV14Map":{"StorageEntryTypeV14":["Map"],"SubstrateSerialization":["Map"]},"StorageEntryTypeV14Plain":{"StorageEntryTypeV14":["int"],"SubstrateSerialization":["int"]},"StorageEntryMetadataV14":{"SubstrateSerialization":["Map"]},"CustomMetadata15":{"SubstrateSerialization":["Map"]},"CustomValueMetadata15":{"SubstrateSerialization":["Map"]},"ExtrinsicMetadataV15":{"SubstrateSerialization":["Map"]},"MetadataV15":{"SubstrateMetadata":["Map"],"SubstrateSerialization":["Map"],"LatestMetadataInterface":[]},"OuterEnums15":{"SubstrateSerialization":["Map"]},"PalletMetadataV15":{"PalletMetadataV14":[],"SubstrateSerialization":["Map"]},"RuntimeApiMetadataV15":{"SubstrateSerialization":["Map"]},"RuntimeApiMethodMetadataV15":{"SubstrateSerialization":["Map"]},"RuntimeApiMethodParamMetadataV15":{"SubstrateSerialization":["Map"]},"StorageEntryModifierV9":{"SubstrateSerialization":["Map"]},"VersionedMetadata":{"SubstrateSerialization":["Map"]},"SubstrateBlockHash":{"SubstrateSerialization":["List"]},"ScaleFixedBytes":{"SubstrateSerialization":["List"]},"SubstrateHash256":{"SubstrateSerialization":["List"]},"SubstrateRPCChainGetBlockHash":{"SubstrateRPCRequest":["String","String"],"SubstrateRPCRequest.1":"String","SubstrateRPCRequest.0":"String"},"SubstrateRPCRuntimeMetadataGetVersions":{"SubstrateRPCRequest":["String","List"],"SubstrateRPCRequest.1":"List","SubstrateRPCRequest.0":"String"},"FileLocation":{"SourceLocation":[],"Comparable":["SourceLocation"]},"_FileSpan":{"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceLocation":{"Comparable":["SourceLocation"]},"SourceLocationMixin":{"SourceLocation":[],"Comparable":["SourceLocation"]},"SourceSpan":{"Comparable":["SourceSpan"]},"SourceSpanBase":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanException":{"Exception":[]},"SourceSpanFormatException":{"FormatException":[],"Exception":[]},"SourceSpanMixin":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanWithContext":{"SourceSpan":[],"Comparable":["SourceSpan"]},"StringScannerException":{"FormatException":[],"Exception":[]},"TonContractException":{"BlockchainUtilsException":[],"Exception":[]},"TonDartPluginException":{"BlockchainUtilsException":[],"Exception":[]},"TonCenterPostRequestParam":{"TonApiRequestParam":["1","2"]},"TonApiError":{"BlockchainUtilsException":[],"Exception":[]},"TonApiGetBlockchainMasterchainHead":{"TonApiRequestParam":["BlockchainBlockResponse","Map"],"TonApiRequestParam.0":"BlockchainBlockResponse","TonApiRequestParam.1":"Map"},"TonCenterGetMasterchainInfo":{"TonApiRequestParam":["Map","Map"],"TonApiRequestParam.0":"Map","TonApiRequestParam.1":"Map"},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"RPCServerState":{"XRPLedgerRequest":["XRPLedgerState"]},"XRPLAddressCodecException":{"BlockchainUtilsException":[],"Exception":[]},"ClientMessageEthereum":{"PageMessage":[]},"JSWalletMessageResponseEthereum":{"JSWalletMessage":[]},"EthereumWeb3State":{"ChainWeb3State":["ETHAddress","EthereumChain","Web3EthereumChain"],"ChainWeb3State.1":"EthereumChain","ChainWeb3State.2":"Web3EthereumChain"},"JSWalletMessageResponse":{"JSWalletMessage":[]},"JSWalletNetworkEvent":{"JSWalletMessage":[]},"ClientMessageSolana":{"PageMessage":[]},"JSWalletMessageResponseSolana":{"JSWalletMessage":[]},"SolanaWeb3State":{"ChainWeb3State":["SolAddress","SolanaChain","Web3SolanaChain"],"ChainWeb3State.1":"SolanaChain","ChainWeb3State.2":"Web3SolanaChain"},"ClientMessageTron":{"PageMessage":[]},"JSWalletMessageResponseTron":{"JSWalletMessage":[]},"TronWeb3State":{"ChainWeb3State":["TronAddress","TronChain","Web3TronChain"],"ChainWeb3State.1":"TronChain","ChainWeb3State.2":"Web3TronChain"}}')); - A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"_DelayedEvent":1,"UnmodifiableMapBase":2,"_SetBase":1,"Converter":2,"BitcoinNetworkAddress":1,"HTTPService":1,"BaseSocketService":1,"CryptoAddress":1,"SubstrateMetadata":1,"TonCenterPostRequestParam":2,"JSNetworkHandler":5}')); + A._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"LegacyJavaScriptObject","PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"]},"JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"JavaScriptObject":{"JSObject":[]},"LegacyJavaScriptObject":{"JSObject":[]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"]},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"TrustedGetRuntimeType":[]},"CastStream":{"Stream":["2"],"Stream.T":"2"},"CastStreamSubscription":{"StreamSubscription":["2"]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"CodeUnits":{"ListBase":["int"],"UnmodifiableListMixin":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListBase.E":"int","UnmodifiableListMixin.E":"int"},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1","ListIterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2","ListIterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"ExpandIterable":{"Iterable":["2"],"Iterable.E":"2"},"ExpandIterator":{"Iterator":["2"]},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"TakeIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"WhereTypeIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereTypeIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_ListIndicesIterable":{"ListIterable":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"Iterable.E":"int","ListIterable.E":"int"},"ListMapView":{"MapBase":["int","1"],"_UnmodifiableMapMixin":["int","1"],"Map":["int","1"],"MapBase.K":"int","MapBase.V":"1","_UnmodifiableMapMixin.K":"int","_UnmodifiableMapMixin.V":"1"},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1","ListIterable.E":"1"},"_Record_2":{"_Record2":[],"_Record":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"],"_UnmodifiableMapMixin.K":"1","_UnmodifiableMapMixin.V":"2"},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"GeneralConstantMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"Instantiation":{"Closure":[],"Function":[]},"Instantiation1":{"Closure":[],"Function":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"NullThrownFromJavaScriptException":{"Exception":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Closure":[],"Function":[]},"Closure2Args":{"Closure":[],"Function":[]},"TearOffClosure":{"Closure":[],"Function":[]},"StaticClosure":{"Closure":[],"Function":[]},"BoundClosure":{"Closure":[],"Function":[]},"_CyclicInitializationError":{"Error":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"JsIdentityLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"JsConstantLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_Record2":{"_Record":[]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JSObject":[]},"NativeByteData":{"ByteData":[],"JSObject":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"JSObject":[]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"Float32List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","FixedLengthListMixin.E":"double"},"NativeFloat64List":{"Float64List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","FixedLengthListMixin.E":"double"},"NativeInt16List":{"NativeTypedArrayOfInt":[],"Int16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeInt32List":{"NativeTypedArrayOfInt":[],"Int32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeInt8List":{"NativeTypedArrayOfInt":[],"Int8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint16List":{"NativeTypedArrayOfInt":[],"Uint16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint32List":{"NativeTypedArrayOfInt":[],"Uint32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8ClampedList":{"NativeTypedArrayOfInt":[],"Uint8ClampedList":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8List":{"NativeTypedArrayOfInt":[],"Uint8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","FixedLengthListMixin.E":"int"},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"_Future":{"Future":["1"]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_SyncStarIterator":{"Iterator":["1"]},"_SyncStarIterable":{"Iterable":["1"],"Iterable.E":"1"},"AsyncError":{"Error":[]},"TimeoutException":{"Exception":[]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"StreamView":{"Stream":["1"]},"_StreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventDispatch":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventDispatch":["1"]},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_EmptyStream":{"Stream":["1"],"Stream.T":"1"},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_HashMap":{"MapBase":["1","2"],"Map":["1","2"]},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_LinkedHashSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_LinkedHashSetIterator":{"Iterator":["1"]},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"UnmodifiableMapBase":{"MapBase":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"_MapBaseValueIterable":{"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_MapBaseValueIterator":{"Iterator":["2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"],"_UnmodifiableMapMixin.K":"1","_UnmodifiableMapMixin.V":"2"},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"Encoding":{"Codec":["String","List"]},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"Iterable.E":"String","ListIterable.E":"String"},"AsciiCodec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Base64Codec":{"Codec":["List","String"],"Codec.S":"List"},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"Latin1Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Utf8Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExpMatch":{"Match":[]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"_Exception":{"Exception":[]},"FormatException":{"Exception":[]},"IntegerDivisionByZeroException":{"Exception":[],"Error":[]},"_StringStackTrace":{"StackTrace":[]},"Runes":{"Iterable":["int"],"Iterable.E":"int"},"RuneIterator":{"Iterator":["int"]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"SecureSocket":{"Socket":[],"Stream":["Uint8List"],"StringSink":[]},"RawSecureSocket":{"RawSocket":[],"Stream":["RawSocketEvent"]},"_RawSecureSocket":{"RawSecureSocket":[],"RawSocket":[],"Stream":["RawSocketEvent"],"Stream.T":"RawSocketEvent"},"RawSocket":{"Stream":["RawSocketEvent"]},"Socket":{"Stream":["Uint8List"],"StringSink":[]},"TlsException":{"Exception":[]},"HandshakeException":{"Exception":[]},"NullRejectionException":{"Exception":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"P2shAddressType":{"BitcoinAddressType":[]},"PubKeyAddressType":{"BitcoinAddressType":[]},"P2pkhAddressType":{"BitcoinAddressType":[]},"SegwitAddresType":{"BitcoinAddressType":[]},"LegacyAddress":{"BitcoinBaseAddress":[]},"P2shAddress":{"BitcoinBaseAddress":[]},"P2pkhAddress":{"BitcoinBaseAddress":[]},"P2pkAddress":{"BitcoinBaseAddress":[]},"SegwitAddress":{"BitcoinBaseAddress":[]},"P2wpkhAddress":{"BitcoinBaseAddress":[]},"P2trAddress":{"BitcoinBaseAddress":[]},"P2wshAddress":{"BitcoinBaseAddress":[]},"BitcoinBasePluginException":{"BlockchainUtilsException":[],"Exception":[]},"BitcoinNetwork":{"BasedUtxoNetwork":[]},"LitecoinNetwork":{"BasedUtxoNetwork":[]},"DashNetwork":{"BasedUtxoNetwork":[]},"DogecoinNetwork":{"BasedUtxoNetwork":[]},"BitcoinCashNetwork":{"BasedUtxoNetwork":[]},"PepeNetwork":{"BasedUtxoNetwork":[]},"BitcoinSVNetwork":{"BasedUtxoNetwork":[]},"ElectrumBlockHeader":{"ElectrumRequest":["@","@"]},"ElectrumServerFeatures":{"ElectrumRequest":["@","@"]},"Base58ChecksumError":{"BlockchainUtilsException":[],"Exception":[]},"Bech32ChecksumError":{"BlockchainUtilsException":[],"Exception":[]},"AdaByronIcarusAddrEncoder":{"BlockchainAddressEncoder":[]},"AdaByronLegacyAddrEncoder":{"BlockchainAddressEncoder":[]},"AdaShelleyAddrEncoder":{"BlockchainAddressEncoder":[]},"AdaShelleyStakingAddrEncoder":{"BlockchainAddressEncoder":[]},"AlgoAddrEncoder":{"BlockchainAddressEncoder":[]},"AptosAddrEncoder":{"BlockchainAddressEncoder":[]},"AtomAddrEncoder":{"BlockchainAddressEncoder":[]},"AtomNist256P1AddrEncoder":{"BlockchainAddressEncoder":[]},"AvaxPChainAddrEncoder":{"BlockchainAddressEncoder":[]},"AvaxXChainAddrEncoder":{"BlockchainAddressEncoder":[]},"EgldAddrEncoder":{"BlockchainAddressEncoder":[]},"EosAddrEncoder":{"BlockchainAddressEncoder":[]},"ErgoP2PKHAddrEncoder":{"BlockchainAddressEncoder":[]},"EthAddrEncoder":{"BlockchainAddressEncoder":[]},"AddressConverterException":{"BlockchainUtilsException":[],"Exception":[]},"FilSecp256k1AddrEncoder":{"BlockchainAddressEncoder":[]},"IcxAddrEncoder":{"BlockchainAddressEncoder":[]},"InjAddrEncoder":{"BlockchainAddressEncoder":[]},"NanoAddrEncoder":{"BlockchainAddressEncoder":[]},"NearAddrEncoder":{"BlockchainAddressEncoder":[]},"NeoAddrEncoder":{"BlockchainAddressEncoder":[]},"OkexAddrEncoder":{"BlockchainAddressEncoder":[]},"OneAddrEncoder":{"BlockchainAddressEncoder":[]},"P2PKHAddrEncoder":{"BlockchainAddressEncoder":[]},"BchP2PKHAddrEncoder":{"BlockchainAddressEncoder":[]},"P2SHAddrEncoder":{"BlockchainAddressEncoder":[]},"BchP2SHAddrEncoder":{"BlockchainAddressEncoder":[]},"P2TRAddrEncoder":{"BlockchainAddressEncoder":[]},"P2WPKHAddrEncoder":{"BlockchainAddressEncoder":[]},"SolAddrEncoder":{"BlockchainAddressEncoder":[]},"SubstrateEd25519AddrEncoder":{"BlockchainAddressEncoder":[]},"SubstrateSr25519AddrEncoder":{"BlockchainAddressEncoder":[]},"SubstrateSecp256k1AddrEncoder":{"BlockchainAddressEncoder":[]},"TonAddrEncoder":{"BlockchainAddressEncoder":[]},"TrxAddrEncoder":{"BlockchainAddressEncoder":[]},"XlmAddrEncoder":{"BlockchainAddressEncoder":[]},"XmrAddrEncoder":{"BlockchainAddressEncoder":[]},"XrpAddrEncoder":{"BlockchainAddressEncoder":[]},"XtzAddrEncoder":{"BlockchainAddressEncoder":[]},"ZilAddrEncoder":{"BlockchainAddressEncoder":[]},"Bip32PathError":{"BlockchainUtilsException":[],"Exception":[]},"BipCoins":{"CryptoCoins":["BipCoinConfig"]},"Bip44Coins":{"CryptoCoins":["BipCoinConfig"]},"Bip49Coins":{"CryptoCoins":["BipCoinConfig"]},"Bip84Coins":{"CryptoCoins":["BipCoinConfig"]},"Bip86Coins":{"CryptoCoins":["BipCoinConfig"]},"BipBitcoinCashConf":{"BipCoinConfig":[],"CoinConfig":[]},"BipCoinConfig":{"CoinConfig":[]},"BipLitecoinConf":{"BipCoinConfig":[],"CoinConfig":[]},"Cip1852Coins":{"CryptoCoins":["BipCoinConfig"]},"CipProposal":{"BipProposal":[]},"Ed25519Blake2bPublicKey":{"IPublicKey":[]},"Ed25519PublicKey":{"IPublicKey":[]},"Ed25519KholawPublicKey":{"IPublicKey":[]},"Ed25519MoneroPublicKey":{"IPublicKey":[]},"Nist256p1PublicKey":{"IPublicKey":[]},"Secp256k1PublicKeyEcdsa":{"IPublicKey":[]},"Sr25519PublicKey":{"IPublicKey":[]},"MoneroCoinConf":{"CoinConfig":[]},"MoneroCoins":{"CryptoCoins":["MoneroCoinConf"]},"MoneroKeyError":{"BlockchainUtilsException":[],"Exception":[]},"MoneroPublicKey":{"IPublicKey":[]},"SubstrateCoinConf":{"CoinConfig":[]},"SubstrateCoins":{"CryptoCoins":["SubstrateCoinConf"]},"CborNumeric":{"CborObject":[]},"CborBaseUrlValue":{"CborObject":[]},"CborBigFloatValue":{"CborObject":[]},"CborBigIntValue":{"CborNumeric":[],"CborObject":[]},"CborBoleanValue":{"CborObject":[]},"CborBytesValue":{"CborObject":[]},"CborDynamicBytesValue":{"CborObject":[]},"CborTagValue":{"CborObject":[]},"CborEpochIntValue":{"CborObject":[]},"_CborDate":{"CborObject":[]},"CborStringDateValue":{"CborObject":[]},"CborEpochFloatValue":{"CborObject":[]},"CborDecimalFracValue":{"CborObject":[]},"CborFloatValue":{"CborObject":[]},"CborIntValue":{"CborNumeric":[],"CborObject":[]},"CborSafeIntValue":{"CborNumeric":[],"CborObject":[]},"CborListValue":{"CborObject":[]},"CborMapValue":{"CborObject":[]},"CborMimeValue":{"CborObject":[]},"CborNullValue":{"CborObject":[]},"CborUndefinedValue":{"CborObject":[]},"CborRegxpValue":{"CborObject":[]},"CborSetValue":{"CborObject":[]},"CborStringValue":{"CborObject":[]},"CborIndefiniteStringValue":{"CborObject":[]},"CborString":{"CborObject":[]},"CborUriValue":{"CborObject":[]},"AES":{"BlockCipher":[]},"ProjectiveECCPoint":{"AbstractPoint":[]},"EDPoint":{"AbstractPoint":[]},"RistrettoPoint":{"EDPoint":[],"AbstractPoint":[]},"SquareRootError":{"BlockchainUtilsException":[],"Exception":[]},"JacobiError":{"BlockchainUtilsException":[],"Exception":[]},"BlockchainUtilsException":{"Exception":[]},"ArgumentException":{"BlockchainUtilsException":[],"Exception":[]},"MessageException":{"BlockchainUtilsException":[],"Exception":[]},"RPCError":{"BlockchainUtilsException":[],"Exception":[]},"SequenceLayout":{"Layout":["List<1>"],"Layout.T":"List<1>"},"CompactOffsetLayout":{"ExternalLayout":[],"Layout":["int"],"Layout.T":"int"},"CompactBytes":{"Layout":["List"],"Layout.T":"List"},"ConstantLayout":{"Layout":["1"],"Layout.T":"1"},"CustomLayout":{"Layout":["2"],"Layout.T":"2"},"MapEntryLayout":{"Layout":["MapEntry<@,@>"],"Layout.T":"MapEntry<@,@>"},"NoneLayout":{"Layout":["@"],"Layout.T":"@"},"ExternalLayout":{"Layout":["int"]},"BaseIntiger":{"Layout":["1"]},"IntegerLayout":{"BaseIntiger":["int"],"Layout":["int"],"Layout.T":"int"},"UnionDiscriminatorLayout":{"Layout":["int"]},"UnionLayoutDiscriminatorLayout":{"Layout":["int"],"Layout.T":"int"},"OffsetLayout":{"ExternalLayout":[],"Layout":["int"],"Layout.T":"int"},"CompactIntLayout":{"Layout":["int"],"Layout.T":"int"},"OptionalLayout":{"Layout":["1?"],"Layout.T":"1?"},"PaddingLayout":{"Layout":["1"],"Layout.T":"1"},"RawBytesLayout":{"Layout":["List"],"Layout.T":"List"},"StructLayout":{"Layout":["Map"],"Layout.T":"Map"},"VariantLayout":{"Layout":["Map"],"Layout.T":"Map"},"Union":{"Layout":["Map"],"Layout.T":"Map"},"LayoutException":{"BlockchainUtilsException":[],"Exception":[]},"SS58ChecksumError":{"BlockchainUtilsException":[],"Exception":[]},"CanonicalizedMap":{"Map":["2","3"]},"TendermintRequestStatus":{"TendermintRequestParam":["Map","Map"],"TendermintRequestParam.0":"Map","TendermintRequestParam.1":"Map"},"ByteStream":{"StreamView":["List"],"Stream":["List"],"StreamView.T":"List","Stream.T":"List"},"ClientException":{"Exception":[]},"Request":{"BaseRequest":[]},"StreamedResponseV2":{"StreamedResponse":[]},"CaseInsensitiveMap":{"CanonicalizedMap":["String","String","1"],"Map":["String","1"],"CanonicalizedMap.K":"String","CanonicalizedMap.V":"1","CanonicalizedMap.C":"String"},"MRTNativePluginException":{"Exception":[]},"ApiProviderException":{"Exception":[]},"WalletException":{"Exception":[]},"_Live":{"LiveListenable":["1"]},"Live":{"_Live":["1"],"LiveListenable":["1"]},"APPImage":{"Equatable":[]},"WebsocketWeb":{"PlatformWebScoket":[]},"CustomCoins":{"CryptoCoins":["BipCoinConfig"]},"CustomProposal":{"BipProposal":[]},"AddressDerivationIndex":{"Equatable":[]},"Bip32AddressIndex":{"AddressDerivationIndex":[],"Equatable":[]},"MultiSigAddressIndex":{"AddressDerivationIndex":[],"Equatable":[]},"SubstrateAddressIndex":{"AddressDerivationIndex":[],"Equatable":[]},"BrowserCryptoWorker":{"IsolateCryptoWoker":[]},"BitcoinElectrumClient":{"BitcoinClient":["IBitcoinAddress"],"NetworkClient":["IBitcoinAddress","BaseBitcoinAPIProvider"]},"BitcoinExplorerApiProvider":{"BitcoinClient":["IBitcoinAddress"],"NetworkClient":["IBitcoinAddress","BaseBitcoinAPIProvider"]},"BitcoinClient":{"NetworkClient":["1","BaseBitcoinAPIProvider"]},"CardanoClient":{"NetworkClient":["ICardanoAddress","CardanoAPIProvider"]},"CosmosClient":{"NetworkClient":["ICosmosAddress","CosmosAPIProvider"]},"EthereumClient":{"NetworkClient":["IEthAddress","EthereumAPIProvider"]},"RippleClient":{"NetworkClient":["IXRPAddress","RippleAPIProvider"]},"SolanaClient":{"NetworkClient":["ISolanaAddress","SolanaAPIProvider"]},"SubstrateClient":{"NetworkClient":["ISubstrateAddress","SubstrateAPIProvider"]},"SubstrateGetApiAt":{"SubstrateRPCRequest":["String","+(MetadataApi,String)?"],"SubstrateRPCRequest.1":"+(MetadataApi,String)?","SubstrateRPCRequest.0":"String"},"SubstrateGetStateApi":{"SubstrateRPCRequest":["String","+(MetadataApi,String)?"],"SubstrateRPCRequest.1":"+(MetadataApi,String)?","SubstrateRPCRequest.0":"String"},"TonClient":{"NetworkClient":["ITonAddress","TonAPIProvider"]},"TronClient":{"NetworkClient":["ITronAddress","TronAPIProvider"]},"TronRequestGetAccountInfo":{"TVMRequestParam":["TronAccountInfo?","Map"],"TVMRequestParam.0":"TronAccountInfo?","TVMRequestParam.1":"Map"},"APIProvider":{"Equatable":[]},"BitcoinExplorerAPIProvider":{"BaseBitcoinAPIProvider":[],"APIProvider":[],"Equatable":[]},"ElectrumAPIProvider":{"BaseBitcoinAPIProvider":[],"APIProvider":[],"Equatable":[]},"BaseBitcoinAPIProvider":{"APIProvider":[],"Equatable":[]},"CardanoAPIProvider":{"APIProvider":[],"Equatable":[]},"CosmosAPIProvider":{"APIProvider":[],"Equatable":[]},"EthereumAPIProvider":{"APIProvider":[],"Equatable":[]},"RippleAPIProvider":{"APIProvider":[],"Equatable":[]},"SolanaAPIProvider":{"APIProvider":[],"Equatable":[]},"SubstrateAPIProvider":{"APIProvider":[],"Equatable":[]},"TonAPIProvider":{"APIProvider":[],"Equatable":[]},"TronAPIProvider":{"APIProvider":[],"Equatable":[]},"HTTPService":{"BaseServiceProtocol":["1"]},"BaseSocketService":{"BaseServiceProtocol":["1"]},"SSLService":{"BaseServiceProtocol":["1"]},"TCPService":{"BaseServiceProtocol":["1"]},"WebSocketService":{"BaseServiceProtocol":["1"]},"ElectrumSSLSocketService":{"SSLService":["ElectrumAPIProvider"],"BaseServiceProtocol":["ElectrumAPIProvider"],"BitcoinBaseElectrumRPCService":[],"SSLService.T":"ElectrumAPIProvider"},"ElectrumSocketService":{"TCPService":["ElectrumAPIProvider"],"BaseServiceProtocol":["ElectrumAPIProvider"],"BitcoinBaseElectrumRPCService":[],"TCPService.T":"ElectrumAPIProvider"},"ElectrumWebsocketService":{"WebSocketService":["ElectrumAPIProvider"],"BaseServiceProtocol":["ElectrumAPIProvider"],"BitcoinBaseElectrumRPCService":[],"WebSocketService.T":"ElectrumAPIProvider"},"BitcoinHTTPService":{"BaseServiceProtocol":["BitcoinExplorerAPIProvider"],"ApiService":[]},"CardanoHTTPService":{"BaseServiceProtocol":["CardanoAPIProvider"],"BlockfrostServiceProvider":[]},"TendermintHTTPService":{"BaseServiceProtocol":["CosmosAPIProvider"],"TendermintServiceProvider":[]},"EthereumHTTPService":{"BaseServiceProtocol":["EthereumAPIProvider"],"JSONRPCService":[]},"RippleHTTPService":{"BaseServiceProtocol":["RippleAPIProvider"],"RpcService":[]},"SolanaHTTPService":{"BaseServiceProtocol":["SolanaAPIProvider"],"SolanaJSONRPCService":[]},"SubstrateHttpService":{"BaseServiceProtocol":["SubstrateAPIProvider"],"SubstrateRPCService":[]},"TonHTTPService":{"BaseServiceProtocol":["TonAPIProvider"],"TonServiceProvider":[]},"TronHTTPService":{"BaseServiceProtocol":["TronAPIProvider"],"TronServiceProvider":[]},"EthereumWebsocketService":{"WebSocketService":["EthereumAPIProvider"],"BaseServiceProtocol":["EthereumAPIProvider"],"JSONRPCService":[],"WebSocketService.T":"EthereumAPIProvider"},"RippleWebsocketService":{"WebSocketService":["RippleAPIProvider"],"BaseServiceProtocol":["RippleAPIProvider"],"RpcService":[],"WebSocketService.T":"RippleAPIProvider"},"IBitcoinCashAddress":{"IBitcoinAddress":[],"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IBitcoinCashMultiSigAddress":{"IBitcoinAddress":[],"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IBitcoinAddress":{"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IBitcoinMultiSigAddress":{"IBitcoinAddress":[],"ChainAccount":["BitcoinBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"BitcoinMultiSigSignerDetais":{"Equatable":[]},"ICardanoAddress":{"ChainAccount":["ADAAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"ICosmosAddress":{"ChainAccount":["CosmosBaseAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"IEthAddress":{"ChainAccount":["ETHAddress","ETHERC20Token","NFTCore"],"Equatable":[]},"ISolanaAddress":{"ChainAccount":["SolAddress","SolanaSPLToken","NFTCore"],"Equatable":[]},"ISubstrateAddress":{"ChainAccount":["SubstrateAddress","TokenCore<@>","NFTCore"],"Equatable":[]},"ITonAddress":{"ChainAccount":["TonAddress","TonJettonToken","NFTCore"],"Equatable":[]},"TronMultiSigSignerDetais":{"Equatable":[]},"TronMultiSignatureAddress":{"Equatable":[]},"ITronAddress":{"ChainAccount":["TronAddress","TronToken","NFTCore"],"Equatable":[]},"ITronMultisigAddress":{"ITronAddress":[],"ChainAccount":["TronAddress","TronToken","NFTCore"],"Equatable":[]},"RippleMultiSigSignerDetais":{"Equatable":[]},"RippleMultiSignatureAddress":{"Equatable":[]},"IXRPAddress":{"ChainAccount":["XRPAddress","RippleIssueToken","RippleNFToken"],"Equatable":[]},"IXRPMultisigAddress":{"IXRPAddress":[],"ChainAccount":["XRPAddress","RippleIssueToken","RippleNFToken"],"Equatable":[]},"EthereumChain":{"Chain":["EthereumAPIProvider","EthereumNetworkParams","ETHAddress","ETHERC20Token","NFTCore","IEthAddress","WalletEthereumNetwork","EthereumClient"],"Chain.6":"WalletEthereumNetwork","Chain.7":"EthereumClient","Chain.5":"IEthAddress","Chain.2":"ETHAddress"},"SolanaChain":{"Chain":["SolanaAPIProvider","SolanaNetworkParams","SolAddress","SolanaSPLToken","NFTCore","ISolanaAddress","WalletSolanaNetwork","SolanaClient"],"Chain.6":"WalletSolanaNetwork","Chain.7":"SolanaClient","Chain.5":"ISolanaAddress","Chain.2":"SolAddress"},"TheOpenNetworkChain":{"Chain":["TonAPIProvider","TonNetworkParams","TonAddress","TonJettonToken","NFTCore","ITonAddress","WalletTonNetwork","TonClient"],"Chain.6":"WalletTonNetwork","Chain.7":"TonClient","Chain.5":"ITonAddress","Chain.2":"TonAddress"},"TronChain":{"Chain":["TronAPIProvider","TronNetworkParams","TronAddress","TronToken","NFTCore","ITronAddress","WalletTronNetwork","TronClient"],"Chain.6":"WalletTronNetwork","Chain.7":"TronClient","Chain.5":"ITronAddress","Chain.2":"TronAddress"},"ADAChain":{"Chain":["CardanoAPIProvider","CardanoNetworkParams","ADAAddress","TokenCore<@>","NFTCore","ICardanoAddress","WalletCardanoNetwork","CardanoClient"],"Chain.6":"WalletCardanoNetwork","Chain.7":"CardanoClient","Chain.5":"ICardanoAddress","Chain.2":"ADAAddress"},"BitcoinChain":{"Chain":["BaseBitcoinAPIProvider","BitcoinParams","BitcoinBaseAddress","TokenCore<@>","NFTCore","IBitcoinAddress","WalletBitcoinNetwork","BitcoinClient"],"Chain.6":"WalletBitcoinNetwork","Chain.7":"BitcoinClient","Chain.5":"IBitcoinAddress","Chain.2":"BitcoinBaseAddress"},"CosmosChain":{"Chain":["CosmosAPIProvider","CosmosNetworkParams","CosmosBaseAddress","TokenCore<@>","NFTCore","ICosmosAddress","WalletCosmosNetwork","CosmosClient"],"Chain.6":"WalletCosmosNetwork","Chain.7":"CosmosClient","Chain.5":"ICosmosAddress","Chain.2":"CosmosBaseAddress"},"SubstrateChain":{"Chain":["SubstrateAPIProvider","SubstrateNetworkParams","SubstrateAddress","TokenCore<@>","NFTCore","ISubstrateAddress","WalletPolkadotNetwork","SubstrateClient"],"Chain.6":"WalletPolkadotNetwork","Chain.7":"SubstrateClient","Chain.5":"ISubstrateAddress","Chain.2":"SubstrateAddress"},"RippleChain":{"Chain":["RippleAPIProvider","RippleNetworkParams","XRPAddress","RippleIssueToken","RippleNFToken","IXRPAddress","WalletXRPNetwork","RippleClient"],"Chain.6":"WalletXRPNetwork","Chain.7":"RippleClient","Chain.5":"IXRPAddress","Chain.2":"XRPAddress"},"BitcoinContact":{"ContactCore":["BitcoinBaseAddress"],"Equatable":[]},"CardanoContact":{"ContactCore":["ADAAddress"],"Equatable":[]},"CosmosContact":{"ContactCore":["CosmosBaseAddress"],"Equatable":[]},"EthereumContract":{"ContactCore":["ETHAddress"],"Equatable":[]},"SolanaContact":{"ContactCore":["SolAddress"],"Equatable":[]},"SubstrateContact":{"ContactCore":["SubstrateAddress"],"Equatable":[]},"TonContact":{"ContactCore":["TonAddress"],"Equatable":[]},"TronContact":{"ContactCore":["TronAddress"],"Equatable":[]},"RippleContact":{"ContactCore":["XRPAddress"],"Equatable":[]},"WalletNetwork":{"Equatable":[]},"WalletBitcoinNetwork":{"WalletNetwork":["BitcoinParams"],"Equatable":[]},"WalletXRPNetwork":{"WalletNetwork":["RippleNetworkParams"],"Equatable":[]},"WalletEthereumNetwork":{"WalletNetwork":["EthereumNetworkParams"],"Equatable":[]},"WalletTronNetwork":{"WalletNetwork":["TronNetworkParams"],"Equatable":[]},"WalletSolanaNetwork":{"WalletNetwork":["SolanaNetworkParams"],"Equatable":[]},"WalletCardanoNetwork":{"WalletNetwork":["CardanoNetworkParams"],"Equatable":[]},"WalletCosmosNetwork":{"WalletNetwork":["CosmosNetworkParams"],"Equatable":[]},"WalletTonNetwork":{"WalletNetwork":["TonNetworkParams"],"Equatable":[]},"WalletPolkadotNetwork":{"WalletNetwork":["SubstrateNetworkParams"],"Equatable":[]},"WalletBitcoinCashNetwork":{"WalletBitcoinNetwork":[],"WalletNetwork":["BitcoinParams"],"Equatable":[]},"WalletKusamaNetwork":{"WalletPolkadotNetwork":[],"WalletNetwork":["SubstrateNetworkParams"],"Equatable":[]},"BitcoinParams":{"NetworkCoinParams":["BaseBitcoinAPIProvider"],"NetworkCoinParams.0":"BaseBitcoinAPIProvider"},"CardanoNetworkParams":{"NetworkCoinParams":["CardanoAPIProvider"],"NetworkCoinParams.0":"CardanoAPIProvider"},"CosmosNetworkParams":{"NetworkCoinParams":["CosmosAPIProvider"],"NetworkCoinParams.0":"CosmosAPIProvider"},"EthereumNetworkParams":{"NetworkCoinParams":["EthereumAPIProvider"],"NetworkCoinParams.0":"EthereumAPIProvider"},"RippleNetworkParams":{"NetworkCoinParams":["RippleAPIProvider"],"NetworkCoinParams.0":"RippleAPIProvider"},"SolanaNetworkParams":{"NetworkCoinParams":["SolanaAPIProvider"],"NetworkCoinParams.0":"SolanaAPIProvider"},"SubstrateNetworkParams":{"NetworkCoinParams":["SubstrateAPIProvider"],"NetworkCoinParams.0":"SubstrateAPIProvider"},"TonNetworkParams":{"NetworkCoinParams":["TonAPIProvider"],"NetworkCoinParams.0":"TonAPIProvider"},"TronNetworkParams":{"NetworkCoinParams":["TronAPIProvider"],"NetworkCoinParams.0":"TronAPIProvider"},"CardanoAddrDetails":{"Equatable":[]},"SolanaWeb3TransactionSignResponse":{"SolanaWeb3TransactionResponse":[]},"SolanaWeb3TransactionSendResponse":{"SolanaWeb3TransactionResponse":[]},"SolanaWeb3TransactionErrorResponse":{"SolanaWeb3TransactionResponse":[]},"TonAccountContext":{"Equatable":[]},"TonAccountLegacyContext":{"TonAccountContext":[],"Equatable":[]},"TonAccountSubWalletContext":{"TonAccountContext":[],"Equatable":[]},"TonAccountV5CustomContext":{"TonAccountContext":[],"Equatable":[]},"TonAccountV5SubWalletContext":{"TonAccountContext":[],"Equatable":[]},"PermissionKeys":{"Equatable":[]},"RippleNFToken":{"NFTCore":[],"Equatable":[]},"ETHERC20Token":{"TokenCore":["BigInt"],"Equatable":[]},"RippleIssueToken":{"TokenCore":["BigRational"],"Equatable":[]},"TonJettonToken":{"TokenCore":["BigInt"],"Equatable":[]},"SolanaSPLToken":{"TokenCore":["BigInt"],"Equatable":[]},"TronTRC10Token":{"TronToken":[],"TokenCore":["BigInt"],"Equatable":[]},"TronToken":{"TokenCore":["BigInt"]},"TronTRC20Token":{"TronToken":[],"TokenCore":["BigInt"],"Equatable":[]},"Token":{"Equatable":[]},"Web3RequestException":{"Exception":[]},"Web3ChainMessage":{"Web3MessageCore":[]},"Web3ExceptionMessage":{"Web3MessageCore":[]},"Web3ResponseMessage":{"Web3MessageCore":[]},"Web3WalletResponseMessage":{"Web3ResponseMessage":[],"Web3MessageCore":[]},"Web3ChainAccount":{"Equatable":[]},"Web3RequestParams":{"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3GlobalRequestParams":{"Web3MessageCore":[]},"Web3EthereumPermissionRequestParam":{"Web3EthereumRequestParam":["Web3EthereumChain"],"Web3RequestParams":["Web3EthereumChain","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["Web3EthereumChain"],"Web3MessageCore":[]},"Web3EthereumRequestParam":{"Web3RequestParams":["1","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3EthereumAddNewChain":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumPersonalSign":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumRequestAccounts":{"Web3EthereumRequestParam":["Web3EthereumChain"],"Web3RequestParams":["Web3EthereumChain","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["Web3EthereumChain"],"Web3MessageCore":[]},"Web3EthreumSendTransaction":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumTypdedData":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthreumSwitchChain":{"Web3EthereumRequestParam":["String"],"Web3RequestParams":["String","ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3EthereumChainAccount":{"Web3ChainAccount":["ETHAddress"],"Equatable":[],"Web3ChainAccount.0":"ETHAddress"},"Web3EthereumChain":{"Web3Chain":["ETHAddress","EthereumChain","Web3EthereumChainAccount"],"Web3Chain.2":"Web3EthereumChainAccount"},"Web3DisconnectApplication":{"Web3GlobalRequestParams":["@"],"Web3MessageCore":[]},"Web3SolanaPermissionRequestParam":{"Web3SolanaRequestParam":["Web3SolanaChain"],"Web3RequestParams":["Web3SolanaChain","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["Web3SolanaChain"],"Web3MessageCore":[]},"Web3SolanaRequestParam":{"Web3RequestParams":["1","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3SolanaRequestAccounts":{"Web3SolanaRequestParam":["Web3SolanaChain"],"Web3RequestParams":["Web3SolanaChain","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["Web3SolanaChain"],"Web3MessageCore":[]},"Web3SolanaSignMessage":{"Web3SolanaRequestParam":["Web3SolanaSignMessageResponse"],"Web3RequestParams":["Web3SolanaSignMessageResponse","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["Web3SolanaSignMessageResponse"],"Web3MessageCore":[]},"Web3SolanaSendTransaction":{"Web3SolanaRequestParam":["List>"],"Web3RequestParams":["List>","SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain"],"Web3GlobalRequestParams":["List>"],"Web3MessageCore":[]},"Web3SolanaChainAccount":{"Web3ChainAccount":["SolAddress"],"Equatable":[],"Web3ChainAccount.0":"SolAddress"},"Web3SolanaChain":{"Web3Chain":["SolAddress","SolanaChain","Web3SolanaChainAccount"],"Web3Chain.2":"Web3SolanaChainAccount"},"Web3TonPermissionRequestParam":{"Web3TonRequestParam":["Web3TonChain"],"Web3RequestParams":["Web3TonChain","TonAddress","TheOpenNetworkChain","Web3TonChainAccount","Web3TonChain"],"Web3GlobalRequestParams":["Web3TonChain"],"Web3MessageCore":[]},"Web3TonRequestParam":{"Web3RequestParams":["1","TonAddress","TheOpenNetworkChain","Web3TonChainAccount","Web3TonChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3TonRequestAccounts":{"Web3TonRequestParam":["Web3TonChain"],"Web3RequestParams":["Web3TonChain","TonAddress","TheOpenNetworkChain","Web3TonChainAccount","Web3TonChain"],"Web3GlobalRequestParams":["Web3TonChain"],"Web3MessageCore":[]},"Web3TonSignMessage":{"Web3TonRequestParam":["List"],"Web3RequestParams":["List","TonAddress","TheOpenNetworkChain","Web3TonChainAccount","Web3TonChain"],"Web3GlobalRequestParams":["List"],"Web3MessageCore":[]},"Web3TonSendTransaction":{"Web3TonRequestParam":["Web3TonSendTransactionResponse"],"Web3RequestParams":["Web3TonSendTransactionResponse","TonAddress","TheOpenNetworkChain","Web3TonChainAccount","Web3TonChain"],"Web3GlobalRequestParams":["Web3TonSendTransactionResponse"],"Web3MessageCore":[]},"Web3TonChainAccount":{"Web3ChainAccount":["TonAddress"],"Equatable":[],"Web3ChainAccount.0":"TonAddress"},"Web3TonChain":{"Web3Chain":["TonAddress","TheOpenNetworkChain","Web3TonChainAccount"],"Web3Chain.2":"Web3TonChainAccount"},"Web3TronPermissionRequestParam":{"Web3TronRequestParam":["Web3TronChain"],"Web3RequestParams":["Web3TronChain","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["Web3TronChain"],"Web3MessageCore":[]},"Web3TronRequestParam":{"Web3RequestParams":["1","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["1"],"Web3MessageCore":[]},"Web3TronRequestAccounts":{"Web3TronRequestParam":["Web3TronChain"],"Web3RequestParams":["Web3TronChain","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["Web3TronChain"],"Web3MessageCore":[]},"Web3TronSignMessageV2":{"Web3TronRequestParam":["String"],"Web3RequestParams":["String","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["String"],"Web3MessageCore":[]},"Web3TronSendTransaction":{"Web3TronRequestParam":["Map"],"Web3RequestParams":["Map","TronAddress","TronChain","Web3TronChainAccount","Web3TronChain"],"Web3GlobalRequestParams":["Map"],"Web3MessageCore":[]},"Web3TronChainAccount":{"Web3ChainAccount":["TronAddress"],"Equatable":[],"Web3ChainAccount.0":"TronAddress"},"Web3TronChain":{"Web3Chain":["TronAddress","TronChain","Web3TronChainAccount"],"Web3Chain.2":"Web3TronChainAccount"},"ADAByronAddress":{"ADAAddress":[]},"ADAPointerAddress":{"ADAAddress":[]},"ADARewardAddress":{"ADAAddress":[]},"ADABaseAddress":{"ADAAddress":[]},"ADAShellyAddress":{"ADAAddress":[]},"ADAEnterpriseAddress":{"ADAAddress":[]},"StakeCred":{"FixedBytes":[],"Comparable":["FixedBytes"]},"StakeCredKey":{"StakeCred":[],"FixedBytes":[],"Comparable":["FixedBytes"]},"StakeCredScript":{"StakeCred":[],"FixedBytes":[],"Comparable":["FixedBytes"]},"FixedBytes":{"Comparable":["FixedBytes"]},"BlockfrostRequestBackendHealthStatus":{"BlockforestRequestParam":["bool","Map"]},"BlockfrostError":{"BlockchainUtilsException":[],"Exception":[]},"ETHAddress":{"SolidityAddress":[]},"RPCGetChainId":{"ETHRPCRequest":["BigInt"]},"SolanaPluginException":{"BlockchainUtilsException":[],"Exception":[]},"SolanaRPCGetGenesisHash":{"SolanaRPCRequest":["String"],"SolanaRPCRequest.T":"String"},"Message":{"VersionedMessage":[]},"MessageV0":{"VersionedMessage":[]},"Eip712TypedData":{"EIP712Base":[]},"EIP712Legacy":{"EIP712Base":[]},"SolidityAbiException":{"BlockchainUtilsException":[],"Exception":[]},"AddressCoder":{"ABICoder":["SolidityAddress"]},"ArrayCoder":{"ABICoder":["List<@>"]},"BooleanCoder":{"ABICoder":["bool"]},"BytesCoder":{"ABICoder":["List"]},"FunctionCoder":{"ABICoder":["List"]},"NumbersCoder":{"ABICoder":["BigInt"]},"StringCoder":{"ABICoder":["String"]},"TupleCoder":{"ABICoder":["List<@>"]},"TronAddress":{"SolidityAddress":[]},"TronPluginException":{"BlockchainUtilsException":[],"Exception":[]},"AccountCreateContract":{"TronBaseContract":[]},"AccountPermissionUpdateContract":{"TronBaseContract":[]},"AccountType":{"TronEnumerate":[]},"AccountUpdateContract":{"TronBaseContract":[]},"PermissionType":{"TronEnumerate":[]},"SetAccountIdContract":{"TronBaseContract":[]},"AssetIssueContract":{"TronBaseContract":[]},"ParticipateAssetIssueContract":{"TronBaseContract":[]},"TransferAssetContract":{"TronBaseContract":[]},"UnfreezeAssetContract":{"TronBaseContract":[]},"UpdateAssetContract":{"TronBaseContract":[]},"CancelAllUnfreezeV2Contract":{"TronBaseContract":[]},"DelegateResourceContract":{"TronBaseContract":[]},"FreezeBalanceContract":{"TronBaseContract":[]},"FreezeBalanceV2Contract":{"TronBaseContract":[]},"TransferContract":{"TronBaseContract":[]},"UnDelegateResourceContract":{"TronBaseContract":[]},"UnfreezeBalanceContract":{"TronBaseContract":[]},"UnfreezeBalanceV2Contract":{"TronBaseContract":[]},"WithdrawBalanceContract":{"TronBaseContract":[]},"WithdrawExpireUnfreezeContract":{"TronBaseContract":[]},"ResourceCode":{"TronEnumerate":[]},"TransactionContractType":{"TronEnumerate":[]},"ExchangeCreateContract":{"TronBaseContract":[]},"ExchangeInjectContract":{"TronBaseContract":[]},"ExchangeTransactionContract":{"TronBaseContract":[]},"ExchangeWithdrawContract":{"TronBaseContract":[]},"MarketCancelOrderContract":{"TronBaseContract":[]},"MarketSellAssetContract":{"TronBaseContract":[]},"ProposalApproveContract":{"TronBaseContract":[]},"ProposalCreateContract":{"TronBaseContract":[]},"ProposalDeleteContract":{"TronBaseContract":[]},"ShieldedTransferContract":{"TronBaseContract":[]},"SmartContractAbiEntryType":{"TronEnumerate":[]},"SmartContractAbiStateMutabilityType":{"TronEnumerate":[]},"ClearABIContract":{"TronBaseContract":[]},"CreateSmartContract":{"TronBaseContract":[]},"TriggerSmartContract":{"TronBaseContract":[]},"UpdateEnergyLimitContract":{"TronBaseContract":[]},"UpdateSettingContract":{"TronBaseContract":[]},"UpdateBrokerageContract":{"TronBaseContract":[]},"VoteAssetContract":{"TronBaseContract":[]},"VoteWitnessContract":{"TronBaseContract":[]},"WitnessUpdateContract":{"TronBaseContract":[]},"WitnessCreateContract":{"TronBaseContract":[]},"TronRequestGetBlockByNum":{"TVMRequestParam":["Map","Map"],"TVMRequestParam.0":"Map","TVMRequestParam.1":"Map"},"PathException":{"Exception":[]},"PosixStyle":{"InternalStyle":[]},"UrlStyle":{"InternalStyle":[]},"WindowsStyle":{"InternalStyle":[]},"SubstrateMetadata":{"SubstrateSerialization":["1"]},"MetadataException":{"BlockchainUtilsException":[],"Exception":[]},"TypeDefOption":{"SubstrateSerialization":["1"],"ScaleTypeDef":[]},"UnsupportedMetadata":{"SubstrateMetadata":["List"],"SubstrateSerialization":["List"]},"Si0TypeDefPrimitive":{"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1Field":{"SubstrateSerialization":["Map"]},"Si1TypeDefHistoricMetaCompat":{"Si1TypeDef":["String"],"SubstrateSerialization":["String"],"ScaleTypeDef":[]},"Si1Type":{"SubstrateSerialization":["Map"]},"Si1TypeDef":{"SubstrateSerialization":["1"],"ScaleTypeDef":[]},"Si1TypeDefArray":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefBitSequence":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefCompact":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefComposite":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefPrimitive":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefSequence":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeDefTuple":{"Si1TypeDef":["List"],"SubstrateSerialization":["List"],"ScaleTypeDef":[]},"Si1TypeDefVariant":{"Si1TypeDef":["Map"],"SubstrateSerialization":["Map"],"ScaleTypeDef":[]},"Si1TypeParameter":{"SubstrateSerialization":["Map"]},"Si1Variant":{"SubstrateSerialization":["Map"]},"StorageHasherV14":{"SubstrateSerialization":["Map"]},"StorageHasherV11":{"SubstrateSerialization":["Map"]},"StorageEntryModifierV14":{"StorageEntryModifierV9":[],"SubstrateSerialization":["Map"]},"ExtrinsicMetadataV14":{"SubstrateSerialization":["Map"]},"MetadataV14":{"SubstrateMetadata":["Map"],"SubstrateSerialization":["Map"],"LatestMetadataInterface":[]},"PalletCallMetadataV14":{"SubstrateSerialization":["Map"]},"PalletConstantMetadataV14":{"SubstrateSerialization":["Map"]},"PalletErrorMetadataV14":{"SubstrateSerialization":["Map"]},"PalletEventMetadataV14":{"SubstrateSerialization":["Map"]},"PalletMetadataV14":{"SubstrateSerialization":["Map"]},"PalletStorageMetadataV14":{"SubstrateSerialization":["Map"]},"PortableRegistryV14":{"SubstrateSerialization":["Map"]},"PortableTypeV14":{"SubstrateSerialization":["Map"]},"SignedExtensionMetadataV14":{"SubstrateSerialization":["Map"]},"StorageEntryTypeV14":{"SubstrateSerialization":["1"]},"StorageEntryTypeV14Map":{"StorageEntryTypeV14":["Map"],"SubstrateSerialization":["Map"]},"StorageEntryTypeV14Plain":{"StorageEntryTypeV14":["int"],"SubstrateSerialization":["int"]},"StorageEntryMetadataV14":{"SubstrateSerialization":["Map"]},"CustomMetadata15":{"SubstrateSerialization":["Map"]},"CustomValueMetadata15":{"SubstrateSerialization":["Map"]},"ExtrinsicMetadataV15":{"SubstrateSerialization":["Map"]},"MetadataV15":{"SubstrateMetadata":["Map"],"SubstrateSerialization":["Map"],"LatestMetadataInterface":[]},"OuterEnums15":{"SubstrateSerialization":["Map"]},"PalletMetadataV15":{"PalletMetadataV14":[],"SubstrateSerialization":["Map"]},"RuntimeApiMetadataV15":{"SubstrateSerialization":["Map"]},"RuntimeApiMethodMetadataV15":{"SubstrateSerialization":["Map"]},"RuntimeApiMethodParamMetadataV15":{"SubstrateSerialization":["Map"]},"StorageEntryModifierV9":{"SubstrateSerialization":["Map"]},"VersionedMetadata":{"SubstrateSerialization":["Map"]},"SubstrateBlockHash":{"SubstrateSerialization":["List"]},"ScaleFixedBytes":{"SubstrateSerialization":["List"]},"SubstrateHash256":{"SubstrateSerialization":["List"]},"SubstrateRPCChainGetBlockHash":{"SubstrateRPCRequest":["String","String"],"SubstrateRPCRequest.1":"String","SubstrateRPCRequest.0":"String"},"SubstrateRPCRuntimeMetadataGetVersions":{"SubstrateRPCRequest":["String","List"],"SubstrateRPCRequest.1":"List","SubstrateRPCRequest.0":"String"},"FileLocation":{"SourceLocation":[],"Comparable":["SourceLocation"]},"_FileSpan":{"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceLocation":{"Comparable":["SourceLocation"]},"SourceLocationMixin":{"SourceLocation":[],"Comparable":["SourceLocation"]},"SourceSpan":{"Comparable":["SourceSpan"]},"SourceSpanBase":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanException":{"Exception":[]},"SourceSpanFormatException":{"FormatException":[],"Exception":[]},"SourceSpanMixin":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanWithContext":{"SourceSpan":[],"Comparable":["SourceSpan"]},"StringScannerException":{"FormatException":[],"Exception":[]},"BocException":{"BlockchainUtilsException":[],"Exception":[]},"TonContractException":{"BlockchainUtilsException":[],"Exception":[]},"WalletV1R1":{"VersionedWalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"NoneSubWalletVersionedWalletState"},"WalletV1R2":{"VersionedWalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"NoneSubWalletVersionedWalletState"},"WalletV1R3":{"VersionedWalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"NoneSubWalletVersionedWalletState"},"WalletV2R1":{"VersionedWalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"NoneSubWalletVersionedWalletState"},"WalletV2R2":{"VersionedWalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["NoneSubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"NoneSubWalletVersionedWalletState"},"WalletV3R1":{"VersionedWalletContract":["SubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["SubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["SubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"SubWalletVersionedWalletState"},"WalletV3R2":{"VersionedWalletContract":["SubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["SubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["SubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"SubWalletVersionedWalletState"},"WalletV4":{"VersionedWalletContract":["SubWalletVersionedWalletState","VersionedTransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["SubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract":["SubWalletVersionedWalletState","VersionedTransferParams"],"WalletContract.C":"SubWalletVersionedWalletState"},"WalletV5R1":{"VersionedWalletContract":["V5VersionedWalletState","VersionedV5TransferParams"],"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["V5VersionedWalletState","VersionedV5TransferParams"],"WalletContract":["V5VersionedWalletState","VersionedV5TransferParams"],"WalletContract.C":"V5VersionedWalletState"},"VersionedWalletContract":{"_VersionedWalletContract_WalletContract_VerionedProviderImpl":["1","2"],"WalletContract":["1","2"]},"V5R1Context":{"BocSerializableObject":[]},"V5R1CustomContext":{"V5R1Context":[],"BocSerializableObject":[]},"V5R1ClientContext":{"V5R1Context":[],"BocSerializableObject":[]},"KeyException":{"BlockchainUtilsException":[],"Exception":[]},"DictException":{"BlockchainUtilsException":[],"Exception":[]},"TonDartPluginException":{"BlockchainUtilsException":[],"Exception":[]},"SimpleLibrary":{"BocSerializableObject":[]},"StateInit":{"BocSerializableObject":[]},"TonCenterPostRequestParam":{"TonApiRequestParam":["1","2"]},"TonApiError":{"BlockchainUtilsException":[],"Exception":[]},"TonApiGetBlockchainMasterchainHead":{"TonApiRequestParam":["BlockchainBlockResponse","Map"],"TonApiRequestParam.0":"BlockchainBlockResponse","TonApiRequestParam.1":"Map"},"TonCenterGetMasterchainInfo":{"TonApiRequestParam":["Map","Map"],"TonApiRequestParam.0":"Map","TonApiRequestParam.1":"Map"},"TonSerialization":{"BocSerializableObject":[]},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"RPCServerState":{"XRPLedgerRequest":["XRPLedgerState"]},"XRPLAddressCodecException":{"BlockchainUtilsException":[],"Exception":[]},"EthereumWeb3State":{"ChainWeb3State":["ETHAddress","EthereumChain","Web3EthereumChain"],"ChainWeb3State.1":"EthereumChain","ChainWeb3State.2":"Web3EthereumChain"},"JSEthereumHandler":{"JSNetworkHandler":["ETHAddress","EthereumChain","Web3EthereumChainAccount","Web3EthereumChain","EthereumWeb3State"]},"SolanaWeb3State":{"ChainWeb3State":["SolAddress","SolanaChain","Web3SolanaChain"],"ChainWeb3State.1":"SolanaChain","ChainWeb3State.2":"Web3SolanaChain"},"JSSolanaHandler":{"JSNetworkHandler":["SolAddress","SolanaChain","Web3SolanaChainAccount","Web3SolanaChain","SolanaWeb3State"]},"TonWeb3State":{"ChainWeb3State":["TonAddress","TheOpenNetworkChain","Web3TonChain"],"ChainWeb3State.1":"TheOpenNetworkChain","ChainWeb3State.2":"Web3TonChain"},"JSTonHandler":{"JSNetworkHandler":["TonAddress","TheOpenNetworkChain","Web3TonChainAccount","Web3TonChain","TonWeb3State"]},"TronWeb3State":{"ChainWeb3State":["TronAddress","TronChain","Web3TronChain"],"ChainWeb3State.1":"TronChain","ChainWeb3State.2":"Web3TronChain"},"JSTronHandler":{"JSNetworkHandler":["TronAddress","TronChain","Web3TronChainAccount","Web3TronChain","TronWeb3State"]}}')); + A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"_DelayedEvent":1,"UnmodifiableMapBase":2,"_SetBase":1,"Converter":2,"BitcoinNetworkAddress":1,"HTTPService":1,"BaseSocketService":1,"CryptoAddress":1,"SubstrateMetadata":1,"TonContract":1,"VerionedProviderImpl":2,"TonCenterPostRequestParam":2}')); var string$ = { x20must_: " must not be greater than the number of characters in the file, ", x27__Ple: "': Please ensure that the arguments for '", @@ -60666,7 +64520,11 @@ Cannotfq: "Cannot extract a file path from a URI with a query component", Cannotn: "Cannot extract a non-Windows file path from a file URI with an authority", Error_: "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type", - The_UR: "The URL is banned by the owner of the wallet. Please use an allowed URL or contact the wallet owner for further assistance.", + Invalis: "Invalid message bytes. message must be a valid bytes like Uint8Array", + InvalitI: "Invalid method parameters: Invalid message bytes. message must be a valid bytes like Uint8Array", + InvalitT: "Invalid method parameters: Transaction serialization failed", + Please: "Please use static method `TronWeb.TRX.sign` for signing with own private key", + The_UR: "The URL is disable by the owner of the wallet. Please use an allowed URL or contact the wallet owner for further assistance.", decodi: "decoding cbor required object, bytes or hex. no value provided for decoding.", handle: "handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace.", https_lda: "https://live.blockcypher.com/doge/address/#address/", @@ -60680,6 +64538,7 @@ var type$ = (function rtii() { var findType = A.findType; return { + $env_1_1_BigInt: findType("@"), $env_1_1_Map_String_dynamic: findType("@>"), $env_1_1_dynamic: findType("@<@>"), $env_1_1_void: findType("@<~>"), @@ -60750,7 +64609,6 @@ CborListValue_String: findType("CborListValue"), CborListValue_dynamic: findType("CborListValue<@>"), CborListValue_int: findType("CborListValue"), - CborListValue_nullable_CborObject: findType("CborListValue"), CborListValue_nullable_Object: findType("CborListValue"), CborListValue_nullable_String: findType("CborListValue"), CborMapValue_CborObject_CborObject: findType("CborMapValue"), @@ -60772,17 +64630,14 @@ CborTagValue_CborSetValue_CborObject: findType("CborTagValue>"), CborTagValue_List_int: findType("CborTagValue>"), CborTagValue_dynamic: findType("CborTagValue<@>"), + Cell: findType("Cell"), + CellType: findType("CellType"), ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore: findType("ChainAccount<@,TokenCore<@>,NFTCore>"), ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore: findType("ChainAccount,NFTCore>"), Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider: findType("Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>"), Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_APIProvider: findType("Chain,@,TokenCore<@>,NFTCore,ChainAccount,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>"), Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_nullable_Object_and_TokenCore_dynamic_and_NFTCore_and_APIProvider: findType("Chain,Object?,TokenCore<@>,NFTCore,ChainAccount,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>"), - ChainsHandler: findType("ChainsHandler"), Cip1852Coins: findType("Cip1852Coins"), - ClientMessageEthereum: findType("ClientMessageEthereum"), - ClientMessageSolana: findType("ClientMessageSolana"), - ClientMessageTron: findType("ClientMessageTron"), - ClientSolanaTransactionMessage: findType("ClientSolanaTransactionMessage"), CodeUnits: findType("CodeUnits"), CoingeckoCoin: findType("CoingeckoCoin"), Comparable_dynamic: findType("Comparable<@>"), @@ -60812,6 +64667,7 @@ CustomLayout_of_Map_String_dynamic_and_dynamic: findType("CustomLayout,@>"), CustomValueMetadata15: findType("CustomValueMetadata15"), DateTime: findType("DateTime"), + DictionaryKey_BigInt: findType("DictionaryKey"), Duration: findType("Duration"), EIP712Base: findType("EIP712Base"), EIP712Version: findType("EIP712Version"), @@ -60831,7 +64687,6 @@ EthereumAPIProvider: findType("EthereumAPIProvider"), EthereumChain: findType("EthereumChain"), EthereumClient: findType("EthereumClient"), - EthereumEventTypes: findType("EthereumEventTypes"), EthereumMethods: findType("EthereumMethods"), EthereumSubscribeResult: findType("EthereumSubscribeResult"), EthereumWebsocketService: findType("EthereumWebsocketService"), @@ -60878,7 +64733,7 @@ JSArray_BitcoinAddressType: findType("JSArray"), JSArray_CborBytesValue: findType("JSArray"), JSArray_CborObject: findType("JSArray"), - JSArray_ClientSolanaTransactionMessage: findType("JSArray"), + JSArray_Cell: findType("JSArray"), JSArray_CompiledInstruction: findType("JSArray"), JSArray_ContactCore_ADAAddress: findType("JSArray>"), JSArray_ContactCore_BitcoinBaseAddress: findType("JSArray>"), @@ -60918,6 +64773,7 @@ JSArray_Permission: findType("JSArray"), JSArray_PermissionKeys: findType("JSArray"), JSArray_ProtocolBufferDecoderResult_dynamic: findType("JSArray>"), + JSArray_Pruned: findType("JSArray"), JSArray_RippleIssueToken: findType("JSArray"), JSArray_RippleNFToken: findType("JSArray"), JSArray_SmartContractABIEntry: findType("JSArray"), @@ -60933,26 +64789,22 @@ JSArray_Web3EthereumChainAccount: findType("JSArray"), JSArray_Web3SolanaChainAccount: findType("JSArray"), JSArray_Web3SolanaSendTransactionData: findType("JSArray"), + JSArray_Web3TonChainAccount: findType("JSArray"), JSArray_Web3TronChainAccount: findType("JSArray"), JSArray__Highlight: findType("JSArray<_Highlight>"), JSArray__Line: findType("JSArray<_Line>"), JSArray_double: findType("JSArray"), JSArray_dynamic: findType("JSArray<@>"), JSArray_int: findType("JSArray"), - JSArray_nullable_CborObject: findType("JSArray"), JSArray_nullable_Object: findType("JSArray"), JSArray_nullable_String: findType("JSArray"), JSArray_nullable_int: findType("JSArray"), JSArray_of_void_Function_EthereumSubscribeResult: findType("JSArray<~(EthereumSubscribeResult)>"), JSClientType: findType("JSClientType"), + JSEventType: findType("JSEventType"), + JSNetworkHandler_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_ChainWeb3State_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic: findType("JSNetworkHandler<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>,ChainWeb3State<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>>>"), JSNull: findType("JSNull"), JSObject: findType("JSObject"), - JSPageRequest: findType("JSPageRequest"), - JSWalletMessage: findType("JSWalletMessage"), - JSWalletMessageResponse: findType("JSWalletMessageResponse"), - JSWalletMessageResponseEthereum: findType("JSWalletMessageResponseEthereum"), - JSWalletMessageResponseSolana: findType("JSWalletMessageResponseSolana"), - JSWalletMessageResponseTron: findType("JSWalletMessageResponseTron"), JSWalletMessageType: findType("JSWalletMessageType"), JSWalletResponseType: findType("JSWalletResponseType"), JSWebviewTraget: findType("JSWebviewTraget"), @@ -60994,10 +64846,14 @@ MapEntry_int_String: findType("MapEntry"), MapEntry_of_Object_and_List__Highlight: findType("MapEntry>"), MapEntry_of_String_and_List_Map_String_dynamic: findType("MapEntry>>"), + MapEntry_of_String_and_Map_String_dynamic: findType("MapEntry>"), MapEntry_of_String_and_nullable_String: findType("MapEntry"), + Map_BigInt_SimpleLibrary: findType("Map"), Map_String_dynamic: findType("Map"), Map_dynamic_dynamic: findType("Map<@,@>"), + Map_of_JSClientType_and_JSNetworkHandler_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_ChainWeb3State_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic: findType("Map,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>,ChainWeb3State<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>>>>"), Map_of_nullable_Object_and_nullable_Object: findType("Map"), + MappedListIterable_JSObject_Object: findType("MappedListIterable"), MappedListIterable_PrimitiveTypes_String: findType("MappedListIterable"), MappedListIterable_String_dynamic: findType("MappedListIterable"), MappedListIterable_of_EncoderResult_and_List_int: findType("MappedListIterable>"), @@ -61013,10 +64869,10 @@ NetworkType: findType("NetworkType"), Null: findType("Null"), Object: findType("Object"), + Object_Function_JSObject: findType("Object(JSObject)"), P2shAddressType: findType("P2shAddressType"), PaddingLayout_int: findType("PaddingLayout"), - PageMessage: findType("PageMessage"), - PageRequestCompeleter: findType("PageRequestCompeleter"), + PageMessageType: findType("PageMessageType"), PalletConstantMetadataV14: findType("PalletConstantMetadataV14"), PalletMetadataV14: findType("PalletMetadataV14"), PalletMetadataV15: findType("PalletMetadataV15"), @@ -61033,12 +64889,14 @@ ProviderAuthType: findType("ProviderAuthType"), ProxyMethodHandler_JSObject: findType("ProxyMethodHandler"), ProxyMethodHandler_Object: findType("ProxyMethodHandler"), + Pruned: findType("Pruned"), RPCRequestDetails: findType("RPCRequestDetails"), RawSecureSocket: findType("RawSecureSocket"), RawSocketEvent: findType("RawSocketEvent"), ReceiveDescription: findType("ReceiveDescription"), Record: findType("Record"), Record_0: findType("+()"), + Record_2_Web3MessageCore_and_nullable_Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic: findType("+(Web3MessageCore,Web3RequestParams<@,@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>>?)"), RegExpMatch: findType("RegExpMatch"), ResourceCode: findType("ResourceCode"), Response: findType("Response"), @@ -61061,6 +64919,7 @@ Si1TypeParameter: findType("Si1TypeParameter"), Si1Variant: findType("Si1Variant"), SignedExtensionMetadataV14: findType("SignedExtensionMetadataV14"), + SimpleLibrary: findType("SimpleLibrary"), SmartContractABI: findType("SmartContractABI"), SmartContractABIEntry: findType("SmartContractABIEntry"), SmartContractAbiEntryType: findType("SmartContractAbiEntryType"), @@ -61072,7 +64931,6 @@ SolanaAPIProvider: findType("SolanaAPIProvider"), SolanaChain: findType("SolanaChain"), SolanaClient: findType("SolanaClient"), - SolanaEventTypes: findType("SolanaEventTypes"), SolanaRequestDetails: findType("SolanaRequestDetails"), SolanaSPLToken: findType("SolanaSPLToken"), SolanaWeb3TransactionResponse: findType("SolanaWeb3TransactionResponse"), @@ -61101,11 +64959,15 @@ SubstrateCoins: findType("SubstrateCoins"), SubstrateMetadata_dynamic: findType("SubstrateMetadata<@>"), SubstrateRequestDetails: findType("SubstrateRequestDetails"), + TheOpenNetworkChain: findType("TheOpenNetworkChain"), TokenCore_BigInt: findType("TokenCore"), TokenCore_dynamic: findType("TokenCore<@>"), TonAPIProvider: findType("TonAPIProvider"), + TonAccountContextType: findType("TonAccountContextType"), TonAddress: findType("TonAddress"), TonApiType: findType("TonApiType"), + TonChain: findType("TonChain"), + TonChainId: findType("TonChainId"), TonClient: findType("TonClient"), TonJettonToken: findType("TonJettonToken"), TransactionContract: findType("TransactionContract"), @@ -61116,7 +64978,6 @@ TronChainType: findType("TronChainType"), TronClient: findType("TronClient"), TronEnumerate: findType("TronEnumerate"), - TronEventTypes: findType("TronEventTypes"), TronKey: findType("TronKey"), TronMultiSigSignerDetais: findType("TronMultiSigSignerDetais"), TronTRC10Token: findType("TronTRC10Token"), @@ -61179,12 +65040,18 @@ Web3GlobalRequestMethods: findType("Web3GlobalRequestMethods"), Web3MessageCore: findType("Web3MessageCore"), Web3MessageTypes: findType("Web3MessageTypes"), + Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic: findType("Web3RequestParams<@,@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>>"), Web3ResponseMessage: findType("Web3ResponseMessage"), Web3SolanaChain: findType("Web3SolanaChain"), Web3SolanaChainAccount: findType("Web3SolanaChainAccount"), Web3SolanaRequestMethods: findType("Web3SolanaRequestMethods"), Web3SolanaSendTransaction: findType("Web3SolanaSendTransaction"), Web3SolanaSendTransactionData: findType("Web3SolanaSendTransactionData"), + Web3TonChain: findType("Web3TonChain"), + Web3TonChainAccount: findType("Web3TonChainAccount"), + Web3TonRequestMethods: findType("Web3TonRequestMethods"), + Web3TonSendTransaction: findType("Web3TonSendTransaction"), + Web3TonTransactionMessage: findType("Web3TonTransactionMessage"), Web3TronChain: findType("Web3TronChain"), Web3TronChainAccount: findType("Web3TronChainAccount"), Web3TronRequestMethods: findType("Web3TronRequestMethods"), @@ -61198,9 +65065,11 @@ WhereTypeIterable_EthereumChain: findType("WhereTypeIterable"), WhereTypeIterable_SolanaChain: findType("WhereTypeIterable"), WhereTypeIterable_String: findType("WhereTypeIterable"), + WhereTypeIterable_TheOpenNetworkChain: findType("WhereTypeIterable"), WhereTypeIterable_TronChain: findType("WhereTypeIterable"), XRPAddress: findType("XRPAddress"), XRPLedgerState: findType("XRPLedgerState"), + _AsyncCompleter_JSObject: findType("_AsyncCompleter"), _AsyncCompleter_JSWebviewWallet: findType("_AsyncCompleter"), _AsyncCompleter_RawSecureSocket: findType("_AsyncCompleter"), _AsyncCompleter_StreamedResponse: findType("_AsyncCompleter"), @@ -61209,11 +65078,11 @@ _AsyncCompleter_WebsocketWeb: findType("_AsyncCompleter"), _AsyncCompleter__RawSecureSocket: findType("_AsyncCompleter<_RawSecureSocket>"), _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"), - _AsyncCompleter_nullable_Object: findType("_AsyncCompleter"), _AsyncCompleter_void: findType("_AsyncCompleter<~>"), _BigIntImpl: findType("_BigIntImpl"), _EventStream_JSObject: findType("_EventStream"), _FilterStatus: findType("_FilterStatus"), + _Future_JSObject: findType("_Future"), _Future_JSWebviewWallet: findType("_Future"), _Future_RawSecureSocket: findType("_Future"), _Future_StreamedResponse: findType("_Future"), @@ -61223,11 +65092,11 @@ _Future__RawSecureSocket: findType("_Future<_RawSecureSocket>"), _Future_dynamic: findType("_Future<@>"), _Future_int: findType("_Future"), - _Future_nullable_Object: findType("_Future"), _Future_void: findType("_Future<~>"), _Highlight: findType("_Highlight"), _IdentityHashMap_of_nullable_Object_and_nullable_Object: findType("_IdentityHashMap"), _Line: findType("_Line"), + _ReadCellResult: findType("_ReadCellResult"), _Result_BigInt: findType("_Result"), _Result_int: findType("_Result"), _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState"), @@ -61251,14 +65120,17 @@ nullable_CborListValue_dynamic: findType("CborListValue<@>?"), nullable_CborObject: findType("CborObject?"), nullable_CborTagValue_dynamic: findType("CborTagValue<@>?"), + nullable_Cell: findType("Cell?"), nullable_CosmosNetworkParams: findType("CosmosNetworkParams?"), nullable_DateTime: findType("DateTime?"), + nullable_Dictionary_BigInt_SimpleLibrary: findType("Dictionary?"), nullable_Duration: findType("Duration?"), nullable_ETHAddress: findType("ETHAddress?"), nullable_EthereumNetworkParams: findType("EthereumNetworkParams?"), nullable_Future_Null: findType("Future?"), nullable_JSArray_nullable_Object: findType("JSArray?"), nullable_JSObject: findType("JSObject?"), + nullable_JSSolanaSignTransactionResponse: findType("JSSolanaSignTransactionResponse?"), nullable_JavaScriptFunction: findType("JavaScriptFunction?"), nullable_List_CborObject: findType("List?"), nullable_List_List_int: findType("List>?"), @@ -61267,7 +65139,6 @@ nullable_List_int: findType("List?"), nullable_Map_String_String: findType("Map?"), nullable_Map_String_dynamic: findType("Map?"), - nullable_Map_dynamic_dynamic: findType("Map<@,@>?"), nullable_MetadataApi: findType("MetadataApi?"), nullable_Object: findType("Object?"), nullable_PlatformWebScoket: findType("PlatformWebScoket?"), @@ -61290,6 +65161,7 @@ nullable_TronAccountInfo: findType("TronAccountInfo?"), nullable_TronAddress: findType("TronAddress?"), nullable_TronNetworkParams: findType("TronNetworkParams?"), + nullable_Web3RequestParams_of_dynamic_and_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic_and_Web3Chain_of_dynamic_and_Chain_of_APIProvider_and_NetworkCoinParams_APIProvider_and_dynamic_and_TokenCore_dynamic_and_NFTCore_and_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_WalletNetwork_NetworkCoinParams_APIProvider_and_NetworkClient_of_ChainAccount_of_dynamic_and_TokenCore_dynamic_and_NFTCore_and_APIProvider_and_Web3ChainAccount_dynamic: findType("Web3RequestParams<@,@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>,Web3Chain<@,Chain,@,TokenCore<@>,NFTCore,ChainAccount<@,TokenCore<@>,NFTCore>,WalletNetwork>,NetworkClient,NFTCore>,APIProvider>>,Web3ChainAccount<@>>>?"), nullable_Web3SolanaSendTransactionOptions: findType("Web3SolanaSendTransactionOptions?"), nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"), nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"), @@ -61339,11 +65211,11 @@ B.APIServiceStatus_2 = new A.APIServiceStatus("error"); B.APIType_0 = new A.APIType("mempool"); B.APIType_1 = new A.APIType("blockCypher"); - B.List_empty5 = A._setArrayType(makeConstList([]), A.findType("JSArray")); - B.AbiParameter_AmO = new A.AbiParameter("", "uint256", B.List_empty5); - B.AbiParameter_O1c = new A.AbiParameter("", "bytes", B.List_empty5); - B.AbiParameter_qgB = new A.AbiParameter("", "bytes24", B.List_empty5); - B.AbiParameter_swd = new A.AbiParameter("", "uint32", B.List_empty5); + B.List_empty6 = A._setArrayType(makeConstList([]), A.findType("JSArray")); + B.AbiParameter_AmO = new A.AbiParameter("", "uint256", B.List_empty6); + B.AbiParameter_O1c = new A.AbiParameter("", "bytes", B.List_empty6); + B.AbiParameter_qgB = new A.AbiParameter("", "bytes24", B.List_empty6); + B.AbiParameter_swd = new A.AbiParameter("", "uint32", B.List_empty6); B.AccountType_0_Normal = new A.AccountType(0, "Normal"); B.AdaStakeCredType_Key_0 = new A.AdaStakeCredType("Key", 0); B.AdaStakeCredType_Script_1 = new A.AdaStakeCredType("Script", 1); @@ -61558,6 +65430,8 @@ B.BipProposal_bip49 = new A.BipProposal("bip49"); B.BipProposal_bip84 = new A.BipProposal("bip84"); B.BipProposal_bip86 = new A.BipProposal("bip86"); + B.List_empty5 = A._setArrayType(makeConstList([]), type$.JSArray_int); + B.BitString_0_0_List_empty = new A.BitString(0, 0, B.List_empty5); B.BitcoinBasePluginException_8Gl = new A.BitcoinBasePluginException("Invalid secp256k1 public key"); B.BitcoinBasePluginException_8Gl0 = new A.BitcoinBasePluginException("network does not support p2wpkh HRP"); B.BitcoinBasePluginException_b1g = new A.BitcoinBasePluginException("Invalid Bitcoin address"); @@ -61569,11 +65443,11 @@ B.BitcoinBasePluginException_yXb = new A.BitcoinBasePluginException("Invalid segwit version"); B.CoinNames_Iot = new A.CoinNames("Bitcoin Cash TestNet"); B.List_239 = A._setArrayType(makeConstList([239]), type$.JSArray_int); - B.List_0 = A._setArrayType(makeConstList([0]), type$.JSArray_int); + B.List_00 = A._setArrayType(makeConstList([0]), type$.JSArray_int); B.List_111 = A._setArrayType(makeConstList([111]), type$.JSArray_int); B.List_8 = A._setArrayType(makeConstList([8]), type$.JSArray_int); B.List_196 = A._setArrayType(makeConstList([196]), type$.JSArray_int); - B.CoinParams_Axp = new A.CoinParams(null, null, null, null, B.List_239, null, null, null, "bchtest", B.List_0, B.List_111, "bchtest", B.List_8, B.List_196, null, null, null, null, null, null, null, null); + B.CoinParams_Axp = new A.CoinParams(null, null, null, null, B.List_239, null, null, null, "bchtest", B.List_00, B.List_111, "bchtest", B.List_8, B.List_196, null, null, null, null, null, null, null, null); B.CoinConf_O3a = new A.CoinConf(B.CoinNames_Iot, B.CoinParams_Axp); B.List_16 = A._setArrayType(makeConstList([16]), type$.JSArray_int); B.List_11 = A._setArrayType(makeConstList([11]), type$.JSArray_int); @@ -61595,7 +65469,7 @@ B.CoinNames_CDm = new A.CoinNames("Bitcoin Cash"); B.List_128 = A._setArrayType(makeConstList([128]), type$.JSArray_int); B.List_5 = A._setArrayType(makeConstList([5]), type$.JSArray_int); - B.CoinParams_vhP = new A.CoinParams(null, null, null, null, B.List_128, null, null, null, "bitcoincash", B.List_0, B.List_0, "bitcoincash", B.List_8, B.List_5, null, null, null, null, null, null, null, null); + B.CoinParams_vhP = new A.CoinParams(null, null, null, null, B.List_128, null, null, null, "bitcoincash", B.List_00, B.List_00, "bitcoincash", B.List_8, B.List_5, null, null, null, null, null, null, null, null); B.CoinConf_o8I = new A.CoinConf(B.CoinNames_CDm, B.CoinParams_vhP); B.BitcoinCashNetwork_q9y = new A.BitcoinCashNetwork(B.CoinConf_o8I, "bitcoinCashMainnet"); B.BitcoinExplorerProviderType_1 = new A.BitcoinExplorerProviderType("mempool"); @@ -61608,11 +65482,11 @@ B.CoinConf_uoT = new A.CoinConf(B.CoinNames_tuc, B.CoinParams_npp); B.BitcoinNetwork_DSc = new A.BitcoinNetwork(B.CoinConf_uoT, "bitcoinTestnet"); B.CoinNames_Bitcoin = new A.CoinNames("Bitcoin"); - B.CoinParams_ITb = new A.CoinParams(B.List_0, B.List_5, "bc", "bc", B.List_128, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + B.CoinParams_ITb = new A.CoinParams(B.List_00, B.List_5, "bc", "bc", B.List_128, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); B.CoinConf_k2a = new A.CoinConf(B.CoinNames_Bitcoin, B.CoinParams_ITb); B.BitcoinNetwork_qBr = new A.BitcoinNetwork(B.CoinConf_k2a, "bitcoinMainnet"); B.CoinNames_BitcoinSV = new A.CoinNames("BitcoinSV"); - B.CoinParams_B8J = new A.CoinParams(B.List_0, B.List_5, null, null, B.List_128, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + B.CoinParams_B8J = new A.CoinParams(B.List_00, B.List_5, null, null, B.List_128, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); B.CoinConf_u7u = new A.CoinConf(B.CoinNames_BitcoinSV, B.CoinParams_B8J); B.BitcoinSVNetwork_GZw = new A.BitcoinSVNetwork(B.CoinConf_u7u, "BitcoinSVMainnet"); B.C__EmptyStream = new A._EmptyStream(A.findType("_EmptyStream>")); @@ -61632,8 +65506,8 @@ B.C_CosmosNativeCoin2 = new A.CosmosNativeCoin(); B.C_CustomProposal = new A.CustomProposal(); B.C_EmptyIterator = new A.EmptyIterator(A.findType("EmptyIterator<0&>")); - B.C_Endian = new A.Endian(); B.C_Endian0 = new A.Endian(); + B.C_Endian = new A.Endian(); B.C_IntegerDivisionByZeroException = new A.IntegerDivisionByZeroException(); B.C_JS_CONST = function getTagFallback(o) { var s = Object.prototype.toString.call(o); @@ -61799,11 +65673,15 @@ B.CborBoleanValue_true = new A.CborBoleanValue(true); B.CborIntValue_1 = new A.CborIntValue(1); B.CborIntValue_2 = new A.CborIntValue(2); + B.CellType_Library_2 = new A.CellType("Library", 2); + B.CellType_MerkleProof_3 = new A.CellType("MerkleProof", 3); + B.CellType_MerkleUpdate_4 = new A.CellType("MerkleUpdate", 4); + B.CellType_Ordinary_m1 = new A.CellType("Ordinary", -1); + B.CellType_PrunedBranch_1 = new A.CellType("PrunedBranch", 1); B.Cip1852Coins_cardanoIcarus = new A.Cip1852Coins("cardanoIcarus"); B.Cip1852Coins_cardanoIcarusTestnet = new A.Cip1852Coins("cardanoIcarusTestnet"); B.Cip1852Coins_cardanoLedger = new A.Cip1852Coins("cardanoLedger"); B.Cip1852Coins_cardanoLedgerTestnet = new A.Cip1852Coins("cardanoLedgerTestnet"); - B.ClientMessageSolana_solana_requestAccounts_null = new A.ClientMessageSolana("solana_requestAccounts", null); B.CoinNames_Stafi = new A.CoinNames("Stafi"); B.CoinParams_GVt = new A.CoinParams(null, null, null, null, null, 20, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); B.CoinConf_9R3 = new A.CoinConf(B.CoinNames_Stafi, B.CoinParams_GVt); @@ -61992,20 +65870,6 @@ B.EncodeType_3 = new A.EncodeType("uncompressed"); B.ErgoNetworkTypes_0 = new A.ErgoNetworkTypes(0); B.ErgoNetworkTypes_16 = new A.ErgoNetworkTypes(16); - B.List_100 = A._setArrayType(makeConstList([100]), type$.JSArray_int); - B.EthereumEventTypes_List_100_accountsChanged = new A.EthereumEventTypes(B.List_100, "accountsChanged"); - B.List_101 = A._setArrayType(makeConstList([101]), type$.JSArray_int); - B.EthereumEventTypes_List_101_chainChanged = new A.EthereumEventTypes(B.List_101, "chainChanged"); - B.List_102 = A._setArrayType(makeConstList([102]), type$.JSArray_int); - B.EthereumEventTypes_List_102_message = new A.EthereumEventTypes(B.List_102, "message"); - B.List_103 = A._setArrayType(makeConstList([103]), type$.JSArray_int); - B.EthereumEventTypes_List_103_connect = new A.EthereumEventTypes(B.List_103, "connect"); - B.List_104 = A._setArrayType(makeConstList([104]), type$.JSArray_int); - B.EthereumEventTypes_List_104_disconnect = new A.EthereumEventTypes(B.List_104, "disconnect"); - B.List_105 = A._setArrayType(makeConstList([105]), type$.JSArray_int); - B.EthereumEventTypes_List_105_active = new A.EthereumEventTypes(B.List_105, "active"); - B.List_106 = A._setArrayType(makeConstList([106]), type$.JSArray_int); - B.EthereumEventTypes_List_106_disable = new A.EthereumEventTypes(B.List_106, "disable"); B.EthereumMethods_eth_subscribe = new A.EthereumMethods("eth_subscribe"); B.FloatLength_11_52 = new A.FloatLength(11, 52); B.FloatLength_5_10 = new A.FloatLength(5, 10); @@ -62015,19 +65879,37 @@ B.FriendlyAddressFlags_81 = new A.FriendlyAddressFlags(81); B.HTTPRequestType_0 = new A.HTTPRequestType("post"); B.HTTPRequestType_1 = new A.HTTPRequestType("get"); - B.JSClientType_List_111_ethereum = new A.JSClientType(B.List_111, "ethereum"); + B.List_150 = A._setArrayType(makeConstList([150]), type$.JSArray_int); + B.JSClientType_AOw = new A.JSClientType("", "global"); + B.List_151 = A._setArrayType(makeConstList([151]), type$.JSArray_int); + B.JSClientType_Ethereum_ethereum = new A.JSClientType("Ethereum", "ethereum"); + B.List_153 = A._setArrayType(makeConstList([153]), type$.JSArray_int); + B.JSClientType_Solana_solana = new A.JSClientType("Solana", "solana"); + B.List_154 = A._setArrayType(makeConstList([154]), type$.JSArray_int); + B.JSClientType_TON_ton = new A.JSClientType("TON", "ton"); + B.List_152 = A._setArrayType(makeConstList([152]), type$.JSArray_int); + B.JSClientType_Tron_tron = new A.JSClientType("Tron", "tron"); + B.List_110 = A._setArrayType(makeConstList([110]), type$.JSArray_int); + B.JSEventType_accountsChanged = new A.JSEventType("accountsChanged"); + B.List_115 = A._setArrayType(makeConstList([115]), type$.JSArray_int); + B.JSEventType_active = new A.JSEventType("active"); + B.JSEventType_chainChanged = new A.JSEventType("chainChanged"); + B.JSEventType_connect = new A.JSEventType("connect"); + B.List_116 = A._setArrayType(makeConstList([116]), type$.JSArray_int); + B.JSEventType_disable = new A.JSEventType("disable"); + B.List_114 = A._setArrayType(makeConstList([114]), type$.JSArray_int); + B.JSEventType_disconnect = new A.JSEventType("disconnect"); B.List_112 = A._setArrayType(makeConstList([112]), type$.JSArray_int); - B.JSClientType_List_112_tron = new A.JSClientType(B.List_112, "tron"); - B.JSClientType_List_113_solana = new A.JSClientType(B.List_113, "solana"); + B.JSEventType_message = new A.JSEventType("message"); B.JSNetworkState_0 = new A.JSNetworkState("init"); B.JSNetworkState_1 = new A.JSNetworkState("disconnect"); B.JSNetworkState_2 = new A.JSNetworkState("block"); - B.JSWalletMessageType_List_100_response = new A.JSWalletMessageType(B.List_100, "response"); - B.JSWalletMessageType_List_101_event = new A.JSWalletMessageType(B.List_101, "event"); - B.List_50 = A._setArrayType(makeConstList([50]), type$.JSArray_int); - B.JSWalletResponseType_List_50_success = new A.JSWalletResponseType(B.List_50, "success"); - B.List_51 = A._setArrayType(makeConstList([51]), type$.JSArray_int); - B.JSWalletResponseType_List_51_failed = new A.JSWalletResponseType(B.List_51, "failed"); + B.List_100 = A._setArrayType(makeConstList([100]), type$.JSArray_int); + B.JSWalletMessageType_response = new A.JSWalletMessageType("response"); + B.List_131 = A._setArrayType(makeConstList([131]), type$.JSArray_int); + B.JSWalletResponseType_failed = new A.JSWalletResponseType("failed"); + B.List_130 = A._setArrayType(makeConstList([130]), type$.JSArray_int); + B.JSWalletResponseType_success = new A.JSWalletResponseType("success"); B.JSWebviewTraget_1 = new A.JSWebviewTraget("macos"); B.JacobiError_QXN = new A.JacobiError("n must be larger than 2"); B.JacobiError_afZ = new A.JacobiError("n must be odd"); @@ -62058,10 +65940,11 @@ B.NetworkType_GRA = new A.NetworkType("Polkadot", B.List_80_0_12); B.List_80_0_13 = A._setArrayType(makeConstList([80, 0, 13]), type$.JSArray_int); B.NetworkType_0 = new A.NetworkType("Kusama", B.List_80_0_13); - B.List_00 = A._setArrayType(makeConstList([B.NetworkType_8eb, B.NetworkType_8Nh, B.NetworkType_Oh2, B.NetworkType_iDZ, B.NetworkType_SkF, B.NetworkType_4QF, B.NetworkType_4ei, B.NetworkType_66M, B.NetworkType_QJm, B.NetworkType_GRA, B.NetworkType_0]), A.findType("JSArray")); + B.List_01 = A._setArrayType(makeConstList([B.NetworkType_8eb, B.NetworkType_8Nh, B.NetworkType_Oh2, B.NetworkType_iDZ, B.NetworkType_SkF, B.NetworkType_4QF, B.NetworkType_4ei, B.NetworkType_66M, B.NetworkType_QJm, B.NetworkType_GRA, B.NetworkType_0]), A.findType("JSArray")); B.List_176 = A._setArrayType(makeConstList([176]), type$.JSArray_int); B.List_48 = A._setArrayType(makeConstList([48]), type$.JSArray_int); - B.CoinParams_2jN = new A.CoinParams(null, null, "ltc", null, B.List_176, null, null, null, null, B.List_48, null, null, B.List_50, null, null, B.List_0, B.List_5, null, null, null, null, null); + B.List_50 = A._setArrayType(makeConstList([50]), type$.JSArray_int); + B.CoinParams_2jN = new A.CoinParams(null, null, "ltc", null, B.List_176, null, null, null, null, B.List_48, null, null, B.List_50, null, null, B.List_00, B.List_5, null, null, null, null, null); B.CoinConf_odZ = new A.CoinConf(B.CoinNames_Litecoin, B.CoinParams_2jN); B.SegwitAddresType_P2WPKH = new A.SegwitAddresType("P2WPKH"); B.SegwitAddresType_P2WSH = new A.SegwitAddresType("P2WSH"); @@ -62080,15 +65963,14 @@ B.CoinParams_H7P1 = new A.CoinParams(B.List_111, B.List_196, null, null, B.List_239, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); B.CoinConf_eMT = new A.CoinConf(B.CoinNames_B2l, B.CoinParams_H7P1); B.BitcoinSVNetwork_UZe = new A.BitcoinSVNetwork(B.CoinConf_eMT, "BitcoinSVTestnet"); - B.List_01 = A._setArrayType(makeConstList([B.BitcoinNetwork_qBr, B.BitcoinNetwork_DSc, B.LitecoinNetwork_OXY, B.LitecoinNetwork_CiQ, B.DashNetwork_XbV, B.DashNetwork_QOU, B.DogecoinNetwork_6L0, B.DogecoinNetwork_n3E, B.BitcoinCashNetwork_q9y, B.BitcoinCashNetwork_69P, B.BitcoinSVNetwork_GZw, B.BitcoinSVNetwork_UZe, B.C_PepeNetwork]), A.findType("JSArray")); - B.List_02 = A._setArrayType(makeConstList([1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298]), type$.JSArray_dynamic); + B.List_02 = A._setArrayType(makeConstList([B.BitcoinNetwork_qBr, B.BitcoinNetwork_DSc, B.LitecoinNetwork_OXY, B.LitecoinNetwork_CiQ, B.DashNetwork_XbV, B.DashNetwork_QOU, B.DogecoinNetwork_6L0, B.DogecoinNetwork_n3E, B.BitcoinCashNetwork_q9y, B.BitcoinCashNetwork_69P, B.BitcoinSVNetwork_GZw, B.BitcoinSVNetwork_UZe, B.C_PepeNetwork]), A.findType("JSArray")); + B.List_0 = A._setArrayType(makeConstList([1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298]), type$.JSArray_dynamic); B.List_0_0_0_0 = A._setArrayType(makeConstList([0, 0, 0, 0]), type$.JSArray_int); B.List_0_10_200_0 = A._setArrayType(makeConstList([0, 10, 200, 0]), type$.JSArray_int); B.List_0uY = A._setArrayType(makeConstList(["'", "h", "p"]), type$.JSArray_String); B.List_1 = A._setArrayType(makeConstList([1]), type$.JSArray_int); B.List_100_0 = A._setArrayType(makeConstList([100, 0]), type$.JSArray_int); B.List_100_1 = A._setArrayType(makeConstList([100, 1]), type$.JSArray_int); - B.List_100_100 = A._setArrayType(makeConstList([100, 100]), type$.JSArray_int); B.List_100_12 = A._setArrayType(makeConstList([100, 12]), type$.JSArray_int); B.List_100_13 = A._setArrayType(makeConstList([100, 13]), type$.JSArray_int); B.List_100_14 = A._setArrayType(makeConstList([100, 14]), type$.JSArray_int); @@ -62101,7 +65983,6 @@ B.List_100_6 = A._setArrayType(makeConstList([100, 6]), type$.JSArray_int); B.List_100_7 = A._setArrayType(makeConstList([100, 7]), type$.JSArray_int); B.List_100_8 = A._setArrayType(makeConstList([100, 8]), type$.JSArray_int); - B.List_110 = A._setArrayType(makeConstList([110]), type$.JSArray_int); B.List_110_1 = A._setArrayType(makeConstList([110, 1]), type$.JSArray_int); B.List_110_10 = A._setArrayType(makeConstList([110, 10]), type$.JSArray_int); B.List_110_20 = A._setArrayType(makeConstList([110, 20]), type$.JSArray_int); @@ -62115,6 +65996,8 @@ B.List_161_0_0 = A._setArrayType(makeConstList([161, 0, 0]), type$.JSArray_int); B.List_161_1_1 = A._setArrayType(makeConstList([161, 1, 1]), type$.JSArray_int); B.List_161_2_1 = A._setArrayType(makeConstList([161, 2, 1]), type$.JSArray_int); + B.List_161_2_2 = A._setArrayType(makeConstList([161, 2, 2]), type$.JSArray_int); + B.List_161_2_3 = A._setArrayType(makeConstList([161, 2, 3]), type$.JSArray_int); B.List_1_2 = A._setArrayType(makeConstList([1, 2]), type$.JSArray_int); B.List_1_3 = A._setArrayType(makeConstList([1, 3]), type$.JSArray_int); B.List_2 = A._setArrayType(makeConstList([2]), type$.JSArray_int); @@ -62222,8 +66105,10 @@ B.List_3 = A._setArrayType(makeConstList([3]), type$.JSArray_int); B.List_32 = A._setArrayType(makeConstList([32]), type$.JSArray_int); B.List_35 = A._setArrayType(makeConstList([35]), type$.JSArray_int); + B.List_3_1 = A._setArrayType(makeConstList([3, 1]), type$.JSArray_int); B.List_4 = A._setArrayType(makeConstList([4]), type$.JSArray_int); B.List_42A = A._setArrayType(makeConstList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431]), type$.JSArray_int); + B.List_43h = A._setArrayType(makeConstList([B.CellType_Ordinary_m1, B.CellType_PrunedBranch_1, B.CellType_Library_2, B.CellType_MerkleProof_3, B.CellType_MerkleUpdate_4]), A.findType("JSArray")); B.List_46_47 = A._setArrayType(makeConstList([46, 47]), type$.JSArray_int); B.List_4AN = A._setArrayType(makeConstList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]), type$.JSArray_int); B.List_4_147 = A._setArrayType(makeConstList([4, 147]), type$.JSArray_int); @@ -62236,6 +66121,7 @@ B.List_60_3 = A._setArrayType(makeConstList([60, 3]), type$.JSArray_int); B.List_65 = A._setArrayType(makeConstList([65]), type$.JSArray_int); B.List_6yO = A._setArrayType(makeConstList([B.ADANetwork_1_764824073_mainnet, B.ADANetwork_0_1097911063_testnet, B.ADANetwork_0_2_testnetPreview, B.ADANetwork_0_1_testnetPreprod]), A.findType("JSArray")); + B.List_7xV = A._setArrayType(makeConstList([B.JSEventType_accountsChanged, B.JSEventType_chainChanged, B.JSEventType_message, B.JSEventType_connect, B.JSEventType_disconnect, B.JSEventType_active, B.JSEventType_disable]), A.findType("JSArray")); B.List_80_1_1 = A._setArrayType(makeConstList([80, 1, 1]), type$.JSArray_int); B.List_80_1_2 = A._setArrayType(makeConstList([80, 1, 2]), type$.JSArray_int); B.List_80_1_3 = A._setArrayType(makeConstList([80, 1, 3]), type$.JSArray_int); @@ -62245,7 +66131,16 @@ B.List_80_1_7 = A._setArrayType(makeConstList([80, 1, 7]), type$.JSArray_int); B.List_80_1_8 = A._setArrayType(makeConstList([80, 1, 8]), type$.JSArray_int); B.List_80_1_9 = A._setArrayType(makeConstList([80, 1, 9]), type$.JSArray_int); - B.List_86y = A._setArrayType(makeConstList([B.EthereumEventTypes_List_100_accountsChanged, B.EthereumEventTypes_List_101_chainChanged, B.EthereumEventTypes_List_102_message, B.EthereumEventTypes_List_103_connect, B.EthereumEventTypes_List_104_disconnect, B.EthereumEventTypes_List_105_active, B.EthereumEventTypes_List_106_disable]), A.findType("JSArray")); + B.WalletVersion_v1R1_1 = new A.WalletVersion("v1R1", 1); + B.WalletVersion_v1R2_1 = new A.WalletVersion("v1R2", 1); + B.WalletVersion_v1R3_1 = new A.WalletVersion("v1R3", 1); + B.WalletVersion_v2R1_2 = new A.WalletVersion("v2R1", 2); + B.WalletVersion_v2R2_2 = new A.WalletVersion("v2R2", 2); + B.WalletVersion_v3R1_3 = new A.WalletVersion("v3R1", 3); + B.WalletVersion_v3R2_3 = new A.WalletVersion("v3R2", 3); + B.WalletVersion_v4_4 = new A.WalletVersion("v4", 4); + B.WalletVersion_v5R1_5 = new A.WalletVersion("v5R1", 5); + B.List_86y = A._setArrayType(makeConstList([B.WalletVersion_v1R1_1, B.WalletVersion_v1R2_1, B.WalletVersion_v1R3_1, B.WalletVersion_v2R1_2, B.WalletVersion_v2R2_2, B.WalletVersion_v3R1_3, B.WalletVersion_v3R2_3, B.WalletVersion_v4_4, B.WalletVersion_v5R1_5]), A.findType("JSArray")); B.List_8cU = A._setArrayType(makeConstList([0, 0, 2147483648, 2147483648, 0, 0, 2147483648, 2147483648, 0, 0, 0, 0, 0, 2147483648, 2147483648, 2147483648, 2147483648, 2147483648, 0, 2147483648, 2147483648, 2147483648, 0, 2147483648]), type$.JSArray_dynamic); B.List_90_0 = A._setArrayType(makeConstList([90, 0]), type$.JSArray_int); B.List_90_1 = A._setArrayType(makeConstList([90, 1]), type$.JSArray_int); @@ -62262,17 +66157,6 @@ B.ResourceCode_1_ENERGY = new A.ResourceCode(1, "ENERGY"); B.ResourceCode_2_TRON_POWER = new A.ResourceCode(2, "TRON_POWER"); B.List_B8J = A._setArrayType(makeConstList([B.ResourceCode_0_BANDWIDTH, B.ResourceCode_1_ENERGY, B.ResourceCode_2_TRON_POWER]), A.findType("JSArray")); - B.TronEventTypes_List_110_accountsChanged = new A.TronEventTypes(B.List_110, "accountsChanged"); - B.TronEventTypes_List_111_chainChanged = new A.TronEventTypes(B.List_111, "chainChanged"); - B.TronEventTypes_List_112_message = new A.TronEventTypes(B.List_112, "message"); - B.TronEventTypes_List_113_connect = new A.TronEventTypes(B.List_113, "connect"); - B.List_114 = A._setArrayType(makeConstList([114]), type$.JSArray_int); - B.TronEventTypes_List_114_disconnect = new A.TronEventTypes(B.List_114, "disconnect"); - B.List_115 = A._setArrayType(makeConstList([115]), type$.JSArray_int); - B.TronEventTypes_List_115_active = new A.TronEventTypes(B.List_115, "active"); - B.List_116 = A._setArrayType(makeConstList([116]), type$.JSArray_int); - B.TronEventTypes_List_116_disable = new A.TronEventTypes(B.List_116, "disable"); - B.List_C8a = A._setArrayType(makeConstList([B.TronEventTypes_List_110_accountsChanged, B.TronEventTypes_List_111_chainChanged, B.TronEventTypes_List_112_message, B.TronEventTypes_List_113_connect, B.TronEventTypes_List_114_disconnect, B.TronEventTypes_List_115_active, B.TronEventTypes_List_116_disable]), A.findType("JSArray")); B.List_100_11 = A._setArrayType(makeConstList([100, 11]), type$.JSArray_int); B.Web3MessageTypes_List_100_11_chains = new A.Web3MessageTypes(B.List_100_11, "chains"); B.Web3MessageTypes_List_100_12_walletRequest = new A.Web3MessageTypes(B.List_100_12, "walletRequest"); @@ -62290,14 +66174,26 @@ B.SolanaWeb3TransactionResponseType_1 = new A.SolanaWeb3TransactionResponseType("sign"); B.SolanaWeb3TransactionResponseType_2 = new A.SolanaWeb3TransactionResponseType("error"); B.List_GhS = A._setArrayType(makeConstList([B.SolanaWeb3TransactionResponseType_0, B.SolanaWeb3TransactionResponseType_1, B.SolanaWeb3TransactionResponseType_2]), A.findType("JSArray")); + B.List_JEF = A._setArrayType(makeConstList([B.JSWalletResponseType_success, B.JSWalletResponseType_failed]), A.findType("JSArray")); B.List_M2I = A._setArrayType(makeConstList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_int); + B.TonChain_0_m239 = new A.TonChain(0, -239); + B.TonChain_m1_m3 = new A.TonChain(-1, -3); + B.List_M5Z = A._setArrayType(makeConstList([B.TonChain_0_m239, B.TonChain_m1_m3]), A.findType("JSArray")); B.PermissionType_Owner_0 = new A.PermissionType("Owner", 0); B.PermissionType_Witness_1 = new A.PermissionType("Witness", 1); B.PermissionType_Active_2 = new A.PermissionType("Active", 2); B.List_OLT = A._setArrayType(makeConstList([B.PermissionType_Owner_0, B.PermissionType_Witness_1, B.PermissionType_Active_2]), A.findType("JSArray")); - B.List_Oho = A._setArrayType(makeConstList([B.JSWalletResponseType_List_50_success, B.JSWalletResponseType_List_51_failed]), A.findType("JSArray")); B.List_Option = A._setArrayType(makeConstList(["Option"]), type$.JSArray_String); B.List_R2g = A._setArrayType(makeConstList([B.CosmosNetworkTypes_0, B.CosmosNetworkTypes_1, B.CosmosNetworkTypes_2]), A.findType("JSArray")); + B.List_200_199_0 = A._setArrayType(makeConstList([200, 199, 0]), type$.JSArray_int); + B.TonAccountContextType_6m4 = new A.TonAccountContextType(B.List_200_199_0, "legacy"); + B.List_200_199_1 = A._setArrayType(makeConstList([200, 199, 1]), type$.JSArray_int); + B.TonAccountContextType_BO0 = new A.TonAccountContextType(B.List_200_199_1, "subwallet"); + B.List_200_199_2 = A._setArrayType(makeConstList([200, 199, 2]), type$.JSArray_int); + B.TonAccountContextType_apl = new A.TonAccountContextType(B.List_200_199_2, "v5"); + B.List_200_199_3 = A._setArrayType(makeConstList([200, 199, 3]), type$.JSArray_int); + B.TonAccountContextType_Wv6 = new A.TonAccountContextType(B.List_200_199_3, "v5SubWallet"); + B.List_RUw = A._setArrayType(makeConstList([B.TonAccountContextType_6m4, B.TonAccountContextType_BO0, B.TonAccountContextType_apl, B.TonAccountContextType_Wv6]), A.findType("JSArray")); B.List_Tre = A._setArrayType(makeConstList([B.BipProposal_bip44, B.BipProposal_bip49, B.BipProposal_bip84, B.BipProposal_bip86]), A.findType("JSArray")); B.List_empty1 = A._setArrayType(makeConstList([]), type$.JSArray_String); B.Web3GlobalRequestMethods_0_disconnect_List_empty = new A.Web3GlobalRequestMethods(0, "disconnect", B.List_empty1); @@ -62315,6 +66211,11 @@ B.StorageHasherV11Options_Twox64Concat = new A.StorageHasherV11Options("Twox64Concat"); B.StorageHasherV11Options_Identity = new A.StorageHasherV11Options("Identity"); B.List_WHK = A._setArrayType(makeConstList([B.StorageHasherV11Options_Blake2128, B.StorageHasherV11Options_Blake2256, B.StorageHasherV11Options_Blake2128Concat, B.StorageHasherV11Options_Twox128, B.StorageHasherV11Options_Twox256, B.StorageHasherV11Options_Twox64Concat, B.StorageHasherV11Options_Identity]), A.findType("JSArray")); + B.List_170 = A._setArrayType(makeConstList([170]), type$.JSArray_int); + B.PageMessageType_request = new A.PageMessageType("request"); + B.List_171 = A._setArrayType(makeConstList([171]), type$.JSArray_int); + B.PageMessageType_event = new A.PageMessageType("event"); + B.List_WQM = A._setArrayType(makeConstList([B.PageMessageType_request, B.PageMessageType_event]), A.findType("JSArray")); B.List_YyJ = A._setArrayType(makeConstList([0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117]), type$.JSArray_int); B.StorageEntryModifierV9_Optional = new A.StorageEntryModifierV9("Optional"); B.StorageEntryModifierV9_Default = new A.StorageEntryModifierV9("Default"); @@ -62343,31 +66244,26 @@ B.PrimitiveTypes_I128 = new A.PrimitiveTypes("I128"); B.PrimitiveTypes_I256 = new A.PrimitiveTypes("I256"); B.List_ck7 = A._setArrayType(makeConstList([B.PrimitiveTypes_Bool, B.PrimitiveTypes_Char, B.PrimitiveTypes_Str, B.PrimitiveTypes_U8, B.PrimitiveTypes_U16, B.PrimitiveTypes_U32, B.PrimitiveTypes_U64, B.PrimitiveTypes_U128, B.PrimitiveTypes_U256, B.PrimitiveTypes_I8, B.PrimitiveTypes_I16, B.PrimitiveTypes_I32, B.PrimitiveTypes_I64, B.PrimitiveTypes_I128, B.PrimitiveTypes_I256]), A.findType("JSArray")); - B.List_empty12 = A._setArrayType(makeConstList([]), A.findType("JSArray>")); - B.List_empty3 = A._setArrayType(makeConstList([]), A.findType("JSArray")); - B.List_empty13 = A._setArrayType(makeConstList([]), type$.JSArray_List_BigInt); + B.List_empty16 = A._setArrayType(makeConstList([]), type$.JSArray_Cell); + B.List_empty13 = A._setArrayType(makeConstList([]), A.findType("JSArray>")); + B.List_empty0 = A._setArrayType(makeConstList([]), A.findType("JSArray")); + B.List_empty14 = A._setArrayType(makeConstList([]), type$.JSArray_List_BigInt); B.List_empty = A._setArrayType(makeConstList([]), type$.JSArray_List_int); - B.List_empty0 = A._setArrayType(makeConstList([]), A.findType("JSArray")); + B.List_empty3 = A._setArrayType(makeConstList([]), A.findType("JSArray")); + B.List_empty4 = A._setArrayType(makeConstList([]), A.findType("JSArray")); + B.List_empty15 = A._setArrayType(makeConstList([]), A.findType("JSArray")); B.List_empty2 = A._setArrayType(makeConstList([]), A.findType("JSArray")); B.List_empty8 = A._setArrayType(makeConstList([]), A.findType("JSArray")); B.List_empty7 = A._setArrayType(makeConstList([]), type$.JSArray_Web3EthereumChainAccount); B.List_empty10 = A._setArrayType(makeConstList([]), type$.JSArray_Web3SolanaChainAccount); + B.List_empty11 = A._setArrayType(makeConstList([]), type$.JSArray_Web3TonChainAccount); B.List_empty9 = A._setArrayType(makeConstList([]), type$.JSArray_Web3TronChainAccount); - B.List_empty4 = A._setArrayType(makeConstList([]), type$.JSArray_int); - B.List_empty11 = A._setArrayType(makeConstList([]), A.findType("JSArray<0&>")); - B.List_empty6 = A._setArrayType(makeConstList([]), type$.JSArray_dynamic); + B.List_empty12 = A._setArrayType(makeConstList([]), A.findType("JSArray<0&>")); + B.List_empty17 = A._setArrayType(makeConstList([]), type$.JSArray_dynamic); B.TronChainType_1001_728126428_mainnet = new A.TronChainType(1001, 728126428, "mainnet"); B.TronChainType_1002_2494104990_shasta = new A.TronChainType(1002, 2494104990, "shasta"); B.TronChainType_1003_3448148188_nile = new A.TronChainType(1003, 3448148188, "nile"); B.List_ewF = A._setArrayType(makeConstList([B.TronChainType_1001_728126428_mainnet, B.TronChainType_1002_2494104990_shasta, B.TronChainType_1003_3448148188_nile]), A.findType("JSArray")); - B.SolanaEventTypes_List_100_accountsChanged = new A.SolanaEventTypes(B.List_100, "accountsChanged"); - B.SolanaEventTypes_List_101_chainChanged = new A.SolanaEventTypes(B.List_101, "chainChanged"); - B.SolanaEventTypes_List_112_message = new A.SolanaEventTypes(B.List_112, "message"); - B.SolanaEventTypes_List_113_connect = new A.SolanaEventTypes(B.List_113, "connect"); - B.SolanaEventTypes_List_114_disconnect = new A.SolanaEventTypes(B.List_114, "disconnect"); - B.SolanaEventTypes_List_115_active = new A.SolanaEventTypes(B.List_115, "active"); - B.SolanaEventTypes_List_116_disable = new A.SolanaEventTypes(B.List_116, "disable"); - B.List_fHr = A._setArrayType(makeConstList([B.SolanaEventTypes_List_100_accountsChanged, B.SolanaEventTypes_List_101_chainChanged, B.SolanaEventTypes_List_112_message, B.SolanaEventTypes_List_113_connect, B.SolanaEventTypes_List_114_disconnect, B.SolanaEventTypes_List_115_active, B.SolanaEventTypes_List_116_disable]), A.findType("JSArray")); B.AccountType_1_AssetIssue = new A.AccountType(1, "AssetIssue"); B.AccountType_2_Contract = new A.AccountType(2, "Contract"); B.List_fgL = A._setArrayType(makeConstList([B.AccountType_0_Normal, B.AccountType_1_AssetIssue, B.AccountType_2_Contract]), A.findType("JSArray")); @@ -62379,7 +66275,7 @@ B.WalletEventTypes_4 = new A.WalletEventTypes("ping"); B.WalletEventTypes_5 = new A.WalletEventTypes("popup"); B.WalletEventTypes_6 = new A.WalletEventTypes("windowId"); - B.WalletEventTypes_7 = new A.WalletEventTypes("openExtention"); + B.WalletEventTypes_7 = new A.WalletEventTypes("openExtension"); B.List_hHc = A._setArrayType(makeConstList([B.WalletEventTypes_0, B.WalletEventTypes_1, B.WalletEventTypes_2, B.WalletEventTypes_3, B.WalletEventTypes_4, B.WalletEventTypes_5, B.WalletEventTypes_6, B.WalletEventTypes_7]), A.findType("JSArray")); B.EthereumMethods_net_version = new A.EthereumMethods("net_version"); B.EthereumMethods_eth_signTypedData = new A.EthereumMethods("eth_signTypedData"); @@ -62444,6 +66340,7 @@ B.SeedTypes_ByronLegacySeed_byronLegacySeed = new A.SeedTypes("ByronLegacySeed", "byronLegacySeed"); B.SeedTypes_icarus_icarus = new A.SeedTypes("icarus", "icarus"); B.List_jnD = A._setArrayType(makeConstList([B.SeedTypes_Bip39_bip39, B.SeedTypes_Bip39Entropy_bip39Entropy, B.SeedTypes_ByronLegacySeed_byronLegacySeed, B.SeedTypes_icarus_icarus]), A.findType("JSArray")); + B.List_jyH = A._setArrayType(makeConstList([B.JSClientType_AOw, B.JSClientType_Ethereum_ethereum, B.JSClientType_Tron_tron, B.JSClientType_Solana_solana, B.JSClientType_TON_ton]), A.findType("JSArray")); B.SmartContractAbiEntryType_2jN = new A.SmartContractAbiEntryType(0, ""); B.SmartContractAbiEntryType_1_Constructor = new A.SmartContractAbiEntryType(1, "Constructor"); B.SmartContractAbiEntryType_2_Function = new A.SmartContractAbiEntryType(2, "Function"); @@ -62455,15 +66352,7 @@ B.ProviderAuthType_0 = new A.ProviderAuthType("header"); B.ProviderAuthType_1 = new A.ProviderAuthType("query"); B.List_mF3 = A._setArrayType(makeConstList([B.ProviderAuthType_0, B.ProviderAuthType_1]), A.findType("JSArray")); - B.WalletVersion_v1R1 = new A.WalletVersion("v1R1"); - B.WalletVersion_v1R2 = new A.WalletVersion("v1R2"); - B.WalletVersion_v1R3 = new A.WalletVersion("v1R3"); - B.WalletVersion_v2R1 = new A.WalletVersion("v2R1"); - B.WalletVersion_v2R2 = new A.WalletVersion("v2R2"); - B.WalletVersion_v3R1 = new A.WalletVersion("v3R1"); - B.WalletVersion_v3R2 = new A.WalletVersion("v3R2"); - B.WalletVersion_v4 = new A.WalletVersion("v4"); - B.List_oOy = A._setArrayType(makeConstList([B.WalletVersion_v1R1, B.WalletVersion_v1R2, B.WalletVersion_v1R3, B.WalletVersion_v2R1, B.WalletVersion_v2R2, B.WalletVersion_v3R1, B.WalletVersion_v3R2, B.WalletVersion_v4]), A.findType("JSArray")); + B.List_o5Y = A._setArrayType(makeConstList(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]), type$.JSArray_String); B.SegwitAddresType_P2TR = new A.SegwitAddresType("P2TR"); B.List_oyU = A._setArrayType(makeConstList([B.P2pkhAddressType_P2PKH, B.SegwitAddresType_P2WPKH, B.SegwitAddresType_P2TR, B.SegwitAddresType_P2WSH, B.P2shAddressType_qI5, B.P2shAddressType_SfU, B.P2shAddressType_sc9, B.P2shAddressType_g2q, B.P2shAddressType_hK7, B.P2shAddressType_Q9u, B.P2shAddressType_0, B.P2shAddressType_TLC, B.P2shAddressType_lhG, B.P2shAddressType_CXi, B.P2pkhAddressType_P2PKHWT]), type$.JSArray_BitcoinAddressType); B.List_piR = A._setArrayType(makeConstList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]), type$.JSArray_int); @@ -62484,12 +66373,15 @@ B.Web3EthereumRequestMethods_8_eth_chainId_List_empty = new A.Web3EthereumRequestMethods(8, "eth_chainId", B.List_empty1); B.List_qRH = A._setArrayType(makeConstList([B.Web3EthereumRequestMethods_0_eth_sendTransaction_List_empty, B.Web3EthereumRequestMethods_1_personal_sign_List_empty, B.Web3EthereumRequestMethods_MEg, B.Web3EthereumRequestMethods_7xV, B.Web3EthereumRequestMethods_EuK, B.Web3EthereumRequestMethods_5_eth_requestAccounts_List_empty, B.Web3EthereumRequestMethods_7_eth_accounts_List_empty, B.Web3EthereumRequestMethods_8_eth_chainId_List_empty]), A.findType("JSArray")); B.List_s8b = A._setArrayType(makeConstList([256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256, 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256]), type$.JSArray_int); + B.List_101 = A._setArrayType(makeConstList([101]), type$.JSArray_int); + B.JSWalletMessageType_event = new A.JSWalletMessageType("event"); + B.List_soA = A._setArrayType(makeConstList([B.JSWalletMessageType_response, B.JSWalletMessageType_event]), A.findType("JSArray")); B.List_swi = A._setArrayType(makeConstList([B.BitcoinExplorerProviderType_0, B.BitcoinExplorerProviderType_1]), A.findType("JSArray")); B.ADAByronAddrTypes_2_redemption = new A.ADAByronAddrTypes(2, "redemption"); B.List_ugX = A._setArrayType(makeConstList([B.ADAByronAddrTypes_0_publicKey, B.ADAByronAddrTypes_2_redemption]), A.findType("JSArray")); - B.List_vwZ = A._setArrayType(makeConstList([B.JSWalletMessageType_List_100_response, B.JSWalletMessageType_List_101_event]), A.findType("JSArray")); - B.JSClientType_List_110_global = new A.JSClientType(B.List_110, "global"); - B.List_wjC = A._setArrayType(makeConstList([B.JSClientType_List_110_global, B.JSClientType_List_111_ethereum, B.JSClientType_List_112_tron, B.JSClientType_List_113_solana]), A.findType("JSArray")); + B.TonChainId_O9m = new A.TonChainId("-239", 0, "mainnet"); + B.TonChainId_YOM = new A.TonChainId("-3", -1, "testnet"); + B.List_wQu = A._setArrayType(makeConstList([B.TonChainId_O9m, B.TonChainId_YOM]), A.findType("JSArray")); B.List_34 = A._setArrayType(makeConstList([34]), type$.JSArray_int); B.CborBase64Types_List_34 = new A.CborBase64Types(B.List_34); B.List_33 = A._setArrayType(makeConstList([33]), type$.JSArray_int); @@ -62569,6 +66461,10 @@ B.List_96 = A._setArrayType(makeConstList([96]), type$.JSArray_int); B.List_97 = A._setArrayType(makeConstList([97]), type$.JSArray_int); B.List_99 = A._setArrayType(makeConstList([99]), type$.JSArray_int); + B.List_103 = A._setArrayType(makeConstList([103]), type$.JSArray_int); + B.List_104 = A._setArrayType(makeConstList([104]), type$.JSArray_int); + B.List_105 = A._setArrayType(makeConstList([105]), type$.JSArray_int); + B.List_106 = A._setArrayType(makeConstList([106]), type$.JSArray_int); B.List_107 = A._setArrayType(makeConstList([107]), type$.JSArray_int); B.List_108 = A._setArrayType(makeConstList([108]), type$.JSArray_int); B.List_117 = A._setArrayType(makeConstList([117]), type$.JSArray_int); @@ -62581,7 +66477,6 @@ B.List_124 = A._setArrayType(makeConstList([124]), type$.JSArray_int); B.List_125 = A._setArrayType(makeConstList([125]), type$.JSArray_int); B.List_109 = A._setArrayType(makeConstList([109]), type$.JSArray_int); - B.List_130 = A._setArrayType(makeConstList([130]), type$.JSArray_int); B.List_135 = A._setArrayType(makeConstList([135]), type$.JSArray_int); B.List_136 = A._setArrayType(makeConstList([136]), type$.JSArray_int); B.List_139 = A._setArrayType(makeConstList([139]), type$.JSArray_int); @@ -62591,7 +66486,6 @@ B.List_146 = A._setArrayType(makeConstList([146]), type$.JSArray_int); B.List_147 = A._setArrayType(makeConstList([147]), type$.JSArray_int); B.List_148 = A._setArrayType(makeConstList([148]), type$.JSArray_int); - B.List_154 = A._setArrayType(makeConstList([154]), type$.JSArray_int); B.List_155 = A._setArrayType(makeConstList([155]), type$.JSArray_int); B.List_156 = A._setArrayType(makeConstList([156]), type$.JSArray_int); B.List_157 = A._setArrayType(makeConstList([157]), type$.JSArray_int); @@ -62606,15 +66500,13 @@ B.List_167 = A._setArrayType(makeConstList([167]), type$.JSArray_int); B.List_168 = A._setArrayType(makeConstList([168]), type$.JSArray_int); B.List_169 = A._setArrayType(makeConstList([169]), type$.JSArray_int); - B.List_170 = A._setArrayType(makeConstList([170]), type$.JSArray_int); - B.List_171 = A._setArrayType(makeConstList([171]), type$.JSArray_int); B.List_172 = A._setArrayType(makeConstList([172]), type$.JSArray_int); B.List_173 = A._setArrayType(makeConstList([173]), type$.JSArray_int); B.List_174 = A._setArrayType(makeConstList([174]), type$.JSArray_int); B.List_175 = A._setArrayType(makeConstList([175]), type$.JSArray_int); B.List_177 = A._setArrayType(makeConstList([177]), type$.JSArray_int); B.List_178 = A._setArrayType(makeConstList([178]), type$.JSArray_int); - B.Map_8ICny = new A.ConstantStringMap(B.Object_0dL, [B.List_0, B.List_0, B.List_76, B.List_77, B.List_78, B.List_79, B.List_81, B.List_81, B.List_82, B.List_83, B.List_84, B.List_85, B.List_86, B.List_87, B.List_88, B.List_89, B.List_90, B.List_91, B.List_92, B.List_93, B.List_94, B.List_95, B.List_96, B.List_97, B.List_99, B.List_100, B.List_103, B.List_104, B.List_105, B.List_106, B.List_107, B.List_108, B.List_115, B.List_116, B.List_117, B.List_118, B.List_119, B.List_120, B.List_121, B.List_122, B.List_123, B.List_124, B.List_125, B.List_109, B.List_110, B.List_111, B.List_112, B.List_113, B.List_114, B.List_130, B.List_135, B.List_136, B.List_139, B.List_140, B.List_143, B.List_144, B.List_145, B.List_146, B.List_147, B.List_148, B.List_154, B.List_155, B.List_156, B.List_157, B.List_158, B.List_159, B.List_160, B.List_161, B.List_162, B.List_163, B.List_164, B.List_165, B.List_166, B.List_167, B.List_168, B.List_169, B.List_170, B.List_171, B.List_172, B.List_173, B.List_174, B.List_175, B.List_177, B.List_177, B.List_178, B.List_178], A.findType("ConstantStringMap>")); + B.Map_8ICny = new A.ConstantStringMap(B.Object_0dL, [B.List_00, B.List_00, B.List_76, B.List_77, B.List_78, B.List_79, B.List_81, B.List_81, B.List_82, B.List_83, B.List_84, B.List_85, B.List_86, B.List_87, B.List_88, B.List_89, B.List_90, B.List_91, B.List_92, B.List_93, B.List_94, B.List_95, B.List_96, B.List_97, B.List_99, B.List_100, B.List_103, B.List_104, B.List_105, B.List_106, B.List_107, B.List_108, B.List_115, B.List_116, B.List_117, B.List_118, B.List_119, B.List_120, B.List_121, B.List_122, B.List_123, B.List_124, B.List_125, B.List_109, B.List_110, B.List_111, B.List_112, B.List_113, B.List_114, B.List_130, B.List_135, B.List_136, B.List_139, B.List_140, B.List_143, B.List_144, B.List_145, B.List_146, B.List_147, B.List_148, B.List_154, B.List_155, B.List_156, B.List_157, B.List_158, B.List_159, B.List_160, B.List_161, B.List_162, B.List_163, B.List_164, B.List_165, B.List_166, B.List_167, B.List_168, B.List_169, B.List_170, B.List_171, B.List_172, B.List_173, B.List_174, B.List_175, B.List_177, B.List_177, B.List_178, B.List_178], A.findType("ConstantStringMap>")); B.Object_empty = {}; B.Map_empty = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap")); B.Map_empty0 = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap")); @@ -62676,6 +66568,8 @@ B.StringEncoding_1 = new A.StringEncoding("utf8"); B.StringEncoding_2 = new A.StringEncoding("base64"); B.StringEncoding_3 = new A.StringEncoding("base64UrlSafe"); + B.TonContractException_8TW = new A.TonContractException("SubWalletVersionedWalletState only accept version 3 and 4", null); + B.TonContractException_V43 = new A.TonContractException("Invalid workchain.", null); B.TronHTTPMethods_36D = new A.TronHTTPMethods("wallet/getblockbynum"); B.TronHTTPMethods_n3O = new A.TronHTTPMethods("wallet/getaccount"); B.TronPluginException_B6W = new A.TronPluginException("SmartContractAbiEntryType was not found.", null); @@ -62717,23 +66611,30 @@ B.Web3RequestException_23B = new A.Web3RequestException("The requested method does not supported.", 4200, "WEB3-4030", null); B.Web3RequestException_ACQ = new A.Web3RequestException("The provided RPC link returned a different chain ID. Please ensure the RPC URL matches the expected chain ID.", -32600, "WEB3-5090", null); B.Web3RequestException_CeF = new A.Web3RequestException("The requested method and/or account has not been authorized by the user.", 4100, "WEB3-4010", "The Web3 application does not have the required permissions. Please send a permission request first."); - B.Web3RequestException_FaD = new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0010", "Invalid RPC URL: RPC URLs must be valid and use HTTP, HTTPS, WS, or WSS schemes. Please check the URL and try again."); + B.Web3RequestException_FaD = new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0010", "Invalid RPC URL: RPC URLs must be valid and use HTTP, HTTPS, WS, or WSS schemes. Please check the URL and try again."); B.Web3RequestException_IAR = new A.Web3RequestException("The wallet does not support the selected network.", -32600, "WALLET-1000", null); - B.Web3RequestException_KYl = new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-0100", "RPC connection failed. RPC connection failed. Please ensure the RPC URL is correct and the RPC server is available."); + B.Web3RequestException_KYl = new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-0100", "RPC connection failed. RPC connection failed. Please ensure the RPC URL is correct and the RPC server is available."); B.Web3RequestException_LzG = new A.Web3RequestException("Invalid host: Ensure that the request comes from a valid host and try again.", -1, "WEB3-4020", null); B.Web3RequestException_NOa = new A.Web3RequestException("The request is not a valid Request object.", -32000, "WALLET-4050", null); - B.Web3RequestException_Tng = new A.Web3RequestException("Invalid method parameters\t", -32600, "WEB3-5080", "The specified Ethereum network does not exist. Please use 'wallet_addEthereumChain' to add the network before proceeding."); + B.Web3RequestException_Tng = new A.Web3RequestException("Invalid method parameters.", -32600, "WEB3-5080", "The specified Ethereum network does not exist. Please use 'wallet_addEthereumChain' to add the network before proceeding."); B.Web3RequestException_chs = new A.Web3RequestException("An error occurred during the request", -32603, "WALLET-000", null); - B.Web3RequestException_gc6 = new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-5070", "Invalid typedData parameter: the provided typedData is not valid. Please check the data and try again."); + B.Web3RequestException_gc6 = new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-5070", "Invalid typedData parameter: the provided typedData is not valid. Please check the data and try again."); B.Web3RequestException_imj = new A.Web3RequestException("The requested method does not exist. Please check the method name and try again.", 4200, "WEB3-4030", null); + B.Web3RequestException_qx4 = new A.Web3RequestException("The user rejected the request.", 4001, "WALLET-3000", null); B.Web3RequestException_ww8 = new A.Web3RequestException("The Provider is not connected to the requested chain.", 4901, "WEB3-6000", null); - B.Web3RequestException_yST = new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-5060", "To use EIP-1559 gas metrics, you must fill both maxFeePerGas and maxPriorityFeePerGas fields."); - B.Web3RequestException_yrN = new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-5050", "You cannot use both legacy and EIP-1559 gas parameters simultaneously."); - B.Web3RequestException_yre = new A.Web3RequestException("Invalid method parameters\t", -32602, "WEB3-5040", "Invalid Ethereum decimal. The decimal value must be exactly 18."); + B.Web3RequestException_yST = new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-5060", "To use EIP-1559 gas metrics, you must fill both maxFeePerGas and maxPriorityFeePerGas fields."); + B.Web3RequestException_yrN = new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-5050", "You cannot use both legacy and EIP-1559 gas parameters simultaneously."); + B.Web3RequestException_yre = new A.Web3RequestException("Invalid method parameters.", -32602, "WEB3-5040", "Invalid Ethereum decimal. The decimal value must be exactly 18."); B.Web3SolanaRequestMethods_102_solana_signMessage_List_empty = new A.Web3SolanaRequestMethods(102, "solana_signMessage", B.List_empty1); B.Web3SolanaRequestMethods_6YB = new A.Web3SolanaRequestMethods(101, "solana_signTransaction", B.List_empty1); B.List_eth_requestAccounts = A._setArrayType(makeConstList(["eth_requestAccounts"]), type$.JSArray_String); B.Web3SolanaRequestMethods_A0N = new A.Web3SolanaRequestMethods(100, "solana_requestAccounts", B.List_eth_requestAccounts); + B.Web3SolanaRequestMethods_a3R = new A.Web3SolanaRequestMethods(105, "solana_sendAllTransactions", B.List_empty1); + B.Web3SolanaRequestMethods_mJH = new A.Web3SolanaRequestMethods(104, "solana_sendTransaction", B.List_empty1); + B.Web3SolanaRequestMethods_upD = new A.Web3SolanaRequestMethods(103, "solana_signAllTransactions", B.List_empty1); + B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty = new A.Web3TonRequestMethods(100, "ton_requestAccounts", B.List_empty1); + B.Web3TonRequestMethods_102_ton_signMessage_List_empty = new A.Web3TonRequestMethods(102, "ton_signMessage", B.List_empty1); + B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty = new A.Web3TonRequestMethods(103, "ton_sendTransaction", B.List_empty1); B.Web3TronRequestMethods_102_tron_signMessageV2_List_empty = new A.Web3TronRequestMethods(102, "tron_signMessageV2", B.List_empty1); B.Web3TronRequestMethods_MMc = new A.Web3TronRequestMethods(101, "tron_signTransaction", B.List_empty1); B.Web3TronRequestMethods_nIp = new A.Web3TronRequestMethods(100, "tron_requestAccounts", B.List_eth_requestAccounts); @@ -62771,10 +66672,13 @@ return A._setArrayType([A._setArrayType([0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30], t1), A._setArrayType([28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6], t1), A._setArrayType([22, 16, 24, 0, 10, 4, 30, 26, 20, 28, 6, 12, 14, 2, 18, 8], t1), A._setArrayType([14, 18, 6, 2, 26, 24, 22, 28, 4, 12, 10, 20, 8, 0, 30, 16], t1), A._setArrayType([18, 0, 10, 14, 4, 8, 20, 30, 28, 2, 22, 24, 12, 16, 6, 26], t1), A._setArrayType([4, 24, 12, 20, 0, 22, 16, 6, 8, 26, 14, 10, 30, 28, 2, 18], t1), A._setArrayType([24, 10, 2, 30, 28, 26, 8, 20, 0, 14, 12, 6, 18, 4, 16, 22], t1), A._setArrayType([26, 22, 14, 28, 24, 2, 6, 18, 10, 0, 30, 8, 16, 12, 4, 20], t1), A._setArrayType([12, 30, 28, 18, 22, 6, 0, 16, 24, 4, 26, 14, 2, 8, 20, 10], t1), A._setArrayType([20, 4, 16, 8, 14, 12, 2, 10, 30, 22, 18, 28, 6, 24, 26, 0], t1), A._setArrayType([0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30], t1), A._setArrayType([28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6], t1)], type$.JSArray_List_int); }(); $.QuickCrypto__randomGenerator = null; - $.Web3SolanaRequestMethods_values = A._setArrayType([B.Web3SolanaRequestMethods_A0N, B.Web3SolanaRequestMethods_6YB, B.Web3SolanaRequestMethods_102_solana_signMessage_List_empty], A.findType("JSArray")); + $.Web3SolanaRequestMethods_values = A._setArrayType([B.Web3SolanaRequestMethods_A0N, B.Web3SolanaRequestMethods_6YB, B.Web3SolanaRequestMethods_upD, B.Web3SolanaRequestMethods_mJH, B.Web3SolanaRequestMethods_a3R, B.Web3SolanaRequestMethods_102_solana_signMessage_List_empty], A.findType("JSArray")); + $.Web3TonRequestMethods_values = A._setArrayType([B.Web3TonRequestMethods_100_ton_requestAccounts_List_empty, B.Web3TonRequestMethods_102_ton_signMessage_List_empty, B.Web3TonRequestMethods_103_ton_sendTransaction_List_empty], A.findType("JSArray")); $.Web3TronRequestMethods_values = A._setArrayType([B.Web3TronRequestMethods_nIp, B.Web3TronRequestMethods_MMc, B.Web3TronRequestMethods_102_tron_signMessageV2_List_empty], A.findType("JSArray")); $._currentUriBase = null; $._current = null; + $.PageNetworkController____walletId = A._Cell$named("_walletId"); + $.PageNetworkController__waitingRequest = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, A.findType("PageRequestCompeleter")); })(); (function lazyInitializers() { var _lazyFinal = hunkHelpers.lazyFinal, @@ -62897,7 +66801,7 @@ _lazyFinal($, "Bip44Conf_binanceSmartChain", "$get$Bip44Conf_binanceSmartChain", () => A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic), new A.Bip44Conf_binanceSmartChain_closure(), 60, B.CoinNames_Due, "0'/0/0", false, $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), B.EllipticCurveTypes_secp256k1, null)); _lazyFinal($, "Bip44Conf_bitcoinMainNet", "$get$Bip44Conf_bitcoinMainNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerMain(); - return A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0], type$.String, type$.dynamic), new A.Bip44Conf_bitcoinMainNet_closure(), 0, B.CoinNames_Bitcoin, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); + return A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00], type$.String, type$.dynamic), new A.Bip44Conf_bitcoinMainNet_closure(), 0, B.CoinNames_Bitcoin, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); }); _lazyFinal($, "Bip44Conf_bitcoinTestNet", "$get$Bip44Conf_bitcoinTestNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerTest(); @@ -62906,26 +66810,26 @@ _lazyFinal($, "Bip44Conf_bitcoinCashMainNet", "$get$Bip44Conf_bitcoinCashMainNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), t2 = type$.String; - return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "hrp", "bitcoincash"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashMainNet_closure(), 145, B.CoinNames_CDm, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); + return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "hrp", "bitcoincash"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashMainNet_closure(), 145, B.CoinNames_CDm, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); }); _lazyFinal($, "Bip44Conf_bitcoinCashTestNet", "$get$Bip44Conf_bitcoinCashTestNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerTest(), t2 = type$.String; - return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "hrp", "bchtest"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_111], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashTestNet_closure(), 1, B.CoinNames_Iot, "0'/0/0", true, t1, B.EllipticCurveTypes_secp256k1, B.List_239); + return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "hrp", "bchtest"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_111], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashTestNet_closure(), 1, B.CoinNames_Iot, "0'/0/0", true, t1, B.EllipticCurveTypes_secp256k1, B.List_239); }); _lazyFinal($, "Bip44Conf_bitcoinCashSlpMainNet", "$get$Bip44Conf_bitcoinCashSlpMainNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), t2 = type$.String; - return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "hrp", "simpleledger"], t2, type$.nullable_Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashSlpMainNet_closure(), 145, B.CoinNames_rCZ, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); + return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "hrp", "simpleledger"], t2, type$.nullable_Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashSlpMainNet_closure(), 145, B.CoinNames_rCZ, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); }); _lazyFinal($, "Bip44Conf_bitcoinCashSlpTestNet", "$get$Bip44Conf_bitcoinCashSlpTestNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerTest(), t2 = type$.String; - return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "hrp", "slptest"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_111], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashSlpTestNet_closure(), 1, B.CoinNames_FCG, "0'/0/0", true, t1, B.EllipticCurveTypes_secp256k1, B.List_239); + return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "hrp", "slptest"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_111], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_bitcoinCashSlpTestNet_closure(), 1, B.CoinNames_FCG, "0'/0/0", true, t1, B.EllipticCurveTypes_secp256k1, B.List_239); }); _lazyFinal($, "Bip44Conf_bitcoinSvMainNet", "$get$Bip44Conf_bitcoinSvMainNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerMain(); - return A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0], type$.String, type$.dynamic), new A.Bip44Conf_bitcoinSvMainNet_closure(), 236, B.CoinNames_BitcoinSV, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); + return A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00], type$.String, type$.dynamic), new A.Bip44Conf_bitcoinSvMainNet_closure(), 236, B.CoinNames_BitcoinSV, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); }); _lazyFinal($, "Bip44Conf_bitcoinSvTestNet", "$get$Bip44Conf_bitcoinSvTestNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerTest(); @@ -63003,12 +66907,12 @@ _lazyFinal($, "Bip44Conf_ecashMainNet", "$get$Bip44Conf_ecashMainNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), t2 = type$.String; - return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "hrp", "ecash"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_ecashMainNet_closure(), 145, B.CoinNames_eCash, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); + return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "hrp", "ecash"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_ecashMainNet_closure(), 145, B.CoinNames_eCash, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_128); }); _lazyFinal($, "Bip44Conf_ecashTestNet", "$get$Bip44Conf_ecashTestNet", () => { var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerTest(), t2 = type$.String; - return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_0, "hrp", "ectest"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_111], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_ecashTestNet_closure(), 1, B.CoinNames_HZw, "0'/0/0", true, t1, B.EllipticCurveTypes_secp256k1, B.List_239); + return A.BipBitcoinCashConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_00, "hrp", "ectest"], t2, type$.Object), "legacy", A.LinkedHashMap_LinkedHashMap$_literal(["net_ver", B.List_111], t2, type$.List_int)], t2, type$.dynamic), new A.Bip44Conf_ecashTestNet_closure(), 1, B.CoinNames_HZw, "0'/0/0", true, t1, B.EllipticCurveTypes_secp256k1, B.List_239); }); _lazyFinal($, "Bip44Conf_elrond", "$get$Bip44Conf_elrond", () => A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic), new A.Bip44Conf_elrond_closure(), 508, B.CoinNames_qxe, "0'/0'/0'", false, $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), B.EllipticCurveTypes_ed25519, null)); _lazyFinal($, "Bip44Conf_eos", "$get$Bip44Conf_eos", () => A.BipCoinConfig$(A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic), new A.Bip44Conf_eos_closure(), 194, B.CoinNames_EOS, "0'/0/0", false, $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), B.EllipticCurveTypes_secp256k1, null)); @@ -63051,7 +66955,7 @@ var t1 = $.$get$Bip44Conf_bip44BtcKeyNetVerMain(), t2 = type$.int; t2 = A.Bip32KeyNetVersions$(A.List_List$from([1, 157, 164, 98], true, t2), A.List_List$from([1, 157, 156, 254], true, t2)); - return A.BipLitecoinConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std_net_ver", B.List_48, "depr_net_ver", B.List_0], type$.String, type$.dynamic), new A.Bip44Conf_litecoinMainNet_closure(), t2, 2, B.CoinNames_Litecoin, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_176); + return A.BipLitecoinConf$(A.LinkedHashMap_LinkedHashMap$_literal(["std_net_ver", B.List_48, "depr_net_ver", B.List_00], type$.String, type$.dynamic), new A.Bip44Conf_litecoinMainNet_closure(), t2, 2, B.CoinNames_Litecoin, "0'/0/0", false, t1, B.EllipticCurveTypes_secp256k1, B.List_176); }); _lazyFinal($, "Bip44Conf_litecoinTestNet", "$get$Bip44Conf_litecoinTestNet", () => { var t1 = type$.int, @@ -63419,7 +67323,7 @@ _lazyFinal($, "_hi", "$get$_hi", () => A.List_List$unmodifiable(B.List_8cU, type$.int)); _lazyFinal($, "_lo", "$get$_lo", () => A.List_List$unmodifiable(B.List_2bH, type$.int)); _lazy($, "QuickCrypto__generateRandom", "$get$QuickCrypto__generateRandom", () => new A.QuickCrypto__generateRandom_closure()); - _lazyFinal($, "CompactBytes__lengthCodec", "$get$CompactBytes__lengthCodec", () => A.CompactIntLayout$(A.IntegerLayout$(6, B.C_Endian0, null, false), null)); + _lazyFinal($, "CompactBytes__lengthCodec", "$get$CompactBytes__lengthCodec", () => A.CompactIntLayout$(A.IntegerLayout$(6, B.C_Endian, null, false), null)); _lazyFinal($, "_Ss58Const_checksumPrefix", "$get$_Ss58Const_checksumPrefix", () => A.List_List$unmodifiable(A._setArrayType([83, 83, 53, 56, 80, 82, 69], type$.JSArray_int), type$.int)); _lazyFinal($, "maxU64", "$get$maxU64", () => A._BigIntImpl_parse("18446744073709551615", null)); _lazyFinal($, "BigRational_ten", "$get$BigRational_ten", () => { @@ -63474,6 +67378,7 @@ _lazy($, "RetionalConst_bigR18", "$get$RetionalConst_bigR18", () => A.BigRational_BigRational(A._BigIntImpl__BigIntImpl$from(10).pow$1(18), null)); _lazy($, "RetionalConst_bigR6", "$get$RetionalConst_bigR6", () => A.BigRational_BigRational(A._BigIntImpl__BigIntImpl$from(10).pow$1(6), null)); _lazyFinal($, "WalletExceptionConst_dataVerificationFailed", "$get$WalletExceptionConst_dataVerificationFailed", () => A.WalletException$("data_verification_failed")); + _lazyFinal($, "WalletExceptionConst_invalidRequest", "$get$WalletExceptionConst_invalidRequest", () => A.WalletException$("invalid_request")); _lazyFinal($, "WalletExceptionConst_invalidSerializationData", "$get$WalletExceptionConst_invalidSerializationData", () => A.WalletException$("invalid_serialization_data")); _lazyFinal($, "WalletExceptionConst_invalidAccountDetails", "$get$WalletExceptionConst_invalidAccountDetails", () => A.WalletException$("invalid_account_details")); _lazyFinal($, "WalletExceptionConst_invalidBitcoinAddressType", "$get$WalletExceptionConst_invalidBitcoinAddressType", () => A.WalletException$("invalid_bitcoin_address_type")); @@ -63755,6 +67660,8 @@ _lazyFinal($, "Style_platform", "$get$Style_platform", () => A.Style__getPlatformStyle()); _lazyFinal($, "PlatformInterface__instanceTokens", "$get$PlatformInterface__instanceTokens", () => new A.Expando(new WeakMap(), A.findType("Expando"))); _lazyFinal($, "TonAddress__decoder", "$get$TonAddress__decoder", () => new A.TonAddrDecoder()); + _lazyFinal($, "_BitBuilderUtils_mask8Big", "$get$_BitBuilderUtils_mask8Big", () => A._BigIntImpl__BigIntImpl$from(255)); + _lazy($, "SimpleLibraryCodecs_codec", "$get$SimpleLibraryCodecs_codec", () => new A.DictionaryValue(new A.SimpleLibraryCodecs_codec_closure(), A.findType("DictionaryValue"))); _lazyFinal($, "TonApiUtils__pathParamRegex", "$get$TonApiUtils__pathParamRegex", () => A.RegExp_RegExp("\\{([^}]+)\\}", true)); _lazyFinal($, "EIP6963ProviderInfo_providerInfo", "$get$EIP6963ProviderInfo_providerInfo", () => ({uuid: "466aef37-e077-42d1-b26b-801ff1af4a36", name: "MRT", icon: "data:image/png;base64,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", rdns: "com.mrtnetwork.wallet"})); })(); @@ -63812,12 +67719,12 @@ Function.prototype.call$1$0 = function() { return this(); }; - Function.prototype.call$2$1 = function(a) { - return this(a); - }; Function.prototype.call$2$0 = function() { return this(); }; + Function.prototype.call$2$1 = function(a) { + return this(a); + }; Function.prototype.call$1$2 = function(a, b) { return this(a, b); }; diff --git a/mrt_wallet/extentions/bn.js b/mrt_wallet/extensions/bn.js similarity index 100% rename from mrt_wallet/extentions/bn.js rename to mrt_wallet/extensions/bn.js diff --git a/mrt_wallet/extentions/chrome_manifest.json b/mrt_wallet/extensions/chrome_manifest.json similarity index 100% rename from mrt_wallet/extentions/chrome_manifest.json rename to mrt_wallet/extensions/chrome_manifest.json diff --git a/mrt_wallet/extentions/index.html b/mrt_wallet/extensions/index.html similarity index 100% rename from mrt_wallet/extentions/index.html rename to mrt_wallet/extensions/index.html diff --git a/mrt_wallet/extentions/mozila_manifest.json b/mrt_wallet/extensions/mozila_manifest.json similarity index 100% rename from mrt_wallet/extentions/mozila_manifest.json rename to mrt_wallet/extensions/mozila_manifest.json diff --git a/mrt_wallet/extentions/popup.html b/mrt_wallet/extensions/popup.html similarity index 100% rename from mrt_wallet/extentions/popup.html rename to mrt_wallet/extensions/popup.html diff --git a/mrt_wallet/extentions/tron_web.js b/mrt_wallet/extensions/tron_web.js similarity index 100% rename from mrt_wallet/extentions/tron_web.js rename to mrt_wallet/extensions/tron_web.js diff --git a/mrt_wallet/js/background.dart b/mrt_wallet/js/background.dart index 1c94130e..4a477bea 100644 --- a/mrt_wallet/js/background.dart +++ b/mrt_wallet/js/background.dart @@ -32,15 +32,15 @@ class _Wallet extends WalletCore { @override Future initWallet( - {bool useIsolate = true, String? initialPassword}) async { + {bool useIsolate = false, String? initialPassword}) async { await PlatformInterface.instance.getConfig(); - await super.initWallet(useIsolate: false); + await super.initWallet(useIsolate: useIsolate); } } Future send(JSWalletEvent? event, int? tabId) async { if (event == null || tabId == null) return; - await extention.tabs + await extension.tabs .sendMessage_(tabId: tabId, message: event) .catchError((e) { return null; @@ -48,7 +48,7 @@ Future send(JSWalletEvent? event, int? tabId) async { } Future sendAlive() async { - final tabs = await extention.tabs.query_(); + final tabs = await extension.tabs.query_(); for (final i in tabs) { send(JSWalletConstant.ping.toJsEvent(), i.id); } @@ -65,7 +65,7 @@ Future sendPopupRuntimeMessage(WalletEvent messageToSend) async { if (event?.type != WalletEventTypes.popup) { return false; } - extention.runtime.sendMessage_(message: messageToSend).then((e) { + extension.runtime.sendMessage_(message: messageToSend).then((e) { completer.complete(e); sendResponse.callAsFunction(sendResponse, null); return e; @@ -77,52 +77,55 @@ Future sendPopupRuntimeMessage(WalletEvent messageToSend) async { return true; } - extention.runtime.sendMessage_(message: messageToSend).then((e) { + extension.runtime.sendMessage_(message: messageToSend).then((e) { completer.complete(e); }).catchError((e) { _OnContentListener = onMessage.toJS; - extention.runtime.onMessage.addListener(_OnContentListener); + extension.runtime.onMessage.addListener(_OnContentListener); hasListener = true; return null; }); return await completer.future; } finally { if (hasListener) { - extention.runtime.onMessage.removeListener(_OnContentListener); + extension.runtime.onMessage.removeListener(_OnContentListener); } } } -Future openPopup() async { - final WalletEvent? windowIdResponse = await extention.runtime - .sendMessage_(message: JSWalletConstant.windowIdEvent) - .then((e) => e) - .catchError((e) => null); - if (windowIdResponse != null) { - final int windowId = IntUtils.fromBytes(windowIdResponse.data); - if (windowId > 0) { - await extention.windows.update_(windowId, focused: true); - } - return JSWalletConstant.popEvent; - } - final info = await extention.windows.getCurrent_(populate: true); - final top = info.top! + 50; - final left = info.width! - 175; - await extention.windows.create_( - url: extention.runtime.getURL("index.html"), - type: JSWalletConstant.extentionType, - width: JSWalletConstant.extentionWidth, - height: JSWalletConstant.extentionHeight, - top: top, - focused: true, - left: left, - ); - final result = await sendPopupRuntimeMessage(JSWalletConstant.create); - return result; -} - void main() async { final wallet = _Wallet(); + final lock = SynchronizedLock(); + Future openPopup() async { + return await lock.synchronized(() async { + final WalletEvent? windowIdResponse = await extension.runtime + .sendMessage_(message: JSWalletConstant.windowIdEvent) + .then((e) => e) + .catchError((e) => null); + if (windowIdResponse != null) { + final int windowId = IntUtils.fromBytes(windowIdResponse.data); + if (windowId > 0) { + await extension.windows.update_(windowId, focused: true); + } + return JSWalletConstant.popEvent; + } + final info = await extension.windows.getCurrent_(populate: true); + final top = info.top! + 50; + final left = info.width! - 175; + await extension.windows.create_( + url: extension.runtime.getURL("index.html"), + type: JSWalletConstant.extentionType, + width: JSWalletConstant.extentionWidth, + height: JSWalletConstant.extentionHeight, + top: top, + focused: true, + left: left, + ); + final result = await sendPopupRuntimeMessage(JSWalletConstant.create); + return result; + }); + } + Future tabInformation(ChromeTab tab, WalletEvent event) async { try { if (tab.id == null) { @@ -167,15 +170,15 @@ void main() async { } } - extention.runtime.onInstalled + extension.runtime.onInstalled .addListener((OnInstalledDetails details) {}.toJS); - extention.runtime.onMessage.addListener( + extension.runtime.onMessage.addListener( (JSWalletEvent message, MessageSender sender, JSFunction sendResponse) { final event = message.toEvent(); if (event == null) return false; switch (event.type) { - case WalletEventTypes.openExtention: + case WalletEventTypes.openExtension: openPopup() .then( (e) => sendResponse.callAsFunction(sendResponse, e.toJsEvent())) diff --git a/mrt_wallet/js/content.dart b/mrt_wallet/js/content.dart index 3082f3c6..ed811afc 100644 --- a/mrt_wallet/js/content.dart +++ b/mrt_wallet/js/content.dart @@ -1,3 +1,5 @@ +import 'dart:js_interop'; + import 'package:mrt_native_support/models/events/models/wallet_event.dart'; import 'package:mrt_native_support/web/mrt_native_web.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; @@ -13,31 +15,24 @@ void main() async { if (applicationId == null) { throw Web3RequestExceptionConst.invalidHost; } - final future = - JSExtentionWallet.sendBackgroudMessage(JSWalletConstant.tabIdEvent); - - future.then((backgroundEvent) async { - JSWalletMessageResponse message; - if (backgroundEvent.type == WalletEventTypes.exception) { - final exception = - Web3ExceptionMessage.deserialize(bytes: backgroundEvent.data); - message = JSWalletMessageResponse( - requestId: backgroundEvent.requestId, - data: exception.toJson(), - client: JSClientType.ethereum, - status: JSWalletResponseType.failed); - } else { - message = JSWalletMessageResponse( - requestId: backgroundEvent.requestId, - data: backgroundEvent.clientId, - client: JSClientType.ethereum, - status: JSWalletResponseType.success); - jsWindow.dispatchEvent(CustomEvent.create( - type: JSWalletConstant.activationEventName, - data: message.toCbor().encode(), - clone: true)); - await Future.delayed(const Duration(seconds: 1)); - JSExtentionWallet.initialize(backgroundEvent); - } - }); + final backgroundEvent = + await JSExtentionWallet.sendBackgroudMessage(JSWalletConstant.tabIdEvent); + WalletMessageResponse message; + if (backgroundEvent.type == WalletEventTypes.exception) { + final exception = + Web3ExceptionMessage.deserialize(bytes: backgroundEvent.data); + message = WalletMessageResponse.fail(exception.toJson().jsify()); + } else { + message = WalletMessageResponse.success(backgroundEvent.clientId.jsify()); + } + JSExtentionWallet? wallet; + if (message.statusType == JSWalletResponseType.success) { + wallet = JSExtentionWallet.initialize(backgroundEvent); + } + jsWindow.dispatchEvent(CustomEvent.create( + type: JSWalletConstant.activationEventName, + eventData: WalletMessage.response( + requestId: "0", client: JSClientType.global, data: message), + clone: true)); + wallet?.initClients(); } diff --git a/mrt_wallet/js/js_wallet/constant/constant.dart b/mrt_wallet/js/js_wallet/constant/constant.dart index fc619baa..4e4f8256 100644 --- a/mrt_wallet/js/js_wallet/constant/constant.dart +++ b/mrt_wallet/js/js_wallet/constant/constant.dart @@ -10,7 +10,7 @@ class JSWalletConstant { clientId: "content_script", data: const [], requestId: "0", - type: WalletEventTypes.openExtention); + type: WalletEventTypes.openExtension); static final ping = WalletEvent( clientId: "content_script", data: const [], diff --git a/mrt_wallet/js/js_wallet/models/models/completer.dart b/mrt_wallet/js/js_wallet/models/models/completer.dart index 3de58930..3afa18d2 100644 --- a/mrt_wallet/js/js_wallet/models/models/completer.dart +++ b/mrt_wallet/js/js_wallet/models/models/completer.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'package:blockchain_utils/uuid/uuid.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; -import 'dart:js_interop'; -import 'exception.dart'; import 'requests.dart'; class MessageCompleterHandler { @@ -42,16 +40,10 @@ class PageRequestCompeleter { factory PageRequestCompeleter.nextRequest() { return PageRequestCompeleter._(UUID.generateUUIDv4()); } - final Completer _completer = Completer(); + final Completer _completer = Completer(); - Future get wait => _completer.future; - void completeMessage(JSWalletMessageResponse response) { - switch (response.status) { - case JSWalletResponseType.success: - _completer.complete(response.data.jsify()); - case JSWalletResponseType.failed: - _completer.completeError(JSWalletError.fromJson( - message: response.data as Map)); - } + Future get wait => _completer.future; + void completeMessage(WalletMessageResponse response) { + _completer.complete(response); } } diff --git a/mrt_wallet/js/js_wallet/models/models/exception.dart b/mrt_wallet/js/js_wallet/models/models/exception.dart index 7cf6353a..d9e098c1 100644 --- a/mrt_wallet/js/js_wallet/models/models/exception.dart +++ b/mrt_wallet/js/js_wallet/models/models/exception.dart @@ -4,12 +4,12 @@ import 'package:mrt_wallet/wallet/web3/core/messages/models/models/exception.dar @JS("Error") extension type JSError._(JSAny _) implements JSAny { - external factory JSError(); + external factory JSError({String? message}); external String? get message; } -@JS("JSWalletError") extension type JSWalletError._(JSAny _) implements JSError { + external factory JSWalletError({String? message}); external String? get stack; external set stack(String? info); @JS("toString") diff --git a/mrt_wallet/js/js_wallet/models/models/mrt.dart b/mrt_wallet/js/js_wallet/models/models/mrt.dart index 25e3c92b..6336793d 100644 --- a/mrt_wallet/js/js_wallet/models/models/mrt.dart +++ b/mrt_wallet/js/js_wallet/models/models/mrt.dart @@ -1,7 +1,11 @@ import 'dart:js_interop'; import 'package:mrt_native_support/web/api/core/js.dart'; -import 'networks/ethereum.dart'; +import 'networks.dart'; +import 'requests.dart'; + +@JS("ton") +external set ton(Proxy? ton); @JS("MRT") external MRTWallet? get mrtNull; @@ -37,6 +41,7 @@ extension type MRTWallet(JSObject _) implements MRTJsObject { external JSAny get ethereum2; external EIP1193 get ethereum; + external set tonconnect(TonWalletAdapter tonconnect); @JS("onMrtMessage") external set onMrtMessage(JSFunction? f); @@ -54,13 +59,21 @@ extension type MRTWallet(JSObject _) implements MRTJsObject { } } -@JS() -extension type Web3JSRequestParams._(JSObject o) implements MRTJsObject { - external String? get method; - external String? get id; - external JSAny? get params; - - Map toJson() { - return {"method": method, "params": params == null ? [] : params.dartify()}; - } +extension type MRTNetworkAdapter(JSObject _) implements MRTJsObject { + @JS("sendWalletRequest") + external set sendWalletRequest(JSFunction f); + @JS("sendWalletRequest") + external JSPromise sendWalletRequest_( + Web3JSRequestParams params); + @JS("selectedAddress") + external set selectedAddress(JSString? selectedAddress); + external set on(JSFunction f); + external set removeListener(JSFunction f); + external set cancelListener(JSFunction f); + external set cancelAllListener(JSFunction f); + external set providerInfo(EIP6963ProviderInfo f); + external set disconnect(JSFunction f); + external set enable(JSFunction? f); + external EIP6963ProviderInfo get providerInfo; + external bool get isMRT; } diff --git a/mrt_wallet/js/js_wallet/models/models/networks.dart b/mrt_wallet/js/js_wallet/models/models/networks.dart index 760ceabe..12a65787 100644 --- a/mrt_wallet/js/js_wallet/models/models/networks.dart +++ b/mrt_wallet/js/js_wallet/models/models/networks.dart @@ -1,3 +1,4 @@ export 'networks/ethereum.dart'; export 'networks/solana.dart'; export 'networks/tron.dart'; +export 'networks/ton.dart'; diff --git a/mrt_wallet/js/js_wallet/models/models/networks/ethereum.dart b/mrt_wallet/js/js_wallet/models/models/networks/ethereum.dart index 6b47fb32..a11e9000 100644 --- a/mrt_wallet/js/js_wallet/models/models/networks/ethereum.dart +++ b/mrt_wallet/js/js_wallet/models/models/networks/ethereum.dart @@ -1,10 +1,6 @@ import 'dart:js_interop'; -import 'package:blockchain_utils/cbor/cbor.dart'; -import 'package:blockchain_utils/utils/utils.dart'; -import 'package:mrt_wallet/app/serialization/serialization.dart'; -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/app/utils/numbers/numbers.dart'; -import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_native_support/web/mrt_native_web.dart'; import '../../../constant/constant.dart'; import '../../models.dart'; @@ -40,19 +36,14 @@ extension type Proxy._(JSObject _) implements JSAny { external factory Proxy(JSAny target, JSObject handler); } -@JS("EIP-1193") -extension type EIP1193(JSObject _) implements MRTJsObject { +extension type EIP1193(JSObject _) implements MRTNetworkAdapter { /// The request method is intended as a transport- and protocol-agnostic wrapper function for Remote Procedure Calls (RPCs). external set request(JSFunction f); @JS("request") external JSPromise requestPromis(EthereumRequestParams params); external set on(JSFunction f); external set removeListener(JSFunction f); - external set providerInfo(EIP6963ProviderInfo f); external set disconnect(JSFunction f); - external EIP6963ProviderInfo get providerInfo; - external set enable(JSFunction f); - external bool get isMetaMask; @JS("chainId") external set chainId(String? chainId); @@ -72,16 +63,20 @@ extension type EIP1193(JSObject _) implements MRTJsObject { required JSFunction on, required JSFunction removeListener, required JSFunction disconnect, + required JSFunction cancelAllListener, + required JSFunction onWalletRequest, JSFunction? enable}) { final eip = EIP1193(JSObject()); + eip.sendWalletRequest = onWalletRequest; + eip.cancelListener = removeListener; + eip.request = request; eip.on = on; eip.removeListener = removeListener; eip.providerInfo = EIP6963ProviderInfo.providerInfo; + eip.enable = enable; + eip.cancelAllListener = cancelAllListener; - if (enable != null) { - eip.enable = enable; - } return eip; } } @@ -129,96 +124,13 @@ extension type EIP6963ProviderDetail._(JSObject _) implements MRTJsObject { @JS("EthereumRequestInterface") extension type EthereumRequestParams._(JSObject o) implements Web3JSRequestParams { - external factory EthereumRequestParams({String? method, JSAny? params}); + external factory EthereumRequestParams( + {String? method, JSAny? params, int? id}); external String get method; external set method(String? method); - external JSAny? get params; -} - -class ClientMessageEthereum extends PageMessage { - const ClientMessageEthereum({required super.method, required super.params}); - factory ClientMessageEthereum.event(EthereumEventTypes event) { - return ClientMessageEthereum(method: event.name, params: null); - } - @override - JSClientType get type => JSClientType.ethereum; - - factory ClientMessageEthereum.deserialize( - {List? bytes, String? cborHex, CborObject? object}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, tags: JSClientType.ethereum.tag, object: object); - final params = StringUtils.toJson(values.elementAt(1)); - return ClientMessageEthereum( - method: values.elementAt(0), params: params["result"]); - } - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - method, - StringUtils.fromJson({"result": params}) - ]), - type.tag); - } -} - -enum EthereumEventTypes { - accountsChanged([100]), - chainChanged([101]), - message([102]), - connect([103]), - disconnect([104]), - active([105]), - disable([106]); - - final List tag; - const EthereumEventTypes(this.tag); - static EthereumEventTypes fromTag(List? tag) { - return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), - orElse: () => throw Web3RequestExceptionConst.internalError); - } - - static EthereumEventTypes? fromName(String? name) { - try { - return values.firstWhere((e) => e.name == name, - orElse: () => throw Web3RequestExceptionConst.internalError); - } catch (e) { - return null; - } - } -} - -class JSWalletMessageResponseEthereum extends JSWalletNetworkEvent { - JSWalletMessageResponseEthereum({ - required this.event, - required super.data, - }) : super(client: JSClientType.ethereum); - final EthereumEventTypes event; - factory JSWalletMessageResponseEthereum.deserialize( - {List? bytes, CborObject? object, String? hex}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - object: object, - hex: hex, - tags: JSWalletMessageType.event.tag); - final client = JSClientType.fromTag(values.elementAt(0)); - if (client != JSClientType.ethereum) { - throw Web3RequestExceptionConst.internalError; - } - return JSWalletMessageResponseEthereum( - event: EthereumEventTypes.fromTag(values.elementAt(1)), - data: StringUtils.toJson(values.elementAt(2))["result"]); - } - - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - CborBytesValue(client.tag), - CborBytesValue(event.tag), - resultAsJsonString - ]), - type.tag); + external JSArray? get params; + Map toJson() { + return {"method": method, "params": params == null ? [] : params.dartify()}; } } @@ -261,6 +173,6 @@ class ProviderConnectInfo { @JSExport("toString") @override String toString() { - return "ProviderConnectInfo${toJson()}"; + return "ProviderConnectInfo${{"chainId": chainId}}"; } } diff --git a/mrt_wallet/js/js_wallet/models/models/networks/solana.dart b/mrt_wallet/js/js_wallet/models/models/networks/solana.dart index 37b1f70e..63cd37e3 100644 --- a/mrt_wallet/js/js_wallet/models/models/networks/solana.dart +++ b/mrt_wallet/js/js_wallet/models/models/networks/solana.dart @@ -3,11 +3,6 @@ import 'package:blockchain_utils/utils/binary/utils.dart'; import 'package:mrt_wallet/app/core.dart'; import '../../models.dart'; -import 'package:blockchain_utils/cbor/cbor.dart'; -import 'package:blockchain_utils/utils/string/string.dart'; -import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; -import 'package:mrt_native_support/web/mrt_native_web.dart'; - @JS("BN") extension type JSBN._(JSAny _) implements JSAny { external factory JSBN(JSAny val); @@ -18,16 +13,19 @@ extension type JSBN._(JSAny _) implements JSAny { external JSAny? get solanaWeb3; @JS("solana") external set solana(Proxy? solana); -extension type SolanaWalletAdapter(JSObject _) implements MRTJsObject { +extension type SolanaWalletAdapter(JSObject _) implements MRTNetworkAdapter { external set publicKey(JSObject? publicKey); + external bool get isConnected; external set isConnected(bool isConnected); + external set connect(JSFunction f); + external set signMessage(JSFunction f); - @JS("signAndSendTransaction") + @JS("signTransaction") external set signTransaction(JSFunction f); @JS("signAndSendTransaction") external set signAndSendTransaction(JSFunction f); - + @JS("signAllTransactions") external set signAllTransactions(JSFunction f); @JS("signAndSendAllTransactions") external set signAndSendAllTransactions(JSFunction f); @@ -35,7 +33,6 @@ extension type SolanaWalletAdapter(JSObject _) implements MRTJsObject { external set on(JSFunction f); external set removeListener(JSFunction f); - external set connect(JSFunction f); factory SolanaWalletAdapter.setup() { return SolanaWalletAdapter(JSObject()); } @@ -44,6 +41,9 @@ extension type SolanaWalletAdapter(JSObject _) implements MRTJsObject { extension type JSUint8Array(JSAny _) implements JSAny { external static JSUint8Array from(JSAny? v); external JSUint8Array slice(); + factory JSUint8Array.fromList(List bytes) { + return JSUint8Array.from(bytes.jsify()); + } List toListInt() { return (dartify() as List?)?.cast() ?? []; } @@ -57,9 +57,37 @@ extension type JSSolanaTransactionSerializationConfig._(JSObject _) @JS() extension type JSSolanaSignMessageResponse._(JSObject _) implements JSAny { external factory JSSolanaSignMessageResponse( - {required JSUint8Array signature}); + {required JSUint8Array signature, required JSObject publicKey}); + + factory JSSolanaSignMessageResponse.fromJson(Map json) { + return JSSolanaSignMessageResponse( + signature: JSUint8Array.fromList((json["signature"] as List).cast()), + publicKey: JSSolanaPublicKey( + base58: json["signer"], + bytes: (json["signerAddressBytes"] as List).cast()) + .toJS); + } } +class JSSolanaSignTransactionResponse { + final List signature; + final List addressBytes; + final String address; + JSSolanaSignTransactionResponse( + {required List signature, + required List addressBytes, + required this.address}) + : signature = BytesUtils.toBytes(signature, unmodifiable: true), + addressBytes = BytesUtils.toBytes(addressBytes, unmodifiable: true); + factory JSSolanaSignTransactionResponse.fromJson(Map json) { + return JSSolanaSignTransactionResponse( + signature: (json["signature"] as List).cast(), + addressBytes: (json["signerAddressBytes"] as List).cast(), + address: json["signer"]); + } +} + +@JS() extension type JSSolanaTranasctionSendOptions._(JSObject _) implements JSAny { external factory JSSolanaTranasctionSendOptions( {bool? skipPreflight, @@ -91,10 +119,9 @@ extension type JSSolanaTransaction(JSObject _) implements JSAny { JSSolanaTransactionSerializationConfig? config); external void addSignature(JSObject pubkey, JSAny? signature); - List transactionSerialize() { - final serialize = this.serialize( + JSUint8Array transactionSerialize() { + return serialize( JSSolanaTransactionSerializationConfig(verifySignatures: false)); - return serialize.toListInt(); } } extension type SolanaWeb3JSPubKey._(JSObject _) implements JSAny { @@ -130,7 +157,6 @@ class JSSolanaPublicKey { @JSExport("_bn") final JSBN _bn; - /// JSBN(toBytes()) @JSExport("toBase58") String toBase58() { return base58; @@ -184,7 +210,7 @@ class SolanaAccountsChanged { }; } - JSAny? get toJSEvent => accounts.jsify(); + JSAny? get accountJS => accounts.map((e) => e.toJS).toList().toJS; JSSolanaPublicKey? toJSPublicKey() { if (defaultAddress != null && defaultAddressBytes != null) { @@ -201,58 +227,6 @@ class SolanaAccountsChanged { } } -enum SolanaEventTypes { - accountsChanged([100]), - chainChanged([101]), - message([112]), - connect([113]), - disconnect([114]), - active([115]), - disable([116]); - - final List tag; - const SolanaEventTypes(this.tag); - static SolanaEventTypes fromTag(List? tag) { - return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), - orElse: () => throw Web3RequestExceptionConst.internalError); - } - - static SolanaEventTypes? fromName(String? name) { - return values.firstWhereOrNull((e) => e.name == name); - } -} - -class ClientMessageSolana extends PageMessage { - const ClientMessageSolana({required super.method, super.params}); - - factory ClientMessageSolana.event(SolanaEventTypes event) { - return ClientMessageSolana(method: event.name, params: null); - } - @override - JSClientType get type => JSClientType.solana; - - factory ClientMessageSolana.deserialize( - {List? bytes, String? cborHex, CborObject? object}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - tags: JSClientType.solana.tag, - hex: cborHex, - object: object); - final params = StringUtils.toJson(values.elementAt(1)); - return ClientMessageSolana( - method: values.elementAt(0), params: params["result"]); - } - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - method, - StringUtils.fromJson({"result": params}) - ]), - type.tag); - } -} - class ClientSolanaTransactionMessage { final int id; final List message; @@ -272,40 +246,6 @@ class ClientSolanaTransactionMessage { } } -class JSWalletMessageResponseSolana extends JSWalletNetworkEvent { - JSWalletMessageResponseSolana({ - required this.event, - super.data, - }) : super(client: JSClientType.solana); - final SolanaEventTypes event; - factory JSWalletMessageResponseSolana.deserialize( - {List? bytes, CborObject? object, String? hex}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - object: object, - hex: hex, - tags: JSWalletMessageType.event.tag); - final client = JSClientType.fromTag(values.elementAt(0)); - if (client != JSClientType.solana) { - throw Web3RequestExceptionConst.internalError; - } - return JSWalletMessageResponseSolana( - event: SolanaEventTypes.fromTag(values.elementAt(1)), - data: StringUtils.toJson(values.elementAt(2))["result"]); - } - - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - CborBytesValue(client.tag), - CborBytesValue(event.tag), - resultAsJsonString - ]), - type.tag); - } -} - class SolanaProviderConnectInfo { @JSExport("genesisBlock") final String genesisBlock; @@ -325,12 +265,3 @@ class SolanaProviderConnectInfo { return genesisBlock; } } - -@JS("SolanaRequestParams") -extension type SolanaRequestParams._(JSObject o) - implements Web3JSRequestParams { - external factory SolanaRequestParams({String? method, JSAny? params}); - external String get method; - external set method(String? method); - external JSAny? get params; -} diff --git a/mrt_wallet/js/js_wallet/models/models/networks/ton.dart b/mrt_wallet/js/js_wallet/models/models/networks/ton.dart new file mode 100644 index 00000000..a8793198 --- /dev/null +++ b/mrt_wallet/js/js_wallet/models/models/networks/ton.dart @@ -0,0 +1,268 @@ +import 'dart:js_interop'; +import 'package:mrt_wallet/app/core.dart'; +import '../../models.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_native_support/web/mrt_native_web.dart'; + +extension type TonFeature._(JSObject _) implements MRTJsObject { + external factory TonFeature({String name}); +} +extension type TonBridgeInjected._(JSObject _) implements TonBridge { + external factory TonBridgeInjected( + {required String name, required String key}); + static TonBridgeInjected instance = TonBridgeInjected(name: "js", key: "MRT"); +} + +extension type TonBridge._(JSObject _) implements MRTJsObject { + external factory TonBridge({String name}); +} + +extension type SendTransactionFeature._(JSObject _) implements TonFeature { + external factory SendTransactionFeature( + {required String name, required int maxMessages}); + static SendTransactionFeature instance = + SendTransactionFeature(name: "SendTransaction", maxMessages: 4); +} +extension type SignDataFeature._(JSObject _) implements TonFeature { + external factory SignDataFeature({required String name}); + static SignDataFeature instance = SignDataFeature(name: "SignData"); +} +extension type TonDeviceInfo._(JSObject _) implements MRTJsObject { + external factory TonDeviceInfo( + {required String platform, + required String appName, + required String appVersion, + required int maxProtocolVersion, + required JSArray features}); + static TonDeviceInfo instance = TonDeviceInfo( + appName: "MRT", + appVersion: "1.0.0", + features: + [SendTransactionFeature.instance, SignDataFeature.instance].toJS, + maxProtocolVersion: 2, + platform: "browser"); +} + +extension type WalletInfoDTO._(JSObject _) implements MRTJsObject { + external String get name; + @JS("app_name") + external String get app_name; + external String get tondns; + external String get image; + @JS("about_url") + external String get aboutUrl; + @JS("universal_url") + external String get universalUrl; + external String? get deepLink; + external JSArray get platforms; + + external factory WalletInfoDTO({ + required String name, + required String app_name, + String? tondns, + required String? image, + required String about_url, + String? universalUrl, + required JSArray platforms, + required JSArray bridge, + }); + static WalletInfoDTO instance = WalletInfoDTO( + about_url: "https://github.com/mrtnetwork/mrtwallet", + app_name: "MRT", + image: null, //"https://github.com/mrtnetwork/mrtwallet", + name: "MRT wallet", + bridge: [TonBridgeInjected.instance].toJS, + platforms: [ + "android", + "chrome", + "firefox", + "windows", + "macos", + ].map((e) => e.toJS).toList().toJS, + ); +} + +enum TonChainId { + mainnet(value: '-239', workchain: 0), + testnet(value: '-3', workchain: -1); + + final String value; + final int workchain; + + const TonChainId({required this.value, required this.workchain}); + static TonChainId fromNetworkId(int id) { + return values.firstWhere((e) => e.workchain == id, + orElse: () => throw Web3RequestExceptionConst.invalidNetwork); + } +} + +extension type TonAddressItemDTO._(JSObject _) implements MRTJsObject { + external String get name; + external String get address; + external String get network; + external String get walletStateInit; + external String get publicKey; + + external factory TonAddressItemDTO({ + required String name, + required String address, + required String network, + required String walletStateInit, + required String publicKey, + }); + + factory TonAddressItemDTO.create({ + required String address, + required String network, + required String walletStateInit, + required String publicKey, + }) { + return TonAddressItemDTO( + name: "ton_addr", + address: address, + network: network, + walletStateInit: walletStateInit, + publicKey: publicKey); + } + factory TonAddressItemDTO.fromJson(Map json) { + return TonAddressItemDTO( + name: "ton_addr", + address: json["address"], + network: json["network"], + walletStateInit: json["walletStateInit"], + publicKey: json["publicKey"]); + } + Map toJson() { + return { + "address": address, + "network": network, + "walletStateInit": walletStateInit, + "publicKey": publicKey + }; + } +} + +enum ConnectEventErrorCodes { + unknownError(0), + badRequestError(1), + manifestNotFoundError(2), + manifestContentError(3), + unknownAppError(100), + userRejectsError(300), + methodNotSupported(400); + + final int code; + + const ConnectEventErrorCodes(this.code); +} + +@JS() +extension type TonWalletAdapter(JSObject _) implements MRTNetworkAdapter { + // external factory TonWalletAdapter(); + // external factory TonWalletAdapter( + // {required TonDeviceInfo deviceInfo, + // required int protocolVersion, + // required bool isWalletBrowser, + // required WalletInfoDTO walletInfo}); + // external TonDeviceInfo get deviceInfo; + // external int get protocolVersion; + // external bool get isWalletBrowser; + // external WalletInfoDTO get walletInfo; + // external set listen(JSFunction f); + // external set connect(JSFunction f); + // external set restoreConnection(JSFunction f); + // external set send(JSFunction f); + // external set sendTransaction(JSFunction f); +} + +extension type TonJSTranasctionMessage._(JSObject _) implements MRTJsObject { + external factory TonJSTranasctionMessage( + {required String address, + required String amount, + String? stateInit, + String? payload}); + external String get address; + external String get amount; + external String? stateInit; + external String? payload; + Map toJson() { + return { + "address": address, + "amount": amount, + "stateInit": stateInit, + "payload": payload + }; + } +} +extension type TonJSTranasction._(JSObject _) implements MRTJsObject { + external factory TonJSTranasction( + {required int validUntil, + String? network, + String? from, + required JSArray messages}); + external int get validUntil; + external String? network; + external String? from; + external JSArray messages; + + Map toJson() { + return { + "validUntil": validUntil, + "network": network, + "from": from, + "messages": messages.toDart.map((e) => e.toJson()).toList() + }; + } +} + +class TonAccountsChanged { + final List accounts; + final String? defaultAddress; + TonAccountsChanged({required List accounts, this.defaultAddress}) + : accounts = accounts.imutable; + factory TonAccountsChanged.fromJson(Map json) { + return TonAccountsChanged( + accounts: (json["accounts"] as List).cast(), + defaultAddress: json["defaultAddress"]); + } + Map toJson() { + return {"accounts": accounts, "defaultAddress": defaultAddress}; + } + + JSAny? get accountJS => accounts.jsify(); + + @JSExport("toString") + @override + String toString() { + return "TonAccountsChanged${toJson()}"; + } +} + +class TonChainChanged { + @JSExport("workChain") + final int workChain; + + TonChainChanged(this.workChain); + factory TonChainChanged.fromJson(Map json) { + return TonChainChanged(json["workChain"]); + } + Map toJson() { + return {"workChain": workChain}; + } + + JSAny? get toJS => createJSInteropWrapper(this); + + @JSExport("toString") + @override + String toString() { + return "TonChainChanged${toJson()}"; + } +} + +@JS("TonRequestParams") +extension type TonRequestParams._(JSObject o) implements Web3JSRequestParams { + external factory TonRequestParams({String? method, JSAny? params}); + external String get method; + external set method(String? method); + external JSAny? get params; +} diff --git a/mrt_wallet/js/js_wallet/models/models/networks/tron.dart b/mrt_wallet/js/js_wallet/models/models/networks/tron.dart index e3706fa7..29a6699e 100644 --- a/mrt_wallet/js/js_wallet/models/models/networks/tron.dart +++ b/mrt_wallet/js/js_wallet/models/models/networks/tron.dart @@ -1,13 +1,8 @@ import 'dart:js_interop'; -import 'package:blockchain_utils/cbor/cbor.dart'; -import 'package:blockchain_utils/utils/binary/utils.dart'; -import 'package:blockchain_utils/utils/string/string.dart'; import 'package:mrt_native_support/web/mrt_native_web.dart'; -import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; -import 'package:mrt_wallet/app/utils/list/extention.dart'; -import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; +import 'package:mrt_wallet/app/utils/numbers/numbers.dart'; import 'ethereum.dart'; -import '../requests.dart'; @JS("tron") external set tron(Proxy? tron); @@ -57,7 +52,7 @@ extension type TronWeb._(JSAny _) implements JSAny { @JS("trx") external TronWebTRX get trx; @JS("trx") - external set trxx(Proxy trx); + external set trx_(Proxy trx); external set setSolidityNode(JSFunction setAddress); external set setFullNode(JSFunction setPrivateKey); @@ -70,10 +65,7 @@ extension type TronWeb._(JSAny _) implements JSAny { external set setDefaultBlock(JSAny? fullNodsetDefaultBlocke); external HttpProvider get solidityNode; external HttpProvider get fullNode; - // external JSAny get pro - @JS("trx") - external TronWebTRX? get trxNull; external JSObject? get defaultAddress; external set defaultAddress(JSObject? defaultAddress); } @@ -90,34 +82,32 @@ extension type TIP1193(JSObject _) implements EIP1193 { external set ready(bool ready); - static TIP1193 setup( - {required JSFunction request, - required JSFunction on, - required JSFunction removeListener, - required JSFunction disconnect, - required Proxy tronWeb, - JSFunction? enable}) { + static TIP1193 setup({ + required JSFunction request, + required JSFunction on, + required JSFunction removeListener, + required JSFunction disconnect, + required JSFunction cancelAllListener, + required Proxy tronWeb, + required JSFunction enable, + required JSFunction sendWalletRequest, + }) { final tip = TIP1193(JSObject()); + tip.sendWalletRequest = sendWalletRequest; + tip.cancelAllListener = cancelAllListener; + tip.cancelAllListener = removeListener; + tip.request = request; tip.on = on; tip.removeListener = removeListener; tip.tronWeb = tronWeb; tip.providerInfo = EIP6963ProviderInfo.providerInfo; tip.ready = true; - if (enable != null) { - tip.enable = enable; - } + tip.enable = enable; final eth = MRTJsObject.freeze(tip); - return eth; } } -@JS("TronRequestInterface") -extension type TronRequestParams._(JSObject o) - implements EthereumRequestParams { - external factory TronRequestParams( - {String? method, JSAny? params, String? perivateKey}); -} @JS() extension type TronWebTRX(JSObject _) implements MRTJsObject { @@ -131,57 +121,6 @@ extension type TronWebTRX(JSObject _) implements MRTJsObject { external set signMessageV2__(JSFunction f); } -enum TronEventTypes { - accountsChanged([110]), - chainChanged([111]), - message([112]), - connect([113]), - disconnect([114]), - active([115]), - disable([116]); - - final List tag; - const TronEventTypes(this.tag); - static TronEventTypes fromTag(List? tag) { - return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), - orElse: () => throw Web3RequestExceptionConst.internalError); - } - - static TronEventTypes? fromName(String? name) { - return values.firstWhereOrNull((e) => e.name == name); - } -} - -class ClientMessageTron extends PageMessage { - const ClientMessageTron({required super.method, required super.params}); - factory ClientMessageTron.event(TronEventTypes event) { - return ClientMessageTron(method: event.name, params: null); - } - @override - JSClientType get type => JSClientType.tron; - - factory ClientMessageTron.deserialize( - {List? bytes, String? cborHex, CborObject? object}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - tags: JSClientType.tron.tag, - hex: cborHex, - object: object); - final params = StringUtils.toJson(values.elementAt(1)); - return ClientMessageTron( - method: values.elementAt(0), params: params["result"]); - } - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - method, - StringUtils.fromJson({"result": params}) - ]), - type.tag); - } -} - class TronWebNodeInfo { final String solidityNode; final String fullNode; @@ -234,40 +173,6 @@ class TronWebNodeInfo { } } -class JSWalletMessageResponseTron extends JSWalletNetworkEvent { - JSWalletMessageResponseTron({ - required this.event, - required super.data, - }) : super(client: JSClientType.tron); - final TronEventTypes event; - factory JSWalletMessageResponseTron.deserialize( - {List? bytes, CborObject? object, String? hex}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - object: object, - hex: hex, - tags: JSWalletMessageType.event.tag); - final client = JSClientType.fromTag(values.elementAt(0)); - if (client != JSClientType.tron) { - throw Web3RequestExceptionConst.internalError; - } - return JSWalletMessageResponseTron( - event: TronEventTypes.fromTag(values.elementAt(1)), - data: StringUtils.toJson(values.elementAt(2))["result"]); - } - - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - CborBytesValue(client.tag), - CborBytesValue(event.tag), - resultAsJsonString - ]), - type.tag); - } -} - class TronAccountsChanged { final List accounts; final JSTronAddress? defaultAddress; @@ -293,3 +198,36 @@ class TronAccountsChanged { return "TronAccountsChanged${toJson()}"; } } + +class TronChainChanged { + @JSExport("chainId") + final String chainId; + final BigInt netVersion; + final String solidityNode; + final String fullNode; + TronChainChanged( + {required this.netVersion, + required this.fullNode, + required this.solidityNode}) + : chainId = netVersion.toRadix16; + factory TronChainChanged.fromJson(Map json) { + return TronChainChanged( + netVersion: BigInt.parse(json["net_version"]), + fullNode: json["fullNode"], + solidityNode: json["solidityNode"]); + } + Map toJson() { + return { + "net_version": netVersion.toString(), + "fullNode": fullNode, + "solidityNode": solidityNode + }; + } + + JSAny? get toJSEvent => createJSInteropWrapper(this); + @JSExport("toString") + @override + String toString() { + return "ProviderConnectInfo${{"chainId": chainId}}"; + } +} diff --git a/mrt_wallet/js/js_wallet/models/models/requests.dart b/mrt_wallet/js/js_wallet/models/models/requests.dart index 2392c964..afa3db89 100644 --- a/mrt_wallet/js/js_wallet/models/models/requests.dart +++ b/mrt_wallet/js/js_wallet/models/models/requests.dart @@ -1,13 +1,10 @@ +import 'dart:js_interop'; + import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:mrt_wallet/app/core.dart'; -import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; -import '../../constant/constant.dart'; -import '../../utils/utils/utils.dart'; -import 'networks/ethereum.dart'; -import 'networks/solana.dart'; -import 'networks/tron.dart'; +import '../../js_wallet.dart'; enum JSWalletMessageType { response([100]), @@ -20,81 +17,155 @@ enum JSWalletMessageType { return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), orElse: () => throw Web3RequestExceptionConst.internalError); } + + static JSWalletMessageType fromName(String? name) { + return values.firstWhere((e) => e.name == name, + orElse: () => throw Web3RequestExceptionConst.internalError); + } } -abstract class JSWalletMessage with CborSerializable { - abstract final String? requestId; - final JSClientType client; - JSWalletMessageType get type; - final Object? data; - JSWalletMessage({required this.data, required this.client}); - - String get resultAsJsonString => StringUtils.fromJson({"result": data}); - - static T deserialize( - {List? bytes, CborObject? object, String? hex}) { - final CborTagValue cbor = - CborSerializable.decode(cborBytes: bytes, hex: hex, object: object); - final client = JSWalletMessageType.fromTag(cbor.tags); - JSWalletMessage response; - switch (client) { - case JSWalletMessageType.response: - response = JSWalletMessageResponse.deserialize(object: cbor); - break; - case JSWalletMessageType.event: - response = JSWalletNetworkEvent.deserialize(object: cbor); - break; - default: - throw Web3RequestExceptionConst.internalError; - } - if (response is! T) { - throw Web3RequestExceptionConst.internalError; - } - return response; +extension type WalletResponse._(JSObject object) implements JSAny { + external String get id; + external JSAny? get result; + external JSWalletError? get error; +} +extension type WalletResponseSuccess._(JSObject object) + implements WalletResponse { + external String get id; + external JSAny? get result; + external factory WalletResponseSuccess( + {required String id, required JSAny? result}); +} +extension type WalletResponseError._(JSObject object) + implements WalletResponse { + external String get id; + external JSWalletError get error; + external factory WalletResponseError( + {required String id, required JSWalletError error}); +} + +extension type WalletMessage._(JSObject object) implements JSAny { + external String get requestId; + external String get id; + external String get client; + external WalletMessageData get data; + JSClientType get clientType => JSClientType.fromName(client); + external factory WalletMessage( + {required String requestId, + required String id, + required String client, + required WalletMessageData data}); + factory WalletMessage.response( + {required String requestId, + String? id, + required JSClientType client, + required WalletMessageResponse data}) { + return WalletMessage( + requestId: requestId, id: id ?? "", client: client.name, data: data); + } + factory WalletMessage.event( + {String? requestId, + String? id, + required JSClientType client, + required WalletMessageEvent data}) { + return WalletMessage( + requestId: requestId ?? "", + id: id ?? "", + client: client.name, + data: data); } +} - T cast() { - if (this is! T) { - throw Web3RequestExceptionConst.internalError; - } - return this as T; +extension type WalletMessageData._(JSObject object) implements JSAny { + external String get type; + external JSAny? get data; + JSWalletMessageType get messageType => JSWalletMessageType.fromName(type); + String asString() { + return data?.dartify() as String; } - T dataAs() { - return data as T; - } -} - -abstract class JSWalletNetworkEvent extends JSWalletMessage { - @override - final String? requestId = null; - JSWalletNetworkEvent({required super.data, required super.client}); - @override - JSWalletMessageType get type => JSWalletMessageType.event; - - factory JSWalletNetworkEvent.deserialize( - {List? bytes, CborObject? object, String? hex}) { - final CborTagValue cbor = - CborSerializable.decode(cborBytes: bytes, hex: hex, object: object); - final CborListValue values = CborSerializable.cborTagValue( - object: cbor, tags: JSWalletMessageType.event.tag); - final client = JSClientType.fromTag(values.elementAt(0)); - switch (client) { - case JSClientType.ethereum: - return JSWalletMessageResponseEthereum.deserialize(object: cbor); - case JSClientType.tron: - return JSWalletMessageResponseTron.deserialize(object: cbor); - case JSClientType.solana: - return JSWalletMessageResponseSolana.deserialize(object: cbor); - default: - } - throw Web3RequestExceptionConst.internalError; + Map _convertMap(Map map) { + map.forEach((key, value) { + if (value is Map) { + map[key] = _convertMap(value); + } + }); + return Map.from(map); + } + + Map asMap() { + return _convertMap(data?.dartify() as Map); + } +} + +extension type WalletMessageResponse._(JSObject object) + implements WalletMessageData { + external factory WalletMessageResponse( + {required String type, required String status, required JSAny? data}); + external String get type; + external String get status; + JSWalletResponseType get statusType => JSWalletResponseType.fromName(status); + factory WalletMessageResponse.success(JSAny? data) { + return WalletMessageResponse( + type: JSWalletMessageType.response.name, + data: data, + status: JSWalletResponseType.success.name); + } + factory WalletMessageResponse.fail(JSAny? data) { + return WalletMessageResponse( + type: JSWalletMessageType.response.name, + data: data, + status: JSWalletResponseType.failed.name); + } +} +extension type WalletMessageEvent._(JSObject object) + implements WalletMessageData { + external factory WalletMessageEvent( + {required String type, required String event, required JSAny? data}); + factory WalletMessageEvent.build({required JSEventType event, Object? data}) { + return WalletMessageEvent( + type: JSWalletMessageType.event.name, + data: data?.jsify(), + event: event.name); + } + external String get type; + external String get event; + external JSAny? get data; + JSEventType get eventType => JSEventType.name(event); +} + +enum JSEventType { + accountsChanged([110]), + chainChanged([111]), + message([112]), + connect([113]), + disconnect([114]), + active([115]), + disable([116]); + + bool get needEmit => + this == accountsChanged || this == chainChanged || this == connect; + + final List tag; + const JSEventType(this.tag); + static JSEventType fromTag(List? tag) { + return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), + orElse: () => throw Web3RequestExceptionConst.internalError); + } + + static JSEventType name(String? name) { + return values.firstWhere((e) => e.name == name, + orElse: () => throw Web3RequestExceptionConst.internalError); + } + + static JSEventType? fromName(String? name) { + return values.firstWhereOrNull((e) => e.name == name); } } enum JSWalletResponseType { - success([50]), - failed([51]); + success([130]), + failed([131]); final List tag; const JSWalletResponseType(this.tag); @@ -102,134 +173,213 @@ enum JSWalletResponseType { return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), orElse: () => throw Web3RequestExceptionConst.internalError); } + + static JSWalletResponseType fromName(String? name) { + return values.firstWhere((e) => e.name == name, + orElse: () => throw Web3RequestExceptionConst.internalError); + } } -class JSWalletMessageResponse extends JSWalletMessage { - @override - final String requestId; - final JSWalletResponseType status; +enum JSClientType { + global(tag: [150], networkName: ""), + ethereum(tag: [151], networkName: "Ethereum"), + tron(tag: [152], networkName: "Tron"), + solana(tag: [153], networkName: "Solana"), + ton(tag: [154], networkName: "TON"); - JSWalletMessageResponse( - {required this.requestId, - required super.data, - required super.client, - required this.status}); + final List tag; + final String networkName; + const JSClientType({required this.tag, required this.networkName}); - factory JSWalletMessageResponse.deserialize( - {List? bytes, CborObject? object, String? hex}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - object: object, - hex: hex, - tags: JSWalletMessageType.response.tag); - return JSWalletMessageResponse( - client: JSClientType.fromTag(values.elementAt(0)), - requestId: values.elementAt(1), - data: StringUtils.toJson(values.elementAt(2))["result"], - status: JSWalletResponseType.fromTag(values.elementAt(3))); + static JSClientType fromTag(List? tag) { + return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), + orElse: () => throw Web3RequestExceptionConst.internalError); } - @override - CborTagValue toCbor() { - return CborTagValue( - CborListValue.fixedLength([ - CborBytesValue(client.tag), - requestId, - resultAsJsonString, - CborBytesValue(status.tag), - ]), - type.tag); + static JSClientType fronNetworkName(String? name) { + if (name == null) return JSClientType.global; + return values.firstWhere((e) => e.networkName == name, + orElse: () => throw Web3RequestExceptionConst.internalError); } - @override - JSWalletMessageType get type => JSWalletMessageType.response; + static JSClientType fromName(String? name) { + return values.firstWhere((e) => e.name == name, + orElse: () => throw Web3RequestExceptionConst.internalError); + } } -enum JSClientType { - global([110]), - ethereum([111]), - tron([112]), - solana([113]); +extension type PageMessage._(JSObject object) implements JSAny { + external String get id; + external String get client; + external PageMessageData get data; + JSClientType get clientType => JSClientType.fromName(client); + external factory PageMessage( + {required String id, + required String client, + required PageMessageData data}); + factory PageMessage.request( + {String? id, + required JSClientType client, + required PageMessageRequest data}) { + return PageMessage(id: id ?? "", client: client.name, data: data); + } + factory PageMessage.event( + {String? requestId, + String? id, + required JSClientType client, + required PageMessageEvent data}) { + return PageMessage(id: id ?? "", client: client.name, data: data); + } +} - final List tag; - const JSClientType(this.tag); +enum PageMessageType { + request([170]), + event([171]); - static JSClientType fromTag(List? tag) { - return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), + const PageMessageType(this.tags); + final List tags; + + static PageMessageType fromTag(List? tag) { + return values.firstWhere((e) => BytesUtils.bytesEqual(e.tags, tag), + orElse: () => throw Web3RequestExceptionConst.internalError); + } + + static PageMessageType fromName(String? name) { + return values.firstWhere((e) => e.name == name, orElse: () => throw Web3RequestExceptionConst.internalError); } } -class JSPageRequest with CborSerializable { - JSClientType get type => message.type; - final String id; - final PageMessage message; - const JSPageRequest({required this.message, required this.id}); - factory JSPageRequest.deserialize( - {List? bytes, String? cborHex, CborObject? object}) { - final CborListValue values = CborSerializable.cborTagValue( - cborBytes: bytes, - hex: cborHex, - object: object, - tags: JSWalletConstant.pageRequestTag); - return JSPageRequest( - message: PageMessage.deserialize(object: values.getCborTag(0)), - id: values.elementAt(1)); - } - - @override - CborTagValue toCbor() { - return CborTagValue(CborListValue.fixedLength([message.toCbor(), id]), - JSWalletConstant.pageRequestTag); - } -} - -abstract class PageMessage with CborSerializable { - final String method; - abstract final JSClientType type; - final Object? params; - const PageMessage({required this.method, required this.params}); - factory PageMessage.deserialize( - {List? bytes, String? cborHex, CborObject? object}) { - final CborTagValue tag = - CborSerializable.decode(cborBytes: bytes, hex: cborHex, object: object); - final type = JSClientType.fromTag(tag.tags); - switch (type) { - case JSClientType.ethereum: - return ClientMessageEthereum.deserialize(object: tag); - case JSClientType.tron: - return ClientMessageTron.deserialize(object: tag); - case JSClientType.solana: - return ClientMessageSolana.deserialize(object: tag); - default: - throw Web3RequestExceptionConst.internalError; +extension type PageMessageData._(JSObject object) implements JSAny { + external String get type; + PageMessageType get messageType => PageMessageType.fromName(type); + T cast() { + if (this is! T) { + throw Web3RequestExceptionConst.internalError; } + return this as T; } +} - List? paramsAsList({int? length}) { +extension JSArrayFuture on JSArray { + external T? operator [](int index); + external int get length; + + E? elemetAt(int index) { try { - final listParam = List.from(params as List); - if (length != null && listParam.length < length) { - return null; - } - return listParam; + return this[index] as E; + } catch (_) { + return null; + } + } +} + +@JS() +extension type Web3JSRequestParams._(JSObject o) implements JSAny { + external String get method; + external String? get id; + external JSArray? get params; + external factory Web3JSRequestParams( + {String? method, JSArray? params, int? id}); + + Map toJson() { + return { + "method": method, + "params": params == null ? [] : params.dartify(), + "id": id + }; + } + + List dartParams() { + try { + return List.from(params.dartify() as List); } catch (e) { + return []; + } + } + + T? getElemet(int index) { + try { + return params![index] as T; + } catch (_) { return null; } } +} +extension type PageMessageRequest._(JSObject object) + implements PageMessageData { + external factory PageMessageRequest( + {required String type, + required String method, + required JSArray? params, + required String id, + JSAny? additionalData}); + external String get type; + external String get method; + external JSArray? params; + external JSAny? additionalData; + external String get id; + factory PageMessageRequest.create( + {JSArray? params, + required String method, + String? id, + JSAny? additionalData}) { + return PageMessageRequest( + id: id ?? "", + method: method, + params: params, + type: PageMessageType.request.name, + additionalData: additionalData); + } + + List get dartParams => + params?.toDart.map((e) => e.dartify()).toList() ?? []; + + List? getElements(int length) { + final toDart = dartParams; + if (toDart.length >= length) { + return toDart.sublist(0, length); + } + return null; + } - Map? paramsAsMap() { + List? getJSParamsAs() { try { - return JsUtils.toMap(params); + return List.from(params as List); } catch (e) { return null; } } - T cast() { - if (this is! T) { - throw Web3RequestExceptionConst.internalError; + T? getElementAt(int index) { + try { + final item = params![index]; + return item as T; + } catch (_) { + return null; } - return this as T; } + + Object? get getFirstParam { + final toDart = dartParams; + if (toDart.isEmpty) { + return null; + } + return toDart.first; + } +} + +extension type PageMessageEvent._(JSObject object) implements PageMessageData { + external factory PageMessageEvent( + {required String type, required String event, required JSAny? data}); + factory PageMessageEvent.build({required JSEventType event, Object? data}) { + return PageMessageEvent( + type: PageMessageType.event.name, + data: data?.jsify(), + event: event.name); + } + external String get type; + external String get event; + external JSAny? get data; + JSEventType get eventType => JSEventType.name(event); } diff --git a/mrt_wallet/js/js_wallet/page_script/controller/controller.dart b/mrt_wallet/js/js_wallet/page_script/controller/controller.dart index e6412a8f..6b44d3d2 100644 --- a/mrt_wallet/js/js_wallet/page_script/controller/controller.dart +++ b/mrt_wallet/js/js_wallet/page_script/controller/controller.dart @@ -1,67 +1,49 @@ part of '../scripts.dart'; class JSPageController { - JSPageController._(this.clientId); - late final EthereumPageController ethereumPageController = - EthereumPageController(getWalletMessage: _getResult); - late final TronPageController tronPageController = - TronPageController(getWalletMessage: _getResult); - late final SolanaPageController solanaPageController = - SolanaPageController(getWalletMessage: _getResult); - final String clientId; - late final String _id = JsUtils.toEthereumClientId(clientId); - late final String _walletId = JsUtils.toWalletId(clientId); - - final Map _waitingRequest = {}; - - void _postWalletEvent(JSPageRequest params) { - final event = - CustomEvent.create(type: _walletId, data: params.toCbor().encode()); - jsWindow.dispatchEvent(event); - } - - Future _getResult(PageMessage message) async { - final request = PageRequestCompeleter.nextRequest(); - try { - final toWalletRequest = JSPageRequest(message: message, id: request.id); - _postWalletEvent(toWalletRequest); - _waitingRequest[request.id] ??= request; - final result = await request.wait; - return result; - } finally { - _waitingRequest.remove(request.id); - } - } - + JSPageController._(); factory JSPageController.setup(String clientId) { - final client = JSPageController._(clientId); - client._init(); + final client = JSPageController._(); + PageNetworkController._walletId = JsUtils.toWalletId(clientId); + jsWindow.addEventListener( + JsUtils.toEthereumClientId(clientId), client._onWalletEvent.toJS); return client; } - void _init() { - jsWindow.addEventListener(_id, _onWalletEvent.toJS); - } + final EthereumPageController ethereumPageController = + EthereumPageController(); + final TronPageController tronPageController = TronPageController(); + final SolanaPageController solanaPageController = SolanaPageController(); + final TonPageController tonPageController = TonPageController(); void _onWalletEvent(CustomEvent response) { - final walletResponse = - JSWalletMessage.deserialize(bytes: response.detailBytes()); - if (walletResponse.type == JSWalletMessageType.response) { - _waitingRequest[walletResponse.requestId] - ?.completeMessage(walletResponse.cast()); - return; - } - switch (walletResponse.client) { - case JSClientType.ethereum: - ethereumPageController.onEvent(walletResponse.cast()); - break; - case JSClientType.tron: - tronPageController.onEvent(walletResponse.cast()); - break; - case JSClientType.solana: - solanaPageController.onEvent(walletResponse.cast()); - break; - default: - break; + try { + final WalletMessage walletResponse = response.detail as WalletMessage; + + if (walletResponse.data.messageType == JSWalletMessageType.response) { + PageNetworkController._compeleteRequest( + requestId: walletResponse.requestId, + walletResponse: walletResponse.data as WalletMessageResponse); + return; + } + final event = walletResponse.data as WalletMessageEvent; + switch (walletResponse.clientType) { + case JSClientType.ethereum: + ethereumPageController.onEvent(event); + break; + case JSClientType.tron: + tronPageController.onEvent(event); + break; + case JSClientType.solana: + solanaPageController.onEvent(event); + break; + case JSClientType.ton: + tonPageController.onEvent(event); + break; + default: + break; + } + } catch (e) { + rethrow; } } } diff --git a/mrt_wallet/js/js_wallet/page_script/core/controller.dart b/mrt_wallet/js/js_wallet/page_script/core/controller.dart index dc4e2138..ff7805ba 100644 --- a/mrt_wallet/js/js_wallet/page_script/core/controller.dart +++ b/mrt_wallet/js/js_wallet/page_script/core/controller.dart @@ -1,9 +1,79 @@ part of '../scripts.dart'; typedef PostWalletMessage = void Function(PageMessage); -typedef GetWalletMessage = Future Function(PageMessage); abstract class PageNetworkController { - const PageNetworkController({required this.getWalletMessage}); - final GetWalletMessage getWalletMessage; + int _id = 0; + abstract final JSClientType _client; + static late final String _walletId; + static final Map _waitingRequest = {}; + final Map> _listeners = { + JSEventType.accountsChanged: [], + JSEventType.chainChanged: [], + JSEventType.connect: [], + JSEventType.message: [], + JSEventType.disconnect: [], + }; + static void _compeleteRequest( + {required WalletMessageResponse walletResponse, + required String requestId}) { + _waitingRequest[requestId]?.completeMessage(walletResponse); + } + + JSPromise _onWalletRequest(Web3JSRequestParams params) { + final message = PageMessageRequest.create( + method: params.method, + params: params.params, + id: params.id ?? (_id++).toString()); + final promise = _onWalletRequest_(message).toPromise; + return promise; + } + + Future _getWalleResponse( + PageMessageRequest message) async { + final request = PageRequestCompeleter.nextRequest(); + try { + final toWalletRequest = + PageMessage.request(data: message, id: request.id, client: _client); + final event = + CustomEvent.create(type: _walletId, eventData: toWalletRequest); + jsWindow.dispatchEvent(event); + _waitingRequest[request.id] ??= request; + return await request.wait; + } finally { + _waitingRequest.remove(request.id); + } + } + + void _emitEvent(PageMessageEvent message) { + if (!message.eventType.needEmit) return; + final toWalletRequest = + PageMessage.event(data: message, id: "", client: _client); + final event = + CustomEvent.create(type: _walletId, eventData: toWalletRequest); + jsWindow.dispatchEvent(event); + } + + Future _onNetworkRequest( + PageMessageRequest message) async { + final response = await _getWalleResponse(message); + switch (response.statusType) { + case JSWalletResponseType.success: + return response.data as T; + case JSWalletResponseType.failed: + throw JSWalletError.fromJson(message: response.asMap()); + } + } + + Future _onWalletRequest_(PageMessageRequest message) async { + final response = await _getWalleResponse(message); + switch (response.statusType) { + case JSWalletResponseType.success: + return WalletResponseSuccess(id: message.id, result: response.data); + case JSWalletResponseType.failed: + return WalletResponseError( + id: message.id, + error: JSWalletError.fromJson(message: response.asMap())); + } + } } diff --git a/mrt_wallet/js/js_wallet/page_script/networks/eth.dart b/mrt_wallet/js/js_wallet/page_script/networks/eth.dart index e6b0f06d..82d15084 100644 --- a/mrt_wallet/js/js_wallet/page_script/networks/eth.dart +++ b/mrt_wallet/js/js_wallet/page_script/networks/eth.dart @@ -1,16 +1,10 @@ part of '../scripts.dart'; class EthereumPageController extends PageNetworkController { + int _requestId = 0; ProxyMethodHandler? _ethereum; - final Map> _listeners = { - EthereumEventTypes.accountsChanged: [], - EthereumEventTypes.chainChanged: [], - EthereumEventTypes.connect: [], - EthereumEventTypes.message: [], - EthereumEventTypes.disconnect: [] - }; - EthereumPageController({required super.getWalletMessage}); + EthereumPageController(); ProxyMethodHandler _setupEIP() { final eip = EIP1193.setup( @@ -18,7 +12,9 @@ class EthereumPageController extends PageNetworkController { on: _addListener.toJS, removeListener: _removeListener.toJS, disconnect: _disconnect.toJS, - enable: _enable.toJS); + enable: _enable.toJS, + cancelAllListener: _cancelAllListeners.toJS, + onWalletRequest: _onWalletRequest.toJS); return ProxyMethodHandler(eip); } @@ -34,48 +30,44 @@ class EthereumPageController extends PageNetworkController { jsConsole.error(message); } - void onEvent(JSWalletMessageResponseEthereum message) { - final JSWalletMessageResponseEthereum eventMessage = message.cast(); - JSAny? eventData; - switch (eventMessage.event) { - case EthereumEventTypes.connect: - final connectionInfo = - ProviderConnectInfo.fromJson(eventMessage.dataAs()); + void onEvent(WalletMessageEvent message) { + JSAny? eventData = message.data; + switch (message.eventType) { + case JSEventType.connect: + final connectionInfo = ProviderConnectInfo.fromJson(message.asMap()); eventData = connectionInfo.toJSEvent; _ethereum?.object.chainId = connectionInfo.chainId; _ethereum?.object.networkVersion = connectionInfo.netVersion.toString(); break; - case EthereumEventTypes.chainChanged: - final connectionInfo = - ProviderConnectInfo.fromJson(eventMessage.dataAs()); + case JSEventType.chainChanged: + final connectionInfo = ProviderConnectInfo.fromJson(message.asMap()); eventData = connectionInfo.chainId.jsify(); _ethereum?.object.chainId = connectionInfo.chainId; _ethereum?.object.networkVersion = connectionInfo.netVersion.toString(); break; - case EthereumEventTypes.disconnect: + case JSEventType.disconnect: _ethereum?.object.chainId = null; _ethereum?.object.networkVersion = null; _ethereum?.object.selectedAddress = null; break; - case EthereumEventTypes.accountsChanged: - final changeInfo = - EthereumAccountsChanged.fromJson(eventMessage.dataAs()); + case JSEventType.accountsChanged: + final changeInfo = EthereumAccountsChanged.fromJson(message.asMap()); eventData = changeInfo.toJSEvent; _ethereum?.object.selectedAddress = changeInfo.defaultAddress?.toJS; break; - case EthereumEventTypes.disable: - _disable(eventMessage.dataAs()); + case JSEventType.disable: + _disable(message.asString()); break; - case EthereumEventTypes.active: + case JSEventType.active: _init(); break; default: } - _eventListeners(eventMessage.event, jsObject: eventData); + _eventListeners(message.eventType, jsObject: eventData); } - void _eventListeners(EthereumEventTypes type, {JSAny? jsObject}) { + void _eventListeners(JSEventType type, {JSAny? jsObject}) { if (jsObject == null || !_listeners.containsKey(type)) return; final listeners = [..._listeners[type]!]; for (final i in listeners) { @@ -86,17 +78,20 @@ class EthereumPageController extends PageNetworkController { void _disconnect() {} void _addListener(String type, JSFunction listener) { - final event = EthereumEventTypes.fromName(type); + final event = JSEventType.fromName(type); if (event == null) return; _listeners[event]?.add(listener); - if (event != EthereumEventTypes.message && - event != EthereumEventTypes.disconnect) { - getWalletMessage(ClientMessageEthereum.event(event)); + _emitEvent(PageMessageEvent.build(event: event)); + } + + void _cancelAllListeners() { + for (final i in _listeners.keys.toList()) { + _listeners[i]!.clear(); } } void _removeListener(String type, JSFunction listener) { - final event = EthereumEventTypes.fromName(type); + final event = JSEventType.fromName(type); _listeners[event]?.remove(listener); } @@ -106,9 +101,14 @@ class EthereumPageController extends PageNetworkController { } JSPromise _onRequest(EthereumRequestParams params) { - final message = ClientMessageEthereum( - method: params.method, params: params.params?.dartify()); - final promise = getWalletMessage(message).toPromise; + final message = PageMessageRequest.create( + method: params.method, + params: params.params, + id: (_requestId++).toString()); + final promise = _onNetworkRequest(message).toPromise; return promise; } + + @override + JSClientType get _client => JSClientType.ethereum; } diff --git a/mrt_wallet/js/js_wallet/page_script/networks/solana.dart b/mrt_wallet/js/js_wallet/page_script/networks/solana.dart index c720a1b3..b97876e2 100644 --- a/mrt_wallet/js/js_wallet/page_script/networks/solana.dart +++ b/mrt_wallet/js/js_wallet/page_script/networks/solana.dart @@ -1,23 +1,9 @@ part of '../scripts.dart'; -class _SolanaPageControllerConst { - static const String signTransaction = "solana_signTransaction"; - static const String requestAccounts = "solana_requestAccounts"; - static const String signMessage = "solana_signMessage"; -} - class SolanaPageController extends PageNetworkController { - SolanaPageController({required super.getWalletMessage}); + SolanaPageController(); ProxyMethodHandler? _solana; - final Map> _listeners = { - SolanaEventTypes.connect: [], - SolanaEventTypes.message: [], - SolanaEventTypes.disconnect: [], - SolanaEventTypes.chainChanged: [], - SolanaEventTypes.accountsChanged: [], - }; - - void _init() { + ProxyMethodHandler _createAdapter() { final adapter = SolanaWalletAdapter.setup(); adapter.signTransaction = _signTranaction.toJS; adapter.signAllTransactions = _signAllTransactions.toJS; @@ -28,35 +14,39 @@ class SolanaPageController extends PageNetworkController { adapter.signMessage = _signMessage.toJS; adapter.connect = _connect.toJS; adapter.isConnected = false; - final handler = ProxyMethodHandler(adapter); - final proxy = Proxy(handler.object, createJSInteropWrapper(handler)); - _solana = handler; - solana = proxy; + adapter.on = _addListener.toJS; + adapter.cancelListener = _removeListener.toJS; + adapter.sendWalletRequest = _buildWalletRequest.toJS; + return ProxyMethodHandler(adapter); } - JSPromise _signMessage(JSUint8Array transaction) { - final result = _personalSign(transaction); - return result.toPromise; + void _init() { + _solana ??= _createAdapter(); + final proxy = Proxy(_solana!.object, createJSInteropWrapper(_solana!)); + solana = proxy; } - Future _personalSign( - JSUint8Array transaction) async { - final result = await getWalletMessage(ClientMessageSolana( - method: _SolanaPageControllerConst.signMessage, - params: transaction.toListInt())); - final data = JSUint8Array.from(result); - - return JSSolanaSignMessageResponse(signature: data); + JSPromise _signMessage(JSAny? message) { + return _onNetworkRequest(PageMessageRequest.create( + method: Web3SolanaConst.signMessage, params: [message].toJS)) + .then((e) { + return JSSolanaSignMessageResponse.fromJson((e.dartify() as Map).cast()); + }).toPromise; } JSPromise _signTranaction(JSSolanaTransaction transaction) { - return _buildTransaction(transactions: [transaction].toJS, batch: false) + return _buildTransaction( + transactions: [transaction].toJS, + method: Web3SolanaConst.signTransaction) .toPromise; } JSPromise _signAllTransactions( JSArray transaction) { - return _buildTransaction(transactions: transaction, batch: true).toPromise; + return _buildTransaction( + transactions: transaction, + method: Web3SolanaConst.signAllTransactions) + .toPromise; } JSPromise _signAndSendTransaction(JSSolanaTransaction transaction, @@ -64,7 +54,7 @@ class SolanaPageController extends PageNetworkController { return _buildTransaction( transactions: [transaction].toJS, option: options ?? JSSolanaTranasctionSendOptions.defaulConfig(), - batch: false) + method: Web3SolanaConst.sendTransaction) .toPromise; } @@ -74,81 +64,164 @@ class SolanaPageController extends PageNetworkController { return _buildTransaction( transactions: transaction, option: options ?? JSSolanaTranasctionSendOptions.defaulConfig(), - batch: true) + method: Web3SolanaConst.sendAllTransactions) .toPromise; } - Future _buildTransaction( - {required JSArray transactions, - JSSolanaTranasctionSendOptions? option, - required bool batch}) async { - final toDart = transactions.toDart; - final messages = List.generate(toDart.length, (index) { - return ClientSolanaTransactionMessage( - id: index, - message: toDart[index].transactionSerialize(), - sendOption: option?.toJson()); - }); - final Completer completer = Completer(); - final result = getWalletMessage(ClientMessageSolana( - method: _SolanaPageControllerConst.signTransaction, - params: messages.map((e) => e.toJson()).toList())); - result.catchError((e) { - completer.completeError(e); - return null; - }); - result.then((e) { - final response = - (e.dartify() as List).map((e) => Map.from(e)); - final results = response - .map((e) => SolanaWeb3TransactionResponse.fromJson(e)) - .toList(); - if (option != null) { - final List txHash = List.generate(toDart.length, (e) => null); - for (final i in results) { - switch (i.type) { - case SolanaWeb3TransactionResponseType.send: - final message = - results[i.id].cast(); - txHash[i.id] = message.txHash; - break; - default: - } + JSPromise _buildWalletRequest(Web3JSRequestParams request) { + switch (request.method) { + case Web3SolanaConst.requestAccounts: + return _onWalletRequest(request); + case Web3SolanaConst.signMessage: + final message = PageMessageRequest.create( + method: request.method, + params: request.params, + id: request.id ?? (_id++).toString()); + return _onWalletRequest_(message).then((e) { + if (e.error != null) return e; + return WalletResponseSuccess( + result: JSSolanaSignMessageResponse.fromJson( + (e.result.dartify() as Map).cast()), + id: e.id); + }).toPromise; + default: + return _toWalletRequest(request).toPromise; + } + } + + Future _toWalletRequest(Web3JSRequestParams request) async { + final method = Web3SolanaRequestMethods.fromName(request.method); + String id = request.id ?? (_id++).toString(); + if (method == null) { + return WalletResponseError( + error: JSWalletError.fromJson( + message: Web3RequestExceptionConst.methodDoesNotExist.toJson()), + id: id); + } + final params = request.params; + if (params == null || params.length == 0) { + return WalletResponseError( + error: JSWalletError.fromJson( + message: Web3SolanaExceptionConstant.invalidTransaction.toJson()), + id: id); + } + List transactions = []; + JSSolanaTranasctionSendOptions? options; + switch (method) { + case Web3SolanaRequestMethods.sendAllTransactions: + case Web3SolanaRequestMethods.signAllTransactions: + final JSArray? items = params.elemetAt(0); + if (items == null) { + return WalletResponseError( + error: JSWalletError.fromJson( + message: Web3SolanaExceptionConstant + .invalidBatchTransactionRequest + .toJson()), + id: id); } - if (batch) { - completer.complete(txHash.map((e) => e?.toJS).toList().toJS); - } else { - completer.complete(txHash.first?.toJS); + transactions.addAll(items.toDart); + if (method == Web3SolanaRequestMethods.sendAllTransactions) { + options = params.elemetAt(1); + options ??= JSSolanaTranasctionSendOptions.defaulConfig(); } - } else { - for (final i in results) { - switch (i.type) { - case SolanaWeb3TransactionResponseType.sign: - final message = i.cast(); - toDart[i.id].addSignature( - JSSolanaPublicKey( - base58: message.signer, - bytes: message.signerAddressBytes) - .toJS, - JSUint8Array.from(message.signature.jsify())); - break; - default: - } + break; + case Web3SolanaRequestMethods.sendTransaction: + case Web3SolanaRequestMethods.signTransaction: + final JSSolanaTransaction? item = params.elemetAt(0); + if (item == null) { + return WalletResponseError( + error: JSWalletError.fromJson( + message: + Web3SolanaExceptionConstant.invalidTransaction.toJson()), + id: id); } - if (batch) { - completer.complete(List.from(toDart).toJS); - } else { - completer.complete(toDart[0]); + transactions.add(item); + if (method == Web3SolanaRequestMethods.sendTransaction) { + options = params.elemetAt(1); + options ??= JSSolanaTranasctionSendOptions.defaulConfig(); } + break; + default: + return WalletResponseError( + error: JSWalletError.fromJson( + message: Web3RequestExceptionConst.methodDoesNotExist.toJson()), + id: id); + } + final result = _onWalletRequest_(PageMessageRequest.create( + method: request.method, + params: + transactions.map((e) => e.transactionSerialize()).toList().toJS, + additionalData: options, + id: id)) + .then((e) { + if (e.error != null) { + return e; } + return WalletResponseSuccess( + id: e.id, + result: _onTransactionResponse( + method: request.method, + transactions: transactions.toJS, + result: e.result)); + }); + return result.toPromise; + } + + Future _buildTransaction( + {required JSArray transactions, + JSSolanaTranasctionSendOptions? option, + required String method}) async { + final message = + transactions.toDart.map((e) => e.transactionSerialize()).toList(); + final result = _onNetworkRequest(PageMessageRequest.create( + method: method, params: message.toJS, additionalData: option)) + .then((e) { + return _onTransactionResponse( + method: method, transactions: transactions, result: e); }); - return completer.future; + return result.toPromise; + } + + JSAny? _onTransactionResponse( + {required String method, + required JSArray transactions, + JSAny? result}) { + switch (method) { + case Web3SolanaConst.signTransaction: + case Web3SolanaConst.signAllTransactions: + final List toDart = + (result.dartify() as List).map((e) { + if (e == null) return null; + return JSSolanaSignTransactionResponse.fromJson((e as Map).cast()); + }).toList(); + for (int i = 0; i < transactions.length; i++) { + final signature = toDart.elementAt(i); + if (signature == null) continue; + transactions[i]?.addSignature( + JSSolanaPublicKey( + base58: signature.address, bytes: signature.addressBytes) + .toJS, + JSUint8Array.fromList(signature.signature)); + } + if (method == Web3SolanaConst.signTransaction) { + return transactions[0]; + } + return transactions; + case Web3SolanaConst.requestAccounts: + case Web3SolanaConst.sendTransaction: + case Web3SolanaConst.sendAllTransactions: + return result; + default: + return null; + } } JSPromise _connect() { - const params = - ClientMessageSolana(method: _SolanaPageControllerConst.requestAccounts); - return _onRequest(params); + final params = PageMessageRequest.create( + method: Web3SolanaConst.requestAccounts, + ); + final promise = _onNetworkRequest(params).toPromise; + return promise; } void _disable(String? message) { @@ -156,48 +229,45 @@ class SolanaPageController extends PageNetworkController { jsConsole.error(message); } - void onEvent(JSWalletMessageResponseSolana message) { - final JSWalletMessageResponseSolana eventMessage = message.cast(); - JSAny? eventData; - switch (eventMessage.event) { - case SolanaEventTypes.connect: - final changeInfo = - SolanaAccountsChanged.fromJson(eventMessage.dataAs()); + void onEvent(WalletMessageEvent message) { + JSAny? eventData = message.data; + switch (message.eventType) { + case JSEventType.connect: + final changeInfo = SolanaAccountsChanged.fromJson(message.asMap()); final addr = changeInfo.toJSPublicKey()?.toJS; - eventData = addr; + eventData = changeInfo.connectInfo.toJS; _solana?.object.publicKey = addr; _solana?.object.isConnected = addr != null; break; - case SolanaEventTypes.chainChanged: - final changeInfo = - SolanaProviderConnectInfo.fromJson(eventMessage.dataAs()); + case JSEventType.chainChanged: + final changeInfo = SolanaProviderConnectInfo.fromJson(message.asMap()); eventData = changeInfo.toJS; break; - case SolanaEventTypes.accountsChanged: - final changeInfo = - SolanaAccountsChanged.fromJson(eventMessage.dataAs()); + case JSEventType.accountsChanged: + final changeInfo = SolanaAccountsChanged.fromJson(message.asMap()); final addr = changeInfo.defaultAddress?.toJS; - eventData = changeInfo.accounts.map((e) => e.toJS).toList().toJS; + eventData = changeInfo.accountJS; + _solana?.object.selectedAddress = changeInfo.defaultAddress?.toJS; _solana?.object.publicKey = changeInfo.toJSPublicKey()?.toJS; _solana?.object.isConnected = addr != null; break; - case SolanaEventTypes.disconnect: + case JSEventType.disconnect: _solana?.object.publicKey = null; _solana?.object.isConnected = false; break; - case SolanaEventTypes.disable: - _disable(eventMessage.dataAs()); + case JSEventType.disable: + _disable(message.asString()); return; - case SolanaEventTypes.active: + case JSEventType.active: _init(); return; default: return; } - _eventListeners(eventMessage.event, jsObject: eventData); + _eventListeners(message.eventType, jsObject: eventData); } - void _eventListeners(SolanaEventTypes type, {JSAny? jsObject}) { + void _eventListeners(JSEventType type, {JSAny? jsObject}) { if (!_listeners.containsKey(type)) return; final listeners = [..._listeners[type]!]; for (final i in listeners) { @@ -206,22 +276,17 @@ class SolanaPageController extends PageNetworkController { } void _addListener(String type, JSFunction listener) { - final event = SolanaEventTypes.fromName(type); + final event = JSEventType.fromName(type); if (event == null || !_listeners.containsKey(event)) return; _listeners[event]?.add(listener); - if (event != SolanaEventTypes.message && - event != SolanaEventTypes.disconnect) { - getWalletMessage(ClientMessageSolana.event(event)); - } + _emitEvent(PageMessageEvent.build(event: event)); } void _removeListener(String type, JSFunction listener) { - final event = SolanaEventTypes.fromName(type); + final event = JSEventType.fromName(type); _listeners[event]?.remove(listener); } - JSPromise _onRequest(ClientMessageSolana params) { - final promise = getWalletMessage(params).toPromise; - return promise; - } + @override + JSClientType get _client => JSClientType.solana; } diff --git a/mrt_wallet/js/js_wallet/page_script/networks/ton.dart b/mrt_wallet/js/js_wallet/page_script/networks/ton.dart new file mode 100644 index 00000000..878ce261 --- /dev/null +++ b/mrt_wallet/js/js_wallet/page_script/networks/ton.dart @@ -0,0 +1,94 @@ +part of '../scripts.dart'; + +class TonPageController extends PageNetworkController { + TonPageController(); + ProxyMethodHandler? _ton; + ProxyMethodHandler _createAdapter() { + final adapter = TonWalletAdapter(JSObject()); + adapter.enable = _requestAccount.toJS; + adapter.on = _addListener.toJS; + adapter.on = _addListener.toJS; + + adapter.removeListener = _removeListener.toJS; + adapter.cancelListener = _removeListener.toJS; + adapter.sendWalletRequest = _onWalletRequest.toJS; + adapter.cancelAllListener = _cancelAllListeners.toJS; + return ProxyMethodHandler(adapter); + } + + void _init() { + _ton ??= _createAdapter(); + final proxy = Proxy(_ton!.object, createJSInteropWrapper(_ton!)); + ton = proxy; + } + + JSPromise _requestAccount() { + final params = Web3JSRequestParams(method: "ton_requestAccounts"); + return _onWalletRequest(params); + } + + void _disable(String? message) { + ton = null; + jsConsole.error(message); + } + + void onEvent(WalletMessageEvent message) { + JSAny? eventData = message.data; + switch (message.eventType) { + case JSEventType.connect: + final chainChange = TonChainChanged.fromJson(message.asMap()); + eventData = chainChange.workChain.toJS; + break; + case JSEventType.chainChanged: + final chainChange = TonChainChanged.fromJson(message.asMap()); + eventData = chainChange.toJS; + break; + case JSEventType.accountsChanged: + final chainChange = TonAccountsChanged.fromJson(message.asMap()); + eventData = chainChange.accountJS; + _ton?.object.selectedAddress = chainChange.defaultAddress?.toJS; + break; + case JSEventType.disconnect: + _ton?.object.selectedAddress = null; + break; + case JSEventType.disable: + _disable(message.asString()); + return; + case JSEventType.active: + _init(); + return; + default: + return; + } + _eventListeners(message.eventType, jsObject: eventData); + } + + void _eventListeners(JSEventType type, {JSAny? jsObject}) { + if (!_listeners.containsKey(type)) return; + final listeners = [..._listeners[type]!]; + for (final i in listeners) { + i.callAsFunction(i, jsObject); + } + } + + void _addListener(String type, JSFunction listener) { + final event = JSEventType.fromName(type); + if (event == null || !_listeners.containsKey(event)) return; + _listeners[event]?.add(listener); + _emitEvent(PageMessageEvent.build(event: event)); + } + + void _removeListener(String type, JSFunction listener) { + final event = JSEventType.fromName(type); + _listeners[event]?.remove(listener); + } + + void _cancelAllListeners() { + for (final i in _listeners.keys.toList()) { + _listeners[i]!.clear(); + } + } + + @override + JSClientType get _client => JSClientType.ton; +} diff --git a/mrt_wallet/js/js_wallet/page_script/networks/tron.dart b/mrt_wallet/js/js_wallet/page_script/networks/tron.dart index 7fa5d973..cad5fe3e 100644 --- a/mrt_wallet/js/js_wallet/page_script/networks/tron.dart +++ b/mrt_wallet/js/js_wallet/page_script/networks/tron.dart @@ -1,16 +1,18 @@ part of '../scripts.dart'; +class _TronPageControllerConst { + static const String signMessage = "tron_signMessageV2"; + static const String signTransaction = "tron_signTransaction"; + static const String requestAccount = "tron_requestAccounts"; + static const String providedPrivateKeyError = + "Please use static method `TronWeb.TRX.sign` for signing with own private key"; +} + class TronPageController extends PageNetworkController { ProxyMethodHandler? _tron; ProxyMethodHandler? _tronWeb; - TronPageController({required super.getWalletMessage}); - final Map> _listeners = { - TronEventTypes.accountsChanged: [], - TronEventTypes.chainChanged: [], - TronEventTypes.connect: [], - TronEventTypes.message: [], - TronEventTypes.disconnect: [], - }; + TronPageController(); + ProxyMethodHandler _setupTIP1193(Proxy tronWeb) { final eip = TIP1193.setup( request: _onRequest.toJS, @@ -18,11 +20,17 @@ class TronPageController extends PageNetworkController { removeListener: _removeListener.toJS, disconnect: _disconnect.toJS, tronWeb: tronWeb, - enable: _enable.toJS); + enable: _enable.toJS, + cancelAllListener: _cancelAllListeners.toJS, + sendWalletRequest: _onWalletRequest.toJS); return ProxyMethodHandler(eip); } void _init(TronWebNodeInfo info) { + if (_tron != null && _tronWeb != null) { + final proxy = Proxy(_tron!.object, createJSInteropWrapper(_tron!)); + tron = proxy; + } if (_tron != null) { _tronWeb?.object.fullNode = HttpProvider(info.fullNode); _tronWeb?.object.solidityNode = HttpProvider(info.fullNode); @@ -41,7 +49,7 @@ class TronPageController extends PageNetworkController { tronWeb.setHeader = _disabledFeature.toJS; tronWeb.setFullNodeHeader = _disabledFeature.toJS; tronWeb.setDefaultBlock = _disabledFeature.toJS; - tronWeb.trxx = Proxy(tronWeb.trx, createJSInteropWrapper(trxHandler)); + tronWeb.trx_ = Proxy(tronWeb.trx, createJSInteropWrapper(trxHandler)); final tronWebMethodHandler = ProxyMethodHandler(tronWeb); final adapter = _setupTIP1193(Proxy(tronWebMethodHandler.object, createJSInteropWrapper(tronWebMethodHandler))); @@ -52,25 +60,38 @@ class TronPageController extends PageNetworkController { } void _disabledFeature(JSAny? args) { - throw Exception("this feature disabled by wallet provider."); + throw JSWalletError(message: "this feature disabled by wallet provider."); } - JSPromise _signMessageV2_(JSAny message) { - final params = - TronRequestParams(method: "tron_signMessageV2", params: message); - return _onRequest(params); + JSPromise _signMessageV2_(JSAny message, [String? privateKey]) { + if (privateKey != null) { + throw JSWalletError( + message: _TronPageControllerConst.providedPrivateKeyError); + } + + return _sendRequest( + method: _TronPageControllerConst.signMessage, + params: message.dartify()); } - JSPromise _signTransaction_(JSAny message) { - final params = - TronRequestParams(method: "tron_signTransaction", params: message); - return _onRequest(params); + JSPromise _signTransaction_(JSAny message, [String? privateKey]) { + if (privateKey != null) { + throw JSWalletError( + message: _TronPageControllerConst.providedPrivateKeyError); + } + return _sendRequest( + method: _TronPageControllerConst.signTransaction, + params: message.dartify()); } - JSPromise _multiSign(JSAny message) { - final params = - TronRequestParams(method: "tron_signTransaction", params: message); - return _onRequest(params); + JSPromise _multiSign(JSAny message, [String? privateKey]) { + if (privateKey != null) { + throw JSWalletError( + message: _TronPageControllerConst.providedPrivateKeyError); + } + return _sendRequest( + method: _TronPageControllerConst.signTransaction, + params: message.dartify()); } void _disableProvider(String? message) { @@ -78,45 +99,47 @@ class TronPageController extends PageNetworkController { jsConsole.error(message); } - void onEvent(JSWalletMessageResponseTron eventMessage) { - JSAny? eventData; - switch (eventMessage.event) { - case TronEventTypes.connect: - final connectionInfo = - ProviderConnectInfo.fromJson(eventMessage.dataAs()); + void onEvent(WalletMessageEvent message) { + JSAny? eventData = message.data; + switch (message.eventType) { + case JSEventType.connect: + final connectionInfo = TronChainChanged.fromJson(message.asMap()); _tron?.object.chainId = connectionInfo.chainId; eventData = connectionInfo.toJSEvent; break; - case TronEventTypes.chainChanged: - final connectionInfo = - ProviderConnectInfo.fromJson(eventMessage.dataAs()); + case JSEventType.chainChanged: + final connectionInfo = TronChainChanged.fromJson(message.asMap()); _tron?.object.chainId = connectionInfo.chainId; + _tronWeb?.object.fullNode = HttpProvider(connectionInfo.fullNode); + _tronWeb?.object.solidityNode = HttpProvider(connectionInfo.fullNode); eventData = connectionInfo.chainId.jsify(); break; - case TronEventTypes.disconnect: + case JSEventType.disconnect: _tron?.object.chainId = null; + _tronWeb?.object.defaultAddress = null; break; - case TronEventTypes.accountsChanged: - final changeInfo = TronAccountsChanged.fromJson(eventMessage.dataAs()); + case JSEventType.accountsChanged: + final changeInfo = TronAccountsChanged.fromJson(message.asMap()); _tronWeb?.object.defaultAddress = changeInfo.defaultAddress == null ? null : createJSInteropWrapper(changeInfo.defaultAddress!); + _tron?.object.selectedAddress = changeInfo.defaultAddress?.base58.toJS; eventData = changeInfo.toJSEvent; break; - case TronEventTypes.disable: - _disableProvider(eventMessage.dataAs()); + case JSEventType.disable: + _disableProvider(message.asString()); break; - case TronEventTypes.active: - final info = TronWebNodeInfo.fromJson(eventMessage.dataAs()); + case JSEventType.active: + final info = TronWebNodeInfo.fromJson(message.asMap()); _init(info); break; default: } - _eventListeners(eventMessage.event, jsObject: eventData); + _eventListeners(message.eventType, jsObject: eventData); } - void _eventListeners(TronEventTypes type, {JSAny? jsObject}) { - if (type == TronEventTypes.disconnect) return; + void _eventListeners(JSEventType type, {JSAny? jsObject}) { + if (type == JSEventType.disconnect) return; if (jsObject == null || !_listeners.containsKey(type)) return; final listeners = [..._listeners[type]!]; for (final i in listeners) { @@ -127,29 +150,43 @@ class TronPageController extends PageNetworkController { void _disconnect() {} void _addListener(String type, JSFunction listener) { - final event = TronEventTypes.fromName(type); + final event = JSEventType.fromName(type); if (event == null) return; _listeners[event]?.add(listener); - if (event != TronEventTypes.message && event != TronEventTypes.disconnect) { - getWalletMessage(ClientMessageTron.event(event)); - } + _emitEvent(PageMessageEvent.build(event: event)); } void _removeListener(String type, JSFunction listener) { - final event = TronEventTypes.fromName(type); + final event = JSEventType.fromName(type); _listeners[event]?.remove(listener); } + void _cancelAllListeners() { + for (final i in _listeners.keys.toList()) { + _listeners[i]!.clear(); + } + } + JSPromise _enable() { - final params = TronRequestParams(method: "eth_requestAccounts"); - return _onRequest(params); + return _sendRequest(method: _TronPageControllerConst.requestAccount); + } + + JSPromise _sendRequest({required String method, Object? params}) { + final message = PageMessageRequest.create( + method: method, params: [params?.jsify()].toJS); + final promise = _onNetworkRequest(message).toPromise; + + return promise; } - JSPromise _onRequest(TronRequestParams params) { - final message = ClientMessageTron( - method: params.method, params: params.params?.dartify()); - final promise = getWalletMessage(message).toPromise; + JSPromise _onRequest(EthereumRequestParams params) { + final message = + PageMessageRequest.create(method: params.method, params: params.params); + final promise = _onNetworkRequest(message).toPromise; return promise; } + + @override + JSClientType get _client => JSClientType.tron; } diff --git a/mrt_wallet/js/js_wallet/page_script/scripts.dart b/mrt_wallet/js/js_wallet/page_script/scripts.dart index e75b3c8b..9f36713a 100644 --- a/mrt_wallet/js/js_wallet/page_script/scripts.dart +++ b/mrt_wallet/js/js_wallet/page_script/scripts.dart @@ -1,6 +1,5 @@ import 'dart:js_interop'; -import 'package:mrt_wallet/wallet/models/networks/solana/models/transaction_response_info.dart'; - +import 'package:mrt_wallet/wallet/web3/web3.dart'; import '../models/models.dart'; import '../utils/utils.dart'; import 'dart:async'; @@ -11,3 +10,4 @@ part 'networks/eth.dart'; part 'networks/tron.dart'; part 'controller/controller.dart'; part 'networks/solana.dart'; +part 'networks/ton.dart'; diff --git a/mrt_wallet/js/js_wallet/utils/utils.dart b/mrt_wallet/js/js_wallet/utils/utils.dart index 2c3cd7fa..34eb4558 100644 --- a/mrt_wallet/js/js_wallet/utils/utils.dart +++ b/mrt_wallet/js/js_wallet/utils/utils.dart @@ -1,2 +1,2 @@ -export 'utils/promise.dart'; +export 'utils/extensions.dart'; export 'utils/utils.dart'; diff --git a/mrt_wallet/js/js_wallet/utils/utils/promise.dart b/mrt_wallet/js/js_wallet/utils/utils/extensions.dart similarity index 88% rename from mrt_wallet/js/js_wallet/utils/utils/promise.dart rename to mrt_wallet/js/js_wallet/utils/utils/extensions.dart index 07753565..fba5b4b6 100644 --- a/mrt_wallet/js/js_wallet/utils/utils/promise.dart +++ b/mrt_wallet/js/js_wallet/utils/utils/extensions.dart @@ -18,3 +18,7 @@ extension WalletPromise on Future { }.toJS); } } + +extension QuickJS on JSAny { + external bool hasOwnProperty(String prop); +} diff --git a/mrt_wallet/js/js_wallet/utils/utils/utils.dart b/mrt_wallet/js/js_wallet/utils/utils/utils.dart index ac458886..c780ded8 100644 --- a/mrt_wallet/js/js_wallet/utils/utils/utils.dart +++ b/mrt_wallet/js/js_wallet/utils/utils/utils.dart @@ -1,13 +1,41 @@ +import 'dart:js_interop'; + import 'package:blockchain_utils/utils/string/string.dart'; +import 'package:mrt_native_support/web/mrt_native_web.dart'; class JsUtils { - static Map toMap(dynamic object, {Object? error}) { + static int compareAddress(String a, String b, String? defaultAddress) { + if (a == defaultAddress) { + return -1; + } else if (b == defaultAddress) { + return 1; + } + return a.compareTo(b); + } + + static Map convertMap(Map map) { + map.forEach((key, value) { + if (value is Map) { + map[key] = convertMap(value); + } + }); + return Map.from(map); + } + + static Map toMap(dynamic object, {Object? error}) { // if (obj == null) return null; try { - if (object is String) { - object = StringUtils.toJson(object); + if (object is JSAny) { + try { + if (!object.isA()) { + object = jsJson.stringify(object); + } + } catch (_) {} + } + if (object is! String) { + object = StringUtils.fromJson(object); } - return Map.from(object); + return StringUtils.toJson(object); } catch (e) { if (error != null) throw error; rethrow; diff --git a/mrt_wallet/js/js_wallet/wallet/core/network_handler.dart b/mrt_wallet/js/js_wallet/wallet/core/network_handler.dart index 88a2f234..e2326b80 100644 --- a/mrt_wallet/js/js_wallet/wallet/core/network_handler.dart +++ b/mrt_wallet/js/js_wallet/wallet/core/network_handler.dart @@ -1,7 +1,10 @@ +import 'dart:js_interop'; + import 'package:mrt_wallet/app/synchronized/basic_lock.dart'; -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; +import 'package:mrt_wallet/wallet/provider/wallet_provider.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; import '../../models/models/requests.dart'; @@ -32,22 +35,49 @@ abstract class ChainWeb3State< abstract class JSNetworkHandler< NETWORKADDRESS, CHAIN extends APPCHAINNETWORK, - WEB3CHAIN extends Web3ChainNetwork, - MESSAGE extends PageMessage, + CHAINACCOUNT extends Web3ChainAccount, + WEB3CHAIN extends Web3Chain, + // MESSAGE extends PageMessage, STATE extends ChainWeb3State> { JSNetworkHandler({required this.sendMessageToClient}); final SynchronizedLock lock = SynchronizedLock(); STATE get state; - Future request(MESSAGE message); - Web3MessageCore finilize(MESSAGE request, Web3MessageCore response); + Future request(PageMessageRequest message); + + void event(PageMessageEvent event); + + void onRequestDone(PageMessageRequest message); + + WalletMessageResponse finilizeError( + {required PageMessageRequest message, + required Web3RequestParams? params, + required Web3ExceptionMessage error}) { + return WalletMessageResponse.fail(error.toJson().jsify()); + } + + WalletMessageResponse finilizeResponse( + {required PageMessageRequest message, + required Web3ResponseMessage response}) { + return WalletMessageResponse.success(response.result.jsify()); + } + + WalletMessageResponse finilizeWalletResponse( + {required PageMessageRequest message, + required Web3RequestParams params, + required Web3WalletResponseMessage response}) { + return WalletMessageResponse.success(response.result.jsify()); + } - void onRequestDone(MESSAGE message); final SendMessageToClient sendMessageToClient; abstract final NetworkType networkType; Web3ResponseMessage buildResponse(Object? result) { return Web3ResponseMessage(result: result, network: networkType); } + + void initChain( + {required Web3APPAuthentication authenticated, + required ChainsHandler chainHandler}); } enum JSNetworkState { diff --git a/mrt_wallet/js/js_wallet/wallet/core/wallet.dart b/mrt_wallet/js/js_wallet/wallet/core/wallet.dart index e7962224..92af4610 100644 --- a/mrt_wallet/js/js_wallet/wallet/core/wallet.dart +++ b/mrt_wallet/js/js_wallet/wallet/core/wallet.dart @@ -13,19 +13,26 @@ import '../../utils/utils.dart'; import 'package:mrt_native_support/web/mrt_native_web.dart'; import '../networks/ethereum.dart'; import '../networks/solana.dart'; +import '../networks/ton.dart'; import '../networks/tron.dart'; +import 'network_handler.dart'; part "../webview.dart"; -part "../extention.dart"; +part "../extension.dart"; -typedef SendMessageToClient = void Function(JSWalletMessage); +typedef SendMessageToClient = void Function( + WalletMessageEvent, JSClientType client); + +extension _FindClient on JSClientType {} abstract class JSWalletHandler { - late final JSEthereumHandler ethereumHandler = - JSEthereumHandler(sendMessageToClient: _sendMessageToClient); - late final JSTronHandler tronHandler = - JSTronHandler(sendMessageToClient: _sendMessageToClient); - late final JSSolanaHandler solanaHandler = - JSSolanaHandler(sendMessageToClient: _sendMessageToClient); + late final Map _networks = { + JSClientType.ethereum: + JSEthereumHandler(sendMessageToClient: _sendEventToClient), + JSClientType.tron: JSTronHandler(sendMessageToClient: _sendEventToClient), + JSClientType.solana: + JSSolanaHandler(sendMessageToClient: _sendEventToClient), + JSClientType.ton: JSTonHandler(sendMessageToClient: _sendEventToClient) + }; String get clientId; late final String _id = JsUtils.toWalletId(clientId); @@ -35,24 +42,46 @@ abstract class JSWalletHandler { JSWalletHandler._(this._crypto); void _onClientEvent(CustomEvent response) { - final JSPageRequest request = - JSPageRequest.deserialize(bytes: response.detailBytes()); - final result = _completeJsRequest(request); - result.then(_sendMessageToClient); + final PageMessage request = response.detail as PageMessage; + switch (request.data.messageType) { + case PageMessageType.event: + _networks[request.clientType]?.event(request.data.cast()); + break; + case PageMessageType.request: + final result = _completeJsRequest(request); + result.then(_sendMessageToClient); + result.catchError((e) { + final message = WalletMessage.response( + client: request.clientType, + requestId: request.id, + id: request.data.cast().id, + data: WalletMessageResponse.fail( + Web3RequestExceptionConst.internalError.toJson().jsify())); + _sendMessageToClient(message); + return message; + }); + break; + default: + throw UnimplementedError("Invalid page request."); + } } void _listenOnClients() { jsWindow.addEventListener(_id, _onClientEvent.toJS); } - void _sendMessageToClient(JSWalletMessage response) { + void _sendMessageToClient(WalletMessage response) { final event = CustomEvent.create( type: JsUtils.toEthereumClientId(clientId), - data: response.toCbor().encode(), + eventData: response, clone: true); jsWindow.dispatchEvent(event); } + void _sendEventToClient(WalletMessageEvent event, JSClientType client) { + _sendMessageToClient(WalletMessage.event(client: client, data: event)); + } + Future _sendMessageToWallet( {required Web3MessageCore message, required String requestId}); @@ -63,17 +92,17 @@ abstract class JSWalletHandler { return Web3EncryptedMessage(message: encryptedBytes, nonce: nonce); } - Future _buildAndSendMessage( - {required JSPageRequest? params, required String requestId}) async { + Future<(Web3MessageCore, Web3RequestParams?)> _buildAndSendMessage( + {required PageMessage params, required JSClientType client}) async { + final request = completer.nextRequest; + final String requestId = request.id; + Web3MessageCore? message; try { - Web3MessageCore message = switch (params?.type) { - JSClientType.ethereum => - await ethereumHandler.request(params!.message.cast()), - JSClientType.tron => await tronHandler.request(params!.message.cast()), - JSClientType.solana => - await solanaHandler.request(params!.message.cast()), - _ => throw Web3RequestExceptionConst.invalidRequest - }; + final handler = _networks[client]; + if (handler == null) { + throw WalletExceptionConst.invalidRequest; + } + message = await handler.request(params.data.cast()); switch (message.type) { case Web3MessageTypes.response: case Web3MessageTypes.walletResponse: @@ -91,84 +120,56 @@ abstract class JSWalletHandler { Web3RequestExceptionConst.internalError.toResponseMessage(); completer.complete(response: exception, requestId: requestId); } + final response = await request.wait; + if (message?.type != Web3MessageTypes.walletRequest) { + return (response, null); + } + return (response, message?.cast()); } - Future _completeJsRequest( - JSPageRequest params) async { + Future _completeJsRequest(PageMessage params) async { + final client = params.clientType; + final handler = _networks[client]; try { - final request = completer.nextRequest; - _buildAndSendMessage(params: params, requestId: request.id); - Web3MessageCore message = await request.wait; - switch (params.type) { - case JSClientType.ethereum: - message = ethereumHandler.finilize(params.message.cast(), message); - break; - case JSClientType.tron: - message = tronHandler.finilize(params.message.cast(), message); - break; - case JSClientType.solana: - message = solanaHandler.finilize(params.message.cast(), message); - break; - default: - } - return switch (message.type) { - Web3MessageTypes.response => JSWalletMessageResponse( - requestId: params.id, - data: message.cast().result, - client: params.type, - status: JSWalletResponseType.success), - Web3MessageTypes.walletResponse => JSWalletMessageResponse( - requestId: params.id, - data: message.cast().result, - client: params.type, - status: JSWalletResponseType.success), - Web3MessageTypes.error => JSWalletMessageResponse( - requestId: params.id, - data: message.cast().toJson(), - client: params.type, - status: JSWalletResponseType.failed), - _ => throw Web3RequestExceptionConst.invalidRequest + final result = await _buildAndSendMessage(params: params, client: client); + final Web3MessageCore response = result.$1; + final Web3RequestParams? request = result.$2; + final WalletMessageResponse message = switch (response.type) { + Web3MessageTypes.response => handler!.finilizeResponse( + message: params.data.cast(), response: response.cast()), + Web3MessageTypes.walletResponse => handler!.finilizeWalletResponse( + message: params.data.cast(), + response: response.cast(), + params: request!), + Web3MessageTypes.error => handler?.finilizeError( + message: params.data.cast(), + error: response.cast(), + params: request) ?? + WalletMessageResponse.fail(response.toJson().jsify()), + _ => WalletMessageResponse.fail( + Web3RequestExceptionConst.invalidRequest.toJson().jsify()) }; + return WalletMessage.response( + requestId: params.id, + id: params.data.cast().id, + client: params.clientType, + data: message); } finally { - switch (params.type) { - case JSClientType.ethereum: - ethereumHandler.onRequestDone(params.message.cast()); - break; - case JSClientType.tron: - tronHandler.onRequestDone(params.message.cast()); - break; - case JSClientType.solana: - solanaHandler.onRequestDone(params.message.cast()); - break; - default: - } + handler?.onRequestDone(params.data.cast()); } } void _updateAuthenticated(Web3APPAuthentication authenticated, {NetworkType? network}) { - switch (network) { - case NetworkType.ethereum: - ethereumHandler.initChain( - chainHandler: _chain, authenticated: authenticated); - break; - case NetworkType.tron: - tronHandler.initChain( - chainHandler: _chain, authenticated: authenticated); - break; - case NetworkType.solana: - solanaHandler.initChain( - chainHandler: _chain, authenticated: authenticated); - break; - default: - tronHandler.initChain( - chainHandler: _chain, authenticated: authenticated); - ethereumHandler.initChain( - chainHandler: _chain, authenticated: authenticated); - solanaHandler.initChain( - chainHandler: _chain, authenticated: authenticated); - break; + final client = JSClientType.fronNetworkName(network?.name); + if (client == JSClientType.global) { + for (final i in _networks.values) { + i.initChain(authenticated: authenticated, chainHandler: _chain); + } + return; } + _networks[client] + ?.initChain(chainHandler: _chain, authenticated: authenticated); } void _handleOnResponse(WalletEvent request) { @@ -179,13 +180,12 @@ abstract class JSWalletHandler { _crypto.decrypt(encryptedMessage.nonce, encryptedMessage.message); final message = Web3MessageCore.deserialize(bytes: decode); switch (message.type) { - case Web3MessageTypes.response: - final Web3ResponseMessage msg = message.cast(); - completer.complete(response: msg, requestId: request.requestId); - break; case Web3MessageTypes.walletResponse: final Web3WalletResponseMessage msg = message.cast(); + if (msg.chain != null) { + _chain = ChainsHandler.deserialize(bytes: msg.chain); + } _updateAuthenticated(msg.authenticated, network: msg.network); completer.complete(response: msg, requestId: request.requestId); break; @@ -196,13 +196,8 @@ abstract class JSWalletHandler { break; case Web3MessageTypes.chains: final Web3ChainMessage msg = message.cast(); - final chains = ChainsHandler.deserialize(bytes: msg.message); - _chain = chains; + _chain = ChainsHandler.deserialize(bytes: msg.message); _updateAuthenticated(msg.authenticated, network: null); - if (msg.response != null) { - completer.complete( - response: msg.response!, requestId: request.requestId); - } break; default: } diff --git a/mrt_wallet/js/js_wallet/wallet/extention.dart b/mrt_wallet/js/js_wallet/wallet/extension.dart similarity index 84% rename from mrt_wallet/js/js_wallet/wallet/extention.dart rename to mrt_wallet/js/js_wallet/wallet/extension.dart index 95eabbfc..d27813f8 100644 --- a/mrt_wallet/js/js_wallet/wallet/extention.dart +++ b/mrt_wallet/js/js_wallet/wallet/extension.dart @@ -17,6 +17,7 @@ class JSExtentionWallet extends JSWalletHandler { @override final String clientId; RuntimePort? _port; + Web3APPAuthentication? _initializeAuthenticated; bool onMessage( JSWalletEvent message, MessageSender sender, JSFunction sendResponse) { @@ -27,8 +28,10 @@ class JSExtentionWallet extends JSWalletHandler { JSExtentionWallet._( {required ChaCha20Poly1305 crypto, required ChainsHandler chain, - required this.clientId}) + required this.clientId, + required Web3APPAuthentication authenticated}) : _chain = chain, + _initializeAuthenticated = authenticated, super._(crypto); static JSExtentionWallet initialize(WalletEvent activationEvent) { @@ -43,13 +46,21 @@ class JSExtentionWallet extends JSWalletHandler { final handler = JSExtentionWallet._( crypto: ChaCha20Poly1305(message.authenticated.token), chain: chain, - clientId: activationEvent.clientId); + clientId: activationEvent.clientId, + authenticated: message.authenticated); handler._listenOnClients(); - extention.runtime.onMessage.addListener(handler.onMessage.toJS); - handler._updateAuthenticated(message.authenticated, network: null); + extension.runtime.onMessage.addListener(handler.onMessage.toJS); + // handler._updateAuthenticated(message.authenticated, network: null); return handler; } + void initClients() { + final auth = _initializeAuthenticated; + if (auth == null) return; + _initializeAuthenticated = null; + _updateAuthenticated(auth, network: null); + } + void _onExtentionPortDiscounect(RuntimePort port) { _portLock.synchronized(() { _port = null; @@ -85,8 +96,8 @@ class JSExtentionWallet extends JSWalletHandler { if (port != null) return port; _port?.disconnect(); _port = null; - final newPort = await _pingPort(extention.runtime - .connect(extention.runtime.id, ConnectConnectionInf(name: clientId))); + final newPort = await _pingPort(extension.runtime + .connect(extension.runtime.id, ConnectConnectionInf(name: clientId))); if (newPort == null) { throw UnimplementedError(); } @@ -107,7 +118,7 @@ class JSExtentionWallet extends JSWalletHandler { if (event?.type != WalletEventTypes.ping) { return false; } - final result = extention.runtime.sendMessage_(message: event!); + final result = extension.runtime.sendMessage_(message: event!); result.then((e) { completer.complete(e); }); @@ -118,20 +129,20 @@ class JSExtentionWallet extends JSWalletHandler { return true; } - final result = extention.runtime.sendMessage_(message: message); + final result = extension.runtime.sendMessage_(message: message); result.then((e) { completer.complete(e); }); result.catchError((e) { _OnBackgroundListener = onMessage.toJS; - extention.runtime.onMessage.addListener(_OnBackgroundListener); + extension.runtime.onMessage.addListener(_OnBackgroundListener); hasListener = true; return null; }); return await completer.future; } finally { if (hasListener) { - extention.runtime.onMessage.removeListener(_OnBackgroundListener); + extension.runtime.onMessage.removeListener(_OnBackgroundListener); } } } diff --git a/mrt_wallet/js/js_wallet/wallet/networks/ethereum.dart b/mrt_wallet/js/js_wallet/wallet/networks/ethereum.dart index a4e6f719..5e9ce75c 100644 --- a/mrt_wallet/js/js_wallet/wallet/networks/ethereum.dart +++ b/mrt_wallet/js/js_wallet/wallet/networks/ethereum.dart @@ -1,3 +1,5 @@ +import 'dart:js_interop'; + import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:on_chain/on_chain.dart'; import 'dart:async'; @@ -39,8 +41,10 @@ class EthereumWeb3State } final chains = chainHandler.chains().whereType().toList(); final currentChain = - chains.firstWhere((e) => e.chainId == permission.currentChain); - final permissionAccounts = permission.currentChainAccounts(currentChain); + chains.firstWhereOrNull((e) => e.chainId == permission.currentChain); + final permissionAccounts = currentChain == null + ? [] + : permission.chainAccounts(currentChain); final defaultAddress = permissionAccounts .firstWhereOrNull((e) => e.defaultAddress, orElse: () { if (permissionAccounts.isEmpty) return null; @@ -52,19 +56,12 @@ class EthereumWeb3State permission: permission, permissionAccounts: permissionAccounts.map((e) => e.addressStr).toList() ..sort( - (a, b) { - if (a == defaultAddress?.addressStr) { - return -1; - } else if (b == defaultAddress?.addressStr) { - return 1; - } - return a.compareTo(b); - }, + (a, b) => JsUtils.compareAddress(a, b, defaultAddress?.addressStr), ), state: JSNetworkState.init, defaultAddress: defaultAddress?.addressStr, chain: currentChain, - client: currentChain.getWeb3Provider( + client: currentChain?.getWeb3Provider( requestTimeout: ChainWeb3State.requestTimeout)); } @@ -87,20 +84,29 @@ class EthereumWeb3State ProviderConnectInfo get chainChangedEvent => ProviderConnectInfo(chain!.chainId); - bool get isConnect => chain != null; + bool get isConnect => client != null; } -class JSEthereumHandler extends JSNetworkHandler { +class JSEthereumHandler extends JSNetworkHandler< + ETHAddress, + EthereumChain, + Web3EthereumChainAccount, + Web3EthereumChain, + // PageMessageRequest, + EthereumWeb3State> { @override EthereumWeb3State state = EthereumWeb3State.init(); JSEthereumHandler({required super.sendMessageToClient}); + void _sendEvent({required JSEventType event, Object? data}) { + sendMessageToClient(WalletMessageEvent.build(event: event, data: data), + JSClientType.ethereum); + } void _onSubscribe(EthereumSubscribeResult result) { - sendMessageToClient(JSWalletMessageResponseEthereum( - event: EthereumEventTypes.message, data: result.toJson())); + _sendEvent(event: JSEventType.message, data: result.toJson()); } + @override void initChain( {required Web3APPAuthentication authenticated, required ChainsHandler chainHandler}) { @@ -138,64 +144,43 @@ class JSEthereumHandler extends JSNetworkHandler request(ClientMessageEthereum params) async { + Future request(PageMessageRequest params) async { final state = this.state; - final isEvent = EthereumEventTypes.fromName(params.method); - if (isEvent != null) { - return _eventMessage(isEvent, state); - } final method = Web3EthereumRequestMethods.fromName(params.method); if (method == null) return _rpcCall(params, state); switch (method) { @@ -239,7 +224,7 @@ class JSEthereumHandler extends JSNetworkHandler _rpcCall( - ClientMessageEthereum params, EthereumWeb3State state) async { + PageMessageRequest params, EthereumWeb3State state) async { final cl = state.client; if (cl == null) { throw Web3RequestExceptionConst.disconnected(); @@ -258,11 +243,10 @@ class JSEthereumHandler extends JSNetworkHandler Map.from(e)) .toList()); } else { - address = toList[0]; - data = Eip712TypedData.fromJson(JsUtils.toMap(toList[1]), - version: version); + address = item0 as String; + data = Eip712TypedData.fromJson(JsUtils.toMap(item1), version: version); } final typdedDataParams = Web3EthreumTypdedData.fromJson({ "address": address, @@ -319,24 +305,24 @@ class JSEthereumHandler extends JSNetworkHandler(toList[0], + final toObject = JsUtils.toMap(toList, error: Web3RequestExceptionConst.invalidMethodArgruments(params.method)); return Web3EthreumSwitchChain.fromJson(toObject); } Future _parseAddEthereumChain( - ClientMessageEthereum params) async { - final toList = params.paramsAsList(length: 1); + PageMessageRequest params) async { + final toList = params.getFirstParam; if (toList == null) { throw Web3RequestExceptionConst.invalidMethodArgruments(params.method); } - final toObject = JsUtils.toMap(toList[0], + final toObject = JsUtils.toMap(toList, error: Web3RequestExceptionConst.invalidMethodArgruments(params.method)); @@ -369,43 +355,29 @@ class JSEthereumHandler extends JSNetworkHandler? toJson = MethodUtils.nullOnException(() { - if (transactionParam is String) { - return StringUtils.tryToJson(transactionParam); - } else { - return Map.from(transactionParam); - } - }); - if (toJson == null) { - throw Web3RequestExceptionConst.invalidMethodArgruments(params.method); - } + PageMessageRequest params, BigInt chainId) { + final Map toJson = JsUtils.toMap(params.getFirstParam, + error: + Web3RequestExceptionConst.invalidMethodArgruments(params.method)); return Web3EthreumSendTransaction.fromJson(toJson); } - Web3EthreumPersonalSign _personalSign(ClientMessageEthereum params) { - try { - final toList = params.paramsAsList(length: 2); - if (toList == null) { - throw Web3RequestExceptionConst.invalidMethodArgruments(params.method); - } - final Map message = { - "address": toList[0], - "challeng": toList[1] - }; - return Web3EthreumPersonalSign.fromJson(message); - } catch (e) { - rethrow; + Web3EthreumPersonalSign _personalSign(PageMessageRequest params) { + final items = params.getElements(2); + final address = items?.elementAt(0); + final challeng = items?.elementAt(1); + if (address == null || challeng == null) { + throw Web3RequestExceptionConst.invalidMethodArgruments(params.method); } + final Map message = { + "address": address, + "challeng": challeng + }; + return Web3EthreumPersonalSign.fromJson(message); } @override - void onRequestDone(ClientMessageEthereum message) { + void onRequestDone(PageMessageRequest message) { final method = Web3EthereumRequestMethods.fromName(message.method); switch (method) { case Web3EthereumRequestMethods.addEthereumChain: @@ -422,11 +394,46 @@ class JSEthereumHandler extends JSNetworkHandler NetworkType.ethereum; + + @override + WalletMessageResponse finilizeWalletResponse( + {required PageMessageRequest message, + required Web3RequestParams params, + required Web3WalletResponseMessage response}) { + final method = Web3EthereumRequestMethods.fromName(message.method); + + switch (method) { + case Web3EthereumRequestMethods.requestAccounts: + if (state.permissionAccounts.isNotEmpty) { + return WalletMessageResponse.success( + state.permissionAccounts.jsify()); + } + return WalletMessageResponse.fail(Web3RequestExceptionConst + .rejectedByUser + .toResponseMessage() + .toJson() + .jsify()); + default: + } + return super.finilizeWalletResponse( + message: message, params: params, response: response); } @override - NetworkType get networkType => NetworkType.ethereum; + void event(PageMessageEvent event) { + switch (event.eventType) { + case JSEventType.accountsChanged: + _accountChanged(state); + break; + case JSEventType.chainChanged: + _chainChanged(state); + break; + case JSEventType.connect: + _connect(state); + break; + default: + break; + } + } } diff --git a/mrt_wallet/js/js_wallet/wallet/networks/solana.dart b/mrt_wallet/js/js_wallet/wallet/networks/solana.dart index 0eff42d8..486a770a 100644 --- a/mrt_wallet/js/js_wallet/wallet/networks/solana.dart +++ b/mrt_wallet/js/js_wallet/wallet/networks/solana.dart @@ -1,3 +1,5 @@ +import 'dart:js_interop'; + import 'package:blockchain_utils/utils/utils.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; @@ -7,6 +9,8 @@ import 'package:mrt_wallet/wallet/web3/core/core.dart'; import 'package:mrt_wallet/wallet/web3/networks/networks.dart'; import 'package:on_chain/on_chain.dart'; import '../../models/models/networks/solana.dart'; +import '../../models/models/requests.dart'; +import '../../utils/utils/utils.dart'; import '../core/network_handler.dart'; class SolanaWeb3State @@ -39,7 +43,7 @@ class SolanaWeb3State final chains = chainHandler.chains().whereType().toList(); final currentChain = chains .firstWhere((e) => e.network.genesisBlock == permission.currentChain); - final permissionAccounts = permission.currentChainAccounts(currentChain); + final permissionAccounts = permission.chainAccounts(currentChain); final defaultAddress = permissionAccounts .firstWhereOrNull((e) => e.defaultAddress, orElse: () { if (permissionAccounts.isEmpty) return null; @@ -50,14 +54,8 @@ class SolanaWeb3State permission: permission, permissionAccounts: permissionAccounts.map((e) => e.address.address).toList() - ..sort((a, b) { - if (a == defaultAddress?.addressStr) { - return -1; - } else if (b == defaultAddress?.addressStr) { - return 1; - } - return a.compareTo(b); - }), + ..sort((a, b) => + JsUtils.compareAddress(a, b, defaultAddress?.addressStr)), state: JSNetworkState.init, chain: currentChain, defaultAddress: defaultAddress?.address, @@ -93,13 +91,23 @@ class SolanaWeb3State bool get isConnect => defaultAddress != null; } -class JSSolanaHandler extends JSNetworkHandler { +class JSSolanaHandler extends JSNetworkHandler< + SolAddress, + SolanaChain, + Web3SolanaChainAccount, + Web3SolanaChain, + // PageMessageRequest, + SolanaWeb3State> { @override SolanaWeb3State state = SolanaWeb3State.init(); JSSolanaHandler({required super.sendMessageToClient}); + void _sendEvent({required JSEventType event, Object? data}) { + sendMessageToClient(WalletMessageEvent.build(event: event, data: data), + JSClientType.solana); + } + @override void initChain( {required Web3APPAuthentication authenticated, required ChainsHandler chainHandler}) { @@ -137,25 +145,9 @@ class JSSolanaHandler extends JSNetworkHandler request(ClientMessageSolana params) async { + Future request(PageMessageRequest params) async { final state = this.state; - final isEvent = SolanaEventTypes.fromName(params.method); - if (isEvent != null) { - return _eventMessage(isEvent, state); - } final method = Web3SolanaRequestMethods.fromName(params.method); switch (method) { case Web3SolanaRequestMethods.requestAccounts: @@ -164,7 +156,10 @@ class JSSolanaHandler extends JSNetworkHandler.from(params.params as List); + final data = JsUtils.toList(params.getFirstParam, + error: Web3RequestExceptionConst.invalidSignMessageData); try { VersionedMessage.fromBuffer(data); - throw Web3SolanaExceptionConstant.invalidSignMessageData; + throw Web3SolanaExceptionConstant.singTransactionInsteadMessage; } on Web3RequestException { rethrow; } catch (_) {} @@ -191,24 +187,21 @@ class JSSolanaHandler extends JSNetworkHandler _parseTransaction( - ClientMessageSolana params, SolanaWeb3State state) async { + Future _parseTransaction({ + required PageMessageRequest params, + required SolanaWeb3State state, + required Web3SolanaRequestMethods method, + }) async { try { - final List requests = - (params.params as List?) - ?.map((e) => ClientSolanaTransactionMessage.fromJson(e)) - .toList() ?? - []; - - if (requests.isEmpty) { + final transactions = params.getJSParamsAs(); + if (transactions?.isEmpty ?? true) { throw Web3SolanaExceptionConstant.emptyTransactionParameters; } List messages = []; - - for (final i in requests) { - // if (i.sendOption != null && option == null) {} + for (int i = 0; i < transactions!.length; i++) { + final messageBytes = transactions[i].toListInt(); List activeAccounts = []; - final message = SolanaTransaction.deserialize(i.message); + final message = SolanaTransaction.deserialize(messageBytes); final signers = message.signers; for (final i in signers) { if (state.hasPermission(i)) { @@ -222,64 +215,78 @@ class JSSolanaHandler extends JSNetworkHandler e.address == state.defaultAddress?.address, orElse: () => activeAccounts.first); messages.add(Web3SolanaSendTransactionData( - account: account, messageByte: i.message, id: i.id)); + account: account, messageByte: messageBytes, id: i)); + } + Web3SolanaSendTransactionOptions? option; + switch (method) { + case Web3SolanaRequestMethods.signTransaction: + if (messages.length > 1) { + throw Web3SolanaExceptionConstant.signleRequestInsteadBatchError; + } + break; + case Web3SolanaRequestMethods.sendTransaction: + if (messages.length > 1) { + throw Web3SolanaExceptionConstant.signleRequestInsteadBatchError; + } + option = Web3SolanaSendTransactionOptions.fromJson( + (params.additionalData as JSSolanaTranasctionSendOptions) + .toJson()); + break; + case Web3SolanaRequestMethods.sendAllTransactions: + option = Web3SolanaSendTransactionOptions.fromJson( + (params.additionalData as JSSolanaTranasctionSendOptions) + .toJson()); + break; + default: } - - final Web3SolanaSendTransactionOptions? option = - requests.first.sendOption == null - ? null - : Web3SolanaSendTransactionOptions.fromJson( - requests.first.sendOption!); if (option?.signers ?? false) { throw Web3SolanaExceptionConstant.invalidTransactionOptionsSigner; } - return Web3SolanaSendTransaction(messages: messages, sendConfig: option); + return Web3SolanaSendTransaction( + messages: messages, sendConfig: option, method: method); } on Web3RequestException { rethrow; - } catch (e) { - throw Web3SolanaExceptionConstant.invalidTransaction; - } + } catch (_) {} + throw Web3SolanaExceptionConstant.invalidTransaction; } void _disconnect() async { - sendMessageToClient(JSWalletMessageResponseSolana( - event: SolanaEventTypes.disconnect, - data: Web3RequestExceptionConst.disconnectedChain.toJson())); + _sendEvent( + event: JSEventType.disconnect, + data: Web3RequestExceptionConst.disconnectedChain.toJson()); } void _connect(SolanaWeb3State state) async { if (state.defaultAddress == null) return; - sendMessageToClient(JSWalletMessageResponseSolana( - event: SolanaEventTypes.connect, data: state.accountsChange.toJson())); + _sendEvent(event: JSEventType.connect, data: state.accountsChange.toJson()); } void _accountChanged(SolanaWeb3State state) async { - sendMessageToClient(JSWalletMessageResponseSolana( - event: SolanaEventTypes.accountsChanged, - data: state.accountsChange.toJson())); + _sendEvent( + event: JSEventType.accountsChanged, + data: state.accountsChange.toJson()); } void _chainChanged(SolanaWeb3State state) async { if (state.chain == null) return; - sendMessageToClient(JSWalletMessageResponseSolana( - event: SolanaEventTypes.chainChanged, - data: state.chainChangedEvent.toJson())); + _sendEvent( + event: JSEventType.chainChanged, + data: state.chainChangedEvent.toJson()); } void _toggleSolana(SolanaWeb3State state) { final chain = state.chain; if (chain != null) { - sendMessageToClient( - JSWalletMessageResponseSolana(event: SolanaEventTypes.active)); + _sendEvent(event: JSEventType.active); } else { - sendMessageToClient(JSWalletMessageResponseSolana( - event: SolanaEventTypes.disable, - data: Web3RequestExceptionConst.bannedHost.data)); + _sendEvent( + event: JSEventType.disable, + data: Web3RequestExceptionConst.bannedHost.data); } } @override - void onRequestDone(ClientMessageSolana message) { + void onRequestDone(PageMessageRequest message) { final method = Web3SolanaRequestMethods.fromName(message.method); switch (method) { @@ -294,8 +301,80 @@ class JSSolanaHandler extends JSNetworkHandler NetworkType.solana; @override - Web3MessageCore finilize( - ClientMessageSolana request, Web3MessageCore response) { - return response; + WalletMessageResponse finilizeWalletResponse( + {required PageMessageRequest message, + required Web3RequestParams params, + required Web3WalletResponseMessage response}) { + final method = Web3SolanaRequestMethods.fromName(message.method); + switch (method) { + case Web3SolanaRequestMethods.requestAccounts: + if (state.permissionAccounts.isNotEmpty) { + return WalletMessageResponse.success( + state.permissionAccounts.jsify()); + } + return WalletMessageResponse.fail(Web3RequestExceptionConst + .rejectedByUser + .toResponseMessage() + .toJson() + .jsify()); + case Web3SolanaRequestMethods.signTransaction: + case Web3SolanaRequestMethods.signAllTransactions: + final transactions = message.getJSParamsAs(); + final transactionResponse = response + .resultAsList>(length: transactions!.length) + .map((e) => SolanaWeb3TransactionResponse.fromJson(e)); + final List?> result = + List.filled(transactions.length, null); + for (int i = 0; i < transactionResponse.length; i++) { + final item = transactionResponse.elementAt(i); + if (item.type != SolanaWeb3TransactionResponseType.sign) continue; + final signResponse = item.cast(); + result[i] = signResponse.toJson(); + } + return WalletMessageResponse.success(result.jsify()); + case Web3SolanaRequestMethods.sendTransaction: + final transactionResponse = + response.resultAsList>(length: 1); + final txHash = + SolanaWeb3TransactionResponse.fromJson(transactionResponse[0]) + .cast(); + return WalletMessageResponse.success(txHash.txHash.toJS); + case Web3SolanaRequestMethods.sendAllTransactions: + final transactions = message.getJSParamsAs(); + final transactionResponse = response + .resultAsList>(length: transactions!.length) + .map((e) => SolanaWeb3TransactionResponse.fromJson(e)); + List txHashes = List.filled(transactions.length, null); + for (int i = 0; i < transactionResponse.length; i++) { + final item = transactionResponse.elementAt(i); + if (item.type != SolanaWeb3TransactionResponseType.send) continue; + final sendResponse = item.cast(); + txHashes[i] = sendResponse.txHash; + } + return WalletMessageResponse.success(txHashes.jsify()); + case Web3SolanaRequestMethods.signMessage: + final signer = + Web3SolanaSignMessageResponse.fromJson(response.resultAsMap()); + return WalletMessageResponse.success(signer.toJson().jsify()); + } + return super.finilizeWalletResponse( + message: message, params: params, response: response); + } + + @override + void event(PageMessageEvent event) { + switch (event.eventType) { + case JSEventType.connect: + _connect(state); + break; + case JSEventType.accountsChanged: + _accountChanged(state); + break; + case JSEventType.chainChanged: + _chainChanged(state); + break; + default: + break; + } } } diff --git a/mrt_wallet/js/js_wallet/wallet/networks/ton.dart b/mrt_wallet/js/js_wallet/wallet/networks/ton.dart new file mode 100644 index 00000000..27614851 --- /dev/null +++ b/mrt_wallet/js/js_wallet/wallet/networks/ton.dart @@ -0,0 +1,302 @@ +import 'dart:js_interop'; + +import 'package:blockchain_utils/utils/utils.dart'; +import 'package:mrt_wallet/crypto/models/networks.dart'; +import 'package:mrt_wallet/wallet/wallet.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/wallet/web3/core/core.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'package:ton_dart/ton_dart.dart'; +import '../../models/models.dart'; +import '../../utils/utils/utils.dart'; +import '../core/network_handler.dart'; + +class TonWeb3State + extends ChainWeb3State { + final TheOpenNetworkChain? chain; + final TonAddressItemDTO? defaultAddress; + final TonClient? client; + + TonWeb3State._( + {super.permission, + required super.chains, + required super.state, + required super.permissionAccounts, + this.defaultAddress, + this.client, + this.chain}); + factory TonWeb3State.init( + {JSNetworkState state = JSNetworkState.disconnect}) { + return TonWeb3State._( + chains: const [], permissionAccounts: const [], state: state); + } + factory TonWeb3State( + {required Web3APPAuthentication authenticated, + required ChainsHandler chainHandler}) { + final permission = + authenticated.getChainFromNetworkType(NetworkType.ton); + if (permission == null) { + return TonWeb3State.init(state: JSNetworkState.block); + } + final chains = + chainHandler.chains().whereType().toList(); + final currentChain = chains.firstWhere( + (e) => e.network.coinParam.workchain == permission.currentChain); + final permissionAccounts = permission.chainAccounts(currentChain); + + TonAddressItemDTO? defaultAddress; + if (permissionAccounts.isNotEmpty) { + final defaultNetworkAddress = + permissionAccounts.firstWhere((e) => e.defaultAddress, orElse: () { + return permissionAccounts.first; + }); + final chainAddress = currentChain.addresses.firstWhere((e) => + e.networkAddress == defaultNetworkAddress.address && + e.keyIndex == defaultNetworkAddress.keyIndex); + defaultAddress = TonAddressItemDTO.create( + address: chainAddress.networkAddress.toFriendlyAddress(), + network: + TonChainId.fromNetworkId(currentChain.network.coinParam.workchain) + .value, + walletStateInit: chainAddress + .toWalletContract() + .state + ?.initialState() + .serialize() + .toBase64() ?? + "", + publicKey: BytesUtils.toHexString(chainAddress.publicKey)); + } + + return TonWeb3State._( + chains: chainHandler.chains().whereType().toList(), + permission: permission, + permissionAccounts: permissionAccounts + .map((e) => e.address.toFriendlyAddress()) + .toList() + ..sort( + (a, b) => JsUtils.compareAddress(a, b, defaultAddress?.address)), + state: JSNetworkState.init, + chain: currentChain, + defaultAddress: defaultAddress, + client: currentChain.getWeb3Provider( + requestTimeout: ChainWeb3State.requestTimeout)); + } + + bool accountChanged(TonWeb3State other) { + return !(CompareUtils.iterableIsEqual( + permissionAccounts, other.permissionAccounts) && + defaultAddress?.address == other.defaultAddress?.address); + } + + bool chainChanged(TonWeb3State other) { + return other.chain?.network != chain?.network; + } + + bool needToggle(TonWeb3State other) { + return other.state != state; + } + + bool get isConnect => chain?.provider() != null; + TonAccountsChanged get accountsChange => TonAccountsChanged( + accounts: permissionAccounts, defaultAddress: defaultAddress?.address); + + TonChainChanged get chainChangedEvent => + TonChainChanged(chain!.network.coinParam.workchain); + bool hasPermission(TonAddress address) { + return permission?.getPermission(address) != null; + } +} + +class JSTonHandler extends JSNetworkHandler { + @override + TonWeb3State state = TonWeb3State.init(); + + JSTonHandler({required super.sendMessageToClient}); + + @override + void initChain( + {required Web3APPAuthentication authenticated, + required ChainsHandler chainHandler}) { + lock.synchronized(() async { + final currentState = state; + state = TonWeb3State( + authenticated: authenticated, chainHandler: chainHandler); + if (state.needToggle(currentState)) { + _toggleTon(state); + _disconnect(); + if (state.isConnect) { + _connect(state); + _chainChanged(state); + } + _accountChanged(state); + return; + } + if (state.chainChanged(currentState)) { + _disconnect(); + if (state.isConnect) { + _connect(state); + } + _chainChanged(state); + } + if (state.accountChanged(currentState)) { + _accountChanged(state); + } + }); + } + + void _sendEvent({required JSEventType event, Object? data}) { + sendMessageToClient( + WalletMessageEvent.build(event: event, data: data), JSClientType.ton); + } + + @override + Future request(PageMessageRequest params) async { + final state = this.state; + final method = Web3TonRequestMethods.fromName(params.method); + switch (method) { + case Web3TonRequestMethods.requestAccounts: + if (state.permissionAccounts.isNotEmpty) { + return buildResponse(state.permissionAccounts); + } + return Web3TonRequestAccounts(); + case Web3TonRequestMethods.sendTransaction: + return _parseTransaction(params, state); + case Web3TonRequestMethods.signMessage: + final signMessage = _signMessage(params, state); + return signMessage; + default: + throw Web3RequestExceptionConst.methodDoesNotExist; + } + } + + Web3TonSignMessage _signMessage( + PageMessageRequest params, TonWeb3State state) { + if (state.defaultAddress == null) { + throw Web3RequestExceptionConst.missingPermission; + } + final data = JsUtils.toList(params.getFirstParam, + error: Web3RequestExceptionConst.invalidSignMessageData); + return Web3TonSignMessage( + address: TonAddress(state.defaultAddress!.address), + challeng: BytesUtils.toHexString(data), + content: StringUtils.tryDecode(data)); + } + + Future _parseTransaction( + PageMessageRequest params, TonWeb3State state) async { + try { + final json = JsUtils.toMap(params.getFirstParam); + final String? from = json["from"]; + TonAddress account; + if (state.defaultAddress == null) { + throw Web3RequestExceptionConst.missingPermission; + } + if (from == null) { + account = TonAddress(state.defaultAddress!.address); + } else { + account = TonAddress(from); + if (!state.hasPermission(account)) { + throw Web3RequestExceptionConst.missingPermission; + } + } + return Web3TonSendTransaction.fromJson(json: json, account: account); + } on Web3RequestException { + rethrow; + } catch (_) { + throw Web3TonExceptionConstant.invalidTransaction; + } + } + + void _disconnect() async { + _sendEvent( + event: JSEventType.disconnect, + data: Web3RequestExceptionConst.disconnectedChain.toJson()); + } + + void _connect(TonWeb3State state) async { + if (state.chain == null) return; + _sendEvent( + event: JSEventType.connect, data: state.chainChangedEvent.toJson()); + } + + void _accountChanged(TonWeb3State state) async { + _sendEvent( + event: JSEventType.accountsChanged, + data: state.accountsChange.toJson()); + } + + void _chainChanged(TonWeb3State state) async { + if (state.chain == null) return; + _sendEvent( + event: JSEventType.chainChanged, + data: state.chainChangedEvent.toJson()); + } + + void _toggleTon(TonWeb3State state) { + if (state.chain != null) { + _sendEvent(event: JSEventType.active); + } else { + _sendEvent( + event: JSEventType.disable, + data: Web3RequestExceptionConst.bannedHost.data); + } + } + + @override + void onRequestDone(PageMessageRequest message) { + final method = Web3TonRequestMethods.fromName(message.method); + + switch (method) { + case Web3TonRequestMethods.requestAccounts: + _accountChanged(state); + break; + default: + } + } + + @override + NetworkType get networkType => NetworkType.ton; + + @override + WalletMessageResponse finilizeWalletResponse( + {required PageMessageRequest message, + required Web3RequestParams params, + required Web3WalletResponseMessage response}) { + final method = Web3TonRequestMethods.fromName(message.method); + + switch (method) { + case Web3TonRequestMethods.requestAccounts: + if (state.permissionAccounts.isNotEmpty) { + return WalletMessageResponse.success( + state.permissionAccounts.jsify()); + } + return WalletMessageResponse.fail(Web3RequestExceptionConst + .rejectedByUser + .toResponseMessage() + .toJson() + .jsify()); + default: + } + return super.finilizeWalletResponse( + message: message, params: params, response: response); + } + + @override + void event(PageMessageEvent event) { + switch (event.eventType) { + case JSEventType.accountsChanged: + _accountChanged(state); + break; + case JSEventType.chainChanged: + _chainChanged(state); + break; + case JSEventType.connect: + _connect(state); + break; + default: + break; + } + } +} diff --git a/mrt_wallet/js/js_wallet/wallet/networks/tron.dart b/mrt_wallet/js/js_wallet/wallet/networks/tron.dart index a27532ca..02526529 100644 --- a/mrt_wallet/js/js_wallet/wallet/networks/tron.dart +++ b/mrt_wallet/js/js_wallet/wallet/networks/tron.dart @@ -1,6 +1,7 @@ import 'dart:js_interop'; + import 'package:blockchain_utils/utils/utils.dart'; -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/app/utils/numbers/numbers.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; @@ -9,6 +10,7 @@ import 'package:mrt_wallet/wallet/web3/core/core.dart'; import 'package:mrt_wallet/wallet/web3/networks/networks.dart'; import 'package:on_chain/on_chain.dart'; import '../../models/models.dart'; +import '../../utils/utils/utils.dart'; import '../core/network_handler.dart'; class TronWeb3State @@ -41,7 +43,7 @@ class TronWeb3State final chains = chainHandler.chains().whereType().toList(); final currentChain = chains.firstWhere( (e) => e.network.tronNetworkType == permission.currentChain); - final permissionAccounts = permission.currentChainAccounts(currentChain); + final permissionAccounts = permission.chainAccounts(currentChain); final defaultAddress = permissionAccounts .firstWhereOrNull((e) => e.defaultAddress, orElse: () { if (permissionAccounts.isEmpty) return null; @@ -52,14 +54,8 @@ class TronWeb3State permission: permission, permissionAccounts: permissionAccounts.map((e) => e.address.toAddress()).toList() - ..sort((a, b) { - if (a == defaultAddress?.addressStr) { - return -1; - } else if (b == defaultAddress?.addressStr) { - return 1; - } - return a.compareTo(b); - }), + ..sort((a, b) => + JsUtils.compareAddress(a, b, defaultAddress?.addressStr)), state: JSNetworkState.init, chain: currentChain, defaultAddress: defaultAddress == null @@ -89,8 +85,11 @@ class TronWeb3State bool get isConnect => chain?.provider() != null; TronAccountsChanged get accountsChange => TronAccountsChanged( accounts: permissionAccounts, defaultAddress: defaultAddress); - ProviderConnectInfo get chainChangedEvent => ProviderConnectInfo( - BigInt.from(chain!.network.tronNetworkType.genesisBlockNumber)); + TronChainChanged get chainChangedEvent => TronChainChanged( + netVersion: + BigInt.from(chain!.network.tronNetworkType.genesisBlockNumber), + fullNode: client!.service.provider.callUrl, + solidityNode: client!.solidityProvider.service.provider.callUrl); bool hasPermission(TronAddress address) { return permission?.getPermission(address) != null; } @@ -105,12 +104,13 @@ class TronWeb3State } class JSTronHandler extends JSNetworkHandler { + Web3TronChainAccount, Web3TronChain, TronWeb3State> { @override TronWeb3State state = TronWeb3State.init(); JSTronHandler({required super.sendMessageToClient}); + @override void initChain( {required Web3APPAuthentication authenticated, required ChainsHandler chainHandler}) { @@ -130,10 +130,10 @@ class JSTronHandler extends JSNetworkHandler request(ClientMessageTron params) async { + Future request(PageMessageRequest params) async { final state = this.state; - final isEvent = TronEventTypes.fromName(params.method); - if (isEvent != null) { - return _eventMessage(isEvent, state); - } final method = Web3TronRequestMethods.fromName(params.method); switch (method) { case Web3TronRequestMethods.requestAccounts: @@ -180,30 +162,28 @@ class JSTronHandler extends JSNetworkHandler.from(params.params as List); - return Web3TronSignMessageV2( - address: address, challeng: BytesUtils.toHexString(bytes)); - } else if (params.params is String) { + final data = params.getFirstParam; + + if (data is String) { return Web3TronSignMessageV2( address: address, - challeng: BytesUtils.toHexString( - StringUtils.encode(params.params as String))); + challeng: BytesUtils.toHexString(StringUtils.encode(data))); } + final bytes = List.from(data as List); + return Web3TronSignMessageV2( + address: address, challeng: BytesUtils.toHexString(bytes)); } catch (_) {} throw Web3TronExceptionConstant.invalidSignedMessageV2Parameters; } Future _parseTransaction( - ClientMessageTron params, TronWeb3State state) async { - final Map? transactionData = params.paramsAsMap(); - - if (transactionData == null) { - throw Web3TronExceptionConstant.invalidTransactionParams; - } + PageMessageRequest params, TronWeb3State state) async { + final Map transactionData = JsUtils.toMap( + params.getFirstParam, + error: Web3TronExceptionConstant.invalidTransactionParams); final transaction = Transaction.fromJson(transactionData); final txId = transactionData["txID"]; if (txId != null && txId != transaction.rawData.txID) { @@ -212,15 +192,12 @@ class JSTronHandler extends JSNetworkHandler e.id == permissionId); + final permission = accountInfo.permissions.firstWhereOrNull( + (e) => e.type != PermissionType.witness && e.id == permissionId); if (permission == null) { throw Web3TronExceptionConstant.invalidTransactionPermissionId; } @@ -241,46 +218,49 @@ class JSTronHandler extends JSNetworkHandler NetworkType.tron; + + @override + void event(PageMessageEvent event) { + switch (event.eventType) { + case JSEventType.accountsChanged: + _accountChanged(state); + break; + case JSEventType.chainChanged: + _chainChanged(state); + break; + case JSEventType.connect: + _connect(state); + break; + default: + break; + } + } } diff --git a/mrt_wallet/js/page.dart b/mrt_wallet/js/page.dart index b838782c..347db2f0 100644 --- a/mrt_wallet/js/page.dart +++ b/mrt_wallet/js/page.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:mrt_native_support/web/mrt_native_web.dart'; import 'js_wallet/constant/constant.dart'; import 'js_wallet/js_wallet.dart'; @@ -6,28 +5,21 @@ import 'dart:js_interop'; void main(List args) async { mrt = MRTWallet(JSObject()); - final completer = Completer(); - + bool inited = false; void onActivation(CustomEvent data) { - final idBytes = data.detailBytes(); - if (idBytes == null) { - return; - } - final event = JSWalletMessage.deserialize(bytes: data.detailBytes()) - .cast(); - if (event.status == JSWalletResponseType.failed) { - final walletError = - JSWalletError.fromJson(message: event.data as Map); - completer.completeError(walletError); + if (inited) return; + final event = (data.detail as WalletMessage).data as WalletMessageResponse; + if (event.statusType == JSWalletResponseType.failed) { + final walletError = JSWalletError.fromJson(message: event.asMap()); + jsConsole.errorObject(walletError); return; } - completer.complete(event.data as String); + inited = true; + jsWindow.addEventListener( + JSWalletConstant.activationEventName, onActivation.toJS); + JSPageController.setup(event.asString()); } jsWindow.addEventListener( JSWalletConstant.activationEventName, onActivation.toJS); - final future = await completer.future; - jsWindow.removeEventListener( - JSWalletConstant.activationEventName, onActivation.toJS); - JSPageController.setup(future); } diff --git a/mrt_wallet/js/webview.dart b/mrt_wallet/js/webview.dart index a8d6a0c0..387e1970 100644 --- a/mrt_wallet/js/webview.dart +++ b/mrt_wallet/js/webview.dart @@ -50,6 +50,5 @@ void main(List args) async { } mrt.onMrtMessage = onActivation.toJS; - await completer.future; } diff --git a/mrt_wallet/lib/app/constant/global/app.dart b/mrt_wallet/lib/app/constant/global/app.dart index 42e0dff0..1c0bc5f8 100644 --- a/mrt_wallet/lib/app/constant/global/app.dart +++ b/mrt_wallet/lib/app/constant/global/app.dart @@ -47,6 +47,8 @@ class APPConst { static const double double20 = 20; static const double tooltipConstrainedWidth = 300; static const double dialogWidth = 650; + static const double maxViewWidth = 650; + static const double maxDialogHeight = 600; static const double maxTextFieldWidth = 400; static const double qrCodeWidth = 300; static final RegExp accountNameRegExp = RegExp(r'^[^\n]{0,20}$'); @@ -54,6 +56,7 @@ class APPConst { static const double circleRadius25 = 25; static const double desktopAppWidth = 1200; static const double desktopAppHeight = 768; + static const double naviationRailWidth = 80; static const String exampleBase58 = "sEd7FSsSXz9CGy18ajtP8nAkrr...."; static const String exampleHex = ""; diff --git a/mrt_wallet/lib/app/constant/global/link.dart b/mrt_wallet/lib/app/constant/global/link.dart index 0dce0dd0..ebbf8029 100644 --- a/mrt_wallet/lib/app/constant/global/link.dart +++ b/mrt_wallet/lib/app/constant/global/link.dart @@ -13,6 +13,8 @@ class LinkConst { "https://docs.ton.org/participate/wallets/contracts#basic-wallets"; static const String reviewTonSubWalletId = "https://docs.ton.org/participate/wallets/contracts#wallet-v3"; + static const String reviewTonV5 = + "https://github.com/ton-blockchain/wallet-contract-v5/tree/main"; static const String tonBouncableReview = "https://docs.ton.org/develop/smart-contracts/guidelines/non-bouncable-messages"; static const String tonMessageBodyReview = diff --git a/mrt_wallet/lib/app/dev/logging.dart b/mrt_wallet/lib/app/dev/logging.dart index afbab225..6b00c8d5 100644 --- a/mrt_wallet/lib/app/dev/logging.dart +++ b/mrt_wallet/lib/app/dev/logging.dart @@ -4,8 +4,8 @@ class WalletLogging { static bool get isDebug => true; static void log(String text) { - // print('\x1B[31m$text\x1B[0m'); - print(text); + print('\x1B[31m$text\x1B[0m'); + // print(text); } static void warning(String text) { diff --git a/mrt_wallet/lib/app/file/cross/web.dart b/mrt_wallet/lib/app/file/cross/web.dart index 0b7fe66e..7d8b58a9 100644 --- a/mrt_wallet/lib/app/file/cross/web.dart +++ b/mrt_wallet/lib/app/file/cross/web.dart @@ -19,8 +19,8 @@ Future bytesToFile( Future> loadAssetBuffer(String assetPath) async { assetPath = toAssetPath(assetPath); - if (isExtention) { - assetPath = extention.runtime.getURL(assetPath); + if (isExtension) { + assetPath = extension.runtime.getURL(assetPath); } final data = await jsWindow.fetch_(assetPath); if (!data.ok) { @@ -32,8 +32,8 @@ Future> loadAssetBuffer(String assetPath) async { Future loadAssetText(String assetPath) async { assetPath = toAssetPath(assetPath); - if (isExtention) { - assetPath = extention.runtime.getURL(assetPath); + if (isExtension) { + assetPath = extension.runtime.getURL(assetPath); } final data = await jsWindow.fetch_(assetPath); if (!data.ok) { diff --git a/mrt_wallet/lib/app/localization/localization.dart b/mrt_wallet/lib/app/localization/localization.dart index 4f42aa9e..f8ce6abb 100644 --- a/mrt_wallet/lib/app/localization/localization.dart +++ b/mrt_wallet/lib/app/localization/localization.dart @@ -271,9 +271,9 @@ class Localization { "account_not_found": "Account not found", "sign_transaction": "Sign transaction", "signing_tx_desc": - "The wallet requests the signing of the transaction using the following accounts.", + "The wallet is requesting you to sign the data with the following accounts.", "signing_tx_desc1": - "Kindly provide your wallet password to sign the transaction; otherwise, close the page.", + "Kindly provide your wallet password to sign the data (Transaction, Message, etc.). otherwise, close the page.", "wallet_is_locked": "Wallet is locked.", "to_many_request": "Too many requests", "user_rejected_signing_request": @@ -882,7 +882,7 @@ class Localization { "accounts": "Accounts", "private_keys": "Private keys", "private_keys__signing_access_desc": - "The transaction requires the use of the following private keys for signing.", + "The data requires the use of the following private keys to complete the signing process.", "amount_for_each_output": "Kindly input the preferred quantity for each output.", "cancel": "Cancel", @@ -1423,7 +1423,7 @@ class Localization { "a_minimum_a_ada_required": "A minimum of 1 ADA output is required.", "unsuported_feature": "Unsuported feature", "cosmos_networks": "Cosmos and forked", - "ton_networks": "Ton", + "ton_networks": "Ton networks", "add_least_one_receipt": "Add at least one recipient", "the_amount_is_unspecified": "The amount is unspecified.", "elliptic_curve_options": "Elliptic Curve Options", @@ -1593,9 +1593,9 @@ class Localization { "wallet_type": "Wallet type", "types_of_wallet_contracts": "Types of Wallet Contracts", "ton_wallet_contract_desc": - "Wallet Contracts on TON (V1, V2, V3, V4) are smart contracts designed to manage cryptocurrency transactions with increasing levels of security, functionality, and customization.", + "Wallet Contracts on TON (V1, V2, V3, V4, V5) are smart contracts designed to manage cryptocurrency transactions with increasing levels of security, functionality, and customization.", "sub_wallet_id_validator": - "The sub wallet id must be a value between 0 and 2^32-1.", + "The sub wallet id must be a value between 0 and ___1__.", "sub_wallet_id": "Sub wallet id", "sub_wallet_id_desc": "which allows you to create multiple wallets using the same public key (so you can have only one seed phrase and lots of wallets)", @@ -2036,6 +2036,7 @@ class Localization { "tron_call_token_value_desc": "The amount of a TRC-10 token during contract interaction", "tron_networks": "Tron networks.", + "solana_networks": "Solana networks.", "default_address": "Default address", "default_address_desc": "Enabling multiple account permissions allows Web3 apps to automatically detect the default address.", @@ -2065,7 +2066,73 @@ class Localization { "fee_estimate_failed": "Fee estimation failed", "submit_transaction": "Submit transaction.", "simulation_failed_continue_desc": - "Some transaction simulations failed. Do you want to continue?" + "Some transaction simulations failed. Do you want to continue?", + "simulation_process_continue_desc": + "Some transaction simulations are in process. Do you want to continue?", + "total_transaction_const": "Total transaction cost", + "simulation_are_not_ready": + "Some transaction simulations are not complete.", + "web3_permission_error_desc": + "Insufficient permissions to complete this request.", + "change_balance": "Change balance", + "solana_change_balance_desc": + "Remaining balance after transaction submission.", + "solana_change_balance_desc2": + "In a multiple transaction request with the same owner, the balance change applies only to this instruction and does not affect previous or subsequent simulations.", + "replace_recent_block_hash": "Replace recent block hash", + "replace_block_hash_desc": + "this feature only effect transactions with one signature requirement", + "message_amount": "Message amount", + "amount_of_ton_message": "Amount of TON Linked to the Message", + "transaction_messages": "Transaction messages", + "ton_tx_message_details": "TON transaction message details.", + "message_payload": "Message payload", + "jetton_info": "Jetton info", + "jetton_transfer_amount": "Jetton transfer amount", + "content_of_payload": "The content of payload.", + "payload_deserialize_failed": + "Failed to deserialize and access the payload content.", + "unknown_payload_desc": + "Unknown payload detected. Some payloads may have full access to contracts. Only accept Web3 transactions from trusted sites.", + "deploy_contract": "Deploy contract", + "initialization_state": "Initialization state", + "encrypted_message": "Encrypted message", + "use_wallet_id": "Use Wallet id", + "ton_v5_wallet_desc": + "The Wallet ID may resemble a Sub Wallet ID, but it follows a different serialization concept. To understand this better, you should read about version 5.", + "wallet_id": "Wallet ID", + "unknow_jetton_owner": "Unknown Jetton Owner", + "switch_permission_chain_desc": + "To switch chains, please select the desired chain and update the permissions accordingly.", + "writable": "Writable", + "read_only": "Read only", + "sign_message_private_key": + "The message should be signed using account private key.", + "sign_message_private_key_desc": + "Sign Message: Warning! The message you're about to sign could contain anything, including transactions. We cannot validate the contents of the message. Only proceed if you fully trust the request. Otherwise, you may risk losing your funds.", + "signing_request": "Signing request", + "eth_sendTransaction": "Send Transaction", + "personal_sign": "Personal Sign", + "eth_signTypedData": "Sign Typed Data", + "eth_signTypedData_v3": "Sign Typed Data V3", + "eth_signTypedData_v4": "Sign Typed Data V4", + "eth_requestAccounts": "Request Accounts", + "wallet_addEthereumChain": "Add Ethereum Chain", + "wallet_switchEthereumChain": "Switch Ethereum Chain", + "wallet_disconnect": "Disconnect", + "solana_sendTransaction": "Send Transaction", + "solana_sendAllTransactions": "Send All Transactions", + "solana_signAllTransactions": "Sign All Transactions", + "solana_signMessage": "Sign Message", + "solana_signTransaction": "Sign Transaction", + "solana_requestAccounts": "Request Accounts", + "ton_signMessage": "Sign Message", + "ton_sendTransaction": "Send Transaction", + "ton_signTransaction": "Sign Transaction", + "ton_requestAccounts": "Request Accounts", + "tron_signTransaction": "Sign Transaction", + "tron_signMessageV2": "Sign Message", + "tron_requestAccounts": "Request Accounts" } }; } diff --git a/mrt_wallet/lib/app/models/models/typedef.dart b/mrt_wallet/lib/app/models/models/typedef.dart index d890fe6f..50bb1de7 100644 --- a/mrt_wallet/lib/app/models/models/typedef.dart +++ b/mrt_wallet/lib/app/models/models/typedef.dart @@ -14,7 +14,7 @@ typedef FuncBool = bool Function(T); typedef FuncBoolString = bool Function(String); typedef FuncFutureBoolString = Future Function(String); - +typedef FuncFutureNullableBoold = Future Function(); typedef IntVoid = void Function(int); typedef FuncVoidNullT = void Function(T); diff --git a/mrt_wallet/lib/app/utils/list/extention.dart b/mrt_wallet/lib/app/utils/list/extension.dart similarity index 100% rename from mrt_wallet/lib/app/utils/list/extention.dart rename to mrt_wallet/lib/app/utils/list/extension.dart diff --git a/mrt_wallet/lib/app/utils/utils.dart b/mrt_wallet/lib/app/utils/utils.dart index ff418445..ecaba762 100644 --- a/mrt_wallet/lib/app/utils/utils.dart +++ b/mrt_wallet/lib/app/utils/utils.dart @@ -8,5 +8,5 @@ export 'share/utils.dart'; export 'string/utils.dart'; export 'file/utils.dart'; export 'numbers/numbers.dart'; -export 'list/extention.dart'; +export 'list/extension.dart'; export 'map/extension.dart'; diff --git a/mrt_wallet/lib/crypto/coins/coins.dart b/mrt_wallet/lib/crypto/coins/coins.dart index bf61240d..e4227ed6 100644 --- a/mrt_wallet/lib/crypto/coins/coins.dart +++ b/mrt_wallet/lib/crypto/coins/coins.dart @@ -1,3 +1,3 @@ export 'custom_coins/coins.dart'; export 'custom_coins/conf.dart'; -export 'serialization/extention.dart'; +export 'serialization/extension.dart'; diff --git a/mrt_wallet/lib/crypto/coins/serialization/extention.dart b/mrt_wallet/lib/crypto/coins/serialization/extension.dart similarity index 100% rename from mrt_wallet/lib/crypto/coins/serialization/extention.dart rename to mrt_wallet/lib/crypto/coins/serialization/extension.dart diff --git a/mrt_wallet/lib/crypto/isolate/cross/web/browser.dart b/mrt_wallet/lib/crypto/isolate/cross/web/browser.dart index 2a5d28e8..d1cbe5ec 100644 --- a/mrt_wallet/lib/crypto/isolate/cross/web/browser.dart +++ b/mrt_wallet/lib/crypto/isolate/cross/web/browser.dart @@ -12,7 +12,7 @@ external JSFunction get onWorkerErrorListener; class BrowserCryptoWorker extends IsolateCryptoWoker { BrowserCryptoWorker._() : super(); - late final bool isExtention = web.isExtention; + late final bool isExtention = web.isExtension; static const String _wasmPath = "assets/wasm/crypto.wasm"; static const String _extentionJs = "assets/wasm/wasm.mjs"; @@ -50,15 +50,6 @@ class BrowserCryptoWorker extends IsolateCryptoWoker { return Uint8List.fromList(f).buffer; } - // String _getAssetPath(String assetPath) { - // assetPath = "assets/$assetPath"; - // if (isExtention) { - // final path = web.extention.runtime.getURL(assetPath); - // return path; - // } - // return assetPath; - // } - Future _loadWasm() async { final file = await loadFileBinary(_wasmPath); return file; diff --git a/mrt_wallet/lib/crypto/requets/messages/wallet/requests/personal_sign.dart b/mrt_wallet/lib/crypto/requets/messages/wallet/requests/personal_sign.dart index 35088486..ca64e871 100644 --- a/mrt_wallet/lib/crypto/requets/messages/wallet/requests/personal_sign.dart +++ b/mrt_wallet/lib/crypto/requets/messages/wallet/requests/personal_sign.dart @@ -7,7 +7,6 @@ import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/crypto/requets/argruments/argruments.dart'; import 'package:mrt_wallet/crypto/requets/messages/core/message.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/personal_sign_response.dart'; -import 'package:on_chain/solana/src/transaction/core/core.dart'; class WalletRequestSignMessage implements WalletRequest { @@ -70,18 +69,6 @@ class WalletRequestSignMessage final signer = TronSigner.fromKeyBytes(responseKeys.privateKeyBytes()); return signer.signProsonalMessage(message, payloadLength: payloadLength); - case NetworkType.solana: - try { - VersionedMessage.fromBuffer(message); - throw WalletExceptionConst.dataVerificationFailed; - } on WalletException { - rethrow; - } catch (_) {} - final responseKeys = wallet - .readKeys([AccessCryptoPrivateKeyRequest(index: index)]).first; - final signer = - SolanaSigner.fromKeyBytes(responseKeys.privateKeyBytes()); - return signer.sign(message); default: throw WalletExceptionConst.unsuportedFeature; } diff --git a/mrt_wallet/lib/crypto/utils/ton/ton.dart b/mrt_wallet/lib/crypto/utils/ton/ton.dart index ddf63a03..84b41aaf 100644 --- a/mrt_wallet/lib/crypto/utils/ton/ton.dart +++ b/mrt_wallet/lib/crypto/utils/ton/ton.dart @@ -2,66 +2,130 @@ import 'package:blockchain_utils/bip/mnemonic/mnemonic.dart'; import 'package:blockchain_utils/bip/ton/ton.dart'; import 'package:blockchain_utils/utils/binary/binary_operation.dart'; import 'package:blockchain_utils/utils/binary/utils.dart'; -import 'package:mrt_wallet/app/error/exception/wallet_ex.dart'; +import 'package:blockchain_utils/utils/string/string.dart'; +import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/crypto/utils/global/utils.dart'; import 'package:ton_dart/ton_dart.dart'; +class _TonUtilsConst { + static const int encryptedCommentMessageTag = 0x2167da4b; + static const int commentTag = 0; +} + +enum TonMessageBodyType { + comment._("comment"), + binaryComment._("binary_comment"), + cell._("cell"), + encryptedMessage._("encrypted_message"), + none._("none"); + + final String name; + const TonMessageBodyType._(this.name); + String get helperText { + switch (this) { + case TonMessageBodyType.comment: + return "enter_comment_as_string_or_hex"; + case TonMessageBodyType.binaryComment: + return "enter_binary_message_as_hex"; + case TonMessageBodyType.cell: + return "enter_cell_as_hex_or_base64"; + default: + return ""; + } + } + + bool isValid(String? v) { + switch (this) { + case TonMessageBodyType.binaryComment: + return StrUtils.isHex(v); + case TonMessageBodyType.comment: + return v?.isNotEmpty ?? false; + case TonMessageBodyType.cell: + return TonUtils.isValidCell(v); + default: + return false; + } + } + + Cell? toValue(String value) { + switch (this) { + case TonMessageBodyType.binaryComment: + return TonUtils.toBinaryCommetBody(value); + case TonMessageBodyType.comment: + return TonUtils.toComment(value); + case TonMessageBodyType.cell: + return TonUtils.toCell(value); + default: + return null; + } + } + + bool get hasBody => this != TonMessageBodyType.none; + + static List supportValues = [ + TonMessageBodyType.comment, + TonMessageBodyType.binaryComment, + TonMessageBodyType.cell, + TonMessageBodyType.none, + ]; +} + class TonUtils { - static WalletContract fromVersion({ + static VersionedWalletContract fromContext({ required List publicKey, - required int workChain, - required WalletVersion version, + required TonChain chain, required bool bouncable, + required WalletVersion version, int? subWalletId, }) { switch (version) { case WalletVersion.v1R1: return WalletV1R1.create( - workChain: workChain, + chain: chain, publicKey: publicKey, bounceableAddress: bouncable, ); case WalletVersion.v1R2: return WalletV1R2.create( - workChain: workChain, + chain: chain, publicKey: publicKey, bounceableAddress: bouncable, ); case WalletVersion.v1R3: return WalletV1R3.create( - workChain: workChain, + chain: chain, publicKey: publicKey, bounceableAddress: bouncable, ); case WalletVersion.v2R1: return WalletV2R1.create( - workChain: workChain, + chain: chain, publicKey: publicKey, bounceableAddress: bouncable, ); case WalletVersion.v2R2: return WalletV2R2.create( - workChain: workChain, + chain: chain, publicKey: publicKey, bounceableAddress: bouncable, ); case WalletVersion.v3R1: return WalletV3R1.create( - workChain: workChain, + chain: chain, publicKey: publicKey, subWalletId: subWalletId, bounceableAddress: bouncable, ); case WalletVersion.v3R2: return WalletV3R2.create( - workChain: workChain, + chain: chain, publicKey: publicKey, subWalletId: subWalletId, bounceableAddress: bouncable, ); case WalletVersion.v4: return WalletV4.create( - workChain: workChain, + chain: chain, publicKey: publicKey, subWalletId: subWalletId, bounceableAddress: bouncable, @@ -115,10 +179,7 @@ class TonUtils { if (toBytes != null) { if (toBytes[0] != mask8) { toBytes = [mask8, ...toBytes]; - return beginCell() - .storeUint(0, 32) - .storeBytesRefTail(toBytes) - .endCell(); + return beginCell().storeUint32(0).storeBytesTail(toBytes).endCell(); } } throw WalletException("Invalid hex string."); @@ -129,7 +190,40 @@ class TonUtils { } static Cell toComment(String comment) { - return beginCell().storeUint(0, 32).storeStringRefTail(comment).endCell(); + return beginCell().storeUint32(0).storeStringTail(comment).endCell(); + } + + static (TonMessageBodyType, String)? deserializeComment(Slice slice) { + try { + final tag = slice.tryLoadUint32(); + switch (tag) { + case _TonUtilsConst.encryptedCommentMessageTag: + return ( + TonMessageBodyType.encryptedMessage, + slice.asCell().toBase64() + ); + case _TonUtilsConst.commentTag: + final data = slice.loadBufferTail(); + if (data.isEmpty) { + return (TonMessageBodyType.cell, "0x"); + } + if (data[0] == mask8) { + return ( + TonMessageBodyType.binaryComment, + BytesUtils.toHexString(data.sublist(1), prefix: "0x") + ); + } + return ( + TonMessageBodyType.comment, + StringUtils.tryDecode(data) ?? + BytesUtils.toHexString(data, prefix: "0x") + ); + default: + } + return null; + } catch (_) { + return null; + } } static MessageRelaxed createJettonTransaferBody( @@ -141,19 +235,17 @@ class TonUtils { required TonAddress destination, BigInt? queryId, Cell? payload}) { - return TransactioUtils.internal( - destination: walletAddress, - amount: amount, - bounce: false, - body: beginCell() - .storeUint(0xf8a7ea5, 32) - .storeUint(queryId ?? BigInt.zero, 64) - .storeCoins(jettonAmount) - .storeAddress(responseAddress) - .storeAddress(destination) - .storeMaybeRef() - .storeCoins(forwardTonAmount) - .storeMaybeRef(cell: payload) - .endCell()); + final body = beginCell() + .storeUint32(JettonWalletConst.transfer) + .storeUint64(queryId ?? 0) + .storeCoins(jettonAmount) + .storeAddress(destination) + .storeAddress(responseAddress) + .storeMaybeRef() + .storeCoins(forwardTonAmount) + .storeMaybeRef(cell: payload) + .endCell(); + return TonHelper.internal( + destination: walletAddress, amount: amount, bounce: false, body: body); } } diff --git a/mrt_wallet/lib/future/router/page_router.dart b/mrt_wallet/lib/future/router/page_router.dart index c0792ce8..57aacc34 100644 --- a/mrt_wallet/lib/future/router/page_router.dart +++ b/mrt_wallet/lib/future/router/page_router.dart @@ -83,6 +83,7 @@ class PageRouter { static const String web3Ethereum = "web3/ethereum"; static const String web3Tron = "web3/tron"; static const String web3Solana = "web3/solana"; + static const String web3Ton = "web3/ton"; static const String webview = "web/"; @@ -184,6 +185,8 @@ class PageRouter { return const EthereumWeb3FieldsView(); case web3Tron: return const TronWeb3FieldsView(); + case web3Ton: + return const TonWeb3FieldsView(); case web3Solana: return const SolanaWeb3FieldsView(); case updateEthereumProvider: @@ -255,6 +258,8 @@ class PageRouter { return web3Solana; case NetworkType.tron: return web3Tron; + case NetworkType.ton: + return web3Ton; default: return null; } diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/bool.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/bool.dart similarity index 57% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/bool.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/bool.dart index 51ae10e4..6a43ffe5 100644 --- a/mrt_wallet/lib/future/state_managment/extention/app_extentions/bool.dart +++ b/mrt_wallet/lib/future/state_managment/extension/app_extensions/bool.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/string.dart'; +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/string.dart'; extension QuickBooleanExtension on bool { String get tr { diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/color.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/color.dart similarity index 100% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/color.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/color.dart diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/context.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/context.dart similarity index 100% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/context.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/context.dart diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/date_time.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/date_time.dart similarity index 100% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/date_time.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/date_time.dart diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/double.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/double.dart similarity index 100% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/double.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/double.dart diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/state_key.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/state_key.dart similarity index 100% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/state_key.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/state_key.dart diff --git a/mrt_wallet/lib/future/state_managment/extention/app_extentions/string.dart b/mrt_wallet/lib/future/state_managment/extension/app_extensions/string.dart similarity index 100% rename from mrt_wallet/lib/future/state_managment/extention/app_extentions/string.dart rename to mrt_wallet/lib/future/state_managment/extension/app_extensions/string.dart diff --git a/mrt_wallet/lib/future/state_managment/extension/extension.dart b/mrt_wallet/lib/future/state_managment/extension/extension.dart new file mode 100644 index 00000000..2187fd37 --- /dev/null +++ b/mrt_wallet/lib/future/state_managment/extension/extension.dart @@ -0,0 +1,7 @@ +export 'app_extensions/context.dart'; +export 'app_extensions/string.dart'; +export 'app_extensions/color.dart'; +export 'app_extensions/date_time.dart'; +export 'app_extensions/bool.dart'; +export 'app_extensions/state_key.dart'; +export 'app_extensions/double.dart'; diff --git a/mrt_wallet/lib/future/state_managment/extention/extention.dart b/mrt_wallet/lib/future/state_managment/extention/extention.dart deleted file mode 100644 index 434876a8..00000000 --- a/mrt_wallet/lib/future/state_managment/extention/extention.dart +++ /dev/null @@ -1,7 +0,0 @@ -export 'app_extentions/context.dart'; -export 'app_extentions/string.dart'; -export 'app_extentions/color.dart'; -export 'app_extentions/date_time.dart'; -export 'app_extentions/bool.dart'; -export 'app_extentions/state_key.dart'; -export 'app_extentions/double.dart'; diff --git a/mrt_wallet/lib/future/state_managment/state_managment.dart b/mrt_wallet/lib/future/state_managment/state_managment.dart index 011130c5..59d0aa12 100644 --- a/mrt_wallet/lib/future/state_managment/state_managment.dart +++ b/mrt_wallet/lib/future/state_managment/state_managment.dart @@ -1,11 +1,11 @@ library state_managment; export 'typdef/typedef.dart'; -export 'extention/extention.dart'; +export 'extension/extension.dart'; import 'dart:async'; import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; part 'core/live.dart'; part 'core/disposable.dart'; part 'core/repository.dart'; diff --git a/mrt_wallet/lib/future/theme/theme.dart b/mrt_wallet/lib/future/theme/theme.dart index f7c4fc55..fe93baf2 100644 --- a/mrt_wallet/lib/future/theme/theme.dart +++ b/mrt_wallet/lib/future/theme/theme.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/future/constant/constant.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/color.dart'; +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/color.dart'; import 'package:mrt_wallet/app/models/models/seting.dart'; class ThemeController { diff --git a/mrt_wallet/lib/future/wallet/account/account.dart b/mrt_wallet/lib/future/wallet/account/account.dart index ea215913..f940a9ed 100644 --- a/mrt_wallet/lib/future/wallet/account/account.dart +++ b/mrt_wallet/lib/future/wallet/account/account.dart @@ -1,3 +1,2 @@ export 'pages/delete_account.dart'; export 'pages/account_controller.dart'; -export '../web3/pages/view_controller.dart'; diff --git a/mrt_wallet/lib/future/wallet/controller/impl/extention_wallet.dart b/mrt_wallet/lib/future/wallet/controller/impl/extention_wallet.dart index 54381088..69db8401 100644 --- a/mrt_wallet/lib/future/wallet/controller/impl/extention_wallet.dart +++ b/mrt_wallet/lib/future/wallet/controller/impl/extention_wallet.dart @@ -4,7 +4,7 @@ import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:mrt_native_support/models/models.dart'; import 'package:mrt_native_support/web/mrt_native_web.dart'; import 'package:mrt_wallet/app/core.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/controller/models/key.dart'; import 'package:mrt_wallet/future/wallet/controller/models/login_history.dart'; import 'package:mrt_wallet/future/wallet/controller/impl/web3_request_controller.dart'; @@ -21,11 +21,11 @@ class ExtentionSessionStorageConst { mixin ExtentionWalletHandler on Web3RequestControllerImpl { bool _fromAction = true; - final sessionStorage = extention.storage.session; + final sessionStorage = extension.storage.session; StreamSubscription? _onWalletExpireTime; @override Future currentApllicationId() async { - final tabs = await extention.tabs.query_( + final tabs = await extension.tabs.query_( active: true, lastFocusedWindow: _fromAction ? true : false, currentWindow: _fromAction); @@ -132,7 +132,7 @@ mixin ExtentionWalletHandler on Web3RequestControllerImpl { } return true; case WalletEventTypes.windowId: - extention.windows + extension.windows .getCurrent_(populate: false, windowTypes: ["popup"]).then((e) { sendResponse.callAsFunction( sendResponse, @@ -169,7 +169,7 @@ mixin ExtentionWalletHandler on Web3RequestControllerImpl { port.postMessage(message); return; } - final tab = await extention.tabs.get_(int.parse(event.clientId)); + final tab = await extension.tabs.get_(int.parse(event.clientId)); final Web3ClientInfo? client = await createClientInfos( clientId: tab.id?.toString(), @@ -214,7 +214,7 @@ mixin ExtentionWalletHandler on Web3RequestControllerImpl { void _onActivateChain(ActiveInfo info) { final tabInfo = - extention.tabs.query_(windowId: info.windowId, active: true); + extension.tabs.query_(windowId: info.windowId, active: true); tabInfo.then(_updateTabs); } @@ -238,16 +238,16 @@ mixin ExtentionWalletHandler on Web3RequestControllerImpl { } static final popEvent = WalletEvent( - clientId: extention.runtime.id, + clientId: extension.runtime.id, data: const [], requestId: "", type: WalletEventTypes.popup); void initExtention() { - extention.runtime.onMessage.addListener(_onRuntimeMessage.toJS); - extention.runtime.onConnect.addListener(_onConnet.toJS); - extention.tabs.onActivated.addListener(_onActivateChain.toJS); - extention.runtime.sendMessage_(message: popEvent); + extension.runtime.onMessage.addListener(_onRuntimeMessage.toJS); + extension.runtime.onConnect.addListener(_onConnet.toJS); + extension.tabs.onActivated.addListener(_onActivateChain.toJS); + extension.runtime.sendMessage_(message: popEvent); } @override @@ -255,7 +255,7 @@ mixin ExtentionWalletHandler on Web3RequestControllerImpl { final update = (await walletCore.updateWeb3Application(updatePermission)).result; final tabs = - await extention.tabs.query_(host: updatePermission.applicationId); + await extension.tabs.query_(host: updatePermission.applicationId); if (tabs.isNotEmpty) { for (final i in tabs) { if (i.id == null) continue; @@ -270,7 +270,7 @@ mixin ExtentionWalletHandler on Web3RequestControllerImpl { @override Future sendToClient(WalletEvent event) async { - await extention.tabs + await extension.tabs .sendMessage_( tabId: int.parse(event.clientId), message: event.toJsEvent()) .timeout(APPConst.tenSecoundDuration, onTimeout: () => null) diff --git a/mrt_wallet/lib/future/wallet/controller/wallet/cross/web.dart b/mrt_wallet/lib/future/wallet/controller/wallet/cross/web.dart index 2676c70f..38eb486c 100644 --- a/mrt_wallet/lib/future/wallet/controller/wallet/cross/web.dart +++ b/mrt_wallet/lib/future/wallet/controller/wallet/cross/web.dart @@ -17,7 +17,7 @@ import 'package:mrt_wallet/crypto/keys/access/key_data.dart'; import 'io.dart'; UIWallet uiWallet(GlobalKey navigatorKey) { - if (PlatformInterface.isWeb && isExtention) { + if (PlatformInterface.isWeb && isExtension) { return ExtentionWallet(navigatorKey); } return Wallet(navigatorKey); diff --git a/mrt_wallet/lib/future/wallet/controller/wallet/ui_wallet.dart b/mrt_wallet/lib/future/wallet/controller/wallet/ui_wallet.dart index c12c247f..3ec510da 100644 --- a/mrt_wallet/lib/future/wallet/controller/wallet/ui_wallet.dart +++ b/mrt_wallet/lib/future/wallet/controller/wallet/ui_wallet.dart @@ -40,9 +40,11 @@ abstract class UIWallet extends WalletCore { required Set addresses}) async { final pw = await navigatorKey.currentContext?.openSliverBottomSheet( "sign_transaction".tr, - child: WalletSigningPassword( + initialExtend: 1, + bodyBuilder: (controller) => WalletSigningPassword( addresses: addresses, keys: keys, + controller: controller, onPasswordForm: (password) async { final result = await login(password); return result.hasResult; diff --git a/mrt_wallet/lib/future/wallet/global/address_derivation/generic.dart b/mrt_wallet/lib/future/wallet/global/address_derivation/generic.dart index 78215f3e..a14b84e7 100644 --- a/mrt_wallet/lib/future/wallet/global/address_derivation/generic.dart +++ b/mrt_wallet/lib/future/wallet/global/address_derivation/generic.dart @@ -1,6 +1,6 @@ import 'package:blockchain_utils/bip/bip/conf/core/coins.dart'; import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/ripple/address/pages/setup_address.dart'; import 'package:mrt_wallet/future/wallet/network/substrate/address/setup_address.dart'; import 'package:mrt_wallet/future/wallet/network/ton/address/address.dart'; diff --git a/mrt_wallet/lib/future/wallet/global/pages/add_to_contact_list.dart b/mrt_wallet/lib/future/wallet/global/pages/add_to_contact_list.dart index bbf5903c..c2e22920 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/add_to_contact_list.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/add_to_contact_list.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/models.dart'; diff --git a/mrt_wallet/lib/future/wallet/global/pages/address_details.dart b/mrt_wallet/lib/future/wallet/global/pages/address_details.dart index 1fa60147..ac768951 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/address_details.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/address_details.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/constant/constant.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart' show ContactCore, ChainAccount; diff --git a/mrt_wallet/lib/future/wallet/global/pages/bip32_derivation.dart b/mrt_wallet/lib/future/wallet/global/pages/bip32_derivation.dart index 08a6b241..00a44d5a 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/bip32_derivation.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/bip32_derivation.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart' show WalletException; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/crypto/derivation/derivation.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/crypto/utils/utils.dart'; import 'package:mrt_wallet/wallet/wallet.dart' show BlockchainConst, WalletNetwork; diff --git a/mrt_wallet/lib/future/wallet/global/pages/byron_legacy_derivation.dart b/mrt_wallet/lib/future/wallet/global/pages/byron_legacy_derivation.dart index 2ae05252..d09c1f0c 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/byron_legacy_derivation.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/byron_legacy_derivation.dart @@ -1,7 +1,7 @@ import 'package:blockchain_utils/bip/bip/bip.dart'; import 'package:blockchain_utils/bip/ecc/curve/elliptic_curve_types.dart'; import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/crypto/worker.dart' show Bip32AddressIndex; diff --git a/mrt_wallet/lib/future/wallet/global/pages/receipt_address_view.dart b/mrt_wallet/lib/future/wallet/global/pages/receipt_address_view.dart index ee941dc8..200cdc6b 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/receipt_address_view.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/receipt_address_view.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/others/models/receipt_address.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class ReceiptAddressView extends StatelessWidget { const ReceiptAddressView( diff --git a/mrt_wallet/lib/future/wallet/global/pages/show_public_key.dart b/mrt_wallet/lib/future/wallet/global/pages/show_public_key.dart index c4320f29..ce85d10a 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/show_public_key.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/show_public_key.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/app/core.dart' show APPConst, MethodUtils, StateConst; diff --git a/mrt_wallet/lib/future/wallet/global/pages/switch_network.dart b/mrt_wallet/lib/future/wallet/global/pages/switch_network.dart index b16ce1c3..86f76ac8 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/switch_network.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/switch_network.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; @@ -164,7 +164,7 @@ class _SwitchNetworkViewState extends State Widget build(BuildContext context) { return ConstraintsBoxView( alignment: Alignment.center, - maxHeight: 600, + maxHeight: APPConst.maxDialogHeight, padding: WidgetConstant.padding20, maxWidth: APPConst.dialogWidth, child: ClipRRect( diff --git a/mrt_wallet/lib/future/wallet/global/pages/token_details.dart b/mrt_wallet/lib/future/wallet/global/pages/token_details.dart index f14296fe..6a0aeb21 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/token_details.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/token_details.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/global/pages/token_details_view.dart b/mrt_wallet/lib/future/wallet/global/pages/token_details_view.dart index 373a850a..5165da79 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/token_details_view.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/token_details_view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/token/core/core.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TokenDetailsView extends StatelessWidget { const TokenDetailsView({ @@ -13,6 +13,8 @@ class TokenDetailsView extends StatelessWidget { this.onSelectIcon, this.backgroundColor, this.radius = 40, + this.showBalance = true, + this.onTapWhenOnRemove = true, }); final TokenCore token; final DynamicVoid? onSelect; @@ -20,6 +22,8 @@ class TokenDetailsView extends StatelessWidget { final Widget? onSelectIcon; final Color? backgroundColor; final double radius; + final bool showBalance; + final bool onTapWhenOnRemove; @override Widget build(BuildContext context) { return ContainerWithBorder( @@ -27,6 +31,7 @@ class TokenDetailsView extends StatelessWidget { onRemoveIcon: onSelectIcon, onRemoveWidget: onSelectWidget, backgroundColor: backgroundColor, + onTapWhenOnRemove: onTapWhenOnRemove, child: Row( children: [ CircleTokenImgaeView(token.token, radius: radius), @@ -36,10 +41,11 @@ class TokenDetailsView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(token.token.name, style: context.textTheme.labelLarge), - CoinPriceView( - liveBalance: token.balance, - token: token.token, - style: context.textTheme.titleLarge), + if (showBalance) + CoinPriceView( + liveBalance: token.balance, + token: token.token, + style: context.textTheme.titleLarge), ], )), ], diff --git a/mrt_wallet/lib/future/wallet/global/pages/transaction_amount.dart b/mrt_wallet/lib/future/wallet/global/pages/transaction_amount.dart index 10951844..1fd8a7e5 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/transaction_amount.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/transaction_amount.dart @@ -2,19 +2,20 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TransactionAmountView extends StatelessWidget { - const TransactionAmountView( - {super.key, - required this.amount, - required this.token, - this.onTap, - this.onRemoveIcon, - this.title, - this.subtitle, - this.validate = true, - this.validateError}); + const TransactionAmountView({ + super.key, + required this.amount, + required this.token, + this.onTap, + this.onRemoveIcon, + this.title, + this.subtitle, + this.validate = true, + this.validateError, + }); final BalanceCore? amount; final Token token; final DynamicVoid? onTap; @@ -23,6 +24,7 @@ class TransactionAmountView extends StatelessWidget { final String? subtitle; final String? title; final Widget? onRemoveIcon; + @override Widget build(BuildContext context) { bool hasAmount = amount != null && !amount!.isZero; diff --git a/mrt_wallet/lib/future/wallet/global/pages/wallet_signing_password.dart b/mrt_wallet/lib/future/wallet/global/pages/wallet_signing_password.dart index 04930746..36a581be 100644 --- a/mrt_wallet/lib/future/wallet/global/pages/wallet_signing_password.dart +++ b/mrt_wallet/lib/future/wallet/global/pages/wallet_signing_password.dart @@ -11,10 +11,12 @@ class WalletSigningPassword extends StatefulWidget { {super.key, required this.keys, required this.addresses, - required this.onPasswordForm}); + required this.onPasswordForm, + required this.controller}); final Set keys; final Set addresses; final FuncFutureBoolString onPasswordForm; + final ScrollController controller; @override State createState() => _WalletSigningPasswordState(); @@ -26,6 +28,8 @@ class _WalletSigningPasswordState extends State GlobalKey(debugLabel: "WalletSigningPassword_1"); final GlobalKey formKey = GlobalKey(debugLabel: "WalletSigningPassword"); + final GlobalKey textFieldKey = + GlobalKey(debugLabel: "_WalletSigningPasswordState_textFieldKey"); List singerPubKeys = []; @@ -44,7 +48,7 @@ class _WalletSigningPasswordState extends State String? validator(String? v) { if (!StrUtils.isStrongPassword(v)) { - return "password_desc".tr; + return "password_validator".tr; } return null; } @@ -99,130 +103,166 @@ class _WalletSigningPasswordState extends State setState(() {}); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + textFieldKey.ensureKeyVisible(); + } + @override Widget build(BuildContext context) { - return Form( - key: formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - PageTitleSubtitle( - title: "sign_transaction".tr, - body: Column( - children: [ - Text("signing_tx_desc1".tr), - WidgetConstant.height8, - Text("signing_tx_desc".tr), - ], - )), - WidgetConstant.height20, - Text("accounts".tr, style: context.textTheme.titleMedium), - WidgetConstant.height8, - AnimatedSize( - duration: APPConst.animationDuraion, - alignment: Alignment.topCenter, - child: SizedBox( - width: context.mediaQuery.size.width, - child: ContainerWithBorder( - onRemove: () { - toggleShowAllAddresses(); - }, - iconAlginment: showAllAddresses - ? CrossAxisAlignment.start - : CrossAxisAlignment.center, - onRemoveIcon: showAllAddresses - ? const Icon(Icons.arrow_drop_up_sharp) - : const Icon(Icons.arrow_drop_down_sharp), - key: ValueKey(showAllAddresses), - child: showAllAddresses - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: - List.generate(widget.addresses.length, (index) { - final address = widget.addresses.elementAt(index); - final bool isLastIndex = - index == widget.addresses.length - 1; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AddressDetailsView(address: address), - if (!isLastIndex) - Divider( - color: - context.colors.onPrimaryContainer) - ], - ); - }), - ) - : Text("transaction_generated_with_number_accounts" - .tr - .replaceOne(widget.addresses.length.toString()))), - )), - WidgetConstant.height20, - Text("private_keys".tr, style: context.textTheme.titleMedium), - Text("private_keys__signing_access_desc".tr), - WidgetConstant.height8, - AnimatedSize( - duration: APPConst.animationDuraion, - alignment: Alignment.topCenter, - child: SizedBox( - width: context.mediaQuery.size.width, - child: ContainerWithBorder( - onRemove: () { - toggleShowAllPrivateKey(); - }, - iconAlginment: showAllPrivateKeys - ? CrossAxisAlignment.start - : CrossAxisAlignment.center, - onRemoveIcon: showAllPrivateKeys - ? const Icon(Icons.arrow_drop_up_sharp) - : const Icon(Icons.arrow_drop_down_sharp), - key: ValueKey(showAllPrivateKeys), - child: showAllPrivateKeys - ? Column( + return Scaffold( + appBar: AppBar(title: Text("signing_request".tr)), + body: CustomScrollView( + controller: widget.controller, + slivers: [ + SliverConstraintsBoxView( + sliver: SliverToBoxAdapter( + child: Form( + key: formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PageTitleSubtitle( + title: "signing_request".tr, + body: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: List.generate(widget.keys.length, (index) { - final keyIndex = widget.keys.elementAt(index); - final bool isLastIndex = - index == widget.keys.length - 1; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _HDWalletDerivationDetails(keyIndex: keyIndex), - if (!isLastIndex) - Divider( - color: context.colors.onPrimaryContainer) - ], - ); - }), + children: [ + Text("signing_tx_desc1".tr), + WidgetConstant.height8, + Text("signing_tx_desc".tr), + ], + )), + WidgetConstant.height20, + Text("accounts".tr, style: context.textTheme.titleMedium), + WidgetConstant.height8, + AnimatedSize( + duration: APPConst.animationDuraion, + alignment: Alignment.topCenter, + child: SizedBox( + width: context.mediaQuery.size.width, + child: ContainerWithBorder( + onRemove: () { + toggleShowAllAddresses(); + }, + iconAlginment: showAllAddresses + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + onRemoveIcon: showAllAddresses + ? const Icon(Icons.arrow_drop_up_sharp) + : const Icon(Icons.arrow_drop_down_sharp), + key: ValueKey(showAllAddresses), + child: showAllAddresses + ? Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: List.generate( + widget.addresses.length, (index) { + final address = + widget.addresses.elementAt(index); + final bool isLastIndex = index == + widget.addresses.length - 1; + return Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + AddressDetailsView( + address: address), + if (!isLastIndex) + Divider( + color: context.colors + .onPrimaryContainer) + ], + ); + }), + ) + : Text( + "transaction_generated_with_number_accounts" + .tr + .replaceOne(widget.addresses.length + .toString()))), + )), + WidgetConstant.height20, + Text("private_keys".tr, + style: context.textTheme.titleMedium), + Text("private_keys__signing_access_desc".tr), + WidgetConstant.height8, + AnimatedSize( + duration: APPConst.animationDuraion, + alignment: Alignment.topCenter, + child: SizedBox( + width: context.mediaQuery.size.width, + child: ContainerWithBorder( + onRemove: () { + toggleShowAllPrivateKey(); + }, + iconAlginment: showAllPrivateKeys + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + onRemoveIcon: showAllPrivateKeys + ? const Icon(Icons.arrow_drop_up_sharp) + : const Icon(Icons.arrow_drop_down_sharp), + key: ValueKey(showAllPrivateKeys), + child: showAllPrivateKeys + ? Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: List.generate(widget.keys.length, + (index) { + final keyIndex = + widget.keys.elementAt(index); + final bool isLastIndex = + index == widget.keys.length - 1; + return Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + _HDWalletDerivationDetails( + keyIndex: keyIndex), + if (!isLastIndex) + Divider( + color: context + .colors.onPrimaryContainer) + ], + ); + }), + ) + : Text( + "transaction_need_number_private_key_to_complete" + .tr + .replaceOne( + widget.keys.length.toString())), + ), + )), + WidgetConstant.height20, + AppTextField( + label: "password".tr, + validator: validator, + error: _error, + onChanged: onChagePassword, + obscureText: true, + initialValue: _password, + readOnly: keyState.inProgress, + key: textFieldKey, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + StreamWidget( + key: keyState, + buttonWidget: FixedElevatedButton( + onPressed: onPassword, + child: Text("sign_transaction".tr)), + backToIdle: APPConst.oneSecoundDuration, + padding: WidgetConstant.paddingVertical40, ) - : Text("transaction_need_number_private_key_to_complete" - .tr - .replaceOne(widget.keys.length.toString())), + ], + ) + ], ), - )), - WidgetConstant.height20, - AppTextField( - label: "password".tr, - validator: validator, - error: _error, - onChanged: onChagePassword, - obscureText: true, - initialValue: _password, - readOnly: keyState.inProgress, + ), + ), ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - StreamWidget( - key: keyState, - buttonWidget: FixedElevatedButton( - onPressed: onPassword, child: Text("sign_transaction".tr)), - backToIdle: APPConst.oneSecoundDuration, - padding: WidgetConstant.paddingVertical20, - ) - ], - ) ], ), ); diff --git a/mrt_wallet/lib/future/wallet/network/bch/account/account.dart b/mrt_wallet/lib/future/wallet/network/bch/account/account.dart index 781e0476..58b032c2 100644 --- a/mrt_wallet/lib/future/wallet/network/bch/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/bch/account/account.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/bch/token/pages/cash_token_info.dart b/mrt_wallet/lib/future/wallet/network/bch/token/pages/cash_token_info.dart index fc75e7eb..46a3188f 100644 --- a/mrt_wallet/lib/future/wallet/network/bch/token/pages/cash_token_info.dart +++ b/mrt_wallet/lib/future/wallet/network/bch/token/pages/cash_token_info.dart @@ -1,6 +1,6 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/bch/transaction/transaction/build_transaction.dart b/mrt_wallet/lib/future/wallet/network/bch/transaction/transaction/build_transaction.dart index 15128b81..8a2c3f13 100644 --- a/mrt_wallet/lib/future/wallet/network/bch/transaction/transaction/build_transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/bch/transaction/transaction/build_transaction.dart @@ -11,7 +11,7 @@ import 'package:mrt_wallet/future/wallet/network/bitcoin/controller/impl/transac import 'package:mrt_wallet/future/wallet/network/bitcoin/transaction/pages/ordering/transaction_ordering_view.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class BitcoinCashBuildTransactionView extends StatelessWidget { const BitcoinCashBuildTransactionView({super.key, required this.controller}); diff --git a/mrt_wallet/lib/future/wallet/network/bitcoin/account/account.dart b/mrt_wallet/lib/future/wallet/network/bitcoin/account/account.dart index 11e23a77..9793a694 100644 --- a/mrt_wallet/lib/future/wallet/network/bitcoin/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/bitcoin/account/account.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/build_transaction.dart b/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/build_transaction.dart index 71233a2d..f2a28ee2 100644 --- a/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/build_transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/build_transaction.dart @@ -7,7 +7,7 @@ import 'package:mrt_wallet/future/wallet/network/bitcoin/controller/impl/transac import 'package:mrt_wallet/future/wallet/network/bitcoin/transaction/pages/ordering/transaction_ordering_view.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class BitcoinBuildTransactionView extends StatelessWidget { const BitcoinBuildTransactionView({super.key, required this.controller}); diff --git a/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/ordering/transaction_ordering_view.dart b/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/ordering/transaction_ordering_view.dart index 8823cc22..84e94a76 100644 --- a/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/ordering/transaction_ordering_view.dart +++ b/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/ordering/transaction_ordering_view.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/network/bch/token/pages/cash_token_info import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/bitcoin/bitcoin.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TransactionOrderingView extends StatefulWidget { const TransactionOrderingView({ diff --git a/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/utxo_view.dart b/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/utxo_view.dart index ee8dd3c6..78e0d8eb 100644 --- a/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/utxo_view.dart +++ b/mrt_wallet/lib/future/wallet/network/bitcoin/transaction/pages/utxo_view.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/network/bitcoin/controller/impl/transaction.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class BitcoinTransactionUtxoView extends StatelessWidget { const BitcoinTransactionUtxoView({required this.controller, super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/bitcoin/update_provider/import_electrum_provider.dart b/mrt_wallet/lib/future/wallet/network/bitcoin/update_provider/import_electrum_provider.dart index 08457e8f..47909a01 100644 --- a/mrt_wallet/lib/future/wallet/network/bitcoin/update_provider/import_electrum_provider.dart +++ b/mrt_wallet/lib/future/wallet/network/bitcoin/update_provider/import_electrum_provider.dart @@ -6,7 +6,7 @@ import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/global/pages/select_provider.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class ImportElectrumProviderView extends StatelessWidget { const ImportElectrumProviderView({super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/cardano/account/account.dart b/mrt_wallet/lib/future/wallet/network/cardano/account/account.dart index 07cc57af..45aead27 100644 --- a/mrt_wallet/lib/future/wallet/network/cardano/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/cardano/account/account.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:on_chain/on_chain.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/fee_impl.dart b/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/fee_impl.dart index f3dfe8f3..edcbb3ce 100644 --- a/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/fee_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/fee_impl.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/future/widgets/widgets/progress_bar/widgets/progress. import 'package:mrt_wallet/wallet/models/balance/integer/integer.dart'; import 'package:on_chain/ada/ada.dart'; import 'transaction.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; enum CardanoFeeRateType { basic, diff --git a/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/signer_impl.dart b/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/signer_impl.dart index ad5f49c1..6e09260e 100644 --- a/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/signer_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/cardano/transaction/controller/impl/signer_impl.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/wallet/models/signing/signing.dart'; import 'package:mrt_wallet/crypto/derivation/derivation.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:on_chain/ada/ada.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'transaction.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/asset_info.dart b/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/asset_info.dart index af304933..5c02a5fd 100644 --- a/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/asset_info.dart +++ b/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/asset_info.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/networks/cardano/models/utxo_multi_asset.dart'; import 'package:mrt_wallet/wallet/models/token/token/token.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class CardanoAssetsInfoView extends StatelessWidget { const CardanoAssetsInfoView({super.key, required this.asset}); diff --git a/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/send_transaction.dart b/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/send_transaction.dart index 9505063d..bc5a3854 100644 --- a/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/send_transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/send_transaction.dart @@ -10,7 +10,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:on_chain/on_chain.dart'; import 'transaction_certificate_view.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class CardanoBuildTransactionView extends StatelessWidget { const CardanoBuildTransactionView({super.key, required this.controller}); diff --git a/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/utxo_view.dart b/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/utxo_view.dart index 814fae8c..745a5a39 100644 --- a/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/utxo_view.dart +++ b/mrt_wallet/lib/future/wallet/network/cardano/transaction/pages/utxo_view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/network/cardano/transaction/controller/impl/transaction.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class CardanoTransactionUtxoView extends StatelessWidget { const CardanoTransactionUtxoView({required this.controller, super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/conditions.dart b/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/conditions.dart index d13d8ee9..960b2c7b 100644 --- a/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/conditions.dart +++ b/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/conditions.dart @@ -2,7 +2,7 @@ import 'package:cosmos_sdk/cosmos_sdk.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/widgets/progress_bar/widgets/progress.dart'; import 'transaction.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin CosmosTransactionConditions on CosmosTransactiomImpl { late final BaseAccount _ownerAccount; diff --git a/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/signer.dart b/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/signer.dart index 73e0a027..75547842 100644 --- a/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/signer.dart +++ b/mrt_wallet/lib/future/wallet/network/cosmos/transaction/controller/impl/signer.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/derivation/derivation.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'transaction.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin CosmosSignerImpl on CosmosTransactiomImpl { Future _buildTransaction() async { diff --git a/mrt_wallet/lib/future/wallet/network/cosmos/transaction/pages/transfer.dart b/mrt_wallet/lib/future/wallet/network/cosmos/transaction/pages/transfer.dart index 9475cdda..e7fb6af9 100644 --- a/mrt_wallet/lib/future/wallet/network/cosmos/transaction/pages/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/cosmos/transaction/pages/transfer.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/account/pages/account.dart b/mrt_wallet/lib/future/wallet/network/ethereum/account/pages/account.dart index 5a51cbab..db4a8439 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/account/pages/account.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/account/pages/account.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class ETHAccountPageView extends StatelessWidget { const ETHAccountPageView({required this.chainAccount, super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/network/pages/import.dart b/mrt_wallet/lib/future/wallet/network/ethereum/network/pages/import.dart index ff8f98cc..1c526cf2 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/network/pages/import.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/network/pages/import.dart @@ -260,7 +260,7 @@ class __ImportEthereumNetworkState extends State<_ImportEthereumNetwork> } else { pageProgressKey.successText("network_imported_to_your_wallet".tr, backToIdle: false); - widget.web3?.onCompeleteForm?.call(null); + widget.web3?.onCompeleteForm?.call(chainId.toRadix16); } } diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/token/import.dart b/mrt_wallet/lib/future/wallet/network/ethereum/token/import.dart index 00084af6..e1601589 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/token/import.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/token/import.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:on_chain/on_chain.dart'; class ImportERC20TokenView extends StatelessWidget { diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/transaction/controller/impl/fee_impl.dart b/mrt_wallet/lib/future/wallet/network/ethereum/transaction/controller/impl/fee_impl.dart index d68bf7fe..65c6e7cd 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/transaction/controller/impl/fee_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/transaction/controller/impl/fee_impl.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/wallet/network/ethereum/transaction/controller import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/ethereum/utils.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; enum EIP1559FeeSpeed { slow("slow"), diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/gas_fee.dart b/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/gas_fee.dart index 802ff898..e27df409 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/gas_fee.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/gas_fee.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/future/wallet/network/ethereum/transaction/controller import 'package:mrt_wallet/future/wallet/network/ethereum/transaction/pages/fee_select.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/networks/networks.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class EthereumGasFeeView extends StatelessWidget { const EthereumGasFeeView({super.key, required this.transaction}); diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/transfer.dart b/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/transfer.dart index c9be3420..e835f0fb 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/transaction/pages/transfer.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/web3/controller/controller/global.dart b/mrt_wallet/lib/future/wallet/network/ethereum/web3/controller/controller/global.dart index f92ba416..3af06f07 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/web3/controller/controller/global.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/web3/controller/controller/global.dart @@ -14,17 +14,21 @@ class Web3EthereumGlobalRequestController().chalengBytes(), - index: address.keyIndex as Bip32AddressIndex, - )); + final sign = await walletProvider.wallet.walletRequest( + WalletRequestSignMessage( + message: request.params + .cast() + .chalengBytes(), + index: address.keyIndex as Bip32AddressIndex)); if (sign.hasError) { progressKey.error(text: sign.error!.tr); return; diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields.dart b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields.dart index 8cbc7931..417885e7 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/app/constant/global/state.dart'; import 'package:mrt_wallet/future/future.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; -import 'add_ethereum_chains.dart'; +import 'fields/add_ethereum_chains.dart'; import 'transaction.dart'; class EthereumWeb3FieldsView extends StatelessWidget { diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/add_ethereum_chains.dart b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/add_ethereum_chains.dart similarity index 54% rename from mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/add_ethereum_chains.dart rename to mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/add_ethereum_chains.dart index 6eba9a4c..5a1046d4 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/add_ethereum_chains.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/add_ethereum_chains.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/network/ethereum/network/pages/import.dart'; import 'package:mrt_wallet/future/wallet/network/ethereum/web3/controller/controller.dart'; -import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/future/wallet/web3/pages/view_controller.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; class EthereumWeb3AddEthereumChainView extends StatelessWidget { @@ -12,15 +12,16 @@ class EthereumWeb3AddEthereumChainView extends StatelessWidget { final WalletProvider wallet; @override Widget build(BuildContext context) { - return MrtViewBuilder< - Web3EthereumGlobalRequestController>( - repositoryId: request.info.request.requestId, - controller: () => Web3EthereumGlobalRequestController(walletProvider: wallet, request: request), - builder: (controller) { - return SliverFillRemaining( - child: ImportEthereumNetwork.fromWeb3(controller.form)); - }); + return Web3PageRequestControllerView( + width: null, + request: request, + controller: () => + Web3EthereumGlobalRequestController( + walletProvider: wallet, request: request), + builder: (context, controller) => [ + SliverFillRemaining( + child: ImportEthereumNetwork.fromWeb3(controller.form)) + ], + ); } } diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/request_accounts.dart b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/request_accounts.dart index c78c65ba..0862640c 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/request_accounts.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/request_accounts.dart @@ -16,47 +16,32 @@ class EthereumWeb3RequestAccountsView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("active_chain".tr, style: context.textTheme.titleMedium), - Text("web3_switch_chain_desc".tr, - style: context.textTheme.bodyMedium), + Text("ethereum_networks".tr, + style: context.textTheme.titleMedium), + Text("chain_permission_desc".tr), WidgetConstant.height8, AppDropDownBottom( - label: "network".tr, items: { for (final i in field.chains) - i: Text(i.network.coinParam.token.name) + i: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAPPImageView(i.network.token.assetLogo, + radius: 15), + WidgetConstant.width8, + Flexible( + child: OneLineTextWidget( + i.network.token.name, + style: context.textTheme.labelLarge, + ), + ) + ], + ) }, - value: field.activeChain, - onChanged: field.onChangeActiveChain, + isExpanded: true, + onChanged: field.onChangeChain, + value: field.chain, ), - Text("ethereum_networks".tr, - style: context.textTheme.titleMedium), - Text("chain_permission_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - label: "network".tr, - items: { - for (final i in field.chains) - i: Text(i.network.coinParam.token.name) - }, - onChanged: field.onChangeChain, - value: field.chain), - if (field.chainPermission.isNotEmpty) ...[ - WidgetConstant.height20, - Text("default_address".tr, - style: context.textTheme.titleMedium), - Text("default_address_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - isExpanded: true, - label: "default_address".tr, - items: { - for (final i in field.chainPermission) - i: Text(i.address.address) - }, - onChanged: field.onChangeDefaultPermission, - value: field.defaultChainAccount), - ], WidgetConstant.height20, Text("accounts".tr, style: context.textTheme.titleMedium), Text("web3_accounts_permission_desc".tr), @@ -71,15 +56,39 @@ class EthereumWeb3RequestAccountsView extends StatelessWidget { addAutomaticKeepAlives: false, itemBuilder: (c, index) { final addr = field.chain.addresses[index]; - + final permission = field.accountPermission(addr); return ContainerWithBorder( + onTapWhenOnRemove: false, onRemove: () { field.addAccount(addr); }, - onRemoveWidget: IgnorePointer( - child: Checkbox( - value: field.hasPermission(addr), - onChanged: (e) {})), + onRemoveWidget: Column( + children: [ + IconButton( + onPressed: () => field.addAccount(addr), + icon: IgnorePointer( + child: Checkbox( + value: permission != null, + onChanged: (e) {}), + ), + ), + APPAnimatedSize( + isActive: permission != null, + onActive: (context) => IconButton( + tooltip: "default_address".tr, + onPressed: () => + field.onChangeDefaultPermission( + permission), + icon: IgnorePointer( + child: Radio( + value: permission!.defaultAddress, + groupValue: true, + onChanged: (e) {}), + )), + onDeactive: (context) => + WidgetConstant.sizedBox) + ], + ), child: AddressDetailsView(address: addr), ); }, diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/typded_data_sign.dart b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/typded_data_sign.dart index 33d59a8d..74a534d2 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/typded_data_sign.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/web3/pages/fields/typded_data_sign.dart @@ -9,7 +9,6 @@ import 'package:on_chain/solidity/solidity.dart'; class EthereumWeb3TypedDataSignRequestView extends StatelessWidget { const EthereumWeb3TypedDataSignRequestView({required this.request, Key? key}) : super(key: key); - // final Web3EthereumGlobalRequestController controller; final EthereumWeb3Form request; Web3EthreumTypdedData get param => request.request.params; @override diff --git a/mrt_wallet/lib/future/wallet/network/ethereum/web3/permission/ethereum_permission_view.dart b/mrt_wallet/lib/future/wallet/network/ethereum/web3/permission/ethereum_permission_view.dart index 3bef53a5..250f6c15 100644 --- a/mrt_wallet/lib/future/wallet/network/ethereum/web3/permission/ethereum_permission_view.dart +++ b/mrt_wallet/lib/future/wallet/network/ethereum/web3/permission/ethereum_permission_view.dart @@ -9,13 +9,9 @@ import 'package:mrt_wallet/wallet/web3/networks/ethereum/etherum.dart'; import 'package:on_chain/ethereum/src/address/evm_address.dart'; class EthereumWeb3PermissionView extends StatefulWidget { - const EthereumWeb3PermissionView( - {required this.permission, - required this.onUpdateChainPermission, - Key? key}) + const EthereumWeb3PermissionView({required this.permission, Key? key}) : super(key: key); final Web3EthereumChain? permission; - final OnUpdateChainPermission onUpdateChainPermission; @override State createState() => @@ -23,115 +19,41 @@ class EthereumWeb3PermissionView extends StatefulWidget { } class _EthereumWeb3PermissionViewState extends State - with SafeState { - late EthereumChain currentChain; - late Web3EthereumChain permission = - widget.permission ?? Web3EthereumChain.create(); - - late final List chains; - Map> permissions = {}; - late EthereumChain chain; - - Map defaultAccount = {}; - - List get chainPermission => permissions[chain]!; - - Web3EthereumChainAccount? get defaultChainAccount => defaultAccount[chain]; - - void onChangeDefaultPermission(Web3EthereumChainAccount? account) { - if (account == null) return; - defaultAccount[chain] = account; - updateState(); - } - - Web3EthereumChainAccount? accountPermission(IEthAddress address) { - return permissions[chain]!.firstWhereOrNull( - (e) => e.address.address == address.networkAddress.address); - } - - Web3EthereumChainAccount? hasPermission(IEthAddress address) { - return accountPermission(address); - } - - void addAccount(IEthAddress address) { - final exists = accountPermission(address); - if (exists != null) { - permissions[chain]?.remove(exists); - } else { - permissions[chain]?.add(Web3EthereumChainAccount.fromChainAccount( - address: address, chainId: chain.chainId, defaultAddress: false)); - } - if (permissions[chain]!.isEmpty) { - defaultAccount.remove(chain); - } else { - if (!permissions[chain]!.contains(defaultChainAccount)) { - defaultAccount[chain] = permissions[chain]![0]; - } - } - updateState(); + with + SafeState, + Web3PermissionState< + EthereumWeb3PermissionView, + ETHAddress, + EthereumChain, + IEthAddress, + Web3EthereumChainAccount, + Web3EthereumChain> { + @override + Web3EthereumChain createNewChainPermission() { + return Web3EthereumChain.create(chainId: chain.chainId); } - void onChangeCurrentChain(EthereumChain? chain) { - if (chain == null) return; - currentChain = chain; - updateState(); + @override + Web3EthereumChainAccount createNewAccountPermission(IEthAddress address) { + return Web3EthereumChainAccount.fromChainAccount( + address: address, chainId: chain.chainId, defaultAddress: false); } - void onChangeChain(EthereumChain? updateChain) { - chain = updateChain ?? chain; - updateState(); - } - - void complete() { - final newPermission = - Web3EthereumChain.create(chainId: currentChain.chainId); - List accounts = []; - for (final i in permissions.entries) { - List chainAccounts = []; - Web3EthereumChainAccount? defaultAddr = defaultAccount[i.key]; - defaultAddr ??= i.value.isEmpty ? null : i.value.first; - for (final a in i.value) { - Web3EthereumChainAccount account = a; - if (account == defaultAddr && !account.defaultAddress) { - account = account.changeDefault(true); - } else if (account.defaultAddress) { - account = account.changeDefault(false); - } - chainAccounts.add(account); - } - if (chainAccounts.isNotEmpty && - !chainAccounts.any((e) => e.defaultAddress)) { - chainAccounts[0] = chainAccounts[0].changeDefault(true); - } - accounts.addAll(chainAccounts); - } - newPermission.updateChainAccount(accounts); - widget.onUpdateChainPermission(newPermission); - } + bool _initialized = false; @override void didChangeDependencies() { super.didChangeDependencies(); + if (_initialized) return; + _initialized = true; + permission = widget.permission ?? Web3EthereumChain.create(); final wallet = context.watch(StateConst.main); chains = wallet.wallet.getChains().whereType().toList(); - currentChain = chains.firstWhere( - (e) => e.chainId == permission.currentChain, - orElse: () => chains.first); for (final i in chains) { - permissions[i] = permission.accounts - .where((e) => e.chainId == i.network.coinParam.chainId) - .toList(); + permissions[i] = permission.chainAccounts(i); } - chain = chains.firstWhere((e) => e.chainId == currentChain.chainId); - final Map defaultAccount = {}; - for (final i in chains) { - final accounts = permissions[i]!; - final defaultAddress = accounts.firstWhereOrNull((e) => e.defaultAddress); - if (defaultAddress != null) { - defaultAccount[i] = defaultAddress; - } - } - this.defaultAccount = defaultAccount; + chain = chains.firstWhere((e) => e.chainId == permission.currentChain, + orElse: () => chains.first); } @override @@ -140,15 +62,11 @@ class _EthereumWeb3PermissionViewState extends State Web3EthereumChainAccount>( chain: chain, chains: chains, - complete: complete, + onUpdateState: updateState, hasPermission: hasPermission, - onChangeCurrentChain: onChangeCurrentChain, addAccount: addAccount, onChangeChain: onChangeChain, onChangeDefaultAccount: onChangeDefaultPermission, - permissions: permissions[chain]!, - defaultChainAddress: defaultChainAccount, - activeChain: currentChain, ); } } diff --git a/mrt_wallet/lib/future/wallet/network/forms/core/validator/field.dart b/mrt_wallet/lib/future/wallet/network/forms/core/validator/field.dart index ad364959..3c94b81e 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/core/validator/field.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/core/validator/field.dart @@ -53,6 +53,8 @@ class TransactionListFormField { bool get isCompleted => optional || _value.isNotEmpty; final FuncTResult onChangeForm; int get length => value.length; + bool get isEmpty => value.isEmpty; + bool get isNotEmpty => value.isNotEmpty; bool addValue(T v) { if (v == null) return false; if (_value.contains(v)) return false; diff --git a/mrt_wallet/lib/future/wallet/network/forms/cosmos/forms/transfer/transfer.dart b/mrt_wallet/lib/future/wallet/network/forms/cosmos/forms/transfer/transfer.dart index 1db4dc7e..8def5f08 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/cosmos/forms/transfer/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/cosmos/forms/transfer/transfer.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/cosmos/forms/core/cosmos.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class CosmosTransferForm extends CosmosTransactionForm { CosmosTransferForm({required this.network}); diff --git a/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/transfer/transfer.dart b/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/transfer/transfer.dart index 73220a40..ebe8acb0 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/transfer/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/transfer/transfer.dart @@ -1,5 +1,5 @@ import 'package:blockchain_utils/blockchain_utils.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'package:mrt_wallet/crypto/utils/utils.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/web3/request_account_validator.dart b/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/web3/request_account_validator.dart index c948ade8..75a074e9 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/web3/request_account_validator.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ethereum/forms/web3/request_account_validator.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/app/utils/method/utiils.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; @@ -11,15 +11,6 @@ class EthereumRequestAccountForm extends EthereumWeb3Form { late EthereumChain _selectedNetwork = request.chain; EthereumChain get chain => _selectedNetwork; final Web3EthereumChain newPermission; - late EthereumChain _activeChain = - chains.firstWhere((e) => e.chainId == newPermission.currentChain); - - EthereumChain get activeChain => _activeChain; - - void onChangeActiveChain(EthereumChain? chain) { - _activeChain = chain ?? _activeChain; - onChanged?.call(); - } void onChangeChain(EthereumChain? chain) { _selectedNetwork = chain ?? _selectedNetwork; @@ -29,37 +20,23 @@ class EthereumRequestAccountForm extends EthereumWeb3Form { EthereumRequestAccountForm._( {required this.request, required this.permissions, - required Map defaultAccount, required this.newPermission, required List chains}) - : chains = chains.imutable, - _defaultAccount = defaultAccount; + : chains = chains.imutable; factory EthereumRequestAccountForm( {required Web3EthereumRequest request, required List chains}) { - final List currentPermissions = - request.currentPermission?.accounts ?? []; Map> fields = {}; for (final i in chains) { fields[i] = TransactionListFormField( name: "accounts", onChangeForm: (p0) => p0, - values: - currentPermissions.where((e) => e.chainId == i.chainId).toList()); - } - final Map defaultAccount = {}; - for (final i in chains) { - final accounts = fields[i]!.value; - final defaultAddress = accounts.firstWhereOrNull((e) => e.defaultAddress); - if (defaultAddress != null) { - defaultAccount[i] = defaultAddress; - } + values: request.currentPermission?.chainAccounts(i) ?? []); } return EthereumRequestAccountForm._( request: request, chains: chains, - defaultAccount: defaultAccount, permissions: fields, newPermission: Web3EthereumChain.create( chainId: request.currentPermission?.currentChain)); @@ -72,13 +49,9 @@ class EthereumRequestAccountForm extends EthereumWeb3Form { final Map> permissions; - final Map _defaultAccount; - List get chainPermission => permissions[chain]!.value; - Web3EthereumChainAccount? get defaultChainAccount => _defaultAccount[chain]; - Web3EthereumChainAccount? accountPermission(IEthAddress address) { return MethodUtils.nullOnException(() => permissions[chain]! .value @@ -92,8 +65,11 @@ class EthereumRequestAccountForm extends EthereumWeb3Form { } void onChangeDefaultPermission(Web3EthereumChainAccount? account) { - if (account == null) return; - _defaultAccount[chain] = account; + if (account == null || account.defaultAddress) return; + for (var e in chainPermission) { + e.changeDefault(false); + } + account.changeDefault(true); onChanged?.call(); } @@ -107,13 +83,11 @@ class EthereumRequestAccountForm extends EthereumWeb3Form { chainId: chain.network.coinParam.chainId, defaultAddress: false)); } - if (permissions[chain]!.value.isEmpty) { - _defaultAccount.remove(chain); - } else { - if (!permissions[chain]!.value.contains(defaultChainAccount)) { - _defaultAccount[chain] = permissions[chain]!.value[0]; - } + if (permissions[chain]!.isNotEmpty && + !permissions[chain]!.value.any((e) => e.defaultAddress)) { + permissions[chain]!.value[0].changeDefault(true); } + onChanged?.call(); } @@ -121,20 +95,20 @@ class EthereumRequestAccountForm extends EthereumWeb3Form { assert(onCompeleteForm != null, "Must not be null"); List accounts = []; for (final i in permissions.entries) { - Web3EthereumChainAccount? defaultAddr = _defaultAccount[i.key]; - defaultAddr ??= i.value.value.isEmpty ? null : i.value.value.first; - for (final a in i.value.value) { - Web3EthereumChainAccount account = a; - if (account == defaultAddr && !account.defaultAddress) { - account = account.changeDefault(true); - } else if (account.defaultAddress) { - account = account.changeDefault(false); + if (i.value.isEmpty) continue; + final defaultAddresses = i.value.value.where((e) => e.defaultAddress); + if (defaultAddresses.isEmpty) { + i.value.value.first.changeDefault(true); + } else if (defaultAddresses.length > 1) { + for (var e in i.value.value) { + e.changeDefault(false); } - accounts.add(account); + i.value.value.first.changeDefault(true); } + accounts.addAll(i.value.value); } newPermission.updateChainAccount(accounts); - newPermission.setActiveChain(_activeChain); + newPermission.setActiveChain(chain); onCompeleteForm?.call(newPermission); } diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/account_set/account_set.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/account_set/account_set.dart index 3f5b804b..3656c2d2 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/account_set/account_set.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/account_set/account_set.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RippleAccountSetForm implements RippleTransactionForm { /// does not need subject or id beacuse has own page diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_cancel.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_cancel.dart index a6eabba6..f8762493 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_cancel.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_cancel.dart @@ -1,5 +1,5 @@ import 'package:blockchain_utils/utils/numbers/rational/big_rational.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_create.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_create.dart index 3a44cac0..5ee44844 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_create.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_create.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_finish.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_finish.dart index 5e7dc6d0..b7b572ea 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_finish.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/escrow/forms/escrow_finish.dart @@ -1,5 +1,5 @@ import 'package:blockchain_utils/utils/numbers/rational/big_rational.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/accept_offer.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/accept_offer.dart index a2d2ca18..9ebc7ee2 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/accept_offer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/accept_offer.dart @@ -4,7 +4,7 @@ import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RippleAcceptNFTOfferForm implements RippleTransactionForm { final TransactionFormField nftokenSellOffer = TransactionFormField( diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/burn_token.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/burn_token.dart index ca2b9d2d..d97a889d 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/burn_token.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/burn_token.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple. import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RippeBurnTokenForm implements RippleTransactionForm { RippeBurnTokenForm({String? offerID}) { diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/cancel_offer.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/cancel_offer.dart index a1065391..8152ea71 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/cancel_offer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/cancel_offer.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/create_offer.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/create_offer.dart index 118aaee0..64a38bdd 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/create_offer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/create_offer.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/mint_token.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/mint_token.dart index 9e9d5340..8ae5861c 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/mint_token.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/nft/forms/mint_token.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple. import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RippleMintTokenForm implements RippleTransactionForm { final TransactionFormField nftokenTaxon = TransactionFormField( diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/payment/payment.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/payment/payment.dart index 5ee1695b..35af0d28 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/payment/payment.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/payment/payment.dart @@ -6,7 +6,7 @@ import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RipplePaymentForm implements RippleTransactionForm { RipplePaymentForm({required this.token, this.issueToken}); diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/regular_key/regular_key.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/regular_key/regular_key.dart index 431a7cea..872aca61 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/regular_key/regular_key.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/regular_key/regular_key.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/signer_list/signer_list.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/signer_list/signer_list.dart index 4bef9f7d..0bc20c17 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/signer_list/signer_list.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/signer_list/signer_list.dart @@ -1,6 +1,6 @@ import 'package:blockchain_utils/utils/utils.dart'; import 'package:blockchain_utils/utils/numbers/rational/big_rational.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/trust_set/trust_set.dart b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/trust_set/trust_set.dart index fd8c48ae..d6e76241 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/trust_set/trust_set.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ripple/forms/trust_set/trust_set.dart @@ -1,6 +1,6 @@ import 'package:blockchain_utils/utils/utils.dart'; import 'package:blockchain_utils/utils/numbers/rational/big_rational.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; import 'package:mrt_wallet/future/wallet/network/forms/ripple/forms/core/ripple.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_account.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_account.dart index 81f8b7b3..f0ff7f04 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_account.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_account.dart @@ -9,7 +9,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/solana/forms/core/solana. import 'package:on_chain/solana/src/address/sol_address.dart'; import 'package:on_chain/solana/src/instructions/instructions.dart'; import 'package:on_chain/solana/src/models/transaction/instruction.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SolanaCreateAccountForm extends SolanaTransactionForm { bool _manuallyLamports = false; diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_associated_token_account_validator.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_associated_token_account_validator.dart index c754c760..2a1b50f2 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_associated_token_account_validator.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/create_associated_token_account_validator.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/initialize_mint.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/initialize_mint.dart index b145e9c8..4ed5bc56 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/initialize_mint.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/initialize_mint.dart @@ -1,5 +1,5 @@ import 'package:blockchain_utils/utils/utils.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/mint_to.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/mint_to.dart index b0b58d43..dc7cda37 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/mint_to.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/mint_to.dart @@ -6,7 +6,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart' import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; import 'package:mrt_wallet/future/wallet/network/forms/solana/solana.dart'; import 'package:on_chain/solana/solana.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SolanaMintToForm extends SolanaTransactionForm { Token _token = diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/transfer.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/transfer.dart index d60091d7..6d05877a 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/transfer/transfer.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/widgets/widgets/progress_bar/widgets/progress. import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'package:on_chain/solana/solana.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SolanaTransferForm extends SolanaTransactionForm { SolanaTransferForm({required this.token, this.splToken}); diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/requst_account.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/requst_account.dart index 1d9fbd32..f9e19a71 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/requst_account.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/requst_account.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/app/utils/method/utiils.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; @@ -12,62 +12,39 @@ class SolanaRequestAccountForm extends SolanaWeb3Form { SolanaChain get chain => _selectedNetwork; final Web3SolanaChain newPermission; - late SolanaChain _activeChain = chains - .firstWhere((e) => e.network.genesisBlock == newPermission.currentChain); - - SolanaChain get activeChain => _activeChain; - - void onChangeActiveChain(SolanaChain? chain) { - _activeChain = chain ?? _activeChain; - onChanged?.call(); - } - void onChangeChain(SolanaChain? chain) { _selectedNetwork = chain ?? _selectedNetwork; - onChanged?.call(); } void onChangeDefaultPermission(Web3SolanaChainAccount? account) { - if (account == null) return; - _defaultAccount[chain] = account; + if (account == null || account.defaultAddress) return; + for (var e in chainPermission) { + e.changeDefault(false); + } + account.changeDefault(true); onChanged?.call(); } SolanaRequestAccountForm._( {required this.request, required this.permissions, - required Map defaultAccount, required this.newPermission, required List chains}) - : chains = chains.imutable, - _defaultAccount = defaultAccount; + : chains = chains.imutable; factory SolanaRequestAccountForm( {required Web3SolanaRequest request, required List chains}) { - final List currentPermissions = - request.currentPermission?.accounts ?? []; Map> fields = {}; for (final i in chains) { fields[i] = TransactionListFormField( name: "accounts", onChangeForm: (p0) => p0, - values: currentPermissions - .where((e) => e.genesis == i.network.genesisBlock) - .toList()); - } - final Map defaultAccount = {}; - for (final i in chains) { - final accounts = fields[i]!.value; - final defaultAddress = accounts.firstWhereOrNull((e) => e.defaultAddress); - if (defaultAddress != null) { - defaultAccount[i] = defaultAddress; - } + values: request.currentPermission?.chainAccounts(i) ?? []); } return SolanaRequestAccountForm._( request: request, chains: chains, - defaultAccount: defaultAccount, permissions: fields, newPermission: Web3SolanaChain.create( genesisBlock: request.currentPermission?.currentChain)); @@ -79,12 +56,8 @@ class SolanaRequestAccountForm extends SolanaWeb3Form { final Map> permissions; - final Map _defaultAccount; - List get chainPermission => permissions[chain]!.value; - Web3SolanaChainAccount? get defaultChainAccount => _defaultAccount[chain]; - Web3SolanaChainAccount? accountPermission(ISolanaAddress address) { return MethodUtils.nullOnException(() => permissions[chain]! .value @@ -102,12 +75,9 @@ class SolanaRequestAccountForm extends SolanaWeb3Form { genesis: chain.network.genesisBlock, isDefault: false)); } - if (permissions[chain]!.value.isEmpty) { - _defaultAccount.remove(chain); - } else { - if (!permissions[chain]!.value.contains(defaultChainAccount)) { - _defaultAccount[chain] = permissions[chain]!.value[0]; - } + if (permissions[chain]!.isNotEmpty && + !permissions[chain]!.value.any((e) => e.defaultAddress)) { + permissions[chain]!.value[0].changeDefault(true); } onChanged?.call(); } @@ -116,20 +86,20 @@ class SolanaRequestAccountForm extends SolanaWeb3Form { assert(onCompeleteForm != null, "Must not be null"); List accounts = []; for (final i in permissions.entries) { - Web3SolanaChainAccount? defaultAddr = _defaultAccount[i.key]; - defaultAddr ??= i.value.value.isEmpty ? null : i.value.value.first; - for (final a in i.value.value) { - Web3SolanaChainAccount account = a; - if (account == defaultAddr && !account.defaultAddress) { - account = account.changeDefault(true); - } else if (account.defaultAddress) { - account = account.changeDefault(false); + if (i.value.isEmpty) continue; + final defaultAddresses = i.value.value.where((e) => e.defaultAddress); + if (defaultAddresses.isEmpty) { + i.value.value.first.changeDefault(true); + } else if (defaultAddresses.length > 1) { + for (var e in i.value.value) { + e.changeDefault(false); } - accounts.add(account); + i.value.value.first.changeDefault(true); } + accounts.addAll(i.value.value); } newPermission.updateChainAccount(accounts); - newPermission.setActiveChain(_activeChain); + newPermission.setActiveChain(chain); onCompeleteForm?.call(newPermission); } diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/send_transaction.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/send_transaction.dart index d1752235..95ca55b2 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/send_transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/send_transaction.dart @@ -7,6 +7,8 @@ import 'package:mrt_wallet/wallet/api/client/networks/solana/solana.dart'; import 'package:mrt_wallet/wallet/constant/networks/solana.dart'; import 'package:mrt_wallet/wallet/models/balance/integer/integer.dart'; import 'package:mrt_wallet/wallet/models/networks/solana/models/web3_transaction_info.dart'; +import 'package:on_chain/solana/src/address/sol_address.dart'; +import 'package:on_chain/solana/src/transaction/transaction/transaction.dart'; class Web3SolanaSendTransactionForm extends SolanaWeb3Form { @@ -23,12 +25,17 @@ class Web3SolanaSendTransactionForm if (transaction.status.canRetry) { transaction.setSimulatePending(); onChanged?.call(); - final result = await MethodUtils.call(() async => - await _client.simulate(transaction: transaction.transaction)); + final result = await MethodUtils.call(() async => await _client.simulate( + transaction: transaction.transaction, + account: transaction.signer.networkAddress)); if (result.hasError) { transaction.setSimulateErr(); } else { transaction.setSimulateSuccess(result.result); + if (transaction.simulateInfo.accounts?.isNotEmpty ?? false) { + transaction.accountChange + .updateBalance(transaction.simulateInfo.accounts?[0]?.lamports); + } } } onChanged?.call(); @@ -52,6 +59,18 @@ class Web3SolanaSendTransactionForm onChanged?.call(); } + Future replateBlockHash() async { + SolAddress? blockHash; + for (final i in transaction) { + if (!i.canUpdateBlockHash) continue; + blockHash ??= await _client.getBlockHash(); + final updateMessage = + i.transaction.message.copyWith(recentBlockhash: blockHash); + final newTransaction = SolanaTransaction.fromMessage(updateMessage); + i.updateTransaction(newTransaction); + } + } + void init( {required List transactions, required SolanaClient client}) { diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/sign_message.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/sign_message.dart new file mode 100644 index 00000000..bb5b77ef --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/forms/sign_message.dart @@ -0,0 +1,21 @@ +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/solana/forms/core/solana.dart'; +import 'package:mrt_wallet/wallet/web3/networks/solana/params/core/request.dart'; + +class Web3SolanaSignMessageForm + extends SolanaWeb3Form { + @override + OnChangeForm? onChanged; + + Web3SolanaSignMessageForm({required this.request}); + + @override + Web3SolanaRequest request; + + Future signMessage(FuncFutureNullableBoold confirm) async { + final accept = await confirm(); + if (accept != true) return; + onCompeleteForm?.call(true); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/web3.dart b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/web3.dart index 23f2e797..2c0da0e8 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/web3.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/solana/forms/web3/web3.dart @@ -1,3 +1,4 @@ export 'forms/requst_account.dart'; export 'forms/read_only_forms.dart'; export 'forms/send_transaction.dart'; +export 'forms/sign_message.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/substrate/transfer/transfer.dart b/mrt_wallet/lib/future/wallet/network/forms/substrate/transfer/transfer.dart index 65edeb15..fa949051 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/substrate/transfer/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/substrate/transfer/transfer.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/substrate/core/substrate.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:polkadot_dart/polkadot_dart.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SubstrateTransferForm extends SubstrateTransactionForm { SubstrateTransferForm({required this.network}); diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/core/ton.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/core/ton.dart index cba1c2bd..65e23cbf 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/core/ton.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/core/ton.dart @@ -1,7 +1,9 @@ import 'package:mrt_wallet/wallet/models/chain/address/networks/ton/ton.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/app/models/models/typedef.dart'; -import 'package:ton_dart/ton_dart.dart'; +import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'package:ton_dart/ton_dart.dart' as ton_dart; enum TonTransactionType { ton, jetton } @@ -12,8 +14,27 @@ abstract class TonTransactionForm implements TransactionForm { @override String? validateError({ITonAddress? account}); StringVoid? onReadyField; - List toMessages(TonAddress account); + List toMessages(ton_dart.TonAddress account); @override OnChangeForm? onChanged; } + +abstract class TonWeb3Form + implements + Web3Form { + @override + abstract final Web3TonRequest request; + + DynamicVoid? onStimateChanged; + @override + ObjectVoid? onCompeleteForm; + + @override + String get name => request.params.method.name; + + void confirmRequest({Object? response}) { + onCompeleteForm?.call(response); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/forms.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/forms.dart index befd9c0f..38ab3874 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/forms.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/forms.dart @@ -1,2 +1,3 @@ export 'core/ton.dart'; export 'transfer/transfer.dart'; +export 'web3/web3.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/transfer/transfer.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/transfer/transfer.dart index 6464f18e..f3f53e33 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/transfer/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/transfer/transfer.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart import 'package:mrt_wallet/future/wallet/network/forms/ton/forms/core/ton.dart'; import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; import 'package:ton_dart/ton_dart.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TonTransferForm extends TonTransactionForm { final WalletTonNetwork network; diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/read_only_forms.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/read_only_forms.dart new file mode 100644 index 00000000..3bd7456a --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/read_only_forms.dart @@ -0,0 +1,14 @@ +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/forms/core/ton.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/core/request.dart'; + +class Web3TonReadOnlyForm + extends TonWeb3Form { + @override + OnChangeForm? onChanged; + + Web3TonReadOnlyForm({required this.request}); + + @override + Web3TonRequest request; +} diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/requst_account.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/requst_account.dart new file mode 100644 index 00000000..edd21109 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/requst_account.dart @@ -0,0 +1,109 @@ +import 'package:mrt_wallet/app/utils/list/extension.dart'; +import 'package:mrt_wallet/app/utils/method/utiils.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/forms/core/ton.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; + +class TonRequestAccountForm extends TonWeb3Form { + final List chains; + late TheOpenNetworkChain _selectedNetwork = request.chain; + TheOpenNetworkChain get chain => _selectedNetwork; + final Web3TonChain newPermission; + + void onChangeChain(TheOpenNetworkChain? chain) { + _selectedNetwork = chain ?? _selectedNetwork; + + onChanged?.call(); + } + + void onChangeDefaultPermission(Web3TonChainAccount? account) { + if (account == null || account.defaultAddress) return; + for (var e in chainPermission) { + e.changeDefault(false); + } + account.changeDefault(true); + onChanged?.call(); + } + + TonRequestAccountForm._( + {required this.request, + required this.permissions, + required this.newPermission, + required List chains}) + : chains = chains.imutable; + factory TonRequestAccountForm( + {required Web3TonRequest request, + required List chains}) { + Map> + fields = {}; + for (final i in chains) { + fields[i] = TransactionListFormField( + name: "accounts", + onChangeForm: (p0) => p0, + values: request.currentPermission?.chainAccounts(i) ?? []); + } + return TonRequestAccountForm._( + request: request, + chains: chains, + permissions: fields, + newPermission: Web3TonChain.create( + workChain: request.currentPermission?.currentChain)); + } + @override + OnChangeForm? onChanged; + @override + String get name => request.params.method.name; + final Map> + permissions; + + List get chainPermission => permissions[chain]!.value; + + Web3TonChainAccount? accountPermission(ITonAddress address) { + return MethodUtils.nullOnException(() => permissions[chain]! + .value + .firstWhere((e) => e.address == address.networkAddress)); + } + + void addAccount(ITonAddress address) { + final exists = accountPermission(address); + if (exists != null) { + permissions[chain]?.removeValue(exists); + } else { + permissions[chain]?.addValue(Web3TonChainAccount.fromChainAccount( + address: address, + workChain: chain.network.coinParam.workchain, + isDefault: false)); + } + if (permissions[chain]!.isNotEmpty && + !permissions[chain]!.value.any((e) => e.defaultAddress)) { + permissions[chain]!.value[0].changeDefault(true); + } + onChanged?.call(); + } + + void complete() { + assert(onCompeleteForm != null, "Must not be null"); + List accounts = []; + for (final i in permissions.entries) { + if (i.value.isEmpty) continue; + final defaultAddresses = i.value.value.where((e) => e.defaultAddress); + if (defaultAddresses.isEmpty) { + i.value.value.first.changeDefault(true); + } else if (defaultAddresses.length > 1) { + for (var e in i.value.value) { + e.changeDefault(false); + } + i.value.value.first.changeDefault(true); + } + accounts.addAll(i.value.value); + } + newPermission.updateChainAccount(accounts); + newPermission.setActiveChain(chain); + onCompeleteForm?.call(newPermission); + } + + @override + final Web3TonRequest request; +} diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/send_transaction.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/send_transaction.dart new file mode 100644 index 00000000..ad0efc42 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/send_transaction.dart @@ -0,0 +1,69 @@ +import 'package:mrt_wallet/app/utils/list/extension.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/forms/core/ton.dart'; +import 'package:mrt_wallet/wallet/api/client/client.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/models/networks/ton/ton.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class Web3TonSendTransactionForm extends TonWeb3Form { + @override + OnChangeForm? onChanged; + Web3TonSendTransactionForm({required this.request}); + late final List _messages; + late final TonClient _client; + late final VersionedWalletContract wallet; + late final int _validUntil; + late final TonAccountContext _accountContext; + + int? _seqno; + int get seqno => _seqno!; + List get messages => _messages; + + BigInt get totalTon { + return messages.fold( + BigInt.zero, + (p, c) => + p + (c.amount.balance + (c.payload?.tonAmount ?? BigInt.zero))); + } + + void init( + {required List messages, + required TonClient client, + required ITonAddress owner, + required int validUntil}) { + _messages = messages.imutable; + _client = client; + wallet = owner.toWalletContract(); + _validUntil = validUntil; + _accountContext = owner.context; + } + + Future createMessageBody() async { + _seqno ??= await wallet.getSeqno(_client.provider); + final actions = _messages + .map((e) => OutActionSendMsg(outMessage: e.toMessage())) + .toList(); + return _accountContext.buildTransaction( + actions: actions, + state: wallet.state!, + seqno: _seqno!, + chain: wallet.chain, + timeOut: _validUntil); + } + + Future createEstimateMessage() async { + final fakeSignature = List.unmodifiable(List.filled(64, 0)); + final messageBody = await createMessageBody(); + return _accountContext.toExternalMessage( + message: messageBody, + signature: fakeSignature, + destination: wallet.address, + state: (seqno == 0 ? wallet.state!.initialState() : null)); + } + + @override + Web3TonRequest + request; +} diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/sign_message.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/sign_message.dart new file mode 100644 index 00000000..de867ebc --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/forms/sign_message.dart @@ -0,0 +1,21 @@ +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/forms/core/ton.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/core/request.dart'; + +class Web3TonSignMessageForm + extends TonWeb3Form { + @override + OnChangeForm? onChanged; + + Web3TonSignMessageForm({required this.request}); + + @override + Web3TonRequest request; + + Future signMessage(FuncFutureNullableBoold confirm) async { + final accept = await confirm(); + if (accept != true) return; + onCompeleteForm?.call(true); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/web3.dart b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/web3.dart new file mode 100644 index 00000000..2c0da0e8 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/forms/ton/forms/web3/web3.dart @@ -0,0 +1,4 @@ +export 'forms/requst_account.dart'; +export 'forms/read_only_forms.dart'; +export 'forms/send_transaction.dart'; +export 'forms/sign_message.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account.dart index f2582a50..982d3fa3 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronUpdateAccountForm extends TronTransactionForm { @override diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account_permission.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account_permission.dart index 8ea724a8..f3ef66eb 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account_permission.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/account/forms/update_account_permission.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronAccountUpdatePermissionForm extends TronTransactionForm { TronAccountUpdatePermissionForm({required this.permissions}); diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/delegated_resource.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/delegated_resource.dart index 3065684f..40b5f4ba 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/delegated_resource.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/delegated_resource.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronDelegatedResourceV2Form extends TronTransactionForm { @override diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/freez_balance_v2.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/freez_balance_v2.dart index 6f9cab87..4a5d6aa6 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/freez_balance_v2.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/freez_balance_v2.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronFreezBalanceV2Form extends TronTransactionForm { @override diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/undelegated_resource.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/undelegated_resource.dart index 22b1c04a..04d8e0ef 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/undelegated_resource.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/undelegated_resource.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronUnDelegatedResourceV2Form extends TronTransactionForm { @override diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/unfreez_balance_v2.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/unfreez_balance_v2.dart index 35de6c4d..e4362ca0 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/unfreez_balance_v2.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/resource_v2/forms/unfreez_balance_v2.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronUnFreezBalanceV2Form extends TronTransactionForm { TronUnFreezBalanceV2Form({required this.accountInfo}); diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/transfer/transfer.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/transfer/transfer.dart index f919841b..d402659f 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/transfer/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/transfer/transfer.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/utils.dart'; import 'package:on_chain/on_chain.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronTransferForm extends TronTransactionForm { TronTransferForm( diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/vote_sr/forms/create_witness.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/vote_sr/forms/create_witness.dart index ed7a8735..484a333a 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/vote_sr/forms/create_witness.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/vote_sr/forms/create_witness.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/core.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronCreateWitnessForm extends TronTransactionForm { @override diff --git a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/web3/forms/requst_account.dart b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/web3/forms/requst_account.dart index 5f9c539b..429635ba 100644 --- a/mrt_wallet/lib/future/wallet/network/forms/tron/forms/web3/forms/requst_account.dart +++ b/mrt_wallet/lib/future/wallet/network/forms/tron/forms/web3/forms/requst_account.dart @@ -1,5 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; -import 'package:mrt_wallet/app/utils/method/utiils.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/field.dart'; import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/core/tron.dart'; @@ -12,16 +11,6 @@ class TronRequestAccountForm extends TronWeb3Form { TronChain get chain => _selectedNetwork; final Web3TronChain newPermission; - late TronChain _activeChain = chains.firstWhere( - (e) => e.network.tronNetworkType == newPermission.currentChain); - - TronChain get activeChain => _activeChain; - - void onChangeActiveChain(TronChain? chain) { - _activeChain = chain ?? _activeChain; - onChanged?.call(); - } - void onChangeChain(TronChain? chain) { _selectedNetwork = chain ?? _selectedNetwork; @@ -29,44 +18,32 @@ class TronRequestAccountForm extends TronWeb3Form { } void onChangeDefaultPermission(Web3TronChainAccount? account) { - if (account == null) return; - _defaultAccount[chain] = account; + if (account == null || account.defaultAddress) return; + for (var e in chainPermission) { + e.changeDefault(false); + } + account.changeDefault(true); onChanged?.call(); } TronRequestAccountForm._( {required this.request, required this.permissions, - required Map defaultAccount, required this.newPermission, required List chains}) - : chains = chains.imutable, - _defaultAccount = defaultAccount; + : chains = chains.imutable; factory TronRequestAccountForm( {required Web3TronRequest request, required List chains}) { - final List currentPermissions = - request.currentPermission?.accounts ?? []; Map> fields = {}; for (final i in chains) { fields[i] = TransactionListFormField( name: "accounts", onChangeForm: (p0) => p0, - values: currentPermissions - .where((e) => e.chain == i.network.tronNetworkType) - .toList()); - } - final Map defaultAccount = {}; - for (final i in chains) { - final accounts = fields[i]!.value; - final defaultAddress = accounts.firstWhereOrNull((e) => e.defaultAddress); - if (defaultAddress != null) { - defaultAccount[i] = defaultAddress; - } + values: request.currentPermission?.chainAccounts(i) ?? []); } return TronRequestAccountForm._( request: request, chains: chains, - defaultAccount: defaultAccount, permissions: fields, newPermission: Web3TronChain.create( chain: request.currentPermission?.currentChain)); @@ -78,17 +55,11 @@ class TronRequestAccountForm extends TronWeb3Form { final Map> permissions; - final Map _defaultAccount; - List get chainPermission => permissions[chain]!.value; - Web3TronChainAccount? get defaultChainAccount => _defaultAccount[chain]; - Web3TronChainAccount? accountPermission(ITronAddress address) { - return MethodUtils.nullOnException(() => permissions[chain]! - .value - .firstWhere((e) => - e.address.toAddress() == address.networkAddress.toAddress())); + return permissions[chain]!.value.firstWhereOrNull((e) => + e.address == address.networkAddress && e.keyIndex == address.keyIndex); } void addAccount(ITronAddress address) { @@ -101,12 +72,9 @@ class TronRequestAccountForm extends TronWeb3Form { chain: chain.network.tronNetworkType, isDefault: false)); } - if (permissions[chain]!.value.isEmpty) { - _defaultAccount.remove(chain); - } else { - if (!permissions[chain]!.value.contains(defaultChainAccount)) { - _defaultAccount[chain] = permissions[chain]!.value[0]; - } + if (permissions[chain]!.isNotEmpty && + !permissions[chain]!.value.any((e) => e.defaultAddress)) { + permissions[chain]!.value[0].changeDefault(true); } onChanged?.call(); } @@ -115,20 +83,20 @@ class TronRequestAccountForm extends TronWeb3Form { assert(onCompeleteForm != null, "Must not be null"); List accounts = []; for (final i in permissions.entries) { - Web3TronChainAccount? defaultAddr = _defaultAccount[i.key]; - defaultAddr ??= i.value.value.isEmpty ? null : i.value.value.first; - for (final a in i.value.value) { - Web3TronChainAccount account = a; - if (account == defaultAddr && !account.defaultAddress) { - account = account.changeDefault(true); - } else if (account.defaultAddress) { - account = account.changeDefault(false); + if (i.value.isEmpty) continue; + final defaultAddresses = i.value.value.where((e) => e.defaultAddress); + if (defaultAddresses.isEmpty) { + i.value.value.first.changeDefault(true); + } else if (defaultAddresses.length > 1) { + for (var e in i.value.value) { + e.changeDefault(false); } - accounts.add(account); + i.value.value.first.changeDefault(true); } + accounts.addAll(i.value.value); } newPermission.updateChainAccount(accounts); - newPermission.setActiveChain(_activeChain); + newPermission.setActiveChain(chain); onCompeleteForm?.call(newPermission); } diff --git a/mrt_wallet/lib/future/wallet/network/ripple/account/account.dart b/mrt_wallet/lib/future/wallet/network/ripple/account/account.dart index be3d0185..19bd7dd8 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/account/account.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RippleAccountPageView extends StatelessWidget { const RippleAccountPageView({required this.chainAccount, super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/ripple/settings/pages/ripple_feature_page.dart b/mrt_wallet/lib/future/wallet/network/ripple/settings/pages/ripple_feature_page.dart index 8e29a279..a75961ce 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/settings/pages/ripple_feature_page.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/settings/pages/ripple_feature_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/account/pages/account_controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/controller.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/controller.dart index 11a29fc4..00b2b269 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/controller.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/controller.dart @@ -12,7 +12,7 @@ import 'package:mrt_wallet/crypto/derivation/derivation/bip32.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class RippleTransactionStateController extends RippleTransactionImpl with RippleMemoImpl, RippleFeeImpl, RippleSignTransactionImpl { diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/impl/sign_transaction_impl.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/impl/sign_transaction_impl.dart index 2c789e9b..d112f5dc 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/impl/sign_transaction_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/controller/impl/sign_transaction_impl.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/ripple/ripple.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin RippleSignTransactionImpl on RippleTransactionImpl { Future signAndSendTransaction( diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/account_set_fields.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/account_set_fields.dart index 0a0fb889..0cae1f81 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/account_set_fields.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/account_set_fields.dart @@ -1,6 +1,6 @@ import 'package:blockchain_utils/utils/utils.dart'; import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/create_ripple_memo.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/create_ripple_memo.dart index 0220c47f..a7aaaf4a 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/create_ripple_memo.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/create_ripple_memo.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/memo.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/memo.dart index 724fdddf..2115a502 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/memo.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/memo.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:xrpl_dart/xrpl_dart.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; typedef OnTapMemo = Function(XRPLMemo); diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/payment_fields.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/payment_fields.dart index 5ba9d918..1ba96f05 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/payment_fields.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/payment_fields.dart @@ -1,6 +1,6 @@ import 'package:blockchain_utils/utils/utils.dart'; import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/ripple_memo_fee.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/ripple_memo_fee.dart index f15f72b9..a977f7fa 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/ripple_memo_fee.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/ripple_memo_fee.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/global/pages/setup_transaction_fee.dart'; import 'package:mrt_wallet/future/wallet/network/ripple/transaction/pages/pages/create_ripple_memo.dart'; import 'package:mrt_wallet/future/wallet/network/ripple/transaction/controller/impl/transaction_impl.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/transfer.dart b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/transfer.dart index fa955230..b094afbe 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/transaction/pages/pages/transfer.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/ripple/transaction/pages/pages/ripple_tranaction_fields_view.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ripple/widgets/nft_info.dart b/mrt_wallet/lib/future/wallet/network/ripple/widgets/nft_info.dart index 11c4c59e..ed8d6ba4 100644 --- a/mrt_wallet/lib/future/wallet/network/ripple/widgets/nft_info.dart +++ b/mrt_wallet/lib/future/wallet/network/ripple/widgets/nft_info.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/nfts/networks/ripple.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/solana/account/account.dart b/mrt_wallet/lib/future/wallet/network/solana/account/account.dart index a8bc5419..30d5e45f 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/account/account.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SolanaAccountPageView extends StatelessWidget { const SolanaAccountPageView({required this.chainAccount, super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/solana/network/update.dart b/mrt_wallet/lib/future/wallet/network/solana/network/update.dart index f0de5f94..9f579328 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/network/update.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/network/update.dart @@ -3,7 +3,7 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/global/pages/select_provider.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:on_chain/solana/solana.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/solana/token/account_spl_tokens_view.dart b/mrt_wallet/lib/future/wallet/network/solana/token/account_spl_tokens_view.dart index 40dfba19..b79b0f2d 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/token/account_spl_tokens_view.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/token/account_spl_tokens_view.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/account/pages/account_controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:on_chain/solana/src/instructions/spl_token/constant.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SolanaImportSPLTokensView extends StatelessWidget { const SolanaImportSPLTokensView({super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/solana/transaction/controller/imp/signer_impl.dart b/mrt_wallet/lib/future/wallet/network/solana/transaction/controller/imp/signer_impl.dart index 62788b0e..559bbca4 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/transaction/controller/imp/signer_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/transaction/controller/imp/signer_impl.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/wallet/models/signing/signing.dart'; import 'package:mrt_wallet/crypto/derivation/derivation/bip32.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:on_chain/solana/solana.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin SolanaSignerImpl on SolanaTransactionImpl { Future _buildAndSigneTransaction() async { diff --git a/mrt_wallet/lib/future/wallet/network/solana/transaction/pages/pages/transfer.dart b/mrt_wallet/lib/future/wallet/network/solana/transaction/pages/pages/transfer.dart index 7baa3706..39004183 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/transaction/pages/pages/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/transaction/pages/pages/transfer.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'transaction.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/global.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/global.dart index 7db0dd00..e28f4590 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/global.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/global.dart @@ -1,10 +1,10 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/crypto/derivation/derivation/bip32.dart'; -import 'package:mrt_wallet/crypto/models/networks.dart'; -import 'package:mrt_wallet/crypto/requets/messages/wallet/requests/personal_sign.dart'; +import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; import 'package:mrt_wallet/future/wallet/network/solana/web3/controller/impl/impl.dart'; import 'package:mrt_wallet/future/wallet/web3/web3.dart'; +import 'package:mrt_wallet/wallet/models/models.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; class Web3SolanaGlobalRequestController().chalengBytes(), - network: NetworkType.solana, - index: address.keyIndex as Bip32AddressIndex)); - if (sign.hasError) { - progressKey.error(text: sign.error!.tr); + if (obj != true) { + progressKey.idle(); + return; + } + final signingParams = request.params as Web3SolanaSignMessage; + final signMessage = await MethodUtils.call(() async { + final signature = await walletProvider.wallet.signTransaction( + request: WalletSigningRequest( + addresses: [address], + network: network, + sign: (generateSignature) async { + final signRequest = GlobalSignRequest.solana( + digest: signingParams.chalengBytes(), + index: address.keyIndex as Bip32AddressIndex); + final response = await generateSignature(signRequest); + return response.signature; + }, + )); + return signature.result; + }); + if (signMessage.hasError) { + progressKey.error(text: signMessage.error!.tr); return; } - result = sign.result.signature; + result = Web3SolanaSignMessageResponse( + address: address.networkAddress, signature: signMessage.result); break; default: break; diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/transaction.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/transaction.dart index 6336e257..ffbe674e 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/controller/controller/transaction.dart @@ -1,5 +1,6 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/crypto/derivation/derivation/bip32.dart'; +import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; import 'package:mrt_wallet/future/wallet/network/forms/solana/forms/forms.dart'; @@ -16,43 +17,91 @@ class Web3SolanaTransactionRequestController extends Web3SolanaImpl< @override Web3SolanaSendTransactionForm get form => liveRequest.validator as Web3SolanaSendTransactionForm; - bool get isMultipleTransaction => form.transaction.length > 1; + bool get isMultipleTransaction => request.params.isBatchRequest; Web3SolanaSendTransactionOptions? _sendOption; - bool get isSend => _sendOption != null; - // bool _instructionReady = false; + bool get isSend => request.params.isSend; + bool _hasSimulateError = false; + bool _isReady = false; + bool get isReady => _isReady; + bool _canReplaceBlockHash = false; + bool get canReplaceBlockHash => _canReplaceBlockHash; + bool _replaceBlockHash = false; + bool get replaceBlockHash => _replaceBlockHash; + late final IntegerBalance total = IntegerBalance.zero(network.coinDecimal); + bool _isMultipleWithSameOwner = false; + bool get isMultipleWithSameOwner => _isMultipleWithSameOwner; Web3SolanaTransactionRequestController({ required super.walletProvider, required super.request, }) : super(account: request.chain); + void toggleReplaceBlockHash(bool? _) { + if (!isSend) return; + _replaceBlockHash = !_replaceBlockHash; + notify(); + } + Future _init() async { + progressKey.process(text: "transaction_retrieval_requirment".tr); try { - progressKey.process(text: "transaction_retrieval_requirment".tr); final params = request.params.messages; List messagess = []; for (final i in params) { + final permission = request.authenticated + .getChainFromNetworkType(NetworkType.solana) + ?.getAccountPermission(chain: account, address: i.account); + + if (permission == null) { + throw Web3RequestExceptionConst.missingPermission; + } final message = SolanaTransaction.deserialize(i.messageBytes); final simulate = SolanaWeb3TransactionInfo( - transaction: message, - signer: account.getAddress(i.account.address)!, - id: i.id); + transaction: message, signer: permission, id: i.id); messagess.add(simulate); + apiProvider + .updateBalance(permission, updateTokens: false) + .then((e) => _checkTransaction); } _sendOption = request.params.sendConfig; form.init(transactions: messagess, client: apiProvider); + final hasSameOwner = + form.transaction.map((e) => e.signer.networkAddress).toSet().length != + form.transaction.length; + _isMultipleWithSameOwner = isMultipleTransaction && hasSameOwner; + _canReplaceBlockHash = + isSend && form.transaction.any((e) => e.canUpdateBlockHash); progressKey.idle(); - // ignore: empty_catches - } catch (e) {} + } on Web3RequestException catch (e) { + progressKey.error( + text: "web3_permission_error_desc".tr, backToIdle: null); + request.error(e); + } } - Future confirm(Future Function() onFailedInstruction) async { - final isReady = !form.transaction.any((e) => e.status.hasSimulateError); - if (!isReady) { - final accept = await onFailedInstruction(); + void _checkTransaction() { + _hasSimulateError = form.transaction.any((e) => e.status.hasSimulateError); + _isReady = !form.transaction.any((e) => !e.status.isSuccess); + final totalAccountsBalances = form.transaction + .fold(BigInt.zero, (p, c) => p + c.signer.address.currencyBalance); + final totalSol = form.transaction + .fold(BigInt.zero, (p, c) => p + c.accountChange.balance); + total.updateBalance(totalAccountsBalances - totalSol); + notify(); + } + + Future confirm( + Future Function(String error) onFailedInstruction) async { + if (!_isReady) { + final accept = await onFailedInstruction(_hasSimulateError + ? "simulation_failed_continue_desc".tr + : "simulation_process_continue_desc".tr); if (accept != true) return; } progressKey.process(text: "signing_transaction_please_wait".tr); + if (_canReplaceBlockHash) { + await form.replateBlockHash(); + } final signerAccounts = form.transaction.map((e) => e.signer).toList(); final signedTr = await walletProvider.wallet.signTransaction( @@ -78,7 +127,7 @@ class Web3SolanaTransactionRequestController extends Web3SolanaImpl< }, )); if (signedTr.hasError) { - progressKey.error(text: signedTr.error); + progressKey.error(text: signedTr.error!.tr); return; } final List result = signedTr.result; @@ -153,7 +202,7 @@ class Web3SolanaTransactionRequestController extends Web3SolanaImpl< } void onChange([bool? changed]) { - notify(); + _checkTransaction(); } @override diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/controller/impl/impl.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/controller/impl/impl.dart index 13d05b07..e8c886e3 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/controller/impl/impl.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/controller/impl/impl.dart @@ -27,12 +27,16 @@ abstract class Web3SolanaImpl _buildForm() { switch (request.params.method) { case Web3SolanaRequestMethods.requestAccounts: - final tronChains = walletProvider.wallet.getChains(); - return SolanaRequestAccountForm(request: request, chains: tronChains) + final solanaChains = walletProvider.wallet.getChains(); + return SolanaRequestAccountForm(request: request, chains: solanaChains) as SolanaWeb3Form; case Web3SolanaRequestMethods.signMessage: - return Web3SolanaReadOnlyForm(request: request) as SolanaWeb3Form; + return Web3SolanaSignMessageForm(request: request) + as SolanaWeb3Form; case Web3SolanaRequestMethods.signTransaction: + case Web3SolanaRequestMethods.signAllTransactions: + case Web3SolanaRequestMethods.sendTransaction: + case Web3SolanaRequestMethods.sendAllTransactions: return Web3SolanaSendTransactionForm( request: request as Web3SolanaRequest>, Web3SolanaSendTransaction>) as SolanaWeb3Form; diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields.dart index 5d59e660..465a0c60 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields.dart @@ -16,11 +16,15 @@ class SolanaWeb3FieldsView extends StatelessWidget { case Web3SolanaRequestMethods.requestAccounts: return SolanaWeb3GlobalFieldsView(request: request, wallet: wallet); case Web3SolanaRequestMethods.signMessage: - return SolanaWeb3GlobalFieldsView, Web3SolanaSignMessage>( - request: - request as Web3SolanaRequest, Web3SolanaSignMessage>, + return SolanaWeb3GlobalFieldsView( + request: request as Web3SolanaRequest, wallet: wallet); case Web3SolanaRequestMethods.signTransaction: + case Web3SolanaRequestMethods.signAllTransactions: + case Web3SolanaRequestMethods.sendTransaction: + case Web3SolanaRequestMethods.sendAllTransactions: return SolanaWeb3TransactionFieldsView( request: request.cast(), wallet: wallet); default: diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/request_account.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/request_account.dart index 331237b9..44dbfa69 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/request_account.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/request_account.dart @@ -16,47 +16,30 @@ class SolanaWeb3RequestAccountsView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("active_chain".tr, style: context.textTheme.titleMedium), - Text("web3_switch_chain_desc".tr, - style: context.textTheme.bodyMedium), - WidgetConstant.height8, - AppDropDownBottom( - label: "network".tr, - items: { - for (final i in field.chains) - i: Text(i.network.coinParam.token.name) - }, - value: field.activeChain, - onChanged: field.onChangeActiveChain, - ), - WidgetConstant.height20, - Text("tron_networks".tr, style: context.textTheme.titleMedium), + Text("solana_networks".tr, style: context.textTheme.titleMedium), Text("chain_permission_desc".tr), WidgetConstant.height8, AppDropDownBottom( - label: "network".tr, items: { for (final i in field.chains) - i: Text(i.network.coinParam.token.name) + i: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAPPImageView(i.network.token.assetLogo, + radius: 15), + WidgetConstant.width8, + Flexible( + child: OneLineTextWidget( + i.network.token.name, + style: context.textTheme.labelLarge, + ), + ) + ], + ) }, + isExpanded: true, onChanged: field.onChangeChain, value: field.chain), - if (field.chainPermission.isNotEmpty) ...[ - WidgetConstant.height20, - Text("default_address".tr, - style: context.textTheme.titleMedium), - Text("default_address_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - isExpanded: true, - label: "default_address".tr, - items: { - for (final i in field.chainPermission) - i: Text(i.address.address) - }, - onChanged: field.onChangeDefaultPermission, - value: field.defaultChainAccount), - ], WidgetConstant.height20, Text("accounts".tr, style: context.textTheme.titleMedium), Text("web3_accounts_permission_desc".tr), @@ -73,13 +56,37 @@ class SolanaWeb3RequestAccountsView extends StatelessWidget { final addr = field.chain.addresses[index]; final permission = field.accountPermission(addr); return ContainerWithBorder( + onTapWhenOnRemove: false, onRemove: () { field.addAccount(addr); }, - onRemoveWidget: IgnorePointer( - child: Checkbox( - value: permission != null, - onChanged: (e) {})), + onRemoveWidget: Column( + children: [ + IconButton( + onPressed: () => field.addAccount(addr), + icon: IgnorePointer( + child: Checkbox( + value: permission != null, + onChanged: (e) {}), + ), + ), + APPAnimatedSize( + isActive: permission != null, + onActive: (context) => IconButton( + tooltip: "default_address".tr, + onPressed: () => + field.onChangeDefaultPermission( + permission), + icon: IgnorePointer( + child: Radio( + value: permission!.defaultAddress, + groupValue: true, + onChanged: (e) {}), + )), + onDeactive: (context) => + WidgetConstant.sizedBox) + ], + ), child: AddressDetailsView(address: addr), ); }, diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message.dart new file mode 100644 index 00000000..a9e52ebc --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/future/future.dart'; +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/wallet/web3/networks/networks.dart'; + +class SolanaWeb3SignMessageRequestView extends StatelessWidget { + const SolanaWeb3SignMessageRequestView({required this.request, Key? key}) + : super(key: key); + final Web3SolanaSignMessageForm request; + Web3SolanaSignMessage get param => request.request.params; + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ContainerWithBorder( + backgroundColor: context.colors.errorContainer, + onTapWhenOnRemove: false, + child: Row( + children: [ + Icon( + Icons.warning, + color: context.colors.error, + size: APPConst.double40, + ), + WidgetConstant.width8, + Expanded( + child: Text("sign_message_private_key_desc".tr, + style: context.colors.onErrorContainer + .bodyMedium(context)), + ), + ], + )), + WidgetConstant.height20, + Text("message".tr, style: context.textTheme.titleMedium), + Text("sign_message_private_key".tr), + WidgetConstant.height8, + ContainerWithBorder( + onRemove: () {}, + onRemoveWidget: + CopyTextIcon(dataToCopy: param.challeng, isSensitive: false), + onTapWhenOnRemove: false, + child: Text(param.challeng, + style: + context.colors.onPrimaryContainer.bodyMedium(context))), + if (param.content != null) ...[ + WidgetConstant.height20, + Text("content".tr, style: context.textTheme.titleMedium), + ContainerWithBorder( + onRemove: () {}, + onRemoveWidget: CopyTextIcon( + dataToCopy: param.content ?? "", isSensitive: false), + onTapWhenOnRemove: false, + child: SelectableText( + param.content ?? "", + style: context.colors.onPrimaryContainer.bodyMedium(context), + minLines: 1, + maxLines: 5, + )), + ], + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FixedElevatedButton( + padding: WidgetConstant.paddingVertical40, + child: Text("sign_message".tr), + onPressed: () { + request.signMessage(() async { + return context.openSliverDialog( + (ctx) => DialogTextView( + widget: Column( + children: [ + Icon( + Icons.warning, + color: context.colors.error, + size: APPConst.double80, + ), + WidgetConstant.height8, + ContainerWithBorder( + backgroundColor: + context.colors.errorContainer, + onTapWhenOnRemove: false, + child: Text( + "sign_message_private_key_desc".tr, + style: context.colors.onErrorContainer + .bodyMedium(context))), + ], + ), + buttonWidget: const AsyncDialogDoubleButtonView(), + text: "sign_message_private_key_desc".tr), + "sign_message".tr); + }); + }) + ], + ) + ], + ), + ); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message_v2.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message_v2.dart deleted file mode 100644 index 0fd36487..00000000 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/fields/sign_message_v2.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:mrt_wallet/app/core.dart'; -import 'package:mrt_wallet/future/future.dart'; -import 'package:mrt_wallet/future/state_managment/state_managment.dart'; -import 'package:mrt_wallet/wallet/web3/networks/networks.dart'; - -class SolanaWeb3SignMessageRequestView extends StatelessWidget { - const SolanaWeb3SignMessageRequestView({required this.request, Key? key}) - : super(key: key); - final SolanaWeb3Form request; - Web3SolanaSignMessage get param => request.request.params; - @override - Widget build(BuildContext context) { - return SliverToBoxAdapter( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("message".tr, style: context.textTheme.titleMedium), - TextAndLinkView( - text: "eth_personal_sign_desc".tr, - url: LinkConst.aboutEthereumPersonalSign, - linkDesc: "read_more".tr), - WidgetConstant.height8, - ContainerWithBorder( - onRemove: () {}, - onRemoveWidget: - CopyTextIcon(dataToCopy: param.challeng, isSensitive: false), - onTapWhenOnRemove: false, - child: Text(param.challeng, - style: - context.colors.onPrimaryContainer.bodyMedium(context))), - if (param.content != null) ...[ - WidgetConstant.height20, - Text("content".tr, style: context.textTheme.titleMedium), - ContainerWithBorder( - onRemove: () {}, - onRemoveWidget: CopyTextIcon( - dataToCopy: param.content ?? "", isSensitive: false), - onTapWhenOnRemove: false, - child: SelectableText( - param.content ?? "", - style: context.colors.onPrimaryContainer.bodyMedium(context), - minLines: 1, - maxLines: 5, - )), - ], - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FixedElevatedButton( - padding: WidgetConstant.paddingVertical40, - child: Text("sign_message".tr), - onPressed: () { - request.confirmRequest(); - }) - ], - ) - ], - ), - ); - } -} diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/global.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/global.dart index 24d02d6a..ef0cf693 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/global.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/global.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/network/solana/web3/controller/controll import 'package:mrt_wallet/future/wallet/web3/pages/view_controller.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; import 'fields/request_account.dart'; -import 'fields/sign_message_v2.dart'; +import 'fields/sign_message.dart'; class SolanaWeb3GlobalFieldsView> extends StatelessWidget { @@ -45,7 +45,7 @@ class _GlobalFieldsView extends StatelessWidget { ); case Web3SolanaRequestMethods.signMessage: return SolanaWeb3SignMessageRequestView( - request: form as SolanaWeb3Form, + request: form as Web3SolanaSignMessageForm, ); default: return const SliverPadding(padding: EdgeInsets.zero); diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/transaction.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/transaction.dart index f7ee09e7..8033ca3a 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/pages/transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/pages/transaction.dart @@ -71,6 +71,40 @@ class SolanaWeb3TransactionFieldsView extends StatelessWidget { balance: controller.form.fee, style: context.textTheme.titleLarge, )), + WidgetConstant.height20, + Text("total_transaction_const".tr, + style: context.textTheme.titleMedium), + WidgetConstant.height8, + ContainerWithBorder( + onTapWhenOnRemove: false, + onRemove: () {}, + onRemoveWidget: controller.isReady + ? Icon( + Icons.check_circle, + color: context.colors.onPrimaryContainer, + ) + : TappedTooltipView( + tooltipWidget: ToolTipView( + message: "simulation_are_not_ready".tr, + child: Icon(Icons.warning, + color: context.colors.tertiary)), + ), + child: CoinPriceView( + token: controller.network.coinParam.token, + balance: controller.total, + style: context.textTheme.titleLarge), + ), + if (controller.isSend) ...[ + WidgetConstant.height20, + AppSwitchListTile( + value: controller.replaceBlockHash, + title: Text("replace_recent_block_hash".tr, + style: context.textTheme.titleMedium), + subtitle: Text("replace_block_hash_desc".tr), + contentPadding: EdgeInsets.zero, + onChanged: controller.toggleReplaceBlockHash, + ) + ], ], ), ), @@ -82,11 +116,11 @@ class SolanaWeb3TransactionFieldsView extends StatelessWidget { padding: WidgetConstant.paddingVertical40, child: Text("submit".tr), onPressed: () { - controller.confirm(() async { + controller.confirm((message) async { return context.openSliverDialog( - (ctx) => DialogTextView( + (context) => DialogTextView( buttonWidget: const DialogDoubleButtonView(), - text: "simulation_failed_continue_desc".tr), + text: message), "submit_transaction".tr); }); }), @@ -164,6 +198,43 @@ class _SolanaWeb3MessageView extends StatelessWidget { ], ), )), + WidgetConstant.height20, + Text("accounts".tr, + style: context.colors.onPrimaryContainer + .lableLarge(context)), + WidgetConstant.height8, + ContainerWithBorder( + backgroundColor: context.colors.onPrimaryContainer, + child: Column( + children: List.generate( + instruction.accounts.length, (index) { + final account = + instruction.accounts[index].account; + final String status = instruction + .accounts[index].status + .map((e) => e.tr) + .join(", "); + return ContainerWithBorder( + child: CopyTextIcon( + dataToCopy: account.publicKey.address, + widget: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + account.publicKey.address, + style: context.colors.onPrimaryContainer + .bodyMedium(context), + ), + Text(status, + style: context + .colors.onPrimaryContainer + .bodySmall(context)) + ], + ), + )); + }), + )), if (instruction.content != null) ...[ WidgetConstant.height20, ExpansionTile( @@ -259,6 +330,7 @@ class _SolanaWeb3MessageView extends StatelessWidget { ) }, ), + onTapWhenOnRemove: status.canRetry, onRemove: () { if (status.canRetry) { controller.form.simulate(message); @@ -299,7 +371,26 @@ class _SolanaWeb3MessageView extends StatelessWidget { } }, child: _FeeInfo(message: message, network: controller.network), - ) + ), + if (!message.accountChange.isZero) ...[ + WidgetConstant.height20, + Text("change_balance".tr, style: context.textTheme.titleMedium), + Text("solana_change_balance_desc".tr), + WidgetConstant.height8, + ContainerWithBorder( + onRemove: controller.isMultipleWithSameOwner ? () {} : null, + onTapWhenOnRemove: false, + onRemoveWidget: TappedTooltipView( + tooltipWidget: ToolTipView( + message: "solana_change_balance_desc2".tr, + child: + Icon(Icons.warning, color: context.colors.tertiary))), + child: CoinPriceView( + token: controller.network.coinParam.token, + balance: message.accountChange, + style: context.textTheme.titleLarge), + ), + ] ], ); } @@ -346,9 +437,9 @@ class _SimulateInfo extends StatelessWidget { style: context.colors.onPrimaryContainer.titleMedium(context), ), subtitle: ToolTipView( - message: simulate.err ?? "", + message: simulate.err?.toString() ?? "", child: Text( - simulate.err ?? "", + simulate.err?.toString() ?? "", style: context.colors.onPrimaryContainer.bodyMedium(context), ), ), diff --git a/mrt_wallet/lib/future/wallet/network/solana/web3/permission/permission.dart b/mrt_wallet/lib/future/wallet/network/solana/web3/permission/permission.dart index 14b99a48..c2d0d7fa 100644 --- a/mrt_wallet/lib/future/wallet/network/solana/web3/permission/permission.dart +++ b/mrt_wallet/lib/future/wallet/network/solana/web3/permission/permission.dart @@ -8,132 +8,49 @@ import 'package:mrt_wallet/wallet/web3/networks/solana/solana.dart'; import 'package:on_chain/solana/solana.dart'; class SolanaWeb3PermissionView extends StatefulWidget { - const SolanaWeb3PermissionView( - {required this.permission, - required this.onUpdateChainPermission, - Key? key}) + const SolanaWeb3PermissionView({required this.permission, Key? key}) : super(key: key); final Web3SolanaChain? permission; - final OnUpdateChainPermission onUpdateChainPermission; @override State createState() => - _TronWeb3PermissionViewState(); + _SolanaWeb3PermissionViewState(); } -class _TronWeb3PermissionViewState extends State - with SafeState { - late SolanaChain currentChain; - late Web3SolanaChain permission = - widget.permission ?? Web3SolanaChain.create(); - - late final List chains; - Map> permissions = {}; - late SolanaChain chain; - - Map defaultAccount = {}; - - List get chainPermission => permissions[chain]!; - - Web3SolanaChainAccount? get defaultChainAccount => defaultAccount[chain]; - - Web3SolanaChainAccount? accountPermission(ISolanaAddress address) { - return permissions[chain]!.firstWhereOrNull( - (e) => e.address.address == address.networkAddress.address); - } - - void onChangeDefaultPermission(Web3SolanaChainAccount? account) { - if (account == null) return; - defaultAccount[chain] = account; - updateState(); - } - - Web3SolanaChainAccount? hasPermission(ISolanaAddress address) { - return accountPermission(address); - } - - void addAccount(ISolanaAddress address) { - final exists = accountPermission(address); - if (exists != null) { - permissions[chain]?.remove(exists); - } else { - permissions[chain]?.add(Web3SolanaChainAccount.fromChainAccount( - address: address, - genesis: chain.network.genesisBlock, - isDefault: false)); - } - if (permissions[chain]!.isEmpty) { - defaultAccount.remove(chain); - } else { - if (!permissions[chain]!.contains(defaultChainAccount)) { - defaultAccount[chain] = permissions[chain]![0]; - } - } - updateState(); - } - - void onChangeCurrentChain(SolanaChain? chain) { - if (chain == null) return; - currentChain = chains.firstWhere( - (e) => e.network.genesisBlock == chain.network.genesisBlock); - updateState(); +class _SolanaWeb3PermissionViewState extends State + with + SafeState, + Web3PermissionState { + @override + Web3SolanaChainAccount createNewAccountPermission(ISolanaAddress address) { + return Web3SolanaChainAccount.fromChainAccount( + address: address, + genesis: chain.network.genesisBlock, + isDefault: false); } - void onChangeChain(SolanaChain? updateChain) { - chain = updateChain ?? chain; - updateState(); + @override + Web3SolanaChain createNewChainPermission() { + return Web3SolanaChain.create(genesisBlock: chain.network.genesisBlock); } - void complete() { - final newPermission = - Web3SolanaChain.create(genesisBlock: currentChain.network.genesisBlock); - List accounts = []; - for (final i in permissions.entries) { - List chainAccounts = []; - Web3SolanaChainAccount? defaultAddr = defaultAccount[i.key]; - defaultAddr ??= i.value.isEmpty ? null : i.value.first; - for (final a in i.value) { - Web3SolanaChainAccount account = a; - if (account == defaultAddr && !account.defaultAddress) { - account = account.changeDefault(true); - } else if (account.defaultAddress) { - account = account.changeDefault(false); - } - chainAccounts.add(account); - } - if (chainAccounts.isNotEmpty && - !chainAccounts.any((e) => e.defaultAddress)) { - chainAccounts[0] = chainAccounts[0].changeDefault(true); - } - accounts.addAll(chainAccounts); - } - newPermission.updateChainAccount(accounts); - widget.onUpdateChainPermission(newPermission); - } + bool _initialized = false; @override void didChangeDependencies() { super.didChangeDependencies(); + if (_initialized) return; + _initialized = true; + permission = widget.permission ?? Web3SolanaChain.create(); final wallet = context.watch(StateConst.main); chains = wallet.wallet.getChains().whereType().toList(); - currentChain = chains - .firstWhere((e) => e.network.genesisBlock == permission.currentChain); for (final i in chains) { - permissions[i] = permission.accounts - .where((e) => e.genesis == i.network.genesisBlock) - .toList(); + permissions[i] = permission.chainAccounts(i); } chain = chains.firstWhere( - (e) => e.network.genesisBlock == currentChain.network.genesisBlock); - final Map defaultAccount = {}; - for (final i in chains) { - final accounts = permissions[i]!; - final defaultAddress = accounts.firstWhereOrNull((e) => e.defaultAddress); - if (defaultAddress != null) { - defaultAccount[i] = defaultAddress; - } - } - this.defaultAccount = defaultAccount; + (e) => e.network.genesisBlock == permission.currentChain, + orElse: () => chains.first); } @override @@ -142,15 +59,11 @@ class _TronWeb3PermissionViewState extends State Web3SolanaChainAccount>( chain: chain, chains: chains, - complete: complete, + onUpdateState: updateState, hasPermission: hasPermission, - onChangeCurrentChain: onChangeCurrentChain, addAccount: addAccount, onChangeChain: onChangeChain, onChangeDefaultAccount: onChangeDefaultPermission, - permissions: permissions[chain]!, - defaultChainAddress: defaultChainAccount, - activeChain: currentChain, ); } } diff --git a/mrt_wallet/lib/future/wallet/network/substrate/transaction/controller/impl/signer_impl.dart b/mrt_wallet/lib/future/wallet/network/substrate/transaction/controller/impl/signer_impl.dart index f0fa0031..d846f907 100644 --- a/mrt_wallet/lib/future/wallet/network/substrate/transaction/controller/impl/signer_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/substrate/transaction/controller/impl/signer_impl.dart @@ -1,5 +1,5 @@ import 'package:blockchain_utils/crypto/crypto/schnorrkel/keys/keys.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/string.dart'; +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/string.dart'; import 'package:mrt_wallet/app/utils/method/utiils.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/signing/signing.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/fee_info.dart b/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/fee_info.dart index 5771990f..15e0989c 100644 --- a/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/fee_info.dart +++ b/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/fee_info.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/substrate/transaction/controller/controller/controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/memo.dart b/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/memo.dart index e1df5ee5..8ebd0146 100644 --- a/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/memo.dart +++ b/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/memo.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/substrate/transaction/controller/controller/controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/transfer.dart b/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/transfer.dart index 60246253..7ee46db7 100644 --- a/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/substrate/transaction/pages/pages/transfer.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'transaction.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ton/account/account.dart b/mrt_wallet/lib/future/wallet/network/ton/account/account.dart index b1a0a6f5..86b4ef94 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/account/account.dart @@ -4,11 +4,11 @@ import 'package:mrt_wallet/future/wallet/global/pages/token_details.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TonAccountPageView extends StatelessWidget { const TonAccountPageView({required this.chainAccount, super.key}); - final TonChain chainAccount; + final TheOpenNetworkChain chainAccount; @override Widget build(BuildContext context) { return TabBarView(children: [ @@ -20,7 +20,7 @@ class TonAccountPageView extends StatelessWidget { class _TonJettonsView extends StatelessWidget { const _TonJettonsView({required this.account}); - final TonChain account; + final TheOpenNetworkChain account; ITonAddress get address => account.address; @override diff --git a/mrt_wallet/lib/future/wallet/network/ton/address/address.dart b/mrt_wallet/lib/future/wallet/network/ton/address/address.dart index 6df89fe7..854cdd15 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/address/address.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/address/address.dart @@ -1,4 +1,3 @@ -import 'package:blockchain_utils/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/global/address_derivation/controller.dart'; @@ -8,6 +7,13 @@ import 'package:mrt_wallet/crypto/worker.dart'; import 'package:ton_dart/ton_dart.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +enum _V5ContectType { + custom, + client; + + bool get isCustomWalletId => this == client; +} + class SetupTonAddressView extends StatefulWidget { final AddressDerivationController controller; const SetupTonAddressView({super.key, required this.controller}); @@ -17,21 +23,55 @@ class SetupTonAddressView extends StatefulWidget { class _SetupTonAddressViewState extends State with SafeState { - WalletVersion version = WalletVersion.v4; + final GlobalKey subwalletKey = GlobalKey(); + WalletVersion version = WalletVersion.v5R1; + _V5ContectType v5Type = _V5ContectType.client; bool get hasSubWalletId => version.version > 2; WalletTonNetwork get network => widget.controller.network.toNetwork(); bool bouncable = false; - int get defaultSubWalletId => - TonConst.defaultSubWalletId + network.coinParam.workchain; + int defaultSubWalletId() { + if (isVersion5) return 0; + return TonConst.defaultSubWalletId + network.coinParam.workchain; + } + int? subWalletId; + bool get isVersion5 => version == WalletVersion.v5R1; + + String subwalletIdLable = "sub_wallet_id"; + + late int maximumSubWalletId = getMaximumSubWalletId(); void onChangeVersion(WalletVersion? onChange) { - final bool hasId = hasSubWalletId; - version = onChange ?? version; - if (hasId != hasSubWalletId) { - subWalletId = defaultSubWalletId; + if (onChange == null) return; + version = onChange; + maximumSubWalletId = getMaximumSubWalletId(); + updateSubWalletIdLable(); + updateState(); + subwalletKey.currentState?.setValue(defaultSubWalletId()); + } + + void updateSubWalletIdLable() { + if (!isVersion5) { + v5Type = _V5ContectType.client; + } else { + if (v5Type.isCustomWalletId) { + subwalletIdLable = "wallet_id"; + } else { + subwalletIdLable = "sub_wallet_id"; + } } - setState(() {}); + } + + void onChangeV5Type(bool? _) { + if (v5Type == _V5ContectType.client) { + v5Type = _V5ContectType.custom; + } else { + v5Type = _V5ContectType.client; + } + maximumSubWalletId = getMaximumSubWalletId(); + updateSubWalletIdLable(); + updateState(); + subwalletKey.currentState?.setValue(defaultSubWalletId()); } void onChangeBounce(bool? v) { @@ -39,18 +79,34 @@ class _SetupTonAddressViewState extends State setState(() {}); } + int getMaximumSubWalletId() { + if (isVersion5) { + switch (v5Type) { + case _V5ContectType.client: + return TonConst.maximumV5SubWalletId; + default: + return TonConst.maximumWalletId; + } + } + return TonConst.maximumSubWalletId; + } + void onChangeSubWalletId(int id) { - if (id < 0 || id > mask32 - 1) { + if (id < 0 || id > maximumSubWalletId) { subWalletId = null; } else { subWalletId = id; } + + // TonConst.deciaml } String? validateSubWalletId(String? v) { if (!hasSubWalletId) return null; if (subWalletId == null) { - return "sub_wallet_id_validator".tr; + return "sub_wallet_id_validator" + .tr + .replaceOne(maximumSubWalletId.toString()); } return null; } @@ -61,11 +117,42 @@ class _SetupTonAddressViewState extends State if (keyIndex == null) return; if (widget.controller.form.currentState?.validate() ?? false) { if (hasSubWalletId && subWalletId == null) return; + TonAccountContext? context; + switch (version) { + case WalletVersion.v1R1: + case WalletVersion.v1R2: + case WalletVersion.v1R3: + case WalletVersion.v2R1: + case WalletVersion.v2R2: + context = + TonAccountLegacyContext(version: version, bouncable: bouncable); + break; + case WalletVersion.v3R1: + case WalletVersion.v3R2: + case WalletVersion.v4: + context = TonAccountSubWalletContext( + version: version, + bouncable: bouncable, + subwalletId: subWalletId!); + break; + case WalletVersion.v5R1: + context = switch (v5Type) { + _V5ContectType.client => TonAccountV5SubWalletContext( + version: version, + bouncable: bouncable, + subwalletId: subWalletId!), + _V5ContectType.custom => TonAccountV5CustomContext( + version: version, + bouncable: bouncable, + contextId: subWalletId!), + }; + break; + default: + } + if (context == null) return; final newAccount = TonNewAddressParams( deriveIndex: keyIndex, - version: version, - subWalletId: subWalletId, - bouncable: bouncable, + context: context, coin: widget.controller.coin); widget.controller.generateAddress(newAccount); } @@ -104,13 +191,29 @@ class _SetupTonAddressViewState extends State url: LinkConst.reviewTonSubWalletId, linkDesc: "read_more".tr, ), + if (isVersion5) ...[ + WidgetConstant.height20, + AppCheckListTile( + contentPadding: EdgeInsets.zero, + onChanged: onChangeV5Type, + value: v5Type == _V5ContectType.custom, + title: Text("use_wallet_id".tr, + style: context.textTheme.titleMedium), + subtitle: TextAndLinkView( + text: "ton_v5_wallet_desc".tr, + url: LinkConst.reviewTonV5, + linkDesc: "read_more".tr, + ), + ) + ], WidgetConstant.height8, NumberTextField( - label: "sub_wallet_id".tr, + key: subwalletKey, + label: subwalletIdLable.tr, onChange: onChangeSubWalletId, validator: validateSubWalletId, - defaultValue: subWalletId ?? defaultSubWalletId, - max: mask32 - 1, + defaultValue: subWalletId, + max: maximumSubWalletId, min: 0), ], ) diff --git a/mrt_wallet/lib/future/wallet/network/ton/setting/generate_ton_mnemonic.dart b/mrt_wallet/lib/future/wallet/network/ton/setting/generate_ton_mnemonic.dart index 25900e36..8f2fc701 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/setting/generate_ton_mnemonic.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/setting/generate_ton_mnemonic.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/setup/setup.dart'; import 'package:blockchain_utils/utils/compare/compare.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/worker.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; enum _MnemonicOption { import, generate } @@ -25,7 +25,7 @@ class GenerateTonMnemonicView extends StatelessWidget { const GenerateTonMnemonicView({super.key}); @override Widget build(BuildContext context) { - return NetworkAccountControllerView( + return NetworkAccountControllerView( title: "ton_mnemonic".tr, childBulder: (wallet, chain, switchAccount) { return _GenerateTonMnemonicView( diff --git a/mrt_wallet/lib/future/wallet/network/ton/setting/ton_setting_page.dart b/mrt_wallet/lib/future/wallet/network/ton/setting/ton_setting_page.dart index f16f5c5b..7e0854f9 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/setting/ton_setting_page.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/setting/ton_setting_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/account/pages/account_controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; @@ -9,7 +9,7 @@ class TonSettingsView extends StatelessWidget { const TonSettingsView({super.key}); @override Widget build(BuildContext context) { - return NetworkAccountControllerView( + return NetworkAccountControllerView( title: "settings", childBulder: (wallet, chain, switchAccount) { return ConstraintsBoxView( diff --git a/mrt_wallet/lib/future/wallet/network/ton/token/import_jettons.dart b/mrt_wallet/lib/future/wallet/network/ton/token/import_jettons.dart index f748c79d..ef853947 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/token/import_jettons.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/token/import_jettons.dart @@ -12,7 +12,7 @@ class TonImportJettonsView extends StatelessWidget { @override Widget build(BuildContext context) { - return NetworkAccountControllerView( + return NetworkAccountControllerView( title: "import_jettons".tr, childBulder: (wallet, account, onAccountChanged) { return _TonImportJettonsView( @@ -26,7 +26,7 @@ class _TonImportJettonsView extends StatefulWidget { const _TonImportJettonsView( {required this.apiProvider, required this.account, required this.wallet}); final TonClient apiProvider; - final TonChain account; + final TheOpenNetworkChain account; final WalletProvider wallet; @override State<_TonImportJettonsView> createState() => __TonImportJettonsViewState(); @@ -171,44 +171,41 @@ class __TonImportJettonsViewState extends State<_TonImportJettonsView> child: (c) { return CustomScrollView( slivers: [ - SliverToBoxAdapter( - child: ConstraintsBoxView( - padding: WidgetConstant.padding20, - child: PageTitleSubtitle( - title: "import_token_alert".tr, - body: Text("import_token_desc".tr))), + SliverConstraintsBoxView( + padding: WidgetConstant.paddingHorizontal20, + sliver: SliverToBoxAdapter( + child: PageTitleSubtitle( + title: "import_token_alert".tr, + body: Text("import_token_desc".tr)), + ), ), - EmptyItemSliverWidgetView( - isEmpty: tokens.isEmpty, - itemBuilder: () => SliverPadding( - padding: WidgetConstant.paddingHorizontal20, - sliver: SliverList.builder( + SliverConstraintsBoxView( + padding: WidgetConstant.paddingHorizontal20, + sliver: EmptyItemSliverWidgetView( + isEmpty: tokens.isEmpty, + itemBuilder: () => SliverList.separated( + separatorBuilder: (context, index) => WidgetConstant.divider, itemBuilder: (context, index) { final TonAccountJettonResponse token = tokens[index]; final bool exist = address.tokens.contains(token.jettonToken); getContent(token); - return Column( - children: [ - APPAnimatedSwitcher( - enable: token.jettonToken != null, - widgets: { - true: (c) => _NonContentJettonView( - token: token, - state: this, - exist: exist, - key: const ValueKey(true), - ), - false: (c) => _NonContentJettonView( - token: token, - state: this, - exist: exist, - key: const ValueKey(false), - ) - }), - const Divider(), - ], - ); + return APPAnimatedSwitcher( + enable: token.jettonToken != null, + widgets: { + true: (c) => _NonContentJettonView( + token: token, + state: this, + exist: exist, + key: const ValueKey(true), + ), + false: (c) => _NonContentJettonView( + token: token, + state: this, + exist: exist, + key: const ValueKey(false), + ) + }); }, itemCount: tokens.length, ), @@ -290,11 +287,8 @@ class _NonContentJettonView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (isVerify) - Text( - token.jettonToken!.token.name, - style: context.textTheme.bodyLarge, - maxLines: 1, - ), + Text(token.jettonToken!.token.name, + style: context.textTheme.bodyLarge, maxLines: 1), Text(token.tokenAddress.toFriendlyAddress(), style: isVerify ? null : context.textTheme.labelLarge), CoinPriceView( diff --git a/mrt_wallet/lib/future/wallet/network/ton/ton.dart b/mrt_wallet/lib/future/wallet/network/ton/ton.dart index c348fe4b..9ef2f66c 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/ton.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/ton.dart @@ -4,3 +4,4 @@ export 'token/import_jettons.dart'; export 'setting/generate_ton_mnemonic.dart'; export 'setting/ton_setting_page.dart'; export 'transaction/transaction.dart'; +export 'web3/web3.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/controller/controller.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/controller/controller.dart index 97fa7273..4de750e8 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/controller/controller.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/controller/controller.dart @@ -17,7 +17,7 @@ class TonTransactionStateController extends TonTransactionImpl estimateFee(); } - bool get hasMultipleMessage => address.version.version > 1; + bool get hasMultipleMessage => address.context.version.version > 1; late final IntegerBalance remindAmount = IntegerBalance.zero(network.coinParam.decimal); diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/fee_impl.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/fee_impl.dart index 2a8488fa..f484c36c 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/fee_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/fee_impl.dart @@ -2,11 +2,16 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:ton_dart/ton_dart.dart'; -import 'transaction_impl.dart'; enum TonFeeStatus { estimate, progress, error, idle } -mixin TonFeeImpl on TonTransactionImpl { +mixin TonFeeImpl { + ITonAddress get address; + TonClient get apiProvider; + Future buildTransaction({bool fakeSignature = false}); + void onChange(); + WalletTonNetwork get network; + TonTransactionFeeDetails _feeDetails = TonTransactionFeeDetails.nonEstimate(); TonTransactionFeeDetails get feeDetails => _feeDetails; BigInt get fee => _feeDetails.fee.balance; @@ -40,7 +45,6 @@ mixin TonFeeImpl on TonTransactionImpl { _feeDetails = TonTransactionFeeDetails.nonEstimate(); onChange(); final estimate = await MethodUtils.call(() async => await _estimateFee()); - if (estimate.hasError) { if (!estimate.isCancel) { _feeStatus = StreamWidgetStatus.error; diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/signer_impl.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/signer_impl.dart index c8454bf5..6fdd6de6 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/signer_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/signer_impl.dart @@ -5,59 +5,49 @@ import 'package:mrt_wallet/wallet/models/signing/signing.dart'; import 'package:mrt_wallet/crypto/derivation/derivation/bip32.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:ton_dart/ton_dart.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin TonSignerImpl on TonTransactionImpl { int? _seqno; - Cell _buildMessage({required WalletContract wallet, required int seqno}) { - final messages = validator.validator.toMessages(address.networkAddress); - if (wallet.type.version == 1 && messages.length > 1) { + @override + Future buildTransaction({bool fakeSignature = false}) async { + final wallet = address.toWalletContract(); + _seqno ??= await wallet.getSeqno(apiProvider.provider); + final actions = validator.validator + .toMessages(address.networkAddress) + .map((e) => OutActionSendMsg(outMessage: e)) + .toList(); + if (wallet.type.version == 1 && actions.length > 1) { throw WalletException("ton_wallet_validator_desc"); } - return wallet.createTransfer(messages: messages, accountSeqno: seqno); - } + final transfer = address.context.buildTransaction( + actions: actions, + state: wallet.state!, + seqno: _seqno!, + chain: network.coinParam.chainType); + List sig = List.unmodifiable(List.filled(64, 0)); - Future _buildBody( - {required int seqno, - required WalletContract wallet, - bool fakeSignature = false}) async { - final transfer = _buildMessage(wallet: wallet, seqno: seqno); - List sig; - if (fakeSignature) { - sig = List.unmodifiable(List.filled(64, 0)); - } else { + if (!fakeSignature) { final signature = await walletProvider.wallet.signTransaction( request: WalletSigningRequest( addresses: [address], network: network, sign: (generateSignature) async { - final signRequest = GlobalSignRequest.cardano( + final signRequest = GlobalSignRequest.ton( digest: transfer.hash(), index: address.keyIndex as Bip32AddressIndex); - final sss = await generateSignature(signRequest); - return sss.signature; + final response = await generateSignature(signRequest); + return response.signature; }, )); sig = signature.result; } - return beginCell() - .storeBuffer(sig) - .storeSlice(transfer.beginParse()) - .endCell(); - } - - @override - Future buildTransaction({bool fakeSignature = false}) async { - final wallet = address.toWalletContract(); - _seqno ??= await wallet.getSeqno(apiProvider.provider); - final body = await _buildBody( - seqno: _seqno!, wallet: wallet, fakeSignature: fakeSignature); - return Message( - init: (_seqno == 0 ? wallet.state : null), - info: CommonMessageInfoExternalIn( - dest: wallet.address, importFee: BigInt.zero), - body: body); + return address.context.toExternalMessage( + message: transfer, + signature: sig, + destination: address.networkAddress, + state: (_seqno == 0 ? wallet.state!.initialState() : null)); } Future signAndSendTransaction() async { @@ -66,7 +56,8 @@ mixin TonSignerImpl on TonTransactionImpl { final result = await MethodUtils.call(() async { final exMessage = await buildTransaction(); - return await apiProvider.sendMessage(exMessage); + return await apiProvider.sendMessage( + boc: beginCell().store(exMessage).endCell()); }); if (result.hasError) { progressKey.errorText(result.error!.tr, diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/transaction_impl.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/transaction_impl.dart index 8cc9966d..67075a5e 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/transaction_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/controller/impl/transaction_impl.dart @@ -15,7 +15,7 @@ abstract class TonTransactionImpl extends StateController { required this.apiProvider, required this.validator}); final WalletProvider walletProvider; - final TonChain account; + final TheOpenNetworkChain account; final WalletTonNetwork network; final TonClient apiProvider; final ITonAddress address; diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/fee.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/fee.dart index ccfa776d..3f0fe2c6 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/fee.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/fee.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/ton/transaction/controller/impl/fee_impl.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/message_settings.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/message_settings.dart index 97029a88..a7dc8c57 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/message_settings.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/message_settings.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/networks/ton/ton.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TonTransactionMessageSettingsView extends StatefulWidget { const TonTransactionMessageSettingsView(this.receiver, {super.key}); @@ -28,6 +29,7 @@ class _TonTransactionMessageSettingsViewState } void onChageBodyType(TonMessageBodyType? type) { + if (type == TonMessageBodyType.encryptedMessage) return; setState(() { bodyType = type ?? bodyType; }); @@ -104,7 +106,8 @@ class _TonTransactionMessageSettingsViewState WidgetConstant.height8, AppDropDownBottom( items: { - for (final i in TonMessageBodyType.values) i: Text(i.name.tr) + for (final i in TonMessageBodyType.supportValues) + i: Text(i.name.tr) }, label: "choose_the_type".tr, onChanged: onChageBodyType, diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/token_list.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/token_list.dart index fa09f14b..ffd4f7df 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/token_list.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/token_list.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TonTransactionSelectTokenList extends StatefulWidget { const TonTransactionSelectTokenList({required this.account, Key? key}) diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transaction.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transaction.dart index 80fbfbc2..52f3bf37 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transaction.dart @@ -20,7 +20,7 @@ class TonTransactionFieldsView extends StatelessWidget { Widget build(BuildContext context) { final LiveTransactionForm validator = field ?? context.getArgruments(); - return NetworkAccountControllerView( + return NetworkAccountControllerView( childBulder: (wallet, chain, switchAccount) { return MrtViewBuilder( repositoryId: StateConst.ton, @@ -83,11 +83,10 @@ class TonTransactionFieldsView extends StatelessWidget { error: controller.error, showErrorIcon: false), InsufficientBalanceErrorView( - verticalMargin: - WidgetConstant.paddingVertical10, - balance: controller.remindAmount, - token: controller.network.token, - ), + verticalMargin: + WidgetConstant.paddingVertical10, + balance: controller.remindAmount, + token: controller.network.token), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transfer.dart b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transfer.dart index 0c9a741e..ca249b29 100644 --- a/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transfer.dart +++ b/mrt_wallet/lib/future/wallet/network/ton/transaction/pages/pages/transfer.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'transaction.dart'; @@ -9,7 +9,7 @@ class TonTransferTransactionView extends StatelessWidget { @override Widget build(BuildContext context) { - final TonChain chain = context.getArgruments(); + final TheOpenNetworkChain chain = context.getArgruments(); return TonTransactionFieldsView( field: LiveTransactionForm( validator: TonTransferForm(network: chain.network))); diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller.dart new file mode 100644 index 00000000..f6dad020 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller.dart @@ -0,0 +1,2 @@ +export 'controller/global.dart'; +export 'impl/impl.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/global.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/global.dart new file mode 100644 index 00000000..082fb82d --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/global.dart @@ -0,0 +1,81 @@ +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/crypto/worker.dart'; +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/web3/controller/impl/impl.dart'; +import 'package:mrt_wallet/future/wallet/web3/web3.dart'; +import 'package:mrt_wallet/wallet/models/signing/signing.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; + +class Web3TonGlobalRequestController> extends Web3TonImpl { + Web3TonGlobalRequestController({ + required super.walletProvider, + required super.request, + }) : super(account: request.chain); + void onChangeForm() { + notify(); + } + + void onCompeleteForm(Object? obj) async { + progressKey.process(text: "processing_request".tr); + Object? result = obj; + switch (request.params.method) { + case Web3TonRequestMethods.requestAccounts: + final web3Chain = result as Web3TonChain; + request.authenticated.updateChainAccount(web3Chain); + break; + case Web3TonRequestMethods.signMessage: + if (obj != true) { + progressKey.idle(); + return; + } + final signingParams = request.params as Web3TonSignMessage; + final signMessage = await MethodUtils.call(() async { + final signature = await walletProvider.wallet.signTransaction( + request: WalletSigningRequest( + addresses: [address], + network: network, + sign: (generateSignature) async { + final signRequest = GlobalSignRequest.ton( + digest: signingParams.chalengBytes(), + index: address.keyIndex as Bip32AddressIndex); + final response = await generateSignature(signRequest); + return response.signature; + }, + )); + return signature.result; + }); + if (signMessage.hasError) { + progressKey.error(text: signMessage.error!.tr); + return; + } + result = signMessage.result; + break; + default: + break; + } + request.completeResponse(result); + progressKey.response(text: "request_completed_success".tr); + } + + void _init() { + MethodUtils.after(() async { + liveRequest.addListener(onChangeForm); + form.onCompeleteForm = onCompeleteForm; + progressKey.idle(); + }); + } + + @override + Future readyWeb3() async { + await super.readyWeb3(); + _init(); + } + + @override + void close() { + super.close(); + liveRequest.removeListener(onChangeForm); + form.onCompeleteForm = null; + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/transaction.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/transaction.dart new file mode 100644 index 00000000..9235bddf --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/controller/transaction.dart @@ -0,0 +1,122 @@ +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/app/utils/method/utiils.dart'; +import 'package:mrt_wallet/crypto/derivation/derivation.dart'; +import 'package:mrt_wallet/crypto/requets/messages/messages.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/ton.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/transaction/controller/impl/fee_impl.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/web3/controller/impl/impl.dart'; +import 'package:mrt_wallet/future/wallet/web3/pages/page_progress.dart'; +import 'package:mrt_wallet/wallet/models/balance/integer/integer.dart'; +import 'package:mrt_wallet/wallet/models/networks/ton/ton.dart'; +import 'package:mrt_wallet/wallet/models/signing/signing.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/models/transaction.dart'; +import 'package:mrt_wallet/wallet/web3/web3.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class Web3TonTransactionRequestController + extends Web3TonImpl + with TonFeeImpl { + Web3TonTransactionRequestController({ + required super.walletProvider, + required super.request, + }) : super(account: request.chain); + + @override + Web3TonSendTransactionForm get form => + liveRequest.validator as Web3TonSendTransactionForm; + + late final IntegerBalance total = IntegerBalance.zero(network.coinDecimal); + late final IntegerBalance remindAmount = + IntegerBalance.zero(network.coinParam.decimal); + + Future _init() async { + progressKey.process(text: "transaction_retrieval_requirment".tr); + final result = await MethodUtils.call(() async { + List messages = []; + for (final i in request.params.messages) { + final msgInfo = await apiProvider.getWeb3TransactionMessageInfo( + address: address, account: account, message: i); + messages.add(msgInfo); + } + return messages; + }); + if (result.hasError) { + progressKey.error(backToIdle: null, text: result.error!.tr); + return; + } + form.init( + messages: result.result, + client: apiProvider, + owner: address, + validUntil: request.params.validUntil); + onChange(); + estimateFee(); + progressKey.idle(); + } + + Future sendTransaction() async { + progressKey.process( + text: "create_send_transaction" + .tr + .replaceOne(network.coinParam.token.name)); + + final externalMessage = await MethodUtils.call(() async { + final messageBody = await form.createMessageBody(); + final signature = await walletProvider.wallet.signTransaction( + request: WalletSigningRequest( + addresses: [address], + network: network, + sign: (generateSignature) async { + final signRequest = GlobalSignRequest.ton( + digest: messageBody.hash(), + index: address.keyIndex as Bip32AddressIndex); + final response = await generateSignature(signRequest); + return response.signature; + }, + )); + final extMessage = address.context.toExternalMessage( + message: messageBody, + signature: signature.result, + destination: address.networkAddress, + state: (form.seqno == 0 ? form.wallet.state!.initialState() : null)); + return beginCell().store(extMessage).endCell(); + }); + + if (externalMessage.hasError) { + progressKey.error(text: externalMessage.error!.tr); + return; + } + final result = await MethodUtils.call( + () async => await apiProvider.sendMessage(boc: externalMessage.result)); + if (result.hasError) { + progressKey.error(text: result.error!.tr, backToIdle: null); + request.error(Web3RequestExceptionConst.fromException(result.exception!)); + return; + } + final String txHash = result.result; + final response = Web3TonSendTransactionResponse( + boc: externalMessage.result.toBase64(), txHash: txHash); + request.completeResponse(response); + progressKey.responseTx(hash: txHash, network: network); + } + + @override + Future buildTransaction({bool fakeSignature = false}) { + return form.createEstimateMessage(); + } + + @override + void onChange() { + total.updateBalance(form.totalTon); + final remind = address.address.currencyBalance - (form.totalTon + fee); + remindAmount.updateBalance(remind); + notify(); + } + + @override + Future readyWeb3() async { + await super.readyWeb3(); + _init(); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/controller/impl/impl.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/impl/impl.dart new file mode 100644 index 00000000..e654be25 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/controller/impl/impl.dart @@ -0,0 +1,50 @@ +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/future/wallet/controller/controller.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/core/validator/live.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/ton.dart'; +import 'package:mrt_wallet/future/wallet/web3/controller/controller.dart'; +import 'package:mrt_wallet/wallet/api/client/client.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/models/network/core/network/network.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'package:mrt_wallet/wallet/web3/web3.dart'; + +abstract class Web3TonImpl> + extends StateController with Web3RequestControllerState { + Web3TonImpl( + {required this.walletProvider, + required this.account, + required this.request}); + final WalletProvider walletProvider; + final TheOpenNetworkChain account; + WalletTonNetwork get network => account.network; + TonClient get apiProvider => account.provider()!; + ITonAddress get address => request.accountPermission()!; + + final Web3TonRequest request; + bool get needPermission => request.needPermission; + + TonWeb3Form _buildForm() { + switch (request.params.method) { + case Web3TonRequestMethods.requestAccounts: + final tonChains = + walletProvider.wallet.getChains(); + return TonRequestAccountForm(request: request, chains: tonChains) + as TonWeb3Form; + case Web3TonRequestMethods.signMessage: + return Web3TonSignMessageForm(request: request) as TonWeb3Form; + case Web3TonRequestMethods.sendTransaction: + return Web3TonSendTransactionForm( + request: request as Web3TonRequest) as TonWeb3Form; + default: + throw UnimplementedError(); + } + } + + late final LiveTransactionForm liveRequest = + LiveTransactionForm(validator: _buildForm()); + TonWeb3Form get form => liveRequest.value; + @override + Web3Request get web3Request => request; +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields.dart new file mode 100644 index 00000000..0e5da6f9 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/constant/global/state.dart'; +import 'package:mrt_wallet/future/future.dart'; +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'global.dart'; +import 'transaction.dart'; + +class TonWeb3FieldsView extends StatelessWidget { + const TonWeb3FieldsView({super.key}); + @override + Widget build(BuildContext context) { + final Web3TonRequest request = context.getArgruments(); + final wallet = context.watch(StateConst.main); + switch (request.params.method) { + case Web3TonRequestMethods.requestAccounts: + return TonWeb3GlobalFieldsView(request: request, wallet: wallet); + case Web3TonRequestMethods.signMessage: + return TonWeb3GlobalFieldsView, Web3TonSignMessage>( + request: request as Web3TonRequest, Web3TonSignMessage>, + wallet: wallet); + case Web3TonRequestMethods.sendTransaction: + return TonWeb3TransactionFieldsView( + request: request.cast(), wallet: wallet); + default: + } + return WidgetConstant.sizedBox; + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/request_account.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/request_account.dart new file mode 100644 index 00000000..da8ec0d7 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/request_account.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/future/wallet/global/pages/address_details.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/forms/web3/forms/requst_account.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/web3/controller/controller/global.dart'; +import 'package:mrt_wallet/future/wallet/start/pages/account_not_adress.dart'; +import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; + +class TonWeb3RequestAccountsView extends StatelessWidget { + const TonWeb3RequestAccountsView( + {required this.field, required this.controller, Key? key}) + : super(key: key); + final TonRequestAccountForm field; + final Web3TonGlobalRequestController controller; + @override + Widget build(BuildContext context) { + return SliverMainAxisGroup( + slivers: [ + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("ton_networks".tr, style: context.textTheme.titleMedium), + Text("chain_permission_desc".tr), + WidgetConstant.height8, + AppDropDownBottom( + items: { + for (final i in field.chains) + i: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAPPImageView(i.network.token.assetLogo, + radius: 15), + WidgetConstant.width8, + Flexible( + child: OneLineTextWidget( + i.network.token.name, + style: context.textTheme.labelLarge, + ), + ) + ], + ) + }, + isExpanded: true, + onChanged: field.onChangeChain, + value: field.chain), + WidgetConstant.height20, + Text("accounts".tr, style: context.textTheme.titleMedium), + Text("web3_accounts_permission_desc".tr), + WidgetConstant.height8, + ], + ), + ), + APPSliverAnimatedSwitcher(enable: field.chain.haveAddress, widgets: { + true: (c) => SliverMainAxisGroup( + slivers: [ + SliverList.builder( + addAutomaticKeepAlives: false, + itemBuilder: (c, index) { + final addr = field.chain.addresses[index]; + final permission = field.accountPermission(addr); + return ContainerWithBorder( + onTapWhenOnRemove: false, + onRemove: () { + field.addAccount(addr); + }, + onRemoveWidget: Column( + children: [ + IconButton( + onPressed: () => field.addAccount(addr), + icon: IgnorePointer( + child: Checkbox( + value: permission != null, + onChanged: (e) {}), + ), + ), + APPAnimatedSize( + isActive: permission != null, + onActive: (context) => IconButton( + tooltip: "default_address".tr, + onPressed: () => + field.onChangeDefaultPermission( + permission), + icon: IgnorePointer( + child: Radio( + value: permission!.defaultAddress, + groupValue: true, + onChanged: (e) {}), + )), + onDeactive: (context) => + WidgetConstant.sizedBox) + ], + ), + child: AddressDetailsView(address: addr), + ); + }, + itemCount: field.chain.addresses.length), + SliverToBoxAdapter( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FixedElevatedButton( + padding: WidgetConstant.paddingVertical40, + child: Text("update_permission".tr), + onPressed: () { + field.complete(); + }), + ], + ), + ) + ], + ), + false: (c) => SliverToBoxAdapter( + child: NoAccountFoundInChainWidget(field.chain)) + }), + ], + ); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/sign_message.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/sign_message.dart new file mode 100644 index 00000000..eec09d8e --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/fields/sign_message.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/future/future.dart'; +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/models/sign_message.dart'; + +class TonWeb3SignMessageRequestView extends StatelessWidget { + const TonWeb3SignMessageRequestView({required this.request, Key? key}) + : super(key: key); + final Web3TonSignMessageForm request; + Web3TonSignMessage get param => request.request.params; + @override + Widget build(BuildContext context) { + return SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ContainerWithBorder( + backgroundColor: context.colors.errorContainer, + onTapWhenOnRemove: false, + child: Row( + children: [ + Icon( + Icons.warning, + color: context.colors.error, + size: APPConst.double40, + ), + WidgetConstant.width8, + Expanded( + child: Text("sign_message_private_key_desc".tr, + style: context.colors.onErrorContainer + .bodyMedium(context)), + ), + ], + )), + WidgetConstant.height20, + Text("message".tr, style: context.textTheme.titleMedium), + Text("sign_message_private_key".tr), + WidgetConstant.height8, + ContainerWithBorder( + onRemove: () {}, + onRemoveWidget: + CopyTextIcon(dataToCopy: param.challeng, isSensitive: false), + onTapWhenOnRemove: false, + child: Text(param.challeng, + style: + context.colors.onPrimaryContainer.bodyMedium(context))), + if (param.content != null) ...[ + WidgetConstant.height20, + Text("content".tr, style: context.textTheme.titleMedium), + ContainerWithBorder( + onRemove: () {}, + onRemoveWidget: CopyTextIcon( + dataToCopy: param.content ?? "", isSensitive: false), + onTapWhenOnRemove: false, + child: SelectableText( + param.content ?? "", + style: context.colors.onPrimaryContainer.bodyMedium(context), + minLines: 1, + maxLines: 5, + )), + ], + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FixedElevatedButton( + padding: WidgetConstant.paddingVertical40, + child: Text("sign_message".tr), + onPressed: () { + request.signMessage(() async { + return context.openSliverDialog( + (ctx) => DialogTextView( + widget: Column( + children: [ + Icon( + Icons.warning, + color: context.colors.error, + size: APPConst.double80, + ), + WidgetConstant.height8, + ContainerWithBorder( + backgroundColor: + context.colors.errorContainer, + onTapWhenOnRemove: false, + child: Text( + "sign_message_private_key_desc".tr, + style: context.colors.onErrorContainer + .bodyMedium(context))), + ], + ), + buttonWidget: const AsyncDialogDoubleButtonView(), + text: "sign_message_private_key_desc".tr), + "sign_message".tr); + }); + }) + ], + ) + ], + ), + ); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/pages/global.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/global.dart new file mode 100644 index 00000000..1c06d9e7 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/global.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/future/wallet/controller/controller.dart'; +import 'package:mrt_wallet/future/wallet/network/forms/ton/ton.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/web3/controller/controller/global.dart'; +import 'package:mrt_wallet/future/wallet/web3/pages/view_controller.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'fields/request_account.dart'; +import 'fields/sign_message.dart'; + +class TonWeb3GlobalFieldsView> + extends StatelessWidget { + const TonWeb3GlobalFieldsView( + {required this.wallet, super.key, required this.request}); + final Web3TonRequest request; + final WalletProvider wallet; + + @override + Widget build(BuildContext context) { + return Web3PageRequestControllerView( + controller: () => Web3TonGlobalRequestController( + walletProvider: wallet, request: request), + builder: (context, controller) { + return [ + _GlobalFieldsView(form: controller.form, controller: controller) + ]; + }, + request: request, + ); + } +} + +class _GlobalFieldsView extends StatelessWidget { + const _GlobalFieldsView( + {required this.form, required this.controller, Key? key}) + : super(key: key); + final TonWeb3Form form; + final Web3TonGlobalRequestController controller; + @override + Widget build(BuildContext context) { + switch (form.request.params.method) { + case Web3TonRequestMethods.requestAccounts: + return TonWeb3RequestAccountsView( + controller: controller, field: form as TonRequestAccountForm); + case Web3TonRequestMethods.signMessage: + return TonWeb3SignMessageRequestView( + request: form as Web3TonSignMessageForm); + default: + return const SliverPadding(padding: EdgeInsets.zero); + } + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/pages/transaction.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/transaction.dart new file mode 100644 index 00000000..bbf4d6ac --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/pages/transaction.dart @@ -0,0 +1,257 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/future/future.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/web3/controller/controller/transaction.dart'; +import 'package:mrt_wallet/future/wallet/web3/pages/view_controller.dart'; +import 'package:mrt_wallet/wallet/models/networks/networks.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; + +class TonWeb3TransactionFieldsView extends StatelessWidget { + const TonWeb3TransactionFieldsView( + {required this.wallet, super.key, required this.request}); + final Web3TonRequest + request; + final WalletProvider wallet; + + @override + Widget build(BuildContext context) { + return Web3PageRequestControllerView( + controller: () => Web3TonTransactionRequestController( + walletProvider: wallet, request: request), + builder: (context, controller) { + return [ + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("transaction_messages".tr, + style: context.textTheme.titleMedium), + Text("ton_tx_message_details".tr), + WidgetConstant.height20, + ], + ), + ), + SliverPadding( + padding: WidgetConstant.paddingHorizontal20, + sliver: SliverList.separated( + itemBuilder: (context, index) { + final message = controller.form.messages[index]; + return _TonWeb3TransactionMessageView( + message: message, controller: controller); + }, + itemCount: controller.form.messages.length, + addAutomaticKeepAlives: false, + addRepaintBoundaries: false, + addSemanticIndexes: false, + separatorBuilder: (context, index) { + return WidgetConstant.divider; + }, + ), + ), + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + WidgetConstant.height20, + TransactionAmountView( + title: "total_transaction_const".tr, + amount: controller.total, + token: controller.network.token), + WidgetConstant.height20, + Text("transaction_fees".tr, + style: context.textTheme.titleMedium), + Text("ton_transaction_fee_desc".tr), + WidgetConstant.height8, + TonTransactionFeeView(controller), + InsufficientBalanceErrorView( + verticalMargin: WidgetConstant.paddingVertical10, + balance: controller.remindAmount, + token: controller.network.token), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FixedElevatedButton( + padding: WidgetConstant.paddingVertical40, + onPressed: () { + controller.sendTransaction(); + }, + child: Text("send_transaction".tr)) + ], + ) + ], + ), + ) + ]; + }, + request: request); + } +} + +class _TonWeb3TransactionMessageView extends StatelessWidget { + const _TonWeb3TransactionMessageView( + {required this.message, required this.controller, Key? key}) + : super(key: key); + final TonWeb3TransactionMessageInfo message; + final Web3TonTransactionRequestController controller; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ReceiptAddressView( + address: message.destination, title: "destination".tr), + WidgetConstant.height20, + TransactionAmountView( + title: "message_amount".tr, + subtitle: "amount_of_ton_message".tr, + amount: message.amount, + token: controller.network.token), + if (message.payload != null) + switch (message.payload!.type) { + TonWeb3TransactionPayloadType.jetton => + _JettonPayloadView(message.payload!.cast()), + TonWeb3TransactionPayloadType.transfer => + _JettonPayloadView(message.payload!.cast()), + _ => _PayloadContentView(payload: message.payload!) + }, + if (message.initState != null) + _JettonInitializeStateView(initState: message.initState!) + ], + ); + } +} + +class _JettonInitializeStateView extends StatelessWidget { + const _JettonInitializeStateView({required this.initState, Key? key}) + : super(key: key); + final String initState; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + WidgetConstant.height20, + Text("deploy_contract".tr, style: context.textTheme.titleMedium), + Text("initialization_state".tr), + WidgetConstant.height8, + ContainerWithBorder( + child: CopyTextIcon( + dataToCopy: initState, + widget: Text(initState, + maxLines: 3, overflow: TextOverflow.ellipsis))), + ], + ); + } +} + +class _JettonPayloadView extends StatelessWidget { + const _JettonPayloadView(this.payload, {Key? key}) : super(key: key); + final JettonContractTonTransactionPayload payload; + + @override + Widget build(BuildContext context) { + final bool isAccountJetton = payload.isAccountJetton ?? false; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + WidgetConstant.height20, + Text("jetton_info".tr, style: context.textTheme.titleMedium), + WidgetConstant.height8, + TokenDetailsView( + token: payload.token, + radius: APPConst.circleRadius25, + showBalance: isAccountJetton, + onSelect: isAccountJetton ? null : () {}, + onTapWhenOnRemove: false, + onSelectWidget: TappedTooltipView( + tooltipWidget: ToolTipView( + message: "unknow_jetton_owner".tr, + child: Icon(Icons.warning, color: context.colors.tertiary), + )), + ), + if (payload.amount != null) ...[ + WidgetConstant.height20, + TransactionAmountView( + title: "amount".tr, + subtitle: "jetton_transfer_amount".tr, + amount: payload.amount, + token: payload.token.token), + ], + _PayloadContentView(payload: payload) + ], + ); + } +} + +class _PayloadContentView extends StatelessWidget { + const _PayloadContentView({required this.payload, Key? key}) + : super(key: key); + final TonWeb3TransactionPayload payload; + Map get content => payload.contentJson; + bool get isUnknowPayload => payload.type.isUnknown; + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + WidgetConstant.height20, + Text("content".tr, style: context.textTheme.labelLarge), + Text("content_of_payload".tr), + WidgetConstant.height8, + APPExpansionListTime( + trailing: isUnknowPayload + ? TappedTooltipView( + tooltipWidget: ToolTipView( + message: 'unknown_payload_desc'.tr, + child: Icon(Icons.warning, color: context.colors.tertiary), + )) + : null, + title: Text(payload.type.name.camelCase, + style: context.colors.onPrimaryContainer.bodyMedium(context)), + subtitle: isUnknowPayload + ? Text("payload_deserialize_failed".tr, + style: context.colors.onPrimaryContainer.bodySmall(context)) + : null, + children: List.generate(content.length, (index) { + final key = content.keys.elementAt(index); + final value = content[key]; + if (value == null) { + return WidgetConstant.sizedBox; + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ContainerWithBorder( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(key.camelCase, + style: context.colors.onPrimaryContainer + .lableLarge(context)), + ContainerWithBorder( + backgroundColor: context.colors.onPrimaryContainer, + constraints: null, + child: CopyTextIcon( + dataToCopy: value.toString(), + isSensitive: false, + color: context.colors.primaryContainer, + widget: SelectableText(value.toString(), + style: context.colors.primaryContainer + .bodyMedium(context), + maxLines: 4, + minLines: 1), + ), + ), + ], + ), + ), + ], + ); + })), + ], + ); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/permission/permission.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/permission/permission.dart new file mode 100644 index 00000000..2d979aaf --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/permission/permission.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/future/future.dart'; +import 'package:mrt_wallet/future/state_managment/state_managment.dart'; +import 'package:mrt_wallet/future/wallet/web3/web3.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class TonWeb3PermissionView extends StatefulWidget { + const TonWeb3PermissionView({required this.permission, Key? key}) + : super(key: key); + final Web3TonChain? permission; + + @override + State createState() => _TonWeb3PermissionViewState(); +} + +class _TonWeb3PermissionViewState extends State + with + SafeState, + Web3PermissionState< + TonWeb3PermissionView, + TonAddress, + TheOpenNetworkChain, + ITonAddress, + Web3TonChainAccount, + Web3TonChain> { + @override + Web3TonChainAccount createNewAccountPermission(ITonAddress address) { + return Web3TonChainAccount.fromChainAccount( + address: address, + workChain: chain.network.coinParam.workchain, + isDefault: false); + } + + @override + Web3TonChain createNewChainPermission() { + return Web3TonChain.create(workChain: chain.network.coinParam.workchain); + } + + bool _initialized = false; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + if (_initialized) return; + _initialized = true; + permission = widget.permission ?? Web3TonChain.create(); + final wallet = context.watch(StateConst.main); + chains = + wallet.wallet.getChains().whereType().toList(); + for (final i in chains) { + permissions[i] = permission.chainAccounts(i); + } + chain = chains.firstWhere( + (e) => e.network.coinParam.workchain == permission.currentChain, + orElse: () => chains.first); + } + + @override + Widget build(BuildContext context) { + return UpdateChainPermissionWidget( + chain: chain, + chains: chains, + onUpdateState: updateState, + hasPermission: hasPermission, + addAccount: addAccount, + onChangeChain: onChangeChain, + onChangeDefaultAccount: onChangeDefaultPermission); + } +} diff --git a/mrt_wallet/lib/future/wallet/network/ton/web3/web3.dart b/mrt_wallet/lib/future/wallet/network/ton/web3/web3.dart new file mode 100644 index 00000000..ffc1cb52 --- /dev/null +++ b/mrt_wallet/lib/future/wallet/network/ton/web3/web3.dart @@ -0,0 +1,3 @@ +export 'pages/fields.dart'; +export 'controller/controller.dart'; +export 'permission/permission.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/tron/token/pages/token.dart b/mrt_wallet/lib/future/wallet/network/tron/token/pages/token.dart index e54271e3..ab720320 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/token/pages/token.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/token/pages/token.dart @@ -6,7 +6,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class ImportTRC20TokenView extends StatelessWidget { const ImportTRC20TokenView({super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/account/account.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/account/account.dart index 9e2c9a9f..18bb1110 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/account/account.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/account/account.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronAccountPageView extends StatelessWidget { const TronAccountPageView({required this.chainAccount, super.key}); diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/network_impl.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/network_impl.dart index 5de88910..7db29f50 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/network_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/network_impl.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/wallet/network/tron/transaction/controller/imp import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin TronNetworkConditionImpl on TronTransactionImpl { late TronChainParameters _chainParameters; diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/signer_impl.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/signer_impl.dart index 4d7e3fc1..79afb0c9 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/signer_impl.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/controller/impl/signer_impl.dart @@ -7,7 +7,7 @@ import 'package:mrt_wallet/crypto/derivation/derivation/bip32.dart'; import 'package:mrt_wallet/crypto/requets/messages/models/models/signing.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; mixin TronSignerImpl on TronTransactionImpl { Future signAndSendTransaction(TronBaseContract transaction) async { diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/create_witness.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/create_witness.dart index f2ed835e..a906ec04 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/create_witness.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/create_witness.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/vote_sr/forms/create_witness.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/delegated_resource.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/delegated_resource.dart index 292daa89..74b73e4d 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/delegated_resource.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/delegated_resource.dart @@ -7,7 +7,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/resource_v2/fo import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; import 'package:on_chain/tron/src/address/tron_address.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronDelegatedResourceFieldsView extends StatelessWidget { const TronDelegatedResourceFieldsView( diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/frozen_balance_v2.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/frozen_balance_v2.dart index d28fd113..a8a6050a 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/frozen_balance_v2.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/frozen_balance_v2.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/resource_v2/forms/freez_balance_v2.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_fee_details_view.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_fee_details_view.dart index 4079af99..174772b8 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_fee_details_view.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_fee_details_view.dart @@ -6,7 +6,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/network/network.dart'; import 'package:mrt_wallet/wallet/models/networks/tron/models/tron_fee.dart'; import 'package:on_chain/tron/src/models/contract/base_contract/transaction_type.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronFeeDetailsView extends StatelessWidget { const TronFeeDetailsView({super.key, required this.transaction}); @@ -177,11 +177,15 @@ class TronFeeInfoWidget extends StatelessWidget { ?.copyWith(color: context.colors.onTertiary), ), RichText( - text: TextSpan(children: [ - TextSpan(text: consumedFee.connsumedEnergy.toString()), - const TextSpan(text: "/"), - TextSpan(text: consumedFee.stackedEnergy.toString()), - ])), + text: TextSpan( + style: + context.colors.onTertiary.bodyMedium(context), + children: [ + TextSpan( + text: consumedFee.connsumedEnergy.toString()), + const TextSpan(text: "/"), + TextSpan(text: consumedFee.stackedEnergy.toString()), + ])), ], ), Row( diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_transfer_field_view.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_transfer_field_view.dart index 887ef6f1..f901e38a 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_transfer_field_view.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/tron_transfer_field_view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/network/tron/transaction/pages/pages/tron_transaction_fields.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/future/wallet/network/forms/forms.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/undelegated_resource.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/undelegated_resource.dart index 0918c16c..940524b5 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/undelegated_resource.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/undelegated_resource.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/resource_v2/forms/undelegated_resource.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronUnDelegatedResourceFieldsView extends StatelessWidget { const TronUnDelegatedResourceFieldsView( diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/unfreez_balance_v2.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/unfreez_balance_v2.dart index 0cd10ea1..246f906c 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/unfreez_balance_v2.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/unfreez_balance_v2.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/resource_v2/forms/unfreez_balance_v2.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronUnFreezBalanceV2FieldsView extends StatelessWidget { const TronUnFreezBalanceV2FieldsView( diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account.dart index 44d06558..cad0fb77 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/account/forms/update_account.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account_permission_feilds.dart b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account_permission_feilds.dart index 58b7b35f..52f51679 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account_permission_feilds.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/transaction/pages/pages/update_account_permission_feilds.dart @@ -6,7 +6,7 @@ import 'package:mrt_wallet/future/wallet/network/forms/tron/forms/account/forms/ import 'package:mrt_wallet/wallet/wallet.dart'; import 'package:mrt_wallet/crypto/utils/tron/tron.dart'; import 'package:on_chain/on_chain.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class TronAccountUpdatePermissionFieldsView extends StatelessWidget { const TronAccountUpdatePermissionFieldsView( diff --git a/mrt_wallet/lib/future/wallet/network/tron/web3/controller/controller/global.dart b/mrt_wallet/lib/future/wallet/network/tron/web3/controller/controller/global.dart index af0c409f..57291b6e 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/web3/controller/controller/global.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/web3/controller/controller/global.dart @@ -22,6 +22,10 @@ class Web3TronGlobalRequestController _consumedFee; @override - // ignore: overridden_fields - late final LiveTransactionForm liveRequest; + late final LiveTransactionForm> + // ignore: overridden_fields + liveRequest; Web3TronTransactionRequestController({ required super.walletProvider, @@ -156,6 +157,17 @@ class Web3TronTransactionRequestController final transactionInfo = await MethodUtils.call(() async => await apiProvider.getWeb3TransactionInfo( transaction: transaction.rawData, chain: account)); + if (address.multiSigAccount) { + final multiSigAddress = address as ITronMultisigAddress; + if (transaction.rawData.permissionId() != + multiSigAddress.multiSignatureAccount.permissionID) { + progressKey.error( + text: "tron_account_permission_not_access_desc".tr, + backToIdle: null); + return; + } + } + if (transactionInfo.hasError) { progressKey.error(text: transactionInfo.error!.tr, backToIdle: null); } else { @@ -178,7 +190,8 @@ class Web3TronTransactionRequestController BytesUtils.toHexString(transaction.rawData.data!); } liveRequest = LiveTransactionForm( - validator: Web3TronReadOnlyForm(request: request)); + validator: + Web3TronReadOnlyForm(request: request)); _trIsReady = _checkTransaction(); progressKey.idle(); } @@ -205,14 +218,14 @@ class Web3TronTransactionRequestController try { final signRequest = GlobalSignRequest.tron( digest: transactionDigest, index: i.keyIndex); - final sss = await generateSignature(signRequest); - signerSignatures.add(sss.signature); + final response = await generateSignature(signRequest); + signerSignatures.add(response.signature); threshHold += i.weight; if (threshHold >= multiSigAddress.multiSignatureAccount.threshold) { break; } - } catch (e) { + } catch (_) { continue; } } @@ -224,10 +237,11 @@ class Web3TronTransactionRequestController final signRequest = GlobalSignRequest.tron( digest: transactionDigest, index: address.keyIndex as Bip32AddressIndex); - final sss = await generateSignature(signRequest); - return [sss.signature]; + final response = await generateSignature(signRequest); + return [response.signature]; }, ); + final signature = await walletProvider.wallet.signTransaction(request: request); if (signature.hasError) { diff --git a/mrt_wallet/lib/future/wallet/network/tron/web3/pages/fields/request_account.dart b/mrt_wallet/lib/future/wallet/network/tron/web3/pages/fields/request_account.dart index 9b1e4996..2395bd17 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/web3/pages/fields/request_account.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/web3/pages/fields/request_account.dart @@ -16,56 +16,42 @@ class TronWeb3RequestAccountsView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("active_chain".tr, style: context.textTheme.titleMedium), - Text("web3_switch_chain_desc".tr, - style: context.textTheme.bodyMedium), + Text("tron_networks".tr, style: context.textTheme.titleMedium), + Text("chain_permission_desc".tr), WidgetConstant.height8, AppDropDownBottom( - label: "network".tr, items: { for (final i in field.chains) - i: Text(i.network.coinParam.token.name) + i: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAPPImageView(i.network.token.assetLogo, + radius: 15), + WidgetConstant.width8, + Flexible( + child: OneLineTextWidget( + i.network.token.name, + style: context.textTheme.labelLarge, + ), + ) + ], + ) }, - value: field.activeChain, - onChanged: field.onChangeActiveChain, + onChanged: field.onChangeChain, + value: field.chain, + isExpanded: true, ), WidgetConstant.height20, - Text("tron_networks".tr, style: context.textTheme.titleMedium), - Text("chain_permission_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - label: "network".tr, - items: { - for (final i in field.chains) - i: Text(i.network.coinParam.token.name) - }, - onChanged: field.onChangeChain, - value: field.chain), - if (field.chainPermission.isNotEmpty) ...[ - WidgetConstant.height20, - Text("default_address".tr, - style: context.textTheme.titleMedium), - Text("default_address_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - isExpanded: true, - label: "default_address".tr, - items: { - for (final i in field.chainPermission) - i: Text(i.address.toAddress()) - }, - onChanged: field.onChangeDefaultPermission, - value: field.defaultChainAccount), - ], - WidgetConstant.height20, Text("accounts".tr, style: context.textTheme.titleMedium), Text("web3_accounts_permission_desc".tr), WidgetConstant.height8, ], ), ), - APPSliverAnimatedSwitcher(enable: field.chain.haveAddress, widgets: { - true: (c) => SliverMainAxisGroup( + if (!field.chain.haveAddress) + SliverToBoxAdapter(child: NoAccountFoundInChainWidget(field.chain)), + APPSliverAnimatedSwitcher(enable: field.chain, widgets: { + field.chain: (c) => SliverMainAxisGroup( slivers: [ SliverList.builder( addAutomaticKeepAlives: false, @@ -73,13 +59,37 @@ class TronWeb3RequestAccountsView extends StatelessWidget { final addr = field.chain.addresses[index]; final permission = field.accountPermission(addr); return ContainerWithBorder( + onTapWhenOnRemove: false, onRemove: () { field.addAccount(addr); }, - onRemoveWidget: IgnorePointer( - child: Checkbox( - value: permission != null, - onChanged: (e) {})), + onRemoveWidget: Column( + children: [ + IconButton( + onPressed: () => field.addAccount(addr), + icon: IgnorePointer( + child: Checkbox( + value: permission != null, + onChanged: (e) {}), + ), + ), + APPAnimatedSize( + isActive: permission != null, + onActive: (context) => IconButton( + tooltip: "default_address".tr, + onPressed: () => + field.onChangeDefaultPermission( + permission), + icon: IgnorePointer( + child: Radio( + value: permission!.defaultAddress, + groupValue: true, + onChanged: (e) {}), + )), + onDeactive: (context) => + WidgetConstant.sizedBox) + ], + ), child: AddressDetailsView(address: addr), ); }, @@ -99,8 +109,6 @@ class TronWeb3RequestAccountsView extends StatelessWidget { ) ], ), - false: (c) => SliverToBoxAdapter( - child: NoAccountFoundInChainWidget(field.chain)) }), ], ); diff --git a/mrt_wallet/lib/future/wallet/network/tron/web3/pages/transaction.dart b/mrt_wallet/lib/future/wallet/network/tron/web3/pages/transaction.dart index 180a60e1..9826c8af 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/web3/pages/transaction.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/web3/pages/transaction.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/constant/global/app.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/global/pages/receipt_address_view.dart'; import 'package:mrt_wallet/future/wallet/global/pages/token_details_view.dart'; diff --git a/mrt_wallet/lib/future/wallet/network/tron/web3/permission/permission.dart b/mrt_wallet/lib/future/wallet/network/tron/web3/permission/permission.dart index d5051b24..22399385 100644 --- a/mrt_wallet/lib/future/wallet/network/tron/web3/permission/permission.dart +++ b/mrt_wallet/lib/future/wallet/network/tron/web3/permission/permission.dart @@ -4,151 +4,64 @@ import 'package:mrt_wallet/future/future.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; import 'package:mrt_wallet/future/wallet/web3/web3.dart'; import 'package:mrt_wallet/wallet/models/chain/account.dart'; -import 'package:mrt_wallet/wallet/web3/networks/tron/permission/permission.dart'; +import 'package:mrt_wallet/wallet/web3/web3.dart'; import 'package:on_chain/tron/src/address/tron_address.dart'; class TronWeb3PermissionView extends StatefulWidget { - const TronWeb3PermissionView( - {required this.permission, - required this.onUpdateChainPermission, - Key? key}) + const TronWeb3PermissionView({required this.permission, Key? key}) : super(key: key); final Web3TronChain? permission; - final OnUpdateChainPermission onUpdateChainPermission; @override State createState() => _TronWeb3PermissionViewState(); } class _TronWeb3PermissionViewState extends State - with SafeState { - late TronChain currentChain; - late Web3TronChain permission = widget.permission ?? Web3TronChain.create(); - - late final List chains; - Map> permissions = {}; - late TronChain chain; - - Map defaultAccount = {}; - - List get chainPermission => permissions[chain]!; - - Web3TronChainAccount? get defaultChainAccount => defaultAccount[chain]; - - Web3TronChainAccount? accountPermission(ITronAddress address) { - return permissions[chain]!.firstWhereOrNull( - (e) => e.address.toAddress() == address.networkAddress.toAddress()); - } - - void onChangeDefaultPermission(Web3TronChainAccount? account) { - if (account == null) return; - defaultAccount[chain] = account; - updateState(); - } - - Web3TronChainAccount? hasPermission(ITronAddress address) { - return accountPermission(address); - } - - void addAccount(ITronAddress address) { - final exists = accountPermission(address); - if (exists != null) { - permissions[chain]?.remove(exists); - } else { - permissions[chain]?.add(Web3TronChainAccount.fromChainAccount( - address: address, - chain: chain.network.tronNetworkType, - isDefault: false)); - } - if (permissions[chain]!.isEmpty) { - defaultAccount.remove(chain); - } else { - if (!permissions[chain]!.contains(defaultChainAccount)) { - defaultAccount[chain] = permissions[chain]![0]; - } - } - updateState(); - } - - void onChangeCurrentChain(TronChain? chain) { - if (chain == null) return; - currentChain = chains.firstWhere( - (e) => e.network.tronNetworkType == chain.network.tronNetworkType); - updateState(); + with + SafeState, + Web3PermissionState { + @override + Web3TronChainAccount createNewAccountPermission(ITronAddress address) { + return Web3TronChainAccount.fromChainAccount( + address: address, + chain: chain.network.tronNetworkType, + isDefault: false); } - void onChangeChain(TronChain? updateChain) { - chain = updateChain ?? chain; - updateState(); + @override + Web3TronChain createNewChainPermission() { + return Web3TronChain.create(chain: chain.network.tronNetworkType); } - void complete() { - final newPermission = - Web3TronChain.create(chain: currentChain.network.tronNetworkType); - List accounts = []; - for (final i in permissions.entries) { - List chainAccounts = []; - Web3TronChainAccount? defaultAddr = defaultAccount[i.key]; - defaultAddr ??= i.value.isEmpty ? null : i.value.first; - for (final a in i.value) { - Web3TronChainAccount account = a; - if (account == defaultAddr && !account.defaultAddress) { - account = account.changeDefault(true); - } else if (account.defaultAddress) { - account = account.changeDefault(false); - } - chainAccounts.add(account); - } - if (chainAccounts.isNotEmpty && - !chainAccounts.any((e) => e.defaultAddress)) { - chainAccounts[0] = chainAccounts[0].changeDefault(true); - } - accounts.addAll(chainAccounts); - } - newPermission.updateChainAccount(accounts); - widget.onUpdateChainPermission(newPermission); - } + bool _initialized = false; @override void didChangeDependencies() { super.didChangeDependencies(); + if (_initialized) return; + _initialized = true; + permission = widget.permission ?? Web3TronChain.create(); final wallet = context.watch(StateConst.main); chains = wallet.wallet.getChains().whereType().toList(); - currentChain = chains.firstWhere( - (e) => e.network.tronNetworkType == permission.currentChain); - for (final i in chains) { - permissions[i] = permission.accounts - .where((e) => e.chain == i.network.tronNetworkType) - .toList(); - } - chain = chains.firstWhere((e) => - e.network.tronNetworkType == currentChain.network.tronNetworkType); - final Map defaultAccount = {}; for (final i in chains) { - final accounts = permissions[i]!; - final defaultAddress = accounts.firstWhereOrNull((e) => e.defaultAddress); - if (defaultAddress != null) { - defaultAccount[i] = defaultAddress; - } + permissions[i] = permission.chainAccounts(i); } - this.defaultAccount = defaultAccount; + chain = chains.firstWhere( + (e) => e.network.tronNetworkType == permission.currentChain, + orElse: () => chains.first); } @override Widget build(BuildContext context) { return UpdateChainPermissionWidget( - chain: chain, - chains: chains, - complete: complete, - hasPermission: hasPermission, - onChangeCurrentChain: onChangeCurrentChain, - addAccount: addAccount, - onChangeChain: onChangeChain, - onChangeDefaultAccount: onChangeDefaultPermission, - permissions: permissions[chain]!, - defaultChainAddress: defaultChainAccount, - activeChain: currentChain, - ); + Web3TronChainAccount>( + chain: chain, + chains: chains, + onUpdateState: updateState, + hasPermission: hasPermission, + addAccount: addAccount, + onChangeChain: onChangeChain, + onChangeDefaultAccount: onChangeDefaultPermission); } } diff --git a/mrt_wallet/lib/future/wallet/security/pages/password_checker.dart b/mrt_wallet/lib/future/wallet/security/pages/password_checker.dart index 36cf2800..88c0c212 100644 --- a/mrt_wallet/lib/future/wallet/security/pages/password_checker.dart +++ b/mrt_wallet/lib/future/wallet/security/pages/password_checker.dart @@ -21,9 +21,7 @@ class PasswordCheckerView extends StatefulWidget { this.password, this.customKey, this.controller, - this.appbar}) - : assert(appbar != null || title != null, - "use appbar or title to build page appbar."); + this.appbar}); final FuncWidgetStringPaagePrgoressKey onAccsess; final WalletAccsessType accsess; final String? title; @@ -66,7 +64,7 @@ class _PasswordCheckerViewState extends State String? error; String? psaswordForm(String? v) { if (StrUtils.isStrongPassword(v)) return null; - return "password_desc".tr; + return "password_validator".tr; } void onChange(String v) { @@ -152,10 +150,15 @@ class _PasswordCheckerViewState extends State _lifeCycle?.dispose(); } + PreferredSizeWidget? appBar() { + if (widget.appbar == null && widget.title == null) return null; + return widget.appbar ?? AppBar(title: Text(widget.title ?? '')); + } + @override Widget build(BuildContext context) { return Scaffold( - appBar: widget.appbar ?? AppBar(title: Text(widget.title ?? '')), + appBar: appBar(), body: UnfocusableChild( child: APPAnimatedSwitcher( duration: APPConst.animationDuraion, diff --git a/mrt_wallet/lib/future/wallet/setting/color_selector.dart b/mrt_wallet/lib/future/wallet/setting/color_selector.dart index 8fdb33c5..f48a5600 100644 --- a/mrt_wallet/lib/future/wallet/setting/color_selector.dart +++ b/mrt_wallet/lib/future/wallet/setting/color_selector.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/widgets/page_title_subtitle.dart'; import 'package:mrt_wallet/future/widgets/widgets/widget_constant.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; typedef OnSelectColor = void Function(Color?); diff --git a/mrt_wallet/lib/future/wallet/setting/setting.dart b/mrt_wallet/lib/future/wallet/setting/setting.dart index bb4a54a5..18349ada 100644 --- a/mrt_wallet/lib/future/wallet/setting/setting.dart +++ b/mrt_wallet/lib/future/wallet/setting/setting.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/start/pages/about.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'color_selector.dart'; diff --git a/mrt_wallet/lib/future/wallet/setup/pages/mnemonic_view.dart b/mrt_wallet/lib/future/wallet/setup/pages/mnemonic_view.dart index 641aad08..2ba54bc5 100644 --- a/mrt_wallet/lib/future/wallet/setup/pages/mnemonic_view.dart +++ b/mrt_wallet/lib/future/wallet/setup/pages/mnemonic_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/widgets/widget_constant.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class MnemonicView extends StatelessWidget { const MnemonicView({super.key, required this.mnemonic}); diff --git a/mrt_wallet/lib/future/wallet/start/pages/about.dart b/mrt_wallet/lib/future/wallet/start/pages/about.dart index 72635c74..1b80123c 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/about.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/about.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_native_support/platform_interface.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/constant/constant.dart'; class AbountWalletView extends StatelessWidget { diff --git a/mrt_wallet/lib/future/wallet/start/pages/account_not_adress.dart b/mrt_wallet/lib/future/wallet/start/pages/account_not_adress.dart index cc5d2bb4..e545bab3 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/account_not_adress.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/account_not_adress.dart @@ -1,13 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/models/models/typedef.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; class NoAccountFoundInChainWidget extends StatelessWidget { - const NoAccountFoundInChainWidget(this.chainAccount, {Key? key}) + const NoAccountFoundInChainWidget(this.chainAccount, + {this.onClosePage, Key? key}) : super(key: key); final Chain chainAccount; + final DynamicVoid? onClosePage; @override Widget build(BuildContext context) { @@ -31,8 +34,12 @@ class NoAccountFoundInChainWidget extends StatelessWidget { FixedElevatedButton( padding: WidgetConstant.paddingVertical20, onPressed: () { - context.to(PageRouter.setupGenericAddress, - argruments: chainAccount); + context + .to(PageRouter.setupGenericAddress, + argruments: chainAccount) + .then((e) { + onClosePage?.call(); + }); }, child: Text("setup_address".tr)), ], diff --git a/mrt_wallet/lib/future/wallet/start/pages/appbar.dart b/mrt_wallet/lib/future/wallet/start/pages/appbar.dart index 76f29bcf..d154ea75 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/appbar.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/appbar.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/global/pages/share_account_view.dart'; import 'package:mrt_wallet/future/wallet/start/pages/menu_bar.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class AccountPageSliverHeaderDelegate extends SliverPersistentHeaderDelegate { final WalletProvider wallet; diff --git a/mrt_wallet/lib/future/wallet/start/pages/client.dart b/mrt_wallet/lib/future/wallet/start/pages/client.dart index fdf542e6..8787166d 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/client.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/client.dart @@ -5,7 +5,7 @@ import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/wallet/global/global.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class NetworkClientConnectionSliverHeaderDelegate extends StatelessWidget { final WalletProvider wallet; diff --git a/mrt_wallet/lib/future/wallet/start/pages/menu_bar.dart b/mrt_wallet/lib/future/wallet/start/pages/menu_bar.dart index 85f7a078..02c80924 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/menu_bar.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/menu_bar.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; import 'package:mrt_wallet/wallet/wallet.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class AccountMenuButtonView extends StatelessWidget { const AccountMenuButtonView({super.key, required this.wallet}); diff --git a/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/io.dart b/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/io.dart index 50b505ae..e97ca93a 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/io.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/io.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_native_support/platform_interface.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/context.dart'; +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/context.dart'; List bottomAppBarWidgets(BuildContext context) { if (PlatformInterface.supportWebView) { diff --git a/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/web.dart b/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/web.dart index 94ce4f12..ca277404 100644 --- a/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/web.dart +++ b/mrt_wallet/lib/future/wallet/start/pages/platform_widgets/platforms/web.dart @@ -7,17 +7,16 @@ import 'package:mrt_wallet/future/wallet/controller/impl/web3_request_controller import 'package:mrt_wallet/future/wallet/web3/pages/permission_view.dart'; List bottomAppBarWidgets(BuildContext context) { - if (isExtention) { + if (isExtension) { return [ IconButton( onPressed: () { final wallet = context.watch(StateConst.main); - - context.openSliverBottomSheet("update_permission".tr, - bodyBuilder: (c) => Web3PermissionUpdateView( - controller: wallet.wallet as Web3RequestControllerImpl, - scrollController: c), - centerContent: false); + context.openDialogPage( + "update_permission".tr, + fullWidget: Web3PermissionUpdateView( + controller: wallet.wallet as Web3RequestControllerImpl), + ); }, icon: const Icon(Icons.travel_explore)) ]; diff --git a/mrt_wallet/lib/future/wallet/web3/pages/appbar_action.dart b/mrt_wallet/lib/future/wallet/web3/pages/appbar_action.dart index f91c065a..381a4528 100644 --- a/mrt_wallet/lib/future/wallet/web3/pages/appbar_action.dart +++ b/mrt_wallet/lib/future/wallet/web3/pages/appbar_action.dart @@ -51,10 +51,7 @@ class Web3PermissionAppbarActionView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - CircleTokenImgaeView( - network.token, - radius: 15, - ), + CircleTokenImgaeView(network.token, radius: 15), Text(network.token.nameView, style: context.textTheme.labelMedium) ], ), diff --git a/mrt_wallet/lib/future/wallet/web3/pages/chain_permission.dart b/mrt_wallet/lib/future/wallet/web3/pages/chain_permission.dart index 71aaed69..a544c716 100644 --- a/mrt_wallet/lib/future/wallet/web3/pages/chain_permission.dart +++ b/mrt_wallet/lib/future/wallet/web3/pages/chain_permission.dart @@ -6,8 +6,7 @@ import 'package:mrt_wallet/wallet/models/chain/address/core/address.dart'; import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; import 'package:mrt_wallet/wallet/web3/core/core.dart'; -typedef HASPERMISSION - = Web3ChainAccount? Function(ACCOUNT); +typedef HASPERMISSION = CHAINACCOUNT? Function(ACCOUNT); typedef OnChangeCurrentChain = void Function(CHAIN?); typedef ADDPERMISSIONACCOUNT = void Function(ACCOUNT); typedef ONCHANGEDEFAULTACCOUNT = void Function(CHAINACCOUNT?); @@ -21,122 +20,128 @@ class UpdateChainPermissionWidget< const UpdateChainPermissionWidget( {required this.chain, required this.chains, - required this.complete, + required this.onUpdateState, required this.hasPermission, - required this.onChangeCurrentChain, required this.addAccount, required this.onChangeChain, required this.onChangeDefaultAccount, - required this.permissions, - required this.defaultChainAddress, - required this.activeChain, Key? key}) : super(key: key); final CHAIN chain; final List chains; - final DynamicVoid complete; - final HASPERMISSION hasPermission; - final OnChangeCurrentChain onChangeCurrentChain; + final DynamicVoid onUpdateState; + final HASPERMISSION hasPermission; final OnChangeCurrentChain onChangeChain; final ADDPERMISSIONACCOUNT
addAccount; final ONCHANGEDEFAULTACCOUNT onChangeDefaultAccount; - final List permissions; - final CHAINACCOUNT? defaultChainAddress; - final CHAIN activeChain; @override Widget build(BuildContext context) { - return SliverToBoxAdapter( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("active_chain".tr, style: context.textTheme.titleMedium), - Text("web3_switch_chain_desc".tr, - style: context.textTheme.bodyMedium), - WidgetConstant.height8, - AppDropDownBottom( - label: "network".tr, - items: { - for (final i in chains) i: Text(i.network.coinParam.token.name) - }, - onChanged: onChangeCurrentChain, - value: activeChain), - WidgetConstant.height20, - Text("network".tr, style: context.textTheme.titleMedium), - Text("chain_permission_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - label: "network".tr, - items: { - for (final i in chains) i: Text(i.network.coinParam.token.name) - }, - onChanged: onChangeChain, - value: chain), - APPAnimatedSize( - isActive: permissions.isNotEmpty, - onActive: (context) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - WidgetConstant.height20, - Text("default_address".tr, - style: context.textTheme.titleMedium), - Text("default_address_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - isExpanded: true, - label: "default_address".tr, - items: {for (final i in permissions) i: Text(i.addressStr)}, - onChanged: onChangeDefaultAccount, - value: defaultChainAddress) - ], + return SliverMainAxisGroup(slivers: [ + SliverAppBar( + leading: WidgetConstant.sizedBox, + surfaceTintColor: context.colors.transparent, + centerTitle: false, + backgroundColor: context.colors.surface, + leadingWidth: 0, + actions: [ + TappedTooltipView( + tooltipWidget: ToolTipView( + message: "switch_permission_chain_desc".tr, + child: const Icon(Icons.help), ), - onDeactive: (context) { - return WidgetConstant.sizedBox; - }, ), - WidgetConstant.height20, - Text("accounts".tr, style: context.textTheme.titleMedium), - Text("web3_accounts_permission_desc".tr), - WidgetConstant.height8, - APPAnimatedSwitcher(enable: chain.haveAddress, widgets: { - true: (c) => Column( + WidgetConstant.width8, + ], + title: AppDropDownBottom( + focusColor: context.colors.surface, + fillColor: context.colors.surface, + label: null, + isExpanded: true, + items: { + for (final i in chains) + i: Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - ListView.builder( - addAutomaticKeepAlives: false, - shrinkWrap: true, - physics: WidgetConstant.noScrollPhysics, - itemBuilder: (c, index) { - final addr = chain.addresses[index]; - final permission = hasPermission(addr as ADDRESS); - - return ContainerWithBorder( - onRemove: () { - addAccount(addr); - }, - onRemoveWidget: IgnorePointer( - child: Checkbox( - value: permission != null, - onChanged: (e) {})), - child: AddressDetailsView(address: addr), - ); - }, - itemCount: chain.addresses.length), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FixedElevatedButton( - padding: WidgetConstant.paddingVertical40, - child: Text("update_permission".tr), - onPressed: () { - complete(); - }), - ], + CircleAPPImageView(i.network.token.assetLogo, radius: 15), + WidgetConstant.width8, + Flexible( + child: OneLineTextWidget( + i.network.token.name, + style: context.textTheme.labelLarge, + ), ) ], - ), - false: (c) => NoAccountFoundInChainWidget(chain) - }), - ], + ) + }, + onChanged: onChangeChain, + value: chain), + pinned: true, ), - ); + SliverPadding( + padding: WidgetConstant.paddingHorizontal10, + sliver: SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + WidgetConstant.height8, + if (!chain.haveAddress) + NoAccountFoundInChainWidget(chain, onClosePage: onUpdateState), + APPAnimatedSwitcher(enable: chain, widgets: { + chain: (c) => Column( + children: [ + ListView.builder( + addAutomaticKeepAlives: false, + shrinkWrap: true, + physics: WidgetConstant.noScrollPhysics, + itemBuilder: (c, index) { + final addr = chain.addresses[index]; + final permission = hasPermission(addr as ADDRESS); + return ContainerWithBorder( + onTapWhenOnRemove: false, + onRemove: () { + addAccount(addr); + }, + onRemoveWidget: Column( + children: [ + IconButton( + onPressed: () => addAccount(addr), + icon: IgnorePointer( + child: Checkbox( + value: permission != null, + onChanged: (e) {}), + ), + ), + APPAnimatedSize( + isActive: permission != null, + onActive: (context) => IconButton( + tooltip: "default_address".tr, + onPressed: () => + onChangeDefaultAccount( + permission), + icon: IgnorePointer( + child: Radio( + toggleable: true, + value: permission! + .defaultAddress, + groupValue: true, + onChanged: (e) {}), + )), + onDeactive: (context) => + WidgetConstant.sizedBox) + ], + ), + child: AddressDetailsView(address: addr), + ); + }, + itemCount: chain.addresses.length), + WidgetConstant.height40, + ], + ), + }), + ], + ), + ), + ) + ]); } } diff --git a/mrt_wallet/lib/future/wallet/web3/pages/page_progress.dart b/mrt_wallet/lib/future/wallet/web3/pages/page_progress.dart index 5388a521..a661bd77 100644 --- a/mrt_wallet/lib/future/wallet/web3/pages/page_progress.dart +++ b/mrt_wallet/lib/future/wallet/web3/pages/page_progress.dart @@ -137,7 +137,13 @@ class Web3PageProgressState extends State with SafeState { future: MethodUtils.after(() async => widget.child(c)), builder: (context, snapshot) { if (snapshot.hasError) { - return WidgetConstant.errorIcon; + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + WidgetConstant.errorIcon, + Text(snapshot.error?.toString() ?? "") + ], + ); } if (snapshot.hasData) { _child = snapshot.data!; diff --git a/mrt_wallet/lib/future/wallet/web3/pages/permission_view.dart b/mrt_wallet/lib/future/wallet/web3/pages/permission_view.dart index 875a8807..85c45c8b 100644 --- a/mrt_wallet/lib/future/wallet/web3/pages/permission_view.dart +++ b/mrt_wallet/lib/future/wallet/web3/pages/permission_view.dart @@ -2,41 +2,116 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; import 'package:mrt_wallet/future/wallet/network/solana/web3/web3.dart'; +import 'package:mrt_wallet/future/wallet/network/ton/web3/permission/permission.dart'; import 'package:mrt_wallet/future/wallet/network/tron/web3/web3.dart'; +import 'package:mrt_wallet/future/wallet/security/pages/password_checker.dart'; import 'package:mrt_wallet/future/wallet/web3/pages/client_info.dart'; import 'package:mrt_wallet/future/wallet/controller/impl/web3_request_controller.dart'; import 'package:mrt_wallet/future/wallet/network/ethereum/web3/permission/ethereum_permission_view.dart'; -import 'package:mrt_wallet/future/wallet/security/pages/password_checker.dart'; import 'package:mrt_wallet/future/widgets/custom_widgets.dart'; -import 'package:mrt_wallet/wallet/models/access/wallet_access.dart'; +import 'package:mrt_wallet/wallet/models/models.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; -typedef OnUpdateChainPermission = void Function(Web3Chain update); +mixin Web3PermissionState< + T extends StatefulWidget, + NETWORKADDRESS, + CHAIN extends APPCHAINNETWORK, + ADDRESS extends NETWORKCHAINACCOUNT, + CHAINACCOUT extends Web3ChainAccount, + WEB3CHAIN extends Web3Chain> + on SafeState { + WEB3CHAIN createNewChainPermission(); + CHAINACCOUT createNewAccountPermission(ADDRESS address); + + Future getPermission() async { + final WEB3CHAIN newPermission = createNewChainPermission(); + List accounts = []; + for (final i in permissions.entries) { + if (i.value.isEmpty) continue; + final defaultAddresses = i.value.where((e) => e.defaultAddress); + if (defaultAddresses.isEmpty) { + i.value.first.changeDefault(true); + } else if (defaultAddresses.length > 1) { + for (final e in i.value) { + e.changeDefault(false); + } + i.value.first.changeDefault(true); + } + accounts.addAll(i.value); + } + newPermission.updateChainAccount(accounts); + return newPermission; + } + + late final WEB3CHAIN permission; + late final List chains; + Map> permissions = {}; + late CHAIN chain; + List get chainPermission => permissions[chain]!; + void onChangeDefaultPermission(CHAINACCOUT? address) { + if (address == null) return; + if (address.defaultAddress) return; + for (final e in chainPermission) { + e.changeDefault(false); + } + address.changeDefault(true); + updateState(); + } + + CHAINACCOUT? hasPermission(ADDRESS address) { + return chainPermission.firstWhereOrNull((e) => + e.address == address.networkAddress && e.keyIndex == address.keyIndex); + } + + void addAccount(ADDRESS address) { + final exists = hasPermission(address); + if (exists != null) { + chainPermission.remove(exists); + } else { + chainPermission.add(createNewAccountPermission(address)); + } + if (chainPermission.isNotEmpty && + !chainPermission.any((e) => e.defaultAddress)) { + chainPermission[0].changeDefault(true); + } + + updateState(); + } + + void onChangeChain(CHAIN? updateChain) { + chain = updateChain ?? chain; + updateState(); + } +} class Web3PermissionUpdateView extends StatelessWidget { - const Web3PermissionUpdateView( - {required this.controller, required this.scrollController, Key? key}) + const Web3PermissionUpdateView({required this.controller, Key? key}) : super(key: key); final Web3RequestControllerImpl controller; - final ScrollController scrollController; + @override Widget build(BuildContext context) { - return PasswordCheckerView( - accsess: WalletAccsessType.unlock, - onAccsess: (credential, password, network) => _Web3APPPermissionView( - controller: controller, scrollController: scrollController), - title: "update_permission".tr, + return ConstraintsBoxView( + alignment: Alignment.center, + maxHeight: APPConst.maxDialogHeight, + padding: WidgetConstant.padding20, + maxWidth: APPConst.dialogWidth, + child: ClipRRect( + borderRadius: WidgetConstant.border25, + child: PasswordCheckerView( + accsess: WalletAccsessType.unlock, + onAccsess: (credential, password, network) => + _Web3APPPermissionView(controller: controller), + )), ); } } class _Web3APPPermissionView extends StatefulWidget { - const _Web3APPPermissionView( - {required this.controller, required this.scrollController, Key? key}) + const _Web3APPPermissionView({required this.controller, Key? key}) : super(key: key); final Web3RequestControllerImpl controller; - final ScrollController scrollController; @override State<_Web3APPPermissionView> createState() => __Web3APPPermissionViewState(); @@ -70,7 +145,7 @@ class __Web3APPPermissionViewState extends State<_Web3APPPermissionView> final GlobalKey progressKey = GlobalKey(); - NetworkType? chainType; + NetworkType chainType = NetworkType.ethereum; Future onChangePermission() async { application = await controller.getCurrentApplication(); @@ -89,11 +164,16 @@ class __Web3APPPermissionViewState extends State<_Web3APPPermissionView> } } - void onUpdateChainPermission(Web3Chain update) async { + void onUpdateChainPermission() async { + final update = + await permissionState[_selectedIndex]?.currentState?.getPermission(); Web3APPAuthentication? permission = application; if (permission == null) return; progressKey.progressText("updating_permission".tr); - permission.updateChainAccount(update); + updateState(); + if (update != null) { + permission.updateChainAccount(update); + } if (permission.name != applicationName || permission.active != active) { permission = permission.clone(active: active, name: applicationName); } @@ -104,10 +184,18 @@ class __Web3APPPermissionViewState extends State<_Web3APPPermissionView> } else { progressKey.success(); } + updateState(); } - void changeChain(NetworkType? chainType) { - this.chainType = chainType; + int _selectedIndex = 1; + void changeChain(int index) { + if (index == 0) { + _selectedIndex = 0; + updateState(); + return; + } + chainType = Web3Const.supportedWeb3.elementAt(index - 1); + _selectedIndex = index; updateState(); } @@ -122,84 +210,147 @@ class __Web3APPPermissionViewState extends State<_Web3APPPermissionView> super.didUpdateWidget(oldWidget); } + late final Map> permissionState = { + 1: GlobalKey( + debugLabel: "Web3PermissionState_ethereumm"), + 2: GlobalKey(debugLabel: "Web3PermissionState_tron"), + 3: GlobalKey(debugLabel: "Web3PermissionState_solana"), + 4: GlobalKey(debugLabel: "Web3PermissionState_ton"), + }; + @override Widget build(BuildContext context) { - return Form( - key: formKey, - child: PageProgress( - initialStatus: StreamWidgetStatus.progress, - key: progressKey, - backToIdle: APPConst.oneSecoundDuration, - child: (c) => CustomScrollView( - controller: widget.scrollController, - // mainAxisSize: MainAxisSize.max, - slivers: [ - SliverConstraintsBoxView( - padding: WidgetConstant.paddingHorizontal20, - sliver: APPSliverAnimatedSwitcher( - enable: chainType != null, - widgets: { - true: (c) => _APPPermissionWidget(this), - false: (c) => _SelectAPPPermissionChainWidget(this), - })) - ], - )), + return Scaffold( + floatingActionButton: + APPAnimatedSwitcher(enable: progressKey.inProgress, widgets: { + false: (context) => FloatingActionButton.extended( + onPressed: () { + onUpdateChainPermission(); + }, + label: Text("update_permission".tr), + icon: const Icon(Icons.save), + ), + true: (context) => WidgetConstant.sizedBox, + }), + body: PageProgress( + backToIdle: APPConst.milliseconds100, + initialStatus: StreamWidgetStatus.progress, + key: progressKey, + child: (context) => Row( + children: [ + Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: APPConst.naviationRailWidth), + child: IntrinsicHeight( + child: NavigationRail( + useIndicator: true, + onDestinationSelected: changeChain, + labelType: NavigationRailLabelType.none, + destinations: [ + const NavigationRailDestination( + icon: Icon(Icons.settings), + label: WidgetConstant.sizedBox), + NavigationRailDestination( + icon: CircleAssetsImgaeView(APPConst.eth, + radius: 15), + label: WidgetConstant.sizedBox), + NavigationRailDestination( + icon: CircleAssetsImgaeView(APPConst.trx, + radius: 15), + label: WidgetConstant.sizedBox), + NavigationRailDestination( + icon: CircleAssetsImgaeView(APPConst.sol, + radius: 15), + label: WidgetConstant.sizedBox), + NavigationRailDestination( + icon: CircleAssetsImgaeView(APPConst.ton, + radius: 15), + label: WidgetConstant.sizedBox), + ], + selectedIndex: _selectedIndex, + ), + ), + ), + ), + ), + TappedTooltipView( + tooltipWidget: ToolTipView( + padding: WidgetConstant.padding5, + tooltipWidget: (context) => ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: APPConst.tooltipConstrainedWidth), + child: Container( + decoration: BoxDecoration( + color: context.colors.surface, + borderRadius: WidgetConstant.border8, + ), + padding: WidgetConstant.padding10, + child: Web3ClientInfoView( + permission: application!))), + child: CircleAPPImageView(application?.icon, + radius: 35, + onError: (c) => const Icon(Icons.broken_image, + size: APPConst.double40))), + ), + ], + ), + Expanded(child: _APPPermissionWidget(this)) + ], + ), + ), ); } } -class _SelectAPPPermissionChainWidget extends StatelessWidget { - const _SelectAPPPermissionChainWidget(this.state, {Key? key}) - : super(key: key); +class _APPPermissionWidget extends StatelessWidget { + const _APPPermissionWidget(this.state, {Key? key}) : super(key: key); final __Web3APPPermissionViewState state; @override Widget build(BuildContext context) { - return SliverFillRemaining( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.security, - size: APPConst.double80, - color: context.colors.inversePrimary), - ], - ), - const Padding(padding: WidgetConstant.paddingVertical40), - Text("network".tr, style: context.textTheme.titleMedium), - Text("update_client_permission_desc".tr), - WidgetConstant.height8, - AppDropDownBottom( - items: { - for (final i in Web3Const.supportedWeb3) i: Text(i.name.camelCase) - }, - label: "network".tr, - onChanged: state.changeChain, - value: state.chainType, - ) - ], - ), + return CustomScrollView( + slivers: [ + APPSliverAnimatedSwitcher(enable: state._selectedIndex, widgets: { + 0: (context) => _APPSettingView(state), + 1: (context) => EthereumWeb3PermissionView( + key: state.permissionState[1], + permission: state.application + ?.getChainFromNetworkType(NetworkType.ethereum)), + 2: (context) => TronWeb3PermissionView( + key: state.permissionState[2], + permission: + state.application?.getChainFromNetworkType(NetworkType.tron)), + 3: (context) => SolanaWeb3PermissionView( + key: state.permissionState[3], + permission: state.application + ?.getChainFromNetworkType(NetworkType.solana)), + 4: (context) => TonWeb3PermissionView( + key: state.permissionState[4], + permission: + state.application?.getChainFromNetworkType(NetworkType.ton)), + }), + ], ); } } -class _APPPermissionWidget extends StatelessWidget { - const _APPPermissionWidget(this.state, {Key? key}) : super(key: key); +class _APPSettingView extends StatelessWidget { + const _APPSettingView(this.state, {Key? key}) : super(key: key); final __Web3APPPermissionViewState state; - @override Widget build(BuildContext context) { - return SliverMainAxisGroup(slivers: [ - SliverToBoxAdapter( - child: Web3ClientInfoView(permission: state.application!)), - WidgetConstant.sliverPaddingVertial20, - SliverToBoxAdapter( + return SliverToBoxAdapter( + child: Padding( + padding: WidgetConstant.padding20, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Web3ClientInfoView(permission: state.application!), + WidgetConstant.height20, Text("application_name".tr, style: context.textTheme.titleMedium), Text("edit_application_name_desc".tr), WidgetConstant.height8, @@ -219,25 +370,10 @@ class _APPPermissionWidget extends StatelessWidget { maxLine: 3, value: state.active, onChanged: state.onChangeActivation, - ) + ), ], ), ), - WidgetConstant.sliverPaddingVertial20, - APPSliverAnimatedSwitcher(enable: state.chainType, widgets: { - NetworkType.ethereum: (c) => EthereumWeb3PermissionView( - permission: state.application - ?.getChainFromNetworkType(NetworkType.ethereum), - onUpdateChainPermission: state.onUpdateChainPermission), - NetworkType.tron: (c) => TronWeb3PermissionView( - permission: - state.application?.getChainFromNetworkType(NetworkType.tron), - onUpdateChainPermission: state.onUpdateChainPermission), - NetworkType.solana: (c) => SolanaWeb3PermissionView( - permission: - state.application?.getChainFromNetworkType(NetworkType.solana), - onUpdateChainPermission: state.onUpdateChainPermission), - }) - ]); + ); } } diff --git a/mrt_wallet/lib/future/wallet/web3/pages/view_controller.dart b/mrt_wallet/lib/future/wallet/web3/pages/view_controller.dart index 93bb6e79..13ef2260 100644 --- a/mrt_wallet/lib/future/wallet/web3/pages/view_controller.dart +++ b/mrt_wallet/lib/future/wallet/web3/pages/view_controller.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/wallet/global/pages/address_details.dart'; import 'package:mrt_wallet/future/wallet/security/pages/password_checker.dart'; import 'package:mrt_wallet/future/wallet/web3/controller/controller.dart'; @@ -21,11 +22,13 @@ class Web3PageRequestControllerView required this.request, required this.builder, required this.controller, - this.showRequestAccount = true}); + this.showRequestAccount = true, + this.width = APPConst.maxViewWidth}); final Web3PageChainBuilder builder; final T Function() controller; final Web3Request request; final bool showRequestAccount; + final double? width; @override Widget build(BuildContext context) { @@ -35,7 +38,14 @@ class Web3PageRequestControllerView }, child: PasswordCheckerView( appbar: AppBar( - title: Text(request.params.method.name), + title: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(request.params.method.name.tr), + Text(request.params.method.name, + style: context.textTheme.bodySmall), + ], + ), actions: [ Web3PermissionAppbarActionView(request: request), WidgetConstant.width8, @@ -52,10 +62,12 @@ class Web3PageRequestControllerView return Web3PageProgress( key: controller.progressKey, initialStatus: Web3ProgressStatus.progress, - child: (c) => CustomScrollView(slivers: [ + child: (context) => CustomScrollView(slivers: [ SliverConstraintsBoxView( + maxWidth: width, padding: WidgetConstant.paddingHorizontal20, sliver: SliverMainAxisGroup(slivers: [ + WidgetConstant.sliverPaddingVertial20, SliverToBoxAdapter( child: Column( crossAxisAlignment: diff --git a/mrt_wallet/lib/future/wallet/webview/controller/controller/controller.dart b/mrt_wallet/lib/future/wallet/webview/controller/controller/controller.dart index 06576a9a..58c21990 100644 --- a/mrt_wallet/lib/future/wallet/webview/controller/controller/controller.dart +++ b/mrt_wallet/lib/future/wallet/webview/controller/controller/controller.dart @@ -28,7 +28,6 @@ class WebViewStateController extends StateController WebViewListener, WebViewTabImpl { final WalletProvider walletProvider; - // Web3APPAuthentication? _LastApplication; final Cancelable _cancelable = Cancelable(); final _lock = SynchronizedLock(); @override @@ -99,43 +98,48 @@ class WebViewStateController extends StateController Live get web3Status => _web3Status; Future _activeScript(WebViewEvent event) async { return await _lock.synchronized(() async { - _cancelable.cancel(); - final applicationId = - Web3APPAuthentication.toApplicationId(lastEvent?.url); - onCloseClinet(applicationId); - final auth = tabsAuthenticated[event.viewId]; - if (auth == null) return MRTScriptWalletStatus.failed; - final client = await createClientInfos( - clientId: event.viewId, - url: event.url, - title: event.title, - faviIcon: event.favicon); - final tronWeb = await FileUtils.loadAssetText(APPConst.assetsTronWeb); - await _loadScript(viewType: event.viewId, script: tronWeb); - final solanaJs = await FileUtils.loadAssetText(APPConst.bnJs); - await _loadScript(viewType: event.viewId, script: solanaJs); - String script; - if (kDebugMode) { - if (PlatformInterface.appPlatform == AppPlatform.android) { - script = (await HttpUtils.get("http://10.0.2.2:3000/webview")) - .result; + try { + _cancelable.cancel(); + final applicationId = + Web3APPAuthentication.toApplicationId(lastEvent?.url); + onCloseClinet(applicationId); + final auth = tabsAuthenticated[event.viewId]; + if (auth == null) return MRTScriptWalletStatus.failed; + final client = await createClientInfos( + clientId: event.viewId, + url: event.url, + title: event.title, + faviIcon: event.favicon); + final tronWeb = await FileUtils.loadAssetText(APPConst.assetsTronWeb); + await _loadScript(viewType: event.viewId, script: tronWeb); + final solanaJs = await FileUtils.loadAssetText(APPConst.bnJs); + await _loadScript(viewType: event.viewId, script: solanaJs); + String script; + if (kDebugMode) { + if (PlatformInterface.appPlatform == AppPlatform.android) { + script = + (await HttpUtils.get("http://10.0.2.2:3000/webview")) + .result; + } else { + script = + (await HttpUtils.get("http://localhost:3000/webview")) + .result; + } } else { - script = - (await HttpUtils.get("http://localhost:3000/webview")) - .result; + script = await FileUtils.loadAssetText(APPConst.assetWebviewScript); } - } else { - script = await FileUtils.loadAssetText(APPConst.assetWebviewScript); - } - await _loadScript(viewType: event.viewId, script: script); + await _loadScript(viewType: event.viewId, script: script); - final responseEvent = - await getPageAuthenticated(clientId: auth.viewType, info: client); - final result = await _postEvent(responseEvent); - if (result) { - return MRTScriptWalletStatus.active; + final responseEvent = + await getPageAuthenticated(clientId: auth.viewType, info: client); + final result = await _postEvent(responseEvent); + if (result) { + return MRTScriptWalletStatus.active; + } + return MRTScriptWalletStatus.failed; + } catch (e) { + rethrow; } - return MRTScriptWalletStatus.failed; }); } diff --git a/mrt_wallet/lib/future/wallet/webview/controller/controller/tab_handler.dart b/mrt_wallet/lib/future/wallet/webview/controller/controller/tab_handler.dart index 38ecc796..e15f6353 100644 --- a/mrt_wallet/lib/future/wallet/webview/controller/controller/tab_handler.dart +++ b/mrt_wallet/lib/future/wallet/webview/controller/controller/tab_handler.dart @@ -369,14 +369,18 @@ mixin WebViewTabImpl on StateController, CryptoWokerImpl, WebViewListener { _progress.value = null; } - @override - void close() { - super.close(); + void _dipose() async { + liveNotifier.dispose(); + _progress.dispose(); for (final i in tabsAuthenticated.values) { i.dispose(); } - liveNotifier.dispose(); - _progress.dispose(); + } + + @override + void close() { + super.close(); + _dipose(); } @override diff --git a/mrt_wallet/lib/future/wallet/webview/pages/web_view.dart b/mrt_wallet/lib/future/wallet/webview/pages/web_view.dart index 470bcbad..96d219cc 100644 --- a/mrt_wallet/lib/future/wallet/webview/pages/web_view.dart +++ b/mrt_wallet/lib/future/wallet/webview/pages/web_view.dart @@ -75,16 +75,13 @@ class WebView extends StatelessWidget { onPressed: status.inProgress ? null : () { - context.openSliverBottomSheet( - "update_permission" - .tr, - bodyBuilder: (c) => - Web3PermissionUpdateView( - controller: - model, - scrollController: - c), - centerContent: false); + context.openDialogPage( + "update_permission".tr, + fullWidget: + Web3PermissionUpdateView( + controller: + model), + ); }, icon: APPAnimatedSwitcher( enable: status, diff --git a/mrt_wallet/lib/future/wallet/webview/view/native_view.dart b/mrt_wallet/lib/future/wallet/webview/view/native_view.dart index 48420330..c49c8593 100644 --- a/mrt_wallet/lib/future/wallet/webview/view/native_view.dart +++ b/mrt_wallet/lib/future/wallet/webview/view/native_view.dart @@ -24,12 +24,10 @@ class MRTAndroidViewController { {required String viewType, Map createParms = const {}, TextDirection layoutDirection = TextDirection.ltr}) async { - /// platformViewsRegistry.getNextPlatformViewId() final id = Random.secure().nextInt(100) + 50; final node = FocusNode(debugLabel: "MRTAndroidViewController $id"); Object controller; - /// AndroidViewController if (PlatformInterface.appPlatform == AppPlatform.android) { controller = PlatformViewsService.initAndroidView( id: id, @@ -57,12 +55,12 @@ class MRTAndroidViewController { controller: controller, id: id, node: node, viewType: viewType); } - void dispose() { + Future dispose() async { if (PlatformInterface.appPlatform == AppPlatform.android) { - (controller as AndroidViewController).dispose(); + await (controller as AndroidViewController).dispose(); } else { - (controller as UiKitViewController).dispose(); - PlatformInterface.webViewController.dispose(viewType); + await PlatformInterface.webViewController.dispose(viewType); + await (controller as UiKitViewController).dispose(); } node.dispose(); diff --git a/mrt_wallet/lib/future/widgets/widgets/account_token_list_view.dart b/mrt_wallet/lib/future/widgets/widgets/account_token_list_view.dart index 1dbcac91..3f6e9e64 100644 --- a/mrt_wallet/lib/future/widgets/widgets/account_token_list_view.dart +++ b/mrt_wallet/lib/future/widgets/widgets/account_token_list_view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/context.dart'; +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/context.dart'; import 'package:mrt_wallet/wallet/wallet.dart' show TokenCore; import 'assets_image.dart'; import 'container_with_border.dart'; diff --git a/mrt_wallet/lib/future/widgets/widgets/assets_image.dart b/mrt_wallet/lib/future/widgets/widgets/assets_image.dart index c7a66917..3cc1729a 100644 --- a/mrt_wallet/lib/future/widgets/widgets/assets_image.dart +++ b/mrt_wallet/lib/future/widgets/widgets/assets_image.dart @@ -45,8 +45,8 @@ class CircleAPPImageView extends StatelessWidget { return _CircleAPPImageView(radius: radius, onNull: onNull, child: null); } return Image( - height: radius, color: imageColor, + fit: BoxFit.cover, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress != null && onProgress != null) { return onProgress!.call(context); diff --git a/mrt_wallet/lib/future/widgets/widgets/barcode/widgets/barcode_icon.dart b/mrt_wallet/lib/future/widgets/widgets/barcode/widgets/barcode_icon.dart index d7b76d55..04c6513f 100644 --- a/mrt_wallet/lib/future/widgets/widgets/barcode/widgets/barcode_icon.dart +++ b/mrt_wallet/lib/future/widgets/widgets/barcode/widgets/barcode_icon.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/wallet/controller/controller.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class BarcodeScannerIconView extends StatelessWidget { const BarcodeScannerIconView(this.onBarcodeScanned, diff --git a/mrt_wallet/lib/future/widgets/widgets/bottom_sheet.dart b/mrt_wallet/lib/future/widgets/widgets/bottom_sheet.dart index 7d9c53fc..60b6d54e 100644 --- a/mrt_wallet/lib/future/widgets/widgets/bottom_sheet.dart +++ b/mrt_wallet/lib/future/widgets/widgets/bottom_sheet.dart @@ -38,9 +38,9 @@ class _AppBottomSheetState extends State { final DraggableScrollableController controller = DraggableScrollableController(); double appBarAnimationRadius = 25.0; - bool _calculateAppBarRadius(DraggableScrollableNotification v) { - if (v.extent > 0.9) { - final double extent = 1 - v.extent; + bool _calculateAppBarRadius(double v) { + if (v > 0.9) { + final double extent = 1 - v; appBarAnimationRadius = (25 * extent) * 10; if (mounted) setState(() {}); } else if (appBarAnimationRadius < 25) { @@ -63,6 +63,10 @@ class _AppBottomSheetState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); + + if (widget.initiaalExtend != null) { + _calculateAppBarRadius(widget.initiaalExtend!); + } final height = context.mediaQuery.viewInsets.bottom; if (height > 0 && controller.isAttached) { inChangeExtend = true; @@ -102,7 +106,7 @@ class _AppBottomSheetState extends State { if (!inChangeExtend) { context.clearFocus(); } - return _calculateAppBarRadius(v); + return _calculateAppBarRadius(v.extent); }, child: DraggableScrollableSheet( minChildSize: widget.minExtent, diff --git a/mrt_wallet/lib/future/widgets/widgets/constraints_box_view.dart b/mrt_wallet/lib/future/widgets/widgets/constraints_box_view.dart index 5015ea9f..cf4ccf35 100644 --- a/mrt_wallet/lib/future/widgets/widgets/constraints_box_view.dart +++ b/mrt_wallet/lib/future/widgets/widgets/constraints_box_view.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/widgets/sliver/sliver.dart'; class ConstraintsBoxView extends StatelessWidget { @@ -37,14 +38,14 @@ class SliverConstraintsBoxView extends StatelessWidget { super.key, this.padding = EdgeInsets.zero, this.alignment = 0}); - final double maxWidth; + final double? maxWidth; final EdgeInsets padding; final double alignment; @override Widget build(BuildContext context) { return SliverCrossAxisConstrained( alignment: alignment, - maxCrossAxisExtent: maxWidth, + maxCrossAxisExtent: maxWidth ?? context.mediaQuery.size.width, child: SliverPadding(padding: padding, sliver: sliver), ); } diff --git a/mrt_wallet/lib/future/widgets/widgets/container_with_border.dart b/mrt_wallet/lib/future/widgets/widgets/container_with_border.dart index 2131fef0..30a80e0e 100644 --- a/mrt_wallet/lib/future/widgets/widgets/container_with_border.dart +++ b/mrt_wallet/lib/future/widgets/widgets/container_with_border.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/context.dart' +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/context.dart' show QuickContextAccsess; import 'package:mrt_wallet/app/models/models/typedef.dart'; diff --git a/mrt_wallet/lib/future/widgets/widgets/copy_icon_widget.dart b/mrt_wallet/lib/future/widgets/widgets/copy_icon_widget.dart index b7c0d8fd..45cebfd0 100644 --- a/mrt_wallet/lib/future/widgets/widgets/copy_icon_widget.dart +++ b/mrt_wallet/lib/future/widgets/widgets/copy_icon_widget.dart @@ -16,7 +16,7 @@ class CopyTextIcon extends StatefulWidget { this.size, this.messaage, this.color, - this.isSensitive =false}); + this.isSensitive = false}); final String dataToCopy; final double? size; final String? messaage; diff --git a/mrt_wallet/lib/future/widgets/widgets/custom_spinner.dart b/mrt_wallet/lib/future/widgets/widgets/custom_spinner.dart index 50767f0c..a632fbe1 100644 --- a/mrt_wallet/lib/future/widgets/widgets/custom_spinner.dart +++ b/mrt_wallet/lib/future/widgets/widgets/custom_spinner.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'dart:math'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class DotsPainter extends CustomPainter { final double progress; diff --git a/mrt_wallet/lib/future/widgets/widgets/drop_down_button.dart b/mrt_wallet/lib/future/widgets/widgets/drop_down_button.dart index 697502a0..0fb19be6 100644 --- a/mrt_wallet/lib/future/widgets/widgets/drop_down_button.dart +++ b/mrt_wallet/lib/future/widgets/widgets/drop_down_button.dart @@ -6,7 +6,7 @@ class AppDropDownBottom extends StatelessWidget { const AppDropDownBottom( {super.key, required this.items, - required this.label, + this.label, this.itemBuilder, this.value, this.onChanged, @@ -14,17 +14,21 @@ class AppDropDownBottom extends StatelessWidget { this.icon, this.error, this.suffixIcon, - this.isExpanded = false}); + this.isExpanded = false, + this.focusColor, + this.fillColor}); final Map items; final Map? itemBuilder; final FuncVoidNullT? onChanged; final NullStringT? validator; - final String label; + final String? label; final Widget? icon; final String? error; final T? value; final Widget? suffixIcon; final bool isExpanded; + final Color? focusColor; + final Color? fillColor; @override Widget build(BuildContext context) { @@ -45,10 +49,16 @@ class AppDropDownBottom extends StatelessWidget { onChanged: onChanged, validator: validator, isExpanded: isExpanded, + value: value, + focusColor: focusColor, + + // focusColor: context.colors.transparent, decoration: InputDecoration( + focusColor: focusColor, labelText: label, errorText: error, + fillColor: fillColor, errorMaxLines: 3, suffixIcon: suffixIcon), ); diff --git a/mrt_wallet/lib/future/widgets/widgets/empty_sliver_widget.dart b/mrt_wallet/lib/future/widgets/widgets/empty_sliver_widget.dart index 70f3cc40..6304a505 100644 --- a/mrt_wallet/lib/future/widgets/widgets/empty_sliver_widget.dart +++ b/mrt_wallet/lib/future/widgets/widgets/empty_sliver_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart' show APPConst; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/widgets/animated/animation.dart'; import 'widget_constant.dart'; diff --git a/mrt_wallet/lib/future/widgets/widgets/error_text_container.dart b/mrt_wallet/lib/future/widgets/widgets/error_text_container.dart index 982fd92e..704895e9 100644 --- a/mrt_wallet/lib/future/widgets/widgets/error_text_container.dart +++ b/mrt_wallet/lib/future/widgets/widgets/error_text_container.dart @@ -4,7 +4,7 @@ import 'package:mrt_wallet/app/models/models/typedef.dart' show DynamicVoid; import 'package:mrt_wallet/wallet/wallet.dart' show BalanceCore, Token; import 'container_with_border.dart'; import 'widget_constant.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class ErrorTextContainer extends StatelessWidget { const ErrorTextContainer( diff --git a/mrt_wallet/lib/future/widgets/widgets/launch_icon.dart b/mrt_wallet/lib/future/widgets/widgets/launch_icon.dart index a0fe76b0..71f8d31c 100644 --- a/mrt_wallet/lib/future/widgets/widgets/launch_icon.dart +++ b/mrt_wallet/lib/future/widgets/widgets/launch_icon.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart' show UriUtils; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class LaunchBrowserIcon extends StatelessWidget { const LaunchBrowserIcon({required this.url, this.color, Key? key, this.size}) diff --git a/mrt_wallet/lib/future/widgets/widgets/list_tile.dart b/mrt_wallet/lib/future/widgets/widgets/list_tile.dart index 8e8bfb94..5e86baa5 100644 --- a/mrt_wallet/lib/future/widgets/widgets/list_tile.dart +++ b/mrt_wallet/lib/future/widgets/widgets/list_tile.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/context.dart' +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/context.dart' show QuickContextAccsess; import 'package:mrt_wallet/app/models/models/typedef.dart' show DynamicVoid, NullBoolVoid; +import 'package:mrt_wallet/future/widgets/widgets/widget_constant.dart'; class AppListTile extends StatelessWidget { const AppListTile( @@ -60,7 +61,7 @@ class AppCheckListTile extends StatelessWidget { const AppCheckListTile( {Key? key, this.onChanged, - this.value, + required this.value, this.title, this.subtitle, this.contentPadding, @@ -68,7 +69,7 @@ class AppCheckListTile extends StatelessWidget { : super(key: key); final int? maxLine; final NullBoolVoid? onChanged; - final bool? value; + final bool value; final Widget? title; final Widget? subtitle; final EdgeInsets? contentPadding; @@ -169,3 +170,30 @@ class AppSwitchListTile extends StatelessWidget { ); } } + +class APPExpansionListTime extends StatelessWidget { + const APPExpansionListTime( + {required this.title, + this.subtitle, + this.trailing, + this.children = const [], + Key? key}) + : super(key: key); + final Widget title; + final Widget? subtitle; + final Widget? trailing; + final List children; + @override + Widget build(BuildContext context) { + return ExpansionTile( + shape: RoundedRectangleBorder(borderRadius: WidgetConstant.border8), + collapsedShape: + RoundedRectangleBorder(borderRadius: WidgetConstant.border8), + backgroundColor: context.colors.primaryContainer, + collapsedBackgroundColor: context.colors.primaryContainer, + title: title, + subtitle: subtitle, + trailing: trailing, + children: children); + } +} diff --git a/mrt_wallet/lib/future/widgets/widgets/material_page.dart b/mrt_wallet/lib/future/widgets/widgets/material_page.dart index 337d0261..603f4406 100644 --- a/mrt_wallet/lib/future/widgets/widgets/material_page.dart +++ b/mrt_wallet/lib/future/widgets/widgets/material_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/context.dart' +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/context.dart' show QuickContextAccsess; class MaterialPageView extends StatelessWidget { diff --git a/mrt_wallet/lib/future/widgets/widgets/number_field.dart b/mrt_wallet/lib/future/widgets/widgets/number_field.dart index 3d11f2cb..896ec0d4 100644 --- a/mrt_wallet/lib/future/widgets/widgets/number_field.dart +++ b/mrt_wallet/lib/future/widgets/widgets/number_field.dart @@ -115,6 +115,10 @@ class NumberTextFieldState extends State with SafeState { controller.text = "$newIndex"; } + void setValue(int newIndex) { + controller.text = "$newIndex"; + } + int? getValue() { return int.tryParse(controller.text); } diff --git a/mrt_wallet/lib/future/widgets/widgets/page_title_subtitle.dart b/mrt_wallet/lib/future/widgets/widgets/page_title_subtitle.dart index c971aa96..9eaf5df3 100644 --- a/mrt_wallet/lib/future/widgets/widgets/page_title_subtitle.dart +++ b/mrt_wallet/lib/future/widgets/widgets/page_title_subtitle.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/app_extentions/context.dart'; +import 'package:mrt_wallet/future/state_managment/extension/app_extensions/context.dart'; import 'widget_constant.dart'; class PageTitleSubtitle extends StatelessWidget { @@ -20,10 +20,7 @@ class PageTitleSubtitle extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (title != null) - Text( - title ?? "", - style: titleStyle ?? context.textTheme.titleLarge, - ), + Text(title ?? "", style: titleStyle ?? context.textTheme.titleLarge), Padding( padding: title == null ? EdgeInsets.zero : WidgetConstant.padding10, child: Column( diff --git a/mrt_wallet/lib/future/widgets/widgets/secure_content_view.dart b/mrt_wallet/lib/future/widgets/widgets/secure_content_view.dart index 582350ee..c6780e80 100644 --- a/mrt_wallet/lib/future/widgets/widgets/secure_content_view.dart +++ b/mrt_wallet/lib/future/widgets/widgets/secure_content_view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/app/models/models/typedef.dart' show DynamicVoid; import 'animated/widgets/animated_switcher.dart'; import 'container_with_border.dart'; diff --git a/mrt_wallet/lib/future/widgets/widgets/selectable_widget.dart b/mrt_wallet/lib/future/widgets/widgets/selectable_widget.dart index 546e31df..64aa97c8 100644 --- a/mrt_wallet/lib/future/widgets/widgets/selectable_widget.dart +++ b/mrt_wallet/lib/future/widgets/widgets/selectable_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class SelectableView extends StatelessWidget { const SelectableView({super.key, this.text}); diff --git a/mrt_wallet/lib/future/widgets/widgets/status_icon_widget.dart b/mrt_wallet/lib/future/widgets/widgets/status_icon_widget.dart index 653e3cf9..ad58a060 100644 --- a/mrt_wallet/lib/future/widgets/widgets/status_icon_widget.dart +++ b/mrt_wallet/lib/future/widgets/widgets/status_icon_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/widgets/widgets/progress_bar/widgets/stream_bottun.dart'; import 'package:mrt_wallet/future/widgets/widgets/widget_constant.dart'; diff --git a/mrt_wallet/lib/future/widgets/widgets/text_and_link.dart b/mrt_wallet/lib/future/widgets/widgets/text_and_link.dart index 391aa266..3e87dd9d 100644 --- a/mrt_wallet/lib/future/widgets/widgets/text_and_link.dart +++ b/mrt_wallet/lib/future/widgets/widgets/text_and_link.dart @@ -1,7 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:mrt_wallet/app/core.dart' show UriUtils; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; import 'package:mrt_wallet/future/constant/constant.dart'; class TextAndLinkView extends StatelessWidget { diff --git a/mrt_wallet/lib/future/widgets/widgets/view_padding.dart b/mrt_wallet/lib/future/widgets/widgets/view_padding.dart index 49716ded..0d4c94b4 100644 --- a/mrt_wallet/lib/future/widgets/widgets/view_padding.dart +++ b/mrt_wallet/lib/future/widgets/widgets/view_padding.dart @@ -1,5 +1,5 @@ import 'package:flutter/widgets.dart'; -import 'package:mrt_wallet/future/state_managment/extention/extention.dart'; +import 'package:mrt_wallet/future/state_managment/extension/extension.dart'; class ViewPadding extends StatelessWidget { const ViewPadding({required this.child, this.padding, super.key}); diff --git a/mrt_wallet/lib/future/widgets/widgets/widget_constant.dart b/mrt_wallet/lib/future/widgets/widgets/widget_constant.dart index 62a088d7..57889cba 100644 --- a/mrt_wallet/lib/future/widgets/widgets/widget_constant.dart +++ b/mrt_wallet/lib/future/widgets/widgets/widget_constant.dart @@ -7,6 +7,7 @@ class WidgetConstant { static const Widget height5 = SizedBox(height: 5); static const Widget width8 = SizedBox(width: 8); static const Widget height20 = SizedBox(height: 20); + static const Widget height40 = SizedBox(height: 40); static const Widget height15 = SizedBox(height: 15); static const ScrollPhysics noScrollPhysics = NeverScrollableScrollPhysics(); static const EdgeInsets padding5 = EdgeInsets.all(5); diff --git a/mrt_wallet/lib/main.dart b/mrt_wallet/lib/main.dart index 65b26dcd..b0b250b5 100644 --- a/mrt_wallet/lib/main.dart +++ b/mrt_wallet/lib/main.dart @@ -9,8 +9,6 @@ import 'package:mrt_wallet/future/future.dart'; import 'package:mrt_wallet/future/router/page_router.dart'; import 'package:mrt_wallet/future/state_managment/state_managment.dart'; -import 'dart:ui' as ui; - class MyHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { @@ -22,7 +20,7 @@ class MyHttpOverrides extends HttpOverrides { void main() async { runZonedGuarded(run, (error, stack) { - WalletLogging.log("zone error: $error"); + WalletLogging.log("zone error: $error $stack"); }); } @@ -32,11 +30,6 @@ void run() async { if (PlatformInterface.appPlatform.isDesktop) { await PlatformInterface.instance.desktop.init(); await PlatformInterface.instance.desktop.waitUntilReadyToShow(); - final pixelRatio = - ui.PlatformDispatcher.instance.views.first.devicePixelRatio; - await PlatformInterface.instance.desktop.setBounds( - pixelRatio: pixelRatio, - size: const WidgetSize(width: 500, height: 700)); await PlatformInterface.instance.desktop.setMaximumSize(const WidgetSize( width: APPConst.desktopAppWidth, height: APPConst.desktopAppHeight)); } diff --git a/mrt_wallet/lib/wallet/api/client/networks/solana/solana.dart b/mrt_wallet/lib/wallet/api/client/networks/solana/solana.dart index ec4f0f6d..e598322d 100644 --- a/mrt_wallet/lib/wallet/api/client/networks/solana/solana.dart +++ b/mrt_wallet/lib/wallet/api/client/networks/solana/solana.dart @@ -19,11 +19,13 @@ class SolanaClient extends NetworkClient { provider.rpc as BaseServiceProtocol; @override - Future updateBalance(ISolanaAddress account) async { + Future updateBalance(ISolanaAddress account, + {bool updateTokens = true}) async { final accountInfo = await getAccountInfo(account.networkAddress); - if (accountInfo == null) return; - account.address.updateBalance(accountInfo.lamports); - await updateAccounts(account); + account.address.updateBalance(accountInfo?.lamports); + if (updateTokens) { + await updateAccounts(account); + } } Future getAccountInfo(SolAddress account) async { @@ -47,6 +49,7 @@ class SolanaClient extends NetworkClient { Future simulate( {required SolanaTransaction transaction, + SolAddress? account, bool replaceRecentBlockhash = true, bool sigVerify = false}) async { return await provider.request( @@ -55,7 +58,12 @@ class SolanaClient extends NetworkClient { encoding: TransactionSerializeEncoding.base64), sigVerify: sigVerify, replaceRecentBlockhash: replaceRecentBlockhash, - encoding: SolanaRPCEncoding.base64), + encoding: SolanaRPCEncoding.base64, + commitment: Commitment.processed, + accounts: account == null + ? null + : RPCAccountConfig( + addresses: [account], encoding: SolanaRPCEncoding.base64)), ); } diff --git a/mrt_wallet/lib/wallet/api/client/networks/ton/client/ton.dart b/mrt_wallet/lib/wallet/api/client/networks/ton/client/ton.dart index 760918d0..7216ff53 100644 --- a/mrt_wallet/lib/wallet/api/client/networks/ton/client/ton.dart +++ b/mrt_wallet/lib/wallet/api/client/networks/ton/client/ton.dart @@ -1,15 +1,12 @@ +import 'package:blockchain_utils/exception/rpc_error.dart'; import 'package:blockchain_utils/utils/utils.dart'; -import 'package:mrt_wallet/app/utils/http/utils.dart'; -import 'package:mrt_wallet/app/utils/method/utiils.dart'; +import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/wallet/api/client/core/client.dart'; import 'package:mrt_wallet/wallet/api/client/networks/ton/methods/methods.dart'; import 'package:mrt_wallet/wallet/api/provider/networks/ton.dart'; import 'package:mrt_wallet/wallet/api/services/service.dart'; -import 'package:mrt_wallet/wallet/models/chain/address/networks/ton/ton.dart'; -import 'package:mrt_wallet/wallet/models/networks/networks.dart'; -import 'package:mrt_wallet/wallet/models/network/network.dart'; -import 'package:mrt_wallet/wallet/models/token/chains_tokens/jetton.dart'; -import 'package:mrt_wallet/wallet/models/token/token/token.dart'; +import 'package:mrt_wallet/wallet/models/models.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/params.dart'; import 'package:ton_dart/ton_dart.dart'; class TonClient extends NetworkClient { @@ -27,6 +24,7 @@ class TonClient extends NetworkClient { Future updateBalance(ITonAddress account) async { final balance = await provider.request( TonRquestGetBalance(address: account.networkAddress, api: apiType)); + account.address.updateBalance(balance); updateJettonsBalances(account.tokens); } @@ -37,22 +35,45 @@ class TonClient extends NetworkClient { } } + Future getStaticState(TonAddress address) async { + if (provider.isTonCenter) { + final state = await provider + .request(TonCenterGetAddressInformation(address.toString())); + return AccountStateResponse( + balance: state.balance, + code: TonHelper.tryToCell(state.code), + data: TonHelper.tryToCell(state.data), + state: state.state); + } + try { + final state = await provider + .request(TonApiGetBlockchainRawAccount(address.toString())); + return AccountStateResponse( + balance: state.balance, + code: TonHelper.tryToCell(state.code), + data: TonHelper.tryToCell(state.data), + state: state.status); + } on RPCError catch (e) { + if (e.message == ApiProviderConst.tonApiNotiFoundError) { + return AccountStateResponse( + balance: BigInt.zero, + code: null, + data: null, + state: AccountStatusResponse.uninit); + } + + rethrow; + } + } + Future updateJettonBalance(TonJettonToken jetton) async { final result = await MethodUtils.call( - () async => getJettonBalance(jetton.walletAddress)); + () async => await getJettonWalletData(jetton.walletAddress)); if (result.hasResult) { - jetton.updateBalance(result.result); + jetton.updateBalance(result.result.balance); } } - Future getJettonBalance(TonAddress walletAddress) async { - final data = - await getStateStack(method: "get_wallet_data", address: walletAddress); - final reader = data.reader(); - final balance = reader.readBigNumber(); - return balance; - } - Future getMsgFrowardPricesConfing( {bool isMasterChain = true}) async { return await provider.request(TonRquestGetMsgForwardPricesConfig(apiType, @@ -73,8 +94,7 @@ class TonClient extends NetworkClient { api: apiType)); } - Future sendMessage(Message exMessage) async { - final boc = beginCell().store(exMessage).endCell(); + Future sendMessage({required Cell boc}) async { if (provider.isTonCenter) { await provider.request(TonCenterSendBocReturnHash(boc.toBase64())); } else { @@ -84,6 +104,20 @@ class TonClient extends NetworkClient { return StringUtils.decode(boc.hash(), type: StringEncoding.base64); } + Future getJettonWalletAddress( + {required TonAddress minterAddress, required TonAddress owner}) async { + final data = await getStateStack( + address: minterAddress, + method: "get_wallet_address", + stack: [ + if (provider.isTonCenter) + ["tvm.Slice", beginCell().storeAddress(owner).endCell().toBase64()] + else + owner.toString() + ]); + return data.reader().readAddress(); + } + Future> _getTonCenterAccountJettons( TonAddress address) async { assert(provider.isTonCenter, "incorrect provider."); @@ -111,6 +145,98 @@ class TonClient extends NetworkClient { return jettons.toList(); } + Future getJettonWalletData( + TonAddress jettonWalletAddress) async { + final data = await getStateStack( + method: "get_wallet_data", address: jettonWalletAddress); + return JettonWalletState.fromTuple(data.reader()); + } + + Future getWeb3TransactionMessageInfo( + {required ITonAddress address, + required TheOpenNetworkChain account, + required Web3TonTransactionMessage message}) async { + final destination = + account.getReceiptAddress(message.address.toFriendlyAddress()) ?? + ReceiptAddress( + view: message.address.toFriendlyAddress(), + networkAddress: message.address); + final StateInit? init = message.stateInit == null + ? null + : StateInit.deserialize(message.stateInit!.beginParse()); + if (message.payload == null) { + return TonWeb3TransactionMessageInfo( + amount: message.amount, destination: destination, initState: init); + } + final info = TonWeb3TransactionPayload.fromPayload( + payload: message.payload!, destination: message.address); + switch (info.type) { + case TonWeb3TransactionPayloadType.transfer: + case TonWeb3TransactionPayloadType.jetton: + break; + default: + return TonWeb3TransactionMessageInfo( + amount: message.amount, + destination: destination, + payload: info, + initState: init); + } + + final jettonInfo = await MethodUtils.call(() async { + final tokenInfo = await getJettonWalletData(message.address); + + TonJettonToken? jetton = address.tokens + .firstWhereOrNull((e) => e.walletAddress == message.address); + jetton?.minterAddress; + bool? isAccountJetton = jetton == null ? null : true; + if (jetton == null) { + jetton ??= await getJettonInfo(TonAccountJettonResponse( + tokenAddress: tokenInfo.minterAddress, + balance: BigInt.zero, + owner: address.networkAddress, + jettonWalletAddress: message.address)); + final jettonWalletAddress = await MethodUtils.call(() async => + await getJettonWalletAddress( + minterAddress: jetton!.minterAddress, + owner: address.networkAddress)); + if (jettonWalletAddress.hasResult && + jettonWalletAddress.result == message.address) { + isAccountJetton = true; + } + } + updateJettonBalance(jetton); + return (jetton, isAccountJetton); + }); + if (jettonInfo.hasError) { + return TonWeb3TransactionMessageInfo( + amount: message.amount, + destination: destination, + initState: init, + payload: info); + } + final contractInfo = info as ContractTonTransactionPayload; + BigInt? transfer; + if (info.type == TonWeb3TransactionPayloadType.transfer) { + transfer = info.jettonAmount; + } + TonWeb3TransactionPayload payload = JettonContractTonTransactionPayload( + payload: info.payload, + content: contractInfo.contentJson, + token: jettonInfo.result.$1, + isAccountJetton: jettonInfo.result.$2, + transferAmount: transfer, + type: transfer != null + ? TonWeb3TransactionPayloadType.transfer + : TonWeb3TransactionPayloadType.jetton, + operation: info.operation, + tonAmount: info.tonAmount); + return TonWeb3TransactionMessageInfo( + amount: message.amount, + destination: destination, + initState: init, + payload: payload); + } + Future getStateStack( {required String method, required TonAddress address, @@ -155,32 +281,21 @@ class TonClient extends NetworkClient { }).toList(); } - Future getJettonData(TonAddress jettonAddress, + Future getJettonData(TonAddress jettonAddress, {Duration timeout = const Duration(seconds: 10)}) async { - try { - final data = await getStateStack( - method: "get_jetton_data", address: jettonAddress, timeout: timeout); - final reader = data.reader(); - final item = reader.pop(); - final BigInt totalSupply; - if (item.type == TupleItemTypes.intItem) { - totalSupply = (item as TupleItemInt).value; - } else { - totalSupply = reader.readBigNumber(); - } - final bool mintable = reader.readBoolean(); - final TonAddress? admin = reader.readAddressOpt(); - final Cell content = reader.readCell(); - final Cell walletCode = reader.readCell(); - return JettonDataResponse( - totalSupply: totalSupply, - mintable: mintable, - admin: admin, - content: content, - walletCode: walletCode); - } catch (e) { - rethrow; - } + final data = await getStateStack( + method: "get_jetton_data", address: jettonAddress, timeout: timeout); + return MinterWalletState.fromTupple(data.reader()); + } + + final Map _contractsCode = {}; + + Future getContractCode(TonAddress address) async { + if (_contractsCode.containsKey(address)) return _contractsCode[address]; + final state = await getStaticState(address); + if (state.code == null) return null; + _contractsCode[address] = state.code!; + return state.code!; } Future getJettonInfo(TonAccountJettonResponse jetton, @@ -196,7 +311,7 @@ class TonClient extends NetworkClient { minterAddress: jetton.tokenAddress, verified: false, walletAddress: jetton.jettonWalletAddress); - if (metdata == null) { + if (metdata.type == TokenContentType.unknown) { return noneVerifiedToken; } String? url; @@ -210,7 +325,7 @@ class TonClient extends NetworkClient { type = TokenContentType.offchain; break; case TokenContentType.onchain: - onChainMetadata = metdata as JettonOnChainMetadata; + onChainMetadata = metdata.cast(); break; } diff --git a/mrt_wallet/lib/wallet/api/services/impl/http/http.dart b/mrt_wallet/lib/wallet/api/services/impl/http/http.dart index e1b15856..d4038fb5 100644 --- a/mrt_wallet/lib/wallet/api/services/impl/http/http.dart +++ b/mrt_wallet/lib/wallet/api/services/impl/http/http.dart @@ -22,7 +22,7 @@ abstract class HTTPService

Future _callSynchronized(Future Function() t, {List allowStatus = const [200]}) async { if (requestTimeout == null) { - return _onException(t, allowStatus: allowStatus); + return _onException(t, allowStatus: allowStatus); } await _lock.synchronized(() async { await Future.delayed(requestTimeout!); @@ -48,7 +48,7 @@ abstract class HTTPService

Map? headers}) async { T? response; try { - response = await _callSynchronized(() async { + response = await _callSynchronized(() async { return await client .post(_toUri(url), headers: { @@ -60,7 +60,6 @@ abstract class HTTPService

body: params) .timeout(timeout ?? defaultTimeOut); }, allowStatus: allowStatus); - return response!; } on ApiProviderException catch (e) { tracker.addRequest( @@ -92,7 +91,6 @@ abstract class HTTPService

}) .timeout(timeout ?? defaultTimeOut); }, allowStatus: allowStatus); - return response!; } on ApiProviderException catch (e) { tracker.addRequest(ApiRequest(uri: url, params: null, error: e)); diff --git a/mrt_wallet/lib/wallet/constant/networks/ton.dart b/mrt_wallet/lib/wallet/constant/networks/ton.dart index de6d3820..b6c6105e 100644 --- a/mrt_wallet/lib/wallet/constant/networks/ton.dart +++ b/mrt_wallet/lib/wallet/constant/networks/ton.dart @@ -1,3 +1,4 @@ +import 'package:blockchain_utils/utils/binary/binary_operation.dart'; import 'package:blockchain_utils/utils/numbers/rational/big_rational.dart'; import 'global.dart'; @@ -7,6 +8,9 @@ class TonConst { static const int maxTonMnemonicWords = 48; static const int defaultTonMnemonicWordsLength = 24; static const int deciaml = 9; - + static const int mainnetWokchainId = 0; static final BigRational maxTransferQueryId = BlockchainConst.maxSupply; + static const int maximumSubWalletId = mask32 - 1; + static const int maximumWalletId = (1 << 31) - 1; + static const int maximumV5SubWalletId = (1 << 15) - 1; } diff --git a/mrt_wallet/lib/wallet/constant/tags/constant.dart b/mrt_wallet/lib/wallet/constant/tags/constant.dart index 7940f0df..c2de792f 100644 --- a/mrt_wallet/lib/wallet/constant/tags/constant.dart +++ b/mrt_wallet/lib/wallet/constant/tags/constant.dart @@ -68,6 +68,10 @@ class CborTagsConst { /// static const List tonAccount = [200, 199]; + static const List tonAddressLegacy = [200, 199, 0]; + static const List tonAddressSubWallet = [200, 199, 1]; + static const List tonAddressV5 = [200, 199, 2]; + static const List tonAddressV5SubWallet = [200, 199, 3]; static const List substrateAccount = [200, 200]; @@ -147,6 +151,8 @@ class CborTagsConst { static const List web3App = [161, 0, 0]; static const List web3EthereumAccount = [161, 1, 1]; static const List web3TronAccount = [161, 2, 1]; + static const List web3SolanaAccount = [161, 2, 2]; + static const List web3TonAccount = [161, 2, 3]; /// address params static const List bitcoinCashNewAddressParams = [12, 0]; diff --git a/mrt_wallet/lib/wallet/models/chain/address/creation_params/networks/ton.dart b/mrt_wallet/lib/wallet/models/chain/address/creation_params/networks/ton.dart index b69e952b..7ed42691 100644 --- a/mrt_wallet/lib/wallet/models/chain/address/creation_params/networks/ton.dart +++ b/mrt_wallet/lib/wallet/models/chain/address/creation_params/networks/ton.dart @@ -2,11 +2,11 @@ import 'package:blockchain_utils/bip/bip/bip.dart'; import 'package:blockchain_utils/cbor/cbor.dart'; import 'package:mrt_wallet/app/serialization/serialization.dart'; import 'package:mrt_wallet/crypto/coins/coins.dart'; -import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; import 'package:mrt_wallet/crypto/derivation/derivation.dart'; import 'package:mrt_wallet/wallet/models/chain/address/networks/ton/ton.dart'; import 'package:mrt_wallet/wallet/models/chain/address/creation_params/new_address.dart'; import 'package:mrt_wallet/wallet/models/network/network.dart'; +import 'package:mrt_wallet/wallet/models/networks/networks.dart'; import 'package:ton_dart/ton_dart.dart'; class TonNewAddressParams implements NewAccountParams { @@ -14,19 +14,12 @@ class TonNewAddressParams implements NewAccountParams { bool get isMultiSig => false; @override final CryptoCoins coin; - final WalletVersion version; - final int? subWalletId; + final TonAccountContext context; @override final AddressDerivationIndex deriveIndex; - final bool bouncable; - const TonNewAddressParams( - {required this.deriveIndex, - required this.version, - required this.bouncable, - required this.coin, - this.subWalletId}); + {required this.deriveIndex, required this.coin, required this.context}); factory TonNewAddressParams.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -38,20 +31,15 @@ class TonNewAddressParams implements NewAccountParams { return TonNewAddressParams( deriveIndex: AddressDerivationIndex.fromCborBytesOrObject( obj: values.getCborTag(0)), - version: WalletVersion.fromValue(values.elementAt(1)), - subWalletId: values.elementAt(2), - bouncable: values.elementAt(3), - coin: CustomCoins.getSerializationCoin(values.elementAt(4)), + context: TonAccountContext.deserialize( + object: values.elemetAs(1)), + coin: CustomCoins.getSerializationCoin(values.elementAt(2)), ); } - TonAddress toAddress({required List publicKey, required int workChain}) { - final wallet = TonUtils.fromVersion( - publicKey: publicKey, - workChain: workChain, - version: version, - subWalletId: subWalletId, - bouncable: bouncable); + TonAddress toAddress( + {required List publicKey, required TonChain chain}) { + final wallet = context.toWalletContract(publicKey: publicKey, chain: chain); return wallet.address; } @@ -66,13 +54,8 @@ class TonNewAddressParams implements NewAccountParams { @override CborTagValue toCbor() { return CborTagValue( - CborListValue.fixedLength([ - deriveIndex.toCbor(), - version.name, - subWalletId, - bouncable, - coin.toCbor() - ]), + CborListValue.fixedLength( + [deriveIndex.toCbor(), context.toCbor(), coin.toCbor()]), type.tag); } diff --git a/mrt_wallet/lib/wallet/models/chain/address/networks/ton/ton.dart b/mrt_wallet/lib/wallet/models/chain/address/networks/ton/ton.dart index 77ff262d..15cb13bc 100644 --- a/mrt_wallet/lib/wallet/models/chain/address/networks/ton/ton.dart +++ b/mrt_wallet/lib/wallet/models/chain/address/networks/ton/ton.dart @@ -1,5 +1,6 @@ import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/wallet/models/networks/ton/ton.dart'; import 'package:mrt_wallet/wallet/models/token/token.dart'; import 'package:mrt_wallet/wallet/models/nfts/core/core.dart'; import 'package:mrt_wallet/crypto/derivation/derivation.dart'; @@ -8,7 +9,6 @@ import 'package:mrt_wallet/wallet/models/chain/address/core/address.dart'; import 'package:mrt_wallet/wallet/models/balance/balance.dart'; import 'package:mrt_wallet/wallet/models/network/network.dart'; import 'package:mrt_wallet/wallet/constant/tags/constant.dart'; -import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; import 'package:ton_dart/ton_dart.dart'; import 'package:mrt_wallet/wallet/models/chain/address/creation_params/new_address.dart'; @@ -22,11 +22,9 @@ class ITonAddress extends ChainAccount required this.address, required this.network, required this.networkAddress, - required this.subWalletId, - required this.version, + required this.context, required List> tokens, required List nfts, - required this.bouncable, String? accountName, }) : publicKey = List.unmodifiable(publicKey), _tokens = List.unmodifiable(tokens), @@ -38,10 +36,10 @@ class ITonAddress extends ChainAccount required List publicKey, required WalletTonNetwork network}) { final tonAddress = accountParams.toAddress( - publicKey: publicKey, workChain: network.coinParam.workchain); + publicKey: publicKey, chain: network.coinParam.chainType); final addressDetauls = AccountBalance( - address: - tonAddress.toFriendlyAddress(bounceable: accountParams.bouncable), + address: tonAddress.toFriendlyAddress( + bounceable: accountParams.context.bouncable), balance: IntegerBalance.zero(network.coinParam.decimal)); return ITonAddress._( coin: accountParams.coin, @@ -50,11 +48,9 @@ class ITonAddress extends ChainAccount keyIndex: accountParams.deriveIndex, networkAddress: tonAddress, network: network.value, - version: accountParams.version, - subWalletId: accountParams.subWalletId, + context: accountParams.context, tokens: const [], - nfts: const [], - bouncable: accountParams.bouncable); + nfts: const []); } factory ITonAddress.fromCbsorHex(String hex, WalletNetwork network) { return ITonAddress.fromCborBytesOrObject(network, @@ -79,12 +75,25 @@ class ITonAddress extends ChainAccount if (networkId != network.value) { throw WalletExceptionConst.incorrectNetwork; } - final WalletVersion version = WalletVersion.fromValue(cbor.elementAt(7)); - final int? subWalletId = cbor.elementAt(8); + TonAccountContext context; + final String? version = cbor.elemetAs(7); + final int? subWalletId = cbor.elemetAs(8); final List tokens = (cbor.elementAt>(9)) .map((e) => TonJettonToken.fromCborBytesOrObject(obj: e)) .toList(); final String? accountName = cbor.elementAt(11); + final bool? bouncable = cbor.elemetAs(12); + final CborTagValue? contextObject = cbor.elemetAs(13); + if (contextObject != null) { + context = TonAccountContext.deserialize(object: contextObject); + } else if (version != null && bouncable != null) { + context = TonAccountContext.merge( + version: WalletVersion.fromValue(version), + bouncable: bouncable, + subwalletId: subWalletId); + } else { + throw WalletExceptionConst.invalidAccountDetails; + } return ITonAddress._( coin: coin, @@ -96,9 +105,7 @@ class ITonAddress extends ChainAccount tokens: tokens, nfts: [], accountName: accountName, - version: version, - subWalletId: subWalletId, - bouncable: cbor.elementAt(12)); + context: context); } @override @@ -106,8 +113,7 @@ class ITonAddress extends ChainAccount return address.toAddress; } - final WalletVersion version; - final int? subWalletId; + final TonAccountContext context; @override final AccountBalance address; @@ -123,7 +129,7 @@ class ITonAddress extends ChainAccount final List publicKey; - final bool bouncable; + // final bool bouncable; @override CborTagValue toCbor() { @@ -136,26 +142,28 @@ class ITonAddress extends ChainAccount address.toCbor(), networkAddress.toFriendlyAddress(), network, - CborStringValue(version.name), - subWalletId ?? const CborNullValue(), + const CborNullValue(), + const CborNullValue(), CborListValue.fixedLength(_tokens.map((e) => e.toCbor()).toList()), CborListValue.fixedLength(_nfts.map((e) => e.toCbor()).toList()), accountName ?? const CborNullValue(), - bouncable + const CborNullValue(), + context.toCbor() ]), CborTagsConst.tonAccount); } @override List get variabels { - return [keyIndex, network]; + return [keyIndex, network, context]; } @override final TonAddress networkAddress; @override - late final String? type = "${networkAddress.type.name} (${version.name})"; + late final String? type = + "${networkAddress.type.name} (${context.version.name})"; List _tokens; @override @@ -209,32 +217,23 @@ class ITonAddress extends ChainAccount @override late final String orginalAddress = networkAddress.toRawAddress(); - // @override - // List get keyIndexes => [keyIndex]; - WalletContract toWalletContract() { - return TonUtils.fromVersion( + VersionedWalletContract toWalletContract() { + return context.toWalletContract( publicKey: publicKey, - workChain: networkAddress.workChain, - version: version, - subWalletId: subWalletId, - bouncable: bouncable); + chain: TonChain.fromWorkchain(networkAddress.workChain)); } @override bool isEqual(ChainAccount other) { if (other is! ITonAddress) return false; - return bouncable == other.bouncable && + return context == other.context && BytesUtils.bytesEqual(other.networkAddress.hash, networkAddress.hash); } @override TonNewAddressParams toAccountParams() { return TonNewAddressParams( - deriveIndex: keyIndex, - coin: coin, - version: version, - bouncable: bouncable, - subWalletId: subWalletId); + deriveIndex: keyIndex, coin: coin, context: context); } } diff --git a/mrt_wallet/lib/wallet/models/chain/chain/core/chain.dart b/mrt_wallet/lib/wallet/models/chain/chain/core/chain.dart index 04fd29f7..a9af3886 100644 --- a/mrt_wallet/lib/wallet/models/chain/chain/core/chain.dart +++ b/mrt_wallet/lib/wallet/models/chain/chain/core/chain.dart @@ -130,7 +130,7 @@ abstract class Chain< client: APIUtils.createApiClient(network), id: id); case NetworkType.ton: - return TonChain.setup( + return TheOpenNetworkChain.setup( network: network.toNetwork(), client: APIUtils.createApiClient(network), id: id); @@ -190,7 +190,7 @@ abstract class Chain< client: APIUtils.createApiClient(network, service: provider)); break; case NetworkType.ton: - chain = TonChain.deserialize( + chain = TheOpenNetworkChain.deserialize( network: network.toNetwork(), cbor: values, id: id, diff --git a/mrt_wallet/lib/wallet/models/chain/chain/neworks/ton.dart b/mrt_wallet/lib/wallet/models/chain/chain/neworks/ton.dart index 400ad002..f69c506b 100644 --- a/mrt_wallet/lib/wallet/models/chain/chain/neworks/ton.dart +++ b/mrt_wallet/lib/wallet/models/chain/chain/neworks/ton.dart @@ -1,8 +1,15 @@ part of 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; -class TonChain extends Chain { - TonChain._( +class TheOpenNetworkChain extends Chain< + TonAPIProvider, + TonNetworkParams, + TonAddress, + TonJettonToken, + NFTCore, + ITonAddress, + WalletTonNetwork, + TonClient> { + TheOpenNetworkChain._( {required super.network, required super.totalBalance, required super.addressIndex, @@ -12,7 +19,7 @@ class TonChain extends Chain? totalBalance, List? addresses, @@ -21,7 +28,7 @@ class TonChain extends Chain { final int workchain; - + ton.TonChain get chainType => ton.TonChain.fromWorkchain(workchain); TonNetworkParams( {required super.transactionExplorer, required super.addressExplorer, diff --git a/mrt_wallet/lib/wallet/models/networks/solana/models/web3_transaction_info.dart b/mrt_wallet/lib/wallet/models/networks/solana/models/web3_transaction_info.dart index caeaa60a..83e4aace 100644 --- a/mrt_wallet/lib/wallet/models/networks/solana/models/web3_transaction_info.dart +++ b/mrt_wallet/lib/wallet/models/networks/solana/models/web3_transaction_info.dart @@ -8,19 +8,43 @@ import 'package:on_chain/solana/src/borsh_serialization/program_layout.dart'; class SolanaWeb3TransactionInstructionInfo { final ProgramLayout layout; + final List accounts; final SolAddress programAddress; final Map? content; SolanaWeb3TransactionInstructionInfo( {required this.layout, required this.programAddress, + required List accounts, Map? content}) - : content = content?.imutable; + : content = content?.imutable, + accounts = accounts.imutable; +} + +class SolanaAccountStatus { + final AccountMeta account; + final List status; + SolanaAccountStatus._({required this.account, required List status}) + : status = status.imutable; + factory SolanaAccountStatus(AccountMeta account) { + List status = []; + if (account.isSigner) { + status.add("signer"); + } + if (account.isWritable) { + status.add("writable"); + } + if (status.isEmpty) { + status.add("read_only"); + } + return SolanaAccountStatus._(account: account, status: status); + } } class SolanaWeb3TransactionInfo { - final SolanaTransaction transaction; - final IntegerBalance value; + SolanaTransaction _transaction; + SolanaTransaction get transaction => _transaction; + final IntegerBalance accountChange; final SolAddress feePayer; final ISolanaAddress signer; final List instructions; @@ -31,6 +55,7 @@ class SolanaWeb3TransactionInfo { SolanaWeb3FeeStatus get feeStatus => _feeStatus; late final SimulateTranasctionResponse _simulate; SimulateTranasctionResponse get simulateInfo => _simulate; + bool get canUpdateBlockHash => _transaction.signers.length == 1; final IntegerBalance fee = IntegerBalance.zero(SolanaConst.decimal); @@ -72,14 +97,26 @@ class SolanaWeb3TransactionInfo { } } + void updateTransaction(SolanaTransaction transaction) { + if (transaction.signers.length != 1) return; + final signer = transaction.signers[0]; + if (this.signer.networkAddress != signer) return; + if (!CompareUtils.iterableIsEqual(transaction.message.compiledInstructions, + this.transaction.message.compiledInstructions)) { + return; + } + _transaction = transaction; + } + SolanaWeb3TransactionInfo._({ - required this.transaction, - required this.value, + required SolanaTransaction transaction, + required this.accountChange, required this.feePayer, required List instructions, required this.signer, required this.id, - }) : instructions = instructions.imutable; + }) : instructions = instructions.imutable, + _transaction = transaction; factory SolanaWeb3TransactionInfo( {required SolanaTransaction transaction, required ISolanaAddress signer, @@ -91,15 +128,24 @@ class SolanaWeb3TransactionInfo { final layout = ProgramLayout.fromBytes( programId: programId, instructionBytes: i.data); final content = layout.toJson(); + final accountKeys = List.generate(i.accounts.length, (e) { + final int index = i.accounts[e]; + final account = transaction.message.accountKeys.elementAt(index); + final isWritable = transaction.message.isAccountWritable(index); + final isSigner = transaction.message.isAccountSigner(index); + return SolanaAccountStatus(AccountMeta( + publicKey: account, isSigner: isSigner, isWritable: isWritable)); + }); final instructionInfo = SolanaWeb3TransactionInstructionInfo( layout: layout, programAddress: programId, - content: content.isEmpty ? null : content); + content: content.isEmpty ? null : content, + accounts: accountKeys); instructions.add(instructionInfo); } return SolanaWeb3TransactionInfo._( transaction: transaction, - value: IntegerBalance.zero(SolanaUtils.decimal), + accountChange: IntegerBalance.zero(SolanaUtils.decimal), feePayer: accounts[0], instructions: instructions, signer: signer, @@ -124,6 +170,7 @@ enum SolanaWeb3SimulationStatus { bool get canRetry => this == idle || this == error; bool get isError => this == error; + bool get isSuccess => this == success; bool get isPending => this == pending; bool get hasSimulateError => this == error || this == simulateError; } diff --git a/mrt_wallet/lib/wallet/models/networks/ton/models/account_context.dart b/mrt_wallet/lib/wallet/models/networks/ton/models/account_context.dart new file mode 100644 index 00000000..69eae353 --- /dev/null +++ b/mrt_wallet/lib/wallet/models/networks/ton/models/account_context.dart @@ -0,0 +1,363 @@ +import 'package:blockchain_utils/blockchain_utils.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/wallet/constant/tags/constant.dart'; +import 'package:ton_dart/ton_dart.dart'; + +enum TonAccountContextType { + legacy(CborTagsConst.tonAddressLegacy), + subwallet(CborTagsConst.tonAddressSubWallet), + v5(CborTagsConst.tonAddressV5), + v5SubWallet(CborTagsConst.tonAddressV5SubWallet); + + final List tag; + const TonAccountContextType(this.tag); + static TonAccountContextType fromTag(List? tag) { + return values.firstWhere((e) => BytesUtils.bytesEqual(e.tag, tag), + orElse: () => throw WalletExceptionConst.invalidAccountDetails); + } +} + +abstract class TonAccountContext with CborSerializable, Equatable { + final TonAccountContextType type; + final WalletVersion version; + final bool bouncable; + const TonAccountContext( + {required this.type, required this.version, required this.bouncable}); + VersionedWalletContract toWalletContract( + {required List publicKey, required TonChain chain}); + Cell buildTransaction( + {required List actions, + required VersionedWalletState state, + required int seqno, + required TonChain chain, + int? timeOut}) { + return TonSerializationUtils.serializeMessage( + actions: actions, state: state, seqno: seqno, timeOut: timeOut); + } + + Message toExternalMessage( + {required Cell message, + required List signature, + required TonAddress destination, + StateInit? state}) { + final body = beginCell() + .storeBuffer(signature) + .storeSlice(message.beginParse()) + .endCell(); + return Message( + init: state, + info: CommonMessageInfoExternalIn( + dest: destination, importFee: BigInt.zero), + body: body); + } + + factory TonAccountContext.deserialize( + {List? bytes, String? hex, CborObject? object}) { + final CborTagValue decode = + CborSerializable.decode(cborBytes: bytes, hex: hex, object: object); + final type = TonAccountContextType.fromTag(decode.tags); + final list = decode.getList; + final WalletVersion version = + WalletVersion.fromValue(list.elemetAs(0)); + final bool bouncable = list.elementAt(1); + switch (type) { + case TonAccountContextType.legacy: + return TonAccountLegacyContext(version: version, bouncable: bouncable); + case TonAccountContextType.subwallet: + return TonAccountSubWalletContext( + version: version, + bouncable: bouncable, + subwalletId: list.elemetAs(2)); + case TonAccountContextType.v5: + return TonAccountV5CustomContext( + version: version, + bouncable: bouncable, + contextId: list.elemetAs(2)); + case TonAccountContextType.v5SubWallet: + return TonAccountV5SubWalletContext( + version: version, + bouncable: bouncable, + subwalletId: list.elemetAs(2)); + default: + throw WalletExceptionConst.invalidAccountDetails; + } + } + factory TonAccountContext.merge( + {required WalletVersion version, + required bool bouncable, + int? subwalletId}) { + switch (version) { + case WalletVersion.v1R1: + case WalletVersion.v1R2: + case WalletVersion.v1R3: + case WalletVersion.v2R1: + case WalletVersion.v2R2: + if (subwalletId == null) { + return TonAccountLegacyContext( + version: version, bouncable: bouncable); + } + break; + case WalletVersion.v3R1: + case WalletVersion.v3R2: + case WalletVersion.v4: + if (subwalletId != null) { + return TonAccountSubWalletContext( + subwalletId: subwalletId, version: version, bouncable: bouncable); + } + break; + default: + break; + } + throw WalletExceptionConst.invalidAccountDetails; + } +} + +class TonAccountLegacyContext extends TonAccountContext { + TonAccountLegacyContext._( + {required WalletVersion version, required bool bouncable}) + : super( + type: TonAccountContextType.legacy, + version: version, + bouncable: bouncable); + factory TonAccountLegacyContext( + {required WalletVersion version, required bool bouncable}) { + if (version.version > 2) { + throw WalletExceptionConst.invalidAccountDetails; + } + return TonAccountLegacyContext._(version: version, bouncable: bouncable); + } + + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([ + version.name, + bouncable, + ]), + type.tag); + } + + @override + VersionedWalletContract> + toWalletContract( + {required List publicKey, required TonChain chain}) { + return switch (version) { + WalletVersion.v1R1 => WalletV1R1.create( + chain: chain, publicKey: publicKey, bounceableAddress: bouncable), + WalletVersion.v1R2 => WalletV1R2.create( + chain: chain, publicKey: publicKey, bounceableAddress: bouncable), + WalletVersion.v1R3 => WalletV1R3.create( + chain: chain, publicKey: publicKey, bounceableAddress: bouncable), + WalletVersion.v2R1 => WalletV2R1.create( + chain: chain, publicKey: publicKey, bounceableAddress: bouncable), + WalletVersion.v2R2 => WalletV2R2.create( + chain: chain, publicKey: publicKey, bounceableAddress: bouncable), + _ => throw WalletExceptionConst.invalidAccountDetails + }; + } + + @override + List get variabels => [version.name]; +} + +class TonAccountSubWalletContext extends TonAccountContext { + final int subwalletId; + const TonAccountSubWalletContext._( + {required WalletVersion version, + required this.subwalletId, + required bool bouncable}) + : super( + type: TonAccountContextType.subwallet, + version: version, + bouncable: bouncable); + + factory TonAccountSubWalletContext( + {required WalletVersion version, + required int subwalletId, + required bool bouncable}) { + if (version.version < 3 || version.version > 4) { + throw WalletExceptionConst.invalidAccountDetails; + } + return TonAccountSubWalletContext._( + version: version, subwalletId: subwalletId, bouncable: bouncable); + } + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([version.name, bouncable, subwalletId]), + type.tag); + } + + @override + VersionedWalletContract> + toWalletContract( + {required List publicKey, required TonChain chain}) { + return switch (version) { + WalletVersion.v3R1 => WalletV3R1.create( + chain: chain, + publicKey: publicKey, + bounceableAddress: bouncable, + subWalletId: subwalletId), + WalletVersion.v3R2 => WalletV3R2.create( + chain: chain, + publicKey: publicKey, + bounceableAddress: bouncable, + subWalletId: subwalletId), + WalletVersion.v4 => WalletV4.create( + chain: chain, + publicKey: publicKey, + bounceableAddress: bouncable, + subWalletId: subwalletId), + _ => throw WalletExceptionConst.invalidAccountDetails + }; + } + + @override + List get variabels => [version.name, subwalletId]; +} + +class TonAccountV5CustomContext extends TonAccountContext { + final int walletId; + const TonAccountV5CustomContext._( + {required this.walletId, required bool bouncable}) + : super( + type: TonAccountContextType.v5, + version: WalletVersion.v5R1, + bouncable: bouncable); + factory TonAccountV5CustomContext( + {required WalletVersion version, + required int contextId, + required bool bouncable}) { + if (version != WalletVersion.v5R1) { + throw WalletExceptionConst.invalidAccountDetails; + } + return TonAccountV5CustomContext._( + bouncable: bouncable, walletId: contextId); + } + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([version.name, bouncable, walletId]), + type.tag); + } + + @override + WalletV5R1 toWalletContract( + {required List publicKey, required TonChain chain}) { + return WalletV5R1.create( + chain: chain, + publicKey: publicKey, + bounceableAddress: bouncable, + context: V5R1CustomContext(context: walletId, chain: chain)); + } + + @override + Cell buildTransaction( + {required List actions, + required VersionedWalletState state, + required int seqno, + required TonChain chain, + int? timeOut}) { + return TonSerializationUtils.sseralizeV5( + accountSeqno: seqno, + actions: OutActionsV5(actions: actions), + type: WalletV5AuthType.external, + timeout: timeOut, + context: V5R1CustomContext(context: walletId, chain: chain)); + } + + @override + Message toExternalMessage( + {required Cell message, + required List signature, + required TonAddress destination, + StateInit? state}) { + final body = beginCell() + .storeSlice(message.beginParse()) + .storeBuffer(signature) + .endCell(); + return Message( + init: state, + info: CommonMessageInfoExternalIn( + dest: destination, importFee: BigInt.zero), + body: body); + } + + @override + List get variabels => [version.name, walletId]; +} + +class TonAccountV5SubWalletContext extends TonAccountContext { + final int subwalletId; + const TonAccountV5SubWalletContext._( + {required this.subwalletId, required bool bouncable}) + : super( + type: TonAccountContextType.v5SubWallet, + version: WalletVersion.v5R1, + bouncable: bouncable); + + factory TonAccountV5SubWalletContext( + {required WalletVersion version, + required int subwalletId, + required bool bouncable}) { + if (version != WalletVersion.v5R1) { + throw WalletExceptionConst.invalidAccountDetails; + } + return TonAccountV5SubWalletContext._( + subwalletId: subwalletId, bouncable: bouncable); + } + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([version.name, bouncable, subwalletId]), + type.tag); + } + + @override + WalletV5R1 toWalletContract( + {required List publicKey, required TonChain chain}) { + return WalletV5R1.create( + chain: chain, + publicKey: publicKey, + bounceableAddress: bouncable, + context: V5R1ClientContext(subwalletNumber: subwalletId, chain: chain)); + } + + @override + Cell buildTransaction({ + required List actions, + required VersionedWalletState state, + required int seqno, + required TonChain chain, + int? timeOut, + }) { + return TonSerializationUtils.sseralizeV5( + accountSeqno: seqno, + actions: OutActionsV5(actions: actions), + type: WalletV5AuthType.external, + timeout: timeOut, + context: V5R1ClientContext(subwalletNumber: subwalletId, chain: chain)); + } + + @override + Message toExternalMessage( + {required Cell message, + required List signature, + required TonAddress destination, + StateInit? state}) { + final body = beginCell() + .storeSlice(message.beginParse()) + .storeBuffer(signature) + .endCell(); + return Message( + init: state, + info: CommonMessageInfoExternalIn( + dest: destination, importFee: BigInt.zero), + body: body); + } + + @override + List get variabels => [version.name, subwalletId]; +} diff --git a/mrt_wallet/lib/wallet/models/networks/ton/models/chain_id.dart b/mrt_wallet/lib/wallet/models/networks/ton/models/chain_id.dart new file mode 100644 index 00000000..d0944914 --- /dev/null +++ b/mrt_wallet/lib/wallet/models/networks/ton/models/chain_id.dart @@ -0,0 +1,15 @@ +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; + +enum TonChainId { + mainnet(value: '-239', workchain: 0), + testnet(value: '-3', workchain: -1); + + final String value; + final int workchain; + + const TonChainId({required this.value, required this.workchain}); + static TonChainId fromNetworkId(int id) { + return values.firstWhere((e) => e.workchain == id, + orElse: () => throw Web3RequestExceptionConst.invalidNetwork); + } +} diff --git a/mrt_wallet/lib/wallet/models/networks/ton/models/message_body_type.dart b/mrt_wallet/lib/wallet/models/networks/ton/models/message_body_type.dart deleted file mode 100644 index 594151cd..00000000 --- a/mrt_wallet/lib/wallet/models/networks/ton/models/message_body_type.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; -import 'package:mrt_wallet/app/utils/string/utils.dart'; -import 'package:ton_dart/ton_dart.dart'; - -enum TonMessageBodyType { - comment._("comment"), - binaryComment._("binary_comment"), - cell._("cell"), - none._("none"); - - final String name; - const TonMessageBodyType._(this.name); - String get helperText { - switch (this) { - case TonMessageBodyType.comment: - return "enter_comment_as_string_or_hex"; - case TonMessageBodyType.binaryComment: - return "enter_binary_message_as_hex"; - case TonMessageBodyType.cell: - return "enter_cell_as_hex_or_base64"; - default: - return ""; - } - } - - bool isValid(String? v) { - switch (this) { - case TonMessageBodyType.binaryComment: - return StrUtils.isHex(v); - case TonMessageBodyType.comment: - return v?.isNotEmpty ?? false; - case TonMessageBodyType.cell: - return TonUtils.isValidCell(v); - default: - return false; - } - } - - Cell? toValue(String value) { - switch (this) { - case TonMessageBodyType.binaryComment: - return TonUtils.toBinaryCommetBody(value); - case TonMessageBodyType.comment: - return TonUtils.toComment(value); - case TonMessageBodyType.cell: - return TonUtils.toCell(value); - default: - return null; - } - } - - bool get hasBody => this != TonMessageBodyType.none; -} diff --git a/mrt_wallet/lib/wallet/models/networks/ton/models/transaction_output.dart b/mrt_wallet/lib/wallet/models/networks/ton/models/transaction_output.dart index c27247f7..532af64c 100644 --- a/mrt_wallet/lib/wallet/models/networks/ton/models/transaction_output.dart +++ b/mrt_wallet/lib/wallet/models/networks/ton/models/transaction_output.dart @@ -5,7 +5,6 @@ import 'package:mrt_wallet/wallet/models/network/network.dart'; import 'package:mrt_wallet/wallet/models/token/chains_tokens/jetton.dart'; import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; import 'package:ton_dart/ton_dart.dart'; -import 'message_body_type.dart'; class TonOutputWithBalance { TonOutputWithBalance({ @@ -93,7 +92,7 @@ class TonOutputWithBalance { payload: payload, queryId: queryId); } - return TransactioUtils.internal( + return TonHelper.internal( destination: address.networkAddress, amount: balance.balance, bounce: bounce, diff --git a/mrt_wallet/lib/wallet/models/networks/ton/models/web3_transaction_info.dart b/mrt_wallet/lib/wallet/models/networks/ton/models/web3_transaction_info.dart new file mode 100644 index 00000000..1a0ac4e8 --- /dev/null +++ b/mrt_wallet/lib/wallet/models/networks/ton/models/web3_transaction_info.dart @@ -0,0 +1,385 @@ +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/crypto/utils/ton/ton.dart'; +import 'package:mrt_wallet/wallet/constant/networks/ton.dart'; +import 'package:mrt_wallet/wallet/models/balance/integer/integer.dart'; +import 'package:mrt_wallet/wallet/models/others/others.dart'; +import 'package:mrt_wallet/wallet/models/token/token.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class _TonWeb3TransactionPayloadConst { + static const String payloadKey = "payload"; + static const String operationKey = "operation"; + static const String commentKey = "comment"; +} + +enum TonWeb3TransactionPayloadType { + unknown, + jetton, + minter, + nft, + transfer, + comment, + binaryComment, + encryptedMessage, + walletV5; + + /// 0x2167da4b + bool get isUnknown => this == unknown; + bool get isCommet => + this == comment || this == binaryComment || this == encryptedMessage; + static TonWeb3TransactionPayloadType? fromCommentType( + TonMessageBodyType? type) { + assert(type != TonMessageBodyType.none, "invalid comment type."); + return switch (type) { + TonMessageBodyType.binaryComment => + TonWeb3TransactionPayloadType.binaryComment, + TonMessageBodyType.comment => TonWeb3TransactionPayloadType.comment, + TonMessageBodyType.encryptedMessage => + TonWeb3TransactionPayloadType.encryptedMessage, + _ => null + }; + } +} + +abstract class TonWeb3TransactionPayload { + final Cell payload; + final String base64; + final Map contentJson; + final BigInt tonAmount; + abstract final TonWeb3TransactionPayloadType type; + TonWeb3TransactionPayload( + {required this.payload, + required Map contentJson, + BigInt? tonAmount}) + : contentJson = contentJson.imutable, + base64 = payload.toBase64(), + tonAmount = tonAmount ?? BigInt.zero; + static TonWeb3TransactionPayload fromPayload( + {required Cell payload, required TonAddress destination, Cell? code}) { + final slice = payload.beginParse(); + final comment = TonUtils.deserializeComment(slice); + final type = TonWeb3TransactionPayloadType.fromCommentType(comment?.$1); + if (type != null) { + return CommentTonTransactionPayload( + payload: payload, type: type, content: comment!.$2); + } + if (code != null) { + if (code == JettonMinterConst.code(destination.workChain)) { + final jettonMinter = MethodUtils.nullOnException( + () => JettonMinterOperation.deserialize(slice)); + if (jettonMinter != null) { + return ContractTonTransactionPayload( + payload: payload, + content: jettonMinter.toJson(), + type: TonWeb3TransactionPayloadType.minter, + operation: jettonMinter.type.name); + } + } else if (code == JettonMinterConst.stableCode(destination.workChain)) { + final stableJettonMinter = MethodUtils.nullOnException( + () => StableJettonMinterOperation.deserialize(slice)); + if (stableJettonMinter != null) { + return ContractTonTransactionPayload( + payload: payload, + content: stableJettonMinter.toJson(), + type: TonWeb3TransactionPayloadType.minter, + operation: stableJettonMinter.type.name); + } + } else if (code == JettonWalletConst.stableCode(destination.workChain)) { + final stableJettonWallet = MethodUtils.nullOnException( + () => StableJettonWalletOperation.deserialize(slice)); + if (stableJettonWallet != null) { + BigInt? jettonAmount; + if (stableJettonWallet.type == + StableJettonWalletOperationType.transfer) { + jettonAmount = stableJettonWallet + .cast() + .jettonAmount; + } + return ContractTonTransactionPayload( + payload: payload, + content: stableJettonWallet.toJson(), + type: stableJettonWallet.type == + StableJettonWalletOperationType.transfer + ? TonWeb3TransactionPayloadType.transfer + : TonWeb3TransactionPayloadType.jetton, + jettonAmount: jettonAmount, + operation: stableJettonWallet.type.name); + } + } else if (code == JettonWalletConst.code(destination.workChain)) { + final jettonWallet = MethodUtils.nullOnException(() { + return JettonWalletOperation.deserialize(slice); + }); + if (jettonWallet != null) { + BigInt? jettonAmount; + if (jettonWallet.type == JettonWalletOperationType.transfer) { + jettonAmount = jettonWallet.cast().amount; + } + return ContractTonTransactionPayload( + payload: payload, + content: jettonWallet.toJson(), + type: jettonWallet.type == JettonWalletOperationType.transfer + ? TonWeb3TransactionPayloadType.transfer + : TonWeb3TransactionPayloadType.jetton, + operation: jettonWallet.type.name, + jettonAmount: jettonAmount); + } + } else if (code == TonNftConst.nftCollectionCode(destination.workChain) || + code == + TonNftConst.nftEditableCollectionCode(destination.workChain)) { + final nftCollection = MethodUtils.nullOnException( + () => NFTCollectionOperation.deserialize(slice)); + if (nftCollection != null) { + return ContractTonTransactionPayload( + payload: payload, + content: nftCollection.toJson(), + type: TonWeb3TransactionPayloadType.nft, + operation: nftCollection.type.name); + } + } else if (code == TonNftConst.nftItemCode(destination.workChain)) { + final nftItem = MethodUtils.nullOnException( + () => NFTItemOperation.deserialize(slice)); + if (nftItem != null) { + return ContractTonTransactionPayload( + payload: payload, + content: nftItem.toJson(), + type: TonWeb3TransactionPayloadType.nft, + operation: nftItem.type.name); + } + } + } + slice.reset(); + final walletV5 = MethodUtils.nullOnException(() => + VersionedWalletV5Operaion.deserialize( + slice: slice, + chain: TonChain.fromWorkchain(destination.workChain))); + if (walletV5 != null) { + BigInt tonAmount = BigInt.zero; + if (walletV5.type == VersionedWalletV5OperaionType.internal) { + final internalMessage = walletV5 as VersionedWalletV5Internal; + final sendMessageActions = + internalMessage.message.actions.whereType(); + tonAmount = sendMessageActions.fold(BigInt.zero, (p, c) { + if (c.outMessage.info.type == CommonMessageInfoRelaxedType.internal) { + final internalRelaxed = + c.outMessage.info.cast(); + return p + internalRelaxed.value.coins; + } + return p + BigInt.zero; + }); + } + return ContractTonTransactionPayload( + payload: payload, + content: walletV5.toJson(), + type: TonWeb3TransactionPayloadType.walletV5, + operation: walletV5.type.name, + tonAmount: tonAmount); + } + slice.reset(); + final jettonWallet = MethodUtils.nullOnException(() { + return JettonWalletOperation.deserialize(slice); + }); + if (jettonWallet != null) { + BigInt? jettonAmount; + if (jettonWallet.type == JettonWalletOperationType.transfer) { + jettonAmount = jettonWallet.cast().amount; + } + return ContractTonTransactionPayload( + payload: payload, + content: jettonWallet.toJson(), + jettonAmount: jettonAmount, + type: jettonWallet.type == JettonWalletOperationType.transfer + ? TonWeb3TransactionPayloadType.transfer + : TonWeb3TransactionPayloadType.jetton, + operation: jettonWallet.type.name); + } + slice.reset(); + final stableJettonWallet = MethodUtils.nullOnException( + () => StableJettonWalletOperation.deserialize(slice)); + if (stableJettonWallet != null) { + BigInt? jettonAmount; + if (stableJettonWallet.type == StableJettonWalletOperationType.transfer) { + jettonAmount = + stableJettonWallet.cast().jettonAmount; + } + return ContractTonTransactionPayload( + payload: payload, + content: stableJettonWallet.toJson(), + jettonAmount: jettonAmount, + type: stableJettonWallet.type == + StableJettonWalletOperationType.transfer + ? TonWeb3TransactionPayloadType.transfer + : TonWeb3TransactionPayloadType.jetton, + operation: stableJettonWallet.type.name); + } + slice.reset(); + final jettonMinter = MethodUtils.nullOnException( + () => JettonMinterOperation.deserialize(slice)); + if (jettonMinter != null) { + return ContractTonTransactionPayload( + payload: payload, + content: jettonMinter.toJson(), + type: TonWeb3TransactionPayloadType.minter, + operation: jettonMinter.type.name); + } + slice.reset(); + final stableJettonMinter = MethodUtils.nullOnException( + () => StableJettonMinterOperation.deserialize(slice)); + if (stableJettonMinter != null) { + return ContractTonTransactionPayload( + payload: payload, + content: stableJettonMinter.toJson(), + type: TonWeb3TransactionPayloadType.minter, + operation: stableJettonMinter.type.name); + } + slice.reset(); + final nftCollection = MethodUtils.nullOnException( + () => NFTCollectionOperation.deserialize(slice)); + if (nftCollection != null) { + return ContractTonTransactionPayload( + payload: payload, + content: nftCollection.toJson(), + type: TonWeb3TransactionPayloadType.nft, + operation: nftCollection.type.name); + } + slice.reset(); + final nftItem = + MethodUtils.nullOnException(() => NFTItemOperation.deserialize(slice)); + if (nftItem != null) { + return ContractTonTransactionPayload( + payload: payload, + content: nftItem.toJson(), + type: TonWeb3TransactionPayloadType.nft, + operation: nftItem.type.name); + } + return UnknownTonTransactionPayload(payload: payload); + } + + T cast() { + return this as T; + } +} + +class UnknownTonTransactionPayload extends TonWeb3TransactionPayload { + UnknownTonTransactionPayload({required super.payload}) + : super(contentJson: { + _TonWeb3TransactionPayloadConst.payloadKey: payload.toBase64() + }); + + @override + TonWeb3TransactionPayloadType get type => + TonWeb3TransactionPayloadType.unknown; +} + +class CommentTonTransactionPayload extends TonWeb3TransactionPayload { + CommentTonTransactionPayload( + {required super.payload, required this.type, required String content}) + : assert(type.isCommet, "Invalid comment type. ${type.name}"), + super(contentJson: { + _TonWeb3TransactionPayloadConst.payloadKey: payload.toBase64(), + _TonWeb3TransactionPayloadConst.commentKey: content + }); + + @override + TonWeb3TransactionPayloadType type; +} + +class ContractTonTransactionPayload extends TonWeb3TransactionPayload { + ContractTonTransactionPayload( + {required super.payload, + required Map content, + required this.type, + required this.operation, + this.jettonAmount, + BigInt? tonAmount}) + : super(contentJson: { + _TonWeb3TransactionPayloadConst.payloadKey: payload.toBase64(), + _TonWeb3TransactionPayloadConst.operationKey: operation, + ...content + }, tonAmount: tonAmount); + final BigInt? jettonAmount; + + // Map content; + final String operation; + @override + final TonWeb3TransactionPayloadType type; +} + +class JettonContractTonTransactionPayload extends TonWeb3TransactionPayload { + JettonContractTonTransactionPayload( + {required super.payload, + required this.token, + required this.type, + required this.operation, + required Map content, + required BigInt? transferAmount, + required BigInt? tonAmount, + required this.isAccountJetton}) + : assert( + type == TonWeb3TransactionPayloadType.jetton || + type == TonWeb3TransactionPayloadType.transfer, + "Invalid type. ${type.name}"), + amount = transferAmount == null + ? null + : IntegerBalance(transferAmount, token.token.decimal!), + super(contentJson: { + _TonWeb3TransactionPayloadConst.payloadKey: payload.toBase64(), + _TonWeb3TransactionPayloadConst.operationKey: operation, + ...content + }, tonAmount: tonAmount); + + final IntegerBalance? amount; + final String operation; + @override + final TonWeb3TransactionPayloadType type; + final TonJettonToken token; + final bool? isAccountJetton; +} + +class TonWeb3TransactionMessageInfo { + final IntegerBalance amount; + final ReceiptAddress destination; + final TonWeb3TransactionPayload? payload; + final String? initState; + + const TonWeb3TransactionMessageInfo._( + {required this.amount, + required this.destination, + this.payload, + this.initState}); + factory TonWeb3TransactionMessageInfo( + {required BigInt amount, + required ReceiptAddress destination, + TonWeb3TransactionPayload? payload, + StateInit? initState}) { + return TonWeb3TransactionMessageInfo._( + amount: IntegerBalance(amount, TonConst.deciaml), + destination: destination, + initState: initState?.serialize().toBase64(), + payload: payload); + } + + MessageRelaxed toMessage() { + return TonHelper.internal( + destination: destination.networkAddress, + amount: amount.balance, + body: payload?.payload, + initState: initState == null + ? null + : StateInit.deserialize(Cell.fromBase64(initState!).beginParse()), + bounce: destination.networkAddress.isBounceable, + ); + } +} + +class TonWeb3TransactionInfo { + final List messages; + TonWeb3TransactionInfo( + {required List messages}) + : messages = messages.imutable; +} + +extension MessageRelaxedContent on MessageRelaxed { + Map toJson() { + return {}; + } +} diff --git a/mrt_wallet/lib/wallet/models/networks/ton/ton.dart b/mrt_wallet/lib/wallet/models/networks/ton/ton.dart index d3d0e393..23d3e0dd 100644 --- a/mrt_wallet/lib/wallet/models/networks/ton/ton.dart +++ b/mrt_wallet/lib/wallet/models/networks/ton/ton.dart @@ -1,4 +1,5 @@ export 'models/transaction_output.dart'; export 'models/ton_transaction_fee.dart'; -export 'models/message_body_type.dart'; export 'models/jettons.dart'; +export 'models/web3_transaction_info.dart'; +export 'models/account_context.dart'; diff --git a/mrt_wallet/lib/wallet/models/networks/tron/models/account_resource_info.dart b/mrt_wallet/lib/wallet/models/networks/tron/models/account_resource_info.dart index fb4bb103..29b0eefb 100644 --- a/mrt_wallet/lib/wallet/models/networks/tron/models/account_resource_info.dart +++ b/mrt_wallet/lib/wallet/models/networks/tron/models/account_resource_info.dart @@ -51,6 +51,8 @@ class TronAccountResourceInfo with CborSerializable { int get howManyVote => tronPowerLimit - tronPowerUsed; BigInt get howManyBandwIth => totalBandWith - totalBandWithUsed; + /// {freeNetLimit: 600, assetNetUsed: [{key: 1001470, value: 0}], assetNetLimit: [{key: 1001470, value: 0}], TotalNetLimit: 43200000000, TotalNetWeight: 84045925899, TotalEnergyLimit: 50000000000000, TotalEnergyWeight: 564732458708} + /// {freeNetUsed: 265, freeNetLimit: 600, assetNetUsed: [{key: 1001470, value: 0}], assetNetLimit: [{key: 1001470, value: 0}], TotalNetLimit: 43200000000, TotalNetWeight: 84045925899, TotalEnergyLimit: 50000000000000, TotalEnergyWeight: 564732458708} TronAccountResourceInfo({ required this.freeNetUsed, required this.freeNetLimit, diff --git a/mrt_wallet/lib/wallet/models/networks/tron/models/tron_fee.dart b/mrt_wallet/lib/wallet/models/networks/tron/models/tron_fee.dart index 94558246..37c1ae25 100644 --- a/mrt_wallet/lib/wallet/models/networks/tron/models/tron_fee.dart +++ b/mrt_wallet/lib/wallet/models/networks/tron/models/tron_fee.dart @@ -102,7 +102,7 @@ class TronFee { } BigInt consumedBandwidth = bandWidth; - if (resource.howManyBandwIth > bandWidth) { + if (resource.howManyBandwIth > bandWidth && signature == 1) { bandWidth = BigInt.zero; } final totalBandWidth = bandWidth; diff --git a/mrt_wallet/lib/wallet/provider/controller/networks/ethereum_web3.dart b/mrt_wallet/lib/wallet/provider/controller/networks/ethereum.dart similarity index 85% rename from mrt_wallet/lib/wallet/provider/controller/networks/ethereum_web3.dart rename to mrt_wallet/lib/wallet/provider/controller/networks/ethereum.dart index b5e3f875..68e494ff 100644 --- a/mrt_wallet/lib/wallet/provider/controller/networks/ethereum_web3.dart +++ b/mrt_wallet/lib/wallet/provider/controller/networks/ethereum.dart @@ -15,9 +15,8 @@ mixin Web3EthereumImpl on WalletManager { } await _getWalletOwnerResult(request); Web3EthereumChain? permission = request.currentPermission; - permission ??= Web3EthereumChain.create(); - permission.setActiveChain(network); - request.authenticated.updateChainAccount(permission); + permission?.setActiveChain(network); + request.authenticated.updateChainAccount(permission!); return network.chainId.toRadix16; default: return await _getWalletOwnerResult(request); diff --git a/mrt_wallet/lib/wallet/provider/controller/networks/ton.dart b/mrt_wallet/lib/wallet/provider/controller/networks/ton.dart new file mode 100644 index 00000000..e9886348 --- /dev/null +++ b/mrt_wallet/lib/wallet/provider/controller/networks/ton.dart @@ -0,0 +1,11 @@ +part of 'package:mrt_wallet/wallet/provider/wallet_provider.dart'; + +mixin Web3TonImpl on WalletManager { + _getWalletOwnerResult(Web3Request request); + Future _getTonWeb3Result(Web3TonRequest request) async { + switch (request.params.method) { + default: + return await _getWalletOwnerResult(request); + } + } +} diff --git a/mrt_wallet/lib/wallet/provider/controller/networks/tron_web3.dart b/mrt_wallet/lib/wallet/provider/controller/networks/tron.dart similarity index 100% rename from mrt_wallet/lib/wallet/provider/controller/networks/tron_web3.dart rename to mrt_wallet/lib/wallet/provider/controller/networks/tron.dart diff --git a/mrt_wallet/lib/wallet/provider/controller/wallet_controller.dart b/mrt_wallet/lib/wallet/provider/controller/wallet_controller.dart index d665a89b..3d652498 100644 --- a/mrt_wallet/lib/wallet/provider/controller/wallet_controller.dart +++ b/mrt_wallet/lib/wallet/provider/controller/wallet_controller.dart @@ -39,6 +39,7 @@ class WalletController extends _WalletController Web3SolanaImpl, Web3EthereumImpl, Web3TronImpl, + Web3TonImpl, Web3Impl { WalletController._(WalletCore core, HDWallet wallet, ChainsHandler chains) : super(core, wallet, chains); diff --git a/mrt_wallet/lib/wallet/provider/controller/web3.dart b/mrt_wallet/lib/wallet/provider/controller/web3.dart index 1fc3cf72..97da22b6 100644 --- a/mrt_wallet/lib/wallet/provider/controller/web3.dart +++ b/mrt_wallet/lib/wallet/provider/controller/web3.dart @@ -1,7 +1,12 @@ part of 'package:mrt_wallet/wallet/provider/wallet_provider.dart'; mixin Web3Impl - on WalletManager, Web3EthereumImpl, Web3SolanaImpl, Web3TronImpl { + on + WalletManager, + Web3EthereumImpl, + Web3TonImpl, + Web3SolanaImpl, + Web3TronImpl { Chain _getWeb3ChainId( {required Web3RequestParams param, required Web3APPAuthentication authenticated}) { @@ -39,6 +44,19 @@ mixin Web3Impl e.network.genesisBlock == (web3Chain?.currentChain ?? TronChainType.mainnet), orElse: () => throw Web3RequestExceptionConst.invalidNetwork); + case NetworkType.ton: + final web3Chain = authenticated + .getChainFromNetworkType(param.method.network); + if (param.account != null && web3Chain == null) { + throw Web3RequestExceptionConst.missingPermission; + } + return _appChains._networks.values + .whereType() + .firstWhere( + (e) => + e.network.coinParam.workchain == + (web3Chain?.currentChain ?? TonConst.mainnetWokchainId), + orElse: () => throw Web3RequestExceptionConst.invalidNetwork); default: throw Web3RequestExceptionConst.networkNotSupported; } @@ -120,6 +138,9 @@ mixin Web3Impl return await _getTronWeb3Result(request as Web3TronRequest); case NetworkType.solana: return await _getSolanaWeb3Result(request as Web3SolanaRequest); + case NetworkType.ton: + return await _getTonWeb3Result(request as Web3TonRequest); + default: throw Web3RequestExceptionConst.networkNotSupported; } @@ -142,36 +163,18 @@ mixin Web3Impl final request = requestParams.toRequest( request: walletRequest, chain: chain, authenticated: authenticated); request.verifyPermissioon(); - final params = request.params; Object? result = await _getWeb3Result(request: request); - - if (params.isPermissionRequest) { - request.authenticated.updateChainAccount(result as Web3Chain); - result = request.currentPermission! - .currentChainAccounts(chain) - .map((e) => e.addressStr) - .toList(); - } request.authenticated .addActivity(param: request.params, url: request.info.info.url); await _core._savePermission(wallet: _wallet, permission: authenticated); - if (params.isPermissionRequest) { - if (!request.hasAnyPermission) { - throw Web3RequestExceptionConst.rejectedByUser; - } - } - if (params.isPermissionRequest) { - return Web3ChainMessage( - type: Web3MessageTypes.chains, - authenticated: authenticated, - message: _appChains.toCbor().encode(), - response: - Web3ResponseMessage(result: result, network: chain.network.type)); - } + final walletResponse = request.params.toJsWalletResponse(result); return Web3WalletResponseMessage( - result: result, + result: walletResponse, authenticated: authenticated, - network: chain.network.type); + network: chain.network.type, + chain: request.params.isPermissionRequest + ? _appChains.toCbor().encode() + : null); } Future _web3Request( diff --git a/mrt_wallet/lib/wallet/provider/wallet_provider.dart b/mrt_wallet/lib/wallet/provider/wallet_provider.dart index 0a9b668f..affc3393 100644 --- a/mrt_wallet/lib/wallet/provider/wallet_provider.dart +++ b/mrt_wallet/lib/wallet/provider/wallet_provider.dart @@ -7,15 +7,17 @@ import 'package:mrt_wallet/wallet/api/api.dart'; import 'package:mrt_wallet/wallet/constant/constant.dart'; import 'package:mrt_wallet/wallet/models/models.dart'; import 'package:mrt_wallet/wallet/models/others/models/life_cycle.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; import 'package:mrt_wallet/wallet/web3/web3.dart'; import 'package:mrt_wallet/crypto/worker.dart'; part 'controller/wallet_controller.dart'; part 'controller/manager.dart'; part 'controller/web3.dart'; -part 'controller/networks/tron_web3.dart'; -part 'controller/networks/ethereum_web3.dart'; +part 'controller/networks/tron.dart'; +part 'controller/networks/ethereum.dart'; part 'controller/networks/solana.dart'; +part 'controller/networks/ton.dart'; part 'core/core.dart'; part 'impl/manager.dart'; part 'impl/storage_impl.dart'; diff --git a/mrt_wallet/lib/wallet/web3/constant/constant/exception.dart b/mrt_wallet/lib/wallet/web3/constant/constant/exception.dart index 287bb0b4..5eb0d94d 100644 --- a/mrt_wallet/lib/wallet/web3/constant/constant/exception.dart +++ b/mrt_wallet/lib/wallet/web3/constant/constant/exception.dart @@ -11,6 +11,8 @@ class Web3RequestExceptionConst { "The provided transaction type does not correspond with the specified gas parameters."; static const String eip1559NotSupported = "The current network does not support EIP-1559 transactions."; + static Web3RequestException get invalidSignMessageData => invalidParameters( + "Invalid message bytes. message must be a valid bytes like Uint8Array"); static Web3RequestException fromException(Object exception) { if (exception is RPCError) { return Web3RequestException( @@ -84,7 +86,7 @@ class Web3RequestExceptionConst { message: "The requested method and/or account has not been authorized by the user.", data: - "The URL is banned by the owner of the wallet. Please use an allowed URL or contact the wallet owner for further assistance.", + "The URL is disable by the owner of the wallet. Please use an allowed URL or contact the wallet owner for further assistance.", walletCode: "WEB3-4040", code: 4100); @@ -92,7 +94,7 @@ class Web3RequestExceptionConst { /// global /// static const Web3RequestException wrongRpcUrls = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid RPC URL: RPC URLs must be valid and use HTTP, HTTPS, WS, or WSS schemes. Please check the URL and try again.", walletCode: "WEB3-0010", @@ -100,7 +102,7 @@ class Web3RequestExceptionConst { static Web3RequestException invalidStringArgrument(String parameterName) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid string argument provided for $parameterName. Please ensure the input is a valid string and try again.", walletCode: "WEB3-0020", @@ -108,7 +110,7 @@ class Web3RequestExceptionConst { static Web3RequestException invalidAddressArgrument(String addressType) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid address argument provided for $addressType. Please ensure the input is a valid $addressType and try again.", walletCode: "WEB3-0030", @@ -116,44 +118,51 @@ class Web3RequestExceptionConst { static Web3RequestException invalidHexBytes(String parameterName) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: - "Invalid hex bytes for $parameterName: Hex must be valid, start with '0x', and have an even length. Please check the input and try again.", + "Invalid hex string for $parameterName: Hex must be valid, start with '0x', and have an even length. Please check the input and try again.", + walletCode: "WEB3-0040", + code: -32602); + static Web3RequestException invalidBase64Bytes(String parameterName) => + Web3RequestException( + message: "Invalid method parameters.", + data: + "Invalid base64 string for $parameterName: Please check the input and try again.", walletCode: "WEB3-0040", code: -32602); - static Web3RequestException invalidList(String parameterName) => + static Web3RequestException invalidList({String? parameterName}) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: - "Invalid list argument provided for $parameterName. Please ensure the input is a valid list and try again.", + "Invalid list argument provided${parameterName != null ? ' for $parameterName' : ''}. Please ensure the input is a valid list and try again.", walletCode: "WEB3-0050", code: -32602); - static Web3RequestException invalidMap(String parameterName) => + static Web3RequestException invalidMap({String? parameterName}) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: - "Invalid map argument provided for $parameterName. Please ensure the input is a valid map and try again.", + "Invalid map argument provided${parameterName != null ? ' for $parameterName' : ''}. Please ensure the input is a valid map and try again.", walletCode: "WEB3-0060", code: -32602); static Web3RequestException invalidNumbers(String parameterName) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid number argument provided for $parameterName: Numbers must be valid hexadecimal values starting with '0x'. Please check the input and try again.", walletCode: "WEB3-0070", code: -32602); static Web3RequestException invalidMethodArgruments(String methodName) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid arguments provided for method '$methodName': Please ensure that the arguments for '$methodName' are correct and try again.", walletCode: "WEB3-0080", code: -32602); static const Web3RequestException rpcConnection = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "RPC connection failed. RPC connection failed. Please ensure the RPC URL is correct and the RPC server is available.", walletCode: "WEB3-0100", @@ -167,39 +176,39 @@ class Web3RequestExceptionConst { /// eth static const Web3RequestException ethWrongDecimal = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid Ethereum decimal. The decimal value must be exactly 18.", walletCode: "WEB3-5040", code: -32602); static const Web3RequestException ethGasArgrument = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "You cannot use both legacy and EIP-1559 gas parameters simultaneously.", walletCode: "WEB3-5050", code: -32602); static const Web3RequestException ethGasArgrument2 = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "To use EIP-1559 gas metrics, you must fill both maxFeePerGas and maxPriorityFeePerGas fields.", walletCode: "WEB3-5060", code: -32602); static const Web3RequestException ethTypedData = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid typedData parameter: the provided typedData is not valid. Please check the data and try again.", walletCode: "WEB3-5070", code: -32602); static Web3RequestException ethTypedDataMessage(String message) => Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "Invalid typedData parameter: $message", walletCode: "WEB3-5070", code: -32602); static const Web3RequestException ethereumNetworkDoesNotExist = Web3RequestException( - message: "Invalid method parameters ", + message: "Invalid method parameters.", data: "The specified Ethereum network does not exist. Please use 'wallet_addEthereumChain' to add the network before proceeding.", walletCode: "WEB3-5080", diff --git a/mrt_wallet/lib/wallet/web3/constant/constant/web3.dart b/mrt_wallet/lib/wallet/web3/constant/constant/web3.dart index 500dd2f4..fc2a0857 100644 --- a/mrt_wallet/lib/wallet/web3/constant/constant/web3.dart +++ b/mrt_wallet/lib/wallet/web3/constant/constant/web3.dart @@ -5,5 +5,6 @@ class Web3Const { NetworkType.ethereum, NetworkType.tron, NetworkType.solana, + NetworkType.ton, ]; } diff --git a/mrt_wallet/lib/wallet/web3/core/exception/exception.dart b/mrt_wallet/lib/wallet/web3/core/exception/exception.dart index 8127dc10..a8e06f8a 100644 --- a/mrt_wallet/lib/wallet/web3/core/exception/exception.dart +++ b/mrt_wallet/lib/wallet/web3/core/exception/exception.dart @@ -24,12 +24,7 @@ class Web3RequestException implements Exception { Web3ExceptionMessage toResponseMessage( {Map? request, String? requestId}) { return Web3ExceptionMessage( - message: message, - code: code, - request: request, - requestId: requestId, - walletCode: walletCode, - data: data); + message: message, code: code, walletCode: walletCode, data: data); } @override diff --git a/mrt_wallet/lib/wallet/web3/core/messages/models/models/chain.dart b/mrt_wallet/lib/wallet/web3/core/messages/models/models/chain.dart index bf0feb22..50ecfe75 100644 --- a/mrt_wallet/lib/wallet/web3/core/messages/models/models/chain.dart +++ b/mrt_wallet/lib/wallet/web3/core/messages/models/models/chain.dart @@ -5,20 +5,16 @@ import 'package:mrt_wallet/wallet/web3/core/messages/types/message.dart'; import 'package:mrt_wallet/wallet/web3/core/messages/types/message_types.dart'; import 'package:mrt_wallet/wallet/web3/core/permission/models/authenticated.dart'; -import 'response.dart'; - class Web3ChainMessage extends Web3MessageCore { final List message; @override final Web3MessageTypes type; final Web3APPAuthentication authenticated; - final Web3ResponseMessage? response; Web3ChainMessage({ required List message, required this.type, required this.authenticated, - this.response, }) : message = BytesUtils.toBytes(message, unmodifiable: true); factory Web3ChainMessage.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -26,25 +22,23 @@ class Web3ChainMessage extends Web3MessageCore { CborSerializable.decode(cborBytes: bytes, object: object, hex: hex); final type = Web3MessageTypes.fromTag(tag.tags); final values = tag.getList; - final response = values.getCborTag(2); return Web3ChainMessage( message: values.elementAt(0), type: type, authenticated: - Web3APPAuthentication.deserialize(object: values.getCborTag(1)), - response: response == null - ? null - : Web3ResponseMessage.deserialize(object: response)); + Web3APPAuthentication.deserialize(object: values.getCborTag(1))); } @override CborTagValue toCbor() { return CborTagValue( - CborListValue.fixedLength([ - CborBytesValue(message), - authenticated.toCbor(), - response?.toCbor() - ]), + CborListValue.fixedLength( + [CborBytesValue(message), authenticated.toCbor()]), type.tag); } + + @override + Map toJson() { + return {"type": type.name}; + } } diff --git a/mrt_wallet/lib/wallet/web3/core/messages/models/models/exception.dart b/mrt_wallet/lib/wallet/web3/core/messages/models/models/exception.dart index aec86874..f15ee9e8 100644 --- a/mrt_wallet/lib/wallet/web3/core/messages/models/models/exception.dart +++ b/mrt_wallet/lib/wallet/web3/core/messages/models/models/exception.dart @@ -1,5 +1,4 @@ import 'package:blockchain_utils/cbor/cbor.dart'; -import 'package:blockchain_utils/utils/string/string.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/wallet/web3/core/messages/types/message.dart'; @@ -10,17 +9,12 @@ class Web3ExceptionMessage extends Web3MessageCore { final int code; final String walletCode; final String? data; - final String? requestId; - final String? request; Web3ExceptionMessage( {required this.message, required this.code, required this.walletCode, - this.data, - this.requestId, - Map? request}) - : request = StringUtils.tryFromJson(request); + this.data}); factory Web3ExceptionMessage.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -33,27 +27,22 @@ class Web3ExceptionMessage extends Web3MessageCore { message: values.elementAt(0), code: values.elementAt(1), walletCode: values.elementAt(2), - data: values.elementAt(3), - request: values.elementAt(4), - requestId: values.elementAt(5)); + data: values.elementAt(3)); } @override CborTagValue toCbor() { return CborTagValue( - CborListValue.fixedLength( - [message, code, walletCode, data, request, requestId]), - type.tag); + CborListValue.fixedLength([message, code, walletCode, data]), type.tag); } + @override Map toJson() { return { "message": message, "code": code, "walletCode": walletCode, "data": data, - "request": request == null ? null : StringUtils.tryToJson(request!), - "requestId": requestId }..removeWhere((k, v) => v == null); } diff --git a/mrt_wallet/lib/wallet/web3/core/messages/models/models/response.dart b/mrt_wallet/lib/wallet/web3/core/messages/models/models/response.dart index 0d8419b3..e495a04b 100644 --- a/mrt_wallet/lib/wallet/web3/core/messages/models/models/response.dart +++ b/mrt_wallet/lib/wallet/web3/core/messages/models/models/response.dart @@ -2,6 +2,7 @@ import 'package:blockchain_utils/cbor/cbor.dart'; import 'package:blockchain_utils/utils/utils.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/messages/types/message.dart'; import 'package:mrt_wallet/wallet/web3/core/messages/types/message_types.dart'; @@ -36,4 +37,27 @@ class Web3ResponseMessage extends Web3MessageCore { @override Web3MessageTypes get type => Web3MessageTypes.response; + + List resultAsList({int? length}) { + try { + final list = (result as List).cast(); + if (length == null) return list; + return list.sublist(0, length); + } catch (e) { + throw Web3RequestExceptionConst.internalError; + } + } + + Map resultAsMap() { + try { + return (result as Map).cast(); + } catch (e) { + throw Web3RequestExceptionConst.internalError; + } + } + + @override + Map toJson() { + return {"type": type.name, "result": result, "network": network.name}; + } } diff --git a/mrt_wallet/lib/wallet/web3/core/messages/models/models/wallet_response.dart b/mrt_wallet/lib/wallet/web3/core/messages/models/models/wallet_response.dart index 319c7c90..ec2adbbb 100644 --- a/mrt_wallet/lib/wallet/web3/core/messages/models/models/wallet_response.dart +++ b/mrt_wallet/lib/wallet/web3/core/messages/models/models/wallet_response.dart @@ -8,14 +8,24 @@ import 'response.dart'; class Web3WalletResponseMessage extends Web3ResponseMessage { final Web3APPAuthentication authenticated; - Web3WalletResponseMessage._( - {super.result, required super.network, required this.authenticated}); - factory Web3WalletResponseMessage( - {Object? result, - required NetworkType network, - required Web3APPAuthentication authenticated}) { + final List? chain; + Web3WalletResponseMessage._({ + super.result, + required super.network, + required this.authenticated, + List? chain, + }) : chain = BytesUtils.tryToBytes(chain, unmodifiable: true); + factory Web3WalletResponseMessage({ + Object? result, + required NetworkType network, + required Web3APPAuthentication authenticated, + List? chain, + }) { return Web3WalletResponseMessage._( - result: result, authenticated: authenticated, network: network); + result: result, + authenticated: authenticated, + network: network, + chain: chain); } factory Web3WalletResponseMessage.deserialize( @@ -31,7 +41,8 @@ class Web3WalletResponseMessage extends Web3ResponseMessage { result: result["result"], authenticated: Web3APPAuthentication.deserialize(object: values.getCborTag(1)), - network: NetworkType.fromTag(values.elementAt(2))); + network: NetworkType.fromTag(values.elementAt(2)), + chain: values.elementAt(3)); } @override @@ -40,7 +51,8 @@ class Web3WalletResponseMessage extends Web3ResponseMessage { CborListValue.fixedLength([ StringUtils.fromJson({"result": result}), authenticated.toCbor(), - CborBytesValue(network.tag) + CborBytesValue(network.tag), + chain == null ? const CborNullValue() : CborBytesValue(chain!) ]), type.tag); } diff --git a/mrt_wallet/lib/wallet/web3/core/messages/types/message.dart b/mrt_wallet/lib/wallet/web3/core/messages/types/message.dart index eead2f90..43a1cfac 100644 --- a/mrt_wallet/lib/wallet/web3/core/messages/types/message.dart +++ b/mrt_wallet/lib/wallet/web3/core/messages/types/message.dart @@ -1,12 +1,14 @@ import 'package:blockchain_utils/cbor/cbor.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/wallet/web3/core/exception/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/messages/models/models.dart'; import 'package:mrt_wallet/wallet/web3/core/request/params.dart'; import 'message_types.dart'; -abstract class Web3MessageCore with CborSerializable { +abstract class Web3MessageCore with CborSerializable, JsonSerialization { abstract final Web3MessageTypes type; + const Web3MessageCore(); factory Web3MessageCore.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -31,7 +33,9 @@ abstract class Web3MessageCore with CborSerializable { default: throw Web3RequestExceptionConst.internalError; } - } catch (e) { + } on Web3RequestException { + rethrow; + } catch (_) { throw Web3RequestExceptionConst.internalError; } } diff --git a/mrt_wallet/lib/wallet/web3/core/methods/methods.dart b/mrt_wallet/lib/wallet/web3/core/methods/methods.dart index 1c81ed05..61a20a30 100644 --- a/mrt_wallet/lib/wallet/web3/core/methods/methods.dart +++ b/mrt_wallet/lib/wallet/web3/core/methods/methods.dart @@ -2,6 +2,7 @@ import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/networks/ethereum/methods/methods.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/web3/networks/solana/solana.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; import 'package:mrt_wallet/wallet/web3/networks/tron/methods/methods.dart'; abstract class Web3RequestMethods { @@ -22,6 +23,8 @@ abstract class Web3RequestMethods { return Web3TronRequestMethods.fromId(tag!.last); case NetworkType.solana: return Web3SolanaRequestMethods.fromId(tag!.last); + case NetworkType.ton: + return Web3TonRequestMethods.fromId(tag!.last); default: throw Web3RequestExceptionConst.networkNotSupported; } diff --git a/mrt_wallet/lib/wallet/web3/core/permission/models/authenticated.dart b/mrt_wallet/lib/wallet/web3/core/permission/models/authenticated.dart index bef316c9..6cb438aa 100644 --- a/mrt_wallet/lib/wallet/web3/core/permission/models/authenticated.dart +++ b/mrt_wallet/lib/wallet/web3/core/permission/models/authenticated.dart @@ -4,14 +4,13 @@ import 'package:mrt_wallet/app/models/models/image.dart'; import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; import 'package:mrt_wallet/app/utils/map/extension.dart'; import 'package:mrt_wallet/wallet/constant/tags/constant.dart'; -import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; -import 'package:mrt_wallet/wallet/web3/core/permission/types/account.dart'; import 'package:mrt_wallet/wallet/web3/core/permission/types/chain.dart'; import 'package:mrt_wallet/wallet/web3/core/request/params.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/web3/networks/ethereum/permission/models/permission.dart'; import 'package:mrt_wallet/wallet/web3/networks/solana/permission/permission.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/permission/permission.dart'; import 'package:mrt_wallet/wallet/web3/networks/tron/permission/models/permission.dart'; class Web3APPAuthentication with CborSerializable { @@ -108,26 +107,6 @@ class Web3APPAuthentication with CborSerializable { CborTagsConst.web3App); } - T? getChain< - NETWORKADDRESS, - T extends Web3Chain, - Web3ChainAccount>>( - {NETWORKADDRESS? address, - required APPCHAINNETWORK chain}) { - if (!active) { - throw Web3RequestExceptionConst.bannedHost; - } - final chainPermission = _chains[chain.network.type] as T?; - if (address != null) { - final accountPermission = - chainPermission?.getAccountPermission(address: address, chain: chain); - if (accountPermission == null) { - throw Web3RequestExceptionConst.missingPermission; - } - } - return chainPermission; - } - T? getChainFromNetworkType(NetworkType network) { if (!active) return null; Web3Chain? chain = _chains[network]; @@ -141,6 +120,9 @@ class Web3APPAuthentication with CborSerializable { case NetworkType.solana: chain ??= Web3SolanaChain.create(); break; + case NetworkType.ton: + chain ??= Web3TonChain.create(); + break; default: throw Web3RequestExceptionConst.networkNotSupported; } diff --git a/mrt_wallet/lib/wallet/web3/core/permission/types/account.dart b/mrt_wallet/lib/wallet/web3/core/permission/types/account.dart index 62c5efe2..f7f38e86 100644 --- a/mrt_wallet/lib/wallet/web3/core/permission/types/account.dart +++ b/mrt_wallet/lib/wallet/web3/core/permission/types/account.dart @@ -5,11 +5,16 @@ abstract class Web3ChainAccount with CborSerializable, Equatable { final AddressDerivationIndex keyIndex; final NETWORKADDRESS address; - final bool defaultAddress; + bool _defaultAddress; + bool get defaultAddress => _defaultAddress; String get addressStr; Web3ChainAccount({ required this.keyIndex, required this.address, - required this.defaultAddress, - }); + required bool defaultAddress, + }) : _defaultAddress = defaultAddress; + + void changeDefault(bool defaultAddress) { + _defaultAddress = defaultAddress; + } } diff --git a/mrt_wallet/lib/wallet/web3/core/permission/types/chain.dart b/mrt_wallet/lib/wallet/web3/core/permission/types/chain.dart index 2a78033a..a5708628 100644 --- a/mrt_wallet/lib/wallet/web3/core/permission/types/chain.dart +++ b/mrt_wallet/lib/wallet/web3/core/permission/types/chain.dart @@ -6,6 +6,7 @@ import 'package:mrt_wallet/wallet/web3/core/request/params.dart'; import 'package:mrt_wallet/wallet/web3/networks/ethereum/permission/models/permission.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/web3/networks/solana/permission/models/permission.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; import 'package:mrt_wallet/wallet/web3/networks/tron/tron.dart'; import 'account.dart'; import '../models/activity.dart'; @@ -19,12 +20,13 @@ abstract class Web3Chain< CHAINACCOUT extends Web3ChainAccount> with CborSerializable { List _accounts; - List get accounts => _accounts; - List currentChainAccounts(CHAIN chain); + List get activeAccounts => _accounts; + // List currentChainAccounts(CHAIN chain); + List chainAccounts(CHAIN chain); List _activities; List get activities => _activities; abstract final NetworkType network; - bool hasPermission(CHAIN chain); + bool hasPermission(CHAIN chain) => chainAccounts(chain).isNotEmpty; Web3Chain( {required List accounts, required List activities}) @@ -47,6 +49,9 @@ abstract class Web3Chain< case NetworkType.solana: chain = Web3SolanaChain.deserialize(object: decode); break; + case NetworkType.ton: + chain = Web3TonChain.deserialize(object: decode); + break; default: throw WalletExceptionConst.unsuportedFeature; } @@ -79,4 +84,6 @@ abstract class Web3Chain< void updateChainAccount(List updatedAccounts) { _accounts = updatedAccounts.imutable; } + + void setActiveChain(CHAIN chain); } diff --git a/mrt_wallet/lib/wallet/web3/core/request/params.dart b/mrt_wallet/lib/wallet/web3/core/request/params.dart index 4c754e76..bd3a65e8 100644 --- a/mrt_wallet/lib/wallet/web3/core/request/params.dart +++ b/mrt_wallet/lib/wallet/web3/core/request/params.dart @@ -9,6 +9,7 @@ import 'package:mrt_wallet/wallet/web3/core/permission/permission.dart'; import 'package:mrt_wallet/wallet/web3/networks/global/global.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/web3/networks/solana/solana.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/ton.dart'; import 'package:mrt_wallet/wallet/web3/networks/tron/tron.dart'; import 'web_request.dart'; @@ -56,6 +57,14 @@ abstract class Web3RequestParams< Web3RequestParams(); + Object? toJsWalletResponse(RESPONSE response) { + return response; + } + + Object? toPageResponse(RESPONSE response) { + return response; + } + @override Web3MessageTypes get type => Web3MessageTypes.walletRequest; Web3Request toRequest( @@ -85,6 +94,10 @@ abstract class Web3RequestParams< param = Web3SolanaRequestParam.deserialize( bytes: bytes, object: object, hex: hex); break; + case NetworkType.ton: + param = Web3TonRequestParam.deserialize( + bytes: bytes, object: object, hex: hex); + break; default: throw Web3RequestExceptionConst.internalError; } diff --git a/mrt_wallet/lib/wallet/web3/core/request/permission.dart b/mrt_wallet/lib/wallet/web3/core/request/permission.dart index 4da05886..cea11659 100644 --- a/mrt_wallet/lib/wallet/web3/core/request/permission.dart +++ b/mrt_wallet/lib/wallet/web3/core/request/permission.dart @@ -3,7 +3,6 @@ import 'package:mrt_wallet/wallet/web3/core/permission/permission.dart'; import 'params.dart'; abstract class Web3PermissionRequest< - RESULT, NETWORKADDRESS, CHAIN extends APPCHAINNETWORK, CHAINACCOUNT extends Web3ChainAccount, diff --git a/mrt_wallet/lib/wallet/web3/models/models/client_info.dart b/mrt_wallet/lib/wallet/web3/models/models/client_info.dart index e3286d82..8eaea4d9 100644 --- a/mrt_wallet/lib/wallet/web3/models/models/client_info.dart +++ b/mrt_wallet/lib/wallet/web3/models/models/client_info.dart @@ -28,7 +28,7 @@ class Web3ClientInfo with Equatable { url: url!, applicationId: applicationId, clientId: clientId, - name: name ?? uri.host); + name: (name?.isEmpty ?? true) ? uri.host : name!); } @override diff --git a/mrt_wallet/lib/wallet/web3/networks/ethereum/constant/constant.dart b/mrt_wallet/lib/wallet/web3/networks/ethereum/constant/constant.dart index a7d85ad3..98d13f91 100644 --- a/mrt_wallet/lib/wallet/web3/networks/ethereum/constant/constant.dart +++ b/mrt_wallet/lib/wallet/web3/networks/ethereum/constant/constant.dart @@ -13,7 +13,6 @@ class Web3EthereumConst { /// method name static const String sendTransaction = "eth_sendTransaction"; static const String personalSign = "personal_sign"; - static const String typedData = "eth_signTypedData"; static const String typedDataV3 = "eth_signTypedData_v3"; static const String typedDataV4 = "eth_signTypedData_v4"; @@ -22,7 +21,6 @@ class Web3EthereumConst { static const String ethChinId = "eth_chainId"; static const String addChain = "wallet_addEthereumChain"; static const String switchEthereumChain = "wallet_switchEthereumChain"; - static const String disconnect = "wallet_switchEthereumChain"; static const List ethereumSupportedRpcPorotocols = [ diff --git a/mrt_wallet/lib/wallet/web3/networks/ethereum/methods/methods.dart b/mrt_wallet/lib/wallet/web3/networks/ethereum/methods/methods.dart index 8a5b841e..2ba24416 100644 --- a/mrt_wallet/lib/wallet/web3/networks/ethereum/methods/methods.dart +++ b/mrt_wallet/lib/wallet/web3/networks/ethereum/methods/methods.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/core.dart'; import 'package:mrt_wallet/wallet/web3/networks/ethereum/constant/constant.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/ethereum/params/core/request.dart b/mrt_wallet/lib/wallet/web3/networks/ethereum/params/core/request.dart index 869ed83e..30a7f051 100644 --- a/mrt_wallet/lib/wallet/web3/networks/ethereum/params/core/request.dart +++ b/mrt_wallet/lib/wallet/web3/networks/ethereum/params/core/request.dart @@ -12,10 +12,14 @@ import 'package:on_chain/ethereum/src/address/evm_address.dart'; abstract class Web3EthereumPermissionRequestParam extends Web3EthereumRequestParam implements - Web3PermissionRequest { @override bool get isPermissionRequest => true; + @override + Object? toJsWalletResponse(Web3EthereumChain response) { + return null; + } } abstract class Web3EthereumRequestParam extends Web3RequestParams< diff --git a/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/account.dart b/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/account.dart index fe08fd63..6fb280e3 100644 --- a/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/account.dart +++ b/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/account.dart @@ -14,13 +14,6 @@ class Web3EthereumChainAccount extends Web3ChainAccount { required super.defaultAddress, required this.chainId, }); - Web3EthereumChainAccount changeDefault(bool defaultAddress) { - return Web3EthereumChainAccount( - keyIndex: keyIndex, - address: address, - defaultAddress: defaultAddress, - chainId: chainId); - } factory Web3EthereumChainAccount.fromChainAccount( {required IEthAddress address, diff --git a/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/permission.dart b/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/permission.dart index d5915f26..1c68bdc6 100644 --- a/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/permission.dart +++ b/mrt_wallet/lib/wallet/web3/networks/ethereum/permission/models/permission.dart @@ -20,7 +20,9 @@ class Web3EthereumChain @override Web3EthereumChain clone() { return Web3EthereumChain._( - accounts: accounts, currentChain: currentChain, activities: activities); + accounts: activeAccounts, + currentChain: currentChain, + activities: activities); } factory Web3EthereumChain.create({BigInt? chainId}) { @@ -31,7 +33,8 @@ class Web3EthereumChain } @override - List get accounts => super.accounts.cast(); + List get activeAccounts => + super.activeAccounts.cast(); factory Web3EthereumChain.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -56,7 +59,8 @@ class Web3EthereumChain CborTagValue toCbor() { return CborTagValue( CborListValue.fixedLength([ - CborListValue.fixedLength(accounts.map((e) => e.toCbor()).toList()), + CborListValue.fixedLength( + activeAccounts.map((e) => e.toCbor()).toList()), _currentChain, CborListValue.fixedLength(activities.map((e) => e.toCbor()).toList()), ]), @@ -70,8 +74,8 @@ class Web3EthereumChain IEthAddress getAccountPermission( {required ETHAddress address, required EthereumChain chain}) { try { - final permissionAccount = - accounts.firstWhere((e) => e.address == address); + final permissionAccount = activeAccounts.firstWhere( + (e) => e.address == address && e.chainId == chain.chainId); final chainAccount = chain.addresses.firstWhere((e) { return e.networkAddress == permissionAccount.address && e.keyIndex == permissionAccount.keyIndex; @@ -82,26 +86,12 @@ class Web3EthereumChain } } - @override - List currentChainAccounts(EthereumChain chain) { - final currentAccounts = - accounts.where((e) => e.chainId == _currentChain).toList(); - List existsAccounts = []; - for (final i in chain.addresses) { - final chainAccount = currentAccounts.firstWhereOrNull( - (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); - if (chainAccount != null) { - existsAccounts.add(chainAccount); - } - } - return existsAccounts; - } - @override Web3EthereumChainAccount? getPermission(ETHAddress address) { - return accounts.firstWhereOrNull((e) => e.address == address); + return activeAccounts.firstWhereOrNull((e) => e.address == address); } + @override void setActiveChain(EthereumChain chain) { _currentChain = chain.chainId; } @@ -113,6 +103,17 @@ class Web3EthereumChain } @override - bool hasPermission(EthereumChain chain) => - currentChainAccounts(chain).isNotEmpty; + List chainAccounts(EthereumChain chain) { + final currentAccounts = + activeAccounts.where((e) => e.chainId == chain.chainId).toList(); + List existsAccounts = []; + for (final i in chain.addresses) { + final chainAccount = currentAccounts.firstWhereOrNull( + (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); + if (chainAccount != null) { + existsAccounts.add(chainAccount); + } + } + return existsAccounts; + } } diff --git a/mrt_wallet/lib/wallet/web3/networks/global/methods/methods.dart b/mrt_wallet/lib/wallet/web3/networks/global/methods/methods.dart index d3debe95..67cc7b62 100644 --- a/mrt_wallet/lib/wallet/web3/networks/global/methods/methods.dart +++ b/mrt_wallet/lib/wallet/web3/networks/global/methods/methods.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/core.dart'; import 'package:mrt_wallet/wallet/web3/networks/global/constant/constant.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/constant.dart b/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/constant.dart index 1245bde0..7309b534 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/constant.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/constant.dart @@ -1,12 +1,17 @@ class Web3SolanaConst { - static const int requestAccountTag = 100; + static const String sendTransaction = "solana_sendTransaction"; + static const String sendAllTransactions = "solana_sendAllTransactions"; + static const String signAllTransactions = "solana_signAllTransactions"; + static const String signMessage = "solana_signMessage"; + static const String signTransaction = "solana_signTransaction"; static const String requestAccounts = "solana_requestAccounts"; + static const int requestAccountTag = 100; static const int signTransactionTag = 101; - static const String signTransaction = "solana_signTransaction"; - static const int signMessageV2Tag = 102; - static const String signMessage = "solana_signMessage"; + static const int signAllTransactionsTag = 103; + static const int sendTransactionTag = 104; + static const int sendAllTransactionsTag = 105; static const List sendTransactionDataTag = [1, 2]; static const List sendTransactionDataConfigTag = [1, 3]; diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/exception.dart b/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/exception.dart index b3707b82..1b927bf0 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/exception.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/constant/constants/exception.dart @@ -5,13 +5,19 @@ class Web3SolanaExceptionConstant { static Web3RequestException get invalidTransaction => Web3RequestExceptionConst.invalidParameters( "Transaction serialization failed"); + static Web3RequestException get invalidBatchTransactionRequest => + Web3RequestExceptionConst.invalidParameters( + "Invalid batch transaction request. The first parameter must be a list of transactions when sending a batch request."); static Web3RequestException get emptyTransactionParameters => Web3RequestExceptionConst.invalidParameters( "At least one transaction is required for signing."); + static Web3RequestException get signleRequestInsteadBatchError => + Web3RequestExceptionConst.invalidParameters( + "For multiple requests, please use the signAllTransactions or sendAllTransactions method."); static Web3RequestException get invalidTransactionOptionsSigner => Web3RequestExceptionConst.invalidParameters( "Signers do not have any effect. Please ensure all signatures are added to the transaction before signing, and remove any unused fields."); - static Web3RequestException get invalidSignMessageData => + static Web3RequestException get singTransactionInsteadMessage => Web3RequestExceptionConst.invalidParameters( - "for signing a transaction using the signTransaction method."); + "for signing a transaction using the `solana_signTransaction` method."); } diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/methods/methods.dart b/mrt_wallet/lib/wallet/web3/networks/solana/methods/methods.dart index 7e23b076..94f74a72 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/methods/methods.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/methods/methods.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/core.dart'; @@ -23,6 +23,20 @@ class Web3SolanaRequestMethods extends Web3RequestMethods { Web3SolanaRequestMethods._( id: Web3SolanaConst.signTransactionTag, name: Web3SolanaConst.signTransaction); + static const Web3SolanaRequestMethods signAllTransactions = + Web3SolanaRequestMethods._( + id: Web3SolanaConst.signAllTransactionsTag, + name: Web3SolanaConst.signAllTransactions); + + static const Web3SolanaRequestMethods sendTransaction = + Web3SolanaRequestMethods._( + id: Web3SolanaConst.sendTransactionTag, + name: Web3SolanaConst.sendTransaction); + + static const Web3SolanaRequestMethods sendAllTransactions = + Web3SolanaRequestMethods._( + id: Web3SolanaConst.sendAllTransactionsTag, + name: Web3SolanaConst.sendAllTransactions); @override final bool needWalletOwnerAction = true; @override @@ -31,6 +45,9 @@ class Web3SolanaRequestMethods extends Web3RequestMethods { static List values = [ requestAccounts, signTransaction, + signAllTransactions, + sendTransaction, + sendAllTransactions, signMessage ]; diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/params/core/request.dart b/mrt_wallet/lib/wallet/web3/networks/solana/params/core/request.dart index 9d48c839..41231322 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/params/core/request.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/params/core/request.dart @@ -14,10 +14,14 @@ import 'package:on_chain/solana/solana.dart'; abstract class Web3SolanaPermissionRequestParam extends Web3SolanaRequestParam implements - Web3PermissionRequest { + Web3PermissionRequest { @override bool get isPermissionRequest => true; + @override + Object? toJsWalletResponse(Web3SolanaChain response) { + return null; + } } abstract class Web3SolanaRequestParam extends Web3RequestParams< @@ -61,6 +65,9 @@ abstract class Web3SolanaRequestParam extends Web3RequestParams< param = Web3SolanaRequestAccounts.deserialize( bytes: bytes, object: object, hex: hex); case Web3SolanaRequestMethods.signTransaction: + case Web3SolanaRequestMethods.signAllTransactions: + case Web3SolanaRequestMethods.sendTransaction: + case Web3SolanaRequestMethods.sendAllTransactions: param = Web3SolanaSendTransaction.deserialize( bytes: bytes, object: object, hex: hex); case Web3SolanaRequestMethods.signMessage: diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/params/models/sign_message.dart b/mrt_wallet/lib/wallet/web3/networks/solana/params/models/sign_message.dart index 10cf7cc6..97e90808 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/params/models/sign_message.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/params/models/sign_message.dart @@ -9,7 +9,28 @@ import 'package:mrt_wallet/wallet/web3/networks/solana/params/core/request.dart' import 'package:mrt_wallet/wallet/web3/validator/web3_validator_utils.dart'; import 'package:on_chain/solana/solana.dart'; -class Web3SolanaSignMessage extends Web3SolanaRequestParam> { +class Web3SolanaSignMessageResponse { + final SolAddress address; + final List signature; + Web3SolanaSignMessageResponse( + {required this.address, required List signature}) + : signature = BytesUtils.toBytes(signature, unmodifiable: true); + factory Web3SolanaSignMessageResponse.fromJson(Map json) { + return Web3SolanaSignMessageResponse( + address: SolAddress(json["signer"]), + signature: (json["signature"] as List).cast()); + } + Map toJson() { + return { + "signer": address.address, + "signerAddressBytes": address.toBytes(), + "signature": signature, + }; + } +} + +class Web3SolanaSignMessage + extends Web3SolanaRequestParam { final SolAddress address; final String challeng; final String? content; @@ -56,6 +77,11 @@ class Web3SolanaSignMessage extends Web3SolanaRequestParam> { @override Web3SolanaRequestMethods get method => Web3SolanaRequestMethods.signMessage; + @override + Object? toJsWalletResponse(Web3SolanaSignMessageResponse response) { + return response.toJson(); + } + @override CborTagValue toCbor() { return CborTagValue( @@ -80,12 +106,14 @@ class Web3SolanaSignMessage extends Web3SolanaRequestParam> { @override SolAddress? get account => address; @override - Web3SolanaRequest, Web3SolanaSignMessage> toRequest({ + Web3SolanaRequest + toRequest({ required Web3RequestApplicationInformation request, required Web3APPAuthentication authenticated, required SolanaChain chain, }) { - return Web3SolanaRequest, Web3SolanaSignMessage>( + return Web3SolanaRequest( params: this, authenticated: authenticated, chain: chain, diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/params/models/transaction.dart b/mrt_wallet/lib/wallet/web3/networks/solana/params/models/transaction.dart index 1e2fcd5a..5891a89d 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/params/models/transaction.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/params/models/transaction.dart @@ -2,6 +2,7 @@ import 'package:blockchain_utils/cbor/cbor.dart'; import 'package:blockchain_utils/utils/utils.dart'; import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/core.dart'; import 'package:mrt_wallet/wallet/web3/networks/solana/constant/constants/constant.dart'; import 'package:mrt_wallet/wallet/web3/networks/solana/methods/methods.dart'; @@ -105,12 +106,32 @@ class Web3SolanaSendTransaction extends Web3SolanaRequestParam>> { final List messages; final Web3SolanaSendTransactionOptions? sendConfig; - bool get isSend => sendConfig != null; @override SolAddress get account => messages.first.account; - Web3SolanaSendTransaction({required this.messages, required this.sendConfig}); + Web3SolanaSendTransaction._( + {required this.messages, required this.sendConfig, required this.method}); + + factory Web3SolanaSendTransaction({ + required List messages, + Web3SolanaSendTransactionOptions? sendConfig, + required Web3RequestMethods method, + }) { + switch (method) { + case Web3SolanaRequestMethods.sendAllTransactions: + case Web3SolanaRequestMethods.signAllTransactions: + case Web3SolanaRequestMethods.sendTransaction: + case Web3SolanaRequestMethods.signTransaction: + break; + default: + throw Web3RequestExceptionConst.internalError; + } + return Web3SolanaSendTransaction._( + messages: messages, + sendConfig: sendConfig, + method: method as Web3SolanaRequestMethods); + } factory Web3SolanaSendTransaction.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -119,6 +140,7 @@ class Web3SolanaSendTransaction object: object, hex: hex, tags: Web3MessageTypes.walletRequest.tag); + final method = Web3RequestMethods.fromTag(values.elementAt(0)); return Web3SolanaSendTransaction( messages: values .elemetAs(1) @@ -126,12 +148,18 @@ class Web3SolanaSendTransaction .map((e) => Web3SolanaSendTransactionData.deserialize(object: e)) .toList(), sendConfig: values.getCborTag(2)?.to( - (e) => Web3SolanaSendTransactionOptions.deserialize(object: e))); + (e) => Web3SolanaSendTransactionOptions.deserialize(object: e)), + method: method); } @override - Web3SolanaRequestMethods get method => - Web3SolanaRequestMethods.signTransaction; + final Web3SolanaRequestMethods method; + + late final bool isSend = method == Web3SolanaRequestMethods.sendTransaction || + method == Web3SolanaRequestMethods.sendAllTransactions; + late final bool isBatchRequest = + method == Web3SolanaRequestMethods.sendAllTransactions || + method == Web3SolanaRequestMethods.signAllTransactions; @override CborTagValue toCbor() { diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/account.dart b/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/account.dart index 40dccc93..a3e77b05 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/account.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/account.dart @@ -24,13 +24,6 @@ class Web3SolanaChainAccount extends Web3ChainAccount { genesis: genesis, defaultAddress: isDefault); } - Web3SolanaChainAccount changeDefault(bool defaultAddress) { - return Web3SolanaChainAccount( - keyIndex: keyIndex, - address: address, - defaultAddress: defaultAddress, - genesis: genesis); - } factory Web3SolanaChainAccount.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -38,7 +31,7 @@ class Web3SolanaChainAccount extends Web3ChainAccount { object: object, cborBytes: bytes, hex: hex, - tags: CborTagsConst.web3TronAccount); + tags: CborTagsConst.web3SolanaAccount); return Web3SolanaChainAccount( keyIndex: AddressDerivationIndex.fromCborBytesOrObject( obj: values.getCborTag(0)), @@ -52,7 +45,7 @@ class Web3SolanaChainAccount extends Web3ChainAccount { return CborTagValue( CborListValue.fixedLength( [keyIndex.toCbor(), address.address, genesis, defaultAddress]), - CborTagsConst.web3TronAccount); + CborTagsConst.web3SolanaAccount); } @override diff --git a/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/permission.dart b/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/permission.dart index f2dcbd61..016b0ab8 100644 --- a/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/permission.dart +++ b/mrt_wallet/lib/wallet/web3/networks/solana/permission/models/permission.dart @@ -21,7 +21,7 @@ class Web3SolanaChain @override Web3SolanaChain clone() { return Web3SolanaChain._( - accounts: accounts, + accounts: activeAccounts, genesis: SolanaConst.mainnetGenesis, activities: activities); } @@ -34,7 +34,8 @@ class Web3SolanaChain } @override - List get accounts => super.accounts.cast(); + List get activeAccounts => + super.activeAccounts.cast(); factory Web3SolanaChain.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -59,7 +60,8 @@ class Web3SolanaChain CborTagValue toCbor() { return CborTagValue( CborListValue.fixedLength([ - CborListValue.fixedLength(accounts.map((e) => e.toCbor()).toList()), + CborListValue.fixedLength( + activeAccounts.map((e) => e.toCbor()).toList()), _genesis, CborListValue.fixedLength(activities.map((e) => e.toCbor()).toList()), ]), @@ -73,8 +75,8 @@ class Web3SolanaChain ISolanaAddress getAccountPermission( {required SolAddress address, required SolanaChain chain}) { try { - final permissionAccount = - accounts.firstWhere((e) => e.address == address); + final permissionAccount = activeAccounts.firstWhere((e) => + e.address == address && e.genesis == chain.network.genesisBlock); final chainAccount = chain.addresses.firstWhere((e) { return e.networkAddress == permissionAccount.address && e.keyIndex == permissionAccount.keyIndex; @@ -85,26 +87,12 @@ class Web3SolanaChain } } - @override - List currentChainAccounts(SolanaChain chain) { - final currentAccounts = - accounts.where((e) => e.genesis == _genesis).toList(); - List existsAccounts = []; - for (final i in chain.addresses) { - final chainAccount = currentAccounts.firstWhereOrNull( - (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); - if (chainAccount != null) { - existsAccounts.add(chainAccount); - } - } - return existsAccounts; - } - @override Web3SolanaChainAccount? getPermission(SolAddress address) { - return accounts.firstWhereOrNull((e) => e.address == address); + return activeAccounts.firstWhereOrNull((e) => e.address == address); } + @override void setActiveChain(SolanaChain chain) { _genesis = chain.network.genesisBlock; } @@ -118,6 +106,18 @@ class Web3SolanaChain } @override - bool hasPermission(SolanaChain chain) => - currentChainAccounts(chain).isNotEmpty; + List chainAccounts(SolanaChain chain) { + final currentAccounts = activeAccounts + .where((e) => e.genesis == chain.network.genesisBlock) + .toList(); + List existsAccounts = []; + for (final i in chain.addresses) { + final chainAccount = currentAccounts.firstWhereOrNull( + (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); + if (chainAccount != null) { + existsAccounts.add(chainAccount); + } + } + return existsAccounts; + } } diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/constant/constant.dart b/mrt_wallet/lib/wallet/web3/networks/ton/constant/constant.dart new file mode 100644 index 00000000..eb607c94 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/constant/constant.dart @@ -0,0 +1,2 @@ +export 'constants/constant.dart'; +export 'constants/exception.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/constant.dart b/mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/constant.dart new file mode 100644 index 00000000..7d53d1b2 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/constant.dart @@ -0,0 +1,16 @@ +class Web3TonConst { + static const int requestAccountTag = 100; + + static const int signTransactionTag = 101; + + static const int signMessageV2Tag = 102; + static const String signMessage = "ton_signMessage"; + static const String sendTransaction = "ton_sendTransaction"; + static const String signTransaction = "ton_signTransaction"; + static const String requestAccounts = "ton_requestAccounts"; + static const String addressName = "Ton address"; + + static const int sendTransactionTag = 103; + + static const List sendTransactionMessagesTag = [3, 1]; +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/exception.dart b/mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/exception.dart new file mode 100644 index 00000000..bc6a77dd --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/constant/constants/exception.dart @@ -0,0 +1,8 @@ +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/wallet/web3/core/exception/exception.dart'; + +class Web3TonExceptionConstant { + static Web3RequestException get invalidTransaction => + Web3RequestExceptionConst.invalidParameters( + "Transaction serialization failed"); +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/methods/methods.dart b/mrt_wallet/lib/wallet/web3/networks/ton/methods/methods.dart new file mode 100644 index 00000000..f3eeabc1 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/methods/methods.dart @@ -0,0 +1,39 @@ +import 'package:mrt_wallet/app/utils/list/extension.dart'; +import 'package:mrt_wallet/crypto/models/networks.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/wallet/web3/core/core.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/constant/constants/constant.dart'; + +class Web3TonRequestMethods extends Web3RequestMethods { + const Web3TonRequestMethods._({required super.id, required super.name}); + + static const Web3TonRequestMethods requestAccounts = Web3TonRequestMethods._( + id: Web3TonConst.requestAccountTag, + name: Web3TonConst.requestAccounts, + ); + static const Web3TonRequestMethods signMessage = Web3TonRequestMethods._( + id: Web3TonConst.signMessageV2Tag, name: Web3TonConst.signMessage); + + static const Web3TonRequestMethods sendTransaction = Web3TonRequestMethods._( + id: Web3TonConst.sendTransactionTag, name: Web3TonConst.sendTransaction); + @override + final bool needWalletOwnerAction = true; + @override + NetworkType get network => NetworkType.ton; + + static List values = [ + requestAccounts, + signMessage, + sendTransaction + ]; + + static Web3TonRequestMethods fromId(int? id) { + return values.firstWhere((e) => e.id == id, + orElse: () => throw Web3RequestExceptionConst.methodDoesNotExist); + } + + static Web3TonRequestMethods? fromName(String? name) { + return values.firstWhereOrNull( + (e) => e.name == name || e.methodsName.contains(name)); + } +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/params/core/request.dart b/mrt_wallet/lib/wallet/web3/networks/ton/params/core/request.dart new file mode 100644 index 00000000..12bb0c8e --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/params/core/request.dart @@ -0,0 +1,103 @@ +import 'package:blockchain_utils/blockchain_utils.dart'; +import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/wallet/web3/core/core.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/methods/methods.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/params.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/permission/models/account.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/permission/models/permission.dart'; +import 'package:ton_dart/ton_dart.dart'; + +abstract class Web3TonPermissionRequestParam + extends Web3TonRequestParam + implements + Web3PermissionRequest { + @override + bool get isPermissionRequest => true; + @override + Object? toJsWalletResponse(Web3TonChain response) { + return null; + } +} + +abstract class Web3TonRequestParam extends Web3RequestParams { + @override + abstract final Web3TonRequestMethods method; + @override + abstract final TonAddress? account; + + Web3TonRequestParam(); + + @override + Web3TonRequest> toRequest( + {required Web3RequestApplicationInformation request, + required Web3APPAuthentication authenticated, + required TheOpenNetworkChain chain}) { + return Web3TonRequest>( + params: this, + authenticated: authenticated, + chain: chain, + info: request); + } + + factory Web3TonRequestParam.deserialize( + {List? bytes, CborObject? object, String? hex}) { + final CborListValue values = CborSerializable.cborTagValue( + cborBytes: bytes, + object: object, + hex: hex, + tags: Web3MessageTypes.walletRequest.tag); + final method = Web3RequestMethods.fromTag(values.elementAt(0)); + final Web3TonRequestParam param; + switch (method) { + case Web3TonRequestMethods.requestAccounts: + param = Web3TonRequestAccounts.deserialize( + bytes: bytes, object: object, hex: hex); + case Web3TonRequestMethods.sendTransaction: + param = Web3TonSendTransaction.deserialize( + bytes: bytes, object: object, hex: hex); + case Web3TonRequestMethods.signMessage: + param = Web3TonSignMessage.deserialize( + bytes: bytes, object: object, hex: hex); + default: + throw Web3RequestExceptionConst.internalError; + } + if (param is! Web3TonRequestParam) { + throw Web3RequestExceptionConst.internalError; + } + return param; + } +} + +class Web3TonRequest> + extends Web3Request { + Web3TonRequest( + {required super.params, + required super.info, + required super.authenticated, + required super.chain}); + + Web3TonRequest cast>() { + return this as Web3TonRequest; + } + + @override + Web3TonChain? get currentPermission => + authenticated.getChainFromNetworkType(chain.network.type); + + @override + ITonAddress? accountPermission() { + if (params.account == null) { + return null; + } + if (currentPermission == null) { + throw Web3RequestExceptionConst.missingPermission; + } + return currentPermission! + .getAccountPermission(address: params.account!, chain: chain); + } +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/params/models/request_account.dart b/mrt_wallet/lib/wallet/web3/networks/ton/params/models/request_account.dart new file mode 100644 index 00000000..689b7e8e --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/params/models/request_account.dart @@ -0,0 +1,51 @@ +import 'package:blockchain_utils/cbor/cbor.dart'; +import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; +import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; +import 'package:mrt_wallet/wallet/web3/core/core.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/methods/methods.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/core/request.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/permission/permission.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class Web3TonRequestAccounts extends Web3TonPermissionRequestParam { + Web3TonRequestAccounts(); + + factory Web3TonRequestAccounts.deserialize( + {List? bytes, CborObject? object, String? hex}) { + CborSerializable.cborTagValue( + cborBytes: bytes, + object: object, + hex: hex, + tags: Web3MessageTypes.walletRequest.tag); + return Web3TonRequestAccounts(); + } + + @override + Web3TonRequestMethods get method => Web3TonRequestMethods.requestAccounts; + + @override + CborTagValue toCbor() { + return CborTagValue(CborListValue.fixedLength([method.tag]), type.tag); + } + + @override + Map toJson() { + return {}; + } + + @override + TonAddress? get account => null; + + @override + Web3TonRequest toRequest({ + required Web3RequestApplicationInformation request, + required Web3APPAuthentication authenticated, + required TheOpenNetworkChain chain, + }) { + return Web3TonRequest( + params: this, + authenticated: authenticated, + chain: chain, + info: request); + } +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/params/models/sign_message.dart b/mrt_wallet/lib/wallet/web3/networks/ton/params/models/sign_message.dart new file mode 100644 index 00000000..20056755 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/params/models/sign_message.dart @@ -0,0 +1,95 @@ +import 'package:blockchain_utils/cbor/cbor.dart'; +import 'package:blockchain_utils/utils/utils.dart'; +import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; +import 'package:mrt_wallet/app/utils/utils.dart'; +import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; +import 'package:mrt_wallet/wallet/web3/core/core.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/methods/methods.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/core/request.dart'; +import 'package:mrt_wallet/wallet/web3/validator/web3_validator_utils.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class Web3TonSignMessage extends Web3TonRequestParam> { + final TonAddress address; + final String challeng; + final String? content; + + Web3TonSignMessage( + {required this.address, required this.challeng, this.content}); + + factory Web3TonSignMessage.fromJson(Map json) { + const method = Web3TonRequestMethods.signMessage; + String? content = + StringUtils.tryDecode(BytesUtils.fromHexString(json["challeng"])); + if (content != null) { + content = StrUtils.toRawString(content); + } + return Web3TonSignMessage( + address: Web3ValidatorUtils.parseAddress( + onParse: (obj) => TonAddress(obj), + key: "address", + method: method, + json: json), + challeng: Web3ValidatorUtils.parseHex( + key: "challeng", method: method, json: json), + content: content); + } + + factory Web3TonSignMessage.deserialize({ + List? bytes, + CborObject? object, + String? hex, + }) { + final CborListValue values = CborSerializable.cborTagValue( + cborBytes: bytes, + object: object, + hex: hex, + tags: Web3MessageTypes.walletRequest.tag, + ); + final List challeng = values.elementAt(2); + return Web3TonSignMessage( + address: TonAddress(values.elementAt(1)), + challeng: BytesUtils.toHexString(challeng, prefix: "0x"), + content: values.elementAt(3)); + } + + @override + Web3TonRequestMethods get method => Web3TonRequestMethods.signMessage; + + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([ + method.tag, + address.toFriendlyAddress(), + CborBytesValue(BytesUtils.fromHexString(challeng)), + content + ]), + type.tag); + } + + @override + Map toJson() { + return {"address": address.toFriendlyAddress(), "challeng": challeng}; + } + + List chalengBytes() { + return BytesUtils.fromHexString(challeng); + } + + @override + TonAddress? get account => address; + @override + Web3TonRequest, Web3TonSignMessage> toRequest({ + required Web3RequestApplicationInformation request, + required Web3APPAuthentication authenticated, + required TheOpenNetworkChain chain, + }) { + return Web3TonRequest, Web3TonSignMessage>( + params: this, + authenticated: authenticated, + chain: chain, + info: request, + ); + } +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/params/models/transaction.dart b/mrt_wallet/lib/wallet/web3/networks/ton/params/models/transaction.dart new file mode 100644 index 00000000..4d90b6ab --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/params/models/transaction.dart @@ -0,0 +1,179 @@ +import 'package:blockchain_utils/cbor/cbor.dart'; +import 'package:blockchain_utils/utils/utils.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/wallet/models/chain/chain/chain.dart'; +import 'package:mrt_wallet/wallet/web3/core/core.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/constant/constants/constant.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/methods/methods.dart'; +import 'package:mrt_wallet/wallet/web3/networks/ton/params/core/request.dart'; +import 'package:mrt_wallet/wallet/web3/validator/web3_validator_utils.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class Web3TonTransactionMessage with CborSerializable { + final TonAddress address; + final BigInt amount; + final Cell? stateInit; + final Cell? payload; + + const Web3TonTransactionMessage( + {required this.address, + required this.amount, + required this.stateInit, + required this.payload}); + factory Web3TonTransactionMessage.fromJson(Map json, + {int? workchain}) { + const method = Web3TonRequestMethods.sendTransaction; + return Web3TonTransactionMessage( + address: Web3ValidatorUtils.parseAddress( + json: json, + key: "address", + method: method, + onParse: (address) => + TonAddress(address, forceWorkchain: workchain), + addressName: Web3TonConst.addressName), + amount: Web3ValidatorUtils.parseBigInt( + key: "amount", method: method, json: json), + stateInit: Web3ValidatorUtils.parseTonCell( + key: "stateInit", method: method, json: json), + payload: Web3ValidatorUtils.parseTonCell( + key: "payload", method: method, json: json)); + } + factory Web3TonTransactionMessage.deserialize( + {List? bytes, CborObject? object, String? hex}) { + final CborListValue values = CborSerializable.cborTagValue( + cborBytes: bytes, + object: object, + hex: hex, + tags: Web3TonConst.sendTransactionMessagesTag); + final List? stateInitBytes = values.elementAt(2); + final List? payloadBytes = values.elementAt(3); + return Web3TonTransactionMessage( + address: TonAddress(values.elementAt(0)), + amount: values.elementAt(1), + stateInit: + stateInitBytes == null ? null : Cell.fromBytes(stateInitBytes), + payload: payloadBytes == null ? null : Cell.fromBytes(payloadBytes)); + } + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([ + address.toFriendlyAddress(), + amount, + stateInit == null ? null : CborBytesValue(stateInit!.toBoc()), + payload == null ? null : CborBytesValue(payload!.toBoc()), + ]), + Web3TonConst.sendTransactionMessagesTag); + } + + Map toJson() { + return { + "address": address.toFriendlyAddress(), + "amount": amount, + "stateInit": stateInit, + "payload": payload + }; + } +} + +class Web3TonSendTransactionResponse { + final String boc; + final String txHash; + const Web3TonSendTransactionResponse( + {required this.boc, required this.txHash}); + Map toJson() { + return {"boc": boc, "tx_hash": txHash}; + } +} + +class Web3TonSendTransaction + extends Web3TonRequestParam { + @override + final TonAddress account; + final int validUntil; + final List messages; + + Web3TonSendTransaction( + {required this.account, + required this.validUntil, + required List messages}) + : messages = messages.imutable; + factory Web3TonSendTransaction.fromJson( + {required Map json, required TonAddress account}) { + const method = Web3TonRequestMethods.sendTransaction; + return Web3TonSendTransaction( + account: account, + validUntil: Web3ValidatorUtils.parseInt( + key: "validUntil", method: method, json: json), + messages: Web3ValidatorUtils.parseList( + key: "messages", method: method, json: json) + .map((e) => Web3TonTransactionMessage.fromJson( + Web3ValidatorUtils.isValidMap>(e), + workchain: account.workChain)) + .toList(), + ); + } + + factory Web3TonSendTransaction.deserialize( + {List? bytes, CborObject? object, String? hex}) { + final CborListValue values = CborSerializable.cborTagValue( + cborBytes: bytes, + object: object, + hex: hex, + tags: Web3MessageTypes.walletRequest.tag); + return Web3TonSendTransaction( + account: TonAddress(values.elementAt(1)), + messages: values + .elemetAs(2) + .value + .cast() + .map((e) => Web3TonTransactionMessage.deserialize(object: e)) + .toList(), + validUntil: values.elementAt(3)); + } + + @override + Web3TonRequestMethods get method => Web3TonRequestMethods.sendTransaction; + + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([ + method.tag, + account.toFriendlyAddress(), + CborListValue.fixedLength(messages.map((e) => e.toCbor()).toList()), + validUntil + ]), + type.tag); + } + + @override + Map toJson() { + return { + "account": account.toFriendlyAddress(), + "messages": + StringUtils.fromJson(messages.map((e) => e.toJson()).toList()), + "validUntil": validUntil.toRadix16 + }; + } + + @override + Object? toJsWalletResponse(Web3TonSendTransactionResponse response) { + return response.toJson(); + } + + @override + Web3TonRequest + toRequest( + {required Web3RequestApplicationInformation request, + required Web3APPAuthentication authenticated, + required TheOpenNetworkChain chain}) { + return Web3TonRequest( + params: this, + authenticated: authenticated, + chain: chain, + info: request); + } +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/params/params.dart b/mrt_wallet/lib/wallet/web3/networks/ton/params/params.dart new file mode 100644 index 00000000..5848522a --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/params/params.dart @@ -0,0 +1,4 @@ +export 'core/request.dart'; +export 'models/request_account.dart'; +export 'models/transaction.dart'; +export 'models/sign_message.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/permission/models/account.dart b/mrt_wallet/lib/wallet/web3/networks/ton/permission/models/account.dart new file mode 100644 index 00000000..3e742402 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/permission/models/account.dart @@ -0,0 +1,59 @@ +import 'package:blockchain_utils/cbor/cbor.dart'; +import 'package:mrt_wallet/app/serialization/cbor/cbor.dart'; +import 'package:mrt_wallet/wallet/constant/tags/constant.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/web3/core/permission/types/account.dart'; +import 'package:mrt_wallet/crypto/derivation/derivation.dart'; +import 'package:ton_dart/ton_dart.dart'; + +class Web3TonChainAccount extends Web3ChainAccount { + final int workChain; + Web3TonChainAccount( + {required super.keyIndex, + required super.address, + required super.defaultAddress, + required this.workChain}); + factory Web3TonChainAccount.fromChainAccount( + {required ITonAddress address, + required int workChain, + required bool isDefault}) { + return Web3TonChainAccount( + keyIndex: address.keyIndex, + address: address.networkAddress, + workChain: workChain, + defaultAddress: isDefault); + } + + factory Web3TonChainAccount.deserialize( + {List? bytes, CborObject? object, String? hex}) { + final CborListValue values = CborSerializable.cborTagValue( + object: object, + cborBytes: bytes, + hex: hex, + tags: CborTagsConst.web3TonAccount); + return Web3TonChainAccount( + keyIndex: AddressDerivationIndex.fromCborBytesOrObject( + obj: values.getCborTag(0)), + address: TonAddress(values.elementAt(1)), + workChain: values.elementAt(2), + defaultAddress: values.elementAt(3)); + } + + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([ + keyIndex.toCbor(), + address.toFriendlyAddress(), + workChain, + defaultAddress + ]), + CborTagsConst.web3TonAccount); + } + + @override + String get addressStr => address.toFriendlyAddress(); + + @override + List get variabels => [keyIndex, addressStr, workChain]; +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/permission/models/permission.dart b/mrt_wallet/lib/wallet/web3/networks/ton/permission/models/permission.dart new file mode 100644 index 00000000..5ba9a201 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/permission/models/permission.dart @@ -0,0 +1,113 @@ +import 'package:blockchain_utils/cbor/cbor.dart'; +import 'package:mrt_wallet/app/core.dart'; +import 'package:mrt_wallet/wallet/models/chain/account.dart'; +import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; +import 'package:mrt_wallet/wallet/web3/core/permission/models/activity.dart'; +import 'package:mrt_wallet/wallet/web3/core/permission/types/chain.dart'; +import 'package:mrt_wallet/crypto/models/networks.dart'; +import 'package:ton_dart/ton_dart.dart'; +import 'account.dart'; + +class Web3TonChain + extends Web3Chain { + int _workChain; + int get currentChain => _workChain; + Web3TonChain._( + {required super.accounts, + required int workChain, + required super.activities}) + : _workChain = workChain; + @override + Web3TonChain clone() { + return Web3TonChain._( + accounts: activeAccounts, workChain: 0, activities: activities); + } + + factory Web3TonChain.create({int? workChain}) { + return Web3TonChain._( + accounts: const [], workChain: workChain ?? 0, activities: const []); + } + + @override + List get activeAccounts => super.activeAccounts.cast(); + + factory Web3TonChain.deserialize( + {List? bytes, CborObject? object, String? hex}) { + final CborListValue values = CborSerializable.cborTagValue( + cborBytes: bytes, hex: hex, object: object, tags: NetworkType.ton.tag); + return Web3TonChain._( + accounts: values + .elementAt>(0) + .map((e) => Web3TonChainAccount.deserialize(object: e)) + .toList(), + workChain: values.elementAt(1), + activities: values + .elementAt>(2) + .map((e) => Web3AccountAcitvity.deserialize(object: e)) + .toList()); + } + + @override + CborTagValue toCbor() { + return CborTagValue( + CborListValue.fixedLength([ + CborListValue.fixedLength( + activeAccounts.map((e) => e.toCbor()).toList()), + _workChain, + CborListValue.fixedLength(activities.map((e) => e.toCbor()).toList()), + ]), + network.tag); + } + + @override + NetworkType get network => NetworkType.ton; + + @override + ITonAddress getAccountPermission( + {required TonAddress address, required TheOpenNetworkChain chain}) { + try { + final permissionAccount = activeAccounts.firstWhere((e) => + e.address == address && + e.workChain == chain.network.coinParam.workchain); + final chainAccount = chain.addresses.firstWhere((e) { + return e.networkAddress == permissionAccount.address && + e.keyIndex == permissionAccount.keyIndex; + }); + return chainAccount; + } on StateError { + throw Web3RequestExceptionConst.missingPermission; + } + } + + @override + Web3TonChainAccount? getPermission(TonAddress address) { + return activeAccounts.firstWhereOrNull((e) => e.address == address); + } + + @override + void setActiveChain(TheOpenNetworkChain chain) { + _workChain = chain.network.coinParam.workchain; + } + + @override + Web3TonChain disconnect() { + return Web3TonChain._( + accounts: const [], workChain: 0, activities: activities); + } + + @override + List chainAccounts(TheOpenNetworkChain chain) { + final currentAccounts = activeAccounts + .where((e) => e.workChain == chain.network.coinParam.workchain) + .toList(); + List existsAccounts = []; + for (final i in chain.addresses) { + final chainAccount = currentAccounts.firstWhereOrNull( + (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); + if (chainAccount != null) { + existsAccounts.add(chainAccount); + } + } + return existsAccounts; + } +} diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/permission/permission.dart b/mrt_wallet/lib/wallet/web3/networks/ton/permission/permission.dart new file mode 100644 index 00000000..b6e8f1d0 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/permission/permission.dart @@ -0,0 +1,2 @@ +export 'models/account.dart'; +export 'models/permission.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/ton/ton.dart b/mrt_wallet/lib/wallet/web3/networks/ton/ton.dart new file mode 100644 index 00000000..9000d220 --- /dev/null +++ b/mrt_wallet/lib/wallet/web3/networks/ton/ton.dart @@ -0,0 +1,5 @@ +export 'constant/constants/constant.dart'; +export 'methods/methods.dart'; +export 'params/params.dart'; +export 'permission/permission.dart'; +export 'constant/constant.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/tron/constant/constants/constant.dart b/mrt_wallet/lib/wallet/web3/networks/tron/constant/constants/constant.dart index 7c851240..1059e77b 100644 --- a/mrt_wallet/lib/wallet/web3/networks/tron/constant/constants/constant.dart +++ b/mrt_wallet/lib/wallet/web3/networks/tron/constant/constants/constant.dart @@ -1,10 +1,8 @@ class Web3TronConst { - static const int requestAccountTag = 100; + static const String signTransaction = "tron_signTransaction"; + static const String signMessageV2 = "tron_signMessageV2"; static const String requestAccounts = "tron_requestAccounts"; - + static const int requestAccountTag = 100; static const int signTransactionTag = 101; - static const String signTransaction = "tron_signTransaction"; - static const int signMessageV2Tag = 102; - static const String signMessageV2 = "tron_signMessageV2"; } diff --git a/mrt_wallet/lib/wallet/web3/networks/tron/methods/methods.dart b/mrt_wallet/lib/wallet/web3/networks/tron/methods/methods.dart index 4f1424e4..1529b33a 100644 --- a/mrt_wallet/lib/wallet/web3/networks/tron/methods/methods.dart +++ b/mrt_wallet/lib/wallet/web3/networks/tron/methods/methods.dart @@ -1,4 +1,4 @@ -import 'package:mrt_wallet/app/utils/list/extention.dart'; +import 'package:mrt_wallet/app/utils/list/extension.dart'; import 'package:mrt_wallet/crypto/models/networks.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant/exception.dart'; import 'package:mrt_wallet/wallet/web3/core/core.dart'; diff --git a/mrt_wallet/lib/wallet/web3/networks/tron/params/core/request.dart b/mrt_wallet/lib/wallet/web3/networks/tron/params/core/request.dart index 3408172a..8413fce4 100644 --- a/mrt_wallet/lib/wallet/web3/networks/tron/params/core/request.dart +++ b/mrt_wallet/lib/wallet/web3/networks/tron/params/core/request.dart @@ -13,10 +13,14 @@ import 'package:mrt_wallet/wallet/web3/core/core.dart'; abstract class Web3TronPermissionRequestParam extends Web3TronRequestParam implements - Web3PermissionRequest { + Web3PermissionRequest { @override bool get isPermissionRequest => true; + @override + Object? toJsWalletResponse(Web3TronChain response) { + return null; + } } abstract class Web3TronRequestParam extends Web3RequestParams< diff --git a/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/account.dart b/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/account.dart index 427114b0..f0139967 100644 --- a/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/account.dart +++ b/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/account.dart @@ -25,13 +25,6 @@ class Web3TronChainAccount extends Web3ChainAccount { chain: chain, defaultAddress: isDefault); } - Web3TronChainAccount changeDefault(bool defaultAddress) { - return Web3TronChainAccount( - keyIndex: keyIndex, - address: address, - defaultAddress: defaultAddress, - chain: chain); - } factory Web3TronChainAccount.deserialize( {List? bytes, CborObject? object, String? hex}) { diff --git a/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/permission.dart b/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/permission.dart index 65df5582..9a4862f7 100644 --- a/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/permission.dart +++ b/mrt_wallet/lib/wallet/web3/networks/tron/permission/models/permission.dart @@ -21,7 +21,9 @@ class Web3TronChain @override Web3TronChain clone() { return Web3TronChain._( - accounts: accounts, currentChain: currentChain, activities: activities); + accounts: activeAccounts, + currentChain: currentChain, + activities: activities); } factory Web3TronChain.create({TronChainType? chain}) { @@ -32,7 +34,7 @@ class Web3TronChain } @override - List get accounts => super.accounts.cast(); + List get activeAccounts => super.activeAccounts.cast(); factory Web3TronChain.deserialize( {List? bytes, CborObject? object, String? hex}) { @@ -54,7 +56,8 @@ class Web3TronChain CborTagValue toCbor() { return CborTagValue( CborListValue.fixedLength([ - CborListValue.fixedLength(accounts.map((e) => e.toCbor()).toList()), + CborListValue.fixedLength( + activeAccounts.map((e) => e.toCbor()).toList()), _currentChain.genesisBlockNumber, CborListValue.fixedLength(activities.map((e) => e.toCbor()).toList()), ]), @@ -68,8 +71,8 @@ class Web3TronChain ITronAddress getAccountPermission( {required TronAddress address, required TronChain chain}) { try { - final permissionAccount = - accounts.firstWhere((e) => e.address == address); + final permissionAccount = activeAccounts.firstWhere((e) => + e.address == address && e.chain == chain.network.tronNetworkType); final chainAccount = chain.addresses.firstWhere((e) { return e.networkAddress == permissionAccount.address && e.keyIndex == permissionAccount.keyIndex; @@ -80,26 +83,12 @@ class Web3TronChain } } - @override - List currentChainAccounts(TronChain chain) { - final currentAccounts = - accounts.where((e) => e.chain == _currentChain).toList(); - List existsAccounts = []; - for (final i in chain.addresses) { - final chainAccount = currentAccounts.firstWhereOrNull( - (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); - if (chainAccount != null) { - existsAccounts.add(chainAccount); - } - } - return existsAccounts; - } - @override Web3TronChainAccount? getPermission(TronAddress address) { - return accounts.firstWhereOrNull((e) => e.address == address); + return activeAccounts.firstWhereOrNull((e) => e.address == address); } + @override void setActiveChain(TronChain chain) { _currentChain = chain.network.tronNetworkType; } @@ -111,5 +100,18 @@ class Web3TronChain } @override - bool hasPermission(TronChain chain) => currentChainAccounts(chain).isNotEmpty; + List chainAccounts(TronChain chain) { + final currentAccounts = activeAccounts + .where((e) => e.chain == chain.network.tronNetworkType) + .toList(); + List existsAccounts = []; + for (final i in chain.addresses) { + final chainAccount = currentAccounts.firstWhereOrNull( + (e) => e.addressStr == i.address.address && e.keyIndex == i.keyIndex); + if (chainAccount != null) { + existsAccounts.add(chainAccount); + } + } + return existsAccounts; + } } diff --git a/mrt_wallet/lib/wallet/web3/validator/web3_validator_utils.dart b/mrt_wallet/lib/wallet/web3/validator/web3_validator_utils.dart index 9e099e3e..ac0ff139 100644 --- a/mrt_wallet/lib/wallet/web3/validator/web3_validator_utils.dart +++ b/mrt_wallet/lib/wallet/web3/validator/web3_validator_utils.dart @@ -3,10 +3,7 @@ import 'package:mrt_wallet/app/core.dart'; import 'package:mrt_wallet/wallet/web3/constant/constant.dart'; import 'package:mrt_wallet/wallet/web3/core/methods/methods.dart'; import 'package:mrt_wallet/wallet/web3/core/exception/exception.dart'; - -typedef OnValueException = Web3RequestException Function(); -typedef OnValidate = T Function(K val, String key); -typedef OnRequestString = String Function(); +import 'package:ton_dart/ton_dart.dart'; class Web3ValidatorConst { static const String hexPrefix = "0x"; @@ -26,6 +23,18 @@ class Web3ValidatorUtils { return null; } + static T isValidMap?>(Object? data, + {String? name}) { + if (data == null && null is T) { + return null as T; + } + final toMap = MethodUtils.nullOnException(() => (data as Map).cast()); + if (toMap != null) { + return toMap as T; + } + throw Web3RequestExceptionConst.invalidMap(parameterName: name); + } + static T onValidate( {Object? value, required T Function() to, @@ -43,17 +52,17 @@ class Web3ValidatorUtils { /// check provider value is hex static T parseAddress( - {required T Function(String) onParse, + {required T Function(String address) onParse, required String key, required Web3RequestMethods method, - required Map? json}) { + required Map? json, + String addressName = ParameterNameConst.ethereumAddress}) { final value = (json?[key] ?? json?[StrUtils.toSnakeCase(key)])?.toString(); if (value == null && null is T) { return null as T; } if (value is! String) { - throw Web3RequestExceptionConst.invalidStringArgrument( - ParameterNameConst.ethereumAddress); + throw Web3RequestExceptionConst.invalidStringArgrument(addressName); } final addr = MethodUtils.nullOnException(() => onParse(value)); @@ -61,8 +70,7 @@ class Web3ValidatorUtils { if (addr != null) { return addr as T; } - throw Web3RequestExceptionConst.invalidAddressArgrument( - ParameterNameConst.ethereum); + throw Web3RequestExceptionConst.invalidAddressArgrument(addressName); } /// check provider value is hex @@ -86,7 +94,61 @@ class Web3ValidatorUtils { throw Web3RequestExceptionConst.invalidHexBytes(key); } - static T parseList({ + /// check provider value is hex + static T parseBase64({ + required String key, + required Web3RequestMethods method, + required Map? json, + }) { + final value = (json?[key] ?? json?[StrUtils.toSnakeCase(key)])?.toString(); + if (null is T && value == null) { + return null as T; + } + List? toBytes = (value ?? "").isEmpty + ? [] + : StringUtils.tryEncode(value, type: StringEncoding.base64) ?? + StringUtils.tryEncode(value, type: StringEncoding.base64UrlSafe); + if (toBytes != null) { + if (T == String) { + if (value!.isEmpty && null is T) return null as T; + return value as T; + } + return toBytes as T; + } + throw Web3RequestExceptionConst.invalidBase64Bytes(key); + } + + static T parseTonCell( + {required String key, + required Web3RequestMethods method, + required Map? json}) { + String? value = + (json?[key] ?? json?[StrUtils.toSnakeCase(key)])?.toString(); + if (value?.isEmpty ?? false) { + value = null; + } + if (null is T && value == null) { + return null as T; + } + Cell? cell = MethodUtils.nullOnException(() => Cell.fromBase64(value!)); + if (cell != null) { + return cell as T; + } + throw Web3RequestExceptionConst.invalidBase64Bytes(key); + } + + static T isValidList(Object? data, {String? name}) { + if (data == null && null is T) { + return null as T; + } + final toList = MethodUtils.nullOnException(() => List.from(data as List)); + if (toList != null) { + return toList as T; + } + throw Web3RequestExceptionConst.invalidMap(parameterName: name); + } + + static T parseList?, E>({ required String key, required Web3RequestMethods method, required Map? json, @@ -95,7 +157,7 @@ class Web3ValidatorUtils { if (null is T && value == null) { return null as T; } - final toList = MethodUtils.nullOnException(() => List.from(value)); + final toList = MethodUtils.nullOnException(() => (value as List).cast()); if (toList != null) { if (toList.isEmpty) { if (null is T) { @@ -105,10 +167,10 @@ class Web3ValidatorUtils { return toList as T; } } - throw Web3RequestExceptionConst.invalidHexBytes(key); + throw Web3RequestExceptionConst.invalidList(parameterName: key); } - static T parseMap({ + static T parseMap?>({ required String key, required Web3RequestMethods method, required Map? json, @@ -117,15 +179,15 @@ class Web3ValidatorUtils { if (null is T && value == null) { return null as T; } - final toMap = - MethodUtils.nullOnException(() => Map.from(value)); + final toMap = MethodUtils.nullOnException( + () => (value as Map).cast()); if (toMap != null) { return toMap as T; } - throw Web3RequestExceptionConst.invalidHexBytes(key); + throw Web3RequestExceptionConst.invalidMap(parameterName: key); } - static T parseString({ + static T parseString({ required String key, required Web3RequestMethods method, required Map? json, @@ -141,7 +203,7 @@ class Web3ValidatorUtils { } /// parse dynamic to bigint - static T parseBigInt({ + static T parseBigInt({ required String key, required Web3RequestMethods method, required Map? json, @@ -157,10 +219,10 @@ class Web3ValidatorUtils { throw Web3RequestExceptionConst.invalidNumbers(key); } - static T parseInt({ + static T parseInt({ required String key, required Web3RequestMethods method, - Map? json, + required Map? json, }) { final value = json?[key] ?? json?[StrUtils.toSnakeCase(key)]; if (null is T && value == null) { diff --git a/mrt_wallet/macos/Runner/MainFlutterWindow.swift b/mrt_wallet/macos/Runner/MainFlutterWindow.swift index 8aa0f6cd..2145853c 100644 --- a/mrt_wallet/macos/Runner/MainFlutterWindow.swift +++ b/mrt_wallet/macos/Runner/MainFlutterWindow.swift @@ -4,7 +4,7 @@ import FlutterMacOS class MainFlutterWindow: NSWindow { override func awakeFromNib() { let flutterViewController = FlutterViewController.init() - flutterViewController.backgroundColor = NSColor.white +// flutterViewController.backgroundColor = NSColor.white let windowFrame = self.frame self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) diff --git a/mrt_wallet/pubspec.lock b/mrt_wallet/pubspec.lock index c7f5bf18..47514dfd 100644 --- a/mrt_wallet/pubspec.lock +++ b/mrt_wallet/pubspec.lock @@ -376,10 +376,10 @@ packages: dependency: "direct main" description: name: on_chain - sha256: "8ac4dbef8c7fa6817e3853d1d4b6ff66a9367ab307ed54b9b3641b4f0793b1fb" + sha256: ea828a1f62ce4afdb3fb7d3e05d3e1e9dd3b8a356f44dfa83586d30b5da470a5 url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.2.0" package_config: dependency: transitive description: @@ -557,10 +557,10 @@ packages: dependency: "direct main" description: name: ton_dart - sha256: "997b08219220807df4aaceaaa8038c2e722ae76c979cf6a7478bd52f58d222d8" + sha256: "2112e3cdcb64162bde67cc1c6a3d140e1f29273c85ddba046201d37cc51a9b03" url: "https://pub.dev" source: hosted - version: "0.0.4" + version: "0.1.1" typed_data: dependency: transitive description: @@ -581,10 +581,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.5" watcher: dependency: transitive description: diff --git a/mrt_wallet/pubspec.yaml b/mrt_wallet/pubspec.yaml index a6b5cb3a..8bcbdc6f 100644 --- a/mrt_wallet/pubspec.yaml +++ b/mrt_wallet/pubspec.yaml @@ -57,16 +57,14 @@ dependencies: xrpl_dart: ^4.6.0 - on_chain: ^4.1.0 + on_chain: ^4.2.0 # on_chain: # path: ../../../bitcoin/on_chain cosmos_sdk: ^1.3.0 - - ton_dart: ^0.0.4 - + ton_dart: ^0.1.1 polkadot_dart: ^1.0.0 # The following adds the Cupertino Icons font to your application. diff --git a/mrt_wallet/web/index.html b/mrt_wallet/web/index.html index f90dd478..3e18acd3 100644 --- a/mrt_wallet/web/index.html +++ b/mrt_wallet/web/index.html @@ -1,11 +1,36 @@ - - - + + + - MRT wallet + + + + + + + + + + + + + MRT Wallet +

cSU^E8vzH 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̷^j72X2Ei}lM+>T@)&U$1Hl;Tz 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