Skip to content

Commit 9130639

Browse files
committed
fix(deposit): correct deposit VM derivation for launchpad currencies
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 5560cf5 commit 9130639

File tree

4 files changed

+34
-9
lines changed

4 files changed

+34
-9
lines changed

apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/internal/DepositViewModel.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import kotlin.time.Duration.Companion.seconds
2828
@HiltViewModel
2929
internal class DepositViewModel @Inject constructor(
3030
userManager: UserManager,
31+
tokenController: TokenController,
3132
clipboardManager: ClipboardManager,
3233
resources: ResourceHelper,
3334
) : BaseViewModel2<DepositViewModel.State, DepositViewModel.Event>(
@@ -51,8 +52,30 @@ internal class DepositViewModel @Inject constructor(
5152
init {
5253
eventFlow
5354
.filterIsInstance<Event.OnMintSelected>()
54-
.mapNotNull { userManager.accountCluster?.depositAddressFor(it.mint)?.base58() }
55-
.onEach { address -> dispatchEvent(Event.OnDepositAddressChanged(address)) }
55+
.mapNotNull { tokenController.getTokenMetadata(it.mint) }
56+
.onResult(
57+
onSuccess = { token ->
58+
val address = userManager.accountCluster?.depositAddressFor(token)?.base58()
59+
if (address == null) {
60+
BottomBarManager.showError(
61+
title = resources.getString(R.string.error_title_tokenNotFound),
62+
message = resources.getString(R.string.error_description_tokenNotFound),
63+
) {
64+
dispatchEvent(Event.Exit)
65+
}
66+
return@onResult
67+
}
68+
dispatchEvent(Event.OnDepositAddressChanged(address))
69+
},
70+
onError = {
71+
BottomBarManager.showError(
72+
title = resources.getString(R.string.error_title_tokenNotFound),
73+
message = resources.getString(R.string.error_description_tokenNotFound),
74+
) {
75+
dispatchEvent(Event.Exit)
76+
}
77+
}
78+
)
5679
.launchIn(viewModelScope)
5780

5881
eventFlow

services/opencode/src/main/kotlin/com/getcode/opencode/internal/solana/extensions/PublicKey.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ import com.getcode.solana.keys.PublicKey
1313
import java.io.ByteArrayOutputStream
1414
import java.io.IOException
1515

16-
internal fun PublicKey.Companion.deriveVirtualMachineAccount(mint: PublicKey, lockout: UByte): ProgramDerivedAccount {
16+
internal fun PublicKey.Companion.deriveVirtualMachineAccount(mint: PublicKey, authority: PublicKey, lockout: UByte): ProgramDerivedAccount {
1717
return findProgramAddress(
1818
seeds = listOf(
1919
"code_vm".toByteArray(Charsets.UTF_8),
2020
mint.bytes.toByteArray(),
21-
vmAuthority.bytes.toByteArray(),
21+
authority.bytes.toByteArray(),
2222
byteArrayOf(lockout.toByte())
2323
),
2424
programId = VirtualMachineProgram.address,

services/opencode/src/main/kotlin/com/getcode/opencode/model/accounts/AccountCluster.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class AccountCluster(
2626
get() = timelock.vault.publicKey
2727

2828
val usdcDepositAddress: PublicKey
29-
get() = depositAddressFor(Token.usdc.address)
29+
get() = depositAddressFor(Token.usdc)
3030

31-
fun depositAddressFor(mint: Mint): PublicKey = deriveDepositAddressFor(authorityPublicKey, mint)
31+
fun depositAddressFor(token: Token): PublicKey = deriveDepositAddressFor(authorityPublicKey, token)
3232

3333
fun withTimelockForToken(token: Token): AccountCluster = newInstance(authority, token)
3434

@@ -46,10 +46,11 @@ class AccountCluster(
4646
}
4747
}
4848

49-
private fun deriveDepositAddressFor(depositor: PublicKey, mint: Mint): PublicKey {
49+
private fun deriveDepositAddressFor(depositor: PublicKey, token: Token): PublicKey {
5050
val vmAddress = PublicKey.deriveVirtualMachineAccount(
51-
mint = mint,
52-
lockout = TimelockDerivedAccounts.lockoutInDays.toUByte(),
51+
mint = token.address,
52+
authority = token.vmMetadata.authority,
53+
lockout = token.vmMetadata.lockDurationInDays.toUByte(),
5354
)
5455

5556
return PublicKey.deriveDepositAccount(vmAddress.publicKey, depositor).publicKey

services/opencode/src/main/kotlin/com/getcode/opencode/model/financial/MintMetadata.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ val MintMetadata.Companion.usdc: Token
3737
authority = vmAuthority,
3838
vm = PublicKey.deriveVirtualMachineAccount(
3939
mint = Mint.usdc,
40+
authority = vmAuthority,
4041
lockout = TimelockDerivedAccounts.lockoutInDays.toUByte()
4142
).publicKey,
4243
lockDurationInDays = TimelockDerivedAccounts.lockoutInDays.toInt()

0 commit comments

Comments
 (0)