Merge branch 'feature-v0.10' into 'master'

wownero v0.10.1.0

See merge request monerujo-io/wowwallet!5
merge-requests/6/merge
Monerujo 3 years ago
commit 1d2f11c8fb

@ -171,6 +171,10 @@ add_library(wallet-crypto STATIC IMPORTED)
set_target_properties(wallet-crypto PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/wownero/libwallet-crypto.a)
add_library(cryptonote_format_utils_basic STATIC IMPORTED)
set_target_properties(cryptonote_format_utils_basic PROPERTIES IMPORTED_LOCATION
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/wownero/libcryptonote_format_utils_basic.a)
#############
# System
#############
@ -193,6 +197,7 @@ target_link_libraries( monerujo
wallet
cryptonote_core
cryptonote_basic
cryptonote_format_utils_basic
mnemonics
ringct
ringct_basic

@ -2,14 +2,14 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion '29.0.3'
buildToolsVersion '30.0.3'
ndkVersion '17.2.4988734'
defaultConfig {
applicationId "com.m2049r.wowwallet"
minSdkVersion 21
targetSdkVersion 30
versionCode 100500
versionName "2.0.5.0 'Puginarug'"
versionCode 1101000
versionName "2.1.1.0 'Vertant'"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {

@ -3,6 +3,7 @@
package="com.m2049r.xmrwallet">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />

@ -96,7 +96,7 @@ void detachJVM(JNIEnv *jenv, int envStat) {
}
}
struct MyWalletListener : Bitmonero::WalletListener {
struct MyWalletListener : Monero::WalletListener {
jobject jlistener;
MyWalletListener(JNIEnv *env, jobject aListener) {
@ -191,12 +191,13 @@ struct MyWalletListener : Bitmonero::WalletListener {
/**
* @brief refreshed - called when wallet refreshed by background thread or explicitly refreshed by calling "refresh" synchronously
*/
void refreshed() {
void refreshed(bool success) {
std::lock_guard<std::mutex> lock(_listenerMutex);
if (jlistener == nullptr) return;
LOGD("refreshed");
JNIEnv *jenv;
LOGD("refreshed %s", success ? "true" : "false");
if (!success) return;
JNIEnv *jenv;
int envStat = attachJVM(&jenv);
if (envStat == JNI_ERR) return;
@ -229,7 +230,7 @@ std::vector<std::string> java2cpp(JNIEnv *env, jobject arrayList) {
return result;
}
jobject cpp2java(JNIEnv *env, const std::vector<std::string>& vector) {
jobject cpp2java(JNIEnv *env, const std::vector<std::string> &vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add",
@ -266,8 +267,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_createWalletJ(JNIEnv *env, jobject
const char *_language = env->GetStringUTFChars(language, nullptr);
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
Bitmonero::Wallet *wallet =
Bitmonero::WalletManagerFactory::getWalletManager()->createWallet(
Monero::Wallet *wallet =
Monero::WalletManagerFactory::getWalletManager()->createWallet(
std::string(_path),
std::string(_password),
std::string(_language),
@ -287,8 +288,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_openWalletJ(JNIEnv *env, jobject i
const char *_password = env->GetStringUTFChars(password, nullptr);
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
Bitmonero::Wallet *wallet =
Bitmonero::WalletManagerFactory::getWalletManager()->openWallet(
Monero::Wallet *wallet =
Monero::WalletManagerFactory::getWalletManager()->openWallet(
std::string(_path),
std::string(_password),
_networkType);
@ -309,8 +310,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_recoveryWalletJ(JNIEnv *env, jobje
const char *_mnemonic = env->GetStringUTFChars(mnemonic, nullptr);
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
Bitmonero::Wallet *wallet =
Bitmonero::WalletManagerFactory::getWalletManager()->recoveryWallet(
Monero::Wallet *wallet =
Monero::WalletManagerFactory::getWalletManager()->recoveryWallet(
std::string(_path),
std::string(_password),
std::string(_mnemonic),
@ -340,8 +341,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_createWalletFromKeysJ(JNIEnv *env,
const char *_viewKeyString = env->GetStringUTFChars(viewKeyString, nullptr);
const char *_spendKeyString = env->GetStringUTFChars(spendKeyString, nullptr);
Bitmonero::Wallet *wallet =
Bitmonero::WalletManagerFactory::getWalletManager()->createWalletFromKeys(
Monero::Wallet *wallet =
Monero::WalletManagerFactory::getWalletManager()->createWalletFromKeys(
std::string(_path),
std::string(_password),
std::string(_language),
@ -377,8 +378,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_createWalletFromDeviceJ(JNIEnv *en
const char *_deviceName = env->GetStringUTFChars(deviceName, nullptr);
const char *_subaddressLookahead = env->GetStringUTFChars(subaddressLookahead, nullptr);
Bitmonero::Wallet *wallet =
Bitmonero::WalletManagerFactory::getWalletManager()->createWalletFromDevice(
Monero::Wallet *wallet =
Monero::WalletManagerFactory::getWalletManager()->createWalletFromDevice(
std::string(_path),
std::string(_password),
_networkType,
@ -398,7 +399,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_walletExists(JNIEnv *env, jobject
jstring path) {
const char *_path = env->GetStringUTFChars(path, nullptr);
bool exists =
Bitmonero::WalletManagerFactory::getWalletManager()->walletExists(std::string(_path));
Monero::WalletManagerFactory::getWalletManager()->walletExists(std::string(_path));
env->ReleaseStringUTFChars(path, _path);
return static_cast<jboolean>(exists);
}
@ -411,7 +412,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_verifyWalletPassword(JNIEnv *env,
const char *_keys_file_name = env->GetStringUTFChars(keys_file_name, nullptr);
const char *_password = env->GetStringUTFChars(password, nullptr);
bool passwordOk =
Bitmonero::WalletManagerFactory::getWalletManager()->verifyWalletPassword(
Monero::WalletManagerFactory::getWalletManager()->verifyWalletPassword(
std::string(_keys_file_name), std::string(_password), watch_only);
env->ReleaseStringUTFChars(keys_file_name, _keys_file_name);
env->ReleaseStringUTFChars(password, _password);
@ -425,8 +426,8 @@ Java_com_m2049r_xmrwallet_model_WalletManager_queryWalletDeviceJ(JNIEnv *env, jo
jstring password) {
const char *_keys_file_name = env->GetStringUTFChars(keys_file_name, nullptr);
const char *_password = env->GetStringUTFChars(password, nullptr);
Bitmonero::Wallet::Device device_type;
bool ok = Bitmonero::WalletManagerFactory::getWalletManager()->
Monero::Wallet::Device device_type;
bool ok = Monero::WalletManagerFactory::getWalletManager()->
queryWalletDevice(device_type, std::string(_keys_file_name), std::string(_password));
env->ReleaseStringUTFChars(keys_file_name, _keys_file_name);
env->ReleaseStringUTFChars(password, _password);
@ -441,7 +442,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_findWallets(JNIEnv *env, jobject i
jstring path) {
const char *_path = env->GetStringUTFChars(path, nullptr);
std::vector<std::string> walletPaths =
Bitmonero::WalletManagerFactory::getWalletManager()->findWallets(std::string(_path));
Monero::WalletManagerFactory::getWalletManager()->findWallets(std::string(_path));
env->ReleaseStringUTFChars(path, _path);
return cpp2java(env, walletPaths);
}
@ -452,7 +453,7 @@ JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_setDaemonAddressJ(JNIEnv *env, jobject instance,
jstring address) {
const char *_address = env->GetStringUTFChars(address, nullptr);
Bitmonero::WalletManagerFactory::getWalletManager()->setDaemonAddress(std::string(_address));
Monero::WalletManagerFactory::getWalletManager()->setDaemonAddress(std::string(_address));
env->ReleaseStringUTFChars(address, _address);
}
@ -462,40 +463,40 @@ Java_com_m2049r_xmrwallet_model_WalletManager_getDaemonVersion(JNIEnv *env,
jobject instance) {
uint32_t version;
bool isConnected =
Bitmonero::WalletManagerFactory::getWalletManager()->connected(&version);
Monero::WalletManagerFactory::getWalletManager()->connected(&version);
if (!isConnected) version = 0;
return version;
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_getBlockchainHeight(JNIEnv *env, jobject instance) {
return Bitmonero::WalletManagerFactory::getWalletManager()->blockchainHeight();
return Monero::WalletManagerFactory::getWalletManager()->blockchainHeight();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_getBlockchainTargetHeight(JNIEnv *env,
jobject instance) {
return Bitmonero::WalletManagerFactory::getWalletManager()->blockchainTargetHeight();
return Monero::WalletManagerFactory::getWalletManager()->blockchainTargetHeight();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_getNetworkDifficulty(JNIEnv *env, jobject instance) {
return Bitmonero::WalletManagerFactory::getWalletManager()->networkDifficulty();
return Monero::WalletManagerFactory::getWalletManager()->networkDifficulty();
}
JNIEXPORT jdouble JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_getMiningHashRate(JNIEnv *env, jobject instance) {
return Bitmonero::WalletManagerFactory::getWalletManager()->miningHashRate();
return Monero::WalletManagerFactory::getWalletManager()->miningHashRate();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_getBlockTarget(JNIEnv *env, jobject instance) {
return Bitmonero::WalletManagerFactory::getWalletManager()->blockTarget();
return Monero::WalletManagerFactory::getWalletManager()->blockTarget();
}
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_isMining(JNIEnv *env, jobject instance) {
return static_cast<jboolean>(Bitmonero::WalletManagerFactory::getWalletManager()->isMining());
return static_cast<jboolean>(Monero::WalletManagerFactory::getWalletManager()->isMining());
}
JNIEXPORT jboolean JNICALL
@ -505,16 +506,16 @@ Java_com_m2049r_xmrwallet_model_WalletManager_startMining(JNIEnv *env, jobject i
jboolean ignore_battery) {
const char *_address = env->GetStringUTFChars(address, nullptr);
bool success =
Bitmonero::WalletManagerFactory::getWalletManager()->startMining(std::string(_address),
background_mining,
ignore_battery);
Monero::WalletManagerFactory::getWalletManager()->startMining(std::string(_address),
background_mining,
ignore_battery);
env->ReleaseStringUTFChars(address, _address);
return static_cast<jboolean>(success);
}
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_stopMining(JNIEnv *env, jobject instance) {
return static_cast<jboolean>(Bitmonero::WalletManagerFactory::getWalletManager()->stopMining());
return static_cast<jboolean>(Monero::WalletManagerFactory::getWalletManager()->stopMining());
}
JNIEXPORT jstring JNICALL
@ -524,7 +525,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_resolveOpenAlias(JNIEnv *env, jobj
const char *_address = env->GetStringUTFChars(address, nullptr);
bool _dnssec_valid = (bool) dnssec_valid;
std::string resolvedAlias =
Bitmonero::WalletManagerFactory::getWalletManager()->resolveOpenAlias(
Monero::WalletManagerFactory::getWalletManager()->resolveOpenAlias(
std::string(_address),
_dnssec_valid);
env->ReleaseStringUTFChars(address, _address);
@ -536,9 +537,9 @@ Java_com_m2049r_xmrwallet_model_WalletManager_resolveOpenAlias(JNIEnv *env, jobj
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_closeJ(JNIEnv *env, jobject instance,
jobject walletInstance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, walletInstance);
bool closeSuccess = Bitmonero::WalletManagerFactory::getWalletManager()->closeWallet(wallet,
false);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, walletInstance);
bool closeSuccess = Monero::WalletManagerFactory::getWalletManager()->closeWallet(wallet,
false);
if (closeSuccess) {
MyWalletListener *walletListener = getHandle<MyWalletListener>(env, walletInstance,
"listenerHandle");
@ -560,13 +561,13 @@ Java_com_m2049r_xmrwallet_model_WalletManager_closeJ(JNIEnv *env, jobject instan
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSeed(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(wallet->seed().c_str());
}
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSeedLanguage(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(wallet->getSeedLanguage().c_str());
}
@ -574,14 +575,14 @@ JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setSeedLanguage(JNIEnv *env, jobject instance,
jstring language) {
const char *_language = env->GetStringUTFChars(language, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->setSeedLanguage(std::string(_language));
env->ReleaseStringUTFChars(language, _language);
}
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getStatusJ(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->status();
}
@ -597,7 +598,7 @@ jobject newWalletStatusInstance(JNIEnv *env, int status, const std::string &erro
JNIEXPORT jobject JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_statusWithErrorString(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
int status;
std::string errorString;
@ -610,7 +611,7 @@ JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setPassword(JNIEnv *env, jobject instance,
jstring password) {
const char *_password = env->GetStringUTFChars(password, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
bool success = wallet->setPassword(std::string(_password));
env->ReleaseStringUTFChars(password, _password);
return static_cast<jboolean>(success);
@ -620,20 +621,20 @@ JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getAddressJ(JNIEnv *env, jobject instance,
jint accountIndex,
jint addressIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(
wallet->address((uint32_t) accountIndex, (uint32_t) addressIndex).c_str());
}
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getPath(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(wallet->path().c_str());
}
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_nettype(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->nettype();
}
@ -644,7 +645,7 @@ JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getIntegratedAddress(JNIEnv *env, jobject instance,
jstring payment_id) {
const char *_payment_id = env->GetStringUTFChars(payment_id, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
std::string address = wallet->integratedAddress(_payment_id);
env->ReleaseStringUTFChars(payment_id, _payment_id);
return env->NewStringUTF(address.c_str());
@ -652,13 +653,13 @@ Java_com_m2049r_xmrwallet_model_Wallet_getIntegratedAddress(JNIEnv *env, jobject
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSecretViewKey(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(wallet->secretViewKey().c_str());
}
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSecretSpendKey(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(wallet->secretSpendKey().c_str());
}
@ -666,7 +667,7 @@ JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_store(JNIEnv *env, jobject instance,
jstring path) {
const char *_path = env->GetStringUTFChars(path, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
bool success = wallet->store(std::string(_path));
if (!success) {
LOGE("store() %s", wallet->errorString().c_str());
@ -677,7 +678,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_store(JNIEnv *env, jobject instance,
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getFilename(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return env->NewStringUTF(wallet->filename().c_str());
}
@ -691,7 +692,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_initJ(JNIEnv *env, jobject instance,
const char *_daemon_address = env->GetStringUTFChars(daemon_address, nullptr);
const char *_daemon_username = env->GetStringUTFChars(daemon_username, nullptr);
const char *_daemon_password = env->GetStringUTFChars(daemon_password, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
bool status = wallet->init(_daemon_address, (uint64_t) upper_transaction_size_limit,
_daemon_username,
_daemon_password);
@ -706,13 +707,13 @@ Java_com_m2049r_xmrwallet_model_Wallet_initJ(JNIEnv *env, jobject instance,
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setRestoreHeight(JNIEnv *env, jobject instance,
jlong height) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->setRefreshFromBlockHeight((uint64_t) height);
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getRestoreHeight(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->getRefreshFromBlockHeight();
}
@ -721,7 +722,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getRestoreHeight(JNIEnv *env, jobject ins
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getConnectionStatusJ(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->connected();
}
//TODO virtual void setTrustedDaemon(bool arg) = 0;
@ -730,71 +731,71 @@ Java_com_m2049r_xmrwallet_model_Wallet_getConnectionStatusJ(JNIEnv *env, jobject
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getBalance(JNIEnv *env, jobject instance,
jint accountIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->balance((uint32_t) accountIndex);
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getBalanceAll(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->balanceAll();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getUnlockedBalance(JNIEnv *env, jobject instance,
jint accountIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->unlockedBalance((uint32_t) accountIndex);
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getUnlockedBalanceAll(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->unlockedBalanceAll();
}
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_isWatchOnly(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return static_cast<jboolean>(wallet->watchOnly());
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getBlockChainHeight(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->blockChainHeight();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getApproximateBlockChainHeight(JNIEnv *env,
jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->approximateBlockChainHeight();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDaemonBlockChainHeight(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->daemonBlockChainHeight();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDaemonBlockChainTargetHeight(JNIEnv *env,
jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->daemonBlockChainTargetHeight();
}
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_isSynchronizedJ(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return static_cast<jboolean>(wallet->synchronized());
}
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDeviceTypeJ(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Bitmonero::Wallet::Device device_type = wallet->getDeviceType();
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
Monero::Wallet::Device device_type = wallet->getDeviceType();
return static_cast<jint>(device_type);
}
@ -828,14 +829,14 @@ Java_com_m2049r_xmrwallet_util_KeyStoreHelper_slowHash(JNIEnv *env, jclass clazz
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDisplayAmount(JNIEnv *env, jclass clazz,
jlong amount) {
return env->NewStringUTF(Bitmonero::Wallet::displayAmount(amount).c_str());
return env->NewStringUTF(Monero::Wallet::displayAmount(amount).c_str());
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getAmountFromString(JNIEnv *env, jclass clazz,
jstring amount) {
const char *_amount = env->GetStringUTFChars(amount, nullptr);
uint64_t x = Bitmonero::Wallet::amountFromString(_amount);
uint64_t x = Monero::Wallet::amountFromString(_amount);
env->ReleaseStringUTFChars(amount, _amount);
return x;
}
@ -843,19 +844,19 @@ Java_com_m2049r_xmrwallet_model_Wallet_getAmountFromString(JNIEnv *env, jclass c
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getAmountFromDouble(JNIEnv *env, jclass clazz,
jdouble amount) {
return Bitmonero::Wallet::amountFromDouble(amount);
return Monero::Wallet::amountFromDouble(amount);
}
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_generatePaymentId(JNIEnv *env, jclass clazz) {
return env->NewStringUTF(Bitmonero::Wallet::genPaymentId().c_str());
return env->NewStringUTF(Monero::Wallet::genPaymentId().c_str());
}
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_isPaymentIdValid(JNIEnv *env, jclass clazz,
jstring payment_id) {
const char *_payment_id = env->GetStringUTFChars(payment_id, nullptr);
bool isValid = Bitmonero::Wallet::paymentIdValid(_payment_id);
bool isValid = Monero::Wallet::paymentIdValid(_payment_id);
env->ReleaseStringUTFChars(payment_id, _payment_id);
return static_cast<jboolean>(isValid);
}
@ -865,7 +866,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_isAddressValid(JNIEnv *env, jclass clazz,
jstring address, jint networkType) {
const char *_address = env->GetStringUTFChars(address, nullptr);
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
bool isValid = Bitmonero::Wallet::addressValid(_address, _networkType);
bool isValid = Monero::Wallet::addressValid(_address, _networkType);
env->ReleaseStringUTFChars(address, _address);
return static_cast<jboolean>(isValid);
}
@ -876,37 +877,37 @@ Java_com_m2049r_xmrwallet_model_Wallet_getPaymentIdFromAddress(JNIEnv *env, jcla
jint networkType) {
Monero::NetworkType _networkType = static_cast<Monero::NetworkType>(networkType);
const char *_address = env->GetStringUTFChars(address, nullptr);
std::string payment_id = Bitmonero::Wallet::paymentIdFromAddress(_address, _networkType);
std::string payment_id = Monero::Wallet::paymentIdFromAddress(_address, _networkType);
env->ReleaseStringUTFChars(address, _address);
return env->NewStringUTF(payment_id.c_str());
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getMaximumAllowedAmount(JNIEnv *env, jclass clazz) {
return Bitmonero::Wallet::maximumAllowedAmount();
return Monero::Wallet::maximumAllowedAmount();
}
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_startRefresh(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->startRefresh();
}
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_pauseRefresh(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->pauseRefresh();
}
JNIEXPORT jboolean JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_refresh(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return static_cast<jboolean>(wallet->refresh());
}
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_refreshAsync(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->refreshAsync();
}
@ -914,8 +915,8 @@ Java_com_m2049r_xmrwallet_model_Wallet_refreshAsync(JNIEnv *env, jobject instanc
//virtual void rescanBlockchainAsync() = 0;
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_rescanBlockchainAsync(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Java_com_m2049r_xmrwallet_model_Wallet_rescanBlockchainAsyncJ(JNIEnv *env, jobject instance) {
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->rescanBlockchainAsync();
}
@ -932,14 +933,14 @@ Java_com_m2049r_xmrwallet_model_Wallet_createTransactionJ(JNIEnv *env, jobject i
const char *_dst_addr = env->GetStringUTFChars(dst_addr, nullptr);
const char *_payment_id = env->GetStringUTFChars(payment_id, nullptr);
Bitmonero::PendingTransaction::Priority _priority =
static_cast<Bitmonero::PendingTransaction::Priority>(priority);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::PendingTransaction::Priority _priority =
static_cast<Monero::PendingTransaction::Priority>(priority);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
Bitmonero::PendingTransaction *tx = wallet->createTransaction(_dst_addr, _payment_id,
amount, (uint32_t) mixin_count,
_priority,
(uint32_t) accountIndex);
Monero::PendingTransaction *tx = wallet->createTransaction(_dst_addr, _payment_id,
amount, (uint32_t) mixin_count,
_priority,
(uint32_t) accountIndex);
env->ReleaseStringUTFChars(dst_addr, _dst_addr);
env->ReleaseStringUTFChars(payment_id, _payment_id);
@ -955,16 +956,16 @@ Java_com_m2049r_xmrwallet_model_Wallet_createSweepTransaction(JNIEnv *env, jobje
const char *_dst_addr = env->GetStringUTFChars(dst_addr, nullptr);
const char *_payment_id = env->GetStringUTFChars(payment_id, nullptr);
Bitmonero::PendingTransaction::Priority _priority =
static_cast<Bitmonero::PendingTransaction::Priority>(priority);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::PendingTransaction::Priority _priority =
static_cast<Monero::PendingTransaction::Priority>(priority);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
Monero::optional<uint64_t> empty;
Bitmonero::PendingTransaction *tx = wallet->createTransaction(_dst_addr, _payment_id,
empty, (uint32_t) mixin_count,
_priority,
(uint32_t) accountIndex);
Monero::PendingTransaction *tx = wallet->createTransaction(_dst_addr, _payment_id,
empty, (uint32_t) mixin_count,
_priority,
(uint32_t) accountIndex);
env->ReleaseStringUTFChars(dst_addr, _dst_addr);
env->ReleaseStringUTFChars(payment_id, _payment_id);
@ -974,8 +975,8 @@ Java_com_m2049r_xmrwallet_model_Wallet_createSweepTransaction(JNIEnv *env, jobje
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_createSweepUnmixableTransactionJ(JNIEnv *env,
jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Bitmonero::PendingTransaction *tx = wallet->createSweepUnmixableTransaction();
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
Monero::PendingTransaction *tx = wallet->createSweepUnmixableTransaction();
return reinterpret_cast<jlong>(tx);
}
@ -985,9 +986,9 @@ Java_com_m2049r_xmrwallet_model_Wallet_createSweepUnmixableTransactionJ(JNIEnv *
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_disposeTransaction(JNIEnv *env, jobject instance,
jobject pendingTransaction) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Bitmonero::PendingTransaction *_pendingTransaction =
getHandle<Bitmonero::PendingTransaction>(env, pendingTransaction);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
Monero::PendingTransaction *_pendingTransaction =
getHandle<Monero::PendingTransaction>(env, pendingTransaction);
wallet->disposeTransaction(_pendingTransaction);
}
@ -998,7 +999,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_disposeTransaction(JNIEnv *env, jobject i
//virtual TransactionHistory * history() const = 0;
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getHistoryJ(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return reinterpret_cast<jlong>(wallet->history());
}
@ -1007,7 +1008,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getHistoryJ(JNIEnv *env, jobject instance
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setListenerJ(JNIEnv *env, jobject instance,
jobject javaListener) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->setListener(nullptr); // clear old listener
// delete old listener
MyWalletListener *oldListener = getHandle<MyWalletListener>(env, instance,
@ -1028,13 +1029,13 @@ Java_com_m2049r_xmrwallet_model_Wallet_setListenerJ(JNIEnv *env, jobject instanc
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getDefaultMixin(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->defaultMixin();
}
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_setDefaultMixin(JNIEnv *env, jobject instance, jint mixin) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return wallet->setDefaultMixin(mixin);
}
@ -1045,7 +1046,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_setUserNote(JNIEnv *env, jobject instance
const char *_txid = env->GetStringUTFChars(txid, nullptr);
const char *_note = env->GetStringUTFChars(note, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
bool success = wallet->setUserNote(_txid, _note);
@ -1061,7 +1062,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getUserNote(JNIEnv *env, jobject instance
const char *_txid = env->GetStringUTFChars(txid, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
std::string note = wallet->getUserNote(_txid);
@ -1075,7 +1076,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getTxKey(JNIEnv *env, jobject instance,
const char *_txid = env->GetStringUTFChars(txid, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
std::string txKey = wallet->getTxKey(_txid);
@ -1090,7 +1091,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_addAccount(JNIEnv *env, jobject instance,
const char *_label = env->GetStringUTFChars(label, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->addSubaddressAccount(_label);
env->ReleaseStringUTFChars(label, _label);
@ -1101,7 +1102,7 @@ JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getSubaddressLabel(JNIEnv *env, jobject instance,
jint accountIndex, jint addressIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
std::string label = wallet->getSubaddressLabel((uint32_t) accountIndex,
(uint32_t) addressIndex);
@ -1117,7 +1118,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_setSubaddressLabel(JNIEnv *env, jobject i
const char *_label = env->GetStringUTFChars(label, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->setSubaddressLabel(accountIndex, addressIndex, _label);
env->ReleaseStringUTFChars(label, _label);
@ -1126,7 +1127,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_setSubaddressLabel(JNIEnv *env, jobject i
// virtual size_t numSubaddressAccounts() const = 0;
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getNumAccounts(JNIEnv *env, jobject instance) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return static_cast<jint>(wallet->numSubaddressAccounts());
}
@ -1134,7 +1135,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_getNumAccounts(JNIEnv *env, jobject insta
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_Wallet_getNumSubaddresses(JNIEnv *env, jobject instance,
jint accountIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
return static_cast<jint>(wallet->numSubaddresses(accountIndex));
}
@ -1145,7 +1146,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_addSubaddress(JNIEnv *env, jobject instan
jstring label) {
const char *_label = env->GetStringUTFChars(label, nullptr);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
wallet->addSubaddress(accountIndex, _label);
env->ReleaseStringUTFChars(label, _label);
}
@ -1154,7 +1155,7 @@ Java_com_m2049r_xmrwallet_model_Wallet_addSubaddress(JNIEnv *env, jobject instan
Java_com_m2049r_xmrwallet_model_Wallet_getLastSubaddress(JNIEnv *env, jobject instance,
jint accountIndex) {
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
size_t num = wallet->numSubaddresses(accountIndex);
//wallet->subaddress()->getAll()[num]->getAddress().c_str()
Monero::Subaddress *s = wallet->subaddress();
@ -1173,8 +1174,8 @@ Java_com_m2049r_xmrwallet_model_Wallet_getLastSubaddress(JNIEnv *env, jobject in
// TransactionHistory
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_TransactionHistory_getCount(JNIEnv *env, jobject instance) {
Bitmonero::TransactionHistory *history = getHandle<Bitmonero::TransactionHistory>(env,
instance);
Monero::TransactionHistory *history = getHandle<Monero::TransactionHistory>(env,
instance);
return history->count();
}
@ -1187,8 +1188,8 @@ jobject newTransferInstance(JNIEnv *env, uint64_t amount, const std::string &add
return transfer;
}
jobject newTransferList(JNIEnv *env, Bitmonero::TransactionInfo *info) {
const std::vector<Bitmonero::TransactionInfo::Transfer> &transfers = info->transfers();
jobject newTransferList(JNIEnv *env, Monero::TransactionInfo *info) {
const std::vector<Monero::TransactionInfo::Transfer> &transfers = info->transfers();
if (transfers.empty()) { // don't create empty Lists
return nullptr;
}
@ -1199,7 +1200,7 @@ jobject newTransferList(JNIEnv *env, Bitmonero::TransactionInfo *info) {
jobject result = env->NewObject(class_ArrayList, java_util_ArrayList_,
static_cast<jint> (transfers.size()));
// create Transfer objects and stick them in the List
for (const Bitmonero::TransactionInfo::Transfer &s: transfers) {
for (const Monero::TransactionInfo::Transfer &s: transfers) {
jobject element = newTransferInstance(env, s.amount, s.address);
env->CallBooleanMethod(result, java_util_ArrayList_add, element);
env->DeleteLocalRef(element);
@ -1207,7 +1208,7 @@ jobject newTransferList(JNIEnv *env, Bitmonero::TransactionInfo *info) {
return result;
}
jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
jobject newTransactionInfo(JNIEnv *env, Monero::TransactionInfo *info) {
jmethodID c = env->GetMethodID(class_TransactionInfo, "<init>",
"(IZZJJJLjava/lang/String;JLjava/lang/String;IIJLjava/lang/String;Ljava/util/List;)V");
jobject transfers = newTransferList(env, info);
@ -1215,7 +1216,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
jstring _paymentId = env->NewStringUTF(info->paymentId().c_str());
jstring _label = env->NewStringUTF(info->label().c_str());
uint32_t subaddrIndex = 0;
if (info->direction() == Bitmonero::TransactionInfo::Direction_In)
if (info->direction() == Monero::TransactionInfo::Direction_In)
subaddrIndex = *(info->subaddrIndex().begin());
jobject result = env->NewObject(class_TransactionInfo, c,
info->direction(),
@ -1241,7 +1242,7 @@ jobject newTransactionInfo(JNIEnv *env, Bitmonero::TransactionInfo *info) {
#include <stdio.h>
#include <stdlib.h>
jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *>& vector) {
jobject cpp2java(JNIEnv *env, const std::vector<Monero::TransactionInfo *> &vector) {
jmethodID java_util_ArrayList_ = env->GetMethodID(class_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_add = env->GetMethodID(class_ArrayList, "add",
@ -1249,7 +1250,7 @@ jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *>& v
jobject arrayList = env->NewObject(class_ArrayList, java_util_ArrayList_,
static_cast<jint> (vector.size()));
for (Bitmonero::TransactionInfo *s: vector) {
for (Monero::TransactionInfo *s: vector) {
jobject info = newTransactionInfo(env, s);
env->CallBooleanMethod(arrayList, java_util_ArrayList_add, info);
env->DeleteLocalRef(info);
@ -1259,8 +1260,8 @@ jobject cpp2java(JNIEnv *env, const std::vector<Bitmonero::TransactionInfo *>& v
JNIEXPORT jobject JNICALL
Java_com_m2049r_xmrwallet_model_TransactionHistory_refreshJ(JNIEnv *env, jobject instance) {
Bitmonero::TransactionHistory *history = getHandle<Bitmonero::TransactionHistory>(env,
instance);
Monero::TransactionHistory *history = getHandle<Monero::TransactionHistory>(env,
instance);
history->refresh();
return cpp2java(env, history->getAll());
}
@ -1269,13 +1270,13 @@ Java_com_m2049r_xmrwallet_model_TransactionHistory_refreshJ(JNIEnv *env, jobject
JNIEXPORT jint JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getStatusJ(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
return tx->status();
}
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getErrorString(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
return env->NewStringUTF(tx->errorString().c_str());
}
@ -1286,7 +1287,7 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_commit(JNIEnv *env, jobject i
const char *_filename = env->GetStringUTFChars(filename, nullptr);
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
bool success = tx->commit(_filename, overwrite);
env->ReleaseStringUTFChars(filename, _filename);
@ -1296,26 +1297,26 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_commit(JNIEnv *env, jobject i
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getAmount(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
return tx->amount();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getDust(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
return tx->dust();
}
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getFee(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
return tx->fee();
}
// TODO this returns a vector of strings - deal with this later - for now return first one
JNIEXPORT jstring JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getFirstTxIdJ(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
std::vector<std::string> txids = tx->txid();
if (!txids.empty())
return env->NewStringUTF(txids.front().c_str());
@ -1325,12 +1326,12 @@ Java_com_m2049r_xmrwallet_model_PendingTransaction_getFirstTxIdJ(JNIEnv *env, jo
JNIEXPORT jlong JNICALL
Java_com_m2049r_xmrwallet_model_PendingTransaction_getTxCount(JNIEnv *env, jobject instance) {
Bitmonero::PendingTransaction *tx = getHandle<Bitmonero::PendingTransaction>(env, instance);
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
return tx->txCount();
}
// these are all in Bitmonero::Wallet - which I find wrong, so they are here!
// these are all in Monero::Wallet - which I find wrong, so they are here!
//static void init(const char *argv0, const char *default_log_base_name);
//static void debug(const std::string &category, const std::string &str);
//static void info(const std::string &category, const std::string &str);
@ -1344,7 +1345,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_initLogger(JNIEnv *env, jclass cla
const char *_argv0 = env->GetStringUTFChars(argv0, nullptr);
const char *_default_log_base_name = env->GetStringUTFChars(default_log_base_name, nullptr);
Bitmonero::Wallet::init(_argv0, _default_log_base_name);
Monero::Wallet::init(_argv0, _default_log_base_name);
env->ReleaseStringUTFChars(argv0, _argv0);
env->ReleaseStringUTFChars(default_log_base_name, _default_log_base_name);
@ -1357,7 +1358,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logDebug(JNIEnv *env, jclass clazz
const char *_category = env->GetStringUTFChars(category, nullptr);
const char *_message = env->GetStringUTFChars(message, nullptr);
Bitmonero::Wallet::debug(_category, _message);
Monero::Wallet::debug(_category, _message);
env->ReleaseStringUTFChars(category, _category);
env->ReleaseStringUTFChars(message, _message);
@ -1370,7 +1371,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logInfo(JNIEnv *env, jclass clazz,
const char *_category = env->GetStringUTFChars(category, nullptr);
const char *_message = env->GetStringUTFChars(message, nullptr);
Bitmonero::Wallet::info(_category, _message);
Monero::Wallet::info(_category, _message);
env->ReleaseStringUTFChars(category, _category);
env->ReleaseStringUTFChars(message, _message);
@ -1383,7 +1384,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logWarning(JNIEnv *env, jclass cla
const char *_category = env->GetStringUTFChars(category, nullptr);
const char *_message = env->GetStringUTFChars(message, nullptr);
Bitmonero::Wallet::warning(_category, _message);
Monero::Wallet::warning(_category, _message);
env->ReleaseStringUTFChars(category, _category);
env->ReleaseStringUTFChars(message, _message);
@ -1396,7 +1397,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logError(JNIEnv *env, jclass clazz
const char *_category = env->GetStringUTFChars(category, nullptr);
const char *_message = env->GetStringUTFChars(message, nullptr);
Bitmonero::Wallet::error(_category, _message);
Monero::Wallet::error(_category, _message);
env->ReleaseStringUTFChars(category, _category);
env->ReleaseStringUTFChars(message, _message);
@ -1405,7 +1406,7 @@ Java_com_m2049r_xmrwallet_model_WalletManager_logError(JNIEnv *env, jclass clazz
JNIEXPORT void JNICALL
Java_com_m2049r_xmrwallet_model_WalletManager_setLogLevel(JNIEnv *env, jclass clazz,
jint level) {
Bitmonero::WalletManagerFactory::setLogLevel(level);
Monero::WalletManagerFactory::setLogLevel(level);
}
JNIEXPORT jstring JNICALL

@ -216,9 +216,9 @@ public class PeerRetriever implements Callable<PeerRetriever> {
payloadData.add("cumulative_difficulty", 1L);
payloadData.add("current_height", 1L);
byte[] genesisHash =
Helper.hexToBytes("418015bb9ae982a1975da7d79277c2705727a56894ba0fb246adaabb1f4632e3");
Helper.hexToBytes("a3fd635dd5cb55700317783469ba749b5259f0eeac2420ab2c27eb3ff5ffdc5c");
payloadData.add("top_id", genesisHash);
payloadData.add("top_version", (byte) 1);
payloadData.add("top_version", (byte) 7);
section.add("payload_data", payloadData);
return section;
}

@ -300,16 +300,15 @@ public class NodeFragment extends Fragment
publishProgress(info);
}
});
// also seed with monero seed nodes (see p2p/net_node.inl:410 in monero src)
seedList.add(new NodeInfo(new InetSocketAddress("107.152.130.98", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("212.83.175.67", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("5.9.100.248", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("163.172.182.165", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("161.67.132.39", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("198.74.231.92", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("195.154.123.123", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("212.83.172.165", 18080)));
seedList.add(new NodeInfo(new InetSocketAddress("192.110.160.146", 18080)));
Timber.d("MOREMOREMORE");
// also seed with wownero seed nodes (see p2p/net_node.inl in wownero src)
seedList.add(new NodeInfo(new InetSocketAddress("158.69.60.225", 34567)));
seedList.add(new NodeInfo(new InetSocketAddress("159.65.91.59", 34567)));
seedList.add(new NodeInfo(new InetSocketAddress("164.90.230.176", 34567)));
seedList.add(new NodeInfo(new InetSocketAddress("64.227.81.144", 34567)));
seedList.add(new NodeInfo(new InetSocketAddress("188.166.237.187", 34567)));
seedList.add(new NodeInfo(new InetSocketAddress("51.161.131.176", 34567)));
seedList.add(new NodeInfo(new InetSocketAddress("167.114.196.241", 34567)));
d.seedPeers(seedList);
d.awaitTermination(NODES_TO_FIND);
}

@ -578,7 +578,6 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
try {
final WalletFragment walletFragment = getWalletFragment();
if (wallet.isSynchronized()) {
Timber.d("onRefreshed() synced");
releaseWakeLock(RELEASE_WAKE_LOCK_DELAY); // the idea is to stay awake until synced
if (!synced) { // first sync
onProgress(-1);

@ -58,7 +58,6 @@ import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import timber.log.Timber;
@ -128,7 +127,7 @@ public class WalletFragment extends Fragment
currencies.add(Helper.BASE_CRYPTO);
if (Helper.SHOW_EXCHANGERATES)
currencies.addAll(Arrays.asList(getResources().getStringArray(R.array.currency)));
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(Objects.requireNonNull(getContext()), R.layout.item_spinner_balance, currencies);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(requireContext(), R.layout.item_spinner_balance, currencies);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sCurrency.setAdapter(spinnerAdapter);
@ -346,13 +345,18 @@ public class WalletFragment extends Fragment
// if account index has changed scroll to top?
private int accountIndex = 0;
public void onRefreshed(final Wallet wallet, final boolean full) {
public void onRefreshed(final Wallet wallet, boolean full) {
Timber.d("onRefreshed(%b)", full);
if (adapter.needsTransactionUpdateOnNewBlock()) {
wallet.refreshHistory();
full = true;
}
if (full) {
List<TransactionInfo> list = new ArrayList<>();
final long streetHeight = activityCallback.getStreetModeHeight();
Timber.d("StreetHeight=%d", streetHeight);
wallet.refreshHistory();
for (TransactionInfo info : wallet.getHistory().getAll()) {
Timber.d("TxHeight=%d, Label=%s", info.blockheight, info.subaddressLabel);
if ((info.isPending || (info.blockheight >= streetHeight))
@ -561,7 +565,7 @@ public class WalletFragment extends Fragment
//TODO figure out why gunther disappears on return from send although he is still set
if (enable) {
if (streetGunther == null)
streetGunther = ContextCompat.getDrawable(Objects.requireNonNull(getContext()), R.drawable.ic_gunther_streetmode);
streetGunther = ContextCompat.getDrawable(requireContext(), R.drawable.ic_gunther_streetmode);
ivStreetGunther.setImageDrawable(streetGunther);
} else
ivStreetGunther.setImageDrawable(null);

@ -269,10 +269,10 @@ public class Node {
if (DEFAULT_LEVIN_PORT > 0) return DEFAULT_LEVIN_PORT;
switch (WalletManager.getInstance().getNetworkType()) {
case NetworkType_Mainnet:
DEFAULT_LEVIN_PORT = 18080;
DEFAULT_LEVIN_PORT = 34567;
break;
case NetworkType_Testnet:
DEFAULT_LEVIN_PORT = 28080;
DEFAULT_LEVIN_PORT = 11180;
break;
case NetworkType_Stagenet:
DEFAULT_LEVIN_PORT = 38080;
@ -290,10 +290,10 @@ public class Node {
if (DEFAULT_RPC_PORT > 0) return DEFAULT_RPC_PORT;
switch (WalletManager.getInstance().getNetworkType()) {
case NetworkType_Mainnet:
DEFAULT_RPC_PORT = 18081;
DEFAULT_RPC_PORT = 34568;
break;
case NetworkType_Testnet:
DEFAULT_RPC_PORT = 28081;
DEFAULT_RPC_PORT = 11181;
break;
case NetworkType_Stagenet:
DEFAULT_RPC_PORT = 38081;

@ -48,7 +48,7 @@ import okhttp3.ResponseBody;
import timber.log.Timber;
public class NodeInfo extends Node {
final static public int MIN_MAJOR_VERSION = 14;
final static public int MIN_MAJOR_VERSION = 19;
final static public String RPC_VERSION = "2.0";
@Getter
@ -250,7 +250,7 @@ public class NodeInfo extends Node {
return false;
}
static final private int[] TEST_PORTS = {18089}; // check only opt-in port
static final private int[] TEST_PORTS = {Node.getDefaultRpcPort()};
public boolean findRpcService() {
// if already have an rpcPort, use that

@ -349,7 +349,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
private boolean checkAddress() {
boolean ok = checkAddressNoError();
if (!ok) {
if (possibleCryptos.isEmpty()) {
etAddress.setError(getString(R.string.send_address_invalid));
} else {
etAddress.setError(null);

@ -90,7 +90,6 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment {
return view;
}
@Override
public boolean onValidateFields() {
Timber.i(maxBtc + "/" + minBtc);

@ -359,40 +359,22 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
}
private RequestQuote xmrtoQuote = null;
private int stageARetries = 0;
private final int RETRIES = 3;
private double stageAPrice = 0;
private void processStageA(final RequestQuote requestQuote) {
Timber.d("processCreateOrder %s", requestQuote.getId());
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
// verify the BTC amount is correct (price can change and we can only specify XMR amount)
// verify the BTC amount is correct
if (requestQuote.getBtcAmount() != txDataBtc.getBtcAmount()) {
if (--stageARetries <= 0) {
Timber.d("Failed to get quote");
getView().post(() ->
showStageError(ShiftError.Error.SERVICE.toString(),
getString(R.string.shift_noquote),
getString(R.string.shift_checkamount)));
return; // just stop for now
}
if (stageAPrice == requestQuote.getPrice()) {
// same price but different BTC amount - something else is wrong (e.g. too many decimals)
Timber.d("Price unchanged");
getView().post(() ->
showStageError(ShiftError.Error.SERVICE.toString(),
getString(R.string.shift_noquote),
getString(R.string.shift_checkamount)));
return; // just stop for now
}
stageAPrice = requestQuote.getPrice();
// recalc XMR and try again
txDataBtc.setAmount(txDataBtc.getBtcAmount() / requestQuote.getPrice());
getView().post(this::stageAOneShot);
return; // stageA will run in the main thread
Timber.d("Failed to get quote");
getView().post(() -> showStageError(ShiftError.Error.SERVICE.toString(),
getString(R.string.shift_noquote),
getString(R.string.shift_checkamount)));
return; // just stop for now
}
xmrtoQuote = requestQuote;
txDataBtc.setAmount(xmrtoQuote.getXmrAmount());
getView().post(() -> {
// show data from the actual quote as that is what is used to
NumberFormat df = NumberFormat.getInstance(Locale.US);
df.setMaximumFractionDigits(12);
final String btcAmount = df.format(xmrtoQuote.getBtcAmount());
@ -438,18 +420,12 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
}
private void stageA() {
stageARetries = RETRIES;
stageAOneShot();
}
private void stageAOneShot() {
if (!isResumed) return;
Timber.d("Request Quote");
xmrtoQuote = null;
xmrtoOrder = null;
showProgress(1, getString(R.string.label_send_progress_xmrto_create));
TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData();
stageAPrice = 0;
ShiftCallback<RequestQuote> callback = new ShiftCallback<RequestQuote>() {
@Override
@ -473,7 +449,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
}
};
getXmrToApi().requestQuote(txDataBtc.getAmountAsDouble(), callback);
getXmrToApi().requestQuote(txDataBtc.getBtcAmount(), callback);
}
private CreateOrder xmrtoOrder = null;

@ -30,6 +30,7 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.progressindicator.CircularProgressIndicator;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.data.Crypto;
import com.m2049r.xmrwallet.data.UserNotes;
@ -48,7 +49,7 @@ import java.util.TimeZone;
import timber.log.Timber;
public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfoAdapter.ViewHolder> {
private final SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
private final static SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
private final int outboundColour;
private final int inboundColour;
@ -77,6 +78,10 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
DATETIME_FORMATTER.setTimeZone(tz);
}
public boolean needsTransactionUpdateOnNewBlock() {
return (infoItems.size() > 0) && !infoItems.get(0).isConfirmed();
}
private static class TransactionInfoDiff extends DiffCallback<TransactionInfo> {
public TransactionInfoDiff(List<TransactionInfo> oldList, List<TransactionInfo> newList) {
@ -95,6 +100,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
return (oldItem.direction == newItem.direction)
&& (oldItem.isPending == newItem.isPending)
&& (oldItem.isFailed == newItem.isFailed)
&& ((oldItem.confirmations == newItem.confirmations) || (oldItem.isConfirmed()))
&& (oldItem.subaddressLabel.equals(newItem.subaddressLabel))
&& (Objects.equals(oldItem.notes, newItem.notes));
}
@ -149,6 +155,8 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
final TextView tvFee;
final TextView tvPaymentId;
final TextView tvDateTime;
final CircularProgressIndicator pbConfirmations;
final TextView tvConfirmations;
TransactionInfo infoItem;
ViewHolder(View itemView) {
@ -158,6 +166,9 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
tvFee = itemView.findViewById(R.id.tx_fee);
tvPaymentId = itemView.findViewById(R.id.tx_paymentid);
tvDateTime = itemView.findViewById(R.id.tx_datetime);
pbConfirmations = itemView.findViewById(R.id.pbConfirmations);
pbConfirmations.setMax(TransactionInfo.CONFIRMATION);
tvConfirmations = itemView.findViewById(R.id.tvConfirmations);
}
private String getDateTime(long time) {
@ -182,7 +193,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
ivTxType.setVisibility(View.GONE);
}
} else {
ivTxType.setVisibility(View.GONE); // gives us more space for the amount
ivTxType.setVisibility(View.GONE);
}
String displayAmount = Helper.getDisplayAmount(infoItem.amount, Helper.DISPLAY_DIGITS_INFO);
@ -205,12 +216,34 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
this.tvFee.setText(context.getString(R.string.tx_list_failed_text));
tvFee.setVisibility(View.VISIBLE);
setTxColour(failedColour);
pbConfirmations.setVisibility(View.GONE);
tvConfirmations.setVisibility(View.GONE);
} else if (infoItem.isPending) {
setTxColour(pendingColour);
pbConfirmations.setVisibility(View.GONE);
pbConfirmations.setIndeterminate(true);
pbConfirmations.setVisibility(View.VISIBLE);
tvConfirmations.setVisibility(View.GONE);
} else if (infoItem.direction == TransactionInfo.Direction.Direction_In) {
setTxColour(inboundColour);
if (!infoItem.isConfirmed()) {
pbConfirmations.setVisibility(View.VISIBLE);
final int confirmations = (int) infoItem.confirmations;
pbConfirmations.setProgressCompat(confirmations, true);
final String confCount = Integer.toString(confirmations);
tvConfirmations.setText(confCount);
if (confCount.length() == 1) // we only have space for character in the progress circle
tvConfirmations.setVisibility(View.VISIBLE);
else
tvConfirmations.setVisibility(View.GONE);
} else {
pbConfirmations.setVisibility(View.GONE);
tvConfirmations.setVisibility(View.GONE);
}
} else {
setTxColour(outboundColour);
pbConfirmations.setVisibility(View.GONE);
tvConfirmations.setVisibility(View.GONE);
}
String tag = null;

@ -43,7 +43,7 @@ public class TransactionHistory {
this.accountIndex = accountIndex;
}
public void loadNotes(Wallet wallet) {
private void loadNotes(Wallet wallet) {
for (TransactionInfo info : transactions) {
info.notes = wallet.getUserNote(info.hash);
}
@ -61,30 +61,22 @@ public class TransactionHistory {
private List<TransactionInfo> transactions = new ArrayList<>();
public void refreshWithNotes(Wallet wallet) {
void refreshWithNotes(Wallet wallet) {
refresh();
loadNotes(wallet);
}
// public void refresh() {
// transactions = refreshJ();
// }
public void refresh() {
private void refresh() {
List<TransactionInfo> transactionInfos = refreshJ();
Timber.d("refreshed %d", transactionInfos.size());
Timber.d("refresh size=%d", transactionInfos.size());
for (Iterator<TransactionInfo> iterator = transactionInfos.iterator(); iterator.hasNext(); ) {
TransactionInfo info = iterator.next();
if (info.accountIndex != accountIndex) {
iterator.remove();
Timber.d("removed %s", info.hash);
} else {
Timber.d("kept %s", info.hash);
}
}
transactions = transactionInfos;
}
private native List<TransactionInfo> refreshJ();
}

@ -29,6 +29,8 @@ import lombok.RequiredArgsConstructor;
// this is not the TransactionInfo from the API as that is owned by the TransactionHistory
// this is a POJO for the TransactionInfoAdapter
public class TransactionInfo implements Parcelable, Comparable<TransactionInfo> {
public static final int CONFIRMATION = 4; // CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE
@RequiredArgsConstructor
public enum Direction {
Direction_In(0),
@ -98,6 +100,10 @@ public class TransactionInfo implements Parcelable, Comparable<TransactionInfo>
this.transfers = transfers;
}
public boolean isConfirmed() {
return confirmations >= CONFIRMATION;
}
public String getDisplayLabel() {
if (subaddressLabel.isEmpty() || (Subaddress.DEFAULT_LABEL_FORMATTER.matcher(subaddressLabel).matches()))
return ("#" + addressIndex);

@ -273,12 +273,14 @@ public class Wallet {
public native long getDaemonBlockChainTargetHeight();
public native boolean isSynchronizedJ();
boolean synced = false;
public boolean isSynchronized() {
final long daemonHeight = getDaemonBlockChainHeight();
if (daemonHeight == 0) return false;
return isSynchronizedJ() && (getBlockChainHeight() == daemonHeight);
return synced;
}
public void setSynchronized() {
this.synced = true;
}
public static native String getDisplayAmount(long amount);
@ -309,7 +311,12 @@ public class Wallet {
public native void refreshAsync();
public native void rescanBlockchainAsync();
public native void rescanBlockchainAsyncJ();
public void rescanBlockchainAsync() {
synced = false;
rescanBlockchainAsyncJ();
}
//TODO virtual void setAutoRefreshInterval(int millis) = 0;
//TODO virtual int autoRefreshInterval() const = 0;
@ -391,6 +398,10 @@ public class Wallet {
private native long getHistoryJ();
public void refreshHistory() {
getHistory().refreshWithNotes(this);
}
//virtual AddressBook * addressBook() const = 0;
//virtual void setListener(WalletListener *) = 0;
@ -455,7 +466,7 @@ public class Wallet {
public void setSubaddressLabel(int addressIndex, String label) {
setSubaddressLabel(accountIndex, addressIndex, label);
getHistory().refreshWithNotes(this);
refreshHistory();
}
public native void setSubaddressLabel(int accountIndex, int addressIndex, String label);

@ -108,23 +108,23 @@ public class WalletService extends Service {
Timber.d("unconfirmedMoneyReceived() %d @ %s", amount, txId);
}
long lastBlockTime = 0;
int lastTxCount = 0;
private long lastBlockTime = 0;
private int lastTxCount = 0;
public void newBlock(long height) {
Wallet wallet = getWallet();
final Wallet wallet = getWallet();
if (wallet == null) throw new IllegalStateException("No wallet!");
// don't flood with an update for every block ...
if (lastBlockTime < System.currentTimeMillis() - 2000) {
Timber.d("newBlock() @ %d with observer %s", height, observer);
lastBlockTime = System.currentTimeMillis();
Timber.d("newBlock() @ %d with observer %s", height, observer);
if (observer != null) {
boolean fullRefresh = false;
updateDaemonState(wallet, wallet.isSynchronized() ? height : 0);
if (!wallet.isSynchronized()) {
updated = true;
// we want to see our transactions as they come in
wallet.getHistory().refresh();
wallet.refreshHistory();
int txCount = wallet.getHistory().getCount();
if (txCount > lastTxCount) {
// update the transaction list only if we have more than before
@ -145,17 +145,16 @@ public class WalletService extends Service {
updated = true;
}
public void refreshed() {
public void refreshed() { // this means it's synced
Timber.d("refreshed()");
Wallet wallet = getWallet();
final Wallet wallet = getWallet();
if (wallet == null) throw new IllegalStateException("No wallet!");
wallet.setSynchronized();
if (updated) {
updateDaemonState(wallet, wallet.getBlockChainHeight());
wallet.refreshHistory();
if (observer != null) {
updateDaemonState(wallet, 0);
wallet.getHistory().refreshWithNotes(wallet);
if (observer != null) {
updated = !observer.onRefreshed(wallet, true);
}
updated = !observer.onRefreshed(wallet, true);
}
}
}

@ -74,10 +74,10 @@ class RequestQuoteImpl implements RequestQuote {
price = jsonObject.getDouble("rate");
}
public static void call(@NonNull final ShiftApiCall api, final double xmrAmount,
public static void call(@NonNull final ShiftApiCall api, final double btcAmount,
@NonNull final ShiftCallback<RequestQuote> callback) {
try {
final JSONObject request = createRequest(xmrAmount);
final JSONObject request = createRequest(btcAmount);
api.call("quotes", request, new NetworkCallback() {
@Override
public void onSuccess(JSONObject jsonObject) {
@ -104,13 +104,13 @@ class RequestQuoteImpl implements RequestQuote {
* @param xmrAmount how much XMR to shift to BTC
*/
static JSONObject createRequest(final double xmrAmount) throws JSONException {
static JSONObject createRequest(final double btcAmount) throws JSONException {
final JSONObject jsonObject = new JSONObject();
jsonObject.put("depositMethod", "xmr");
jsonObject.put("settleMethod", ServiceHelper.ASSET);
// #sideshift is silly and likes numbers as strings
String amount = AmountFormatter.format(xmrAmount);
jsonObject.put("depositAmount", amount);
String amount = AmountFormatter.format(btcAmount);
jsonObject.put("settleAmount", amount);
return jsonObject;
}

@ -64,8 +64,8 @@ public class SideShiftApiImpl implements SideShiftApi, ShiftApiCall {
}
@Override
public void requestQuote(final double xmrAmount, @NonNull final ShiftCallback<RequestQuote> callback) {
RequestQuoteImpl.call(this, xmrAmount, callback);
public void requestQuote(final double btcAmount, @NonNull final ShiftCallback<RequestQuote> callback) {
RequestQuoteImpl.call(this, btcAmount, callback);
}
@Override

@ -31,8 +31,7 @@ public class LegacyStorageHelper {
try {
if (isStorageMigrated(context)) return;
if (!hasReadPermission(context)) {
// nothing to migrate, so don't try again
setStorageMigrated(context);
// can't migrate - don't remember this, as the user may turn on permissions later
return;
}
final File oldRoot = getWalletRoot();

@ -81,6 +81,9 @@ public class RestoreHeight {
blockheight.put("2021-02-01", 286873L);
blockheight.put("2021-03-01", 294950L);
blockheight.put("2021-04-01", 303887L);
blockheight.put("2021-05-01", 312580L);
blockheight.put("2021-06-01", 321538L);
blockheight.put("2021-07-01", 330209L);
}
public long getHeight(String date) {

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@ -19,13 +20,43 @@
android:layout_weight="9"
android:orientation="horizontal">
<ImageView
android:id="@+id/ivTxType"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:src="@drawable/ic_xmrto_btc"
android:visibility="visible" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/ivTxType"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:src="@drawable/ic_xmrto_btc"
android:visibility="visible" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/pbConfirmations"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="center"
android:indeterminate="false"
android:max="10"
android:progress="8"
android:visibility="visible"
app:indicatorInset="0dp"
app:indicatorSize="30dp"
app:trackThickness="4dp" />
<TextView
android:id="@+id/tvConfirmations"
style="@style/MoneroText.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingBottom="1dp"
android:text="8"
android:visibility="visible" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
@ -57,8 +88,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_weight="13"
android:gravity="start"
tools:text="0123456789abcdef" />

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="about_close">أغلق</string>
<string name="about_whoami">أنا مونيرويو</string>
<string name="about_version">النسخة %1$s (%2$d)</string>
<string name="credits_text"><![CDATA[
<b>الاعتمادات</b>
<br/>
m2049r, baltsar777, anhdres, keejef,
rehrar, EarlOfEgo, ErCiccione et al.
<br/><br/>
<a href="https://monerujo.io/">monerujo.io</a>
]]></string>
<string name="privacy_policy"><![CDATA[
<h1>سياسة الخصوصية</h1>
<p>
هذه الصفحة تخبرك بسياستنا بخصوص التجميع، الاستخدام، و الافصاح عن المعلومات الشخصيةالتي نستلمها من مستخدمي تطبيقنا (مونيرويو: محفظة مونيرو)
</p>
<p>باستخدامك هذا التطبيق أنت توافق تجميع و استخدام المعلومات وفقاً لهذه السياسة
</p>
<h2>البيانات المجمعة</h2>
<p> المعلومات الشخصية هي نوع من البيانات التي قد تعرف هوية شخص ما
</p>
<p> مفاتيح مونيرو و العناوين العامة مجمعة و معالجة من قبل التطبيق محليا لغرض معالجة المعاملات و هي ترسل الى شبكة مونيرو في حالة مشفرة
</p>
<p>لا يجمع التطبيق أي معلومات شخصية أخرى</p>
<p> إذا أنت تستخدم خدمة الصراف (اختياري)، مونيرويو يجلب سعر الصرف عبر api coinmarketcap.com. اطلع على سياسة الخصوصية الخاصة بهم على https://coinmarketcap.com/privacy لتفاصيل على كيف تجمع بياناتك التي في الطلب. </p>
<p> عندما تستعمل التطبيق لتدفع إلى عنوانين بيتكوين، فأنت تستعمل خدمة SideShift.ai. اطلع على سياسة الخصوصية الخاصة بهم على https://sideshift.ai للتفاصيل. يرسل مونيرويو عنوان بيتوين و المبلغ إليهم. سيأخذ أيضاً عنوان بروتوكول الإنترنت (ip) الخاص بك.</p>
<h2>صلاحيات التطبيق</h2>
<ul>
<li>الإنترنت: للإتصال بشبكة مونيرو عبر عقدة مونيرو</li>
<li>قرائة ملفات التخزين الخارجي: لقرائة ملفات المحفظة المخزنة على الجهاز</li>
<li>الكتابة إلى التخزين الخارجي: لكتابة ملفات المحفظة المخزنة على الجهاز</li>
<li>قفل الإيقاظ: لإبقاء الجهاز ياقظاً عند التزامن</li>
<li>الكاميرا: لمسح رموز الاستجابة السريعة (qr) لاستلام مونيرو</li>
</ul>
<h2>التغيرات لسياسة الخصوصية هذه</h2>
<p>. يمكن أن نحدث سياسة الخصوصية هذه من حين إلى أخرى. سنقوم بتنبيهك لأاي تغيرات بنشر سياسة الخصوصية الجديدة في التطبيق و على الموقع (www.monerujo.io)
ننصحك أن تراجع هذه السياسة بشكل دوري لأاي تغيرات
<p>آخر تحديث لسياسة الخصوصية هذه كان في 10/11/2017
</p>
<h2>تواصل معنا</h2>
<p>privacy@monerujo.io.إذا كان لديك أي سؤال عن سياستنا أو عن كيفية تجميع بياناتك و معالجتها، الرجاء إرسال بريد الكتروني إلى
</p>
]]></string>
</resources>

@ -0,0 +1,215 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="help_create_new"><![CDATA[
<h1>أنشئ محفظة - جديدة</h1>
<p>إذا كنت تحتاج إلى عنوان مونيرو جديد!</p>
<p>أدخل اسم محفظة و كلمة سر فريدين.
كلمة المرور مستخدمة لتأمين بيانات محفظتك على الجهاز. استخدم كلمة سر قوية - و استخدام عبارة سر أفضل.</p>
<h2>دون البذرة الذاكرية!</h2>
<p>سترى في الشاشة التالية \"البذرة الذاكرية\" ذات 25 كلمة خاصة بك. هي كل ما تحتاجه لاسترجاع محفظتك لاحقاً و الحصول على وصول كامل لمالك.
إبقائها آمنة و خاصة مهم جداً، فهي تعطي <em>أي أحد<em> وصولاً كاملاً لمالك!</p>
<p>إذا نسيت كلمة مرور محفظتك يمكنك استرجاع محفظتك باستعمال بذرة الذاكرة.</p>
<p>ليس هناك طريقة لاسترجاع البذرة الذاكرية، إذا أضعتها ضاع مالك!
أيضاً، لا يمكن لبذرة الذاكرية أن تتغير و إذا ما سرقت أو انفضحت،
عليك أن تحول مالك إلى محفظة جديدة (مع بذرة ذاكرية جديدة). لذا من
الأفضل عمل نسخ احتياطية من بذرتك بكتابتها و تخزينها في <em>أكثر<em> من
مكان آمن</p>
]]></string>
<string name="help_create_seed"><![CDATA[
<h1>أنشئ محفظة - بذرة</h1>
<p>إذا لديك عنوان مونيرو و تريد استعادة المعاملات من سلسلة الكتل!</p>
<p>أدخل اسم محفظة و كلمة سر فريدين.
كلمة المرور مستخدمة لتأمين بيانات محفظتك على الجهاز. استخدم كلمة سر قوية - و استخدام عبارة سر أفضل.</p>
<p>أدخل بذرتك في حقل \"البذرة الذاكيرة\".<p>
<p>أدخل رقم الكتلة لأول معاملة لهذا العنوان في حقل \""\. يمكنك أيضاًاستعمال تاريخ في صيغة سسسس-شش-يي. إن لم تكن متأكداً أدخل تاريخ/كتلة تقريبي(ة) <em> قبل <em> استخدامك الأول لهذا العنوان.</p>
]]></string>
<string name="help_create_ledger"><![CDATA[
<h1>أنشئ محفظة - لدجر</h1>
<p>إذا كنت تسترجع محفظتك من جهاز لدجر نانو اس.</p>
<p>مفاتيحك السرية لا تغادر جهاز لدجر، لذا تجتاج إلى توصيله كلما أردت الوصول لمحفظتك.</p>
<p>أدخل اسم محفظة و كلمة سر فريدين. كلمة المرور مستخدمة لتأمين بيانات محفظتك على جهاز الأندرويد. استخدم كلمة سر قوية - واستخدام عبارة سر أفضل.</p>
<p>أدخل رقم الكتلة لأول معاملة لهذا العنوان في حقل \""\. يمكنك أيضاًاستعمال تاريخ في صيغة سسسس-شش-يي. إن لم تكن متأكداً أدخل تاريخ/كتلة تقريبي(ة) <em> قبل <em> استخدامك الأول لهذا العنوان.</p>
]]></string>
<string name="help_create_keys"><![CDATA[
<h1>أنشئ محفظة - مفاتيح</h1>
<p>إذا كنت تسترجع محفظتك باستخدام مفاتيحك!</p>
<p>أدخل اسم محفظة و كلمة سر فريدين. كلمة المرور مستخدمة لتأمين بيانات محفظتك على جهاز الأندرويد. استخدم كلمة سر قوية - واستخدام عبارة سر أفضل.<p>
<p>أدخل عنوان مونيرو في حقل \"العنوان العام\" و عبئ \"مفتاح الرؤية\" و \"مفتاح الانفاق\".</p>
<p>أدخل رقم الكتلة لأول معاملة لهذا العنوان في حقل \""\. يمكنك أيضاًاستعمال تاريخ في صيغة سسسس-شش-يي. إن لم تكن متأكداً أدخل تاريخ/كتلة تقريبي(ة) <em> قبل <em> استخدامك الأول لهذا العنوان.</p>
]]></string>
<string name="help_create_view"><![CDATA[
<h1>أنشئ محفظة - رؤية</h1>
<p>إذا كنت تريد مراقبة المعاملات القادمة إلى المحفظة!</p>
<p>أدخل اسم محفظة و كلمة سر فريدين. كلمة المرور مستخدمة لتأمين بيانات محفظتك على جهاز الأندرويد. استخدم كلمة سر قوية - واستخدام عبارة سر أفضل.<p>
<p>أدخل عنوان مونيرو ملكك في حقل "\عنوان عام"\ و املأ \مفتاح الرؤية"\".</p>
<p>أدخل رقم الكتلة لأول معاملة لهذا العنوان في حقل \""\. يمكنك أيضاًاستعمال تاريخ في صيغة سسسس-شش-يي. إن لم تكن متأكداً أدخل تاريخ/كتلة تقريبي(ة) <em> قبل <em> استخدامك الأول لهذا العنوان.</p>
]]></string>
<string name="help_details"><![CDATA[
<h1>تفاصيل المحفظة</h1>
<h2>العنوان العام</h2>
عنوانك العام بمثابة رقم حسابك البنكي يمكنك مشاركته مع أي أحد دون خوف من خسارة مونيرو الخاص بك. يرسل الناس المونيرو إلى محفظتك باستخدام هذا العنوان.
<h2>البذرة الذاكرية</h2>
هي كل ما تحتاجه لاسترجاع محفظتك و الحصول على وصول كامل لمالك. إبقائها خاصة و آمنة مهم جداًَ، فهي تعطي <em>لي أحد<em> وصولاً كاملاً لمونيرواتك! إذا لم تكتبها في مكان آمن رجاءً افعل!
<h2>كلمة مرور استرجاع ملفات المحفظة</h2>
تأكد من تدوين كلمة المرور هذه. ستحتاج إليها إذا أعدت ضبط جهازك أو ألغيت تثبيت التطبيق.<br/>
<h3>CrAzYpass</h3>
إذا كانت كلمة المرور المعروضة هنا هي أبجدية رقمية من 52 جزء في مجموعات من 4 - تهانينا!
ملفات محفظتك مؤمنة باستخدام مفتاح 256 بت مولد باستخدام خصائص أمان جهازك
أساساً على عبارة المرور التي خترتها (عند الإنشاء أو بتغييرها). هذا يجعلها صعبة جداً للاختراق!<br/>
هذه الميزة اجبارية لكل المحافظ الجديدة.
<h3>كلمة السر القديمة</h3>
إذا ترى عبارة مرورك هنا، محفظتك ليسب بأمان استخدام CrAzYpass. لإصلاح هذا فقط اختار \"غير كلمة المرور\" من القائمة. بعد إدخالك عبارة مرور جديدة (ربما نفسها القديمة) سيولد التطبيق CrAzYpass لك و سيؤمن ملفات محفظتك به. اكتبه!
<h3>CrAzYpass محافظ</h3>
إذا احبجت في أي وقت إلى إعادة تثبيت مونيرويو (بعد إعادة ضبط هاتفك أو التبديل إلى جهاز جديد مثلاً) أو إذا أردت استخدام ملفات المحفظة جهاز مختلف أو حاسوب، فيجب عليك استعمال كلمة المرور الاسترجاعية هذه للوصول إلى محفظتك مجدداً.<br/>
بإختيارك \"غير عبارة المرور\" من القاءمة، يمكنك اختيار عبارة مرور أخرى. انتبة أن هذا سيولد كلمة مرور استرجاعية جديدة. اكتبها!
<h2>مفتاح الرؤية</h2>
يمكنك استخدام مفتاح الرؤية الخاص بك لمراقبة المعاملات القادمة لمحفظتك دون اعطاء إذن لإنفاق المال داخل محفظتك.
<h2>مفتاح الإنفاق</h2>
مفتاح الانفاق الخاص بك يسمح لأي شحص بانفاق المونيرو المتعلق بمحفظتك، لذا لا تخبر أجداً بالمفتاح. أبقه آمناً كبذرة الذاكرية.
]]></string>
<string name="help_list"><![CDATA[
<h1>قائمة المحافظ</h1>
<h2>العقدة</h2>
<p>.مونيرويو يستخدم عقدة بعيدة للاتصال بشبكة مونيرو دون الحاجة إلى تنزيل و الاحتفاظ بنسخة كاملة من سلسة الكتل. يمكنك العثور على قائمة من العقد الشائعة أو تعلم كيف تشغل عقدة خاصة بك هنا https://moneroworld.com<p>
<p>يأتي مونيرويو مع بعض العقد البعيدة المحددة مسبقاً. مونيرويو يتذكر آخر خمس عقد مستخدمة.</p>
<h2>المحافظ</h2>
<p>هنا ترى محافظك. هن موجودات في مجلد <tt>monerujo</tt> في التخزين الداخلى لجهازك.
يمكنك استعمال تطبيق مستكشف ملفات لرؤيتهن. ينبغي عليك عمل نسخ احتياطية من هذا المجلد
على أسس منتظمة لتخزين خارج جهازك في حالة انفجاره أو سرقته</p>
<p>اختر محفظة لتفتحها أو المس زر \"+\" لإنشاء واحدة جديدة. أو اختر واحدة من عمليات المحفظة:</p>
<h3>التفاصيل</h3>
<p>أظهر تفاصيل المحفظة، البذرة و المفاتيح.</p>
<h3>استلم</h3>
<p>أنشئ رمز استجابة سريعة(qr code) لاستلام المونيرو.</p>
<h3>أعد التسمية</h3>
<p>أعد تسمية المحفظة. النسخ الاحتياطية لا تعاد التسمية.</p>
<h3>نسخة احتياطية</h3>
<p>أنشئ نسخة من المحفظة في مجلد <tt>backups</tt> داخل مجلد <tt>monerujo</tt> مستبدلة النسخ السابقة هناك. </p>
<h3>أرشيف</h3>
<p>أنشئ نسخة احتياطية ثم احذف المحفظة. النسخة تبقى في مجلد <tt>backups</tt> إذا لم تعد بحاجة إلى نسخك الاحتياطية ينبغي أن تحذفهم باستعمال متصفح ملفات أو تطبيق حذف آمن.</p>
]]></string>
<string name="help_tx_details"><![CDATA[
<h1>تفاصيل المعاملة</h1>
<h2>الوجهة</h2>
هذا هو العنوان العام للمحفظة التي تريد إرسال مونيرو إليها.
<h2>معرف الدفع</h2>
يمكنك استخدام معرف دفع لتعريف السبب لارسالك مونيرو بين طرفين. هذا اختياري
و خاص. فمثلاً يسمح لشركة بتسوية معاملتك مع غرض شريته.
<h2>TX ID</h2>
هذا هو معرف معاملتك. يمكنك استخدامه لتعريف معاملتك المشوشة في مستكشف سلسلة كتل مونيرو مثل <a href="https://xmrchain.net/">https://xmrchain.net/</a>
<h2>TX KEY (مفتاح المعاملة)</h2>
هذا هو مفتاح معاملتك الخاص، أبقه آمناً فإظهاره إلى طرف ثالث يظهر أي توقيع في (حلقة/طوق/خاتم) هو الخاص بك، جاعلاً معاملاتك شفافة.
<h2>كتلة</h2>
هذه هي الكتلة التي تحتوي معاملتك.
]]></string>
<string name="help_send"><![CDATA[
<h1>أرسل</h1>
<h2>عنوان المستلم</h2>
<p>هذا هو العنوان العام للمحفظة التي تريد إرسال مونيرو إليها، يمكنك نسخه من الحافظة
، مسح رمز استجابة سريعة (QR) أو إدخاله يدوياً. تأكد من العنوان لضمان عدم الارسال إلى عنوان خطأ.</p>
<p>بالإضافة إلى عنوان مونيرو يمكنك استعمال
<ul>
<li>مفتوحة (OpenAlias) لXMR أو BTC</li>
<li>عنوان بيتكوين</li>
</u>
يرجى ملاحظة أن إرسال BTC يتم من خلال خدمة Sideshift.ai (انظر https://sideshift.ai
للتفاصيل). راجع قسم إرسال BTC أدناه.</p>
<h2>معرف الدفع</h2>
<p> يمكنك استخدام معرف دفع لتعريف السبب لارسالك مونيرو بين طرفين. هذا اختياري
و خاص. فمثلاً يسمح لشركة بتسوية معاملتك مع غرض شريته<p>
<h1>إرسال بيتكوين</h1>
<h2>SideShift.ai</h2>
<p>Sideshift.ai خدمة طرف ثالث تعمل كصرافة من مونيرو إلى بيتكوين. نستخدم API Sideshift.ai لإدراج دفع بيتكوين في مونيرويو. رجاءاً اطلع على https://sideshift.ai و قرر لنفسك إذا ما كانت جدمة تريد استخدامها. فريق مونيرويو ليس مرتبطاً بSideshift.ai ولا يمكنه مساعدتك مع خدمتهم</p>
<h2>SideShift.ai سعر صرف<h2>
<p>في شاشة \"المبلغ\" ستعرض عليك الضوابط الحالية لخدمة Sideshift.ai
هذه الضوابط تتضمن سعر الصرف الحالي بالإضافة إلى حدود BTC الدنيا و العليا. لاحظ أن هذا السعر ليس مضموناً في هذه المرحلة</p>
<h2>SideShift.ai طلب<h2>
<p>في شاشة \"أكد\" سترى طلب Sideshift.ai الفعلي. هذا الطلب صحيح لفترة محدودة
قد تلاحظ عداًَ تنازلياً على زر \"spend\". قد يكون سعر الصرف مختلفاً عن السعر الدلالي في الشاشة السابقة</p>
<h2>السري SideShift.ai مفتاح<h2>
<p>لأن مونيرويو فقط يتعامل مع جزء مونيرو من معاملتك يمكن لمفتاح Sideshift.ai السري الخاص البك أن يستعل لتتبع جزء بيتكوين من طلبك على موقع Sideshift.ai</p>
<h2>SideShift.ai عد تنازلي</h2>
<p>عند وصول العد التنازلي إلى الصفر، تحتاج إلى الحصول على سعر جديد من Sideshift.ai بالرجوع إلى الخطوة السابقة ثم العودة إلى شاشة \"أكد\"</p>
]]></string>
<string name="help_xmrto"><![CDATA[
<h1>إرسال بيتكوين</h1>
<h2>SideShift.ai</h2>
<p>Sideshift.ai خدمة طرف ثالث تعمل كصرافة من مونيرو إلى بيتكوين. نستخدم API Sideshift.ai لإدراج دفع بيتكوين في مونيرويو. رجاءاً اطلع على https://sideshift.ai و قرر لنفسك إذا ما كانت جدمة تريد استخدامها. فريق مونيرويو ليس مرتبطاً بSideshift.ai ولا يمكنه مساعدتك مع خدمتهم.</p>
<h2>SideShift.ai سعر صرف<h2>
<p>في شاشة \"المبلغ\" ستعرض عليك الضوابط الحالية لخدمة Sideshift.ai
هذه الضوابط تتضمن سعر الصرف الحالي بالإضافة إلى حدود BTC الدنيا و العليا. لاحظ أن هذا السعر ليس مضموناً في هذه المرحلة.</p>
<h2>SideShift.ai طلب<h2>
<p>في شاشة \"أكد\" سترى طلب Sideshift.ai الفعلي. هذا الطلب صحيح لفترة محدودة
قد تلاحظ عداًَ تنازلياً على زر \"spend\". قد يكون سعر الصرف مختلفاً عن السعر الدلالي في الشاشة السابقة.</p>
<h2>السري SideShift.ai مفتاح<h2>
<p>لأن مونيرويو فقط يتعامل مع جزء مونيرو من معاملتك يمكن لمفتاح Sideshift.ai السري الخاص البك أن يستعل لتتبع جزء بيتكوين من طلبك على موقع Sideshift.ai</p>
<h2>التنازلي! SideShift.ai عد</h2>
<p>عند وصول العد التنازلي إلى الصفر، تحتاج إلى الحصول على سعر جديد من Sideshift.ai بالرجوع إلى الخطوة السابقة ثم العودة إلى شاشة \"أكد\"</p>
<string name="help_wallet"><![CDATA[
<h1>المحفظة</h1>
<h2>وضع الشارع</h2>
<p>
يمكنك تفعيل/تعطيل وضع الشارع في القائمة أو أيقونة رأس غونثر. في هذا الوضع، رصيدك لا يظهر على أي شاشة لذا يمكنك استخدام محفظتك بأمان في الشارع، القهوة، أو أي مكان عام. المعاملات السابقة أيضاً مخفية. ستعرض المعاملات الجديدة لترى أنك أرسلت/استلمت موينرو.</p>
<h2>مسح</h2>
لأن مونيرو يحب إبقاء الأشياء خاصة، كل مرة تفتح محفظة موينيرويو علينا مسح سلسلة الكتل لنرى إذا ما أرسل مونيرة إلى محفظتك. أحياناً يستغرق فترةً لأنك لم تزامن منذ فترة طويلة.
<h2>الرصيد</h2>
<p><b>النجدة! رصيد محفظتي اختفى أو هو غير مؤكد!</b><br/>
لا تفزع! عندما ترسل المال من محفظتك، بعض رصيدك سيظهر مؤقتاً كغير مؤكد.
يحصل نتيجةً لكيفية تبادل مونيرو على سلسلة الكتل و كيفية عمل الفكة. إقرأ أكثر عن الفكة على https://getmonero.org/resources/moneropedia/change.html
<h2>قائمة المعاملات</h2>
<p>في محافظ الرؤية، فقط تعرض المعاملات القادمة.</p>
]]></string>
<string name="help_node"><![CDATA[
<h1>العقد</h1>
<h2>المختصر المفيد</h2>
<p>أعد تحميل قائمة العقد بالسحب للأسفل &amp; bookmark 3&#8211;5 عقد لتسمح لمونيرويو أن يختار الأفضل لك!</p>
<h2>ما هي العقد؟</h2>
<p>مونيرويو يستخدم عقدة خارجية لالتواصل بشبكة مونيرو دون الحاجة لتنزيل نسخة كاملة من سلسلة الكتل .<p>
<h2>قائمة العقد</h2>
<p>إذا القائمة فارغة، يمكنك إما إضافة العقد يدوياً أو دع مونيرويو يمسح الشبكة لك. أو كلا الأمرين. إقرأ أكثر&#8230;</p>
<p>تعرض قائمة العقد كل العقد المعروفة حالياً. إضافةً، الطابع \ الختم الزمني لأحدث كتلة معروفة لكل عقدة يظهر
تحت اسم العقدة. تظهر أيقونة تمثل سلوك استجابة العقدة (يشير إلى مستوى الاتصال المتوقع) بجانب كل عقدة.</p>
<p>أي عقدة في القائمة يمكن أن تعلم لاستعمال لاحق.
العقد التي لم تعلم ستنسى.<p>
<p>سيختار مونيرويو العقدة المعلمة الأمثل كل مرة تستعمله.
يفعل هذا بالتأكد من ارتفاع الكتلة (ما هي حداثة العقدة؟)
إضافة إلى استجابتها (ما سرعة استجابة العقدة للطلبات؟).</p>
<p>هذه القائمة مفروزة حسب هذه الخصائص، فالعقدة العليا هي التي يختارها مونيرويو الآن. سيظهر الجزء السفلى عقد بطيئة جداً أو غير متوفرة.</p>
<h2>أضف عقدة</h2>
<p>عند لمس زر "أضف عقدة" في الأسفل، سيطلب منك إدخال تفاصيل العقدة في الحوار التالى.
"العنوان" هو اسم المضيف أو عنوان IP للعقدة - هذا المدخل الإلزامي الوحيد.
أدخل "المنفذ" إذا تشتغل العقدة في منفذ غير افتراضي )18089)
يمكنك أيضاً تسمية العقدة لتتمكن من التعرف عليها بسهولة في وقت لاحق.
بعض العقد تتطلب بيانات اعتماد لاستخدامهم. أدخل اسم المستخدم و كلمة المرور المزودين في الحقول المناسبة. الآن يمكنك "اختبار" هذه الاعدادات.
ستعرض "نتائج الاختبار" ارتفاع الكتلة، وقت الاستجابة، و عنوان IP المستعمل.
قد تكون النتيجة خطأً - عادة لأن اسم المصيف المزود لا يمكن الوصول إليه في وقت معقول أو أن بيانات الاعتماد غير صحيحة.أو أن اسم المضيف/المنفذ لا يشيران إلى عقدة مونيرو حقيقية!
عند اجتياز الاختبار (لا اخطاء) - يمكنك لمس "حسناً" لحفظ و تعليم هذه العقدة</p>
<h2>ابحث عن العقد</h2>
<p>إضافةً، يمكنك مسح الشبكة للعقد. مونيرويو سيبدأ مسح الشبكة للعقد البعيدة في منفذ 18098. يبدأ بيؤال العقد المعلمة عن أنداد آخرين في شبكة مونيرو ثم يستمر بسؤالهم عن أندادهم، وهكذا. إذا لا تملك عقد معلمة (أو لا يخبروننا عن أندادهم)، مونيرويو سيتجه مباشرةً إلى عقد بذور مونيرو ضمن مونيرو. سيتوقف المسح عند العثور على 10 عقد بعيدة. </p>
]]></string>
<string name="help_uri"><![CDATA[
<h1>استخدام رابط دفع</h1>
<p>لقد بدأت مونيرويو باستخدام رابط دفق. لإرسال المال افعل التالي:</p>
<p>
1. المحفظة التي تريد الانفاق منها<br>
2. انتظر حتى تزامن المحفظة وamp; يظهر زر "أعط"<br>
3. المس زر "أعط"
</p>
<p>.ستعبأ تفاصيل الدفع. تأكد منهم ثم أكمل كأي معاملة أخرى</p>
]]></string>
<string name="help_ok">فهمت!</string> <!-- Note: "Got it" as in "I understand this" -->
</resources>

@ -0,0 +1,418 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="wallet_activity_name">محفظة</string>
<string name="menu_about">عن</string>
<string name="menu_privacy">سياسة الخصوصية</string>
<string name="menu_share">شارك</string>
<string name="menu_help">ساعدني</string>
<string name="menu_receive">استلم</string>
<string name="menu_rename">أعد التسمية &#8230;</string>
<string name="menu_backup">انشئ نسخة احتياطية</string>
<string name="menu_changepw">غير كلمة المرور</string>
<string name="password_weak">&#8230; أكمل الكتابة</string>
<string name="password_fair">&#8230; مه</string>
<string name="password_good">هيا يمكنك القيام بأفضل من هذا!</string>
<string name="password_strong">تكاد تصل &#8230;</string>
<string name="password_very_strong">أجل، كالمحترفين!</string>
<string name="label_login_wallets">المحافظ</string>
<string name="label_credits">الاعتمادات</string>
<string name="label_ok">حسناً</string>
<string name="label_cancel">إلغاء</string>
<string name="label_close">أغلق</string>
<string name="label_wallet_advanced_details">المس لالتفاصيل</string>
<string name="label_send_success">نجح الإرسال</string>
<string name="label_send_done">تم</string>
<string name="label_receive_info_gen_qr_code">المس لرمز استجابة سريعة (qr)</string>
<string name="info_xmrto_enabled">دفع BTC مفعل، المس لمعلومات أكثر.</string>
<string name="info_ledger_enabled">لدجر مفعل، المس لمعلومات أكثر.</string>
<string name="info_xmrto"><![CDATA[
<b>أدخلت عنوان بيتكوين.</b><br/>
<i>سترسل XMR و سيستلم المستلم BTC باستخدام خدمة <b>Sideshift.ai</b></i>
]]></string>
<string name="info_send_xmrto_success_order_label">Sideshift.ai طلب</string>
<string name="info_send_xmrto_success_btc">%1$s BTC</string>
<string name="info_send_xmrto_paid">التأكيد معلق</string>
<string name="info_send_xmrto_unpaid">الدفع معلق</string>
<string name="info_send_xmrto_error">Sideshift.ai عطل (%1$s)</string>
<string name="info_send_xmrto_sent">BTC أرسل</string>
<string name="info_send_xmrto_query">جار الاستعلام &#8230;</string>
<string name="info_send_xmrto_parms"><![CDATA[
<b>يمكنك إرسال %1$s &#8212; %2$s BTC</b>.<br/>
<i><b>Sideshift.ai</b> يعطيك سعر صرف <b>%3$s BTC</b> <u>حالياً</u></i>.
]]></string>
<string name="send_available_btc">الرصيد: %2$s BTC (%1$s XMR)</string>
<string name="info_paymentid_integrated">&#x2714; معرف الدفع مدمج</string>
<string name="info_prepare_tx">تجهيز عمليتك</string>
<string name="label_send_progress_xmrto_create">جار إنشاء طلب Sideshift.ai</string>
<string name="label_send_progress_xmrto_query">استعلام طلب Sideshift.ai</string>
<string name="label_send_progress_create_tx">جار تجهيز معاملة مونيرو</string>
<string name="label_send_progress_queryparms">استعلام ضوابط Sideshift.ai</string>
<string name="label_generic_xmrto_error">Sideshift.ai عطل</string>
<string name="text_generic_xmrto_error">رمز: %1$d</string>
<string name="text_retry">المس لإعادة المحوالة</string>
<string name="text_noretry_monero">علقنا هنا!</string>
<string name="text_noretry">يبدو أن Sideshift.ai ليس متوفراً حالياً!</string>
<string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string>
<string name="text_send_btc_rate">(الصرف: %1$s BTC/XMR)</string>
<string name="label_send_btc_xmrto_info">قم بزيارة Sideshift.ai للدعم و التتبع</string>
<string name="label_send_btc_xmrto_key_lb">المفتاح السري\nSideshift.ai</string>
<string name="label_send_btc_xmrto_key">السري Sideshift.ai مفتاح</string>
<string name="label_send_btc_address">عنوان الوجهة BTC</string>
<string name="label_send_btc_amount">المبلغ</string>
<string name="label_send_txid">معرف المعاملة</string>
<string name="label_send_address">عنوان الوجهة</string>
<string name="label_send_notes">ملاحظات</string>
<string name="backup_progress">جار إنشاء النسخة الاحتياطية</string>
<string name="archive_progress">جار الأرشفة</string>
<string name="rename_progress">جار إعادة التسمية</string>
<string name="changepw_progress">جار تغيير كلمة المرور</string>
<string name="service_progress">جار اختتام الأمور &#8230;\nقد يستغرق هذا برهةً!</string>
<string name="backup_success">نجح النسخ الاحتياطي</string>
<string name="backup_failed">فشل النسخ الاحتياطي!</string>
<string name="rename_failed">فشلت إعادة التسمية!</string>
<string name="changepw_failed">فشل تغيير كلمة السر!</string>
<string name="changepw_success">تم تغيير كلمة السر</string>
<string name="label_daemon">العقدة</string>
<string name="status_wallet_loading">جار تحميل المحفظة &#8230;</string>
<string name="status_wallet_unloaded">حفظت المحفظة</string>
<string name="status_wallet_unload_failed">فشل حفظ المحفظة!</string>
<string name="status_wallet_connecting">جار الاتصال &#8230;</string>
<string name="status_wallet_connect_failed">فشل الاتصال بالعقدة!\nتأكد من اسم المستخدم/كلمة المرور</string>
<string name="status_wallet_connect_wrongversion">نسخة العقدة غير متوافقة - حدث رجاءً!</string>
<string name="status_wallet_node_invalid">العقدة غير صحيحة!\nجرب عقدة أخرى.</string>
<string name="status_wallet_connect_ioex">لا يمكن الوصول للعقدة!\nحاول مجدداً أو جرب عقدة أخرى.</string>
<string name="status_wallet_disconnected">منقطعة</string>
<string name="status_transaction_failed">فشلت المعاملة: %1$d</string>
<string name="send_xmrto_timeout">!انتظرت طويلاً يا صاحبي!</string>
<string name="service_busy">&#8230;ما زلت مشغولاً بمحفظتك الأخيرة </string>
<string name="prompt_rename">أعد التسمية %1$s</string>
<string name="prompt_changepw">كلمة مرور جديدة ل %1$s</string>
<string name="prompt_changepwB">أعد كلمة المرور ل %1$s</string>
<string name="prompt_password">كلمة السر ل%1$s</string>
<string name="prompt_fingerprint_auth">يمكنك أيضاً فتح المحفظة باستعمال البصمة.\nرجاءً المس الحساس.</string>
<string name="prompt_open_wallet">جار فتح المحفظة&#8230;</string>
<string name="bad_fingerprint">لم يتعرف على البصمة. حاول مجدداً.</string>
<string name="bad_password">كلمة السر خاطئة!</string>
<string name="bad_saved_password">كلمة المرور المحفوظة غير صحيحة.\nرجاءً أدخل كلمة المرور يدوياً.</string>
<string name="bad_wallet">المحفظة غير موجودة!</string>
<string name="prompt_daemon_missing">!يجب ضبط العقدة!</string>
<string name="prompt_wrong_net">المحفظة لا تطابق الشبكة المختارة</string>
<string name="label_watchonly">(مشاهدة فقط)</string>
<string name="label_wallet_receive">استلم</string>
<string name="label_wallet_send">أعط</string>
<string name="xmr_unconfirmed_amount">+ %1$s XMR غير مأكد</string>
<string name="service_description">خدمة مونيرويو</string>
<string name="status_synced">تزامن؛</string>
<string name="status_remaining">الكتل التبقية</string>
<string name="status_syncing">جار مسح:</string>
<string name="message_strorage_not_writable">التخرين الخارجي غير قابل للكتابة! افزع!</string>
<string name="message_strorage_not_permitted">نحتاج إلى صلاحيات التزين الخارجي فعلاً!</string>
<string name="message_camera_not_permitted">لا كاميرا = لا مسح لرموز الاستجابة السريعة (QR)!</string>
<string name="label_copy_viewkey">مفتاح الرؤية</string>
<string name="label_copy_address">العنوان العام</string>
<string name="label_copy_xmrtokey">Sideshift.ai مفتاح</string>
<string name="message_copy_viewkey">نسخ مفتاح الرؤية إلى الحافظة!</string>
<string name="message_copy_xmrtokey">نسخ مفتاح Sideshift.ai إلى الناسخة!</string>
<string name="message_copy_address">نسخ عنوان المحفظة للحافظة!</string>
<string name="message_copy_txid">نسخ معرف المعاملة إلى الحافظة!</string>
<string name="message_nocopy">النسخ معطل لأسباب أمنية!</string>
<string name="message_exchange_failed">لا يمكن الحصول على سعر الصرف!\nاستعمل XMR/XMR أو حاول مجدداً</string>
<string name="generate_title">أنشئ محفظة</string>
<string name="generate_name_hint">اسم المحفظة</string>
<string name="generate_password_hint">كلمة مرور المحفظة</string>
<string name="generate_fingerprint_hint">اسمح لفتح المحفظة بالبصمة</string>
<string name="generate_fingerprint_warn"><![CDATA[
<strong>التوثيق بالبصمة</strong>
<p>عند تفعيل التوثيق بالبصمة، يمكنك رؤية رصيد المحفظة و استلام المال دون ادخال كلمة السر.</p>
<p>لكن لزيادة الأمان، مونيرويو سيتطلب منك أن تدخل كلمةالمرور عند رؤية تفاصيل المحفضة أو إرسال المال.</p>
<strong>تحذير أمني</strong>
<pأخيراً، نريد أن نذكرك أن أي أحد يمكنه الحصول على بصمتك سيتمكن من يطل على رصيد محفظتك.</p>
<p>مثلا، ينكن لشخص خبيث فتح محفظتك و أنت نائم.</p>
<strong> هل أنت متأكد أنك تريد تفعيل هذه ال</strong>
]]></string>
<string name="generate_bad_passwordB">السر لا تتطابق</string>
<string name="generate_empty_passwordB">لا يمكن لعبارة المرور أن تكون فارغة</string>
<string name="generate_buttonGenerate">انشئ لي محفظة و خلصنا!</string>
<string name="generate_button_accept">دونت بذرة الذاكرة</string>
<string name="generate_wallet_name">أعطني اسماً</string>
<string name="generate_wallet_exists">المحفظة موجودة!</string>
<string name="generate_wallet_dot">لا يمكن البدء ب.</string>
<string name="generate_wallet_creating">جار إنشاء المحفظة</string>
<string name="generate_wallet_created">أنشأت المحفظة</string>
<string name="generate_restoreheight_error">أدخل رقماً أو تاريخاً (سسسس-شش-يي)</string>
<string name="generate_wallet_type_key">المفاتيح</string>
<string name="generate_wallet_type_new">جديد</string>
<string name="generate_wallet_type_seed">بذرة</string>
<string name="generate_wallet_type_view">رؤية</string>
<string name="generate_address_hint">العنوان العام</string>
<string name="generate_viewkey_hint">مفتاح الرؤية</string>
<string name="generate_spendkey_hint">مفاح الإنفاق</string>
<string name="generate_mnemonic_hint">بذرة الذاكرة ذات 25 كلمة</string>
<string name="generate_restoreheight_hint">استرجع الارتفاع أو التاريخ (سسسس-شش-يي)</string>
<string name="generate_address_label">العنوان العام</string>
<string name="generate_viewkey_label">مفتاح الرؤية</string>
<string name="generate_spendkey_label">مفتاح الإنفاق</string>
<string name="generate_mnemonic_label">بذرة الذاكرة</string>
<string name="generate_crazypass_label">ملفات المحفظة استرجع كلمة المرور</string>
<string name="generate_check_key">أدخل مفتاحاً صحيحاً</string>
<string name="generate_check_address">أدخل عنواناً صحيحاً</string>
<string name="generate_check_mnemonic">أدخل بذرتك ذات 25 كلمة</string>
<string name="send_notes_hint">الملاحظات الخاصة (اختياري)</string>
<string name="send_generate_paymentid_hint">ولد</string>
<string name="send_send_label">أنفق مونيرواتي الحبيبة</string>
<string name="send_send_timed_label">أرسل مونيرواتي الحبيبة (%1$s)</string>
<string name="send_qr_invalid">ليس رمز استجابة سريعة (QR)</string>
<string name="send_qr_address_invalid">ليس رمزاً حصيحاً</string>
<string name="send_address_invalid">ليس عنواناً صحيحاً</string>
<string name="send_address_not_openalias">عنوان OpenAlias ليس متوفر</string>
<string name="send_address_openalias">آمن &#x2714;</string>
<string name="send_address_resolve_openalias">حل OpenAlias&#8230;</string>
<string name="send_address_no_dnssec">OpenAlias دون DNSSEC - قد يكون العنوان منتحل</string>
<string name="send_title">أرسل</string>
<string name="send_available">الرصيد: %1$s XMR</string>
<string name="send_address_title">العنوان</string>
<string name="send_amount_title">المبلغ</string>
<string name="send_confirm_title">أكد</string>
<string name="send_success_title">تم</string>
<string name="send_amount_label">المبلغ</string>
<string name="send_fee_btc_label">الرسوم (xmr)</string>
<string name="send_fee_label">الرسوم</string>
<string name="send_total_btc_label">المجموع (xmr)</string>
<string name="send_total_label">المجموع</string>
<string name="send_amount">%1$s XMR</string>
<string name="send_fee">+%1$s رسوم</string>
<string name="send_create_tx_error_title">عطل إنشاء المعاملة</string>
<string name="tx_list_fee">- رسوم %1$s</string>
<string name="tx_list_amount_failed">(%1$s)</string>
<string name="tx_list_failed_text">فشل</string>
<string name="tx_list_amount_negative">- %1$s</string>
<string name="tx_list_amount_positive">+ %1$s</string>
<string name="tx_timestamp">الختم الزمني</string>
<string name="tx_id">TX ID</string>
<string name="tx_key">TX Key</string>
<string name="tx_destination">الوجهة</string>
<string name="tx_paymentId">معرف الدفع</string>
<string name="tx_blockheight">الكتلة</string>
<string name="tx_amount">المبلغ</string>
<string name="tx_fee">الرسوم</string>
<string name="tx_transfers">التحويلات</string>
<string name="tx_notes">ملاحظات</string>
<string name="tx_notes_hint">(اختياري)</string>
<string name="tx_title">تفاصيل المعاملة</string>
<string name="tx_pending">معلقة</string>
<string name="tx_failed">فشلت</string>
<string name="receive_amount_hint">المبلغ</string>
<string name="receive_desc_hint">وصف (اختياري)</string>
<string name="receive_cannot_open">لم يتمكن من فتح المحفظة!</string>
<string name="receive_amount_too_big">%1$s أقصى</string>
<string name="receive_amount_negative">0 أدنى</string>
<string name="receive_amount_nan">XMR ليس رقماً</string>
<string name="details_alert_message">ستظهر بيانات حساسة.\nتفحص خلف ظهرك!</string>
<string name="details_alert_yes">أنا في أمان</string>
<string name="details_alert_no">أرجعني!</string>
<string name="details_title">التفاصيل</string>
<string name="fab_create_new">أنشئ محفظة جديدة</string>
<string name="fab_restore_viewonly">استرجع محفظة رؤية-فقط</string>
<string name="fab_restore_key">استرجع محفظة من المفاتيح الخاصة</string>
<string name="fab_restore_seed">استرجع محفظة من بذرة 25 كلمة</string>
<string name="accounts_drawer_new">أنشئ حساباً</string>
<string name="accounts_new">أضيف حساب جديد #%1$d</string>
<string name="tx_account">الحساب #</string>
<string name="send_sweepall">أرسل كل المال المؤكد في هذا الحساب!</string>
<string name="tx_subaddress">العنوان الفرعي #%1$d</string>
<string name="generate_address_label_sub">العنوان الفرعي العام #%1$d</string>
<string name="menu_language">اللغة</string>
<string name="language_system_default">استخدم لغة النظام</string>
<string name="fab_restore_ledger">استرجع من لدجر نانو اس</string>
<string name="progress_ledger_progress">جار التواصل مع اللدجر</string>
<string name="progress_ledger_confirm">التأكيد على اللدجر مطلوب!</string>
<string name="progress_ledger_lookahead">استلام العناوين الفرعية</string>
<string name="progress_ledger_verify">التأكد من صحة المفاتيح</string>
<string name="progress_ledger_opentx">القيام بحسابات مجنونة</string>
<string name="progress_ledger_mlsag">تشفير الأشياء</string>
<string name="open_wallet_ledger_missing">رجاءً (إعادة) إيصال جهاز لدجر</string>
<string name="accounts_progress_new">جار إنشاء الحساب</string>
<string name="toast_ledger_attached">%1$s اربط</string>
<string name="toast_ledger_detached">%1$s فصل</string>
<string name="progress_nfc_write">جار كتابة العلامة</string>
<string name="nfc_write_failed">فشلت كتابة العلامة</string>
<string name="nfc_write_successful">نجحت كتابة العلامة</string>
<string name="nfc_tag_unsupported">العلامة لا تدعم NDEF!</string>
<string name="nfc_tag_size">العلامة تزود %1$dلأ بايتاً، لكننا نحتاج %2$ل!</string>
<string name="nfc_tag_read_undef">لا أفهم العلامة!</string>
<string name="nfc_tag_read_what">لا أعرف ماذا تريد!</string>
<string name="nfc_tag_tap">NFC متوفر!</string>
<string name="menu_info">أظهر أسراري!</string>
<string name="menu_streetmode">وضع الشارع</string>
<string name="info_nodes_enabled">Node-o-matiC مفعل، المس لمعلومات أكثر.</string>
<string name="node_height">آخر كتلة تحدثت: %1$s</string>
<string name="label_nodes">العقد</string>
<string name="node_name_hint">اسم العقدة (اختياري)</string>
<string name="node_address_hint">اسم المضيف</string>
<string name="node_port_hint">المنفظ</string>
<string name="node_user_hint">اسم المستخدم (اختياري)</string>
<string name="node_pass_hint">كلمة المرور (اختياري)</string>
<string name="node_host_unresolved">لا يمكن حل المضيف</string>
<string name="node_host_empty">نحتاج لهذا!</string>
<string name="node_port_numeric">يجب أن يكون رقماً</string>
<string name="node_port_range">1&#8211;65535 يجب أن يكون</string>
<string name="node_fab_add">أضف عقدة</string>
<string name="node_refresh_hint">المس لإعادة التحميل</string>
<string name="node_test_error">%1$d عطل إطصال</string>
<string name="node_general_error">عطل في الاتصال</string>
<string name="node_auth_error">فشل التوثيق</string>
<string name="node_result_label">نتيجة الاختبار:</string>
<string name="node_result">الارتفاع: %1$s (v%2$d), Ping: %3$.0fms, IP: %4$s</string>
<string name="node_testing">اختبار IP: %1$s &#8230;</string>
<string name="node_refresh_wait">رجاءً انتظر انتهاء المسح</string>
<string name="node_create_hint">المس لاختيار أو إضافة العقد</string>
<string name="node_pull_hint">أضف العقد يدوياً أو اسحب للأسفل للمسح</string>
<string name="node_scanning">جار مسح الشبكة&#8230;</string>
<string name="node_nobookmark">علمت أفضل %1$d عقد تلقائياً</string>
<string name="label_test">اختبر</string><!--note: as in "Test a network connection"-->
<string name="send_address_hint">المستلم</string>
<string name="street_sweep_amount">كل شيء!</string>
<string name="menu_ledger_seed">حول بذرة اللدجر</string>
<string name="prompt_ledger_seed">كلمات بذرة اللدجر</string>
<string name="prompt_ledger_phrase">عبارة دخول اللدجر (متقدم)</string>
<string name="bad_ledger_seed">بذرة اللدجر غير صحيحة!</string>
<string name="prompt_ledger_seed_warn">إدخال بذرة اللدجر هنا خطر أمني كبير!</string>
<string name="label_restoreheight">استرجع الارتفاع</string>
<string name="toast_ledger_start_app">ابدأ تطبيق مونيرو في %1$s</string>
<string name="menu_rescan">أعد المسح!</string>
<string name="onboarding_agree">فهمت!</string>
<string name="onboarding_button_next">التالي</string>
<string name="onboarding_button_ready">أنا جاهز!</string>
<string name="onboarding_welcome_title">مرحباً بك في مونيرويو!</string>
<string name="onboarding_welcome_information">هذا التطبيق يسمح لك بإنشاء و استخدام محافظ مونيرو. يمكنك الاحتفاظ بالحبيب مونيرو فيهم.</string>
<string name="onboarding_seed_title">أبق بذرتك آمنة</string>
<string name="onboarding_seed_information">البذرة تمنح وصولاً كاملاً لمن يمتلكها.إذا ما أضعتها لا يمكننا مساعدتك في استرجاعها و ستخسر مونيرواتك الحبيبة.</string>
<string name="onboarding_xmrto_title">أرسل بيتكوين</string>
<string name="onboarding_xmrto_information">لدى مونيرويو دعم داخلي لSideshift.ai. فقط الصق أو امسح عنوان بيتكوين و سترسل بيتكون بانفاق مونيرو.</string>
<string name="onboarding_nodes_title">العقد، كما تشاء</string>
<string name="onboarding_nodes_information">العقد تصلك بشبكة مونيرو. اختر ما بين العقد العامة أو كن متمرداً سبرانياً و استخدم خاصتك.</string>
<string name="onboarding_fpsend_title">أرسل بالبصمة</string>
<string name="onboarding_fpsend_information">يمكنك الآن إرسال XMR فقط ببصمتك إذا فعلتها. لطلب كلمة المرور، فقط عطل الدخول بالبصمة.</string>
<string name="menu_daynight">الوضع الليلي</string>
<string-array name="daynight_themes">
<item>تلقائي</item>
<item>يوم</item>
<item>ليل</item>
</string-array>
<string name="gunther_says">لا شيء هنا\nالرجاء إنشاء أو استعادة محفظة</string>
<string name="menu_default_nodes">أرجع العقد الافتراضية</string>
<string name="toast_default_nodes">الاسترجاع يتقدم بالفعل...</string>
<string name="node_updated_now">الكتلة الأخيرة: منذ %1$d ثوان</string>
<string name="node_updated_mins">الكتلة الخيرة: منذ %1$d ساعة</string>
<string name="node_updated_hours">الكتلة الأخيرة: منذ %1$d ساعة</string>
<string name="node_updated_days">الكتلة الأخيرة: منذ %1$d أيام</string>
<string name="shift_noquote">لا يمكن الحصول على سعر</string>
<string name="shift_checkamount">تأكد من البلغ و حاول مجدداً</string>
<string name="info_xmrto_ambiguous"><![CDATA[
<b>عنوان مبهم.</b><br/>
<i>رجاء حدد النوع أعلاه. </i>
]]></string>
<string name="info_xmrto_help"><![CDATA[
<b>رجاء أدخل أو امسح عنوان %1$s</b><br/>
<i>سترسل XMR و سيتلقى المستلم %2$s باستعمال خدمة <b>SideShift.ai</b></i>
]]></string>
<string name="info_xmrto_help_xmr"><![CDATA[
<b>رجاء أدخل أو امسح عنوان مونيرو</b>
]]></string>
<string name="subbaddress_title">العناوين الفرعية</string>
<string name="subbaddress_name_hint">اسم العنوان الفرعي</string>
<string name="max_subaddress_warning">عناوين غير مستعملة كثيرة - استعمل بعضها لتتمكن من إنشاء المزيد!</string>
<string name="max_account_warning">حسابات غير مستعملة كثيرة - استعمل بعضها لتتمكن من إنشاء المزيد!</string>
<string name="subaddress_tx_label">المعاملات لهذا العنوان الفرعي:</string>
<string name="subaddress_notx_label">لا معاملات لهذا العنوان الفرعي بعد</string>
<string name="subaddress_select_label">اختر عنواناً فرعياً</string>
<string name="subaddress_details_hint">المس طويلاً للتفاصيل</string>
<string name="menu_restore">استورد محفظة</string>
<string name="restore_failed">فشل الاستيراد</string>
<string name="menu_deletecache">أعد ضبط المحفظة!</string>
<string name="deletecache_alert_message">ستتم إعادة ضبط هذه المحفظة ، وفقدان جميع البيانات خارج السلسلة (مثل الملاحظات ، وأسماء الحسابات والعناوين الفرعية ، ومفاتيح المعاملات الخاصة ، ...)! استخدم هذا فقط إذا كانت هذه المحفظة تالفة و لا تحمل!</string>
</resources>

@ -95,7 +95,7 @@ public class SideShiftApiRequestQuoteTest {
@Test
public void requestQuote_shouldContainValidBody() throws InterruptedException {
final String validBody = "{\"depositAmount\":\"1.01\",\"settleMethod\":\"btc\",\"depositMethod\":\"xmr\"}";
final String validBody = "{\"settleAmount\":\"1.01\",\"settleMethod\":\"btc\",\"depositMethod\":\"xmr\"}";
xmrToApi.requestQuote(1.01, mockXmrToCallback);
RecordedRequest request = mockWebServer.takeRequest();
@ -106,18 +106,18 @@ public class SideShiftApiRequestQuoteTest {
@Test
public void requestQuote_wasSuccessfulShouldRespondWithQuote()
throws TimeoutException {
final double xmrAmount = 1.01;
final double btcAmount = 1.01;
final double rate = 0.00397838;
final String uuid = "66fc0749-f320-4361-b0fb-7873576cba67";
MockResponse jsonMockResponse = new MockResponse().setBody(
createMockRequestQuoteResponse(xmrAmount, rate, uuid));
createMockRequestQuoteResponse(btcAmount, rate, uuid));
mockWebServer.enqueue(jsonMockResponse);
xmrToApi.requestQuote(xmrAmount, new ShiftCallback<RequestQuote>() {
xmrToApi.requestQuote(btcAmount, new ShiftCallback<RequestQuote>() {
@Override
public void onSuccess(final RequestQuote quote) {
waiter.assertEquals(quote.getBtcAmount(), xmrAmount * rate);
waiter.assertEquals(quote.getXmrAmount(), xmrAmount);
waiter.assertEquals(quote.getXmrAmount(), btcAmount / rate);
waiter.assertEquals(quote.getBtcAmount(), btcAmount);
waiter.assertEquals(quote.getId(), uuid);
waiter.resume();
}
@ -181,17 +181,17 @@ public class SideShiftApiRequestQuoteTest {
waiter.await();
}
private String createMockRequestQuoteResponse(final double xmrAmount, final double rate,
private String createMockRequestQuoteResponse(final double btcAmount, final double rate,
final String uuid) {
return "{\n" +
"\"createdAt\":\"2021-02-04T13:09:14.484Z\",\n" +
"\"depositAmount\":\"" + xmrAmount + "\",\n" +
"\"settleAmount\":\"" + btcAmount + "\",\n" +
"\"depositMethod\":\"xmr\",\n" +
"\"expiresAt\":\"2021-02-04T13:24:14.484Z\",\n" +
"\"id\":\"" + uuid + "\",\n" +
"\"rate\":\"" + rate + "\",\n" +
"\"settleAmount\":\"" + (xmrAmount * rate) + "\",\n" +
"\"depositAmount\":\"" + (btcAmount / rate) + "\",\n" +
"\"settleMethod\":\"btc\"\n" +
"}";
}

@ -6,7 +6,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.3'
classpath 'com.android.tools.build:gradle:7.0.2'
}
}

@ -2,7 +2,7 @@ FLAVOUR=wownero
all: arm64-v8a x86_64 include/wallet2_api.h VERSION
arm64-v8a: $(FLAVOUR) android64.Dockerfile
arm64-v8a: $(FLAVOUR) android64.Dockerfile include/wallet2_api.h
-rm -rf arm64-v8a
-docker container rm $(FLAVOUR)-android-arm64 -f
docker build -f android64.Dockerfile -t $(FLAVOUR)-android-arm64 $(FLAVOUR)
@ -10,7 +10,7 @@ arm64-v8a: $(FLAVOUR) android64.Dockerfile
docker cp $(FLAVOUR)-android-arm64:/opt/android/prefix/lib/. arm64-v8a/
docker cp $(FLAVOUR)-android-arm64:/src/build/release/lib/. arm64-v8a/$(FLAVOUR)
x86_64: $(FLAVOUR) android64_x86.Dockerfile
x86_64: $(FLAVOUR) android64_x86.Dockerfile include/wallet2_api.h
-rm -rf x86_64
-docker container rm $(FLAVOUR)-android-x86_64 -f
docker build -f android64_x86.Dockerfile -t $(FLAVOUR)-android-x86_64 $(FLAVOUR)

@ -1 +1 @@
MONERUJO_wownero master with wownero (HEAD detached at v0.9.3.3)
MONERUJO_wownero feature-v0.10 with wownero wonerujo-v0.10.1.0

@ -0,0 +1,151 @@
FROM debian:stable
RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python libtool libtinfo5
WORKDIR /opt/android
## INSTALL ANDROID SDK
ENV ANDROID_SDK_REVISION 4333796
ENV ANDROID_SDK_HASH 92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
RUN set -x \
&& curl -s -O https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
&& echo "${ANDROID_SDK_HASH} sdk-tools-linux-${ANDROID_SDK_REVISION}.zip" | sha256sum -c \
&& unzip sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
&& rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
## INSTALL ANDROID NDK
ENV ANDROID_NDK_REVISION 17c
ENV ANDROID_NDK_HASH 3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
RUN set -x \
&& curl -s -O https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
&& echo "${ANDROID_NDK_HASH} android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip" | sha256sum -c \
&& unzip android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
&& rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
ENV WORKDIR /opt/android
ENV ANDROID_SDK_ROOT ${WORKDIR}/tools
ENV ANDROID_NDK_ROOT ${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
ENV PREFIX /opt/android/prefix
ENV TOOLCHAIN_DIR ${WORKDIR}/toolchain-
RUN set -x \
&& ${ANDROID_NDK_ROOT}/build/tools/make_standalone_toolchain.py \
--arch arm \
--api 21 \
--install-dir ${TOOLCHAIN_DIR} \
--stl=libc++
#INSTALL cmake
ARG CMAKE_VERSION=3.14.6
ARG CMAKE_HASH=82e08e50ba921035efa82b859c74c5fbe27d3e49a4003020e3c77618a4e912cd
RUN set -x \
&& cd /usr \
&& curl -L -s -O https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
&& echo "${CMAKE_HASH} cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz" | sha256sum -c \
&& tar -xzf /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
&& rm -f /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz
ENV PATH /usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
## Boost
ARG BOOST_VERSION=1_70_0
ARG BOOST_VERSION_DOT=1.70.0
ARG BOOST_HASH=430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778
RUN set -x \
&& curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
&& tar -xvf boost_${BOOST_VERSION}.tar.bz2 \
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \
&& cd boost_${BOOST_VERSION} \
&& ./bootstrap.sh --prefix=${PREFIX}
ENV HOST_PATH $PATH
ENV PATH $TOOLCHAIN_DIR/arm-linux-androideabi/bin:$TOOLCHAIN_DIR/bin:$PATH
ARG NPROC=1
# Build iconv for lib boost locale
ENV ICONV_VERSION 1.16
ENV ICONV_HASH e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
RUN set -x \
&& curl -s -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
&& echo "${ICONV_HASH} libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf libiconv-${ICONV_VERSION}.tar.gz \
&& rm -f libiconv-${ICONV_VERSION}.tar.gz \
&& cd libiconv-${ICONV_VERSION} \
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ./configure --build=x86_64-linux-gnu --host=arm-linux-androideabi --prefix=${PREFIX} --disable-rpath \
&& make -j${NPROC} && make install
## Build BOOST
RUN set -x \
&& cd boost_${BOOST_VERSION} \
&& ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} install -j${NPROC}
#Note : we build openssl because the default lacks DSA1
# download, configure and make Zlib
ENV ZLIB_VERSION 1.2.11
ENV ZLIB_HASH c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
RUN set -x \
&& curl -s -O https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
&& echo "${ZLIB_HASH} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
&& rm zlib-${ZLIB_VERSION}.tar.gz \
&& mv zlib-${ZLIB_VERSION} zlib \
&& cd zlib && CC=clang CXX=clang++ ./configure --static \
&& make -j${NPROC}
# open ssl
ARG OPENSSL_VERSION=1.0.2p
ARG OPENSSL_HASH=50a98e07b1a89eb8f6a99477f262df71c6fa7bef77df4dc83025a2845c827d00
RUN set -x \
&& curl -s -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
&& echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \
&& rm openssl-${OPENSSL_VERSION}.tar.gz \
&& cd openssl-${OPENSSL_VERSION} \
&& sed -i -e "s/mandroid/target\ armv7\-none\-linux\-androideabi/" Configure \
&& CC=clang CXX=clang++ \
./Configure android-armv7 \
no-asm \
no-shared --static \
--with-zlib-include=${WORKDIR}/zlib/include --with-zlib-lib=${WORKDIR}/zlib/lib \
--prefix=${PREFIX} --openssldir=${PREFIX} \
&& make -j${NPROC} \
&& make install
# ZMQ
ARG ZMQ_VERSION=v4.3.2
ARG ZMQ_HASH=a84ffa12b2eb3569ced199660bac5ad128bff1f0
RUN set -x \
&& git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} \
&& cd libzmq \
&& test `git rev-parse HEAD` = ${ZMQ_HASH} || exit 1 \
&& ./autogen.sh \
&& CC=clang CXX=clang++ ./configure --prefix=${PREFIX} --host=arm-linux-androideabi --enable-static --disable-shared \
&& make -j${NPROC} \
&& make install
# Sodium
ARG SODIUM_VERSION=1.0.18
ARG SODIUM_HASH=4f5e89fa84ce1d178a6765b8b46f2b6f91216677
RUN set -x \
&& git clone https://github.com/jedisct1/libsodium.git -b ${SODIUM_VERSION} \
&& cd libsodium \
&& test `git rev-parse HEAD` = ${SODIUM_HASH} || exit 1 \
&& ./autogen.sh \
&& CC=clang CXX=clang++ ./configure --prefix=${PREFIX} --host=arm-linux-androideabi --enable-static --disable-shared \
&& make -j${NPROC} \
&& make install
COPY . /src
ARG NPROC=4
RUN set -x \
&& cd /src \
&& CMAKE_INCLUDE_PATH="${PREFIX}/include" \
CMAKE_LIBRARY_PATH="${PREFIX}/lib" \
ANDROID_STANDALONE_TOOLCHAIN_PATH=${TOOLCHAIN_DIR} \
USE_SINGLE_BUILDDIR=1 \
PATH=${HOST_PATH} make release-static-android-armv7-wallet_api -j${NPROC}
RUN set -x \
&& cd /src/build/release \
&& find . -path ./lib -prune -o -name '*.a' -exec cp '{}' lib \;

@ -0,0 +1,151 @@
FROM debian:stable
RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python libtool libtinfo5
WORKDIR /opt/android
## INSTALL ANDROID SDK
ENV ANDROID_SDK_REVISION 4333796
ENV ANDROID_SDK_HASH 92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
RUN set -x \
&& curl -s -O https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
&& echo "${ANDROID_SDK_HASH} sdk-tools-linux-${ANDROID_SDK_REVISION}.zip" | sha256sum -c \
&& unzip sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
&& rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
## INSTALL ANDROID NDK
ENV ANDROID_NDK_REVISION 17c
ENV ANDROID_NDK_HASH 3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
RUN set -x \
&& curl -s -O https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
&& echo "${ANDROID_NDK_HASH} android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip" | sha256sum -c \
&& unzip android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
&& rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
ENV WORKDIR /opt/android
ENV ANDROID_SDK_ROOT ${WORKDIR}/tools
ENV ANDROID_NDK_ROOT ${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
ENV PREFIX /opt/android/prefix
ENV TOOLCHAIN_DIR ${WORKDIR}/toolchain
RUN set -x \
&& ${ANDROID_NDK_ROOT}/build/tools/make_standalone_toolchain.py \
--arch x86 \
--api 21 \
--install-dir ${TOOLCHAIN_DIR} \
--stl=libc++
#INSTALL cmake
ARG CMAKE_VERSION=3.14.6
ARG CMAKE_HASH=82e08e50ba921035efa82b859c74c5fbe27d3e49a4003020e3c77618a4e912cd
RUN set -x \
&& cd /usr \
&& curl -L -s -O https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
&& echo "${CMAKE_HASH} cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz" | sha256sum -c \
&& tar -xzf /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
&& rm -f /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz
ENV PATH /usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
## Boost
ARG BOOST_VERSION=1_70_0
ARG BOOST_VERSION_DOT=1.70.0
ARG BOOST_HASH=430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778
RUN set -x \
&& curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
&& tar -xvf boost_${BOOST_VERSION}.tar.bz2 \
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \
&& cd boost_${BOOST_VERSION} \
&& ./bootstrap.sh --prefix=${PREFIX}
ENV HOST_PATH $PATH
ENV PATH $TOOLCHAIN_DIR/i686-linux-android/bin:$TOOLCHAIN_DIR/bin:$PATH
ARG NPROC=1
# Build iconv for lib boost locale
ENV ICONV_VERSION 1.16
ENV ICONV_HASH e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
RUN set -x \
&& curl -s -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
&& echo "${ICONV_HASH} libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf libiconv-${ICONV_VERSION}.tar.gz \
&& rm -f libiconv-${ICONV_VERSION}.tar.gz \
&& cd libiconv-${ICONV_VERSION} \
&& CC=i686-linux-android-clang CXX=i686-linux-android-clang++ ./configure --build=x86_64-linux-gnu --host=i686-linux-android --prefix=${PREFIX} --disable-rpath \
&& make -j${NPROC} && make install
## Build BOOST
RUN set -x \
&& cd boost_${BOOST_VERSION} \
&& ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} install -j${NPROC}
#Note : we build openssl because the default lacks DSA1
# download, configure and make Zlib
ENV ZLIB_VERSION 1.2.11
ENV ZLIB_HASH c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
RUN set -x \
&& curl -s -O https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
&& echo "${ZLIB_HASH} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
&& rm zlib-${ZLIB_VERSION}.tar.gz \
&& mv zlib-${ZLIB_VERSION} zlib \
&& cd zlib && CC=clang CXX=clang++ ./configure --static \
&& make -j${NPROC}
# open ssl
ARG OPENSSL_VERSION=1.0.2p
ARG OPENSSL_HASH=50a98e07b1a89eb8f6a99477f262df71c6fa7bef77df4dc83025a2845c827d00
RUN set -x \
&& curl -s -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
&& echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \
&& rm openssl-${OPENSSL_VERSION}.tar.gz \
&& cd openssl-${OPENSSL_VERSION} \
&& sed -i -e "s/mandroid/target\ i686\-linux\-android/" Configure \
&& CC=clang CXX=clang++ \
./Configure android \
no-asm \
no-shared --static \
--with-zlib-include=${WORKDIR}/zlib/include --with-zlib-lib=${WORKDIR}/zlib/lib \
--prefix=${PREFIX} --openssldir=${PREFIX} \
&& make -j${NPROC} \
&& make install
# ZMQ
ARG ZMQ_VERSION=v4.3.2
ARG ZMQ_HASH=a84ffa12b2eb3569ced199660bac5ad128bff1f0
RUN set -x \
&& git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} \
&& cd libzmq \
&& test `git rev-parse HEAD` = ${ZMQ_HASH} || exit 1 \
&& ./autogen.sh \
&& CC=clang CXX=clang++ ./configure --prefix=${PREFIX} --host=x86-linux-android --enable-static --disable-shared \
&& make -j${NPROC} \
&& make install
# Sodium
ARG SODIUM_VERSION=1.0.18
ARG SODIUM_HASH=4f5e89fa84ce1d178a6765b8b46f2b6f91216677
RUN set -x \
&& git clone https://github.com/jedisct1/libsodium.git -b ${SODIUM_VERSION} \
&& cd libsodium \
&& test `git rev-parse HEAD` = ${SODIUM_HASH} || exit 1 \
&& ./autogen.sh \
&& CC=clang CXX=clang++ ./configure --prefix=${PREFIX} --host=x86-linux-android --enable-static --disable-shared \
&& make -j${NPROC} \
&& make install
COPY . /src
ARG NPROC=4
RUN set -x \
&& cd /src \
&& CMAKE_INCLUDE_PATH="${PREFIX}/include" \
CMAKE_LIBRARY_PATH="${PREFIX}/lib" \
ANDROID_STANDALONE_TOOLCHAIN_PATH=${TOOLCHAIN_DIR} \
USE_SINGLE_BUILDDIR=1 \
PATH=${HOST_PATH} make release-static-android-x86-wallet_api -j${NPROC}
RUN set -x \
&& cd /src/build/release \
&& find . -path ./lib -prune -o -name '*.a' -exec cp '{}' lib \;

@ -50,7 +50,7 @@ ARG BOOST_VERSION=1_70_0
ARG BOOST_VERSION_DOT=1.70.0
ARG BOOST_HASH=430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778
RUN set -x \
&& curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://dl.bintray.com/boostorg/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
&& curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
&& tar -xvf boost_${BOOST_VERSION}.tar.bz2 \
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \

@ -50,7 +50,7 @@ ARG BOOST_VERSION=1_70_0
ARG BOOST_VERSION_DOT=1.70.0
ARG BOOST_HASH=430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778
RUN set -x \
&& curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://dl.bintray.com/boostorg/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
&& curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
&& tar -xvf boost_${BOOST_VERSION}.tar.bz2 \
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \

@ -66,6 +66,47 @@ enum NetworkType : uint8_t {
bool set;
};
/*
* @brief Transaction construction data
*/
struct TransactionConstructionInfo
{
struct Input {
Input(uint64_t _amount, const std::string &_pubkey);
const uint64_t amount;
const std::string pubkey;
};
struct Output {
Output(uint64_t _amount, const std::string &_address);
const uint64_t amount;
const std::string address;
};
virtual ~TransactionConstructionInfo() = 0;
virtual uint64_t unlockTime() const = 0;
virtual std::set<std::uint32_t> subaddressIndices() const = 0;
virtual std::vector<std::string> subaddresses() const = 0;
virtual uint64_t minMixinCount() const = 0;
virtual std::vector<Input> inputs() const = 0;
virtual std::vector<Output> outputs() const = 0;
};
/*
* @brief Detailed pending transaction information
*/
struct PendingTransactionInfo
{
virtual ~PendingTransactionInfo() = 0;
virtual uint64_t fee() const = 0;
virtual uint64_t dust() const = 0;
virtual bool dustAddedToFee() const = 0;
virtual std::string txKey() const = 0;
virtual TransactionConstructionInfo * constructionData() const = 0;
};
/**
* @brief Transaction-like interface for sending money
*/
@ -101,6 +142,13 @@ struct PendingTransaction
virtual uint64_t txCount() const = 0;
virtual std::vector<uint32_t> subaddrAccount() const = 0;
virtual std::vector<std::set<uint32_t>> subaddrIndices() const = 0;
virtual std::string unsignedTxToBin() const = 0;
virtual std::string unsignedTxToBase64() const = 0;
virtual std::string signedTxToHex(int index) const = 0;
virtual size_t signedTxSize(int index) const = 0;
virtual PendingTransactionInfo * transaction(int index) const = 0;
virtual void refresh() = 0;
virtual std::vector<PendingTransactionInfo*> getAll() const = 0;
/**
* @brief multisigSignData
@ -160,6 +208,9 @@ struct UnsignedTransaction
* return - true on success
*/
virtual bool sign(const std::string &signedFileName) = 0;
virtual void refresh() = 0;
virtual std::vector<TransactionConstructionInfo*> getAll() const = 0;
virtual TransactionConstructionInfo * transaction(int index) const = 0;
};
/**
@ -182,9 +233,11 @@ struct TransactionInfo
virtual int direction() const = 0;
virtual bool isPending() const = 0;
virtual bool isFailed() const = 0;
virtual bool isCoinbase() const = 0;
virtual uint64_t amount() const = 0;
virtual uint64_t fee() const = 0;
virtual uint64_t blockHeight() const = 0;
virtual std::string description() const = 0;
virtual std::set<uint32_t> subaddrIndex() const = 0;
virtual uint32_t subaddrAccount() const = 0;
virtual std::string label() const = 0;
@ -196,6 +249,7 @@ struct TransactionInfo
virtual std::string paymentId() const = 0;
//! only applicable for output transactions
virtual const std::vector<Transfer> & transfers() const = 0;
virtual const std::vector<std::pair<std::string, std::vector<uint64_t>>> & rings() const = 0;
};
/**
* @brief The TransactionHistory - interface for displaying transaction history
@ -208,6 +262,7 @@ struct TransactionHistory
virtual TransactionInfo * transaction(const std::string &id) const = 0;
virtual std::vector<TransactionInfo*> getAll() const = 0;
virtual void refresh() = 0;
virtual void setTxNote(const std::string &txid, const std::string &note) = 0;
};
/**
@ -257,22 +312,66 @@ struct AddressBook
virtual int lookupPaymentID(const std::string &payment_id) const = 0;
};
/**
* @brief The CoinsInfo - interface for displaying coins information
*/
struct CoinsInfo
{
virtual ~CoinsInfo() = 0;
virtual uint64_t blockHeight() const = 0;
virtual std::string hash() const = 0;
virtual size_t internalOutputIndex() const = 0;
virtual uint64_t globalOutputIndex() const = 0;
virtual bool spent() const = 0;
virtual bool frozen() const = 0;
virtual uint64_t spentHeight() const = 0;
virtual uint64_t amount() const = 0;
virtual bool rct() const = 0;
virtual bool keyImageKnown() const = 0;
virtual size_t pkIndex() const = 0;
virtual uint32_t subaddrIndex() const = 0;
virtual uint32_t subaddrAccount() const = 0;
virtual std::string address() const = 0;
virtual std::string addressLabel() const = 0;
virtual std::string keyImage() const = 0;
virtual uint64_t unlockTime() const = 0;
virtual bool unlocked() const = 0;
virtual std::string pubKey() const = 0;
virtual bool coinbase() const = 0;
};
struct Coins
{
virtual ~Coins() = 0;
virtual int count() const = 0;
virtual CoinsInfo * coin(int index) const = 0;
virtual std::vector<CoinsInfo*> getAll() const = 0;
virtual void refresh() = 0;
virtual void setFrozen(int index) = 0;
virtual void thaw(int index) = 0;
virtual bool isTransferUnlocked(uint64_t unlockTime, uint64_t blockHeight) = 0;
};
struct SubaddressRow {
public:
SubaddressRow(std::size_t _rowId, const std::string &_address, const std::string &_label):
SubaddressRow(std::size_t _rowId, const std::string &_address, const std::string &_label, bool _used):
m_rowId(_rowId),
m_address(_address),
m_label(_label) {}
m_label(_label),
m_used(_used) {}
private:
std::size_t m_rowId;
std::string m_address;
std::string m_label;
bool m_used;
public:
std::string extra;
std::string getAddress() const {return m_address;}
std::string getLabel() const {return m_label;}
std::size_t getRowId() const {return m_rowId;}
bool isUsed() const {return m_used;}
};
struct Subaddress
@ -379,7 +478,7 @@ struct WalletListener
/**
* @brief refreshed - called when wallet refreshed by background thread or explicitly refreshed by calling "refresh" synchronously
*/
virtual void refreshed() = 0;
virtual void refreshed(bool success) = 0;
/**
* @brief called by device if the action is required
@ -443,7 +542,7 @@ struct Wallet
};
virtual ~Wallet() = 0;
virtual std::string seed() const = 0;
virtual std::string seed(const std::string& seed_offset = "") const = 0;
virtual std::string getSeedLanguage() const = 0;
virtual void setSeedLanguage(const std::string &arg) = 0;
//! returns wallet status (Status_Ok | Status_Error)
@ -453,9 +552,11 @@ struct Wallet
//! returns both error and error string atomically. suggested to use in instead of status() and errorString()
virtual void statusWithErrorString(int& status, std::string& errorString) const = 0;
virtual bool setPassword(const std::string &password) = 0;
virtual const std::string& getPassword() const = 0;
virtual bool setDevicePin(const std::string &pin) { (void)pin; return false; };
virtual bool setDevicePassphrase(const std::string &passphrase) { (void)passphrase; return false; };
virtual std::string address(uint32_t accountIndex = 0, uint32_t addressIndex = 0) const = 0;
virtual bool subaddressIndex(std::string address, std::pair<uint32_t, uint32_t> &index) const = 0;
std::string mainAddress() const { return address(0, 0); }
virtual std::string path() const = 0;
virtual NetworkType nettype() const = 0;
@ -623,6 +724,12 @@ struct Wallet
*/
virtual bool watchOnly() const = 0;
/**
* @brief isDeterministic - checks if wallet keys are deterministic
* @return - true if deterministic
*/
virtual bool isDeterministic() const = 0;
/**
* @brief blockChainHeight - returns current blockchain height
* @return
@ -859,6 +966,18 @@ struct Wallet
uint32_t subaddr_account = 0,
std::set<uint32_t> subaddr_indices = {}) = 0;
/*!
* \brief createTransactionSingle creates transaction with single input
* \param key_image key image as string
* \param dst_addr destination address as string
* \param priority
* \return PendingTransaction object. caller is responsible to check PendingTransaction::status()
* after object returned
*/
virtual PendingTransaction * createTransactionSingle(const std::string &key_image, const std::string &dst_addr,
size_t outputs = 1, PendingTransaction::Priority = PendingTransaction::Priority_Low) = 0;
/*!
* \brief createSweepUnmixableTransaction creates transaction with unmixable outputs.
* \return PendingTransaction object. caller is responsible to check PendingTransaction::status()
@ -873,7 +992,27 @@ struct Wallet
* after object returned
*/
virtual UnsignedTransaction * loadUnsignedTx(const std::string &unsigned_filename) = 0;
/*!
* \brief loadUnsignedTx - creates transaction from unsigned tx string
* \return - UnsignedTransaction object. caller is responsible to check UnsignedTransaction::status()
* after object returned
*/
virtual UnsignedTransaction * loadUnsignedTxFromStr(const std::string &unsigned_tx) = 0;
/*!
* \brief loadUnsignedTx - creates transaction from unsigned base64 encoded tx string
* \return - UnsignedTransaction object. caller is responsible to check UnsignedTransaction::status()
* after object returned
*/
virtual UnsignedTransaction * loadUnsignedTxFromBase64Str(const std::string &unsigned_tx_base64) = 0;
/*!
* \brief loadSignedTx - creates transaction from signed tx file
* \return - PendingTransaction object.
*/
virtual PendingTransaction * loadSignedTx(const std::string &signed_filename) = 0;
/*!
* \brief submitTransaction - submits transaction in signed tx file
* \return - true on success
@ -898,9 +1037,10 @@ struct Wallet
/*!
* \brief exportKeyImages - exports key images to file
* \param filename
* \param all - export all key images or only those that have not yet been exported
* \return - true on success
*/
virtual bool exportKeyImages(const std::string &filename) = 0;
virtual bool exportKeyImages(const std::string &filename, bool all = false) = 0;
/*!
* \brief importKeyImages - imports key images from file
@ -909,9 +1049,43 @@ struct Wallet
*/
virtual bool importKeyImages(const std::string &filename) = 0;
/*!
* \brief importOutputs - exports outputs to file
* \param filename
* \return - true on success
*/
virtual bool exportOutputs(const std::string &filename, bool all = false) = 0;
/*!
* \brief importOutputs - imports outputs from file
* \param filename
* \return - true on success
*/
virtual bool importOutputs(const std::string &filename) = 0;
virtual bool importTransaction(const std::string &txid, std::vector<uint64_t> &o_indices, uint64_t height, uint8_t block_version, uint64_t ts, bool miner_tx, bool pool, bool double_spend_seen) = 0;
virtual std::string printBlockchain() = 0;
virtual std::string printTransfers() = 0;
virtual std::string printPayments() = 0;
virtual std::string printUnconfirmedPayments() = 0;
virtual std::string printConfirmedTransferDetails() = 0;
virtual std::string printUnconfirmedTransferDetails() = 0;
virtual std::string printPubKeys() = 0;
virtual std::string printTxNotes() = 0;
virtual std::string printSubaddresses() = 0;
virtual std::string printSubaddressLabels() = 0;
virtual std::string printAdditionalTxKeys() = 0;
virtual std::string printAttributes() = 0;
virtual std::string printKeyImages() = 0;
virtual std::string printAccountTags() = 0;
virtual std::string printTxKeys() = 0;
virtual std::string printAddressBook() = 0;
virtual std::string printScannedPoolTxs() = 0;
virtual TransactionHistory * history() = 0;
virtual AddressBook * addressBook() = 0;
virtual Coins * coins() = 0;
virtual Subaddress * subaddress() = 0;
virtual SubaddressAccount * subaddressAccount() = 0;
virtual void setListener(WalletListener *) = 0;
@ -968,7 +1142,8 @@ struct Wallet
/*
* \brief signMessage - sign a message with the spend private key
* \param message - the message to sign (arbitrary byte data)
* \return the signature
* \param address - the address to make the signature with, defaults to primary address (optional)
* \return the signature, empty string if the address is invalid or does not belong to the wallet
*/
virtual std::string signMessage(const std::string &message) = 0;
/*!
@ -996,6 +1171,7 @@ struct Wallet
virtual bool verifyMessageWithPublicKey(const std::string &message, const std::string &publicKey, const std::string &signature) const = 0;
virtual bool parse_uri(const std::string &uri, std::string &address, std::string &payment_id, uint64_t &amount, std::string &tx_description, std::string &recipient_name, std::vector<std::string> &unknown_parameters, std::string &error) = 0;
virtual std::string make_uri(const std::string &address, const std::string &payment_id, uint64_t amount, const std::string &tx_description, const std::string &recipient_name, std::string &error) const = 0;
virtual std::string getDefaultDataDir() const = 0;
@ -1004,6 +1180,12 @@ struct Wallet
* \return true on success
*/
virtual bool rescanSpent() = 0;
/*
* \brief setOffline - toggle set offline on/off
* \param offline - true/false
*/
virtual void setOffline(bool offline) = 0;
//! blackballs a set of outputs
virtual bool blackballOutputs(const std::vector<std::string> &outputs, bool add) = 0;
@ -1162,6 +1344,25 @@ struct WalletManager
return createWalletFromKeys(path, password, language, testnet ? TESTNET : MAINNET, restoreHeight, addressString, viewKeyString, spendKeyString);
}
/*!
* \brief recover deterministic wallet from spend key.
* \param path Name of wallet file to be created
* \param password Password of wallet file
* \param language language
* \param nettype Network type
* \param restoreHeight restore from start height
* \param spendKeyString spend key
* \param kdf_rounds Number of rounds for key derivation function
* \return Wallet instance (Wallet::status() needs to be called to check if recovered successfully)
*/
virtual Wallet * createDeterministicWalletFromSpendKey(const std::string &path,
const std::string &password,
const std::string &language,
NetworkType nettype,
uint64_t restoreHeight,
const std::string &spendKeyString,
uint64_t kdf_rounds = 1) = 0;
/*!
* \deprecated this method creates a wallet WITHOUT a passphrase, use createWalletFromKeys(..., password, ...) instead
* \brief recovers existing wallet using keys. Creates a view only wallet if spend key is omitted

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Loading…
Cancel
Save