Skip to content

Commit 14c5508

Browse files
committed
Wrong information fixed
1 parent 534b147 commit 14c5508

File tree

2 files changed

+223
-2
lines changed

2 files changed

+223
-2
lines changed

app/src/main/cpp/monerujo.cpp

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,6 +1562,228 @@ Java_com_m2049r_xmrwallet_model_Wallet_addSubaddress(JNIEnv *env, jobject instan
15621562
}
15631563
}
15641564

1565+
// Add these multisig functions to monerujo.cpp following the existing pattern
1566+
// Corrected based on actual wallet2_api.h interface from Monero v0.18+
1567+
1568+
/**********************************/
1569+
/********* Multisig Support *******/
1570+
/**********************************/
1571+
1572+
// Check if wallet is multisig
1573+
JNIEXPORT jboolean JNICALL
1574+
Java_com_m2049r_xmrwallet_model_Wallet_isMultisig(JNIEnv *env, jobject instance) {
1575+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1576+
if (wallet == nullptr) {
1577+
return JNI_FALSE;
1578+
}
1579+
return static_cast<jboolean>(wallet->multisig().isMultisig);
1580+
}
1581+
1582+
// Get multisig info string for wallet setup
1583+
JNIEXPORT jstring JNICALL
1584+
Java_com_m2049r_xmrwallet_model_Wallet_getMultisigInfo(JNIEnv *env, jobject instance) {
1585+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1586+
if (wallet == nullptr) {
1587+
return env->NewStringUTF("");
1588+
}
1589+
std::string multisigInfo = wallet->getMultisigInfo();
1590+
return env->NewStringUTF(multisigInfo.c_str());
1591+
}
1592+
1593+
// Make multisig wallet from collected info
1594+
JNIEXPORT jstring JNICALL
1595+
Java_com_m2049r_xmrwallet_model_Wallet_makeMultisig(JNIEnv *env, jobject instance,
1596+
jobject multisigInfoList, jint threshold) {
1597+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1598+
if (wallet == nullptr || multisigInfoList == nullptr) {
1599+
return env->NewStringUTF("");
1600+
}
1601+
1602+
std::vector<std::string> info = java2cpp(env, multisigInfoList);
1603+
if (info.empty()) {
1604+
return env->NewStringUTF("");
1605+
}
1606+
1607+
std::string result = wallet->makeMultisig(info, (uint32_t) threshold);
1608+
return env->NewStringUTF(result.c_str());
1609+
}
1610+
1611+
// Exchange multisig keys for M/N wallets (additional rounds for complex schemes)
1612+
JNIEXPORT jstring JNICALL
1613+
Java_com_m2049r_xmrwallet_model_Wallet_exchangeMultisigKeys(JNIEnv *env, jobject instance,
1614+
jobject multisigInfoList,
1615+
jboolean forceUpdateUseWithCaution) {
1616+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1617+
if (wallet == nullptr || multisigInfoList == nullptr) {
1618+
return env->NewStringUTF("");
1619+
}
1620+
1621+
std::vector<std::string> info = java2cpp(env, multisigInfoList);
1622+
if (info.empty()) {
1623+
return env->NewStringUTF("");
1624+
}
1625+
1626+
std::string result = wallet->exchangeMultisigKeys(info, forceUpdateUseWithCaution);
1627+
return env->NewStringUTF(result.c_str());
1628+
}
1629+
1630+
// Export multisig images (key images) for wallet synchronization
1631+
// Note: exportMultisigImages takes a reference parameter and returns bool
1632+
JNIEXPORT jstring JNICALL
1633+
Java_com_m2049r_xmrwallet_model_Wallet_exportMultisigImages(JNIEnv *env, jobject instance) {
1634+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1635+
if (wallet == nullptr) {
1636+
return env->NewStringUTF("");
1637+
}
1638+
1639+
std::string images;
1640+
bool success = wallet->exportMultisigImages(images);
1641+
if (!success) {
1642+
LOGE("exportMultisigImages failed: %s", wallet->errorString().c_str());
1643+
return env->NewStringUTF("");
1644+
}
1645+
1646+
return env->NewStringUTF(images.c_str());
1647+
}
1648+
1649+
// Import multisig images from other participants for wallet synchronization
1650+
JNIEXPORT jint JNICALL
1651+
Java_com_m2049r_xmrwallet_model_Wallet_importMultisigImages(JNIEnv *env, jobject instance,
1652+
jobject multisigImagesList) {
1653+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1654+
if (wallet == nullptr || multisigImagesList == nullptr) {
1655+
return 0;
1656+
}
1657+
1658+
std::vector<std::string> images = java2cpp(env, multisigImagesList);
1659+
if (images.empty()) {
1660+
return 0;
1661+
}
1662+
1663+
size_t imported = wallet->importMultisigImages(images);
1664+
return static_cast<jint>(imported);
1665+
}
1666+
1667+
// Restore a multisig transaction from exported data
1668+
// Returns a PendingTransaction handle that can be signed
1669+
JNIEXPORT jlong JNICALL
1670+
Java_com_m2049r_xmrwallet_model_Wallet_restoreMultisigTransaction(JNIEnv *env, jobject instance,
1671+
jstring txData) {
1672+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1673+
if (wallet == nullptr || txData == nullptr) {
1674+
return 0;
1675+
}
1676+
1677+
JNIStringGuard _txData(env, txData);
1678+
if (!_txData.isValid()) {
1679+
return 0;
1680+
}
1681+
1682+
Monero::PendingTransaction *tx = wallet->restoreMultisigTransaction(_txData.get());
1683+
return reinterpret_cast<jlong>(tx);
1684+
}
1685+
1686+
// Get multisig state information as a structured object
1687+
JNIEXPORT jobject JNICALL
1688+
Java_com_m2049r_xmrwallet_model_Wallet_getMultisigState(JNIEnv *env, jobject instance) {
1689+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1690+
if (wallet == nullptr) {
1691+
return nullptr;
1692+
}
1693+
1694+
Monero::MultisigState state = wallet->multisig();
1695+
1696+
// Create a Java object to return the multisig state
1697+
// Requires a corresponding Java class: com.m2049r.xmrwallet.model.MultisigState
1698+
// Constructor signature: (ZIII)V for (boolean isMultisig, int isReady, int threshold, int total)
1699+
jclass multisigStateClass = env->FindClass("com/m2049r/xmrwallet/model/MultisigState");
1700+
if (multisigStateClass == nullptr) {
1701+
return nullptr;
1702+
}
1703+
1704+
jmethodID constructor = env->GetMethodID(multisigStateClass, "<init>", "(ZIII)V");
1705+
if (constructor == nullptr) {
1706+
return nullptr;
1707+
}
1708+
1709+
jobject stateObject = env->NewObject(multisigStateClass, constructor,
1710+
static_cast<jboolean>(state.isMultisig),
1711+
static_cast<jint>(state.isReady),
1712+
static_cast<jint>(state.threshold),
1713+
static_cast<jint>(state.total));
1714+
1715+
return stateObject;
1716+
}
1717+
1718+
// Get the number of required signatures (threshold) for the multisig wallet
1719+
JNIEXPORT jint JNICALL
1720+
Java_com_m2049r_xmrwallet_model_Wallet_multisigThreshold(JNIEnv *env, jobject instance) {
1721+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1722+
if (wallet == nullptr) {
1723+
return 0;
1724+
}
1725+
return static_cast<jint>(wallet->multisig().threshold);
1726+
}
1727+
1728+
// Check if multisig wallet is ready for creating/signing transactions
1729+
JNIEXPORT jboolean JNICALL
1730+
Java_com_m2049r_xmrwallet_model_Wallet_isMultisigReady(JNIEnv *env, jobject instance) {
1731+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1732+
if (wallet == nullptr) {
1733+
return JNI_FALSE;
1734+
}
1735+
return static_cast<jboolean>(wallet->multisig().isReady);
1736+
}
1737+
1738+
// Get total number of multisig participants
1739+
JNIEXPORT jint JNICALL
1740+
Java_com_m2049r_xmrwallet_model_Wallet_multisigTotal(JNIEnv *env, jobject instance) {
1741+
Monero::Wallet *wallet = getHandle<Monero::Wallet>(env, instance);
1742+
if (wallet == nullptr) {
1743+
return 0;
1744+
}
1745+
return static_cast<jint>(wallet->multisig().total);
1746+
}
1747+
1748+
/**********************************/
1749+
/** PendingTransaction Multisig ***/
1750+
/**********************************/
1751+
1752+
// Export multisig sign data from a pending transaction
1753+
// This data is shared with other signers so they can sign the transaction
1754+
JNIEXPORT jstring JNICALL
1755+
Java_com_m2049r_xmrwallet_model_PendingTransaction_multisigSignData(JNIEnv *env, jobject instance) {
1756+
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
1757+
if (tx == nullptr) {
1758+
return env->NewStringUTF("");
1759+
}
1760+
1761+
std::string signData = tx->multisigSignData();
1762+
return env->NewStringUTF(signData.c_str());
1763+
}
1764+
1765+
// Sign a multisig transaction
1766+
// Note: This method returns void - it modifies the transaction in place
1767+
JNIEXPORT void JNICALL
1768+
Java_com_m2049r_xmrwallet_model_PendingTransaction_signMultisigTx(JNIEnv *env, jobject instance) {
1769+
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
1770+
if (tx != nullptr) {
1771+
tx->signMultisigTx();
1772+
}
1773+
}
1774+
1775+
// Get the list of public keys of signers who have already signed this transaction
1776+
JNIEXPORT jobject JNICALL
1777+
Java_com_m2049r_xmrwallet_model_PendingTransaction_getSignersKeys(JNIEnv *env, jobject instance) {
1778+
Monero::PendingTransaction *tx = getHandle<Monero::PendingTransaction>(env, instance);
1779+
if (tx == nullptr) {
1780+
return cpp2java(env, std::vector<std::string>());
1781+
}
1782+
1783+
std::vector<std::string> signers = tx->signersKeys();
1784+
return cpp2java(env, signers);
1785+
}
1786+
15651787
// TransactionHistory
15661788
JNIEXPORT jint JNICALL
15671789
Java_com_m2049r_xmrwallet_model_TransactionHistory_getCount(JNIEnv *env, jobject instance) {

external-libs/BUILD_INSTRUCTIONS.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ cp -r output/arm64-v8a your-app/src/main/cpp/libs/
168168
### What Happens During Build
169169

170170
1. **Docker Image Creation**
171-
- Pulls base Ubuntu 20.04 image
172-
- Installs Android NDK r23c
171+
- Installs Android NDK r29
173172
- Sets up build dependencies
174173
- Configures toolchain for target architecture
175174

0 commit comments

Comments
 (0)