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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion mobile/src/features/Airdrop/api/redemptionApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,13 @@ export const redemptionApi = {
request: {
changeAddress: request.change_address,
fundingUtxosCount: request.funding_utxos.length,
collateralUtxosCount: request.collateral_utxos.length,
fundingUtxosPreview: request.funding_utxos
.slice(0, 2)
.map((utxo) => `${utxo.substring(0, 32)}...`),
collateralUtxosCount: request.collateral_utxos.length,
collateralUtxosPreview: request.collateral_utxos
.slice(0, 2)
.map((utxo) => `${utxo.substring(0, 32)}...`),
},
})

Expand Down
67 changes: 58 additions & 9 deletions mobile/src/features/Airdrop/common/useRedeemThaw.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import {RawUtxo} from '@yoroi/api'
import {CardanoMobileWrapped} from '@yoroi/cardano-wallet'
import {
CardanoMobileWrapped,
collateralConfig,
utxosMaker,
} from '@yoroi/cardano-wallet'
import type {SelectionStrategy} from '@yoroi/tx'
import {rawUtxoToModernUtxo, selectUtxos} from '@yoroi/tx'
import {Balance} from '@yoroi/types'
Expand Down Expand Up @@ -57,8 +61,8 @@ export const useRedeemThaw = () => {
[primaryTokenId]: '5000000' as Balance.Quantity, // 5 ADA in lovelace
}

const fundingUtxosHex = await CardanoMobileWrapped.cslScope(
async (csl) => {
const {fundingUtxosHex, collateralUtxosHex} =
await CardanoMobileWrapped.cslScope(async (csl) => {
// Convert RawUtxo[] to ModernUtxo[] using current pattern
const rawUtxos = wallet.utxos()

Expand Down Expand Up @@ -91,6 +95,20 @@ export const useRedeemThaw = () => {
throw new Error('No UTXOs available with sufficient funds')
}

// Track which UTXOs were selected for funding (by utxo_id from RawUtxo)
// Match ModernUtxo to RawUtxo by txHash and txIndex
const selectedFundingUtxoIds = new Set<string>()
selection.selected.forEach((modernUtxo) => {
const matchingRawUtxo = rawUtxos.find(
(rawUtxo) =>
rawUtxo.tx_hash === modernUtxo.txHash &&
rawUtxo.tx_index === modernUtxo.txIndex,
)
if (matchingRawUtxo) {
selectedFundingUtxoIds.add(matchingRawUtxo.utxo_id)
}
})

// Convert ModernUtxo to hex strings using toTransactionUnspentOutput
const utxoHexStrings = await Promise.all(
selection.selected.map(async (utxo) => {
Expand All @@ -99,18 +117,49 @@ export const useRedeemThaw = () => {
}),
)

return utxoHexStrings
},
)
// Find collateral candidates (pure ADA, <= 5 ADA)
const utxosList = utxosMaker(rawUtxos, collateralConfig)
const collateralCandidates = utxosList.findCollateralCandidates()

// Filter out UTXOs already selected for funding
const availableCollateral = collateralCandidates.filter(
(utxo: RawUtxo) => !selectedFundingUtxoIds.has(utxo.utxo_id),
)

// Convert the first available collateral UTXO to hex format
let collateralUtxosHex: string[] = []
if (availableCollateral.length > 0) {
const collateralUtxo = availableCollateral[0]!
// Find the corresponding ModernUtxo to convert it
const collateralModernUtxo = modernUtxos.find(
(utxo) =>
utxo.txHash === collateralUtxo.tx_hash &&
utxo.txIndex === collateralUtxo.tx_index,
)

if (collateralModernUtxo) {
const cslUtxo =
collateralModernUtxo.toTransactionUnspentOutput(csl)
collateralUtxosHex = [
Buffer.from(cslUtxo.toBytes()).toString('hex'),
]
}
}

return {
fundingUtxosHex: utxoHexStrings,
collateralUtxosHex,
}
})

// Get change address
const changeAddress = wallet.getChangeAddress('multiple')
// Get change address (respects wallet's address mode - single uses first address, multiple uses unused address)
const changeAddress = wallet.getChangeAddress(meta.addressMode)

// Build transaction request
const buildRequest: BuildTransactionRequest = {
change_address: changeAddress,
funding_utxos: fundingUtxosHex,
collateral_utxos: [],
collateral_utxos: collateralUtxosHex,
}

logger.info(
Expand Down
Loading