From 8c9c1d306c92551733344c498ed4ec839ca75529 Mon Sep 17 00:00:00 2001 From: Egor Komarov Date: Thu, 30 Oct 2025 12:31:50 +0100 Subject: [PATCH 1/6] feat(EWM-582): add NFT data provider and update related repository methods --- lib/src/models/transport_strategy.dart | 2 ++ lib/src/nekoton_repository.dart | 5 ++++ .../nft_repository/nft_data_provider.dart | 11 ++++++++ .../nft_repository/nft_repository.dart | 1 + .../nft_repository_abstract.dart | 2 +- .../nft_repository/nft_repository_impl.dart | 26 ++++++++++++++++++- test/src/nft_repository_test.dart | 19 +++++++++++--- 7 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 lib/src/repositories/nft_repository/nft_data_provider.dart diff --git a/lib/src/models/transport_strategy.dart b/lib/src/models/transport_strategy.dart index 8f7cf03..4526937 100644 --- a/lib/src/models/transport_strategy.dart +++ b/lib/src/models/transport_strategy.dart @@ -69,6 +69,8 @@ abstract class TransportStrategy { /// If transport has currency API, then it must return base URL for it. String? get currencyApiBaseUrl; + String? get nftApiBaseUrl; + PollingConfig get pollingConfig; /// Create token wallet subscribtion. diff --git a/lib/src/nekoton_repository.dart b/lib/src/nekoton_repository.dart index bc382d9..ca24db6 100644 --- a/lib/src/nekoton_repository.dart +++ b/lib/src/nekoton_repository.dart @@ -75,6 +75,11 @@ class NekotonRepository @override AbiLoader get abiLoader => _abiLoader; + late final NftDataProvider _nftDataProvider; + + @override + NftDataProvider get nftDataProvider => _nftDataProvider; + late final fnb.LedgerConnection _ledgerConnection; /// Setup nekoton bridge logger diff --git a/lib/src/repositories/nft_repository/nft_data_provider.dart b/lib/src/repositories/nft_repository/nft_data_provider.dart new file mode 100644 index 0000000..04beace --- /dev/null +++ b/lib/src/repositories/nft_repository/nft_data_provider.dart @@ -0,0 +1,11 @@ +import 'package:nekoton_repository/nekoton_repository.dart'; + +// ignore: one_member_abstracts +abstract class NftDataProvider { + Future getNftList({ + required Address collection, + required Address owner, + required int limit, + int? offset, + }); +} diff --git a/lib/src/repositories/nft_repository/nft_repository.dart b/lib/src/repositories/nft_repository/nft_repository.dart index ea96328..87aca44 100644 --- a/lib/src/repositories/nft_repository/nft_repository.dart +++ b/lib/src/repositories/nft_repository/nft_repository.dart @@ -1,2 +1,3 @@ +export 'nft_data_provider.dart'; export 'nft_repository_abstract.dart'; export 'nft_repository_impl.dart'; diff --git a/lib/src/repositories/nft_repository/nft_repository_abstract.dart b/lib/src/repositories/nft_repository/nft_repository_abstract.dart index cdfc9f0..390938c 100644 --- a/lib/src/repositories/nft_repository/nft_repository_abstract.dart +++ b/lib/src/repositories/nft_repository/nft_repository_abstract.dart @@ -45,7 +45,7 @@ abstract class NftRepository { /// Get a list of NFTs owned by [owner] in the [collection]. /// Supports pagination with [limit] and [continuation]. - Future getNtfList({ + Future getNftList({ required Address collection, required Address owner, required int limit, diff --git a/lib/src/repositories/nft_repository/nft_repository_impl.dart b/lib/src/repositories/nft_repository/nft_repository_impl.dart index 1c38319..6e32f62 100644 --- a/lib/src/repositories/nft_repository/nft_repository_impl.dart +++ b/lib/src/repositories/nft_repository/nft_repository_impl.dart @@ -16,6 +16,7 @@ const _transferAbiParams = [ mixin NftRepositoryImpl implements NftRepository { TransportStrategy get currentTransport; AbiLoader get abiLoader; + NftDataProvider get nftDataProvider; final _logger = Logger('NftRepositoryImpl'); final _cachedContractStateProvider = CachedContractStateProvider(); @@ -56,9 +57,22 @@ mixin NftRepositoryImpl implements NftRepository { required List
collections, }) { return currentTransport.transport.use(() async { + final apiBaseUrl = currentTransport.nftApiBaseUrl; final result = await Future.wait( collections.map((collection) async { try { + if (apiBaseUrl != null && apiBaseUrl.isNotEmpty) { + final list = await nftDataProvider.getNftList( + collection: collection, + owner: owner, + limit: 1, + ); + + return list.items.isNotEmpty + ? getNftCollection(collection) + : null; + } + final [nft, fungible] = await Future.wait([ _getNftIndexes( type: NftType.nft, @@ -116,12 +130,22 @@ mixin NftRepositoryImpl implements NftRepository { } @override - Future getNtfList({ + Future getNftList({ required Address collection, required Address owner, required int limit, String? continuation, }) { + final apiBaseUrl = currentTransport.nftApiBaseUrl; + if (apiBaseUrl != null && apiBaseUrl.isNotEmpty) { + return nftDataProvider.getNftList( + collection: collection, + owner: owner, + limit: limit, + offset: continuation != null ? int.tryParse(continuation) : null, + ); + } + return currentTransport.transport.use(() async { final isVep1155 = await _supportsInterface( address: collection, diff --git a/test/src/nft_repository_test.dart b/test/src/nft_repository_test.dart index 627f421..92eefad 100644 --- a/test/src/nft_repository_test.dart +++ b/test/src/nft_repository_test.dart @@ -6,6 +6,8 @@ class MockTransportStrategy extends Mock implements TransportStrategy {} class MockAbiLoader extends Mock implements AbiLoader {} +class MockNftDataProvider extends Mock implements NftDataProvider {} + class MockTonWallet extends Mock implements TonWallet {} class MockLatestLtTracker extends Mock implements LatestLtTracker {} @@ -23,12 +25,20 @@ class MockNftItem extends Mock implements NftItem {} class MockNftList extends Mock implements NftList {} class TestNftRepository with NftRepositoryImpl { - TestNftRepository({required this.currentTransport, required this.abiLoader}); + TestNftRepository({ + required this.currentTransport, + required this.abiLoader, + required this.nftDataProvider, + }); @override final TransportStrategy currentTransport; + @override final AbiLoader abiLoader; + + @override + final NftDataProvider nftDataProvider; } void main() { @@ -36,16 +46,19 @@ void main() { late TestNftRepository repository; late MockTransportStrategy transport; late MockAbiLoader abiLoader; + late MockNftDataProvider nftDataProvider; late MockProtoTransport protoTransport; setUp(() { transport = MockTransportStrategy(); abiLoader = MockAbiLoader(); + nftDataProvider = MockNftDataProvider(); protoTransport = MockProtoTransport(); when(() => transport.transport).thenReturn(protoTransport); repository = TestNftRepository( currentTransport: transport, abiLoader: abiLoader, + nftDataProvider: nftDataProvider, ); }); @@ -88,7 +101,7 @@ void main() { expect(result, isNull); }); - test('getNtfList returns NftList', () async { + test('getNftList returns NftList', () async { final collection = makeAddress(); final owner = makeAddress(); final nftList = MockNftList(); @@ -96,7 +109,7 @@ void main() { () => protoTransport.use(any()), ).thenAnswer((_) async => nftList); - final result = await repository.getNtfList( + final result = await repository.getNftList( collection: collection, owner: owner, limit: 1, From 905b7e5fc4a5b8461750b45462bbb75acf012bf5 Mon Sep 17 00:00:00 2001 From: Odrin Date: Thu, 30 Oct 2025 11:34:56 +0000 Subject: [PATCH 2/6] chore(release): publish packages - nekoton_repository@2.1.0-dev.0 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ pubspec.yaml | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 803f698..a629a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2025-10-30 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`nekoton_repository` - `v2.1.0-dev.0`](#nekoton_repository---v210-dev0) + +--- + +#### `nekoton_repository` - `v2.1.0-dev.0` + + - **FEAT**(EWM-582): add NFT data provider and update related repository methods. ([8c9c1d30](https://github.com/broxus/nekoton_repository/commit/8c9c1d306c92551733344c498ed4ec839ca75529)) + +## 2.1.0-dev.0 + + - **FEAT**(EWM-582): add NFT data provider and update related repository methods. ([8c9c1d30](https://github.com/broxus/nekoton_repository/commit/8c9c1d306c92551733344c498ed4ec839ca75529)) + + ## 2025-10-20 ### Changes diff --git a/pubspec.yaml b/pubspec.yaml index f9dc8e1..c5cf6c6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ --- name: nekoton_repository description: Nekoton repository package -version: 2.0.1 +version: 2.1.0-dev.0 repository: https://github.com/broxus/nekoton_repository environment: From 6d240b8efaa4f73abb7ec28384dea361ceef3f44 Mon Sep 17 00:00:00 2001 From: Egor Komarov Date: Thu, 30 Oct 2025 12:59:32 +0100 Subject: [PATCH 3/6] fix: add NftDataProvider as a required parameter in NekotonRepository initialization --- lib/src/nekoton_repository.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/nekoton_repository.dart b/lib/src/nekoton_repository.dart index ca24db6..efc28de 100644 --- a/lib/src/nekoton_repository.dart +++ b/lib/src/nekoton_repository.dart @@ -103,11 +103,13 @@ class NekotonRepository required TonWalletTransactionsStorage tonWalletStorage, required TokenWalletTransactionsStorage tokenWalletStorage, required LedgerConnectionHandler ledgerConnectionHandler, + required NftDataProvider nftDataProvider, AssetBundle? bundle, }) async { _storageRepository = storage; _tonWalletStorage = tonWalletStorage; _tokenWalletStorage = tokenWalletStorage; + _nftDataProvider = nftDataProvider; _nekotonStorage = Storage.create( get: storage.getStorageData, From a4d44a1050d420c38f452d2a4bd806d5538128d5 Mon Sep 17 00:00:00 2001 From: Odrin Date: Thu, 30 Oct 2025 12:00:26 +0000 Subject: [PATCH 4/6] chore(release): publish packages - nekoton_repository@2.1.0-dev.1 --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ pubspec.yaml | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a629a74..27c01eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,39 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2025-10-30 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`nekoton_repository` - `v2.1.0-dev.1`](#nekoton_repository---v210-dev1) + +--- + +#### `nekoton_repository` - `v2.1.0-dev.1` + + - **FIX**: add NftDataProvider as a required parameter in NekotonRepository initialization. ([6d240b8e](https://github.com/broxus/nekoton_repository/commit/6d240b8efaa4f73abb7ec28384dea361ceef3f44)) + - **FEAT**(EWM-582): add NFT data provider and update related repository methods. ([8c9c1d30](https://github.com/broxus/nekoton_repository/commit/8c9c1d306c92551733344c498ed4ec839ca75529)) + - **FEAT**(EWM-397): add logic of count created names to choose max number. ([c47c067c](https://github.com/broxus/nekoton_repository/commit/c47c067c4ae0bc1ecfa560a2d4c8a0bb1c123ca7)) + - **FEAT**(EWM-397): add new logic of default naming seeds and accounts. ([83bd3add](https://github.com/broxus/nekoton_repository/commit/83bd3add139d1914d4a723cab99fa9299c888514)) + - **FEAT**(EWM-397): add new logic of account & seed default naming. ([2a9762a0](https://github.com/broxus/nekoton_repository/commit/2a9762a0d155ae283f96ac734638acf23a64c61d)) + +## 2.1.0-dev.1 + + - **FIX**: add NftDataProvider as a required parameter in NekotonRepository initialization. ([6d240b8e](https://github.com/broxus/nekoton_repository/commit/6d240b8efaa4f73abb7ec28384dea361ceef3f44)) + - **FEAT**(EWM-582): add NFT data provider and update related repository methods. ([8c9c1d30](https://github.com/broxus/nekoton_repository/commit/8c9c1d306c92551733344c498ed4ec839ca75529)) + - **FEAT**(EWM-397): add logic of count created names to choose max number. ([c47c067c](https://github.com/broxus/nekoton_repository/commit/c47c067c4ae0bc1ecfa560a2d4c8a0bb1c123ca7)) + - **FEAT**(EWM-397): add new logic of default naming seeds and accounts. ([83bd3add](https://github.com/broxus/nekoton_repository/commit/83bd3add139d1914d4a723cab99fa9299c888514)) + - **FEAT**(EWM-397): add new logic of account & seed default naming. ([2a9762a0](https://github.com/broxus/nekoton_repository/commit/2a9762a0d155ae283f96ac734638acf23a64c61d)) + + ## 2025-10-30 ### Changes diff --git a/pubspec.yaml b/pubspec.yaml index c5cf6c6..520bfb1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ --- name: nekoton_repository description: Nekoton repository package -version: 2.1.0-dev.0 +version: 2.1.0-dev.1 repository: https://github.com/broxus/nekoton_repository environment: From 99a6fb990036cdf283b65b5b77c517409d3cd1aa Mon Sep 17 00:00:00 2001 From: Egor Komarov Date: Thu, 30 Oct 2025 13:13:01 +0100 Subject: [PATCH 5/6] fix: add apiBaseUrl parameter to getNftList method in NftDataProvider --- lib/src/repositories/nft_repository/nft_data_provider.dart | 1 + lib/src/repositories/nft_repository/nft_repository_impl.dart | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib/src/repositories/nft_repository/nft_data_provider.dart b/lib/src/repositories/nft_repository/nft_data_provider.dart index 04beace..8711f49 100644 --- a/lib/src/repositories/nft_repository/nft_data_provider.dart +++ b/lib/src/repositories/nft_repository/nft_data_provider.dart @@ -3,6 +3,7 @@ import 'package:nekoton_repository/nekoton_repository.dart'; // ignore: one_member_abstracts abstract class NftDataProvider { Future getNftList({ + required String apiBaseUrl, required Address collection, required Address owner, required int limit, diff --git a/lib/src/repositories/nft_repository/nft_repository_impl.dart b/lib/src/repositories/nft_repository/nft_repository_impl.dart index 6e32f62..6ecfc7a 100644 --- a/lib/src/repositories/nft_repository/nft_repository_impl.dart +++ b/lib/src/repositories/nft_repository/nft_repository_impl.dart @@ -63,6 +63,7 @@ mixin NftRepositoryImpl implements NftRepository { try { if (apiBaseUrl != null && apiBaseUrl.isNotEmpty) { final list = await nftDataProvider.getNftList( + apiBaseUrl: apiBaseUrl, collection: collection, owner: owner, limit: 1, @@ -139,6 +140,7 @@ mixin NftRepositoryImpl implements NftRepository { final apiBaseUrl = currentTransport.nftApiBaseUrl; if (apiBaseUrl != null && apiBaseUrl.isNotEmpty) { return nftDataProvider.getNftList( + apiBaseUrl: apiBaseUrl, collection: collection, owner: owner, limit: limit, From b69c22d6f113ff5e72d4fdcde11faa670ebc7445 Mon Sep 17 00:00:00 2001 From: Odrin Date: Thu, 30 Oct 2025 12:13:51 +0000 Subject: [PATCH 6/6] chore(release): publish packages - nekoton_repository@2.1.0-dev.2 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ pubspec.yaml | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c01eb..6b31cf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2025-10-30 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`nekoton_repository` - `v2.1.0-dev.2`](#nekoton_repository---v210-dev2) + +--- + +#### `nekoton_repository` - `v2.1.0-dev.2` + + - **FIX**: add apiBaseUrl parameter to getNftList method in NftDataProvider. ([99a6fb99](https://github.com/broxus/nekoton_repository/commit/99a6fb990036cdf283b65b5b77c517409d3cd1aa)) + +## 2.1.0-dev.2 + + - **FIX**: add apiBaseUrl parameter to getNftList method in NftDataProvider. ([99a6fb99](https://github.com/broxus/nekoton_repository/commit/99a6fb990036cdf283b65b5b77c517409d3cd1aa)) + + ## 2025-10-30 ### Changes diff --git a/pubspec.yaml b/pubspec.yaml index 520bfb1..2c2171f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ --- name: nekoton_repository description: Nekoton repository package -version: 2.1.0-dev.1 +version: 2.1.0-dev.2 repository: https://github.com/broxus/nekoton_repository environment: