// Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethclient import ( "errors" "github.com/holiman/uint256" "github.com/ledgerwatch/turbo-geth/common" "github.com/ledgerwatch/turbo-geth/common/u256" "github.com/ledgerwatch/turbo-geth/core/types" "github.com/ledgerwatch/turbo-geth/crypto/secp256k1" ) // senderFromServer is a types.Signer that remembers the sender address returned by the RPC // server. It is stored in the transaction's sender address cache to avoid an additional // request in TransactionSender. type senderFromServer struct { addr common.Address blockhash common.Hash } var errNotCached = errors.New("sender not cached") func setSenderFromServer(tx *types.Transaction, addr common.Address, block common.Hash) { // Use types.Sender for side-effect to store our signer into the cache. types.Sender(&senderFromServer{addr, block}, tx) } func (s *senderFromServer) Equal(other types.Signer) bool { os, ok := other.(*senderFromServer) return ok && os.blockhash == s.blockhash } func (s *senderFromServer) Sender(tx *types.Transaction) (common.Address, error) { return s.SenderWithContext(nil, tx) } func (s *senderFromServer) SenderWithContext(_ *secp256k1.Context, tx *types.Transaction) (common.Address, error) { if s.blockhash == (common.Hash{}) { return common.Address{}, errNotCached } return s.addr, nil } func (s *senderFromServer) ChainID() *uint256.Int { return u256.Num0 } func (s *senderFromServer) Hash(tx *types.Transaction) common.Hash { panic("can't sign with senderFromServer") } func (s *senderFromServer) SignatureValues(tx *types.Transaction, sig []byte) (R, S, V *uint256.Int, err error) { panic("can't sign with senderFromServer") }