11package com.getcode.opencode.internal.network.executors
22
33import com.codeinc.opencode.gen.transaction.v1.TransactionService
4- import com.getcode.ed25519.Ed25519.KeyPair
54import com.getcode.opencode.internal.bidi.BidirectionalStreamReference
65import com.getcode.opencode.internal.bidi.openBidirectionalStreamForResult
76import com.getcode.opencode.internal.network.api.TransactionApi
8- import com.getcode.opencode.internal.network.extensions.asSignature
9- import com.getcode.opencode.internal.network.extensions.asSolanaAccountId
10- import com.getcode.opencode.internal.network.extensions.sign
7+ import com.getcode.opencode.internal.network.api.intents.IntentStatelessSwap
118import com.getcode.opencode.internal.network.extensions.toCode
129import com.getcode.opencode.internal.network.extensions.toProps
1310import com.getcode.opencode.internal.network.extensions.toSignature
14- import com.getcode.opencode.model.core.errors.SwapError
1511import com.getcode.opencode.model.core.errors.SubmitIntentError
12+ import com.getcode.opencode.model.core.errors.SwapError
13+ import com.getcode.opencode.model.transactions.StatelessSwapRequest
1614import com.getcode.opencode.model.transactions.StatelessSwapResult
17- import com.getcode.opencode.model.transactions.StatelessSwapServerParameters
1815import com.getcode.opencode.model.transactions.StatelessSwapSuccess
19- import com.getcode.opencode.solana.SolanaTransaction
2016import com.getcode.services.opencode.BuildConfig
21- import com.getcode.solana.keys.Mint
22- import com.getcode.solana.keys.Signature
23- import com.getcode.solana.keys.base58
2417import com.getcode.utils.TraceType
2518import com.getcode.utils.trace
2619import kotlinx.coroutines.CoroutineScope
@@ -40,29 +33,18 @@ internal class StatelessSwapExecutor(
4033
4134 suspend fun execute (
4235 scope : CoroutineScope ,
43- owner : KeyPair ,
44- fromMint : Mint ,
45- toMint : Mint ,
46- amount : Long ,
47- waitForFinalization : Boolean = false,
48- buildAndSign : (StatelessSwapServerParameters ) -> Pair <SolanaTransaction , List <Signature >>,
36+ request : StatelessSwapRequest ,
4937 ): StatelessSwapResult = suspendCancellableCoroutine { cont ->
5038 trace(tag = TAG , message = " Opening stateless swap stream" )
5139
5240 val streamReference = StatelessSwapStreamReference (scope, " stateless-swap" )
5341 streamReference.retain()
5442
43+ val intent = IntentStatelessSwap (request = request)
44+
5545 scope.launch {
5646 try {
57- val result = openStream(
58- streamRef = streamReference,
59- owner = owner,
60- fromMint = fromMint,
61- toMint = toMint,
62- amount = amount,
63- waitForFinalization = waitForFinalization,
64- buildAndSign = buildAndSign,
65- )
47+ val result = openStream(streamReference, intent)
6648 cont.resume(result)
6749 } catch (e: Exception ) {
6850 trace(tag = TAG , message = " Failed to open stateless swap stream." , error = e)
@@ -89,24 +71,17 @@ internal class StatelessSwapExecutor(
8971
9072 private suspend fun openStream (
9173 streamRef : StatelessSwapStreamReference ,
92- owner : KeyPair ,
93- fromMint : Mint ,
94- toMint : Mint ,
95- amount : Long ,
96- waitForFinalization : Boolean ,
97- buildAndSign : (StatelessSwapServerParameters ) -> Pair <SolanaTransaction , List <Signature >>,
74+ intent : IntentStatelessSwap ,
9875 ): StatelessSwapResult = openBidirectionalStreamForResult(
9976 streamRef = streamRef,
10077 apiCall = api::statelessSwap,
101- initialRequest = {
102- buildInitiateRequest(owner, fromMint, toMint, amount, waitForFinalization)
103- },
78+ initialRequest = { intent.initiate() },
10479 responseHandler = { response, onResult, requestChannel ->
10580 when (response.responseCase) {
10681 TransactionService .StatelessSwapResponse .ResponseCase .SERVER_PARAMETERS -> {
10782 handleServerParameters(
83+ intent = intent,
10884 serverParameters = response.serverParameters,
109- buildAndSign = buildAndSign,
11085 onResult = onResult,
11186 requestChannel = requestChannel,
11287 )
@@ -142,34 +117,9 @@ internal class StatelessSwapExecutor(
142117 )
143118}
144119
145- private fun buildInitiateRequest (
146- owner : KeyPair ,
147- fromMint : Mint ,
148- toMint : Mint ,
149- amount : Long ,
150- waitForFinalization : Boolean ,
151- ): TransactionService .StatelessSwapRequest {
152- val initiate = TransactionService .StatelessSwapRequest .Initiate .newBuilder()
153- .setOwner(owner.asSolanaAccountId())
154- .setStablecoin(
155- TransactionService .StatelessSwapRequest .Initiate .CoinbaseStableSwapperClientParameters .newBuilder()
156- .setFromMint(fromMint.asSolanaAccountId())
157- .setToMint(toMint.asSolanaAccountId())
158- .setSwapAmount(amount)
159- .build()
160- )
161- .setWaitForFinalization(waitForFinalization)
162- .apply { setSignature(sign(owner)) }
163- .build()
164-
165- return TransactionService .StatelessSwapRequest .newBuilder()
166- .setInitiate(initiate)
167- .build()
168- }
169-
170120private fun handleServerParameters (
121+ intent : IntentStatelessSwap ,
171122 serverParameters : TransactionService .StatelessSwapResponse .ServerParameters ? ,
172- buildAndSign : (StatelessSwapServerParameters ) -> Pair <SolanaTransaction , List <Signature >>,
173123 requestChannel : (TransactionService .StatelessSwapRequest ) -> Unit ,
174124 onResult : (StatelessSwapResult ) -> Unit ,
175125) {
@@ -188,17 +138,8 @@ private fun handleServerParameters(
188138
189139 trace(tag = TAG , message = " Received server parameters. Building transaction and submitting signatures..." )
190140
191- val (_, signatures) = buildAndSign(params)
192-
193- val submitSignatures = TransactionService .StatelessSwapRequest .SubmitSignatures .newBuilder()
194- .addAllTransactionSignatures(signatures.map { it.asSignature() })
195- .build()
196-
197- requestChannel(
198- TransactionService .StatelessSwapRequest .newBuilder()
199- .setSubmitSignatures(submitSignatures)
200- .build()
201- )
141+ intent.parameters = params
142+ requestChannel(intent.requestToSubmitSignatures())
202143 } catch (e: Exception ) {
203144 if (BuildConfig .DEBUG ) e.printStackTrace()
204145 onResult(Result .failure(SwapError .Other (cause = e)))
0 commit comments