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 }