func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) { sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from}, hash.Bytes()) if err == accounts.ErrLocked { if didUnlock { return nil, fmt.Errorf("signer account still locked after successful unlock") } if !self.frontend.UnlockAccount(from.Bytes()) { return nil, fmt.Errorf("could not unlock signer account") } // retry signing, the account should now be unlocked. return self.doSign(from, hash, true) } else if err != nil { return nil, err } return sig, nil }