github.com/leovct/zkevm-bridge-service@v0.4.4/bridgectrl/bridgectrl_test.go (about)

     1  package bridgectrl
     2  
     3  import (
     4  	"context"
     5  	"encoding/hex"
     6  	"encoding/json"
     7  	"math/big"
     8  	"os"
     9  	"path"
    10  	"runtime"
    11  	"testing"
    12  
    13  	"github.com/0xPolygonHermez/zkevm-bridge-service/db/pgstorage"
    14  	"github.com/0xPolygonHermez/zkevm-bridge-service/etherman"
    15  	"github.com/0xPolygonHermez/zkevm-bridge-service/test/vectors"
    16  	"github.com/0xPolygonHermez/zkevm-bridge-service/utils"
    17  	"github.com/ethereum/go-ethereum/common"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func init() {
    23  	// Change dir to project root
    24  	// This is important because we have relative paths to files containing test vectors
    25  	_, filename, _, _ := runtime.Caller(0)
    26  	dir := path.Join(path.Dir(filename), "../")
    27  	err := os.Chdir(dir)
    28  	if err != nil {
    29  		panic(err)
    30  	}
    31  }
    32  
    33  func TestBridgeTree(t *testing.T) {
    34  	data, err := os.ReadFile("test/vectors/src/deposit-raw.json")
    35  	require.NoError(t, err)
    36  
    37  	var testVectors []vectors.DepositVectorRaw
    38  	err = json.Unmarshal(data, &testVectors)
    39  	require.NoError(t, err)
    40  
    41  	dbCfg := pgstorage.NewConfigFromEnv()
    42  	err = pgstorage.InitOrReset(dbCfg)
    43  	require.NoError(t, err)
    44  
    45  	cfg := Config{
    46  		Height: uint8(32), //nolint:gomnd
    47  		Store:  "postgres",
    48  	}
    49  
    50  	store, err := pgstorage.NewPostgresStorage(dbCfg)
    51  	require.NoError(t, err)
    52  	ctx := context.Background()
    53  	bt, err := NewBridgeController(ctx, cfg, []uint{0, 1000}, store)
    54  	require.NoError(t, err)
    55  
    56  	t.Run("Test adding deposit for the bridge tree", func(t *testing.T) {
    57  		for i, testVector := range testVectors {
    58  			block := &etherman.Block{
    59  				BlockNumber: uint64(i + 1),
    60  				BlockHash:   utils.GenerateRandomHash(),
    61  				ParentHash:  common.Hash{},
    62  			}
    63  			blockID, err := store.AddBlock(context.TODO(), block, nil)
    64  			require.NoError(t, err)
    65  			amount, _ := new(big.Int).SetString(testVector.Amount, 0)
    66  			deposit := &etherman.Deposit{
    67  				LeafType:           0,
    68  				OriginalNetwork:    testVector.OriginalNetwork,
    69  				OriginalAddress:    common.HexToAddress(testVector.TokenAddress),
    70  				Amount:             amount,
    71  				DestinationNetwork: testVector.DestinationNetwork,
    72  				DestinationAddress: common.HexToAddress(testVector.DestinationAddress),
    73  				BlockID:            blockID,
    74  				DepositCount:       uint(i),
    75  				Metadata:           common.FromHex(testVector.Metadata),
    76  			}
    77  			leafHash := hashDeposit(deposit)
    78  			assert.Equal(t, testVector.ExpectedHash, hex.EncodeToString(leafHash[:]))
    79  			depositID, err := store.AddDeposit(ctx, deposit, nil)
    80  			require.NoError(t, err)
    81  			err = bt.AddDeposit(ctx, deposit, depositID, nil)
    82  			require.NoError(t, err)
    83  
    84  			// test reorg
    85  			orgRoot, err := bt.exitTrees[0].store.GetRoot(ctx, uint(i), 0, nil)
    86  			require.NoError(t, err)
    87  			require.NoError(t, store.Reset(ctx, uint64(i), deposit.NetworkID, nil))
    88  			err = bt.ReorgMT(ctx, uint(i), testVectors[i].OriginalNetwork, nil)
    89  			require.NoError(t, err)
    90  			blockID, err = store.AddBlock(context.TODO(), block, nil)
    91  			require.NoError(t, err)
    92  			deposit.BlockID = blockID
    93  			depositID, err = store.AddDeposit(ctx, deposit, nil)
    94  			require.NoError(t, err)
    95  			err = bt.AddDeposit(ctx, deposit, depositID, nil)
    96  			require.NoError(t, err)
    97  			newRoot, err := bt.exitTrees[0].store.GetRoot(ctx, uint(i), 0, nil)
    98  			require.NoError(t, err)
    99  			assert.Equal(t, orgRoot, newRoot)
   100  
   101  			var roots [2][]byte
   102  			roots[0], err = bt.exitTrees[0].getRoot(ctx, nil)
   103  			require.NoError(t, err)
   104  			roots[1], err = bt.exitTrees[1].getRoot(ctx, nil)
   105  			require.NoError(t, err)
   106  
   107  			err = store.AddGlobalExitRoot(context.TODO(), &etherman.GlobalExitRoot{
   108  				BlockNumber:    uint64(i + 1),
   109  				GlobalExitRoot: Hash(common.BytesToHash(roots[0]), common.BytesToHash(roots[1])),
   110  				ExitRoots:      []common.Hash{common.BytesToHash(roots[0]), common.BytesToHash(roots[1])},
   111  				BlockID:        blockID,
   112  			}, nil)
   113  			require.NoError(t, err)
   114  
   115  			isUpdated, err := store.AddTrustedGlobalExitRoot(context.TODO(), &etherman.GlobalExitRoot{
   116  				BlockNumber:    0,
   117  				GlobalExitRoot: Hash(common.BytesToHash(roots[0]), common.BytesToHash(roots[1])),
   118  				ExitRoots:      []common.Hash{common.BytesToHash(roots[0]), common.BytesToHash(roots[1])},
   119  				BlockID:        blockID,
   120  			}, nil)
   121  			require.True(t, isUpdated)
   122  			require.NoError(t, err)
   123  		}
   124  	})
   125  }