github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/internal/ethapi/api_test.go (about)

     1  package ethapi
     2  
     3  import (
     4  	"context"
     5  	"io/ioutil"
     6  	"math/big"
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/kisexp/xdchain/accounts"
    13  	"github.com/kisexp/xdchain/accounts/keystore"
    14  	"github.com/kisexp/xdchain/common"
    15  	"github.com/kisexp/xdchain/common/hexutil"
    16  	"github.com/kisexp/xdchain/common/math"
    17  	"github.com/kisexp/xdchain/consensus"
    18  	"github.com/kisexp/xdchain/core"
    19  	"github.com/kisexp/xdchain/core/bloombits"
    20  	"github.com/kisexp/xdchain/core/mps"
    21  	"github.com/kisexp/xdchain/core/rawdb"
    22  	"github.com/kisexp/xdchain/core/state"
    23  	"github.com/kisexp/xdchain/core/types"
    24  	"github.com/kisexp/xdchain/core/vm"
    25  	"github.com/kisexp/xdchain/crypto"
    26  	"github.com/kisexp/xdchain/eth/downloader"
    27  	"github.com/kisexp/xdchain/ethdb"
    28  	"github.com/kisexp/xdchain/event"
    29  	"github.com/kisexp/xdchain/log"
    30  	"github.com/kisexp/xdchain/multitenancy"
    31  	"github.com/kisexp/xdchain/params"
    32  	"github.com/kisexp/xdchain/private"
    33  	"github.com/kisexp/xdchain/private/engine"
    34  	"github.com/kisexp/xdchain/private/engine/notinuse"
    35  	"github.com/kisexp/xdchain/rpc"
    36  	"github.com/kisexp/xdchain/trie"
    37  	"github.com/golang/mock/gomock"
    38  	"github.com/jpmorganchase/quorum-security-plugin-sdk-go/proto"
    39  	"github.com/stretchr/testify/assert"
    40  	"github.com/stretchr/testify/require"
    41  )
    42  
    43  var (
    44  	arbitraryCtx          = context.Background()
    45  	arbitraryPrivateFrom  = "arbitrary private from"
    46  	arbitraryPrivateFor   = []string{"arbitrary party 1", "arbitrary party 2"}
    47  	arbitraryMandatoryFor = []string{"arbitrary party 2"}
    48  	privateTxArgs         = &PrivateTxArgs{
    49  		PrivateFrom: arbitraryPrivateFrom,
    50  		PrivateFor:  arbitraryPrivateFor,
    51  	}
    52  	arbitraryFrom         = common.BytesToAddress([]byte("arbitrary address"))
    53  	arbitraryTo           = common.BytesToAddress([]byte("arbitrary address to"))
    54  	arbitraryGas          = uint64(200000)
    55  	arbitraryZeroGasPrice = big.NewInt(0)
    56  	arbitraryZeroValue    = big.NewInt(0)
    57  	arbitraryEmptyData    = new([]byte)
    58  	callTxArgs            = CallArgs{
    59  		From:     &arbitraryFrom,
    60  		To:       &arbitraryTo,
    61  		Gas:      (*hexutil.Uint64)(&arbitraryGas),
    62  		GasPrice: (*hexutil.Big)(arbitraryZeroGasPrice),
    63  		Value:    (*hexutil.Big)(arbitraryZeroValue),
    64  		Data:     (*hexutil.Bytes)(arbitraryEmptyData),
    65  	}
    66  
    67  	arbitrarySimpleStorageContractEncryptedPayloadHash       = common.BytesToEncryptedPayloadHash([]byte("arbitrary payload hash"))
    68  	arbitraryMandatoryRecipientsContractEncryptedPayloadHash = common.BytesToEncryptedPayloadHash([]byte("arbitrary payload hash of tx with mr"))
    69  
    70  	simpleStorageContractCreationTx = types.NewContractCreation(
    71  		0,
    72  		big.NewInt(0),
    73  		hexutil.MustDecodeUint64("0x47b760"),
    74  		big.NewInt(0),
    75  		hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"))
    76  
    77  	rawSimpleStorageContractCreationTx = types.NewContractCreation(
    78  		0,
    79  		big.NewInt(0),
    80  		hexutil.MustDecodeUint64("0x47b760"),
    81  		big.NewInt(0),
    82  		arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes())
    83  
    84  	arbitrarySimpleStorageContractAddress                    common.Address
    85  	arbitraryStandardPrivateSimpleStorageContractAddress     common.Address
    86  	arbitraryMandatoryRecipientsSimpleStorageContractAddress common.Address
    87  
    88  	simpleStorageContractMessageCallTx                   *types.Transaction
    89  	standardPrivateSimpleStorageContractMessageCallTx    *types.Transaction
    90  	rawStandardPrivateSimpleStorageContractMessageCallTx *types.Transaction
    91  
    92  	arbitraryCurrentBlockNumber = big.NewInt(1)
    93  
    94  	publicStateDB  *state.StateDB
    95  	privateStateDB *state.StateDB
    96  
    97  	workdir string
    98  )
    99  
   100  func TestMain(m *testing.M) {
   101  	setup()
   102  	retCode := m.Run()
   103  	teardown()
   104  	os.Exit(retCode)
   105  }
   106  
   107  func setup() {
   108  	log.Root().SetHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(true)))
   109  	var err error
   110  
   111  	memdb := rawdb.NewMemoryDatabase()
   112  	db := state.NewDatabase(memdb)
   113  
   114  	publicStateDB, err = state.New(common.Hash{}, db, nil)
   115  	if err != nil {
   116  		panic(err)
   117  	}
   118  	privateStateDB, err = state.New(common.Hash{}, db, nil)
   119  	if err != nil {
   120  		panic(err)
   121  	}
   122  
   123  	private.P = &StubPrivateTransactionManager{}
   124  
   125  	key, _ := crypto.GenerateKey()
   126  	from := crypto.PubkeyToAddress(key.PublicKey)
   127  
   128  	arbitrarySimpleStorageContractAddress = crypto.CreateAddress(from, 0)
   129  
   130  	simpleStorageContractMessageCallTx = types.NewTransaction(
   131  		0,
   132  		arbitrarySimpleStorageContractAddress,
   133  		big.NewInt(0),
   134  		hexutil.MustDecodeUint64("0x47b760"),
   135  		big.NewInt(0),
   136  		hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000d"))
   137  
   138  	arbitraryStandardPrivateSimpleStorageContractAddress = crypto.CreateAddress(from, 1)
   139  
   140  	standardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction(
   141  		0,
   142  		arbitraryStandardPrivateSimpleStorageContractAddress,
   143  		big.NewInt(0),
   144  		hexutil.MustDecodeUint64("0x47b760"),
   145  		big.NewInt(0),
   146  		hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"))
   147  
   148  	rawStandardPrivateSimpleStorageContractMessageCallTx = types.NewTransaction(
   149  		0,
   150  		arbitraryStandardPrivateSimpleStorageContractAddress,
   151  		big.NewInt(0),
   152  		hexutil.MustDecodeUint64("0x47b760"),
   153  		big.NewInt(0),
   154  		arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes())
   155  
   156  	workdir, err = ioutil.TempDir("", "")
   157  	if err != nil {
   158  		panic(err)
   159  	}
   160  }
   161  
   162  func teardown() {
   163  	log.Root().SetHandler(log.DiscardHandler())
   164  	os.RemoveAll(workdir)
   165  }
   166  
   167  func TestDoEstimateGas_whenNoValueTx_Pre_Istanbul(t *testing.T) {
   168  	assert := assert.New(t)
   169  
   170  	estimation, err := DoEstimateGas(arbitraryCtx, &StubBackend{CurrentHeadNumber: big.NewInt(10)}, callTxArgs, rpc.BlockNumberOrHashWithNumber(10), math.MaxInt64)
   171  
   172  	assert.NoError(err, "gas estimation")
   173  	assert.Equal(hexutil.Uint64(25352), estimation, "estimation for a public or private tx")
   174  }
   175  
   176  func TestDoEstimateGas_whenNoValueTx_Istanbul(t *testing.T) {
   177  	assert := assert.New(t)
   178  
   179  	estimation, err := DoEstimateGas(arbitraryCtx, &StubBackend{IstanbulBlock: big.NewInt(0), CurrentHeadNumber: big.NewInt(10)}, callTxArgs, rpc.BlockNumberOrHashWithNumber(10), math.MaxInt64)
   180  
   181  	assert.NoError(err, "gas estimation")
   182  	assert.Equal(hexutil.Uint64(22024), estimation, "estimation for a public or private tx")
   183  }
   184  
   185  func TestSimulateExecution_whenStandardPrivateCreation(t *testing.T) {
   186  	assert := assert.New(t)
   187  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   188  
   189  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
   190  
   191  	assert.NoError(err, "simulate execution")
   192  	assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
   193  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   194  }
   195  
   196  func TestSimulateExecution_whenPartyProtectionCreation(t *testing.T) {
   197  	assert := assert.New(t)
   198  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   199  
   200  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
   201  
   202  	assert.NoError(err, "simulation execution")
   203  	assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
   204  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   205  }
   206  
   207  func TestSimulateExecution_whenCreationWithStateValidation(t *testing.T) {
   208  	assert := assert.New(t)
   209  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
   210  
   211  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractCreationTx, privateTxArgs)
   212  
   213  	assert.NoError(err, "simulate execution")
   214  	assert.Empty(affectedCACreationTxHashes, "creation tx should not have any affected contract creation tx hashes")
   215  	assert.NotEqual(common.Hash{}, merkleRoot, "private state validation")
   216  }
   217  
   218  func TestSimulateExecution_whenStandardPrivateMessageCall(t *testing.T) {
   219  	assert := assert.New(t)
   220  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   221  
   222  	privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002"))
   223  	privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   224  	privateStateDB.Commit(true)
   225  
   226  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
   227  
   228  	log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
   229  
   230  	assert.NoError(err, "simulate execution")
   231  	assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes")
   232  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   233  }
   234  
   235  func TestSimulateExecution_StandardPrivateMessageCallSucceedsWheContractNotAvailableLocally(t *testing.T) {
   236  	assert := assert.New(t)
   237  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   238  
   239  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
   240  
   241  	log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
   242  
   243  	assert.NoError(err, "simulate execution")
   244  	assert.Empty(affectedCACreationTxHashes, "standard private contract should not have any affected contract creation tx hashes")
   245  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   246  }
   247  
   248  func TestSimulateExecution_whenPartyProtectionMessageCall(t *testing.T) {
   249  	assert := assert.New(t)
   250  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   251  
   252  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   253  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   254  		PrivacyFlag:    privateTxArgs.PrivacyFlag,
   255  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   256  	})
   257  
   258  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   259  	privateStateDB.Commit(true)
   260  
   261  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   262  
   263  	expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
   264  
   265  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   266  
   267  	assert.NoError(err, "simulate execution")
   268  	assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
   269  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   270  	assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes))
   271  }
   272  
   273  func TestSimulateExecution_whenPartyProtectionMessageCallAndPrivacyEnhancementsDisabled(t *testing.T) {
   274  	assert := assert.New(t)
   275  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   276  
   277  	params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil
   278  	defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }()
   279  
   280  	stbBackend := &StubBackend{}
   281  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, stbBackend, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   282  
   283  	// the simulation returns early without executing the transaction
   284  	assert.False(stbBackend.getEVMCalled, "simulation is ended early - before getEVM is called")
   285  	assert.NoError(err, "simulate execution")
   286  	assert.Empty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
   287  	assert.Equal(common.Hash{}, merkleRoot, "no private state validation")
   288  }
   289  
   290  func TestSimulateExecution_whenStateValidationMessageCall(t *testing.T) {
   291  	assert := assert.New(t)
   292  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
   293  
   294  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   295  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   296  		PrivacyFlag:    privateTxArgs.PrivacyFlag,
   297  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   298  	})
   299  
   300  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   301  	privateStateDB.Commit(true)
   302  
   303  	affectedCACreationTxHashes, merkleRoot, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   304  
   305  	expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
   306  
   307  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   308  
   309  	assert.NoError(err, "simulate execution")
   310  	assert.NotEmpty(affectedCACreationTxHashes, "affected contract accounts' creation transacton hashes")
   311  	assert.NotEqual(common.Hash{}, merkleRoot, "private state validation")
   312  	assert.True(len(affectedCACreationTxHashes) == len(expectedCACreationTxHashes))
   313  }
   314  
   315  //mix and match flags
   316  func TestSimulateExecution_PrivacyFlagPartyProtectionCallingStandardPrivateContract_Error(t *testing.T) {
   317  	assert := assert.New(t)
   318  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   319  
   320  	privateStateDB.SetCode(arbitraryStandardPrivateSimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000002"))
   321  	privateStateDB.SetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   322  	privateStateDB.Commit(true)
   323  
   324  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs)
   325  
   326  	log.Debug("state", "state", privateStateDB.GetState(arbitraryStandardPrivateSimpleStorageContractAddress, common.Hash{0}))
   327  
   328  	assert.Error(err, "simulate execution")
   329  }
   330  
   331  func TestSimulateExecution_StandardPrivateFlagCallingPartyProtectionContract_Error(t *testing.T) {
   332  	assert := assert.New(t)
   333  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   334  
   335  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   336  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   337  		PrivacyFlag:    engine.PrivacyFlagPartyProtection,
   338  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   339  	})
   340  
   341  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   342  	privateStateDB.Commit(true)
   343  
   344  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   345  
   346  	assert.Error(err, "simulate execution")
   347  }
   348  
   349  func TestSimulateExecution_StandardPrivateFlagCallingStateValidationContract_Error(t *testing.T) {
   350  	assert := assert.New(t)
   351  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   352  
   353  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   354  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   355  		PrivacyFlag:    engine.PrivacyFlagStateValidation,
   356  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   357  	})
   358  
   359  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   360  	privateStateDB.Commit(true)
   361  
   362  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   363  
   364  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   365  
   366  	assert.Error(err, "simulate execution")
   367  }
   368  
   369  func TestSimulateExecution_PartyProtectionFlagCallingStateValidationContract_Error(t *testing.T) {
   370  	assert := assert.New(t)
   371  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   372  
   373  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   374  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   375  		PrivacyFlag:    engine.PrivacyFlagStateValidation,
   376  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   377  	})
   378  
   379  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   380  	privateStateDB.Commit(true)
   381  
   382  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   383  
   384  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   385  
   386  	assert.Error(err, "simulate execution")
   387  }
   388  
   389  func TestSimulateExecution_StateValidationFlagCallingPartyProtectionContract_Error(t *testing.T) {
   390  	assert := assert.New(t)
   391  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStateValidation
   392  
   393  	privateStateDB.SetCode(arbitrarySimpleStorageContractAddress, hexutil.MustDecode("0x608060405234801561001057600080fd5b506040516020806101618339810180604052602081101561003057600080fd5b81019080805190602001909291905050508060008190555050610109806100586000396000f3fe6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146099575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b810190808035906020019092919050505060c1565b6040518082815260200191505060405180910390f35b34801560a457600080fd5b5060ab60d4565b6040518082815260200191505060405180910390f35b6000816000819055506000549050919050565b6000805490509056fea165627a7a723058203624ca2e3479d3fa5a12d97cf3dae0d9a6de3a3b8a53c8605b9cd398d9766b9f00290000000000000000000000000000000000000000000000000000000000000001"))
   394  	privateStateDB.SetPrivacyMetadata(arbitrarySimpleStorageContractAddress, &state.PrivacyMetadata{
   395  		PrivacyFlag:    engine.PrivacyFlagPartyProtection,
   396  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
   397  	})
   398  
   399  	privateStateDB.SetState(arbitrarySimpleStorageContractAddress, common.Hash{0}, common.Hash{100})
   400  	privateStateDB.Commit(true)
   401  
   402  	_, _, err := simulateExecutionForPE(arbitraryCtx, &StubBackend{}, arbitraryFrom, simpleStorageContractMessageCallTx, privateTxArgs)
   403  
   404  	//expectedCACreationTxHashes := []common.EncryptedPayloadHash{arbitrarySimpleStorageContractEncryptedPayloadHash}
   405  
   406  	log.Debug("state", "state", privateStateDB.GetState(arbitrarySimpleStorageContractAddress, common.Hash{0}))
   407  
   408  	assert.Error(err, "simulate execution")
   409  }
   410  
   411  func TestHandlePrivateTransaction_whenInvalidFlag(t *testing.T) {
   412  	assert := assert.New(t)
   413  	privateTxArgs.PrivacyFlag = 4
   414  
   415  	_, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   416  
   417  	assert.Error(err, "invalid privacyFlag")
   418  }
   419  
   420  func TestHandlePrivateTransaction_whenPrivateFromDoesNotMatchPrivateState(t *testing.T) {
   421  	assert := assert.New(t)
   422  	mockCtrl := gomock.NewController(t)
   423  	defer mockCtrl.Finish()
   424  
   425  	mockpsm := mps.NewMockPrivateStateManager(mockCtrl)
   426  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(mps.NewPrivateStateMetadata("PS1", "PS1", "", mps.Resident, []string{"some address"}), nil).AnyTimes()
   427  
   428  	_, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &MPSStubBackend{psmr: mockpsm}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   429  
   430  	assert.Error(err, "The PrivateFrom (arbitrary private from) address does not match the specified private state (PS1) ")
   431  }
   432  
   433  func TestHandlePrivateTransaction_whenPrivateFromMatchesPrivateState(t *testing.T) {
   434  	assert := assert.New(t)
   435  	mockCtrl := gomock.NewController(t)
   436  	defer mockCtrl.Finish()
   437  
   438  	mockpsm := mps.NewMockPrivateStateManager(mockCtrl)
   439  	mockpsm.EXPECT().ResolveForUserContext(gomock.Any()).Return(mps.NewPrivateStateMetadata("PS1", "PS1", "", mps.Resident, []string{"some address"}), nil).AnyTimes()
   440  
   441  	// empty data field means that checkAndHandlePrivateTransaction exits without doing handlePrivateTransaction
   442  	emptyTx := types.NewContractCreation(
   443  		0,
   444  		big.NewInt(0),
   445  		hexutil.MustDecodeUint64("0x47b760"),
   446  		big.NewInt(0),
   447  		nil)
   448  
   449  	mpsTxArgs := &PrivateTxArgs{
   450  		PrivateFrom: "some address",
   451  		PrivateFor:  []string{"arbitrary party 1", "arbitrary party 2"},
   452  	}
   453  	_, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &MPSStubBackend{psmr: mockpsm}, emptyTx, mpsTxArgs, arbitraryFrom, NormalTransaction)
   454  
   455  	assert.Nil(err)
   456  }
   457  
   458  func TestHandlePrivateTransaction_withPartyProtectionTxAndPrivacyEnhancementsIsDisabled(t *testing.T) {
   459  	assert := assert.New(t)
   460  	privateTxArgs.PrivacyFlag = 1
   461  	params.QuorumTestChainConfig.PrivacyEnhancementsBlock = nil
   462  	defer func() { params.QuorumTestChainConfig.PrivacyEnhancementsBlock = big.NewInt(0) }()
   463  
   464  	_, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   465  
   466  	assert.Error(err, "PrivacyEnhancements are disabled. Can only accept transactions with PrivacyFlag=0(StandardPrivate).")
   467  }
   468  
   469  func TestHandlePrivateTransaction_whenStandardPrivateCreation(t *testing.T) {
   470  	assert := assert.New(t)
   471  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   472  
   473  	isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   474  
   475  	if err != nil {
   476  		t.Fatalf("%s", err)
   477  	}
   478  
   479  	assert.True(isPrivate, "must be a private transaction")
   480  }
   481  
   482  func TestHandlePrivateTransaction_whenStandardPrivateCallingContractThatIsNotAvailableLocally(t *testing.T) {
   483  	assert := assert.New(t)
   484  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   485  
   486  	isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   487  
   488  	assert.NoError(err, "no error expected")
   489  
   490  	assert.True(isPrivate, "must be a private transaction")
   491  }
   492  
   493  func TestHandlePrivateTransaction_whenPartyProtectionCallingContractThatIsNotAvailableLocally(t *testing.T) {
   494  	assert := assert.New(t)
   495  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   496  
   497  	isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   498  
   499  	assert.Error(err, "handle invalid message call")
   500  
   501  	assert.True(isPrivate, "must be a private transaction")
   502  }
   503  
   504  func TestHandlePrivateTransaction_whenPartyProtectionCallingStandardPrivate(t *testing.T) {
   505  	assert := assert.New(t)
   506  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   507  
   508  	isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, standardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   509  
   510  	assert.Error(err, "handle invalid message call")
   511  
   512  	assert.True(isPrivate, "must be a private transaction")
   513  }
   514  
   515  func TestHandlePrivateTransaction_whenRawStandardPrivateCreation(t *testing.T) {
   516  	assert := assert.New(t)
   517  	private.P = &StubPrivateTransactionManager{creation: true}
   518  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   519  
   520  	isPrivate, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawSimpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, RawTransaction)
   521  
   522  	assert.NoError(err, "raw standard private creation succeeded")
   523  	assert.True(isPrivate, "must be a private transaction")
   524  }
   525  
   526  func TestHandlePrivateTransaction_whenRawStandardPrivateMessageCall(t *testing.T) {
   527  	assert := assert.New(t)
   528  	private.P = &StubPrivateTransactionManager{creation: false}
   529  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   530  
   531  	_, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, rawStandardPrivateSimpleStorageContractMessageCallTx, privateTxArgs, arbitraryFrom, RawTransaction)
   532  
   533  	assert.NoError(err, "raw standard private msg call succeeded")
   534  
   535  }
   536  
   537  func TestHandlePrivateTransaction_whenMandatoryRecipients(t *testing.T) {
   538  	assert := assert.New(t)
   539  	mockCtrl := gomock.NewController(t)
   540  	defer mockCtrl.Finish()
   541  
   542  	mockTM := private.NewMockPrivateTransactionManager(mockCtrl)
   543  
   544  	saved := private.P
   545  	defer func() {
   546  		private.P = saved
   547  		privateTxArgs.MandatoryRecipients = nil
   548  	}()
   549  	private.P = mockTM
   550  	privateTxArgs.MandatoryRecipients = arbitraryMandatoryFor
   551  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagMandatoryRecipients
   552  
   553  	var capturedMetadata engine.ExtraMetadata
   554  
   555  	mockTM.EXPECT().Send(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
   556  		Do(func(arg1 interface{}, arg2 string, arg3 interface{}, arg4 *engine.ExtraMetadata) {
   557  			capturedMetadata = *arg4
   558  		}).Times(1)
   559  
   560  	_, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   561  
   562  	assert.NoError(err)
   563  	assert.Equal(engine.PrivacyFlagMandatoryRecipients, capturedMetadata.PrivacyFlag)
   564  	assert.Equal(arbitraryMandatoryFor, capturedMetadata.MandatoryRecipients)
   565  
   566  }
   567  
   568  func TestHandlePrivateTransaction_whenRawPrivateWithMandatoryRecipients(t *testing.T) {
   569  	assert := assert.New(t)
   570  	mockCtrl := gomock.NewController(t)
   571  	defer mockCtrl.Finish()
   572  
   573  	mockTM := private.NewMockPrivateTransactionManager(mockCtrl)
   574  
   575  	saved := private.P
   576  	defer func() {
   577  		private.P = saved
   578  		privateTxArgs.MandatoryRecipients = nil
   579  	}()
   580  	private.P = mockTM
   581  	privateTxArgs.MandatoryRecipients = arbitraryMandatoryFor
   582  
   583  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagMandatoryRecipients
   584  
   585  	var capturedMetadata engine.ExtraMetadata
   586  
   587  	mockTM.EXPECT().ReceiveRaw(gomock.Any()).Times(1)
   588  
   589  	mockTM.EXPECT().SendSignedTx(gomock.Any(), gomock.Any(), gomock.Any()).
   590  		Do(func(arg1 interface{}, arg2 []string, arg3 *engine.ExtraMetadata) {
   591  			capturedMetadata = *arg3
   592  		}).Times(1)
   593  
   594  	_, err := handlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, RawTransaction)
   595  
   596  	assert.NoError(err)
   597  	assert.Equal(engine.PrivacyFlagMandatoryRecipients, capturedMetadata.PrivacyFlag)
   598  	assert.Equal(arbitraryMandatoryFor, capturedMetadata.MandatoryRecipients)
   599  
   600  }
   601  
   602  func TestHandlePrivateTransaction_whenMandatoryRecipientsDataInvalid(t *testing.T) {
   603  	assert := assert.New(t)
   604  
   605  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagMandatoryRecipients
   606  
   607  	_, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   608  
   609  	assert.Error(err, "missing mandatory recipients data. if no mandatory recipients required consider using PrivacyFlag=1(PartyProtection)")
   610  
   611  }
   612  
   613  func TestHandlePrivateTransaction_whenNoMandatoryRecipientsData(t *testing.T) {
   614  	assert := assert.New(t)
   615  
   616  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagPartyProtection
   617  	defer func() {
   618  		privateTxArgs.MandatoryRecipients = nil
   619  	}()
   620  	privateTxArgs.MandatoryRecipients = arbitraryMandatoryFor
   621  
   622  	_, _, _, err := checkAndHandlePrivateTransaction(arbitraryCtx, &StubBackend{}, simpleStorageContractCreationTx, privateTxArgs, arbitraryFrom, NormalTransaction)
   623  
   624  	assert.Error(err, "privacy metadata invalid. mandatory recipients are only applicable for PrivacyFlag=2(MandatoryRecipients)")
   625  
   626  }
   627  
   628  func TestGetContractPrivacyMetadata(t *testing.T) {
   629  	assert := assert.New(t)
   630  
   631  	keystore, _, _ := createKeystore(t)
   632  
   633  	stbBackend := &StubBackend{}
   634  	stbBackend.multitenancySupported = false
   635  	stbBackend.isPrivacyMarkerTransactionCreationEnabled = false
   636  	stbBackend.ks = keystore
   637  	stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
   638  	stbBackend.poolNonce = 999
   639  
   640  	public := NewPublicTransactionPoolAPI(stbBackend, nil)
   641  
   642  	privacyMetadata, _ := public.GetContractPrivacyMetadata(arbitraryCtx, arbitrarySimpleStorageContractAddress)
   643  
   644  	assert.Equal(engine.PrivacyFlagPartyProtection, privacyMetadata.PrivacyFlag)
   645  	assert.Equal(arbitrarySimpleStorageContractEncryptedPayloadHash, privacyMetadata.CreationTxHash)
   646  	assert.Equal(0, len(privacyMetadata.MandatoryRecipients))
   647  }
   648  
   649  func TestGetContractPrivacyMetadataWhenMandatoryRecipients(t *testing.T) {
   650  	assert := assert.New(t)
   651  
   652  	keystore, _, _ := createKeystore(t)
   653  
   654  	stbBackend := &StubBackend{}
   655  	stbBackend.multitenancySupported = false
   656  	stbBackend.isPrivacyMarkerTransactionCreationEnabled = false
   657  	stbBackend.ks = keystore
   658  	stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
   659  	stbBackend.poolNonce = 999
   660  
   661  	public := NewPublicTransactionPoolAPI(stbBackend, nil)
   662  
   663  	mockCtrl := gomock.NewController(t)
   664  	defer mockCtrl.Finish()
   665  
   666  	mockTM := private.NewMockPrivateTransactionManager(mockCtrl)
   667  
   668  	saved := private.P
   669  	defer func() {
   670  		private.P = saved
   671  	}()
   672  	private.P = mockTM
   673  
   674  	var capturedTxHash common.EncryptedPayloadHash
   675  
   676  	mockTM.EXPECT().GetMandatory(gomock.Any()).
   677  		DoAndReturn(func(arg1 common.EncryptedPayloadHash) ([]string, error) {
   678  			capturedTxHash = arg1
   679  			return arbitraryMandatoryFor, nil
   680  		}).Times(1)
   681  
   682  	privacyMetadata, _ := public.GetContractPrivacyMetadata(arbitraryCtx, arbitraryMandatoryRecipientsSimpleStorageContractAddress)
   683  
   684  	assert.Equal(arbitraryMandatoryRecipientsContractEncryptedPayloadHash, capturedTxHash)
   685  
   686  	assert.Equal(engine.PrivacyFlagMandatoryRecipients, privacyMetadata.PrivacyFlag)
   687  	assert.Equal(arbitraryMandatoryRecipientsContractEncryptedPayloadHash, privacyMetadata.CreationTxHash)
   688  	assert.Equal(arbitraryMandatoryFor, privacyMetadata.MandatoryRecipients)
   689  }
   690  
   691  func TestSubmitPrivateTransaction(t *testing.T) {
   692  	assert := assert.New(t)
   693  
   694  	keystore, fromAcct, toAcct := createKeystore(t)
   695  
   696  	stbBackend := &StubBackend{}
   697  	stbBackend.multitenancySupported = false
   698  	stbBackend.isPrivacyMarkerTransactionCreationEnabled = false
   699  	stbBackend.ks = keystore
   700  	stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
   701  	stbBackend.poolNonce = 999
   702  
   703  	privateAccountAPI := NewPrivateAccountAPI(stbBackend, nil)
   704  
   705  	gas := hexutil.Uint64(999999)
   706  	nonce := hexutil.Uint64(123)
   707  	payload := hexutil.Bytes(([]byte("0x43d3e767000000000000000000000000000000000000000000000000000000000000000a"))[:])
   708  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   709  	txArgs := SendTxArgs{PrivateTxArgs: *privateTxArgs, From: fromAcct.Address, To: &toAcct.Address, Gas: &gas, Nonce: &nonce, Data: &payload}
   710  
   711  	_, err := privateAccountAPI.SendTransaction(arbitraryCtx, txArgs, "")
   712  
   713  	assert.NoError(err)
   714  	assert.True(stbBackend.sendTxCalled, "transaction was not sent")
   715  	assert.True(stbBackend.txThatWasSent.IsPrivate(), "must be a private transaction")
   716  	assert.Equal(fromAcct.Address, stbBackend.txThatWasSent.From(), "incorrect 'From' address on transaction")
   717  	assert.Equal(toAcct.Address, *stbBackend.txThatWasSent.To(), "incorrect 'To' address on transaction")
   718  	assert.Equal(uint64(123), stbBackend.txThatWasSent.Nonce(), "incorrect nonce on transaction")
   719  }
   720  
   721  func TestSubmitPrivateTransactionWithPrivacyMarkerEnabled(t *testing.T) {
   722  	assert := assert.New(t)
   723  
   724  	keystore, fromAcct, toAcct := createKeystore(t)
   725  
   726  	params.QuorumTestChainConfig.PrivacyPrecompileBlock = big.NewInt(0)
   727  	defer func() { params.QuorumTestChainConfig.PrivacyPrecompileBlock = nil }()
   728  
   729  	stbBackend := &StubBackend{}
   730  	stbBackend.multitenancySupported = false
   731  	stbBackend.isPrivacyMarkerTransactionCreationEnabled = true
   732  	stbBackend.ks = keystore
   733  	stbBackend.accountManager = accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: true}, stbBackend)
   734  
   735  	privateAccountAPI := NewPrivateAccountAPI(stbBackend, nil)
   736  
   737  	gas := hexutil.Uint64(999999)
   738  	nonce := hexutil.Uint64(123)
   739  	payload := hexutil.Bytes(([]byte("0x43d3e767000000000000000000000000000000000000000000000000000000000000000a"))[:])
   740  	privateTxArgs.PrivacyFlag = engine.PrivacyFlagStandardPrivate
   741  	txArgs := SendTxArgs{PrivateTxArgs: *privateTxArgs, From: fromAcct.Address, To: &toAcct.Address, Gas: &gas, Nonce: &nonce, Data: &payload}
   742  
   743  	_, err := privateAccountAPI.SendTransaction(arbitraryCtx, txArgs, "")
   744  
   745  	assert.NoError(err)
   746  	assert.True(stbBackend.sendTxCalled, "transaction was not sent")
   747  	assert.False(stbBackend.txThatWasSent.IsPrivate(), "transaction was private, instead of privacy marker transaction (public)")
   748  	assert.Equal(fromAcct.Address, stbBackend.txThatWasSent.From(), "expected privacy marker transaction to have same 'from' address as internal private tx")
   749  	assert.Equal(common.QuorumPrivacyPrecompileContractAddress(), *stbBackend.txThatWasSent.To(), "transaction 'To' address should be privacy marker precompile")
   750  	assert.Equal(uint64(nonce), stbBackend.txThatWasSent.Nonce(), "incorrect nonce on transaction")
   751  	assert.NotEqual(hexutil.Uint64(stbBackend.txThatWasSent.Gas()), gas, "privacy marker transaction should not have same gas value as internal private tx")
   752  }
   753  
   754  func TestSetRawTransactionPrivateFrom(t *testing.T) {
   755  	somePTMAddr := "some-ptm-addr"
   756  	psiID := types.PrivateStateIdentifier("myPSI")
   757  	mpsPTMAddrs := []string{somePTMAddr}
   758  
   759  	tests := []struct {
   760  		name                  string
   761  		receiveRawPrivateFrom string
   762  		argsPrivateFrom       string
   763  		wantPrivateFrom       string
   764  	}{
   765  		{
   766  			name:                  "receiveRawPrivateFromIfNoArgPrivateFrom",
   767  			receiveRawPrivateFrom: somePTMAddr,
   768  			argsPrivateFrom:       "",
   769  			wantPrivateFrom:       somePTMAddr,
   770  		},
   771  		{
   772  			name:                  "argPrivateFromOnly",
   773  			receiveRawPrivateFrom: "",
   774  			argsPrivateFrom:       somePTMAddr,
   775  			wantPrivateFrom:       somePTMAddr,
   776  		},
   777  		{
   778  			name:                  "equalArgAndReceiveRawPrivateFrom",
   779  			receiveRawPrivateFrom: somePTMAddr,
   780  			argsPrivateFrom:       somePTMAddr,
   781  			wantPrivateFrom:       somePTMAddr,
   782  		},
   783  	}
   784  
   785  	for _, tt := range tests {
   786  		t.Run(tt.name, func(t *testing.T) {
   787  			ctrl := gomock.NewController(t)
   788  			defer ctrl.Finish()
   789  
   790  			savedPTM := private.P
   791  			defer func() { private.P = savedPTM }()
   792  
   793  			mockPTM := private.NewMockPrivateTransactionManager(ctrl)
   794  			mockPTM.EXPECT().ReceiveRaw(gomock.Any()).Return(nil, somePTMAddr, nil, nil).Times(1)
   795  			private.P = mockPTM
   796  
   797  			psm := mps.NewPrivateStateMetadata(psiID, "", "", 0, mpsPTMAddrs)
   798  
   799  			mockPSMR := mps.NewMockPrivateStateMetadataResolver(ctrl)
   800  			mockPSMR.EXPECT().ResolveForUserContext(gomock.Any()).Return(psm, nil).Times(1)
   801  
   802  			b := &MPSStubBackend{
   803  				psmr: mockPSMR,
   804  			}
   805  
   806  			tx := types.NewTransaction(0, common.Address{}, nil, 0, nil, []byte("ptm-hash"))
   807  
   808  			args := &PrivateTxArgs{
   809  				PrivateFor:  []string{"some-ptm-recipient"},
   810  				PrivateFrom: tt.argsPrivateFrom,
   811  			}
   812  
   813  			err := args.SetRawTransactionPrivateFrom(context.Background(), b, tx)
   814  
   815  			require.NoError(t, err)
   816  			require.Equal(t, tt.wantPrivateFrom, args.PrivateFrom)
   817  		})
   818  	}
   819  }
   820  
   821  func TestSetRawTransactionPrivateFrom_DifferentArgPrivateFromAndReceiveRawPrivateFrom(t *testing.T) {
   822  	ctrl := gomock.NewController(t)
   823  	defer ctrl.Finish()
   824  
   825  	savedPTM := private.P
   826  	defer func() { private.P = savedPTM }()
   827  
   828  	receiveRawPrivateFrom := "some-ptm-addr"
   829  	argsPrivateFrom := "other-ptm-addr"
   830  
   831  	mockPTM := private.NewMockPrivateTransactionManager(ctrl)
   832  	mockPTM.EXPECT().ReceiveRaw(gomock.Any()).Return(nil, receiveRawPrivateFrom, nil, nil).Times(1)
   833  	private.P = mockPTM
   834  
   835  	b := &MPSStubBackend{}
   836  
   837  	tx := types.NewTransaction(0, common.Address{}, nil, 0, nil, []byte("ptm-hash"))
   838  
   839  	args := &PrivateTxArgs{
   840  		PrivateFor:  []string{"some-ptm-recipient"},
   841  		PrivateFrom: argsPrivateFrom,
   842  	}
   843  
   844  	err := args.SetRawTransactionPrivateFrom(context.Background(), b, tx)
   845  
   846  	require.EqualError(t, err, "The PrivateFrom address retrieved from the privacy manager does not match private PrivateFrom (other-ptm-addr) specified in transaction arguments.")
   847  }
   848  
   849  func TestSetRawTransactionPrivateFrom_ResolvePrivateFromIsNotMPSTenantAddr(t *testing.T) {
   850  	ctrl := gomock.NewController(t)
   851  	defer ctrl.Finish()
   852  
   853  	savedPTM := private.P
   854  	defer func() { private.P = savedPTM }()
   855  
   856  	receiveRawPrivateFrom := "some-ptm-addr"
   857  	psiID := types.PrivateStateIdentifier("myPSI")
   858  
   859  	mpsPTMAddrs := []string{"other-ptm-addr"}
   860  
   861  	mockPTM := private.NewMockPrivateTransactionManager(ctrl)
   862  	mockPTM.EXPECT().ReceiveRaw(gomock.Any()).Return(nil, receiveRawPrivateFrom, nil, nil).Times(1)
   863  	private.P = mockPTM
   864  
   865  	psm := mps.NewPrivateStateMetadata(psiID, "", "", 0, mpsPTMAddrs)
   866  
   867  	mockPSMR := mps.NewMockPrivateStateMetadataResolver(ctrl)
   868  	mockPSMR.EXPECT().ResolveForUserContext(gomock.Any()).Return(psm, nil).Times(1)
   869  
   870  	b := &MPSStubBackend{
   871  		psmr: mockPSMR,
   872  	}
   873  
   874  	tx := types.NewTransaction(0, common.Address{}, nil, 0, nil, []byte("ptm-hash"))
   875  
   876  	args := &PrivateTxArgs{
   877  		PrivateFor: []string{"some-ptm-recipient"},
   878  	}
   879  
   880  	err := args.SetRawTransactionPrivateFrom(context.Background(), b, tx)
   881  
   882  	require.EqualError(t, err, "The PrivateFrom address does not match the specified private state (myPSI)")
   883  }
   884  
   885  func createKeystore(t *testing.T) (*keystore.KeyStore, accounts.Account, accounts.Account) {
   886  	assert := assert.New(t)
   887  
   888  	keystore := keystore.NewKeyStore(filepath.Join(workdir, "keystore"), keystore.StandardScryptN, keystore.StandardScryptP)
   889  	fromAcct, err := keystore.NewAccount("")
   890  	assert.NoError(err)
   891  	toAcct, err := keystore.NewAccount("")
   892  	assert.NoError(err)
   893  
   894  	return keystore, fromAcct, toAcct
   895  }
   896  
   897  type StubBackend struct {
   898  	getEVMCalled                              bool
   899  	sendTxCalled                              bool
   900  	txThatWasSent                             *types.Transaction
   901  	mockAccountExtraDataStateGetter           *vm.MockAccountExtraDataStateGetter
   902  	multitenancySupported                     bool
   903  	isPrivacyMarkerTransactionCreationEnabled bool
   904  	accountManager                            *accounts.Manager
   905  	ks                                        *keystore.KeyStore
   906  	poolNonce                                 uint64
   907  
   908  	IstanbulBlock     *big.Int
   909  	CurrentHeadNumber *big.Int
   910  }
   911  
   912  func (sb *StubBackend) CurrentHeader() *types.Header {
   913  	return &types.Header{Number: sb.CurrentHeadNumber}
   914  }
   915  
   916  func (sb *StubBackend) Engine() consensus.Engine {
   917  	panic("implement me")
   918  }
   919  
   920  func (sb *StubBackend) SupportsMultitenancy(rpcCtx context.Context) (*proto.PreAuthenticatedAuthenticationToken, bool) {
   921  	return nil, false
   922  }
   923  
   924  func (sb *StubBackend) AccountExtraDataStateGetterByNumber(context.Context, rpc.BlockNumber) (vm.AccountExtraDataStateGetter, error) {
   925  	return sb.mockAccountExtraDataStateGetter, nil
   926  }
   927  
   928  func (sb *StubBackend) IsAuthorized(authToken *proto.PreAuthenticatedAuthenticationToken, attributes ...*multitenancy.PrivateStateSecurityAttribute) (bool, error) {
   929  	panic("implement me")
   930  }
   931  
   932  func (sb *StubBackend) GetEVM(ctx context.Context, msg core.Message, state vm.MinimalApiState, header *types.Header) (*vm.EVM, func() error, error) {
   933  	sb.getEVMCalled = true
   934  	vmCtx := core.NewEVMBlockContext(&types.Header{
   935  		Coinbase:   arbitraryFrom,
   936  		Number:     arbitraryCurrentBlockNumber,
   937  		Time:       0,
   938  		Difficulty: big.NewInt(0),
   939  		GasLimit:   0,
   940  	}, nil, &arbitraryFrom)
   941  	txCtx := core.NewEVMTxContext(msg)
   942  	vmError := func() error {
   943  		return nil
   944  	}
   945  	config := params.QuorumTestChainConfig
   946  	config.IstanbulBlock = sb.IstanbulBlock
   947  	return vm.NewEVM(vmCtx, txCtx, publicStateDB, privateStateDB, config, vm.Config{}), vmError, nil
   948  }
   949  
   950  func (sb *StubBackend) CurrentBlock() *types.Block {
   951  	return types.NewBlock(&types.Header{
   952  		Number: arbitraryCurrentBlockNumber,
   953  	}, nil, nil, nil, new(trie.Trie))
   954  }
   955  
   956  func (sb *StubBackend) Downloader() *downloader.Downloader {
   957  	panic("implement me")
   958  }
   959  
   960  func (sb *StubBackend) ProtocolVersion() int {
   961  	panic("implement me")
   962  }
   963  
   964  func (sb *StubBackend) SuggestPrice(ctx context.Context) (*big.Int, error) {
   965  	return big.NewInt(0), nil
   966  }
   967  
   968  func (sb *StubBackend) ChainDb() ethdb.Database {
   969  	panic("implement me")
   970  }
   971  
   972  func (sb *StubBackend) EventMux() *event.TypeMux {
   973  	panic("implement me")
   974  }
   975  
   976  func (sb *StubBackend) Wallets() []accounts.Wallet {
   977  	return sb.ks.Wallets()
   978  }
   979  
   980  func (sb *StubBackend) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription {
   981  	return nil
   982  }
   983  
   984  func (sb *StubBackend) AccountManager() *accounts.Manager {
   985  	return sb.accountManager
   986  }
   987  
   988  func (sb *StubBackend) ExtRPCEnabled() bool {
   989  	panic("implement me")
   990  }
   991  
   992  func (sb *StubBackend) CallTimeOut() time.Duration {
   993  	panic("implement me")
   994  }
   995  
   996  func (sb *StubBackend) RPCTxFeeCap() float64 {
   997  	return 25000000
   998  }
   999  
  1000  func (sb *StubBackend) RPCGasCap() uint64 {
  1001  	return 25000000
  1002  }
  1003  
  1004  func (sb *StubBackend) SetHead(number uint64) {
  1005  	panic("implement me")
  1006  }
  1007  
  1008  func (sb *StubBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) {
  1009  	panic("implement me")
  1010  }
  1011  
  1012  func (sb *StubBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
  1013  	panic("implement me")
  1014  }
  1015  
  1016  func (sb *StubBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) {
  1017  	panic("implement me")
  1018  }
  1019  
  1020  func (sb *StubBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {
  1021  	panic("implement me")
  1022  }
  1023  
  1024  func (sb *StubBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
  1025  	panic("implement me")
  1026  }
  1027  
  1028  func (sb *StubBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) {
  1029  	return sb.CurrentBlock(), nil
  1030  }
  1031  
  1032  func (sb *StubBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (vm.MinimalApiState, *types.Header, error) {
  1033  	return &StubMinimalApiState{}, nil, nil
  1034  }
  1035  
  1036  func (sb *StubBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (vm.MinimalApiState, *types.Header, error) {
  1037  	return &StubMinimalApiState{}, nil, nil
  1038  }
  1039  
  1040  func (sb *StubBackend) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) {
  1041  	panic("implement me")
  1042  }
  1043  
  1044  func (sb *StubBackend) GetTd(ctx context.Context, hash common.Hash) *big.Int {
  1045  	panic("implement me")
  1046  }
  1047  
  1048  func (sb *StubBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {
  1049  	panic("implement me")
  1050  }
  1051  
  1052  func (sb *StubBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription {
  1053  	panic("implement me")
  1054  }
  1055  
  1056  func (sb *StubBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription {
  1057  	panic("implement me")
  1058  }
  1059  
  1060  func (sb *StubBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error {
  1061  	sb.sendTxCalled = true
  1062  	sb.txThatWasSent = signedTx
  1063  	return nil
  1064  }
  1065  
  1066  func (sb *StubBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) {
  1067  	panic("implement me")
  1068  }
  1069  
  1070  func (sb *StubBackend) GetPoolTransactions() (types.Transactions, error) {
  1071  	panic("implement me")
  1072  }
  1073  
  1074  func (sb *StubBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction {
  1075  	panic("implement me")
  1076  }
  1077  
  1078  func (sb *StubBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) {
  1079  	return sb.poolNonce, nil
  1080  }
  1081  
  1082  func (sb *StubBackend) Stats() (pending int, queued int) {
  1083  	panic("implement me")
  1084  }
  1085  
  1086  func (sb *StubBackend) TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) {
  1087  	panic("implement me")
  1088  }
  1089  
  1090  func (sb *StubBackend) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription {
  1091  	panic("implement me")
  1092  }
  1093  
  1094  func (sb *StubBackend) BloomStatus() (uint64, uint64) {
  1095  	panic("implement me")
  1096  }
  1097  
  1098  func (sb *StubBackend) GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) {
  1099  	panic("implement me")
  1100  }
  1101  
  1102  func (sb *StubBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) {
  1103  	panic("implement me")
  1104  }
  1105  
  1106  func (sb *StubBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {
  1107  	panic("implement me")
  1108  }
  1109  
  1110  func (sb *StubBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
  1111  	panic("implement me")
  1112  }
  1113  
  1114  func (sb *StubBackend) ChainConfig() *params.ChainConfig {
  1115  	return params.QuorumTestChainConfig
  1116  }
  1117  
  1118  func (sb *StubBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription {
  1119  	panic("implement me")
  1120  }
  1121  
  1122  func (sb *StubBackend) PSMR() mps.PrivateStateMetadataResolver {
  1123  	panic("implement me")
  1124  }
  1125  
  1126  type MPSStubBackend struct {
  1127  	StubBackend
  1128  	psmr mps.PrivateStateMetadataResolver
  1129  }
  1130  
  1131  func (msb *MPSStubBackend) ChainConfig() *params.ChainConfig {
  1132  	return params.QuorumMPSTestChainConfig
  1133  }
  1134  
  1135  func (sb *MPSStubBackend) PSMR() mps.PrivateStateMetadataResolver {
  1136  	return sb.psmr
  1137  }
  1138  
  1139  func (sb *StubBackend) IsPrivacyMarkerTransactionCreationEnabled() bool {
  1140  	return sb.isPrivacyMarkerTransactionCreationEnabled
  1141  }
  1142  
  1143  type StubMinimalApiState struct {
  1144  }
  1145  
  1146  func (StubMinimalApiState) GetBalance(addr common.Address) *big.Int {
  1147  	panic("implement me")
  1148  }
  1149  
  1150  func (StubMinimalApiState) SetBalance(addr common.Address, balance *big.Int) {
  1151  	panic("implement me")
  1152  }
  1153  
  1154  func (StubMinimalApiState) GetCode(addr common.Address) []byte {
  1155  	return nil
  1156  }
  1157  
  1158  func (StubMinimalApiState) GetState(a common.Address, b common.Hash) common.Hash {
  1159  	panic("implement me")
  1160  }
  1161  
  1162  func (StubMinimalApiState) GetNonce(addr common.Address) uint64 {
  1163  	panic("implement me")
  1164  }
  1165  
  1166  func (StubMinimalApiState) SetNonce(addr common.Address, nonce uint64) {
  1167  	panic("implement me")
  1168  }
  1169  
  1170  func (StubMinimalApiState) SetCode(common.Address, []byte) {
  1171  	panic("implement me")
  1172  }
  1173  
  1174  func (StubMinimalApiState) GetPrivacyMetadata(addr common.Address) (*state.PrivacyMetadata, error) {
  1175  	if addr == arbitraryMandatoryRecipientsSimpleStorageContractAddress {
  1176  		return &state.PrivacyMetadata{
  1177  			CreationTxHash: arbitraryMandatoryRecipientsContractEncryptedPayloadHash,
  1178  			PrivacyFlag:    2,
  1179  		}, nil
  1180  	}
  1181  	return &state.PrivacyMetadata{
  1182  		CreationTxHash: arbitrarySimpleStorageContractEncryptedPayloadHash,
  1183  		PrivacyFlag:    1,
  1184  	}, nil
  1185  }
  1186  
  1187  func (StubMinimalApiState) GetManagedParties(addr common.Address) ([]string, error) {
  1188  	panic("implement me")
  1189  }
  1190  
  1191  func (StubMinimalApiState) GetRLPEncodedStateObject(addr common.Address) ([]byte, error) {
  1192  	panic("implement me")
  1193  }
  1194  
  1195  func (StubMinimalApiState) GetProof(common.Address) ([][]byte, error) {
  1196  	panic("implement me")
  1197  }
  1198  
  1199  func (StubMinimalApiState) GetStorageProof(common.Address, common.Hash) ([][]byte, error) {
  1200  	panic("implement me")
  1201  }
  1202  
  1203  func (StubMinimalApiState) StorageTrie(addr common.Address) state.Trie {
  1204  	panic("implement me")
  1205  }
  1206  
  1207  func (StubMinimalApiState) Error() error {
  1208  	panic("implement me")
  1209  }
  1210  
  1211  func (StubMinimalApiState) GetCodeHash(common.Address) common.Hash {
  1212  	panic("implement me")
  1213  }
  1214  
  1215  func (StubMinimalApiState) SetState(common.Address, common.Hash, common.Hash) {
  1216  	panic("implement me")
  1217  }
  1218  
  1219  func (StubMinimalApiState) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) {
  1220  	panic("implement me")
  1221  }
  1222  
  1223  type StubPrivateTransactionManager struct {
  1224  	notinuse.PrivateTransactionManager
  1225  	creation bool
  1226  }
  1227  
  1228  func (sptm *StubPrivateTransactionManager) Send(data []byte, from string, to []string, extra *engine.ExtraMetadata) (string, []string, common.EncryptedPayloadHash, error) {
  1229  	return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash, nil
  1230  }
  1231  
  1232  func (sptm *StubPrivateTransactionManager) EncryptPayload(data []byte, from string, to []string, extra *engine.ExtraMetadata) ([]byte, error) {
  1233  	return nil, engine.ErrPrivateTxManagerNotSupported
  1234  }
  1235  
  1236  func (sptm *StubPrivateTransactionManager) DecryptPayload(payload common.DecryptRequest) ([]byte, *engine.ExtraMetadata, error) {
  1237  	return nil, nil, engine.ErrPrivateTxManagerNotSupported
  1238  }
  1239  
  1240  func (sptm *StubPrivateTransactionManager) StoreRaw(data []byte, from string) (common.EncryptedPayloadHash, error) {
  1241  	return arbitrarySimpleStorageContractEncryptedPayloadHash, nil
  1242  }
  1243  
  1244  func (sptm *StubPrivateTransactionManager) SendSignedTx(data common.EncryptedPayloadHash, to []string, extra *engine.ExtraMetadata) (string, []string, []byte, error) {
  1245  	return "", nil, arbitrarySimpleStorageContractEncryptedPayloadHash.Bytes(), nil
  1246  }
  1247  
  1248  func (sptm *StubPrivateTransactionManager) ReceiveRaw(data common.EncryptedPayloadHash) ([]byte, string, *engine.ExtraMetadata, error) {
  1249  	if sptm.creation {
  1250  		return hexutil.MustDecode("0x6060604052341561000f57600080fd5b604051602080610149833981016040528080519060200190919050505b806000819055505b505b610104806100456000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605157806360fe47b11460775780636d4ce63c146097575b600080fd5b3415605b57600080fd5b606160bd565b6040518082815260200191505060405180910390f35b3415608157600080fd5b6095600480803590602001909190505060c3565b005b341560a157600080fd5b60a760ce565b6040518082815260200191505060405180910390f35b60005481565b806000819055505b50565b6000805490505b905600a165627a7a72305820d5851baab720bba574474de3d09dbeaabc674a15f4dd93b974908476542c23f00029"), "", nil, nil
  1251  	} else {
  1252  		return hexutil.MustDecode("0x60fe47b1000000000000000000000000000000000000000000000000000000000000000e"), "", nil, nil
  1253  	}
  1254  }
  1255  
  1256  func (sptm *StubPrivateTransactionManager) HasFeature(f engine.PrivateTransactionManagerFeature) bool {
  1257  	return true
  1258  }