From 09eb2d6aba3d712c5acab6f6d4ad2e306f16e255 Mon Sep 17 00:00:00 2001 From: Guillermo Orellana Date: Fri, 8 Nov 2024 16:55:08 +0100 Subject: [PATCH] pr comments --- .../avianlabs/solana/domain/core/Message.kt | 6 +-- .../solana/domain/core/SerializeMessage.kt | 10 ++--- .../solana/domain/core/SignedTransaction.kt | 37 +++++++++++++++---- .../solana/domain/core/Transaction.kt | 13 +++++++ ...hortvecEncoding.kt => ShortVecEncoding.kt} | 2 +- .../solana/vendor/ShortvecEncodingTest.kt | 18 ++++----- 6 files changed, 60 insertions(+), 26 deletions(-) rename solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/{ShortvecEncoding.kt => ShortVecEncoding.kt} (95%) diff --git a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Message.kt b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Message.kt index d1772d6..3cd3613 100644 --- a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Message.kt +++ b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Message.kt @@ -2,16 +2,14 @@ package net.avianlabs.solana.domain.core import net.avianlabs.solana.tweetnacl.ed25519.PublicKey -public class Message internal constructor( +@ConsistentCopyVisibility +public data class Message private constructor( public val feePayer: PublicKey?, public val recentBlockHash: String?, public val accountKeys: List, public val instructions: List, ) { - override fun toString(): String = - "Message(feePayer=$feePayer, recentBlockHash=$recentBlockHash, accountKeys=$accountKeys, instructions=$instructions)" - public fun newBuilder(): Builder = Builder( feePayer = feePayer, recentBlockHash = recentBlockHash, diff --git a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SerializeMessage.kt b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SerializeMessage.kt index 85e0de2..eec8ed0 100644 --- a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SerializeMessage.kt +++ b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SerializeMessage.kt @@ -3,8 +3,8 @@ package net.avianlabs.solana.domain.core import net.avianlabs.solana.tweetnacl.TweetNaCl import net.avianlabs.solana.tweetnacl.ed25519.PublicKey import net.avianlabs.solana.tweetnacl.vendor.decodeBase58 +import net.avianlabs.solana.vendor.ShortVecEncoding import net.avianlabs.solana.vendor.ShortVecLength -import net.avianlabs.solana.vendor.ShortvecEncoding import okio.Buffer private const val RECENT_BLOCK_HASH_LENGTH = 32 @@ -72,7 +72,7 @@ public fun Message.serialize(): ByteArray { require(instructions.isNotEmpty()) { "No instructions provided" } val keysList = compileAccountKeys(feePayer) val accountKeysSize = keysList.size - val accountAddressesLength = ShortvecEncoding.encodeLength(accountKeysSize) + val accountAddressesLength = ShortVecEncoding.encodeLength(accountKeysSize) val compiledInstructions = instructions.map { instruction -> val keysSize = instruction.keys.size val keyIndices = ByteArray(keysSize) @@ -81,14 +81,14 @@ public fun Message.serialize(): ByteArray { } CompiledInstruction( programIdIndex = keysList.findAccountIndex(instruction.programId).toByte(), - keyIndicesLength = ShortvecEncoding.encodeLength(keysSize), + keyIndicesLength = ShortVecEncoding.encodeLength(keysSize), keyIndices = keyIndices, - dataLength = ShortvecEncoding.encodeLength(instruction.data.count()), + dataLength = ShortVecEncoding.encodeLength(instruction.data.count()), data = instruction.data, ) } val accountsKeyBufferSize = accountKeysSize * TweetNaCl.Signature.PUBLIC_KEY_BYTES - val instructionsLength = ShortvecEncoding.encodeLength(compiledInstructions.size) + val instructionsLength = ShortVecEncoding.encodeLength(compiledInstructions.size) val compiledInstructionsBytes = compiledInstructions.sumOf { it.bytes } val bufferSize = (Header.HEADER_LENGTH + RECENT_BLOCK_HASH_LENGTH + accountAddressesLength.size diff --git a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SignedTransaction.kt b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SignedTransaction.kt index ddd9d7b..3b38936 100644 --- a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SignedTransaction.kt +++ b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/SignedTransaction.kt @@ -4,12 +4,13 @@ import io.github.oshai.kotlinlogging.KotlinLogging import net.avianlabs.solana.tweetnacl.TweetNaCl import net.avianlabs.solana.tweetnacl.vendor.decodeBase58 import net.avianlabs.solana.tweetnacl.vendor.encodeToBase58String -import net.avianlabs.solana.vendor.ShortvecEncoding +import net.avianlabs.solana.vendor.ShortVecEncoding import okio.Buffer private val logger = KotlinLogging.logger {} -public class SignedTransaction( +@ConsistentCopyVisibility +public data class SignedTransaction internal constructor( public val originalMessage: Message, public val signedMessage: ByteArray, public val signatures: List, @@ -28,16 +29,38 @@ public class SignedTransaction( } } + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other == null || this::class != other::class) return false + if (!super.equals(other)) return false + + other as SignedTransaction + + if (originalMessage != other.originalMessage) return false + if (!signedMessage.contentEquals(other.signedMessage)) return false + if (signatures != other.signatures) return false + + return true + } + + override fun hashCode(): Int { + var result = super.hashCode() + result = 31 * result + originalMessage.hashCode() + result = 31 * result + signedMessage.contentHashCode() + result = 31 * result + signatures.hashCode() + return result + } + override fun toString(): String = "SignedTransaction(message=${originalMessage}, signatures=$signatures)" public fun serialize(): ByteArray { val signaturesSize = signatures.size - val signaturesLength = ShortvecEncoding.encodeLength(signaturesSize) + val signaturesLength = ShortVecEncoding.encodeLength(signaturesSize) val bufferSize = signaturesLength.size + - signaturesSize * TweetNaCl.Signature.SIGNATURE_BYTES + - signedMessage.size + signaturesSize * TweetNaCl.Signature.SIGNATURE_BYTES + + signedMessage.size val out = Buffer() out.write(signaturesLength) for (signature in signatures) { @@ -52,10 +75,10 @@ public class SignedTransaction( val message = signedMessage val messageLength = message.size val signaturesSize = signatures.size - val signaturesLength = ShortvecEncoding.encodeLength(signaturesSize) + val signaturesLength = ShortVecEncoding.encodeLength(signaturesSize) val signaturesSizeBytes = signaturesLength.size val signatureSize = TweetNaCl.Signature.SIGNATURE_BYTES - val signatureSizeBytes = ShortvecEncoding.encodeLength(signatureSize) + val signatureSizeBytes = ShortVecEncoding.encodeLength(signatureSize) val signatureSizeBytesLength = signatureSizeBytes.size val expectedSize = messageLength + signaturesSizeBytes + signaturesSize * (signatureSize + signatureSizeBytesLength) diff --git a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Transaction.kt b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Transaction.kt index 0688b43..c2b98ab 100644 --- a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Transaction.kt +++ b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/domain/core/Transaction.kt @@ -42,6 +42,19 @@ public open class Transaction internal constructor( ) } + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other == null || this::class != other::class) return false + + other as Transaction + + return message == other.message + } + + override fun hashCode(): Int { + return message.hashCode() + } + override fun toString(): String = "Transaction(message=$message)" public class Builder internal constructor( diff --git a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/ShortvecEncoding.kt b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/ShortVecEncoding.kt similarity index 95% rename from solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/ShortvecEncoding.kt rename to solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/ShortVecEncoding.kt index 427463b..625eba5 100644 --- a/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/ShortvecEncoding.kt +++ b/solana-kotlin/src/commonMain/kotlin/net/avianlabs/solana/vendor/ShortVecEncoding.kt @@ -5,7 +5,7 @@ import kotlin.experimental.and internal typealias ShortVecLength = ByteArray -internal object ShortvecEncoding { +internal object ShortVecEncoding { internal fun encodeLength(len: Int): ShortVecLength { val buffer = Buffer() var length = len diff --git a/solana-kotlin/src/commonTest/kotlin/net/avianlabs/solana/vendor/ShortvecEncodingTest.kt b/solana-kotlin/src/commonTest/kotlin/net/avianlabs/solana/vendor/ShortvecEncodingTest.kt index 49da154..b843ca2 100644 --- a/solana-kotlin/src/commonTest/kotlin/net/avianlabs/solana/vendor/ShortvecEncodingTest.kt +++ b/solana-kotlin/src/commonTest/kotlin/net/avianlabs/solana/vendor/ShortvecEncodingTest.kt @@ -8,39 +8,39 @@ class ShortvecEncodingTest { fun encodeLength() { assertContentEquals( byteArrayOf(0) /* [0] */, - ShortvecEncoding.encodeLength(0) + ShortVecEncoding.encodeLength(0) ) assertContentEquals( byteArrayOf(1) /* [1] */, - ShortvecEncoding.encodeLength(1) + ShortVecEncoding.encodeLength(1) ) assertContentEquals( byteArrayOf(5) /* [5] */, - ShortvecEncoding.encodeLength(5) + ShortVecEncoding.encodeLength(5) ) assertContentEquals( byteArrayOf(127)/* [0x7f] */, - ShortvecEncoding.encodeLength(127) // 0x7f + ShortVecEncoding.encodeLength(127) // 0x7f ) assertContentEquals( byteArrayOf(-128, 1) /* [0x80, 0x01] */, - ShortvecEncoding.encodeLength(128) // 0x80 + ShortVecEncoding.encodeLength(128) // 0x80 ) assertContentEquals( byteArrayOf(-1, 1) /* [0xff, 0x01] */, - ShortvecEncoding.encodeLength(255) // 0xff + ShortVecEncoding.encodeLength(255) // 0xff ) assertContentEquals( byteArrayOf(-128, 2)/* [0x80, 0x02] */, - ShortvecEncoding.encodeLength(256) // 0x100 + ShortVecEncoding.encodeLength(256) // 0x100 ) assertContentEquals( byteArrayOf(-1, -1, 1)/* [0xff, 0xff, 0x01] */, - ShortvecEncoding.encodeLength(32767) // 0x7fff + ShortVecEncoding.encodeLength(32767) // 0x7fff ) assertContentEquals( byteArrayOf(-128, -128, -128, 1)/* [0x80, 0x80, 0x80, 0x01] */, - ShortvecEncoding.encodeLength(2097152) // 0x200000 + ShortVecEncoding.encodeLength(2097152) // 0x200000 ) } }