Multiplatform Web3 Library
This library is still under development. The library is functional and being used downstream by the likes of SolanaKMP. Breaking changes may will be added leading up to a v1.0 API. You have been warned.
// Solana Memo Program
val account = SolanaPublicKey(keyPair.publicKey)
val memoProgramId = SolanaPublicKey.from("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr")
val memoInstruction = TransactionInstruction(
memoProgramId,
listOf(AccountMeta(account, true, true)),
"hello world ".encodeToByteArray()
)
// Build Message
val blockhash = Blockhash(getRecentBlockhash())
val message = Message.Builder()
.addInstruction(memoInstruction)
.setRecentBlockhash(blockhash)
.build()
using Diglol Crypto library for ED25519 signing:
// prepare signer
val keyPair = Ed25519.generateKeyPair()
val signer = object : Ed25519Signer() {
override val publicKey: ByteArray get() = keyPair.publicKey
override suspend fun signPayload(payload: ByteArray): ByteArray = Ed25519.sign(keyPair, payload)
}
// Sign Message
val signature = signer.signPayload(message.serialize())
// Build Transaction
val transaction = Transaction(listOf(signature), message)
Using Base58 encoding from MultiMult and Solana RPC driver from RpcCore
// serialize transaction
val transactionBytes = transaction.serialize()
val encodedTransaction = Base58.encodeToString(transactionBytes)
// setup RPC driver
val rpcUrl = "https://api.endpoint.com"
val rpcDriver = Rpc20Driver(rpcUrl, MyNetworkDriver())
class SendTransactionRequest(encodedTransaction: String, requestId: String)
: JsonRpc20Request(
method = "sendTransaction",
params = buildJsonArray {
add(encodedTransaction)
},
requestId
)
// build rpc request
val requestId = 1
val rpcRequest = SendTransactionRequest(encodedTransaction, requestId)
// send the request and get response
// using JsonElement.serializer() will return the JSON RPC response. you can use your own serializer to get back a specific object
val rpcResponse = rpcDriver.makeRequest(rpcRequest, JsonElement.serializer())
// gather public keys
val mint = SolanaPublicKey(/* public key of the token mint you want to transfer */)
val senderPublicKey = SolanaPublicKey(/* sender's public key */)
val receiverPublicKey = SolanaPublicKey(/* receiver's public key */)
// calculate ATAs for sender and receiver
// Note: these accounts must already exist
val senderTokenAccount = = SolanaPublicKey(ProgramDerivedAddress.find(
listOf(senderPublicKey.bytes, TokenProgram.PROGRAM_ID.bytes, mint.bytes),
AssociatedTokenProgram.PROGRAM_ID
).getOrThrow().bytes)
val receiverTokenAccount = = SolanaPublicKey(ProgramDerivedAddress.find(
listOf(receiverPublicKey.bytes, TokenProgram.PROGRAM_ID.bytes, mint.bytes),
AssociatedTokenProgram.PROGRAM_ID
).getOrThrow().bytes)
val transferMessage = Message.Builder()
.setRecentBlockhash(recentBlockhash)
.addInstruction(TokenProgram.transferChecked(
senderTokenAccount,
receiverTokenAccount,
10_000_000, // amount to transfer
6, // decimals
senderPublicKey,
mint
))
.build()
val signature = ... // sign transaction using web3-core Signer or other mechanism
val transferTransaction = Transaction(listOf(signature), transferMessage.serialize())
// Send transaction to cluster (using rpc-solana here)
rpc.sendAndConfirmTransaction(
transferTransaction,
TransactionOptions(commitment = Commitment.CONFIRMED)
)