4
4
"errors"
5
5
"fmt"
6
6
"sync"
7
- "sync/atomic"
8
7
9
8
"github.com/aptos-labs/aptos-go-sdk/api"
10
9
)
@@ -51,25 +50,6 @@ type WorkerPoolConfig struct {
51
50
SubmissionBuffer uint32
52
51
}
53
52
54
- type SequenceNumberTracker struct {
55
- SequenceNumber atomic.Uint64
56
- }
57
-
58
- func (snt * SequenceNumberTracker ) Increment () uint64 {
59
- for {
60
- seqNumber := snt .SequenceNumber .Load ()
61
- next := seqNumber + 1
62
- ok := snt .SequenceNumber .CompareAndSwap (seqNumber , next )
63
- if ok {
64
- return seqNumber
65
- }
66
- }
67
- }
68
-
69
- func (snt * SequenceNumberTracker ) Update (next uint64 ) uint64 {
70
- return snt .SequenceNumber .Swap (next )
71
- }
72
-
73
53
// BuildTransactions start a goroutine to process [TransactionPayload] and spit out [RawTransactionImpl].
74
54
func (client * Client ) BuildTransactions (sender AccountAddress , payloads chan TransactionBuildPayload , responses chan TransactionBuildResponse , setSequenceNumber chan uint64 , options ... any ) {
75
55
client .nodeClient .BuildTransactions (sender , payloads , responses , setSequenceNumber , options ... )
@@ -78,20 +58,18 @@ func (client *Client) BuildTransactions(sender AccountAddress, payloads chan Tra
78
58
// BuildTransactions start a goroutine to process [TransactionPayload] and spit out [RawTransactionImpl].
79
59
func (rc * NodeClient ) BuildTransactions (sender AccountAddress , payloads chan TransactionBuildPayload , responses chan TransactionBuildResponse , setSequenceNumber chan uint64 , options ... any ) {
80
60
// Initialize state
61
+ defer close (responses )
81
62
account , err := rc .Account (sender )
82
63
if err != nil {
83
64
responses <- TransactionBuildResponse {Err : err }
84
- close (responses )
85
65
return
86
66
}
87
67
sequenceNumber , err := account .SequenceNumber ()
88
68
if err != nil {
89
69
responses <- TransactionBuildResponse {Err : err }
90
- close (responses )
91
70
return
92
71
}
93
- snt := & SequenceNumberTracker {}
94
- snt .SequenceNumber .Store (sequenceNumber )
72
+ snt := sequenceNumber
95
73
optionsLast := len (options )
96
74
options = append (options , SequenceNumber (0 ))
97
75
@@ -100,22 +78,21 @@ func (rc *NodeClient) BuildTransactions(sender AccountAddress, payloads chan Tra
100
78
case payload , ok := <- payloads :
101
79
// End if it's not closed
102
80
if ! ok {
103
- close (responses )
104
81
return
105
82
}
106
83
switch payload .Type {
107
84
case TransactionSubmissionTypeSingle :
108
- curSequenceNumber := snt . Increment ( )
109
- options [ optionsLast ] = SequenceNumber ( curSequenceNumber )
85
+ options [ optionsLast ] = SequenceNumber ( snt )
86
+ snt ++
110
87
txnResponse , err := rc .BuildTransaction (sender , payload .Inner , options ... )
111
88
if err != nil {
112
89
responses <- TransactionBuildResponse {Err : err }
113
90
} else {
114
91
responses <- TransactionBuildResponse {Response : txnResponse }
115
92
}
116
93
case TransactionSubmissionTypeMultiAgent :
117
- curSequenceNumber := snt . Increment ( )
118
- options [ optionsLast ] = SequenceNumber ( curSequenceNumber )
94
+ options [ optionsLast ] = SequenceNumber ( snt )
95
+ snt ++
119
96
txnResponse , err := rc .BuildTransactionMultiAgent (sender , payload .Inner , options ... )
120
97
if err != nil {
121
98
responses <- TransactionBuildResponse {Err : err }
@@ -127,7 +104,7 @@ func (rc *NodeClient) BuildTransactions(sender AccountAddress, payloads chan Tra
127
104
}
128
105
case newSequenceNumber := <- setSequenceNumber :
129
106
// This can be used to update the sequence number at anytime
130
- snt . Update ( newSequenceNumber )
107
+ snt = newSequenceNumber
131
108
// TODO: We should periodically handle reconciliation of the sequence numbers, but this needs to know submission as well
132
109
}
133
110
}
0 commit comments