Skip to content

Commit

Permalink
feat: ntp time (#84)
Browse files Browse the repository at this point in the history
* feat: add NTP time provider

* chore: fnb upgrade

* fix: analyzer warnings
  • Loading branch information
nesquikm authored Sep 29, 2023
1 parent e210ae0 commit 0695703
Show file tree
Hide file tree
Showing 10 changed files with 37 additions and 13 deletions.
4 changes: 3 additions & 1 deletion lib/src/constants.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:nekoton_repository/src/utils/utils.dart';

/// Max number of seeds that can be displayed as "last viewed"
const maxLastSelectedSeeds = 4;

Expand All @@ -6,5 +8,5 @@ const defaultWorkchainId = 0;

extension ExpireAtToTimeout on DateTime {
/// Convert timeout duration from current moment
Duration toTimeout() => difference(DateTime.now());
Duration toTimeout() => difference(NtpTime.now());
}
1 change: 1 addition & 0 deletions lib/src/models/seed.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ class Seed extends SeedBase {
GetIt.instance<NekotonRepository>()
.storageRepository
.removeSeedName(publicKey);

return GetIt.instance<SeedKeyRepository>().removeKeys(allKeys);
}

Expand Down
6 changes: 6 additions & 0 deletions lib/src/nekoton_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:flutter_nekoton_bridge/flutter_nekoton_bridge.dart' as fnb;
import 'package:injectable/injectable.dart';
import 'package:logging/logging.dart';
import 'package:nekoton_repository/nekoton_repository.dart';
import 'package:nekoton_repository/src/utils/utils.dart';
import 'package:rxdart/rxdart.dart';

/// {@template nekoton_repository}
Expand Down Expand Up @@ -126,6 +127,11 @@ class NekotonRepository
_initHasAnySeeds();
}

void updateClockOffset(Duration offset) {
NtpTime.offset = offset;
fnb.updateClockOffset(offset.inMilliseconds);
}

/// Clear used memory
Future<void> dispose() async {
_keyStore.dispose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:logging/logging.dart';
import 'package:nekoton_repository/nekoton_repository.dart';
import 'package:nekoton_repository/src/repositories/refresh_polling_queue/cancellable_operation_awaited.dart';
import 'package:nekoton_repository/src/repositories/ton_wallet_repository/ton_wallet_gql_block_poller.dart';
import 'package:nekoton_repository/src/utils/utils.dart';
import 'package:rxdart/rxdart.dart';

/// Polling interval for [TonWallet.refresh]
Expand Down Expand Up @@ -345,7 +346,7 @@ mixin TonWalletRepositoryImpl implements TonWalletRepository {
transaction: pendingTransaction,
amount: amount,
destination: destination,
createdAt: DateTime.now(),
createdAt: NtpTime.now(),
),
);

Expand Down Expand Up @@ -1341,7 +1342,7 @@ extension TonWalletTransactionExtension
bool isExpiredByTime(TonWalletDetails details) {
return transaction.createdAt
.add(Duration(seconds: details.expirationTime))
.isBefore(DateTime.now());
.isBefore(NtpTime.now());
}

MultisigSubmitTransaction get multisigSubmitTransaction => data!.maybeWhen(
Expand Down
10 changes: 10 additions & 0 deletions lib/src/utils/ntp_time.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class NtpTime {
NtpTime._();

// ignore: avoid-global-state
static Duration offset = Duration.zero;

/// Returns current time of the system clock with offset from the NTP server
/// Use this method instead of [DateTime.now] to get the correct time
static DateTime now() => DateTime.now().add(offset);
}
1 change: 1 addition & 0 deletions lib/src/utils/utils.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export 'ntp_time.dart';
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ dependencies:
equatable: ^2.0.5
flutter:
sdk: flutter
flutter_nekoton_bridge: ^1.24.0
flutter_nekoton_bridge: ^1.25.0
freezed_annotation: ^2.2.0
get_it: ^7.6.0
injectable: ^2.1.0
Expand Down
5 changes: 3 additions & 2 deletions test/src/cancelable_operation_test.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:async/async.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:nekoton_repository/src/utils/utils.dart';

class FutureOperation {
Future<void> call() async {}
Expand All @@ -16,11 +17,11 @@ void main() {
(_) => Future.delayed(const Duration(seconds: 1)),
);

final start = DateTime.now();
final start = NtpTime.now();
final operation = CancelableOperation<void>.fromFuture(function.call());

await operation.valueOrCancellation();
final end = DateTime.now();
final end = NtpTime.now();

expect(end.difference(start).inSeconds, 1);
verify(function.call).called(1);
Expand Down
7 changes: 4 additions & 3 deletions test/src/generic_contract_repository_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:nekoton_repository/nekoton_repository.dart';
import 'package:nekoton_repository/src/repositories/ton_wallet_repository/ton_wallet_gql_block_poller.dart';
import 'package:nekoton_repository/src/utils/utils.dart';
import 'package:rxdart/rxdart.dart';
import 'package:tuple/tuple.dart';

Expand Down Expand Up @@ -339,12 +340,12 @@ void main() {
const transactionExpiring = Duration(seconds: 20);
final pendingTransaction = PendingTransaction(
messageHash: 'messageHash',
expireAt: DateTime.now().add(transactionExpiring),
expireAt: NtpTime.now().add(transactionExpiring),
);
const sendDuration = Duration(seconds: 3);
final signedMessage = SignedMessage(
hash: 'hash',
expireAt: DateTime.now(),
expireAt: NtpTime.now(),
boc: 'boc',
);
const latestBlock = LatestBlock(
Expand All @@ -358,7 +359,7 @@ void main() {
const group = 'group';
final transaction = Transaction(
id: const TransactionId(hash: 'hash', lt: 'lt'),
createdAt: DateTime.now(),
createdAt: NtpTime.now(),
aborted: false,
origStatus: AccountStatus.active,
endStatus: AccountStatus.active,
Expand Down
9 changes: 5 additions & 4 deletions test/src/ton_wallet_repository_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:get_it/get_it.dart';
import 'package:mocktail/mocktail.dart';
import 'package:nekoton_repository/nekoton_repository.dart' hide Symbol;
import 'package:nekoton_repository/src/repositories/ton_wallet_repository/ton_wallet_gql_block_poller.dart';
import 'package:nekoton_repository/src/utils/utils.dart';
import 'package:tuple/tuple.dart';

class MockTokenRepository extends Mock implements TokenWalletRepository {}
Expand Down Expand Up @@ -352,12 +353,12 @@ void main() {
const transactionExpiring = Duration(seconds: 20);
final pendingTransaction = PendingTransaction(
messageHash: 'messageHash',
expireAt: DateTime.now().add(transactionExpiring),
expireAt: NtpTime.now().add(transactionExpiring),
);
const sendDuration = Duration(seconds: 3);
final signedMessage = SignedMessage(
hash: 'hash',
expireAt: DateTime.now(),
expireAt: NtpTime.now(),
boc: 'boc',
);
const latestBlock = LatestBlock(
Expand All @@ -371,7 +372,7 @@ void main() {
const group = 'group';
final transaction = Transaction(
id: const TransactionId(hash: 'hash', lt: 'lt'),
createdAt: DateTime.now(),
createdAt: NtpTime.now(),
aborted: false,
origStatus: AccountStatus.active,
endStatus: AccountStatus.active,
Expand All @@ -388,7 +389,7 @@ void main() {
transaction: pendingTransaction,
destination: address,
amount: amount,
createdAt: DateTime.now(),
createdAt: NtpTime.now(),
);
registerFallbackValue(signedMessage);
registerFallbackValue(address);
Expand Down

0 comments on commit 0695703

Please sign in to comment.