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();
-
+