diff --git a/assets/icons/plusminus.svg b/assets/icons/plusminus.svg new file mode 100644 index 0000000..90725a6 --- /dev/null +++ b/assets/icons/plusminus.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/lib/app/create/deposit/deposit_cubit.dart b/lib/app/create/deposit/deposit_cubit.dart index 3ef542c..f47a4df 100644 --- a/lib/app/create/deposit/deposit_cubit.dart +++ b/lib/app/create/deposit/deposit_cubit.dart @@ -108,17 +108,28 @@ class DepositCubit extends Cubit with KeysMixin, V3PoolConversorsM _selectedYieldTimeframe = yieldTimeFrame; _selectedYieldStreamController.add(selectedYield); - if (selectedYield != null) await getSelectedPoolTick(); + if (selectedYield != null) { + _latestPoolTick = BigInt.parse(yieldDto!.latestTick); + _pooltickStreamController.add(_latestPoolTick); + + await getSelectedPoolTick(forceRefresh: true); + } } - Future getSelectedPoolTick() async { + Future getSelectedPoolTick({bool forceRefresh = false}) async { if (selectedYield == null) return; - _latestPoolTick = null; - _pooltickStreamController.add(null); - final selectedYieldBeforeCall = selectedYield; - BigInt tick = await _poolService.getPoolTick(selectedYieldBeforeCall!); + + final tick = await _zupSingletonCache.run( + () => _poolService.getPoolTick(selectedYieldBeforeCall!), + expiration: const Duration(minutes: 1), + ignoreCache: forceRefresh, + key: poolTickCacheKey( + network: selectedYield!.network, + poolAddress: selectedYield!.poolAddress, + ), + ); if (selectedYieldBeforeCall != selectedYield) return await getSelectedPoolTick(); diff --git a/lib/app/create/deposit/deposit_page.dart b/lib/app/create/deposit/deposit_page.dart index d7c933d..f596b2b 100644 --- a/lib/app/create/deposit/deposit_page.dart +++ b/lib/app/create/deposit/deposit_page.dart @@ -98,8 +98,11 @@ class _DepositPageState extends State bool isMaxRangeInfinity = true; bool isMinRangeInfinity = true; bool isBaseTokenAmountUserInput = false; + double? percentRange; double minPrice = 0; double maxPrice = 0; + RangeController minRangeController = RangeController(); + RangeController maxRangeController = RangeController(); late Slippage selectedSlippage = _cubit.depositSettings.slippage; late Duration selectedDeadline = _cubit.depositSettings.deadline; @@ -141,13 +144,38 @@ class _DepositPageState extends State void setFullRange() { setState(() { + percentRange = null; isMinRangeInfinity = true; isMaxRangeInfinity = true; }); + minPrice = 0; + maxPrice = 0; + calculateDepositTokensAmount(); } + void setPercentageRange(double percentage) { + if (currentPrice == 0) return; + + setState(() { + percentRange = percentage; + isMinRangeInfinity = false; + isMaxRangeInfinity = false; + + final percentageDecimals = percentage / 100; + final percentageDifference = currentPrice * percentageDecimals; + + minPrice = currentPrice - percentageDifference; + maxPrice = currentPrice + percentageDifference; + + minRangeController.setRange(minPrice); + maxRangeController.setRange(maxPrice); + + calculateDepositTokensAmount(); + }); + } + void selectYield(YieldDto? yieldDto, YieldTimeFrame? yieldTimeFrame) async { _cubit.selectYield(yieldDto, yieldTimeFrame).then((_) => calculateDepositTokensAmount()); @@ -174,6 +202,7 @@ class _DepositPageState extends State quoteTokenAmountController.text = currentBaseTokenDepositAmount; isBaseTokenAmountUserInput = isReversed && !isBaseTokenAmountUserInput; + if (percentRange != null) setPercentageRange(percentRange!); calculateDepositTokensAmount(); } @@ -328,6 +357,13 @@ class _DepositPageState extends State super.initState(); } + @override + void dispose() { + minRangeController.dispose(); + maxRangeController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Padding( @@ -703,13 +739,6 @@ class _DepositPageState extends State children: [ _sectionTitle(S.of(context).depositPageRangeSectionTitle), const SizedBox(width: 12), - ZupTextButton( - key: const Key("full-range-button"), - onPressed: () => setFullRange(), - label: S.of(context).depositPageRangeSectionFullRange, - icon: Assets.icons.circleDotted.svg(), - alignLeft: false, - ), const Spacer(), if (!isMobileSize(context)) tokenSwitcher ], @@ -722,6 +751,7 @@ class _DepositPageState extends State const SizedBox(height: 10), StreamBuilder( stream: _cubit.poolTickStream, + initialData: _cubit.latestPoolTick, builder: (context, poolTickSnapshot) { return Text( "1 ${baseToken.symbol} ≈ ${() { @@ -738,12 +768,51 @@ class _DepositPageState extends State enabled: poolTickSnapshot.data == null, ); }), - const SizedBox(height: 20), + const SizedBox(height: 10), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + ZupMiniButton( + key: const Key("full-range-button"), + onPressed: () => setFullRange(), + isSelected: isMaxRangeInfinity && isMinRangeInfinity, + title: S.of(context).depositPageRangeSectionFullRange, + icon: Assets.icons.circleDotted.svg(), + ), + ZupMiniButton( + key: const Key("5-percent-range-button"), + onPressed: () => setPercentageRange(5), + isSelected: percentRange == 5, + title: "5%", + icon: Assets.icons.plusminus.svg(), + // alignLeft: true, + ), + ZupMiniButton( + key: const Key("20-percent-range-button"), + onPressed: () => setPercentageRange(20), + isSelected: percentRange == 20, + title: "20%", + icon: Assets.icons.plusminus.svg(), + // alignLeft: true, + ), + ZupMiniButton( + key: const Key("50-percent-range-button"), + onPressed: () => setPercentageRange(50), + isSelected: percentRange == 50, + title: "50%", + icon: Assets.icons.plusminus.svg(), + // alignLeft: true, + ), + ], + ), + const SizedBox(height: 10), StreamBuilder( stream: _cubit.poolTickStream, builder: (context, snapshot) { return RangeSelector( key: const Key("min-price-selector"), + onUserType: () => percentRange = null, onPriceChanged: (price) { setState(() { if (price == 0) { @@ -766,6 +835,7 @@ class _DepositPageState extends State tickSpacing: _cubit.selectedYield!.tickSpacing, type: RangeSelectorType.minPrice, isInfinity: isMinRangeInfinity, + rangeController: minRangeController, state: () { if (isOutOfRange.minPrice) { return RangeSelectorState( @@ -786,6 +856,7 @@ class _DepositPageState extends State key: const Key("max-price-selector"), displayBaseTokenSymbol: baseToken.symbol, displayQuoteTokenSymbol: quoteToken.symbol, + onUserType: () => percentRange = null, onPriceChanged: (price) { setState(() { if (price == 0) { @@ -807,6 +878,7 @@ class _DepositPageState extends State poolToken1: _cubit.selectedYield!.token1, isReversed: areTokensReversed, tickSpacing: _cubit.selectedYield!.tickSpacing, + rangeController: maxRangeController, state: () { if (isRangeInvalid) { return RangeSelectorState( diff --git a/lib/app/create/deposit/widgets/range_selector.dart b/lib/app/create/deposit/widgets/range_selector.dart index de702e0..9f25473 100644 --- a/lib/app/create/deposit/widgets/range_selector.dart +++ b/lib/app/create/deposit/widgets/range_selector.dart @@ -42,6 +42,16 @@ class RangeSelectorState { final String? message; } +class RangeController extends ChangeNotifier { + double currentRange = 0; + + void setRange(double range) { + currentRange = range; + + notifyListeners(); + } +} + class RangeSelector extends StatefulWidget { const RangeSelector({ super.key, @@ -53,8 +63,10 @@ class RangeSelector extends StatefulWidget { required this.tickSpacing, required this.onPriceChanged, required this.type, + this.onUserType, this.isInfinity = false, this.initialPrice, + this.rangeController, this.state = const RangeSelectorState(type: RangeSelectorStateType.regular), }); @@ -66,9 +78,11 @@ class RangeSelector extends StatefulWidget { final double? initialPrice; final int tickSpacing; final Function(double price) onPriceChanged; + final Function()? onUserType; final RangeSelectorState state; final RangeSelectorType type; final bool isInfinity; + final RangeController? rangeController; @override State createState() => _RangeSelectorState(); @@ -91,12 +105,12 @@ class _RangeSelectorState extends State with V3PoolConversorsMixi } final typedDecimals = typedPrice.decimals; + final nextPrice = getAdjustedPrice(typedPrice); - controller.text = Decimal.tryParse(getAdjustedPrice(typedPrice).toString()) - ?.toStringAsFixed(typedDecimals < 4 ? 4 : typedDecimals) ?? - ""; + controller.text = + Decimal.tryParse(nextPrice.toString())?.toStringAsFixed(typedDecimals < 4 ? 4 : typedDecimals) ?? ""; - widget.onPriceChanged(getAdjustedPrice(typedPrice)); + widget.onPriceChanged(nextPrice); } double getAdjustedPrice(double price) { @@ -186,6 +200,11 @@ class _RangeSelectorState extends State with V3PoolConversorsMixi void initState() { super.initState(); + widget.rangeController?.addListener(() { + userTypedValue = widget.rangeController?.currentRange.toString(); + adjustTypedAmountAndCallback(); + }); + WidgetsBinding.instance.addPostFrameCallback((_) { if (widget.isInfinity) return setInfinity(); @@ -251,7 +270,10 @@ class _RangeSelectorState extends State with V3PoolConversorsMixi keyboardType: const TextInputType.numberWithOptions(decimal: true), clipBehavior: Clip.none, controller: controller, - onChanged: (value) => userTypedValue = value, + onChanged: (value) { + userTypedValue = value; + widget.onUserType?.call(); + }, style: const TextStyle(fontSize: 28), decoration: const InputDecoration( enabledBorder: InputBorder.none, diff --git a/lib/core/dtos/yield_dto.dart b/lib/core/dtos/yield_dto.dart index 0ddd6e7..191d414 100644 --- a/lib/core/dtos/yield_dto.dart +++ b/lib/core/dtos/yield_dto.dart @@ -49,6 +49,7 @@ class YieldDto with _$YieldDto { required num yield90d, required int chainId, required PoolType poolType, + @Default("0") String latestTick, @Default(0) num totalValueLockedUSD, @Default(EthereumConstants.zeroAddress) @JsonKey(name: "hooksAddress") String v4Hooks, @JsonKey(name: "poolManagerAddress") String? v4PoolManager, @@ -68,6 +69,7 @@ class YieldDto with _$YieldDto { yield24h: 32.2, yield30d: 32.2, yield90d: 32.2, + latestTick: "1567241", positionManagerAddress: "0x5Df2f0aFb5b5bB2Df9D1e9C7b6f5f0DD5f9eD5e0", poolAddress: "0x5Df2f0aFb5b5bB2Df9D1e9C7b6f5f0DD5f9eD5e0", poolType: PoolType.v3, diff --git a/lib/core/dtos/yields_dto.dart b/lib/core/dtos/yields_dto.dart index 15a54a6..2bda1bc 100644 --- a/lib/core/dtos/yields_dto.dart +++ b/lib/core/dtos/yields_dto.dart @@ -33,6 +33,7 @@ class YieldsDto with _$YieldsDto { factory YieldsDto.fixture() => const YieldsDto( pools: [ YieldDto( + latestTick: "637812562", positionManagerAddress: "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4", poolType: PoolType.v3, token0: TokenDto( diff --git a/pubspec.lock b/pubspec.lock index e842ad6..f39ed55 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1293,7 +1293,7 @@ packages: description: path: "." ref: main - resolved-ref: "42dfe9f12673e21d2bc15623a6f58a1094969f2c" + resolved-ref: "96c38241bbd55f27820c0fbe0e62ed53f2febed7" url: "https://github.com/Zup-Protocol/web3kit.git" source: git version: "0.0.1" @@ -1351,7 +1351,7 @@ packages: description: path: "." ref: main - resolved-ref: e67c82ded372f740d5b2e7823d4bce070efdb3bb + resolved-ref: cd1e5f42c34c93ec91f8da476ec19cc2d2435c36 url: "https://github.com/Zup-Protocol/zup-ui-kit.git" source: git version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index 132d90b..e62a16f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,13 +53,13 @@ dependencies: firebase_analytics: ^11.4.5 envied: ^1.1.1 -dependency_overrides: - # zup_core: - # path: ../zup-core - # web3kit: - # path: ../web3kit - # zup_ui_kit: - # path: ../zup-ui-kit +# dependency_overrides: +# zup_core: +# path: ../zup-core +# web3kit: +# path: ../web3kit +# zup_ui_kit: +# path: ../zup-ui-kit dev_dependencies: flutter_test: diff --git a/test/app/create/deposit/deposit_cubit_test.dart b/test/app/create/deposit/deposit_cubit_test.dart index d3d5284..551aed1 100644 --- a/test/app/create/deposit/deposit_cubit_test.dart +++ b/test/app/create/deposit/deposit_cubit_test.dart @@ -120,15 +120,10 @@ void main() { async.elapse(const Duration(minutes: minutesPassed)); expect(actualLastEmittedPoolTick, poolTick); - expect( - eventsCounter, - minutesPassed * - 2, /* it will be called twice per minute because - of one of the emits are null, - before fetching the latest tick */ - ); + expect(eventsCounter, minutesPassed); }); }); + test("""And when the minuted passed, but the selected yield is null it should not execute the task to get the pool tick""", () async { BigInt? actualLastEmittedPoolTick; @@ -289,20 +284,12 @@ void main() { await sut.getSelectedPoolTick(); }); - test("When calling `getSelectedPoolTick` it should emit a null pool tick before getting the pool tick", () async { - expectLater(sut.poolTickStream, emits(null)); - - await sut.selectYield(YieldDto.fixture(), YieldTimeFrame.day); - await sut.getSelectedPoolTick(); - }); - test("When calling `getSelectedPoolTick` it should use the pool service to get it", () async { final yieldDto = YieldDto.fixture(); await sut.selectYield(yieldDto, YieldTimeFrame.day); await sut.getSelectedPoolTick(); - verify(() => poolService.getPoolTick(yieldDto)) - .called(2); // 2 because of the `selectYield` and the `getSelectedPoolTick` + verify(() => poolService.getPoolTick(yieldDto)).called(1); }); test("""" @@ -331,20 +318,184 @@ void main() { await sut.selectYield(yieldA, YieldTimeFrame.day); // assuming that select yield will call `getSelectedPoolTick` verify(() => poolService.getPoolTick(yieldB)) - .called(2); // 2 because of the check in the `getSelectedPoolTick` that will re-call, and the selection + .called(1); // 2 because of the check in the `getSelectedPoolTick` that will re-call, and the selection expect(sut.latestPoolTick, expectedYieldBTick); }); - test("When calling `getSelectedPoolTick` it should emit the pool tick got", () async { - final expectedPoolTick = BigInt.from(97866745634534392); + test("""When calling `selectYield` it should first emit the selected yield latest tick from the DTO + (without making a contract call)""", () { + final latestTickYield = BigInt.from(27189); - when(() => poolService.getPoolTick(any())).thenAnswer((_) async => expectedPoolTick); + expectLater(sut.poolTickStream, emits(latestTickYield)); - expectLater(sut.poolTickStream, emitsInOrder([null, expectedPoolTick])); + sut.selectYield( + YieldDto.fixture().copyWith(latestTick: latestTickYield.toString()), + YieldTimeFrame.day, + ); + + expect(sut.latestPoolTick, latestTickYield); + }); + + test( + """When calling 'getSelectedPoolTick' with `forceRefresh` true, + it should get the tick again regardless of the cached value""", + () async { + final selectedYield = YieldDto.fixture(); + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => poolTick); + + await sut.selectYield(selectedYield, YieldTimeFrame.day); + await sut.getSelectedPoolTick(forceRefresh: true); + + verify(() => poolService.getPoolTick(selectedYield)).called(2); + }, + ); + + test( + """When calling 'getSelectedPoolTick' multiple times for the same + pool within a minute, it should not get the tick again from the + contract. Instead, it should use the cached value""", + () async { + final selectedYield = YieldDto.fixture(); + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => poolTick); + + await sut.selectYield(selectedYield, YieldTimeFrame.day); + + await sut.getSelectedPoolTick(); + await sut.getSelectedPoolTick(); + await sut.getSelectedPoolTick(); + await sut.getSelectedPoolTick(); + await sut.getSelectedPoolTick(); + + verify(() => poolService.getPoolTick(selectedYield)).called(1); + }, + ); + + test( + """When calling 'getSelectedPoolTick' multiple times for different + pools in the same network, it should get the tick again for each + one and emit it""", + () async { + final yieldA = YieldDto.fixture().copyWith(poolAddress: "0xPoolAddressYieldA"); + final yieldB = YieldDto.fixture().copyWith(poolAddress: "0xPoolAddressYieldB"); + final yieldC = YieldDto.fixture().copyWith(poolAddress: "0xPoolAddressYieldC"); + + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => poolTick); + + await sut.selectYield(yieldA, YieldTimeFrame.day); // assuming that select yield will call `getSelectedPoolTick` + await sut.selectYield(yieldB, YieldTimeFrame.day); + await sut.selectYield(yieldC, YieldTimeFrame.day); + + verify(() => poolService.getPoolTick(yieldA)).called(1); + verify(() => poolService.getPoolTick(yieldB)).called(1); + verify(() => poolService.getPoolTick(yieldC)).called(1); + }, + ); + + test( + """When calling 'getSelectedPoolTick' multiple times for different + pools in other networks, it should get the tick again for each + one and emit it""", + () async { + final yieldA = YieldDto.fixture().copyWith( + poolAddress: "0xPoolAddressYieldA", + chainId: AppNetworks.mainnet.chainId, + ); + final yieldB = YieldDto.fixture().copyWith( + poolAddress: "0xPoolAddressYieldB", + chainId: AppNetworks.sepolia.chainId, + ); + final yieldC = YieldDto.fixture().copyWith( + poolAddress: "0xPoolAddressYieldC", + chainId: AppNetworks.unichain.chainId, + ); + + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => poolTick); + + await sut.selectYield(yieldA, YieldTimeFrame.day); // assuming that select yield will call `getSelectedPoolTick` + await sut.selectYield(yieldB, YieldTimeFrame.day); + await sut.selectYield(yieldC, YieldTimeFrame.day); + + verify(() => poolService.getPoolTick(yieldA)).called(1); + verify(() => poolService.getPoolTick(yieldB)).called(1); + verify(() => poolService.getPoolTick(yieldC)).called(1); + }, + ); + + test( + """When calling 'getSelectedPoolTick' multiple times for the same + pool address but in other networks, it should get the tick again for each + one and emit it""", + () async { + const poolAddress = "0xPoolAddress"; + final yieldA = YieldDto.fixture().copyWith( + poolAddress: poolAddress, + chainId: AppNetworks.mainnet.chainId, + ); + final yieldB = YieldDto.fixture().copyWith( + poolAddress: poolAddress, + chainId: AppNetworks.sepolia.chainId, + ); + final yieldC = YieldDto.fixture().copyWith( + poolAddress: poolAddress, + chainId: AppNetworks.unichain.chainId, + ); + + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => poolTick); + + await sut.selectYield(yieldA, YieldTimeFrame.day); // assuming that select yield will call `getSelectedPoolTick` + await sut.selectYield(yieldB, YieldTimeFrame.day); + await sut.selectYield(yieldC, YieldTimeFrame.day); + + verify(() => poolService.getPoolTick(yieldA)).called(1); + verify(() => poolService.getPoolTick(yieldB)).called(1); + verify(() => poolService.getPoolTick(yieldC)).called(1); + }, + ); + + test( + """When calling 'getSelectedPoolTick', it should use the zup singleton cache with a expiration of 1 minute""", + () async { + final selectedYield = YieldDto.fixture(); + + zupSingletonCache = ZupSingletonCacheMock(); + sut = DepositCubit(yieldRepository, zupSingletonCache, wallet, cache, appCubit, zupAnalytics, poolService); + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => poolTick); + when(() => zupSingletonCache.clear()).thenAnswer((_) async => {}); + when(() => zupSingletonCache.run( + any(), + key: any(named: "key"), + expiration: any(named: "expiration"), + ignoreCache: any(named: "ignoreCache"), + )).thenAnswer((_) async => poolTick); + + await sut.selectYield(selectedYield, YieldTimeFrame.day); + await sut.getSelectedPoolTick(); + + verify(() => zupSingletonCache.run( + any(), + key: "poolTick-${selectedYield.poolAddress}-${selectedYield.network.name}", + expiration: const Duration(minutes: 1), + ignoreCache: false, + )).called(1); + }, + ); + + test("""When calling `getSelectedPoolTick` + it should emit the pool tick got from + the contract, after emitting the one + from the yield call""", () async { + final newExpectedPoolTick = BigInt.from(97866745634534392); + final latestTickYield = BigInt.from(27189); + + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => newExpectedPoolTick); + + expectLater(sut.poolTickStream, emitsInOrder([latestTickYield, newExpectedPoolTick])); await sut.selectYield( - YieldDto.fixture(), YieldTimeFrame.day); // assuming that select yield will call `getSelectedPoolTick` + YieldDto.fixture().copyWith(latestTick: latestTickYield.toString()), + YieldTimeFrame.day, + ); // assuming that select yield will call `getSelectedPoolTick` }); test("When calling `getSelectedPoolTick` it should save the pool tick in the cubit", () async { @@ -359,15 +510,19 @@ void main() { }); test("When calling `getSelectedPoolTick` it should save the same tick as the emitted ", () async { - final expectedPoolTick = BigInt.from(97866745634534392); + final newWxpectedPoolTick = BigInt.from(97866745634534392); + final yieldTick = BigInt.from(27189); - when(() => poolService.getPoolTick(any())).thenAnswer((_) async => expectedPoolTick); + when(() => poolService.getPoolTick(any())).thenAnswer((_) async => newWxpectedPoolTick); + + expectLater(sut.poolTickStream, emitsInOrder([yieldTick, newWxpectedPoolTick])); - expectLater(sut.poolTickStream, emitsInOrder([null, expectedPoolTick])); await sut.selectYield( - YieldDto.fixture(), YieldTimeFrame.day); // assuming that select yield will call `getSelectedPoolTick` + YieldDto.fixture().copyWith(latestTick: yieldTick.toString()), + YieldTimeFrame.day, + ); // assuming that select yield will call `getSelectedPoolTick` - expect(sut.latestPoolTick, expectedPoolTick); + expect(sut.latestPoolTick, newWxpectedPoolTick); }); test("when closing the cubit, it should close the pool tick stream", () async { diff --git a/test/app/create/deposit/deposit_page_test.dart b/test/app/create/deposit/deposit_page_test.dart index ba41504..f042d3f 100644 --- a/test/app/create/deposit/deposit_page_test.dart +++ b/test/app/create/deposit/deposit_page_test.dart @@ -414,7 +414,7 @@ void main() { await tester.pumpDeviceBuilder(await goldenBuilder(isMobile: true)); await tester.pumpAndSettle(); - await tester.drag(find.byKey(const Key("full-range-button")), const Offset(0, -500)); + await tester.drag(find.byKey(const Key("deposit-settings-button")), const Offset(0, -500)); await tester.pumpAndSettle(); await tester.pumpAndSettle(); @@ -785,6 +785,191 @@ void main() { }); }); + zGoldenTest( + "When clicking the 5% range button and then clicking the full range button, it should set it to full range", + goldenFileName: "deposit_page_5_percent_set_to_full_range", (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("5-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key("full-range-button"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 5% range button and then clicking the full range button, + it should set it to full range. And when clicking to reverse tokens, it should + keep the full range selected""", goldenFileName: "deposit_page_5_percent_set_to_full_range_reverse_tokens", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("5-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key("full-range-button"))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key("reverse-tokens-reversed"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 5% range button, it should set 5% up + and 5% down of the current price for the min and max prices""", goldenFileName: "deposit_page_set_5_percent_range", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("5-percent-range-button"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 5% range button, it should set 5% up + and 5% down of the current price for the min and max prices. And when + clicking to reverse tokens, it should keep the 5% range selected but + now with the reverse tokens range ratio""", goldenFileName: "deposit_page_set_5_percent_range_reverse_tokens", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("5-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key("reverse-tokens-reversed"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 20% range button, it should set 20% up + and 20% down of the current price for the min and max prices""", goldenFileName: "deposit_page_set_20_percent_range", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("20-percent-range-button"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 20% range button, it should set 20% up + and 20% down of the current price for the min and max prices. And when + clicking to reverse tokens, it should keep the 20% range selected but + now with the reverse tokens range ratio""", goldenFileName: "deposit_page_set_20_percent_range_reverse_tokens", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("20-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key("reverse-tokens-reversed"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 50% range button, it should set 50% up + and 50% down of the current price for the min and max prices""", goldenFileName: "deposit_page_set_50_percent_range", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("50-percent-range-button"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the 50% range button, it should set 50% up + and 50% down of the current price for the min and max prices. And when + clicking to reverse tokens, it should keep the 50% range selected but + now with the reverse tokens range ratio""", goldenFileName: "deposit_page_set_50_percent_range_reverse_tokens", + (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("50-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key("reverse-tokens-reversed"))); + await tester.pumpAndSettle(); + }); + }); + zGoldenTest("When typing a max price, but then selecting the full range button, it should set it to infinity", goldenFileName: "deposit_page_max_price_set_to_full_range", (tester) async { await tester.runAsync(() async { @@ -807,6 +992,60 @@ void main() { }); }); + zGoldenTest("""When clicking the percentage range button,but then typing a custom max price, + and reversing tokens, it should keep the typed max price. And the min price should be the + one from the percentage range""", + goldenFileName: "deposit_page_set_percentage_range_then_type_max_price_reverse_tokens", (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("50-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.enterText(find.byKey(const Key("max-price-selector")), "1"); + FocusManager.instance.primaryFocus?.unfocus(); + + await tester.tap(find.byKey(const Key("reverse-tokens-reversed"))); + await tester.pumpAndSettle(); + }); + }); + + zGoldenTest("""When clicking the percentage range button,but then typing a custom min price, + and reversing tokens, it should keep the typed min price and the max price should be the + one from the percentage range""", + goldenFileName: "deposit_page_set_percentage_range_then_type_min_price_reverse_tokens", (tester) async { + await tester.runAsync(() async { + final selectedYield = YieldsDto.fixture().best24hYield; + final currentPriceAsTick = BigInt.from(174072); + + when(() => cubit.selectedYieldStream).thenAnswer((_) => Stream.value(selectedYield)); + when(() => cubit.selectedYield).thenReturn(selectedYield); + when(() => cubit.state).thenReturn(DepositState.success(YieldsDto.fixture())); + when(() => cubit.poolTickStream).thenAnswer((_) => Stream.value(currentPriceAsTick)); + when(() => cubit.latestPoolTick).thenReturn(currentPriceAsTick); + + await tester.pumpDeviceBuilder(await goldenBuilder()); + + await tester.tap(find.byKey(const Key("50-percent-range-button"))); + await tester.pumpAndSettle(); + + await tester.enterText(find.byKey(const Key("min-price-selector")), "1216"); + FocusManager.instance.primaryFocus?.unfocus(); + + await tester.tap(find.byKey(const Key("reverse-tokens-reversed"))); + await tester.pumpAndSettle(); + }); + }); + zGoldenTest("""When typing a min and max price and then clicking the full range button, it should set the min price to 0 and the max price to infinity""", goldenFileName: "deposit_page_min_and_max_price_set_to_full_range", (tester) async { @@ -1880,7 +2119,7 @@ void main() { await tester.pumpDeviceBuilder(await goldenBuilder(), wrapper: GoldenConfig.localizationsWrapper()); await tester.tap(find.byKey(const Key("yield-card-24h"))); await tester.pumpAndSettle(); - await tester.drag(find.byKey(const Key("deposit-section")), const Offset(0, -500)); + await tester.drag(find.byKey(const Key("deposit-settings-button")), const Offset(0, -500)); await tester.pumpAndSettle(); await tester.enterText(find.byKey(const Key("quote-token-input-card")), "1"); @@ -2205,7 +2444,7 @@ void main() { await tester.tap(find.byKey(const Key("deposit-settings-button"))); // closing the dropdown await tester.pumpAndSettle(); - await tester.drag(find.byKey(const Key("deposit-section")), const Offset(0, -500)); + await tester.drag(find.byKey(const Key("deposit-settings-button")), const Offset(0, -1000)); await tester.pumpAndSettle(); await tester.enterText(find.byKey(const Key("quote-token-input-card")), "1"); diff --git a/test/app/create/deposit/goldens/deposit_page_5_percent_set_to_full_range.png b/test/app/create/deposit/goldens/deposit_page_5_percent_set_to_full_range.png new file mode 100644 index 0000000..be0223a Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_5_percent_set_to_full_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_5_percent_set_to_full_range_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_5_percent_set_to_full_range_reverse_tokens.png new file mode 100644 index 0000000..289d19d Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_5_percent_set_to_full_range_reverse_tokens.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_base_token_input_enabled_after_loading.png b/test/app/create/deposit/goldens/deposit_page_base_token_input_enabled_after_loading.png index 4bd8863..bebcbfa 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_base_token_input_enabled_after_loading.png and b/test/app/create/deposit/goldens/deposit_page_base_token_input_enabled_after_loading.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_base_token_input_loading.png b/test/app/create/deposit/goldens/deposit_page_base_token_input_loading.png index 652ad91..4ec6333 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_base_token_input_loading.png and b/test/app/create/deposit/goldens/deposit_page_base_token_input_loading.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_calculate_price.png b/test/app/create/deposit/goldens/deposit_page_calculate_price.png index 368ab27..6ad5752 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_calculate_price.png and b/test/app/create/deposit/goldens/deposit_page_calculate_price.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_calculate_price_reversed.png b/test/app/create/deposit/goldens/deposit_page_calculate_price_reversed.png index 719ee74..289d19d 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_calculate_price_reversed.png and b/test/app/create/deposit/goldens/deposit_page_calculate_price_reversed.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_enough_balance_deposit_button.png b/test/app/create/deposit/goldens/deposit_page_enough_balance_deposit_button.png index a4db142..28717d0 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_enough_balance_deposit_button.png and b/test/app/create/deposit/goldens/deposit_page_enough_balance_deposit_button.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount.png index 906fddd..80f1dcb 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_change_range.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_change_range.png index f83f505..a2c75ad 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_change_range.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_change_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse.png index 9913e78..bf3ea4a 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse_back.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse_back.png index 5e9bf9e..c639997 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse_back.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_and_reverse_back.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reverse_tokens_and_change_range.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reverse_tokens_and_change_range.png index cdc4e9f..a2c1227 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reverse_tokens_and_change_range.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reverse_tokens_and_change_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reversed.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reversed.png index c79530b..c61387a 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reversed.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_reversed.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_reverse_tokens_then_set_max_price_out_of_range.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_reverse_tokens_then_set_max_price_out_of_range.png index 08ad629..345ae45 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_reverse_tokens_then_set_max_price_out_of_range.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_reverse_tokens_then_set_max_price_out_of_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_set_max_price_out_of_range.png b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_set_max_price_out_of_range.png index 13d3ef2..38a96bf 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_set_max_price_out_of_range.png and b/test/app/create/deposit/goldens/deposit_page_input_base_token_amount_then_set_max_price_out_of_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount.png index 5c56177..eb652be 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_change_range.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_change_range.png index 10d5ae0..2d6032b 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_change_range.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_change_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse.png index f89f954..e6264d8 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse_back.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse_back.png index e381e1c..120641e 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse_back.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_and_reverse_back.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reverse_tokens_and_change_range.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reverse_tokens_and_change_range.png index 624f263..d88d40b 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reverse_tokens_and_change_range.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reverse_tokens_and_change_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reversed.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reversed.png index 2ac1fac..82f0518 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reversed.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_reversed.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_reverse_tokens_then_set_min_price_out_of_range.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_reverse_tokens_then_set_min_price_out_of_range.png index 6aa2343..de57a46 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_reverse_tokens_then_set_min_price_out_of_range.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_reverse_tokens_then_set_min_price_out_of_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_set_min_price_out_of_range.png b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_set_min_price_out_of_range.png index a8f94b2..db55603 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_set_min_price_out_of_range.png and b/test/app/create/deposit/goldens/deposit_page_input_quote_token_amount_then_set_min_price_out_of_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_range_then_input_base_token_amount.png b/test/app/create/deposit/goldens/deposit_page_input_range_then_input_base_token_amount.png index 2cc9066..6d6f6a8 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_range_then_input_base_token_amount.png and b/test/app/create/deposit/goldens/deposit_page_input_range_then_input_base_token_amount.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_range_then_input_quote_token_amount.png b/test/app/create/deposit/goldens/deposit_page_input_range_then_input_quote_token_amount.png index 8f0d814..486c054 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_range_then_input_quote_token_amount.png and b/test/app/create/deposit/goldens/deposit_page_input_range_then_input_quote_token_amount.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_base_token_amount.png b/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_base_token_amount.png index 624f263..d88d40b 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_base_token_amount.png and b/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_base_token_amount.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_quote_token_amount.png b/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_quote_token_amount.png index cdc4e9f..a2c1227 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_quote_token_amount.png and b/test/app/create/deposit/goldens/deposit_page_input_range_then_reverse_tokens_then_input_quote_token_amount.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_invalid_range_deposit_section.png b/test/app/create/deposit/goldens/deposit_page_invalid_range_deposit_section.png index 4620174..bf53d2e 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_invalid_range_deposit_section.png and b/test/app/create/deposit/goldens/deposit_page_invalid_range_deposit_section.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_max_price_less_than_min_price.png b/test/app/create/deposit/goldens/deposit_page_max_price_less_than_min_price.png index cb22fde..724ffd1 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_max_price_less_than_min_price.png and b/test/app/create/deposit/goldens/deposit_page_max_price_less_than_min_price.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_max_price_out_of_range.png b/test/app/create/deposit/goldens/deposit_page_max_price_out_of_range.png index 6d48682..9d9f4f7 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_max_price_out_of_range.png and b/test/app/create/deposit/goldens/deposit_page_max_price_out_of_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_max_price_set_to_full_range.png b/test/app/create/deposit/goldens/deposit_page_max_price_set_to_full_range.png index a69ec57..be0223a 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_max_price_set_to_full_range.png and b/test/app/create/deposit/goldens/deposit_page_max_price_set_to_full_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_max_price_set_to_infinity.png b/test/app/create/deposit/goldens/deposit_page_max_price_set_to_infinity.png index 5720cea..d6fc6a2 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_max_price_set_to_infinity.png and b/test/app/create/deposit/goldens/deposit_page_max_price_set_to_infinity.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_max_range_out_of_range_deposit_button.png b/test/app/create/deposit/goldens/deposit_page_max_range_out_of_range_deposit_button.png index 34ef2b6..6d7a20b 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_max_range_out_of_range_deposit_button.png and b/test/app/create/deposit/goldens/deposit_page_max_range_out_of_range_deposit_button.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_min_and_max_price_set_to_full_range.png b/test/app/create/deposit/goldens/deposit_page_min_and_max_price_set_to_full_range.png index a69ec57..be0223a 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_min_and_max_price_set_to_full_range.png and b/test/app/create/deposit/goldens/deposit_page_min_and_max_price_set_to_full_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range.png b/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range.png index 1e960e1..5879452 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range.png and b/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed.png b/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed.png index dd43559..5fd0a0d 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed.png and b/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed_in_range.png b/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed_in_range.png index 68deb04..5a93f42 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed_in_range.png and b/test/app/create/deposit/goldens/deposit_page_min_price_out_of_range_reversed_in_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_min_price_set_to_full_range.png b/test/app/create/deposit/goldens/deposit_page_min_price_set_to_full_range.png index a69ec57..be0223a 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_min_price_set_to_full_range.png and b/test/app/create/deposit/goldens/deposit_page_min_price_set_to_full_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_min_range_out_of_range_deposit_button.png b/test/app/create/deposit/goldens/deposit_page_min_range_out_of_range_deposit_button.png index 341a677..7c0ce6a 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_min_range_out_of_range_deposit_button.png and b/test/app/create/deposit/goldens/deposit_page_min_range_out_of_range_deposit_button.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_no_amount_deposit_button.png b/test/app/create/deposit/goldens/deposit_page_no_amount_deposit_button.png index f551014..cd6b0cf 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_no_amount_deposit_button.png and b/test/app/create/deposit/goldens/deposit_page_no_amount_deposit_button.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_not_connected.png b/test/app/create/deposit/goldens/deposit_page_not_connected.png index eb229fb..f1a28c5 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_not_connected.png and b/test/app/create/deposit/goldens/deposit_page_not_connected.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_not_connected_deposit_button_click.png b/test/app/create/deposit/goldens/deposit_page_not_connected_deposit_button_click.png index abf8220..2301361 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_not_connected_deposit_button_click.png and b/test/app/create/deposit/goldens/deposit_page_not_connected_deposit_button_click.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button.png b/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button.png index 774f534..5b16a4b 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button.png and b/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button_after_connecting.png b/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button_after_connecting.png index 200e1a1..80c12b8 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button_after_connecting.png and b/test/app/create/deposit/goldens/deposit_page_not_enough_base_token_balance_deposit_button_after_connecting.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button.png b/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button.png index 448b36e..62b0533 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button.png and b/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button_after_connecting.png b/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button_after_connecting.png index 448b36e..62b0533 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button_after_connecting.png and b/test/app/create/deposit/goldens/deposit_page_not_enough_quote_token_balance_deposit_button_after_connecting.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_preview_modal.png b/test/app/create/deposit/goldens/deposit_page_preview_modal.png index 0bb3184..c5dc992 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_preview_modal.png and b/test/app/create/deposit/goldens/deposit_page_preview_modal.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_quote_token_input_enabled_after_loading.png b/test/app/create/deposit/goldens/deposit_page_quote_token_input_enabled_after_loading.png index 09a5502..a2c187d 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_quote_token_input_enabled_after_loading.png and b/test/app/create/deposit/goldens/deposit_page_quote_token_input_enabled_after_loading.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_quote_token_input_loading.png b/test/app/create/deposit/goldens/deposit_page_quote_token_input_loading.png index 197c07d..df0b72f 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_quote_token_input_loading.png and b/test/app/create/deposit/goldens/deposit_page_quote_token_input_loading.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_range_section_mobile.png b/test/app/create/deposit/goldens/deposit_page_range_section_mobile.png index 40defe1..1483027 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_range_section_mobile.png and b/test/app/create/deposit/goldens/deposit_page_range_section_mobile.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_reverse_tokens.png index 7aff470..cb1afb5 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_reverse_tokens.png and b/test/app/create/deposit/goldens/deposit_page_reverse_tokens.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_reverse_tokens_back.png b/test/app/create/deposit/goldens/deposit_page_reverse_tokens_back.png index 111650d..1ef9298 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_reverse_tokens_back.png and b/test/app/create/deposit/goldens/deposit_page_reverse_tokens_back.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_select_yield_scroll.png b/test/app/create/deposit/goldens/deposit_page_select_yield_scroll.png index d20acbc..23c587b 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_select_yield_scroll.png and b/test/app/create/deposit/goldens/deposit_page_select_yield_scroll.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_selected_yield_stream.png b/test/app/create/deposit/goldens/deposit_page_selected_yield_stream.png index 2bd391e..10d90e4 100644 Binary files a/test/app/create/deposit/goldens/deposit_page_selected_yield_stream.png and b/test/app/create/deposit/goldens/deposit_page_selected_yield_stream.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_20_percent_range.png b/test/app/create/deposit/goldens/deposit_page_set_20_percent_range.png new file mode 100644 index 0000000..f2d614e Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_20_percent_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_20_percent_range_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_set_20_percent_range_reverse_tokens.png new file mode 100644 index 0000000..b3e6105 Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_20_percent_range_reverse_tokens.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_50_percent_range.png b/test/app/create/deposit/goldens/deposit_page_set_50_percent_range.png new file mode 100644 index 0000000..fdad4a6 Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_50_percent_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_50_percent_range_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_set_50_percent_range_reverse_tokens.png new file mode 100644 index 0000000..7b6e3d0 Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_50_percent_range_reverse_tokens.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_5_percent_range.png b/test/app/create/deposit/goldens/deposit_page_set_5_percent_range.png new file mode 100644 index 0000000..ac07fcd Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_5_percent_range.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_5_percent_range_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_set_5_percent_range_reverse_tokens.png new file mode 100644 index 0000000..e1be2b9 Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_5_percent_range_reverse_tokens.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_percentage_range_then_type_max_price_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_set_percentage_range_then_type_max_price_reverse_tokens.png new file mode 100644 index 0000000..2796c6b Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_percentage_range_then_type_max_price_reverse_tokens.png differ diff --git a/test/app/create/deposit/goldens/deposit_page_set_percentage_range_then_type_min_price_reverse_tokens.png b/test/app/create/deposit/goldens/deposit_page_set_percentage_range_then_type_min_price_reverse_tokens.png new file mode 100644 index 0000000..e2959c3 Binary files /dev/null and b/test/app/create/deposit/goldens/deposit_page_set_percentage_range_then_type_min_price_reverse_tokens.png differ diff --git a/test/golden_config.dart b/test/golden_config.dart index d447388..ad86fe6 100644 --- a/test/golden_config.dart +++ b/test/golden_config.dart @@ -73,7 +73,14 @@ class GoldenConfig { Web3KitLocalizations.delegate, ], theme: ZupTheme.lightTheme, - home: Scaffold(body: child), + home: Scaffold( + body: CustomScrollView(controller: scrollController, slivers: [ + SliverFillRemaining( + hasScrollBody: false, + child: child, + ) + ]), + ), ); } } diff --git a/web/index.html b/web/index.html index a6bc3ec..852bc74 100644 --- a/web/index.html +++ b/web/index.html @@ -61,6 +61,6 @@ inject(); - +