Skip to content

Commit

Permalink
chore: 🚧 Add feature
Browse files Browse the repository at this point in the history
  • Loading branch information
redDwarf03 committed Feb 1, 2025
1 parent 6053915 commit 7cc4df3
Show file tree
Hide file tree
Showing 29 changed files with 718 additions and 77 deletions.
84 changes: 84 additions & 0 deletions lib/application/airdrop/airdrop.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import 'dart:convert';

import 'package:aewallet/application/api_service.dart';
import 'package:aewallet/application/session/session.dart';
import 'package:aewallet/modules/aeswap/application/farm/farm_lock_factory.dart';
import 'package:aewallet/modules/aeswap/domain/models/util/get_farm_lock_user_infos_response.dart';
import 'package:aewallet/ui/views/aeswap_earn/bloc/provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:http/http.dart' as http;
import 'package:logging/logging.dart';
Expand Down Expand Up @@ -29,3 +34,82 @@ Future<int?> airdropCount(
}
return null;
}

@riverpod
Future<double> airdropPersonalRewards(
Ref ref,
) async {
final keychain = ref.watch(
sessionNotifierProvider.select(
(value) => value.loggedIn?.wallet.appKeychain,
),
);

if (keychain == null) return 0.0;

final apiService = ref.watch(apiServiceProvider);
final farmLock = ref.watch(farmLockFormFarmLockProvider).valueOrNull;

if (farmLock == null) return 0.0;

final farmFactory = FarmLockFactory(farmLock.farmAddress, apiService);

var personalLP = 0.0;
final userGenesisAddresses =
keychain.accounts.map((account) => account.genesisAddress).toList();

const batchSize = 20;

for (var i = 0; i < userGenesisAddresses.length; i += batchSize) {
final batch = userGenesisAddresses.sublist(
i,
(i + batchSize > userGenesisAddresses.length)
? userGenesisAddresses.length
: i + batchSize,
);

final results = await farmFactory.getUserInfosFromMultipleAddresses(batch);

for (final result in results) {
for (final userInfos in result) {
final userInfosResponse = UserInfos.fromJson(userInfos!);
personalLP += userInfosResponse.amount;
}
}
}
return personalLP;
}

@riverpod
Future<int?> airdropPersonalMultiplier(
Ref ref,
) async {
final airdropPersonalRewards =
await ref.watch(airdropPersonalRewardsProvider.future);

return _getMultiplier(airdropPersonalRewards);
}

int? _getMultiplier(double x) {
if (1 <= x && x < 5) {
return 1;
} else if (5 <= x && x < 20) {
return 2;
} else if (20 <= x && x < 60) {
return 3;
} else if (60 <= x && x < 150) {
return 5;
} else if (150 <= x && x < 300) {
return 8;
} else if (300 <= x && x < 500) {
return 13;
} else if (500 <= x && x < 750) {
return 21;
} else if (750 <= x && x < 1000) {
return 34;
} else if (x >= 1000) {
return 55;
} else {
return null;
}
}
38 changes: 38 additions & 0 deletions lib/application/airdrop/airdrop.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions lib/l10n/intl_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,13 @@
"airdropParticipateStepWaitlistDesc2": "Only one airdrop registration is allowed per person. If multiple registrations are detected, all associated airdrops will be canceled.",
"airdropParticipateStepWaitlistInputField": "Email Address",
"airdropParticipateStepWaitlistBtn": "Join the waitlist",
"airdropParticipateStepConfirmEmailTitle": "Your registration is almost complete!",
"airdropParticipateStepConfirmEmailDesc1": "To finalize your participation, please check your inbox and click the confirmation link we just sent at:",
"airdropParticipateStepConfirmEmailDesc2": "Didn’t receive the email? Check your spam folder or ",
"airdropParticipateStepConfirmEmailDesc3": "click here to resend the confirmation email.",
"airdropParticipateStepConfirmEmailDesc4": "Wrong email?",
"airdropParticipateStepConfirmEmailDesc5": "Edit it here.",
"airdropParticipateStepConfirmEmailDesc6": "Your participation will only be validated once your email is confirmed.",
"airdropParticipateStepSupportEcosystemTitle": "The last step to participate in the airdrop is to support our ecosystem and earn rewards.",
"airdropParticipateStepSupportEcosystemDesc1": "Participate in our passive income program, currently offering an impressive ",
"airdropParticipateStepSupportEcosystemDesc2": "! Simply add liquidity to the aeETH/UCO pool, then farm your LP (Liquidity Provider) tokens in our passive income program.\nThe more liquidity you provide, the greater your multiplier in the airdrop.",
Expand Down
36 changes: 36 additions & 0 deletions lib/modules/aeswap/application/farm/farm_lock_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,40 @@ class FarmLockFactory with ModelParser {

return results;
}

/// Returns the informations of multiple addresses who has deposited and locked lp token in the farm
Future<List<dynamic>> getUserInfosFromMultipleAddresses(
List<String> userGenesisAddresses,
) async {
if (userGenesisAddresses.isEmpty) {
return [];
}

final scCallFunctionRequestList = <SCCallFunctionRequest>[];
for (final userGenesisAddress in userGenesisAddresses) {
scCallFunctionRequestList.add(
SCCallFunctionRequest(
method: 'contract_fun',
params: SCCallFunctionParams(
contract: factoryAddress.toUpperCase(),
function: 'get_user_infos',
args: [userGenesisAddress],
),
),
);
}

final results = await apiService.callSCFunctionMulti(
jsonRPCRequests: scCallFunctionRequestList,
);

final userinfos = [];
for (final result in results) {
if (result['result'] != null && (result['result'] as List).isNotEmpty) {
userinfos.add(result['result']);
}
}

return userinfos;
}
}
6 changes: 4 additions & 2 deletions lib/ui/views/airdrop/bloc/provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ class AirdropFormNotifier extends _$AirdropFormNotifier {
AirdropFormNotifier();

@override
AirdropFormState build() => const AirdropFormState();
AirdropFormState build() {
return const AirdropFormState();
}

void setConfirmOnlyOneAirdrop(bool confirmOnlyOneAirdrop) {
state = state.copyWith(
Expand Down Expand Up @@ -63,7 +65,7 @@ class AirdropFormNotifier extends _$AirdropFormNotifier {
if (!state.isItemsConfirmed) {
state = state.copyWith(
failure: const Failure.other(
message: 'Formulaire invalide',
message: 'Invalid Forms',
),
joinWaitlistInProgress: false,
);
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/views/airdrop/bloc/provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions lib/ui/views/airdrop/bloc/state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ part 'state.freezed.dart';
enum AirdropProcessStep {
welcome,
joinWaitlist,
confirmEmail,
supportEcosystem,
sign,
congrats
Expand All @@ -21,6 +22,7 @@ class AirdropFormState with _$AirdropFormState {
@Default(false) bool confirmNotMultipleRegistrations,
@Default(false) bool confirmPrivacyPolicy,
@Default(false) bool joinWaitlistInProgress,
@Default(0.0) double personalLP,
Failure? failure,
}) = _AirdropFormState;
const AirdropFormState._();
Expand Down
25 changes: 24 additions & 1 deletion lib/ui/views/airdrop/bloc/state.freezed.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ mixin _$AirdropFormState {
throw _privateConstructorUsedError;
bool get confirmPrivacyPolicy => throw _privateConstructorUsedError;
bool get joinWaitlistInProgress => throw _privateConstructorUsedError;
double get personalLP => throw _privateConstructorUsedError;
Failure? get failure => throw _privateConstructorUsedError;

/// Create a copy of AirdropFormState
Expand All @@ -46,6 +47,7 @@ abstract class $AirdropFormStateCopyWith<$Res> {
bool confirmNotMultipleRegistrations,
bool confirmPrivacyPolicy,
bool joinWaitlistInProgress,
double personalLP,
Failure? failure});

$FailureCopyWith<$Res>? get failure;
Expand All @@ -72,6 +74,7 @@ class _$AirdropFormStateCopyWithImpl<$Res, $Val extends AirdropFormState>
Object? confirmNotMultipleRegistrations = null,
Object? confirmPrivacyPolicy = null,
Object? joinWaitlistInProgress = null,
Object? personalLP = null,
Object? failure = freezed,
}) {
return _then(_value.copyWith(
Expand Down Expand Up @@ -99,6 +102,10 @@ class _$AirdropFormStateCopyWithImpl<$Res, $Val extends AirdropFormState>
? _value.joinWaitlistInProgress
: joinWaitlistInProgress // ignore: cast_nullable_to_non_nullable
as bool,
personalLP: null == personalLP
? _value.personalLP
: personalLP // ignore: cast_nullable_to_non_nullable
as double,
failure: freezed == failure
? _value.failure
: failure // ignore: cast_nullable_to_non_nullable
Expand Down Expand Up @@ -136,6 +143,7 @@ abstract class _$$AirdropFormStateImplCopyWith<$Res>
bool confirmNotMultipleRegistrations,
bool confirmPrivacyPolicy,
bool joinWaitlistInProgress,
double personalLP,
Failure? failure});

@override
Expand All @@ -161,6 +169,7 @@ class __$$AirdropFormStateImplCopyWithImpl<$Res>
Object? confirmNotMultipleRegistrations = null,
Object? confirmPrivacyPolicy = null,
Object? joinWaitlistInProgress = null,
Object? personalLP = null,
Object? failure = freezed,
}) {
return _then(_$AirdropFormStateImpl(
Expand Down Expand Up @@ -188,6 +197,10 @@ class __$$AirdropFormStateImplCopyWithImpl<$Res>
? _value.joinWaitlistInProgress
: joinWaitlistInProgress // ignore: cast_nullable_to_non_nullable
as bool,
personalLP: null == personalLP
? _value.personalLP
: personalLP // ignore: cast_nullable_to_non_nullable
as double,
failure: freezed == failure
? _value.failure
: failure // ignore: cast_nullable_to_non_nullable
Expand All @@ -206,6 +219,7 @@ class _$AirdropFormStateImpl extends _AirdropFormState {
this.confirmNotMultipleRegistrations = false,
this.confirmPrivacyPolicy = false,
this.joinWaitlistInProgress = false,
this.personalLP = 0.0,
this.failure})
: super._();

Expand All @@ -227,11 +241,14 @@ class _$AirdropFormStateImpl extends _AirdropFormState {
@JsonKey()
final bool joinWaitlistInProgress;
@override
@JsonKey()
final double personalLP;
@override
final Failure? failure;

@override
String toString() {
return 'AirdropFormState(airdropProcessStep: $airdropProcessStep, mailAddress: $mailAddress, confirmOnlyOneAirdrop: $confirmOnlyOneAirdrop, confirmNotMultipleRegistrations: $confirmNotMultipleRegistrations, confirmPrivacyPolicy: $confirmPrivacyPolicy, joinWaitlistInProgress: $joinWaitlistInProgress, failure: $failure)';
return 'AirdropFormState(airdropProcessStep: $airdropProcessStep, mailAddress: $mailAddress, confirmOnlyOneAirdrop: $confirmOnlyOneAirdrop, confirmNotMultipleRegistrations: $confirmNotMultipleRegistrations, confirmPrivacyPolicy: $confirmPrivacyPolicy, joinWaitlistInProgress: $joinWaitlistInProgress, personalLP: $personalLP, failure: $failure)';
}

@override
Expand All @@ -253,6 +270,8 @@ class _$AirdropFormStateImpl extends _AirdropFormState {
other.confirmPrivacyPolicy == confirmPrivacyPolicy) &&
(identical(other.joinWaitlistInProgress, joinWaitlistInProgress) ||
other.joinWaitlistInProgress == joinWaitlistInProgress) &&
(identical(other.personalLP, personalLP) ||
other.personalLP == personalLP) &&
(identical(other.failure, failure) || other.failure == failure));
}

Expand All @@ -265,6 +284,7 @@ class _$AirdropFormStateImpl extends _AirdropFormState {
confirmNotMultipleRegistrations,
confirmPrivacyPolicy,
joinWaitlistInProgress,
personalLP,
failure);

/// Create a copy of AirdropFormState
Expand All @@ -285,6 +305,7 @@ abstract class _AirdropFormState extends AirdropFormState {
final bool confirmNotMultipleRegistrations,
final bool confirmPrivacyPolicy,
final bool joinWaitlistInProgress,
final double personalLP,
final Failure? failure}) = _$AirdropFormStateImpl;
const _AirdropFormState._() : super._();

Expand All @@ -301,6 +322,8 @@ abstract class _AirdropFormState extends AirdropFormState {
@override
bool get joinWaitlistInProgress;
@override
double get personalLP;
@override
Failure? get failure;

/// Create a copy of AirdropFormState
Expand Down
Loading

0 comments on commit 7cc4df3

Please sign in to comment.