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 := ðerman.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 := ðerman.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(), ðerman.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(), ðerman.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 }