Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions android/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@ follow [https://changelog.md/](https://changelog.md/) guidelines.

## [Unreleased]

## [53.1] - 2025-02-21

### ADDED

- Revamped real time fees calculation
- Background notification processing reliability improvements

### FIXED

- Non deterministic bug regarding hardened key derivation

## [52.7] - 2025-01-30

### ADDED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.muun.apollo.data.os.execution.ExecutionTransformerFactory;
import io.muun.apollo.data.os.execution.JobExecutor;
import io.muun.apollo.data.preferences.RepositoryRegistry;
import io.muun.apollo.data.preferences.UserRepository;
import io.muun.apollo.domain.action.NotificationActions;
import io.muun.apollo.domain.action.NotificationPoller;
import io.muun.apollo.domain.libwallet.GoLibwalletService;
Expand Down Expand Up @@ -47,7 +48,7 @@ public class DataModule {
private final Func3<
Context,
ExecutionTransformerFactory,
RepositoryRegistry,
UserRepository,
NotificationService
>
notificationServiceFactory;
Expand All @@ -64,7 +65,7 @@ public DataModule(
Func3<
Context,
ExecutionTransformerFactory,
RepositoryRegistry,
UserRepository,
NotificationService
> notificationServiceFactory,
Func1<Context, AppStandbyBucketProvider> appStandbyBucketProviderFactory,
Expand Down Expand Up @@ -127,9 +128,13 @@ DaoManager provideDaoManager(
NotificationService provideNotificationService(
Context context,
ExecutionTransformerFactory executionTransformerFactory,
RepositoryRegistry repoRegistry
UserRepository userRepository
) {
return notificationServiceFactory.call(context, executionTransformerFactory, repoRegistry);
return notificationServiceFactory.call(
context,
executionTransformerFactory,
userRepository
);
}

@Provides
Expand Down
10 changes: 7 additions & 3 deletions android/apollo/src/main/java/io/muun/apollo/data/external/Gen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import io.muun.apollo.data.preferences.stored.StoredEkVerificationCodes
import io.muun.apollo.domain.model.BitcoinAmount
import io.muun.apollo.domain.model.Contact
import io.muun.apollo.domain.model.ExchangeRateWindow
import io.muun.apollo.domain.model.FeeBumpFunctions
import io.muun.apollo.domain.model.FeeWindow
import io.muun.apollo.domain.model.ForwardingPolicy
import io.muun.apollo.domain.model.IncomingSwap
Expand Down Expand Up @@ -273,9 +274,12 @@ object Gen {
* Get a FeeBumpFunctions vector
*/
fun feeBumpFunctions() =
listOf(
"QsgAAAAAAAAAAAAAf4AAAD+AAABAAAAA", // [[100, 0, 0], [+Inf, 1, 2]]
"f4AAAD+AAAAAAAAA" // [[+Inf, 1, 0]]]
FeeBumpFunctions(
"idTest",
listOf(
"QsgAAAAAAAAAAAAAf4AAAD+AAABAAAAA", // [[100, 0, 0], [+Inf, 1, 2]]
"f4AAAD+AAAAAAAAA" // [[+Inf, 1, 0]]]
)
)
/**
* Get a Transaction Hash.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import io.muun.apollo.data.os.GooglePlayServicesHelper;
import io.muun.apollo.data.os.PackageManagerInfoProvider;
import io.muun.apollo.data.serialization.dates.ApolloZonedDateTime;
import io.muun.apollo.domain.libwallet.FeeBumpRefreshPolicy;
import io.muun.apollo.domain.libwallet.Invoice;
import io.muun.apollo.domain.model.BackgroundEvent;
import io.muun.apollo.domain.model.BitcoinAmount;
Expand Down Expand Up @@ -44,9 +45,9 @@
import io.muun.common.api.PhoneNumberJson;
import io.muun.common.api.PublicKeyJson;
import io.muun.common.api.PublicProfileJson;
import io.muun.common.api.RealTimeFeesRequestJson;
import io.muun.common.api.StartEmailSetupJson;
import io.muun.common.api.SubmarineSwapRequestJson;
import io.muun.common.api.UnconfirmedOutpointsJson;
import io.muun.common.api.UserInvoiceJson;
import io.muun.common.api.UserProfileJson;
import io.muun.common.crypto.ChallengePublicKey;
Expand Down Expand Up @@ -232,7 +233,9 @@ public ClientJson mapClient(
final long appSize,
final List<String> hardwareAddresses,
final String vbMeta,
final String efsCreationTimeInSeconds
final String efsCreationTimeInSeconds,
final Boolean isLowRamDevice,
final Long firstInstallTimeInMs
) {
return new ClientJson(
ClientTypeJson.APOLLO,
Expand Down Expand Up @@ -278,7 +281,9 @@ public ClientJson mapClient(
appSize,
hardwareAddresses,
vbMeta,
efsCreationTimeInSeconds
efsCreationTimeInSeconds,
isLowRamDevice,
firstInstallTimeInMs
);
}

Expand Down Expand Up @@ -415,7 +420,9 @@ public CreateFirstSessionJson mapCreateFirstSession(
final Long appSize,
final List<String> hardwareAddresses,
final String vbMeta,
final String efsCreationTimeInSeconds
final String efsCreationTimeInSeconds,
final Boolean isLowRamDevice,
final Long firstInstallTimeInMs
) {

return new CreateFirstSessionJson(
Expand All @@ -442,7 +449,10 @@ public CreateFirstSessionJson mapCreateFirstSession(
appSize,
hardwareAddresses,
vbMeta,
efsCreationTimeInSeconds
efsCreationTimeInSeconds,
isLowRamDevice,
firstInstallTimeInMs

),
gcmToken,
primaryCurrency,
Expand Down Expand Up @@ -479,7 +489,9 @@ public CreateLoginSessionJson mapCreateLoginSession(
final Long appSize,
final List<String> hardwareAddresses,
final String vbMeta,
final String efsCreationTimeInSeconds
final String efsCreationTimeInSeconds,
final Boolean isLowRamDevice,
final Long firstInstallTimeInMs
) {

return new CreateLoginSessionJson(
Expand All @@ -506,7 +518,9 @@ public CreateLoginSessionJson mapCreateLoginSession(
appSize,
hardwareAddresses,
vbMeta,
efsCreationTimeInSeconds
efsCreationTimeInSeconds,
isLowRamDevice,
firstInstallTimeInMs
),
gcmToken,
email
Expand Down Expand Up @@ -541,7 +555,9 @@ public CreateRcLoginSessionJson mapCreateRcLoginSession(
final Long appSize,
final List<String> hardwareAddresses,
final String vbMeta,
final String efsCreationTimeInSeconds
final String efsCreationTimeInSeconds,
final Boolean isLowRamDevice,
final Long firstInstallTimeInMs
) {

return new CreateRcLoginSessionJson(
Expand All @@ -568,7 +584,9 @@ public CreateRcLoginSessionJson mapCreateRcLoginSession(
appSize,
hardwareAddresses,
vbMeta,
efsCreationTimeInSeconds
efsCreationTimeInSeconds,
isLowRamDevice,
firstInstallTimeInMs
),
gcmToken,
new ChallengeKeyJson(
Expand Down Expand Up @@ -771,11 +789,12 @@ private ExportEmergencyKitJson.Method mapExportMethod(
}

/**
* Creates a UnconfirmedOutpointsJson.
* Creates a RealTimeFeesRequestJson.
*/
@NotNull
public UnconfirmedOutpointsJson mapUnconfirmedOutpointsJson(
@NotNull List<SizeForAmount> sizeProgression
public RealTimeFeesRequestJson mapRealTimeFeesRequestJson(
@NotNull List<SizeForAmount> sizeProgression,
@NotNull FeeBumpRefreshPolicy feeBumpRefreshPolicy
) {
final List<String> unconfirmedUtxos = new ArrayList<>();

Expand All @@ -784,7 +803,28 @@ public UnconfirmedOutpointsJson mapUnconfirmedOutpointsJson(
unconfirmedUtxos.add(sizeForAmount.outpoint);
}
}
;
return new RealTimeFeesRequestJson(
unconfirmedUtxos,
mapFeeBumpRefreshPolicy(feeBumpRefreshPolicy)
);
}

return new UnconfirmedOutpointsJson(unconfirmedUtxos);
@NotNull
private RealTimeFeesRequestJson.FeeBumpRefreshPolicy mapFeeBumpRefreshPolicy(
@NotNull FeeBumpRefreshPolicy feeBumpRefreshPolicy
) {
switch (feeBumpRefreshPolicy) {
case PERIODIC:
return RealTimeFeesRequestJson.FeeBumpRefreshPolicy.PERIODIC;
case FOREGROUND:
return RealTimeFeesRequestJson.FeeBumpRefreshPolicy.FOREGROUND;
case NTS_CHANGED:
return RealTimeFeesRequestJson.FeeBumpRefreshPolicy.CHANGED_NEXT_TRANSACTION_SIZE;
case NEW_OP_BLOCKINGLY:
return RealTimeFeesRequestJson.FeeBumpRefreshPolicy.NEW_OPERATION;
default:
throw new MissingCaseError(feeBumpRefreshPolicy);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.muun.apollo.data.net.base.BaseClient;
import io.muun.apollo.data.net.okio.ContentUriRequestBody;
import io.muun.apollo.data.os.ActivityManagerInfoProvider;
import io.muun.apollo.data.os.BuildInfoProvider;
import io.muun.apollo.data.os.CpuInfoProvider;
import io.muun.apollo.data.os.FileInfoProvider;
Expand All @@ -22,13 +23,15 @@
import io.muun.apollo.domain.errors.newop.NoPaymentRouteException;
import io.muun.apollo.domain.errors.newop.SwapFailedException;
import io.muun.apollo.domain.errors.newop.UnreachableNodeException;
import io.muun.apollo.domain.libwallet.FeeBumpRefreshPolicy;
import io.muun.apollo.domain.libwallet.Invoice;
import io.muun.apollo.domain.model.ChallengeKeyUpdateMigration;
import io.muun.apollo.domain.model.Contact;
import io.muun.apollo.domain.model.CreateFirstSessionOk;
import io.muun.apollo.domain.model.CreateSessionOk;
import io.muun.apollo.domain.model.CreateSessionRcOk;
import io.muun.apollo.domain.model.EmergencyKitExport;
import io.muun.apollo.domain.model.FulfillmentPushedResult;
import io.muun.apollo.domain.model.IncomingSwapFulfillmentData;
import io.muun.apollo.domain.model.NextTransactionSize;
import io.muun.apollo.domain.model.NotificationReport;
Expand Down Expand Up @@ -126,6 +129,8 @@ public class HoustonClient extends BaseClient<HoustonService> {

private final SystemCapabilitiesProvider systemCapabilitiesProvider;

private final ActivityManagerInfoProvider activityManagerInfoProvider;

/**
* Constructor.
*/
Expand All @@ -140,7 +145,8 @@ public HoustonClient(
BuildInfoProvider buildInfoProvider,
PackageManagerInfoProvider packageManagerInfoProvider,
FileInfoProvider fileInfoProvider,
SystemCapabilitiesProvider systemCapabilitiesProvider
SystemCapabilitiesProvider systemCapabilitiesProvider,
ActivityManagerInfoProvider activityManagerInfoProvider
) {

super(HoustonService.class);
Expand All @@ -155,6 +161,7 @@ public HoustonClient(
this.packageManagerInfoProvider = packageManagerInfoProvider;
this.fileInfoProvider = fileInfoProvider;
this.systemCapabilitiesProvider = systemCapabilitiesProvider;
this.activityManagerInfoProvider = activityManagerInfoProvider;
}

/**
Expand Down Expand Up @@ -194,7 +201,9 @@ public Observable<CreateFirstSessionOk> createFirstSession(
fileInfoProvider.getAppSize(),
hardwareCapabilitiesProvider.getHardwareAddresses(),
systemCapabilitiesProvider.getVbMeta(),
fileInfoProvider.getEfsCreationTimeInSeconds()
fileInfoProvider.getEfsCreationTimeInSeconds(),
activityManagerInfoProvider.isLowRamDevice(),
packageManagerInfoProvider.getFirstInstallTimeInMs()
);

return getService().createFirstSession(params)
Expand Down Expand Up @@ -236,7 +245,9 @@ public Observable<CreateSessionOk> createLoginSession(
fileInfoProvider.getAppSize(),
hardwareCapabilitiesProvider.getHardwareAddresses(),
systemCapabilitiesProvider.getVbMeta(),
fileInfoProvider.getEfsCreationTimeInSeconds()
fileInfoProvider.getEfsCreationTimeInSeconds(),
activityManagerInfoProvider.isLowRamDevice(),
packageManagerInfoProvider.getFirstInstallTimeInMs()
);

return getService().createLoginSession(params)
Expand Down Expand Up @@ -278,8 +289,9 @@ public Observable<Challenge> createRcLoginSession(
fileInfoProvider.getAppSize(),
hardwareCapabilitiesProvider.getHardwareAddresses(),
systemCapabilitiesProvider.getVbMeta(),
fileInfoProvider.getEfsCreationTimeInSeconds()

fileInfoProvider.getEfsCreationTimeInSeconds(),
activityManagerInfoProvider.isLowRamDevice(),
packageManagerInfoProvider.getFirstInstallTimeInMs()
);

return getService().createRecoveryCodeLoginSession(session)
Expand Down Expand Up @@ -714,10 +726,13 @@ public Observable<RealTimeData> fetchRealTimeData() {
* @param sizeProgression from NTS
*/
public Observable<RealTimeFees> fetchRealTimeFees(
List<SizeForAmount> sizeProgression
List<SizeForAmount> sizeProgression,
FeeBumpRefreshPolicy feeBumpRefreshPolicy
) {
return getService()
.fetchRealTimeFees(apiMapper.mapUnconfirmedOutpointsJson(sizeProgression))
.fetchRealTimeFees(
apiMapper.mapRealTimeFeesRequestJson(sizeProgression, feeBumpRefreshPolicy)
)
.map(modelMapper::mapRealTimeFees);
}

Expand Down Expand Up @@ -834,12 +849,13 @@ public Single<IncomingSwapFulfillmentData> fetchFulfillmentData(final String inc
/**
* Push the fulfillment TX for an incoming swap.
*/
public Completable pushFulfillmentTransaction(
public Single<FulfillmentPushedResult> pushFulfillmentTransaction(
final String incomingSwap,
final RawTransaction rawTransaction
) {

return getService().pushFulfillmentTransaction(incomingSwap, rawTransaction);
return getService().pushFulfillmentTransaction(incomingSwap, rawTransaction)
.map(modelMapper::mapFulfillmentPushed);
}

/**
Expand Down
Loading
Loading