Expose shielding threshold in `Synchronizer.proposeShielding`

`Synchronizer.shieldFunds` is not altered because it is deprecated.
This commit is contained in:
Jack Grigg 2024-02-27 19:00:06 +00:00 committed by Honza
parent d2fa400531
commit e36bbdec7a
16 changed files with 39 additions and 12 deletions

View File

@ -30,6 +30,7 @@ interface Backend {
suspend fun proposeShielding(
account: Int,
shieldingThreshold: Long,
memo: ByteArray? = byteArrayOf()
): ProposalUnsafe

View File

@ -307,6 +307,7 @@ class RustBackend private constructor(
override suspend fun proposeShielding(
account: Int,
shieldingThreshold: Long,
memo: ByteArray?
): ProposalUnsafe {
return withContext(SdkDispatchers.DATABASE_IO) {
@ -314,6 +315,7 @@ class RustBackend private constructor(
proposeShielding(
dataDbFile.absolutePath,
account,
shieldingThreshold,
memo ?: ByteArray(0),
networkId = networkId,
useZip317Fees = IS_USE_ZIP_317_FEES
@ -584,6 +586,7 @@ class RustBackend private constructor(
private external fun proposeShielding(
dbDataPath: String,
account: Int,
shieldingThreshold: Long,
memo: ByteArray,
networkId: Int,
useZip317Fees: Boolean

View File

@ -1480,6 +1480,7 @@ pub extern "C" fn Java_cash_z_ecc_android_sdk_internal_jni_RustBackend_proposeSh
_: JClass<'local>,
db_data: JString<'local>,
account: jint,
shielding_threshold: jlong,
memo: JByteArray<'local>,
network_id: jint,
use_zip317_fees: jboolean,
@ -1489,6 +1490,8 @@ pub extern "C" fn Java_cash_z_ecc_android_sdk_internal_jni_RustBackend_proposeSh
let network = parse_network(network_id as u32)?;
let mut db_data = wallet_db(env, network, db_data)?;
let account = account_id_from_jint(account)?;
let shielding_threshold = NonNegativeAmount::from_nonnegative_i64(shielding_threshold)
.map_err(|()| format_err!("Invalid shielding threshold, out of range"))?;
let memo_bytes = env.convert_byte_array(memo).unwrap();
let min_confirmations = 0;
@ -1520,8 +1523,6 @@ pub extern "C" fn Java_cash_z_ecc_android_sdk_internal_jni_RustBackend_proposeSh
let input_selector = zip317_helper(Some(MemoBytes::from(&memo)), use_zip317_fees);
let shielding_threshold = NonNegativeAmount::from_u64(100000).unwrap();
let proposal = propose_shielding::<_, _, _, Infallible>(
&mut db_data,
&network,

View File

@ -130,7 +130,7 @@ class TestWallet(
synchronizer.getTransparentBalance(transparentAddress).let { walletBalance ->
if (walletBalance.value > 0L) {
synchronizer.createProposedTransactions(
synchronizer.proposeShielding(shieldedSpendingKey.account),
synchronizer.proposeShielding(shieldedSpendingKey.account, Zatoshi(100000)),
shieldedSpendingKey
)
}

View File

@ -47,6 +47,7 @@ class GetBalanceFragment : BaseDemoFragment<FragmentGetBalanceBinding>() {
reportTraceEvent(SyncBlockchainBenchmarkTrace.Event.BALANCE_SCREEN_END)
}
@Suppress("MagicNumber")
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
@ -68,7 +69,7 @@ class GetBalanceFragment : BaseDemoFragment<FragmentGetBalanceBinding>() {
)
sharedViewModel.synchronizerFlow.value?.let { synchronizer ->
synchronizer.createProposedTransactions(
synchronizer.proposeShielding(usk.account),
synchronizer.proposeShielding(usk.account, Zatoshi(100000)),
usk
)
}

View File

@ -217,6 +217,7 @@ class WalletViewModel(application: Application) : AndroidViewModel(application)
*
* Observe the result via [sendState].
*/
@Suppress("MagicNumber")
fun shieldFunds() {
if (sendState.value is SendState.Sending) {
return
@ -230,7 +231,7 @@ class WalletViewModel(application: Application) : AndroidViewModel(application)
val spendingKey = spendingKey.filterNotNull().first()
kotlin.runCatching {
synchronizer.createProposedTransactions(
synchronizer.proposeShielding(spendingKey.account),
synchronizer.proposeShielding(spendingKey.account, Zatoshi(100000)),
spendingKey
)
}

View File

@ -132,7 +132,10 @@ class TestWallet(
Twig.debug { "FOUND utxo balance of total: $walletBalance" }
if (walletBalance.value > 0L) {
synchronizer.createProposedTransactions(synchronizer.proposeShielding(spendingKey.account), spendingKey)
synchronizer.createProposedTransactions(
synchronizer.proposeShielding(spendingKey.account, Zatoshi(100000)),
spendingKey
)
}
}

View File

@ -88,6 +88,7 @@ internal class FakeRustBackend(
override suspend fun proposeShielding(
account: Int,
shieldingThreshold: Long,
memo: ByteArray?
): ProposalUnsafe {
TODO("Not yet implemented")

View File

@ -569,8 +569,9 @@ class SdkSynchronizer private constructor(
@Throws(TransactionEncoderException::class)
override suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: String
): Proposal = txManager.proposeShielding(account, memo)
): Proposal = txManager.proposeShielding(account, shieldingThreshold, memo)
@Throws(TransactionEncoderException::class)
override suspend fun createProposedTransactions(
@ -635,7 +636,7 @@ class SdkSynchronizer private constructor(
message = "Upcoming SDK 2.1 will create multiple transactions at once for some recipients.",
replaceWith =
ReplaceWith(
"createProposedTransactions(proposeShielding(usk.account, memo), usk)"
"createProposedTransactions(proposeShielding(usk.account, shieldingThreshold, memo), usk)"
)
)
@Throws(TransactionEncoderException::class, TransactionSubmitException::class)

View File

@ -190,10 +190,13 @@ interface Synchronizer {
* Creates a proposal for shielding any transparent funds received by the given account.
*
* @param account the account for which to shield funds.
* @param shieldingThreshold the minimum transparent balance required before a
* proposal will be created.
* @param memo the optional memo to include as part of the proposal's transactions.
*/
suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: String = ZcashSdk.DEFAULT_SHIELD_FUNDS_MEMO_PREFIX
): Proposal
@ -244,7 +247,7 @@ interface Synchronizer {
message = "Upcoming SDK 2.1 will create multiple transactions at once for some recipients.",
replaceWith =
ReplaceWith(
"createProposedTransactions(proposeShielding(usk.account, memo), usk)"
"createProposedTransactions(proposeShielding(usk.account, shieldingThreshold, memo), usk)"
)
)
suspend fun shieldFunds(

View File

@ -34,6 +34,7 @@ internal interface TypesafeBackend {
suspend fun proposeShielding(
account: Account,
shieldingThreshold: Long,
memo: ByteArray? = byteArrayOf()
): Proposal

View File

@ -53,11 +53,13 @@ internal class TypesafeBackendImpl(private val backend: Backend) : TypesafeBacke
override suspend fun proposeShielding(
account: Account,
shieldingThreshold: Long,
memo: ByteArray?
): Proposal =
Proposal.fromUnsafe(
backend.proposeShielding(
account.value,
shieldingThreshold,
memo
)
)

View File

@ -56,10 +56,13 @@ internal interface OutboundTransactionManager {
* Creates a proposal for shielding any transparent funds received by the given account.
*
* @param account the account for which to shield funds.
* @param shieldingThreshold the minimum transparent balance required before a
* proposal will be created.
* @param memo the optional memo to include as part of the proposal's transactions.
*/
suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: String
): Proposal

View File

@ -52,8 +52,9 @@ internal class OutboundTransactionManagerImpl(
override suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: String
): Proposal = encoder.proposeShielding(account, memo.toByteArray())
): Proposal = encoder.proposeShielding(account, shieldingThreshold, memo.toByteArray())
override suspend fun createProposedTransactions(
proposal: Proposal,

View File

@ -61,10 +61,13 @@ internal interface TransactionEncoder {
* Creates a proposal for shielding any transparent funds sent to the given account.
*
* @param account the account for which to shield funds.
* @param shieldingThreshold the minimum transparent balance required before a
* proposal will be created.
* @param memo the optional memo to include as part of the proposal's transactions.
*/
suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: ByteArray? = byteArrayOf()
): Proposal

View File

@ -96,11 +96,12 @@ internal class TransactionEncoderImpl(
override suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: ByteArray?
): Proposal {
@Suppress("TooGenericExceptionCaught")
return try {
backend.proposeShielding(account, memo)
backend.proposeShielding(account, shieldingThreshold.value, memo)
} catch (t: Throwable) {
// TODO [#680]: if this error matches: Insufficient balance (have 0, need 1000 including fee)
// then consider custom error that says no UTXOs existed to shield
@ -229,6 +230,7 @@ internal class TransactionEncoderImpl(
}
}
@Suppress("MagicNumber")
private suspend fun createShieldingSpend(
usk: UnifiedSpendingKey,
memo: ByteArray? = byteArrayOf()
@ -237,7 +239,7 @@ internal class TransactionEncoderImpl(
return try {
saplingParamTool.ensureParams(saplingParamTool.properties.paramsDirectory)
Twig.debug { "params exist! attempting to shield..." }
val proposal = backend.proposeShielding(usk.account, memo)
val proposal = backend.proposeShielding(usk.account, 100000, memo)
backend.createProposedTransaction(proposal, usk)
} catch (t: Throwable) {
// TODO [#680]: if this error matches: Insufficient balance (have 0, need 1000 including fee)