Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions backup_restore/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.1"
version: "2.8.1"
base32:
dependency: transitive
description:
Expand Down Expand Up @@ -63,7 +63,7 @@ packages:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.3.1"
clock:
dependency: transitive
description:
Expand Down Expand Up @@ -217,7 +217,7 @@ packages:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
version: "1.7.0"
path:
dependency: transitive
description:
Expand Down Expand Up @@ -348,7 +348,7 @@ packages:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.0"
version: "0.4.2"
toml:
dependency: transitive
description:
Expand Down
71 changes: 35 additions & 36 deletions base/lib/base/kin_account_context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'dart:typed_data';
import 'package:decimal/decimal.dart';
import 'package:kin_base/base/kin_environment.dart';
import 'package:kin_base/base/models/kin_balance.dart';
import 'package:kin_base/base/models/solana/instruction.dart';
import 'package:kin_base/base/models/stellar_base_type_conversions.dart';
import 'package:kin_base/base/network/api/agora/model_to_proto.dart';
import 'package:kin_base/base/network/services/kin_service.dart';
Expand Down Expand Up @@ -65,9 +66,8 @@ abstract class KinPaymentReadOperationsAltIdioms {


abstract class KinPaymentReadOperations implements KinPaymentReadOperationsAltIdioms {

Future<QuarkAmount> calculateFee(int numberOfOperations);

//TODO: Observe Payment
//TODO: GetPaymentsForTransactionHash
}

abstract class KinPaymentWriteOperationsAltIdioms {
Expand Down Expand Up @@ -257,23 +257,6 @@ class KinAccountContextBase implements KinAccountReadOperations , KinPaymentRead
return account.balance;
}

@override
Future<QuarkAmount> calculateFee(int numberOfOperations) async {
if (await service.canWhitelistTransactions()) {
return KinAmount.zero.toQuarks();
}
else {
var minFee = await storage.getMinFee();

if (minFee == null) {
minFee = await service.getMinFee();
await storage.setMinFee(minFee);
}

return QuarkAmount(minFee.value! * numberOfOperations);
}
}

@override
Future<bool> clearStorage({Callback<bool>? clearCompleteCallback}) async {
log!.log("clearStorage");
Expand Down Expand Up @@ -398,7 +381,7 @@ class KinAccountContextBase implements KinAccountReadOperations , KinPaymentRead
catch(e) {
var accounts = await service.resolveTokenAccounts(accountId);

var maybeResolvedAccountId = accounts.isNotEmpty ? accounts.first.asKinAccountId() : accountId ;
var maybeResolvedAccountId = accounts.isNotEmpty ? accounts.first.key.asKinAccountId() : accountId ;

var account2 = await service.getAccount(maybeResolvedAccountId) ;

Expand All @@ -408,7 +391,7 @@ class KinAccountContextBase implements KinAccountReadOperations , KinPaymentRead
accountResolved = account2!.copy(
id: accountId,
key: PublicKey.fromBytes(accountId.value),
tokenAccounts: accounts,
tokenAccounts: accounts.map((e) => e.key).toList(),
);

} else {
Expand Down Expand Up @@ -490,7 +473,7 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
AppInfoProvider? appInfoProvider;

KinAccountContextImpl._(executors, KinService service, Storage storage,
KinAccountId accountId, this.appInfoProvider, KinLoggerFactory logger)
KinAccountId accountId, this.appInfoProvider, KinLoggerFactory logger, bool shouldAutoMergeTokenAccounts)
: super(executors, service, storage, accountId, logger);

static Uint8List? _generateRandomPrivateKey() {
Expand All @@ -512,7 +495,8 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
env.storage,
newAccount.id,
envAgora.appInfoProvider,
env.logger
env.logger,
env.shouldAutoMergeTokenAccounts
);
}

Expand All @@ -525,10 +509,28 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
env.storage,
accountId,
envAgora.appInfoProvider,
env.logger
env.logger,
env.shouldAutoMergeTokenAccounts
);
}

Future<List<KinTokenAccountInfo>> mergeTokenAccountIfNecessary() async {
var account = await storage.getAccount(accountId);
var privateKey = account?.key as PrivateKey;
if(account?.status is KinAccountStatusRegistered && account != null && (account).tokenAccounts.length > 1) {
List<KinTokenAccountInfo> tokenAccounts = List.empty();
service.mergeTokenAccounts(accountId, privateKey, appInfoProvider!.appInfo!.appIndex).then((value) =>
{
storage.updateAccountInStorage(account.copy(tokenAccounts: value.map((e) => e.key).toList())),
tokenAccounts = value
});
return tokenAccounts;
}
else {
return List.empty();
}
}

@override
Future<KinAccount?> getAccount({bool forceUpdate = false, Callback<KinAccount?>? accountCallback}) async {
log!.log("getAccount");
Expand Down Expand Up @@ -594,7 +596,7 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext

try {
var resolveTokenAccounts = await service.resolveTokenAccounts(accountId);
var resolvedAccount = await storage.updateAccountInStorage(accountToStore.copy(tokenAccounts: resolveTokenAccounts));
var resolvedAccount = await storage.updateAccountInStorage(accountToStore.copy(tokenAccounts: resolveTokenAccounts.map((e) => e.key).toList()));

print('-- Resolved account: $resolvedAccount');

Expand All @@ -618,7 +620,7 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
serviceExistingAccount = await service.getAccount(account.id);
}
catch(e) {
existingTokenAccounts = await service.resolveTokenAccounts(account.id);
existingTokenAccounts = (await service.resolveTokenAccounts(account.id)).map((e) => e.key).toList();
}

return serviceExistingAccount != null ||
Expand Down Expand Up @@ -689,11 +691,6 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
service.invalidateBlockhashCache();
continue;
}
else if (e is InsufficientFeeInRequestError) {
var minFee = await service.getMinFee();
storage.setMinFee(minFee);
continue;
}
else if (e is UnknownAccountInRequestError) {
var delay = invalidAccountErrorRetryStrategy.nextDelay()!;
log!.log("Waiting $delay ms...");
Expand Down Expand Up @@ -724,7 +721,7 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
} else {
var resolveTokenAccounts = await service.resolveTokenAccounts(accountId);

var resolvedAccount = await storage.updateAccountInStorage(account!.copy(tokenAccounts: resolveTokenAccounts));
var resolvedAccount = await storage.updateAccountInStorage(account!.copy(tokenAccounts: resolveTokenAccounts.map((e) => e.key).toList()));

log!.log('_buildPaymentTransaction> account(resolved token account): $resolvedAccount');

Expand All @@ -741,19 +738,21 @@ class KinAccountContextImpl extends KinAccountContextBase with KinAccountContext
} else {
paymentItems = await Future.wait( payments.map((paymentItem) async {
var destinationTokenAccounts = await service.resolveTokenAccounts(paymentItem.destinationAccount) ;
return paymentItem.copy(destinationAccount: destinationTokenAccounts.first.asKinAccountId());
return paymentItem.copy(destinationAccount: destinationTokenAccounts.first.key.asKinAccountId());
}));
}

var fee = await calculateFee(payments.length);
List<Instruction> createAccountInstructions = new List.empty();
List<PrivateKey> additionalSigners = new List.empty();

var transaction = service.buildAndSignTransaction(
sourceAccount.ownerKey,
sourceAccount.sourceKey,
sourceAccount.nonce,
paymentItems,
memo,
feeOverride ?? fee
createAccountInstructions,
additionalSigners
);

if (transaction is StellarKinTransaction) {
Expand Down
12 changes: 9 additions & 3 deletions base/lib/base/kin_environment.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ class KinEnvironment {
final Storage storage;
final ExecutorServices executors;
final NetworkOperationsHandler networkHandler;
final bool shouldAutoMergeTokenAccounts;

KinEnvironment(this.networkEnvironment, this.logger, this.service,
this.storage, this.executors, this.networkHandler);
this.storage, this.executors, this.networkHandler, this.shouldAutoMergeTokenAccounts);

Future<bool> importPrivateKey(PrivateKey privateKey, [ Callback<bool>? callback ]) async {
var accountId = KinAccountId.fromPrivateKey(privateKey);
Expand Down Expand Up @@ -76,6 +77,7 @@ class KinEnvironmentAgora extends KinEnvironment {
final InMemoryInvoiceRepositoryImpl invoiceRepository =
InMemoryInvoiceRepositoryImpl();
final AppInfoProvider appInfoProvider;
final bool shouldAutoMergeTokenAccounts;

KinEnvironmentAgora(
this.managedChannel,
Expand All @@ -85,9 +87,10 @@ class KinEnvironmentAgora extends KinEnvironment {
Storage storage,
ExecutorServices executors,
NetworkOperationsHandler networkHandler,
this.shouldAutoMergeTokenAccounts,
this.appInfoProvider)
: super(networkEnvironment, logger, service, storage, executors,
networkHandler);
networkHandler, shouldAutoMergeTokenAccounts);


factory KinEnvironmentAgora.build(NetworkEnvironment networkEnvironment, {
Expand All @@ -100,6 +103,7 @@ class KinEnvironmentAgora extends KinEnvironment {
ExecutorServices? executors,
NetworkOperationsHandler? networkHandler,
AppInfoProvider? appInfoProvider,
bool? shouldAutoMergeTokenAccounts
}) {

logger ??= KinLoggerFactoryImpl(enableLogging) ;
Expand Down Expand Up @@ -139,7 +143,9 @@ class KinEnvironmentAgora extends KinEnvironment {
storage = storageBuilder!(networkEnvironment: networkEnvironment) ;
}

var agora = KinEnvironmentAgora(managedChannel, networkEnvironment, logger, service, storage, executors, networkHandler, appInfoProvider);
shouldAutoMergeTokenAccounts ??= true;

var agora = KinEnvironmentAgora(managedChannel, networkEnvironment, logger, service, storage, executors, networkHandler, shouldAutoMergeTokenAccounts, appInfoProvider);

return agora ;
}
Expand Down
9 changes: 9 additions & 0 deletions base/lib/base/models/kin_account.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:typed_data';

import 'package:kin_base/base/models/kin_amount.dart';
import 'package:kin_base/base/tools/base58.dart';
import 'package:kin_base/base/tools/extensions.dart';
import 'package:kin_base/stellarfork/key_pair.dart';
Expand Down Expand Up @@ -117,3 +118,11 @@ class KinAccount {
return 'KinAccount{key: $key, id: $id, tokenAccounts: $tokenAccounts, balance: $balance, status: $status}';
}
}

class KinTokenAccountInfo{
final PublicKey key;
final KinAmount balance;
final PublicKey? closeAuthority;

KinTokenAccountInfo(this.key, this.balance, this.closeAuthority){}
}
Loading