chore(wallet)_: proper release of locked nonce (unlock function call)
This commit is contained in:
parent
03cdb49c4c
commit
e9f11f70dd
|
@ -400,9 +400,11 @@ func (tm *TransactionManager) ProceedWithTransactionsSignatures(ctx context.Cont
|
||||||
hashes := make(map[uint64][]types.Hash)
|
hashes := make(map[uint64][]types.Hash)
|
||||||
for _, desc := range tm.transactionsForKeycardSingning {
|
for _, desc := range tm.transactionsForKeycardSingning {
|
||||||
hash, err := tm.transactor.SendBuiltTransactionWithSignature(desc.chainID, desc.builtTx, desc.signature)
|
hash, err := tm.transactor.SendBuiltTransactionWithSignature(desc.chainID, desc.builtTx, desc.signature)
|
||||||
|
if desc.unlock != nil {
|
||||||
defer func() {
|
defer func() {
|
||||||
desc.unlock(err == nil, desc.builtTx.Nonce())
|
desc.unlock(err == nil, desc.builtTx.Nonce())
|
||||||
}()
|
}()
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,10 @@ func NewNonce() *Nonce {
|
||||||
func (n *Nonce) Next(rpcWrapper *rpcWrapper, from types.Address) (uint64, UnlockNonceFunc, error) {
|
func (n *Nonce) Next(rpcWrapper *rpcWrapper, from types.Address) (uint64, UnlockNonceFunc, error) {
|
||||||
n.addrLock.LockAddr(from)
|
n.addrLock.LockAddr(from)
|
||||||
current, err := n.GetCurrent(rpcWrapper, from)
|
current, err := n.GetCurrent(rpcWrapper, from)
|
||||||
|
if err != nil {
|
||||||
|
return 0, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
unlock := func(inc bool, nonce uint64) {
|
unlock := func(inc bool, nonce uint64) {
|
||||||
if inc {
|
if inc {
|
||||||
if _, ok := n.localNonce[rpcWrapper.chainID]; !ok {
|
if _, ok := n.localNonce[rpcWrapper.chainID]; !ok {
|
||||||
|
@ -36,7 +40,7 @@ func (n *Nonce) Next(rpcWrapper *rpcWrapper, from types.Address) (uint64, Unlock
|
||||||
n.addrLock.UnlockAddr(from)
|
n.addrLock.UnlockAddr(from)
|
||||||
}
|
}
|
||||||
|
|
||||||
return current, unlock, err
|
return current, unlock, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Nonce) GetCurrent(rpcWrapper *rpcWrapper, from types.Address) (uint64, error) {
|
func (n *Nonce) GetCurrent(rpcWrapper *rpcWrapper, from types.Address) (uint64, error) {
|
||||||
|
|
|
@ -157,9 +157,11 @@ func (t *Transactor) SendTransactionWithSignature(chainID uint64, args SendTxArg
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hash, err
|
return hash, err
|
||||||
}
|
}
|
||||||
|
if unlock != nil {
|
||||||
defer func() {
|
defer func() {
|
||||||
unlock(err == nil, expectedNonce)
|
unlock(err == nil, expectedNonce)
|
||||||
}()
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
if tx.Nonce() != expectedNonce {
|
if tx.Nonce() != expectedNonce {
|
||||||
return hash, &ErrBadNonce{tx.Nonce(), expectedNonce}
|
return hash, &ErrBadNonce{tx.Nonce(), expectedNonce}
|
||||||
|
@ -179,7 +181,9 @@ func (t *Transactor) HashTransaction(args SendTxArgs) (validatedArgs SendTxArgs,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return validatedArgs, hash, err
|
return validatedArgs, hash, err
|
||||||
}
|
}
|
||||||
|
if unlock != nil {
|
||||||
defer unlock(false, 0)
|
defer unlock(false, 0)
|
||||||
|
}
|
||||||
|
|
||||||
gasPrice := (*big.Int)(args.GasPrice)
|
gasPrice := (*big.Int)(args.GasPrice)
|
||||||
gasFeeCap := (*big.Int)(args.MaxFeePerGas)
|
gasFeeCap := (*big.Int)(args.MaxFeePerGas)
|
||||||
|
@ -273,13 +277,16 @@ func (t *Transactor) validateAndBuildTransaction(rpcWrapper *rpcWrapper, args Se
|
||||||
return tx, nil, ErrInvalidSendTxArgs
|
return tx, nil, ErrInvalidSendTxArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
nonce, unlock, err := t.nonce.Next(rpcWrapper, args.From)
|
var nonce uint64
|
||||||
|
if args.Nonce != nil {
|
||||||
|
nonce = uint64(*args.Nonce)
|
||||||
|
} else {
|
||||||
|
nonce, unlock, err = t.nonce.Next(rpcWrapper, args.From)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return tx, nil, err
|
return tx, nil, err
|
||||||
}
|
}
|
||||||
if args.Nonce != nil {
|
|
||||||
nonce = uint64(*args.Nonce)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), t.rpcCallTimeout)
|
ctx, cancel := context.WithTimeout(context.Background(), t.rpcCallTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue