|
4 | 4 | package jsonrpctest
|
5 | 5 |
|
6 | 6 | import (
|
| 7 | + "bytes" |
7 | 8 | "context"
|
| 9 | + "crypto/ecdsa" |
8 | 10 | "encoding/hex"
|
9 | 11 | "encoding/json"
|
| 12 | + "fmt" |
10 | 13 | "math/big"
|
11 | 14 | "slices"
|
12 | 15 | "strings"
|
@@ -624,20 +627,136 @@ func TestRPCTraceEVMDeposit(t *testing.T) {
|
624 | 627 | require.NoError(t, err)
|
625 | 628 | require.EqualValues(t, types.ReceiptStatusSuccessful, rc.Status)
|
626 | 629 |
|
627 |
| - trace, err := env.traceTransactionWithCallTracer(tx.Hash()) |
| 630 | + t.Run("callTracer_tx", func(t *testing.T) { |
| 631 | + var trace jsonrpc.CallFrame |
| 632 | + trace, err = env.traceTransactionWithCallTracer(tx.Hash()) |
| 633 | + require.NoError(t, err) |
| 634 | + require.Equal(t, evmAddr.String(), trace.To.String()) |
| 635 | + require.Equal(t, hexutil.EncodeUint64(isc.NewAssetsBaseTokens(1000).BaseTokens*1e12), trace.Value.String()) |
| 636 | + }) |
| 637 | + |
| 638 | + t.Run("prestateTracer_tx", func(t *testing.T) { |
| 639 | + var prestate jsonrpc.PrestateAccountMap |
| 640 | + prestate, err = env.traceTransactionWithPrestate(tx.Hash()) |
| 641 | + require.NoError(t, err) |
| 642 | + require.Empty(t, prestate) |
| 643 | + }) |
| 644 | + |
| 645 | + t.Run("prestateTracerDiff_tx", func(t *testing.T) { |
| 646 | + var prestateDiff jsonrpc.PrestateDiffResult |
| 647 | + prestateDiff, err = env.traceTransactionWithPrestateDiff(tx.Hash()) |
| 648 | + require.NoError(t, err) |
| 649 | + require.Empty(t, prestateDiff.Pre) |
| 650 | + require.Empty(t, prestateDiff.Post) |
| 651 | + }) |
| 652 | + |
| 653 | + t.Run("callTracer_block", func(t *testing.T) { |
| 654 | + callTracer := "callTracer" |
| 655 | + var res1 json.RawMessage |
| 656 | + // we have to use the raw client, because the normal client does not support debug methods |
| 657 | + err = env.RawClient.CallContext( |
| 658 | + context.Background(), |
| 659 | + &res1, |
| 660 | + "debug_traceBlockByNumber", |
| 661 | + hexutil.Uint64(env.BlockNumber()).String(), |
| 662 | + tracers.TraceConfig{Tracer: &callTracer}, |
| 663 | + ) |
| 664 | + require.NoError(t, err) |
| 665 | + |
| 666 | + traces := make([]jsonrpc.TxTraceResult, 0) |
| 667 | + err = json.Unmarshal(res1, &traces) |
| 668 | + require.NoError(t, err) |
| 669 | + require.Len(t, traces, 1) |
| 670 | + require.Equal(t, tx.Hash(), traces[0].TxHash) |
| 671 | + |
| 672 | + cs := jsonrpc.CallFrame{} |
| 673 | + err = json.Unmarshal(traces[0].Result, &cs) |
| 674 | + require.NoError(t, err) |
| 675 | + require.Equal(t, evmAddr.String(), cs.To.String()) |
| 676 | + require.Equal(t, hexutil.EncodeUint64(isc.NewAssetsBaseTokens(1000).BaseTokens*1e12), cs.Value.String()) |
| 677 | + }) |
| 678 | + |
| 679 | + t.Run("prestateTracer_block", func(t *testing.T) { |
| 680 | + tracer := "prestateTracer" |
| 681 | + var res1 json.RawMessage |
| 682 | + // we have to use the raw client, because the normal client does not support debug methods |
| 683 | + err = env.RawClient.CallContext( |
| 684 | + context.Background(), |
| 685 | + &res1, |
| 686 | + "debug_traceBlockByNumber", |
| 687 | + hexutil.Uint64(env.BlockNumber()).String(), |
| 688 | + tracers.TraceConfig{Tracer: &tracer}, |
| 689 | + ) |
| 690 | + require.NoError(t, err) |
| 691 | + |
| 692 | + traces := make([]jsonrpc.TxTraceResult, 0) |
| 693 | + err = json.Unmarshal(res1, &traces) |
| 694 | + require.NoError(t, err) |
| 695 | + require.Len(t, traces, 1) |
| 696 | + require.Equal(t, tx.Hash(), traces[0].TxHash) |
| 697 | + |
| 698 | + prestate := jsonrpc.PrestateAccountMap{} |
| 699 | + err = json.Unmarshal(traces[0].Result, &prestate) |
| 700 | + require.NoError(t, err) |
| 701 | + require.Empty(t, prestate) |
| 702 | + }) |
| 703 | +} |
| 704 | + |
| 705 | +func addNRequests(n int, env *soloTestEnv, creator *ecdsa.PrivateKey, creatorAddress common.Address, contractABI abi.ABI, contractAddress common.Address) { |
| 706 | + rqs := make([]isc.Request, 0, n) |
| 707 | + for i := 0; i < n; i++ { |
| 708 | + tx1 := types.MustSignNewTx(creator, types.NewEIP155Signer(big.NewInt(int64(env.ChainID))), |
| 709 | + &types.LegacyTx{ |
| 710 | + Nonce: env.NonceAt(creatorAddress) + uint64(i), |
| 711 | + To: &contractAddress, |
| 712 | + Value: big.NewInt(123), |
| 713 | + Gas: 100000, |
| 714 | + GasPrice: big.NewInt(10000000000), |
| 715 | + Data: lo.Must(contractABI.Pack("sendTo", common.Address{0x1}, big.NewInt(2))), |
| 716 | + }) |
| 717 | + |
| 718 | + req1 := lo.Must(isc.NewEVMOffLedgerTxRequest(env.soloChain.ChainID, tx1)) |
| 719 | + rqs = append(rqs, req1) |
| 720 | + } |
| 721 | + |
| 722 | + env.soloChain.WaitForRequestsMark() |
| 723 | + env.soloChain.Env.AddRequestsToMempool(env.soloChain, rqs) |
| 724 | +} |
| 725 | + |
| 726 | +// TestRPCTraceBlockForLargeN requires a large number of requests to be added to the mempool, for that set solo.MaxRequestsInBlock to a large value (>500) |
| 727 | +func TestRPCTraceBlockForLargeN(t *testing.T) { |
| 728 | + t.Skip("skipping because it requires solo parameters to be set") |
| 729 | + |
| 730 | + n := 400 |
| 731 | + env := newSoloTestEnv(t) |
| 732 | + creator, creatorAddress := env.soloChain.NewEthereumAccountWithL2Funds() |
| 733 | + contractABI, err := abi.JSON(strings.NewReader(evmtest.ISCTestContractABI)) |
628 | 734 | require.NoError(t, err)
|
| 735 | + _, _, contractAddress := env.DeployEVMContract(creator, contractABI, evmtest.ISCTestContractBytecode) |
| 736 | + |
| 737 | + addNRequests(n, env, creator, creatorAddress, contractABI, contractAddress) |
629 | 738 |
|
630 |
| - require.Equal(t, evmAddr.String(), trace.To.String()) |
631 |
| - require.Equal(t, hexutil.EncodeUint64(isc.NewAssetsBaseTokens(1000).BaseTokens*1e12), trace.Value.String()) |
| 739 | + require.True(t, env.soloChain.WaitForRequestsThrough(n, 5*time.Minute)) |
632 | 740 |
|
633 |
| - prestate, err := env.traceTransactionWithPrestate(tx.Hash()) |
| 741 | + bi := env.soloChain.GetLatestBlockInfo() |
| 742 | + require.EqualValues(t, n, bi.NumSuccessfulRequests) |
| 743 | + |
| 744 | + callTracer := "callTracer" |
| 745 | + var res1 json.RawMessage |
| 746 | + // we have to use the raw client, because the normal client does not support debug methods |
| 747 | + err = env.RawClient.CallContext( |
| 748 | + context.Background(), |
| 749 | + &res1, |
| 750 | + "debug_traceBlockByNumber", |
| 751 | + hexutil.Uint64(env.BlockNumber()).String(), |
| 752 | + tracers.TraceConfig{Tracer: &callTracer}, |
| 753 | + ) |
634 | 754 | require.NoError(t, err)
|
635 |
| - require.Empty(t, prestate) |
636 | 755 |
|
637 |
| - prestateDiff, err := env.traceTransactionWithPrestateDiff(tx.Hash()) |
| 756 | + var prettyJSON bytes.Buffer |
| 757 | + err = json.Indent(&prettyJSON, res1, "", " ") |
638 | 758 | require.NoError(t, err)
|
639 |
| - require.Empty(t, prestateDiff.Pre) |
640 |
| - require.Empty(t, prestateDiff.Post) |
| 759 | + fmt.Println(prettyJSON.String()) |
641 | 760 | }
|
642 | 761 |
|
643 | 762 | func TestRPCTraceBlock(t *testing.T) {
|
|
0 commit comments