Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
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
15 changes: 8 additions & 7 deletions lib/app/app_cubit/app_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,23 @@ class AppCubit extends Cubit<AppState> {
_isTestnetMode = _cache.getTestnetMode();

if (_isTestnetMode) {
_selectedNetwork = Networks.sepolia;
updateAppNetwork(AppNetworks.sepolia);
emit(AppState.testnetModeChanged(_isTestnetMode));
}
}

final Wallet _wallet;
final Cache _cache;

Networks _selectedNetwork = Networks.mainnet;
AppNetworks _selectedNetwork = AppNetworks.allNetworks;
bool _isTestnetMode = false;

final StreamController<Networks> _selectedNetworkStreamController = StreamController<Networks>.broadcast();
final StreamController<AppNetworks> _selectedNetworkStreamController = StreamController<AppNetworks>.broadcast();

Stream<Networks> get selectedNetworkStream => _selectedNetworkStreamController.stream;
Stream<AppNetworks> get selectedNetworkStream => _selectedNetworkStreamController.stream;

Networks get selectedNetwork => _selectedNetwork;
AppNetworks get selectedNetwork => _selectedNetwork;
int get currentChainId => _selectedNetwork.chainId;
bool get isTestnetMode => _isTestnetMode;

void _setupStreams() {
Expand All @@ -47,7 +48,7 @@ class AppCubit extends Cubit<AppState> {
}
}

void updateAppNetwork(Networks newNetwork) async {
void updateAppNetwork(AppNetworks newNetwork) async {
if (newNetwork == _selectedNetwork) return;

emit(AppState.networkChanged(newNetwork));
Expand All @@ -60,7 +61,7 @@ class AppCubit extends Cubit<AppState> {

Future<void> toggleTestnetMode() async {
_isTestnetMode = !_isTestnetMode;
updateAppNetwork(isTestnetMode ? Networks.sepolia : Networks.mainnet);
updateAppNetwork(isTestnetMode ? AppNetworks.sepolia : AppNetworks.allNetworks);
await _cache.saveTestnetMode(isTestnetMode: _isTestnetMode);

try {
Expand Down
2 changes: 1 addition & 1 deletion lib/app/app_cubit/app_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ part of 'app_cubit.dart';
class AppState {
const factory AppState.standard() = _Standard;

const factory AppState.networkChanged(Networks newNetwork) = _NetworkChanged;
const factory AppState.networkChanged(AppNetworks newNetwork) = _NetworkChanged;
const factory AppState.testnetModeChanged(bool isTestnetMode) = _TestnetModeChanged;
}
50 changes: 29 additions & 21 deletions lib/app/create/create_page_select_tokens_stage.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:web3kit/core/core.dart';
import 'package:zup_app/app/app_cubit/app_cubit.dart';
import 'package:zup_app/app/create/widgets/create_page_settings_dropdown.dart';
import 'package:zup_app/core/cache.dart';
Expand All @@ -28,29 +27,18 @@ class _CreatePageState extends State<CreatePageSelectTokensStage> with DeviceInf
final navigator = inject<ZupNavigator>();
final cache = inject<Cache>();

late final token0SelectorController = TokenSelectorButtonController(
initialSelectedToken: appCubit.selectedNetwork.nativeCurrencyTokenDto,
);
late final token0SelectorController = TokenSelectorButtonController(initialSelectedToken: null);
final token1SelectorController = TokenSelectorButtonController(initialSelectedToken: null);
StreamSubscription? _token0SelectorStreamSubscription;
StreamSubscription? _token1SelectorStreamSubscription;
StreamSubscription? _selectedNetworkStreamSubscription;

bool areTokensEqual(TokenDto? token0, TokenDto? token1) {
if (token0 == null || token1 == null) return false;
if (token0.address == token1.address) return true;

// Note: If implementing all networks feature, this check should be refactored to work with all networks,
//as all networks network does not have a native token or a wrapped native token
if (token0.address.lowercasedEquals(appCubit.selectedNetwork.wrappedNative.address.toLowerCase()) &&
token1.address.lowercasedEquals(EthereumConstants.zeroAddress)) {
return true;
}
if (appCubit.selectedNetwork.isAllNetworks) return token0.internalId == token1.internalId;

// Note: If implementing all networks feature, this check should be refactored to work with all networks,
//as all networks network does not have a native token or a wrapped native token
if (token1.address.lowercasedEquals(appCubit.selectedNetwork.wrappedNative.address.toLowerCase()) &&
token0.address.lowercasedEquals(EthereumConstants.zeroAddress)) {
if (token0.addresses[appCubit.currentChainId] == token1.addresses[appCubit.currentChainId]) {
return true;
}

Expand All @@ -60,8 +48,20 @@ class _CreatePageState extends State<CreatePageSelectTokensStage> with DeviceInf
@override
void initState() {
_selectedNetworkStreamSubscription = appCubit.selectedNetworkStream.listen((network) {
token0SelectorController.changeToken(network.nativeCurrencyTokenDto);
token1SelectorController.changeToken(null);
if (network.isAllNetworks) {
if (token0SelectorController.selectedToken?.internalId == null) token0SelectorController.changeToken(null);
if (token1SelectorController.selectedToken?.internalId == null) token1SelectorController.changeToken(null);

return;
}

if (token0SelectorController.selectedToken?.addresses[network.chainId] == null) {
token0SelectorController.changeToken(null);
}

if (token1SelectorController.selectedToken?.addresses[network.chainId] == null) {
token1SelectorController.changeToken(null);
}
});

_token0SelectorStreamSubscription = token0SelectorController.selectedTokenStream.listen((token) {
Expand All @@ -75,6 +75,7 @@ class _CreatePageState extends State<CreatePageSelectTokensStage> with DeviceInf
return token0SelectorController.changeToken(null);
}
});

super.initState();
}

Expand Down Expand Up @@ -173,6 +174,7 @@ class _CreatePageState extends State<CreatePageSelectTokensStage> with DeviceInf
stream: token1SelectorController.selectedTokenStream,
builder: (context, _) {
return ZupPrimaryButton(
key: const Key("search-button"),
height: 50,
fixedIcon: true,
alignCenter: true,
Expand All @@ -181,11 +183,17 @@ class _CreatePageState extends State<CreatePageSelectTokensStage> with DeviceInf
icon: Assets.icons.sparkleMagnifyingglass.svg(),
onPressed: token0SelectorController.selectedToken != null &&
token1SelectorController.selectedToken != null
? () => navigator.navigateToDeposit(
token0SelectorController.selectedToken!.address,
token1SelectorController.selectedToken!.address,
? () {
return navigator.navigateToDeposit(
appCubit.selectedNetwork.isAllNetworks
? token0SelectorController.selectedToken!.internalId!
: token0SelectorController.selectedToken!.addresses[appCubit.currentChainId]!,
appCubit.selectedNetwork.isAllNetworks
? token1SelectorController.selectedToken!.internalId!
: token1SelectorController.selectedToken!.addresses[appCubit.currentChainId]!,
appCubit.selectedNetwork,
)
);
}
: null,
mainAxisSize: MainAxisSize.max,
);
Expand Down
34 changes: 22 additions & 12 deletions lib/app/create/deposit/deposit_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ class DepositCubit extends Cubit<DepositState> with KeysMixin, V3PoolConversorsM

BigInt? _latestPoolTick;
YieldDto? _selectedYield;
YieldTimeFrame? _selectedYieldTimeframe;

late final Stream<YieldDto?> selectedYieldStream = _selectedYieldStreamController.stream;
late final Stream<BigInt?> poolTickStream = _pooltickStreamController.stream;

YieldDto? get selectedYield => _selectedYield;
YieldTimeFrame? get selectedYieldTimeframe => _selectedYieldTimeframe;
BigInt? get latestPoolTick => _latestPoolTick;
DepositSettingsDto get depositSettings => _cache.getDepositSettings();
PoolSearchSettingsDto get poolSearchSettings => _cache.getPoolSearchSettings();
Expand All @@ -63,24 +65,31 @@ class DepositCubit extends Cubit<DepositState> with KeysMixin, V3PoolConversorsM
}

Future<void> getBestPools({
required String token0Address,
required String token1Address,
required String token0AddressOrId,
required String token1AddressOrId,
bool ignoreMinLiquidity = false,
}) async {
try {
_zupAnalytics.logSearch(
token0: token0Address,
token1: token1Address,
token0: token0AddressOrId,
token1: token1AddressOrId,
network: _appCubit.selectedNetwork.label,
);

emit(const DepositState.loading());
final yields = await _yieldRepository.getYields(
token0Address: token0Address,
token1Address: token1Address,
network: _appCubit.selectedNetwork,
minTvlUsd: ignoreMinLiquidity ? 0 : poolSearchSettings.minLiquidityUSD,
);
final yields = _appCubit.selectedNetwork.isAllNetworks
? await _yieldRepository.getAllNetworksYield(
token0InternalId: token0AddressOrId,
token1InternalId: token1AddressOrId,
minTvlUsd: ignoreMinLiquidity ? 0 : poolSearchSettings.minLiquidityUSD,
testnetMode: _appCubit.isTestnetMode,
)
: await _yieldRepository.getSingleNetworkYield(
token0Address: token0AddressOrId,
token1Address: token1AddressOrId,
network: _appCubit.selectedNetwork,
minTvlUsd: ignoreMinLiquidity ? 0 : poolSearchSettings.minLiquidityUSD,
);

if (yields.isEmpty) {
return emit(
Expand All @@ -94,8 +103,9 @@ class DepositCubit extends Cubit<DepositState> with KeysMixin, V3PoolConversorsM
}
}

Future<void> selectYield(YieldDto? yieldDto) async {
Future<void> selectYield(YieldDto? yieldDto, YieldTimeFrame? yieldTimeFrame) async {
_selectedYield = yieldDto;
_selectedYieldTimeframe = yieldTimeFrame;
_selectedYieldStreamController.add(selectedYield);

if (selectedYield != null) await getSelectedPoolTick();
Expand All @@ -121,7 +131,7 @@ class DepositCubit extends Cubit<DepositState> with KeysMixin, V3PoolConversorsM
_latestPoolTick = slot0.tick;
}

Future<double> getWalletTokenAmount(String tokenAddress, {required Networks network}) async {
Future<double> getWalletTokenAmount(String tokenAddress, {required AppNetworks network}) async {
if (_wallet.signer == null) return 0.0;

final walletAddress = await _wallet.signer!.address;
Expand Down
Loading
Loading