From 7e7df546e6eeb7a5ef4c81fd821338d8306ae4bd Mon Sep 17 00:00:00 2001 From: Mohsen <56779182+mrtnetwork@users.noreply.github.com> Date: Thu, 11 Jan 2024 18:19:02 +0330 Subject: [PATCH] v1.0.0 --- CHANGELOG.md | 5 + .../multi_sig_transaction_example.dart | 2 +- example/pubspec.yaml | 2 +- example/test/widget_test.dart | 29 ---- lib/address/core.dart | 2 + lib/ethereum/address/evm_address.dart | 8 ++ .../transaction/eth_transaction_builder.dart | 6 +- lib/tron/address/tron_address.dart | 17 ++- .../contract/account/permission_type.dart | 16 +-- .../parsed_contract_request.dart | 2 +- lib/tron/provider/methods/get_account.dart | 6 +- .../methods/get_account_resource.dart | 6 +- lib/tron/provider/methods/get_brokerage.dart | 4 +- lib/tron/provider/models/account_info.dart | 126 +++++++++--------- .../provider/models/account_resource.dart | 10 +- lib/tron/provider/provider/provider.dart | 1 + lib/tron/utils/tron_helper.dart | 27 ++-- pubspec.yaml | 4 +- 18 files changed, 136 insertions(+), 137 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97ee77e..0e5e0d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.0.0 +- Resolved encoding and decoding issues with Tron operations.. +- Corrected Eip1559 fee calculation in ETHTransactionBuilder. +- Updated dependencies to ensure compatibility and leverage the latest features. + ## 0.0.1 * TODO: Release. diff --git a/example/lib/example/tron/transactions/multi_sig_transaction_example.dart b/example/lib/example/tron/transactions/multi_sig_transaction_example.dart index bd86119..a3f563d 100644 --- a/example/lib/example/tron/transactions/multi_sig_transaction_example.dart +++ b/example/lib/example/tron/transactions/multi_sig_transaction_example.dart @@ -21,7 +21,7 @@ void main() async { } /// now get all permission (active and owner) - final List permissions = [ + final List permissions = [ sig.ownerPermission, ...sig.activePermissions ]; diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 58bf9a0..1360ab0 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -34,7 +34,7 @@ dependencies: path: ../ web_socket_channel: ^2.4.0 http: ^1.1.0 - blockchain_utils: ^1.5.0 + blockchain_utils: ^1.6.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 092d222..8b13789 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -1,30 +1 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:example/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/lib/address/core.dart b/lib/address/core.dart index 5994664..4bb685c 100644 --- a/lib/address/core.dart +++ b/lib/address/core.dart @@ -11,4 +11,6 @@ abstract class BaseHexAddress { /// Converts the hexadecimal address to a bytes. List toBytes(); + + String toHex(); } diff --git a/lib/ethereum/address/evm_address.dart b/lib/ethereum/address/evm_address.dart index 7144d23..96f91e9 100644 --- a/lib/ethereum/address/evm_address.dart +++ b/lib/ethereum/address/evm_address.dart @@ -49,4 +49,12 @@ class ETHAddress implements BaseHexAddress { String toString() { return address; } + + /// Constant representing the length of the ETH address in bytes + static const int lengthInBytes = 21; + + @override + String toHex() { + return address; + } } diff --git a/lib/ethereum/transaction/eth_transaction_builder.dart b/lib/ethereum/transaction/eth_transaction_builder.dart index 7d369f5..ac8985f 100644 --- a/lib/ethereum/transaction/eth_transaction_builder.dart +++ b/lib/ethereum/transaction/eth_transaction_builder.dart @@ -236,7 +236,7 @@ class ETHTransactionBuilder { _gasPrice = await rpc.request(RPCGetGasPrice()); } else { final historical = await rpc.request(RPCGetFeeHistory( - blockCount: 20, + blockCount: 10, newestBlock: BlockTagOrNumber.pending, rewardPercentiles: [25, 50, 75])); if (historical == null) { @@ -281,8 +281,8 @@ class ETHTransactionBuilder { if (_type == null) { final historical = await rpc.request(RPCGetFeeHistory( blockCount: 20, - newestBlock: BlockTagOrNumber.pending, - rewardPercentiles: [25, 50, 75])); + newestBlock: BlockTagOrNumber.latest, + rewardPercentiles: [25, 60, 90])); if (historical != null) { _type = ETHTransactionType.eip1559; } else { diff --git a/lib/tron/address/tron_address.dart b/lib/tron/address/tron_address.dart index ed845fd..98c8d65 100644 --- a/lib/tron/address/tron_address.dart +++ b/lib/tron/address/tron_address.dart @@ -1,6 +1,7 @@ import 'package:on_chain/address/core.dart'; import 'package:blockchain_utils/bip/address/trx_addr.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; +import 'package:on_chain/ethereum/address/evm_address.dart'; /// Class representing a Tron address, implementing the BaseHexAddress interface class TronAddress implements BaseHexAddress { @@ -28,7 +29,7 @@ class TronAddress implements BaseHexAddress { factory TronAddress(String address, {bool? visible}) { try { if (visible == null) { - if (StringUtils.isHex(address)) { + if (StringUtils.isHexBytes(address)) { return TronAddress.fromBytes(BytesUtils.fromHexString(address)); } final decode = TrxAddrDecoder().decodeAddr(address); @@ -84,4 +85,18 @@ class TronAddress implements BaseHexAddress { /// Constant representing the length of the Tron address in bytes static const int lengthInBytes = 21; + + /// To Ethereum address + ETHAddress toETHAddress() { + final toBytes = BytesUtils.fromHexString(_hexAddress); + + /// remove tron 0x41 prefix from bytes + return ETHAddress.fromBytes( + toBytes.sublist(toBytes.length - ETHAddress.lengthInBytes)); + } + + @override + String toHex() { + return _hexAddress; + } } diff --git a/lib/tron/models/contract/account/permission_type.dart b/lib/tron/models/contract/account/permission_type.dart index 6695a3d..0616c53 100644 --- a/lib/tron/models/contract/account/permission_type.dart +++ b/lib/tron/models/contract/account/permission_type.dart @@ -35,18 +35,18 @@ class PermissionType implements TronEnumerate { /// Returns the [PermissionType] associated with the given [name]. /// /// Returns `null` if no match is found. - static PermissionType? fromName(String? name) { - try { - return values.firstWhere((element) => element.name == name); - } on StateError { - return null; - } + static PermissionType fromName(String? name, + {PermissionType? defaultPermission}) { + return values.firstWhere((element) => element.name == name, + orElse: defaultPermission == null ? null : () => defaultPermission); } /// Returns the [PermissionType] associated with the given [value]. /// /// Throws an error if no match is found. - static PermissionType fromValue(int value) { - return values.firstWhere((element) => element.value == value); + static PermissionType fromValue(int value, + {PermissionType? defaultPermission}) { + return values.firstWhere((element) => element.value == value, + orElse: defaultPermission == null ? null : () => defaultPermission); } } diff --git a/lib/tron/models/parsed_request/parsed_contract_request.dart b/lib/tron/models/parsed_request/parsed_contract_request.dart index c579c44..a4a1616 100644 --- a/lib/tron/models/parsed_request/parsed_contract_request.dart +++ b/lib/tron/models/parsed_request/parsed_contract_request.dart @@ -77,7 +77,7 @@ class ParsedSmartContractRequest { String? get error => isSuccess ? null - : (respose["result"]["message"] as String?)?.split(":").last.trim() ?? + : (respose["result"]["message"] as String?) ?? "${respose["transaction"]?["ret"]}"; @override String toString() { diff --git a/lib/tron/provider/methods/get_account.dart b/lib/tron/provider/methods/get_account.dart index bfcd155..50df8c8 100644 --- a/lib/tron/provider/methods/get_account.dart +++ b/lib/tron/provider/methods/get_account.dart @@ -6,7 +6,7 @@ import 'package:on_chain/tron/provider/models/account_info.dart'; /// Query information about an account, including TRX balance, TRC-10 balances, stake information and vote information and permissions etc. /// [developers.tron.network](https://developers.tron.network/reference/account-getaccount). class TronRequestGetAccount - extends TVMRequestParam> { + extends TVMRequestParam> { TronRequestGetAccount({required this.address, this.visible = true}); /// address @@ -23,11 +23,11 @@ class TronRequestGetAccount } @override - TronAccount? onResonse(result) { + TronAccountModel? onResonse(result) { if (result.isEmpty) { return null; } - return TronAccount.fromJson(result); + return TronAccountModel.fromJson(result); } @override diff --git a/lib/tron/provider/methods/get_account_resource.dart b/lib/tron/provider/methods/get_account_resource.dart index 11db378..7ef928c 100644 --- a/lib/tron/provider/methods/get_account_resource.dart +++ b/lib/tron/provider/methods/get_account_resource.dart @@ -6,7 +6,7 @@ import 'package:on_chain/tron/provider/models/account_resource.dart'; /// Query the resource information of an account(bandwidth,energy,etc). /// [developers.tron.network](https://developers.tron.network/reference/getaccountresource). class TronRequestGetAccountResource - extends TVMRequestParam> { + extends TVMRequestParam> { TronRequestGetAccountResource({required this.address, this.visible = true}); /// Address @@ -24,8 +24,8 @@ class TronRequestGetAccountResource } @override - AccountResource onResonse(result) { - return AccountResource.fromJson(result); + AccountResourceModel onResonse(result) { + return AccountResourceModel.fromJson(result); } @override diff --git a/lib/tron/provider/methods/get_brokerage.dart b/lib/tron/provider/methods/get_brokerage.dart index da6e294..803140e 100644 --- a/lib/tron/provider/methods/get_brokerage.dart +++ b/lib/tron/provider/methods/get_brokerage.dart @@ -1,6 +1,6 @@ +import 'package:on_chain/tron/address/tron_address.dart'; import 'package:on_chain/tron/provider/core/request.dart'; import 'package:on_chain/tron/provider/methods/request_methods.dart'; -import 'package:on_chain/tron/provider/models/account_info.dart'; /// Get SR brokerage ratio /// [developers.tron.network](https://developers.tron.network/reference/wallet-getbrokerage). @@ -9,7 +9,7 @@ class TronRequestGetBrokerage TronRequestGetBrokerage({required this.address, this.visible = true}); /// Super representative's account address - final TronAccount address; + final TronAddress address; @override final bool visible; diff --git a/lib/tron/provider/models/account_info.dart b/lib/tron/provider/models/account_info.dart index c40d96f..941ebc5 100644 --- a/lib/tron/provider/models/account_info.dart +++ b/lib/tron/provider/models/account_info.dart @@ -2,31 +2,31 @@ import 'package:on_chain/tron/models/contract/base_contract/common.dart'; import 'package:on_chain/tron/models/contract/account/permission_type.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; -class TronAccount { +class TronAccountModel { final String? accountName; final String address; final BigInt balance; final BigInt createTime; final BigInt? latestOperationTime; - final List frozenSupply; + final List frozenSupply; final String? assetIssuedName; final int? freeNetUsage; final BigInt? latestConsumeFreeTime; final int netWindowSize; final bool netWindowOptimized; - final TronAccountResource accountResource; - final AccountPermission ownerPermission; - - final List activePermissions; - final AccountPermission? witnessPermission; - final List frozenV2; - final List unfrozenV2; - final List assetV2; + final TronAccountResourceModel accountResource; + final AccountPermissionModel ownerPermission; + + final List activePermissions; + final AccountPermissionModel? witnessPermission; + final List frozenV2; + final List unfrozenV2; + final List assetV2; final String? assetIssuedID; - final List freeAssetNetUsageV2; + final List freeAssetNetUsageV2; final bool assetOptimized; - const TronAccount._({ + const TronAccountModel._({ this.accountName, required this.address, required this.balance, @@ -50,47 +50,49 @@ class TronAccount { required this.assetOptimized, }); - factory TronAccount.fromJson(Map json) { - return TronAccount._( + factory TronAccountModel.fromJson(Map json) { + return TronAccountModel._( accountName: json['account_name'], address: json['address'], balance: BigintUtils.parse(json['balance'] ?? BigInt.zero), createTime: BigintUtils.parse(json['create_time']), latestOperationTime: BigintUtils.tryParse(json['latest_opration_time']), frozenSupply: (json['frozen_supply'] as List?) - ?.map((supply) => FrozenSupply.fromJson(supply)) + ?.map((supply) => FrozenSupplyModel.fromJson(supply)) .toList() ?? - [], + [], assetIssuedName: json['asset_issued_name'], freeNetUsage: json['free_net_usage'], latestConsumeFreeTime: BigintUtils.tryParse(json['latest_consume_free_time']), netWindowSize: json['net_window_size'], netWindowOptimized: json['net_window_optimized'], - accountResource: TronAccountResource.fromJson(json['account_resource']), - ownerPermission: AccountPermission.fromJson(json['owner_permission']), + accountResource: + TronAccountResourceModel.fromJson(json['account_resource']), + ownerPermission: + AccountPermissionModel.fromJson(json['owner_permission']), activePermissions: (json['active_permission'] as List) - .map((permission) => AccountPermission.fromJson(permission)) + .map((permission) => AccountPermissionModel.fromJson(permission)) .toList(), witnessPermission: json["witness_permission"] == null ? null - : AccountPermission.fromJson(json['witness_permission']), + : AccountPermissionModel.fromJson(json['witness_permission']), frozenV2: (json['frozenV2'] as List) - .map((frozen) => FrozenV2.fromJson(frozen)) + .map((frozen) => FrozenV2Model.fromJson(frozen)) .toList(), unfrozenV2: (json['unfrozenV2'] as List?) - ?.map((unfrozen) => UnfrozenV2.fromJson(unfrozen)) + ?.map((unfrozen) => UnfrozenV2Model.fromJson(unfrozen)) .toList() ?? - [], + [], assetV2: (json['assetV2'] as List?) - ?.map((asset) => AssetV2.fromJson(asset)) + ?.map((asset) => AssetV2Model.fromJson(asset)) .toList() ?? - [], + [], assetIssuedID: json['asset_issued_ID'], freeAssetNetUsageV2: (json['free_asset_net_usageV2'] as List?) - ?.map((usage) => FreeAssetNetUsageV2.fromJson(usage)) + ?.map((usage) => FreeAssetNetUsageV2Model.fromJson(usage)) .toList() ?? - [], + [], assetOptimized: json['asset_optimized'], ); } @@ -124,15 +126,15 @@ class TronAccount { } } -class AccountPermission { +class AccountPermissionModel { final String type; final int? id; final String? permissionName; final BigInt threshold; final String? operations; - final List keys; + final List keys; - AccountPermission._({ + AccountPermissionModel._({ required this.type, this.id, required this.permissionName, @@ -141,17 +143,17 @@ class AccountPermission { required this.keys, }); - factory AccountPermission.fromJson(Map json) { - return AccountPermission._( + factory AccountPermissionModel.fromJson(Map json) { + return AccountPermissionModel._( type: json['type'] ?? PermissionType.owner.name, id: json['id'], permissionName: json['permission_name'], threshold: BigintUtils.parse(json['threshold']), operations: json['operations'], keys: (json['keys'] as List?) - ?.map((e) => PermissionKeys.fromJson(e)) + ?.map((e) => PermissionKeysModel.fromJson(e)) .toList() ?? - [], + [], ); } @@ -170,10 +172,10 @@ class AccountPermission { } } -class PermissionKeys { - PermissionKeys._({required this.address, required this.weight}); - factory PermissionKeys.fromJson(Map json) { - return PermissionKeys._( +class PermissionKeysModel { + PermissionKeysModel._({required this.address, required this.weight}); + factory PermissionKeysModel.fromJson(Map json) { + return PermissionKeysModel._( address: json["address"], weight: BigintUtils.parse(json["weight"])); } final String address; @@ -185,17 +187,17 @@ class PermissionKeys { } } -class FrozenSupply { +class FrozenSupplyModel { final BigInt frozenBalance; final BigInt expireTime; - FrozenSupply._({ + FrozenSupplyModel._({ required this.frozenBalance, required this.expireTime, }); - factory FrozenSupply.fromJson(Map json) { - return FrozenSupply._( + factory FrozenSupplyModel.fromJson(Map json) { + return FrozenSupplyModel._( frozenBalance: BigInt.from(json['frozen_balance']), expireTime: BigInt.from(json['expire_time']), ); @@ -212,17 +214,17 @@ class FrozenSupply { } } -class FrozenV2 { +class FrozenV2Model { final BigInt amount; final String type; - FrozenV2._({ + FrozenV2Model._({ required this.amount, required this.type, }); - factory FrozenV2.fromJson(Map json) { - return FrozenV2._( + factory FrozenV2Model.fromJson(Map json) { + return FrozenV2Model._( amount: BigintUtils.tryParse(json["amount"]) ?? BigInt.zero, type: json['type'] ?? ResourceCode.bandWidth.name, ); @@ -239,19 +241,19 @@ class FrozenV2 { } } -class UnfrozenV2 { +class UnfrozenV2Model { final String? type; final BigInt unfreezeAmount; final BigInt unfreezeExpireTime; - UnfrozenV2._({ + UnfrozenV2Model._({ required this.type, required this.unfreezeAmount, required this.unfreezeExpireTime, }); - factory UnfrozenV2.fromJson(Map json) { - return UnfrozenV2._( + factory UnfrozenV2Model.fromJson(Map json) { + return UnfrozenV2Model._( type: json['type'], unfreezeAmount: BigintUtils.parse(json['unfreeze_amount']), unfreezeExpireTime: BigintUtils.parse(json['unfreeze_expire_time']), @@ -270,17 +272,17 @@ class UnfrozenV2 { } } -class AssetV2 { +class AssetV2Model { final String key; final BigInt value; - AssetV2._({ + AssetV2Model._({ required this.key, required this.value, }); - factory AssetV2.fromJson(Map json) { - return AssetV2._( + factory AssetV2Model.fromJson(Map json) { + return AssetV2Model._( key: json['key'], value: BigintUtils.parse(json["value"]), ); @@ -297,17 +299,17 @@ class AssetV2 { } } -class FreeAssetNetUsageV2 { +class FreeAssetNetUsageV2Model { final String key; final BigInt value; - FreeAssetNetUsageV2._({ + FreeAssetNetUsageV2Model._({ required this.key, required this.value, }); - factory FreeAssetNetUsageV2.fromJson(Map json) { - return FreeAssetNetUsageV2._( + factory FreeAssetNetUsageV2Model.fromJson(Map json) { + return FreeAssetNetUsageV2Model._( key: json['key'], value: BigintUtils.parse(json['value']), ); @@ -324,19 +326,19 @@ class FreeAssetNetUsageV2 { } } -class TronAccountResource { +class TronAccountResourceModel { final int energyWindowSize; final BigInt? delegatedFrozenV2BalanceForEnergy; final bool energyWindowOptimized; - TronAccountResource._({ + TronAccountResourceModel._({ required this.energyWindowSize, required this.delegatedFrozenV2BalanceForEnergy, required this.energyWindowOptimized, }); - factory TronAccountResource.fromJson(Map json) { - return TronAccountResource._( + factory TronAccountResourceModel.fromJson(Map json) { + return TronAccountResourceModel._( energyWindowSize: json['energy_window_size'], delegatedFrozenV2BalanceForEnergy: BigintUtils.tryParse(json['delegated_frozenV2_balance_for_energy']), diff --git a/lib/tron/provider/models/account_resource.dart b/lib/tron/provider/models/account_resource.dart index ad42c62..562fb37 100644 --- a/lib/tron/provider/models/account_resource.dart +++ b/lib/tron/provider/models/account_resource.dart @@ -1,6 +1,6 @@ import 'package:blockchain_utils/blockchain_utils.dart'; -class AccountResource { +class AccountResourceModel { final BigInt freeNetUsed; final BigInt freeNetLimit; final BigInt netLimit; @@ -16,7 +16,7 @@ class AccountResource { int get howManyVote => tronPowerLimit - tronPowerUsed; BigInt get howManyBandwIth => totalBandWith - totalBandWithUsed; - AccountResource({ + AccountResourceModel({ required this.freeNetUsed, required this.freeNetLimit, required this.netLimit, @@ -34,7 +34,7 @@ class AccountResource { } } - factory AccountResource.empty() => AccountResource( + factory AccountResourceModel.empty() => AccountResourceModel( freeNetUsed: BigInt.zero, freeNetLimit: BigInt.zero, netLimit: BigInt.zero, @@ -44,8 +44,8 @@ class AccountResource { tronPowerLimit: 0, tronPowerUsed: 0); - factory AccountResource.fromJson(Map json) { - return AccountResource( + factory AccountResourceModel.fromJson(Map json) { + return AccountResourceModel( freeNetLimit: BigintUtils.tryParse(json["freeNetLimit"]) ?? BigInt.zero, freeNetUsed: BigintUtils.tryParse(json["freeNetUsed"]) ?? BigInt.zero, netLimit: BigintUtils.tryParse(json["NetLimit"]) ?? BigInt.zero, diff --git a/lib/tron/provider/provider/provider.dart b/lib/tron/provider/provider/provider.dart index 830c399..d4d4712 100644 --- a/lib/tron/provider/provider/provider.dart +++ b/lib/tron/provider/provider/provider.dart @@ -22,6 +22,7 @@ class TronProvider { final data = request.method.isPost ? await rpc.post(params, timeout) : await rpc.get(params, timeout); + return request.onResonse(data); } } diff --git a/lib/tron/utils/tron_helper.dart b/lib/tron/utils/tron_helper.dart index 93b947f..8483f6b 100644 --- a/lib/tron/utils/tron_helper.dart +++ b/lib/tron/utils/tron_helper.dart @@ -22,20 +22,17 @@ class TronHelper { static List decodePermissionOperation( final String operations) { List accountPermissions = []; - final bytes = BytesUtils.fromHexString(operations); - for (int index = 0; index < bytes.length; index++) { - int byte = bytes[index]; - int bitIndex = 0; - while (bitIndex < 8) { - if ((byte & (1 << bitIndex)) != 0) { - int permissionValue = index * 8 + bitIndex; - final findPermission = + final operationBytes = BytesUtils.fromHexString(operations); + for (int i = 0; i < 32; i++) { + for (int j = 0; j < 8; j++) { + if ((operationBytes[i] >> j & 0x1) == 1) { + final int permissionValue = i * 8 + j; + final operation = TransactionContractType.findByValue(permissionValue); - if (findPermission != null) { - accountPermissions.add(findPermission); + if (operation != null) { + accountPermissions.add(operation); } } - bitIndex++; } } return accountPermissions; @@ -45,12 +42,10 @@ class TronHelper { static List encodePermissionOperations( List values) { final valuesInt = values.map((e) => e.value).toList(); - final List newBuffer = List.filled(32, 0); + final List operationBuffer = List.filled(32, 0); for (int value in valuesInt) { - final int byteIndex = value ~/ 8; - final int bitIndex = value % 8; - newBuffer[byteIndex] |= (1 << bitIndex); + operationBuffer[value ~/ 8] |= (1 << (value % 8)); } - return List.from(newBuffer); + return List.from(operationBuffer); } } diff --git a/pubspec.yaml b/pubspec.yaml index 041f821..4f8d51b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: on_chain description: Streamline Ethereum and Tron operations. Effortlessly create transactions, interact with smart contracts, sign, and send transactions for a seamless blockchain experience. -version: 0.0.1 +version: 1.0.0 homepage: "https://github.com/mrtnetwork/on_chain" repository: "https://github.com/mrtnetwork/on_chain" Author: mrhaydari.t@gmail.com @@ -17,7 +17,7 @@ environment: dependencies: - blockchain_utils: ^1.5.0 + blockchain_utils: ^1.6.0 dev_dependencies: test: ^1.24.6