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

     1  package etherman
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"math/big"
     7  
     8  	"github.com/0xPolygonHermez/zkevm-bridge-service/log"
     9  	mockbridge "github.com/0xPolygonHermez/zkevm-bridge-service/test/mocksmartcontracts/polygonzkevmbridge"
    10  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/mockpolygonrollupmanager"
    11  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/mockverifier"
    12  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/pol"
    13  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonrollupmanager"
    14  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm"
    15  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge"
    16  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot"
    17  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/proxy"
    18  	"github.com/ethereum/go-ethereum/accounts/abi/bind"
    19  	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
    20  	"github.com/ethereum/go-ethereum/common"
    21  	"github.com/ethereum/go-ethereum/core"
    22  	"github.com/ethereum/go-ethereum/crypto"
    23  )
    24  
    25  // NewSimulatedEtherman creates an etherman that uses a simulated blockchain. It's important to notice that the ChainID of the auth
    26  // must be 1337. The address that holds the auth will have an initial balance of 10 ETH
    27  func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (*Client, *backends.SimulatedBackend, common.Address, *polygonzkevmbridge.Polygonzkevmbridge, *polygonzkevm.Polygonzkevm, error) {
    28  	if auth == nil {
    29  		// read only client
    30  		return &Client{}, nil, common.Address{}, nil, nil, nil
    31  	}
    32  	// 10000000 ETH in wei
    33  	balance, _ := new(big.Int).SetString("10000000000000000000000000", 10) //nolint:gomnd
    34  	address := auth.From
    35  	genesisAlloc := map[common.Address]core.GenesisAccount{
    36  		address: {
    37  			Balance: balance,
    38  		},
    39  	}
    40  	blockGasLimit := uint64(999999999999999999) //nolint:gomnd
    41  	client := backends.NewSimulatedBackend(genesisAlloc, blockGasLimit)
    42  
    43  	// Deploy contracts
    44  	const polDecimalPlaces = 18
    45  	totalSupply, _ := new(big.Int).SetString("10000000000000000000000000000", 10) //nolint:gomnd
    46  	polAddr, _, polContract, err := pol.DeployPol(auth, client, "Pol Token", "POL", polDecimalPlaces, totalSupply)
    47  	if err != nil {
    48  		log.Error("error: ", err)
    49  		return nil, nil, common.Address{}, nil, nil, err
    50  	}
    51  	rollupVerifierAddr, _, _, err := mockverifier.DeployMockverifier(auth, client)
    52  	if err != nil {
    53  		return nil, nil, common.Address{}, nil, nil, err
    54  	}
    55  	nonce, err := client.PendingNonceAt(context.TODO(), auth.From)
    56  	if err != nil {
    57  		log.Error("error: ", err)
    58  		return nil, nil, common.Address{}, nil, nil, err
    59  	}
    60  	const posBridge = 3
    61  	calculatedBridgeAddr := crypto.CreateAddress(auth.From, nonce+posBridge)
    62  	const posRollupManager = 4
    63  	calculatedRollupManagerAddr := crypto.CreateAddress(auth.From, nonce+posRollupManager)
    64  	genesis := common.HexToHash("0xfd3434cd8f67e59d73488a2b8da242dd1f02849ea5dd99f0ca22c836c3d5b4a9") // Random value. Needs to be different to 0x0
    65  	exitManagerAddr, _, globalExitRoot, err := polygonzkevmglobalexitroot.DeployPolygonzkevmglobalexitroot(auth, client, calculatedRollupManagerAddr, calculatedBridgeAddr)
    66  	if err != nil {
    67  		log.Error("error: ", err)
    68  		return nil, nil, common.Address{}, nil, nil, err
    69  	}
    70  	implementationBridgeAddr, _, _, err := mockbridge.DeployPolygonzkevmbridge(auth, client)
    71  	if err != nil {
    72  		log.Error("error: ", err)
    73  		return nil, nil, common.Address{}, nil, nil, err
    74  	}
    75  
    76  	implementationMockRollupManagerAddr, _, _, err := mockpolygonrollupmanager.DeployMockpolygonrollupmanager(auth, client, exitManagerAddr, polAddr, calculatedBridgeAddr)
    77  	if err != nil {
    78  		log.Error("error: ", err)
    79  		return nil, nil, common.Address{}, nil, nil, err
    80  	}
    81  	bridgeAddr, _, _, err := proxy.DeployProxy(auth, client, implementationBridgeAddr, implementationBridgeAddr, []byte{})
    82  	if err != nil {
    83  		log.Error("error: ", err)
    84  		return nil, nil, common.Address{}, nil, nil, err
    85  	}
    86  	mockRollupManagerAddr, _, _, err := proxy.DeployProxy(auth, client, implementationMockRollupManagerAddr, implementationMockRollupManagerAddr, []byte{})
    87  	if err != nil {
    88  		log.Error("error: ", err)
    89  		return nil, nil, common.Address{}, nil, nil, err
    90  	}
    91  	if calculatedRollupManagerAddr != mockRollupManagerAddr {
    92  		return nil, nil, common.Address{}, nil, nil, fmt.Errorf("RollupManagerAddr (%s) is different from the expected contract address (%s)",
    93  			mockRollupManagerAddr.String(), calculatedRollupManagerAddr.String())
    94  	}
    95  	initZkevmAddr, _, _, err := polygonzkevm.DeployPolygonzkevm(auth, client, exitManagerAddr, polAddr, bridgeAddr, mockRollupManagerAddr)
    96  	if err != nil {
    97  		log.Error("error: ", err)
    98  		return nil, nil, common.Address{}, nil, nil, err
    99  	}
   100  	mockRollupManager, err := mockpolygonrollupmanager.NewMockpolygonrollupmanager(mockRollupManagerAddr, client)
   101  	if err != nil {
   102  		log.Error("error: ", err)
   103  		return nil, nil, common.Address{}, nil, nil, err
   104  	}
   105  	br, err := polygonzkevmbridge.NewPolygonzkevmbridge(bridgeAddr, client)
   106  	if err != nil {
   107  		log.Error("error: ", err)
   108  		return nil, nil, common.Address{}, nil, nil, err
   109  	}
   110  	_, err = br.Initialize(auth, 0, common.Address{}, 0, exitManagerAddr, mockRollupManagerAddr, []byte{})
   111  	if err != nil {
   112  		log.Error("error: ", err)
   113  		return nil, nil, common.Address{}, nil, nil, err
   114  	}
   115  	_, err = mockRollupManager.Initialize(auth, auth.From, 10000, 10000, auth.From, auth.From, auth.From, common.Address{}, common.Address{}, 0, 0) //nolint:gomnd
   116  	if err != nil {
   117  		log.Error("error: ", err)
   118  		return nil, nil, common.Address{}, nil, nil, err
   119  	}
   120  	_, err = mockRollupManager.AddNewRollupType(auth, initZkevmAddr, rollupVerifierAddr, 6, 0, genesis, "PolygonZkEvm Rollup") //nolint:gomnd
   121  	if err != nil {
   122  		log.Error("error: ", err)
   123  		return nil, nil, common.Address{}, nil, nil, err
   124  	}
   125  	client.Commit()
   126  
   127  	rollUpTypeID, err := mockRollupManager.RollupTypeCount(&bind.CallOpts{Pending: false})
   128  	if err != nil {
   129  		log.Error("error: ", err)
   130  		return nil, nil, common.Address{}, nil, nil, err
   131  	}
   132  	var zkevmChainID uint64 = 100
   133  	_, err = mockRollupManager.CreateNewRollup(auth, rollUpTypeID, zkevmChainID, auth.From, auth.From, common.Address{}, "http://localhost", "PolygonZkEvm Rollup")
   134  	if err != nil {
   135  		log.Error("error: ", err)
   136  		return nil, nil, common.Address{}, nil, nil, err
   137  	}
   138  	client.Commit()
   139  
   140  	rollupID, err := mockRollupManager.ChainIDToRollupID(&bind.CallOpts{Pending: false}, zkevmChainID)
   141  	if err != nil {
   142  		log.Error("error: ", err)
   143  		return nil, nil, common.Address{}, nil, nil, err
   144  	}
   145  	rollupData, err := mockRollupManager.RollupIDToRollupData(&bind.CallOpts{Pending: false}, rollupID)
   146  	if err != nil {
   147  		log.Error("error: ", err)
   148  		return nil, nil, common.Address{}, nil, nil, err
   149  	}
   150  	zkevmAddr := rollupData.RollupContract
   151  
   152  	if calculatedBridgeAddr != bridgeAddr {
   153  		return nil, nil, common.Address{}, nil, nil, fmt.Errorf("bridgeAddr (%s) is different from the expected contract address (%s)",
   154  			bridgeAddr.String(), calculatedBridgeAddr.String())
   155  	}
   156  
   157  	rollupManager, err := polygonrollupmanager.NewPolygonrollupmanager(mockRollupManagerAddr, client)
   158  	if err != nil {
   159  		log.Error("error: ", err)
   160  		return nil, nil, common.Address{}, nil, nil, err
   161  	}
   162  
   163  	trueZkevm, err := polygonzkevm.NewPolygonzkevm(zkevmAddr, client) //nolint
   164  	if err != nil {
   165  		log.Error("error: ", err)
   166  		return nil, nil, common.Address{}, nil, nil, err
   167  	}
   168  
   169  	// Approve the bridge and zkevm to spend 10000 pol tokens.
   170  	approvedAmount, _ := new(big.Int).SetString("10000000000000000000000", 10) //nolint:gomnd
   171  	_, err = polContract.Approve(auth, bridgeAddr, approvedAmount)
   172  	if err != nil {
   173  		log.Error("error: ", err)
   174  		return nil, nil, common.Address{}, nil, nil, err
   175  	}
   176  	_, err = polContract.Approve(auth, zkevmAddr, approvedAmount)
   177  	if err != nil {
   178  		log.Error("error: ", err)
   179  		return nil, nil, common.Address{}, nil, nil, err
   180  	}
   181  
   182  	_, err = trueZkevm.SetForceBatchAddress(auth, common.Address{})
   183  	if err != nil {
   184  		log.Error("error: ", err)
   185  		return nil, nil, common.Address{}, nil, nil, err
   186  	}
   187  
   188  	client.Commit()
   189  	return &Client{EtherClient: client, PolygonBridge: br, PolygonZkEVMGlobalExitRoot: globalExitRoot, PolygonRollupManager: rollupManager, SCAddresses: []common.Address{exitManagerAddr, bridgeAddr, mockRollupManagerAddr}}, client, polAddr, br, trueZkevm, nil
   190  }