import 'dart:ffi'; import 'dart:isolate'; import 'package:cw_monero/api/account_list.dart'; import 'package:monero/monero.dart' as monero; import 'package:mutex/mutex.dart'; monero.Coins? coins = null; final coinsMutex = Mutex(); Future refreshCoins(int accountIndex) async { if (coinsMutex.isLocked) { return; } coins = monero.Wallet_coins(wptr!); final coinsPtr = coins!.address; await coinsMutex.acquire(); await Isolate.run(() => monero.Coins_refresh(Pointer.fromAddress(coinsPtr))); coinsMutex.release(); } Future countOfCoins() async { await coinsMutex.acquire(); final count = monero.Coins_count(coins!); coinsMutex.release(); return count; } Future getCoin(int index) async { await coinsMutex.acquire(); final coin = monero.Coins_coin(coins!, index); coinsMutex.release(); return coin; } Future getCoinByKeyImage(String keyImage) async { final count = await countOfCoins(); for (int i = 0; i < count; i++) { final coin = await getCoin(i); final coinAddress = monero.CoinsInfo_keyImage(coin); if (keyImage == coinAddress) { return i; } } return null; } Future freezeCoin(int index) async { await coinsMutex.acquire(); final coinsPtr = coins!.address; await Isolate.run(() => monero.Coins_setFrozen(Pointer.fromAddress(coinsPtr), index: index)); coinsMutex.release(); } Future thawCoin(int index) async { await coinsMutex.acquire(); final coinsPtr = coins!.address; await Isolate.run(() => monero.Coins_thaw(Pointer.fromAddress(coinsPtr), index: index)); coinsMutex.release(); }