Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

getTokenAccountsByOwner #187

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package net.avianlabs.solana.client

import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import net.avianlabs.solana.tweetnacl.ed25519.PublicKey

internal class PublicKeyBase58Serializer : KSerializer<PublicKey> {

private val delegateSerializer = String.serializer()

override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("PublicKey", PrimitiveKind.STRING)

override fun serialize(encoder: Encoder, value: PublicKey) = with(encoder) {
encodeSerializableValue(delegateSerializer, value.toBase58())
}

override fun deserialize(decoder: Decoder): PublicKey = PublicKey.fromBase58(
decoder.decodeSerializableValue(delegateSerializer),
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package net.avianlabs.solana.methods

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.add
import kotlinx.serialization.json.addJsonObject
import kotlinx.serialization.json.buildJsonArray
import kotlinx.serialization.json.put
import net.avianlabs.solana.SolanaClient
import net.avianlabs.solana.client.PublicKeyBase58Serializer
import net.avianlabs.solana.client.Response
import net.avianlabs.solana.client.Response.RPC
import net.avianlabs.solana.domain.core.Commitment
import net.avianlabs.solana.tweetnacl.ed25519.PublicKey

/**
* Returns all SPL Token accounts by the given owner.
*
* @param account The account to query for token accounts.
* @param mint The mint to filter token accounts by.
* @param commitment The block commitment to query.
*/
public suspend fun SolanaClient.getTokenAccountsByOwnerAndMint(
account: PublicKey,
mint: PublicKey,
commitment: Commitment? = null,
): Response<RPC<List<TokenAccountsInfo>>> = getTokenAccountsByOwner(
account = account,
mint = mint,
programId = null,
commitment = commitment,
)

/**
* Returns all SPL Token accounts by the given owner.
*
* @param account The account to query for token accounts.
* @param programId The program ID to filter token accounts by.
* @param commitment The block commitment to query.
*/
public suspend fun SolanaClient.getTokenAccountsByOwnerAndProgramId(
account: PublicKey,
programId: PublicKey,
commitment: Commitment? = null,
): Response<RPC<List<TokenAccountsInfo>>> = getTokenAccountsByOwner(
account = account,
mint = null,
programId = programId,
commitment = commitment,
)

private suspend fun SolanaClient.getTokenAccountsByOwner(
account: PublicKey,
mint: PublicKey?,
programId: PublicKey?,
commitment: Commitment? = null,
): Response<RPC<List<TokenAccountsInfo>>> = invoke(
method = "getTokenAccountsByOwner",
params = buildJsonArray {
add(account.toBase58())
addJsonObject {
mint?.let { put("mint", mint.toBase58()) }
programId?.let { put("programId", programId.toBase58()) }
}
addJsonObject {
put("encoding", "jsonParsed")
commitment?.let {
put("commitment", it.value)
}
}
}
)

@Serializable
public data class TokenAccountsInfo(
@Serializable(with = PublicKeyBase58Serializer::class)
public val pubkey: PublicKey,
public val account: Account,
) {

@Serializable
public data class Account(
public val data: Data,
public val executable: Boolean,
@Serializable(with = PublicKeyBase58Serializer::class)
public val owner: PublicKey,
public val rentEpoch: ULong,
public val space: Long,
)

@Serializable
public data class Data(
public val parsed: Parsed,
public val program: String,
public val space: Long,
)

@Serializable
public data class Parsed(
public val info: Info,
public val type: String,
)

@Serializable
public data class Info(
public val isNative: Boolean,
@Serializable(with = PublicKeyBase58Serializer::class)
public val mint: PublicKey,
@Serializable(with = PublicKeyBase58Serializer::class)
public val owner: PublicKey,
public val state: String,
public val tokenAmount: TokenAmount,
)

@Serializable
public data class TokenAmount(
public val amount: String,
public val decimals: Int,
public val uiAmount: Double,
public val uiAmountString: String,
)
}
Loading