55 "crypto/sha256"
66 "database/sql"
77 "fmt"
8- "strconv "
8+ "slices "
99 "time"
1010
1111 "github.com/mr-tron/base58"
@@ -18,14 +18,12 @@ import (
1818 "github.com/code-payments/code-server/pkg/code/data/nonce"
1919 "github.com/code-payments/code-server/pkg/code/data/swap"
2020 "github.com/code-payments/code-server/pkg/code/data/transaction"
21- "github.com/code-payments/code-server/pkg/solana "
21+ transaction_util "github.com/code-payments/code-server/pkg/code/transaction "
2222)
2323
2424func (p * service ) validateSwapState (record * swap.Record , states ... swap.State ) error {
25- for _ , validState := range states {
26- if record .State == validState {
27- return nil
28- }
25+ if slices .Contains (states , record .State ) {
26+ return nil
2927 }
3028 return errors .New ("invalid swap state" )
3129}
@@ -41,35 +39,56 @@ func (p *service) markSwapFunded(ctx context.Context, record *swap.Record) error
4139}
4240
4341func (p * service ) markSwapFinalized (ctx context.Context , record * swap.Record ) error {
44- err := p .validateSwapState (record , swap .StateSubmitting )
45- if err != nil {
46- return err
47- }
42+ return p .data .ExecuteInTx (ctx , sql .LevelDefault , func (ctx context.Context ) error {
43+ err := p .validateSwapState (record , swap .StateSubmitting )
44+ if err != nil {
45+ return err
46+ }
4847
49- err = p .markNonceReleasedDueToSubmittedTransaction (ctx , record )
50- if err != nil {
51- return err
52- }
48+ err = p .markNonceReleasedDueToSubmittedTransaction (ctx , record )
49+ if err != nil {
50+ return err
51+ }
5352
54- record .TransactionBlob = nil
55- record .State = swap .StateFinalized
56- return p .data .SaveSwap (ctx , record )
53+ record .TransactionBlob = nil
54+ record .State = swap .StateFinalized
55+ return p .data .SaveSwap (ctx , record )
56+ })
5757}
5858
5959func (p * service ) markSwapFailed (ctx context.Context , record * swap.Record ) error {
60- err := p .validateSwapState (record , swap .StateSubmitting )
61- if err != nil {
62- return err
63- }
60+ return p .data .ExecuteInTx (ctx , sql .LevelDefault , func (ctx context.Context ) error {
61+ err := p .validateSwapState (record , swap .StateSubmitting )
62+ if err != nil {
63+ return err
64+ }
6465
65- err = p .markNonceReleasedDueToSubmittedTransaction (ctx , record )
66- if err != nil {
67- return err
68- }
66+ err = p .markNonceReleasedDueToSubmittedTransaction (ctx , record )
67+ if err != nil {
68+ return err
69+ }
6970
70- record .TransactionBlob = nil
71- record .State = swap .StateFailed
72- return p .data .SaveSwap (ctx , record )
71+ record .TransactionBlob = nil
72+ record .State = swap .StateFailed
73+ return p .data .SaveSwap (ctx , record )
74+ })
75+ }
76+
77+ func (p * service ) markSwapCancelled (ctx context.Context , record * swap.Record ) error {
78+ return p .data .ExecuteInTx (ctx , sql .LevelDefault , func (ctx context.Context ) error {
79+ err := p .validateSwapState (record , swap .StateCreated )
80+ if err != nil {
81+ return err
82+ }
83+
84+ err = p .markNonceAvailableDueToCancelledSwap (ctx , record )
85+ if err != nil {
86+ return err
87+ }
88+
89+ record .State = swap .StateCancelled
90+ return p .data .SaveSwap (ctx , record )
91+ })
7392}
7493
7594// todo: commonalities between this and geyser external deposit logic
@@ -99,7 +118,7 @@ func (p *service) updateBalances(ctx context.Context, record *swap.Record) error
99118 return err
100119 }
101120
102- deltaQuarksIntoOmnibus , err := getDeltaQuarksFromTokenBalances (destinationVmConfig .Omnibus , tokenBalances )
121+ deltaQuarksIntoOmnibus , err := transaction_util . GetDeltaQuarksFromTokenBalances (destinationVmConfig .Omnibus , tokenBalances )
103122 if err != nil {
104123 return err
105124 }
@@ -207,29 +226,32 @@ func (p *service) markNonceReleasedDueToSubmittedTransaction(ctx context.Context
207226 return p .data .SaveNonce (ctx , nonceRecord )
208227}
209228
210- func getDeltaQuarksFromTokenBalances (tokenAccount * common.Account , tokenBalances * solana.TransactionTokenBalances ) (int64 , error ) {
211- var preQuarkBalance , postQuarkBalance int64
212- var err error
213- for _ , tokenBalance := range tokenBalances .PreTokenBalances {
214- if tokenBalances .Accounts [tokenBalance .AccountIndex ] == tokenAccount .PublicKey ().ToBase58 () {
215- preQuarkBalance , err = strconv .ParseInt (tokenBalance .TokenAmount .Amount , 10 , 64 )
216- if err != nil {
217- return 0 , errors .Wrap (err , "error parsing pre token balance" )
218- }
219- break
220- }
229+ func (p * service ) markNonceAvailableDueToCancelledSwap (ctx context.Context , record * swap.Record ) error {
230+ err := p .validateSwapState (record , swap .StateCreated )
231+ if err != nil {
232+ return err
221233 }
222- for _ , tokenBalance := range tokenBalances .PostTokenBalances {
223- if tokenBalances .Accounts [tokenBalance .AccountIndex ] == tokenAccount .PublicKey ().ToBase58 () {
224- postQuarkBalance , err = strconv .ParseInt (tokenBalance .TokenAmount .Amount , 10 , 64 )
225- if err != nil {
226- return 0 , errors .Wrap (err , "error parsing post token balance" )
227- }
228- break
229- }
234+
235+ nonceRecord , err := p .data .GetNonce (ctx , record .Nonce )
236+ if err != nil {
237+ return err
238+ }
239+
240+ if record .ProofSignature != nonceRecord .Signature {
241+ return errors .New ("unexpected nonce signature" )
242+ }
243+
244+ if record .Blockhash != nonceRecord .Blockhash {
245+ return errors .New ("unexpected nonce blockhash" )
246+ }
247+
248+ if nonceRecord .State != nonce .StateReserved {
249+ return errors .New ("unexpected nonce state" )
230250 }
231251
232- return postQuarkBalance - preQuarkBalance , nil
252+ nonceRecord .State = nonce .StateAvailable
253+ nonceRecord .Signature = ""
254+ return p .data .SaveNonce (ctx , nonceRecord )
233255}
234256
235257func getSwapDepositIntentID (signature string , destination * common.Account ) string {
0 commit comments