@@ -232,9 +232,14 @@ type TxCandidate struct {
232232//
233233// NOTE: Send can be called concurrently, the nonce will be managed internally.
234234func (m * SimpleTxManager ) Send (ctx context.Context , candidate TxCandidate ) (* types.Receipt , error ) {
235+ _ , r , err := m .send (ctx , candidate )
236+ return r , err
237+ }
238+
239+ func (m * SimpleTxManager ) send (ctx context.Context , candidate TxCandidate ) (* types.Transaction , * types.Receipt , error ) {
235240 // refuse new requests if the tx manager is closed
236241 if m .closed .Load () {
237- return nil , ErrClosed
242+ return nil , nil , ErrClosed
238243 }
239244
240245 m .metr .RecordPendingTx (m .pending .Add (1 ))
@@ -251,63 +256,27 @@ func (m *SimpleTxManager) Send(ctx context.Context, candidate TxCandidate) (*typ
251256 tx , err := m .prepare (ctx , candidate )
252257 if err != nil {
253258 m .resetNonce ()
254- return nil , err
259+ return tx , nil , err
255260 }
256261 receipt , err := m .sendTx (ctx , tx )
257262 if err != nil {
258263 m .resetNonce ()
259- return nil , err
264+ return nil , nil , err
260265 }
261- return receipt , err
266+ return tx , receipt , err
262267}
263268
264269func (m * SimpleTxManager ) SendAsync (ctx context.Context , candidate TxCandidate , ch chan SendResponse ) {
265- if cap (ch ) == 0 {
266- panic ("SendAsync: channel must be buffered" )
267- }
268-
269- // refuse new requests if the tx manager is closed
270- if m .closed .Load () {
271- ch <- SendResponse {
272- Receipt : nil ,
273- Err : ErrClosed ,
274- }
275- return
276- }
277-
278- m .metr .RecordPendingTx (m .pending .Add (1 ))
279-
280- var cancel context.CancelFunc
281- if m .cfg .TxSendTimeout == 0 {
282- ctx , cancel = context .WithCancel (ctx )
283- } else {
284- ctx , cancel = context .WithTimeout (ctx , m .cfg .TxSendTimeout )
285- }
286-
287- tx , err := m .prepare (ctx , candidate )
288- if err != nil {
289- m .resetNonce ()
290- cancel ()
291- m .metr .RecordPendingTx (m .pending .Add (- 1 ))
292- ch <- SendResponse {
293- Receipt : nil ,
294- Err : err ,
295- }
296- return
297- }
298-
299270 go func () {
300- defer m .metr .RecordPendingTx (m .pending .Add (- 1 ))
301- defer cancel ()
302- receipt , err := m .sendTx (ctx , tx )
303- if err != nil {
304- m .resetNonce ()
305- }
306- ch <- SendResponse {
271+ tx , receipt , err := m .send (ctx , candidate )
272+ r := SendResponse {
307273 Receipt : receipt ,
308- Nonce : tx .Nonce (),
309274 Err : err ,
310275 }
276+ if tx != nil {
277+ r .Nonce = tx .Nonce ()
278+ }
279+ ch <- r
311280 }()
312281}
313282
0 commit comments