Skip to content

Commit ababae2

Browse files
authored
Solana 2.0 Update (#74)
* new branch w/refactor * use solanakt master branch snapshot * update with solana kt sockets/remove moshi branch * fix up issues from auction house merge, remove deprecations * switch to solana 2.0 release
1 parent 6c5fb1d commit ababae2

60 files changed

Lines changed: 494 additions & 1624 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ dependencies {
6363
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0'
6464

6565
// SolanaKT
66-
implementation 'com.github.metaplex-foundation:SolanaKT:1.1.5'
66+
implementation 'com.github.metaplex-foundation:SolanaKT:2.0.0'
6767

6868
// Moshi
6969
implementation "com.squareup.moshi:moshi:1.13.0"

lib/src/main/java/com/metaplex/lib/Metaplex.kt

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ import com.metaplex.lib.modules.nfts.NftClient
88
import com.metaplex.lib.drivers.solana.Connection
99
import com.metaplex.lib.modules.candymachines.CandyMachineClient
1010
import com.metaplex.lib.modules.candymachinesv2.CandyMachineV2Client
11-
import com.solana.core.PublicKey
12-
import com.solana.models.buffer.BufferInfo
13-
import com.solana.vendor.borshj.BorshCodable
1411

1512
class Metaplex(val connection: Connection,
1613
private var identityDriver: IdentityDriver,
@@ -35,20 +32,4 @@ class Metaplex(val connection: Connection,
3532
this.storageDriver = storageDriver
3633
return this.storageDriver
3734
}
38-
39-
@Deprecated(ASYNC_CALLBACK_DEPRECATION_MESSAGE, ReplaceWith("connection.getAccountInfo(account)"))
40-
fun <T: BorshCodable> getAccountInfo(account: PublicKey,
41-
decodeTo: Class<T>,
42-
onComplete: ((Result<BufferInfo<T>>) -> Unit)){
43-
this.connection.getAccountInfo(account, decodeTo, onComplete)
44-
}
45-
46-
@Deprecated(ASYNC_CALLBACK_DEPRECATION_MESSAGE, ReplaceWith("connection.getMultipleAccountsInfo(accounts)"))
47-
fun <T: BorshCodable> getMultipleAccountsInfo(
48-
accounts: List<PublicKey>,
49-
decodeTo: Class<T>,
50-
onComplete: ((Result<List<BufferInfo<T>?>>) -> Unit)
51-
) {
52-
this.connection.getMultipleAccountsInfo(accounts, decodeTo, onComplete)
53-
}
5435
}

lib/src/main/java/com/metaplex/lib/drivers/solana/AccountResponse.kt

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@
88
package com.metaplex.lib.drivers.solana
99

1010
import com.metaplex.lib.serialization.serializers.base64.BorshAsBase64JsonArraySerializer
11-
import com.metaplex.lib.serialization.serializers.solana.AnchorAccountSerializer
1211
import com.metaplex.lib.serialization.serializers.solana.PublicKeyAs32ByteSerializer
1312
import com.metaplex.lib.serialization.serializers.solana.SolanaResponseSerializer
1413
import com.solana.core.PublicKey
15-
import com.solana.models.buffer.Buffer
16-
import com.solana.models.buffer.BufferInfo
17-
import com.solana.vendor.borshj.BorshCodable
1814
import kotlinx.serialization.KSerializer
1915
import kotlinx.serialization.SerialName
2016
import kotlinx.serialization.Serializable
@@ -25,28 +21,17 @@ import kotlinx.serialization.builtins.nullable
2521
data class AccountInfo<D>(val data: D?, val executable: Boolean,
2622
val lamports: Long, val owner: String?, val rentEpoch: Long)
2723

28-
internal fun <D, T: BorshCodable> AccountInfo<D>.toBufferInfo() =
29-
BufferInfo(data?.let { Buffer(data as T) }, executable, lamports, owner, rentEpoch)
30-
3124
@Serializable
3225
data class AccountInfoWithPublicKey<P>(val account: AccountInfo<P>, @SerialName("pubkey") val publicKey: String)
3326

3427
@Serializable
3528
data class AccountPublicKey(@Serializable(with = PublicKeyAs32ByteSerializer::class) val publicKey: PublicKey)
3629

3730
internal fun <A> SolanaAccountSerializer(serializer: KSerializer<A>) =
38-
AccountInfoSerializer(
39-
BorshAsBase64JsonArraySerializer(
40-
AnchorAccountSerializer(serializer.descriptor.serialName, serializer)
41-
)
42-
)
31+
AccountInfoSerializer(BorshAsBase64JsonArraySerializer(serializer))
4332

4433
internal fun <A> MultipleAccountsSerializer(serializer: KSerializer<A>) =
45-
MultipleAccountsInfoSerializer(
46-
BorshAsBase64JsonArraySerializer(
47-
AnchorAccountSerializer(serializer.descriptor.serialName, serializer)
48-
)
49-
)
34+
MultipleAccountsInfoSerializer(BorshAsBase64JsonArraySerializer(serializer))
5035

5136
internal fun <A> ProgramAccountsSerializer(serializer: KSerializer<A>) =
5237
ListSerializer(
@@ -55,12 +40,6 @@ internal fun <A> ProgramAccountsSerializer(serializer: KSerializer<A>) =
5540
).nullable
5641
)
5742

58-
internal inline fun <reified A> SolanaAccountSerializer() =
59-
AccountInfoSerializer<A?>(BorshAsBase64JsonArraySerializer(AnchorAccountSerializer()))
60-
61-
internal inline fun <reified A> MultipleAccountsSerializer() =
62-
MultipleAccountsInfoSerializer<A?>(BorshAsBase64JsonArraySerializer(AnchorAccountSerializer()))
63-
6443
private fun <D> AccountInfoSerializer(serializer: KSerializer<D>) =
6544
SolanaResponseSerializer(AccountInfo.serializer(serializer))
6645

lib/src/main/java/com/metaplex/lib/drivers/solana/Connection.kt

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@
88
package com.metaplex.lib.drivers.solana
99

1010
import android.util.Base64
11-
import com.metaplex.lib.ASYNC_CALLBACK_DEPRECATION_MESSAGE
1211
import com.metaplex.lib.drivers.rpc.RpcRequest
1312
import com.solana.core.PublicKey
1413
import com.solana.core.Transaction
15-
import com.solana.models.ProgramAccount
1614
import com.solana.models.ProgramAccountConfig
1715
import com.solana.models.SignatureStatusRequestConfiguration
18-
import com.solana.models.buffer.BufferInfo
19-
import com.solana.vendor.borshj.BorshCodable
2016
import kotlinx.serialization.KSerializer
2117
import kotlinx.serialization.builtins.serializer
2218
import kotlinx.serialization.serializer
@@ -47,37 +43,6 @@ interface Connection {
4743
suspend fun getSignatureStatuses(signatures: List<String>,
4844
configs: SignatureStatusRequestConfiguration?)
4945
: Result<List<SignatureStatus>>
50-
51-
//region DEPRECATED METHODS
52-
@Deprecated(ASYNC_CALLBACK_DEPRECATION_MESSAGE,
53-
ReplaceWith("getAccountInfo(serializer, account)"))
54-
fun <T: BorshCodable> getAccountInfo(account: PublicKey,
55-
decodeTo: Class<T>,
56-
onComplete: ((Result<BufferInfo<T>>) -> Unit))
57-
58-
59-
@Deprecated(ASYNC_CALLBACK_DEPRECATION_MESSAGE,
60-
ReplaceWith("getMultipleAccountsInfo(serializer, accounts)"))
61-
fun <T: BorshCodable> getMultipleAccountsInfo(
62-
accounts: List<PublicKey>,
63-
decodeTo: Class<T>,
64-
onComplete: ((Result<List<BufferInfo<T>?>>) -> Unit)
65-
)
66-
67-
@Deprecated(ASYNC_CALLBACK_DEPRECATION_MESSAGE,
68-
ReplaceWith("getProgramAccounts(serializer, account, programAccountConfig)"))
69-
fun <T: BorshCodable> getProgramAccounts(account: PublicKey,
70-
programAccountConfig: ProgramAccountConfig,
71-
decodeTo: Class<T>,
72-
onComplete: (Result<List<ProgramAccount<T>>>) -> Unit
73-
)
74-
75-
@Deprecated(ASYNC_CALLBACK_DEPRECATION_MESSAGE,
76-
ReplaceWith("getSignatureStatuses(signatures, configs)"))
77-
fun getSignatureStatuses(signatures: List<String>,
78-
configs: SignatureStatusRequestConfiguration?,
79-
onComplete: ((Result<com.solana.models.SignatureStatus>) -> Unit))
80-
//endregion
8146
}
8247

8348
//region ERRORS

lib/src/main/java/com/metaplex/lib/drivers/solana/SolanaConnectionDriver.kt

Lines changed: 8 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,14 @@ package com.metaplex.lib.drivers.solana
1010
import com.metaplex.lib.drivers.rpc.JdkRpcDriver
1111
import com.metaplex.lib.drivers.rpc.JsonRpcDriver
1212
import com.metaplex.lib.drivers.rpc.RpcRequest
13-
import com.metaplex.lib.serialization.serializers.legacy.BorshCodeableSerializer
14-
import com.metaplex.lib.programs.token_metadata.MasterEditionAccountJsonAdapterFactory
15-
import com.metaplex.lib.programs.token_metadata.MasterEditionAccountRule
16-
import com.metaplex.lib.programs.token_metadata.accounts.*
17-
import com.metaplex.lib.shared.AccountPublicKeyJsonAdapterFactory
18-
import com.metaplex.lib.shared.AccountPublicKeyRule
19-
import com.solana.api.Api
13+
import com.solana.api.getAccountInfo
2014
import com.solana.core.PublicKey
2115
import com.solana.models.ProgramAccountConfig
2216
import com.solana.models.SignatureStatusRequestConfiguration
23-
import com.solana.models.buffer.BufferInfo
24-
import com.solana.networking.NetworkingRouter
25-
import com.solana.networking.NetworkingRouterConfig
26-
import com.solana.networking.RPCEndpoint
27-
import com.solana.vendor.borshj.BorshCodable
28-
import kotlinx.coroutines.CoroutineScope
17+
import com.solana.networking.*
2918
import kotlinx.coroutines.Dispatchers
30-
import kotlinx.coroutines.launch
3119
import kotlinx.serialization.KSerializer
20+
import kotlinx.serialization.json.JsonElement
3221

3322
/**
3423
* [Connection] implementation that wraps the legacy async-callback API into the
@@ -39,39 +28,14 @@ import kotlinx.serialization.KSerializer
3928
*
4029
* @author Funkatronics
4130
*/
42-
class SolanaConnectionDriver(private val rpcService: JsonRpcDriver,
43-
override val transactionOptions: TransactionOptions = TransactionOptions()
44-
)
45-
: Connection {
46-
47-
private var endpoint: RPCEndpoint = RPCEndpoint.mainnetBetaSolana
31+
class SolanaConnectionDriver(
32+
private val rpcService: JsonRpcDriver,
33+
override val transactionOptions: TransactionOptions = TransactionOptions()
34+
) : Connection {
4835

4936
@JvmOverloads
5037
constructor(endpoint: RPCEndpoint, rpcService: JsonRpcDriver = JdkRpcDriver(endpoint.url))
51-
: this(rpcService) { this.endpoint = endpoint }
52-
53-
// Some things are still using this, so need to keep a reference to it here
54-
@Deprecated("Deprecated, use an RPC Driver implementation instead")
55-
val solanaRPC: Api = Api(
56-
NetworkingRouter(endpoint,
57-
config = NetworkingRouterConfig(
58-
listOf(
59-
MetadataAccountRule(),
60-
MetaplexDataRule(),
61-
MetaplexCollectionRule(),
62-
AccountPublicKeyRule(),
63-
MasterEditionAccountRule(),
64-
MetaplexCreatorRule()
65-
),
66-
listOf(
67-
MetadataAccountJsonAdapterFactory(),
68-
MetaplexDataAdapterJsonAdapterFactory(),
69-
AccountPublicKeyJsonAdapterFactory(),
70-
MasterEditionAccountJsonAdapterFactory()
71-
)
72-
)
73-
)
74-
)
38+
: this(rpcService)
7539

7640
//region CONNECTION
7741
override suspend fun <R> get(request: RpcRequest, serializer: KSerializer<R>): Result<R> =
@@ -146,56 +110,4 @@ class SolanaConnectionDriver(private val rpcService: JsonRpcDriver,
146110
else result as Result<List<SignatureStatus>> // safe cast, null case handled above
147111
}
148112
//endregion
149-
150-
//region DEPRECATED METHODS
151-
override fun <T: BorshCodable> getAccountInfo(
152-
account: PublicKey,
153-
decodeTo: Class<T>,
154-
onComplete: (Result<BufferInfo<T>>) -> Unit
155-
) {
156-
CoroutineScope(Dispatchers.IO).launch {
157-
onComplete(getAccountInfo(BorshCodeableSerializer(decodeTo), account)
158-
.map { it.toBufferInfo() })
159-
}
160-
}
161-
162-
override fun <T : BorshCodable> getMultipleAccountsInfo(
163-
accounts: List<PublicKey>,
164-
decodeTo: Class<T>,
165-
onComplete: (Result<List<BufferInfo<T>?>>) -> Unit
166-
) {
167-
CoroutineScope(Dispatchers.IO).launch {
168-
onComplete(getMultipleAccountsInfo(BorshCodeableSerializer(decodeTo), accounts)
169-
.map { it.map { it?.toBufferInfo() } })
170-
}
171-
}
172-
173-
override fun <T : BorshCodable> getProgramAccounts(
174-
account: PublicKey,
175-
programAccountConfig: ProgramAccountConfig,
176-
decodeTo: Class<T>,
177-
onComplete: (Result<List<com.solana.models.ProgramAccount<T>>>) -> Unit) {
178-
CoroutineScope(Dispatchers.IO).launch {
179-
onComplete(getProgramAccounts(BorshCodeableSerializer(decodeTo), account, programAccountConfig)
180-
.map { it.map {
181-
com.solana.models.ProgramAccount(it.account.toBufferInfo(), it.publicKey)
182-
} })
183-
}
184-
}
185-
186-
override fun getSignatureStatuses(signatures: List<String>,
187-
configs: SignatureStatusRequestConfiguration?,
188-
onComplete: ((Result<com.solana.models.SignatureStatus>) -> Unit)) {
189-
CoroutineScope(Dispatchers.IO).launch {
190-
onComplete(getSignatureStatuses(signatures, configs).map {
191-
com.solana.models.SignatureStatus(it.map { sigStatus ->
192-
com.solana.models.SignatureStatus.Value(
193-
sigStatus.slot, sigStatus.confirmations,
194-
sigStatus.err, sigStatus.confirmationStatus
195-
)
196-
})
197-
})
198-
}
199-
}
200-
//endregion
201113
}

lib/src/main/java/com/metaplex/lib/experimental/jen/candymachine/Instructions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ object CandyMachineInstructions {
6060
AccountMeta(collectionAuthorityRecord, false, true),
6161
AccountMeta(tokenMetadataProgram, false, false),
6262
AccountMeta(systemProgram, false, false),
63-
AccountMeta(Sysvar.SYSVAR_RENT_ADDRESS, false, false)
63+
AccountMeta(Sysvar.SYSVAR_RENT_PUBKEY, false, false)
6464
),
6565
Borsh.encodeToByteArray(
6666
AnchorInstructionSerializer("initialize"),
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Connection+Extensions
3+
* Metaplex
4+
*
5+
* Created by Funkatronics on 10/19/2022
6+
*/
7+
8+
package com.metaplex.lib.extensions
9+
10+
import com.metaplex.lib.drivers.solana.Connection
11+
import com.metaplex.lib.drivers.solana.TransactionOptions
12+
import kotlinx.coroutines.isActive
13+
import kotlinx.coroutines.withTimeout
14+
15+
suspend fun Result<String>.confirmTransaction(
16+
connection: Connection, transactionOptions: TransactionOptions = connection.transactionOptions
17+
): Result<String> = withTimeout(transactionOptions.timeout.toMillis()) {
18+
19+
suspend fun confirmationStatus() =
20+
connection.getSignatureStatuses(listOf(getOrThrow()), null)
21+
.getOrNull()?.first()?.confirmationStatus
22+
23+
// wait for desired transaction status
24+
while(confirmationStatus() != transactionOptions.commitment.toString()) {
25+
26+
// wait a bit before retrying
27+
val millis = System.currentTimeMillis()
28+
var inc = 0
29+
while(System.currentTimeMillis() - millis < 300 && isActive) { inc++ }
30+
31+
if (!isActive) break // breakout after timeout
32+
}
33+
34+
this@confirmTransaction // return result
35+
}

0 commit comments

Comments
 (0)