package eth import ( "fmt" "io/ioutil" "log" "math/big" "os" "strconv" "testing" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" ethCommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" "github.com/joho/godotenv" hdwallet "github.com/miguelmota/go-ethereum-hdwallet" ) var errEnvVar = fmt.Errorf("Some environment variable is missing") var ( ethClientDialURL = "http://localhost:8545" password = "pass" deadline, _ = new(big.Int).SetString("ffffffffffffffffffffffffffffffff", 16) mnemonic = "explain tackle mirror kit van hammer degree position ginger unfair soup bonus" ) func genAcc(w *hdwallet.Wallet, ks *keystore.KeyStore, i int) (*accounts.Account, ethCommon.Address) { path := hdwallet.MustParseDerivationPath(fmt.Sprintf("m/44'/60'/0'/0/%d", i)) account, err := w.Derive(path, false) if err != nil { log.Fatal(err) } key, err := w.PrivateKey(account) if err != nil { log.Fatal(err) } _, err = ks.ImportECDSA(key, password) if err != nil { log.Fatal(err) } if err := ks.Unlock(account, password); err != nil { log.Fatal(err) } return &account, account.Address } // Smart Contract Addresses var ( genesisBlock int64 auctionAddressConst ethCommon.Address auctionTestAddressConst ethCommon.Address tokenHEZAddressConst ethCommon.Address hermezRollupAddressConst ethCommon.Address wdelayerAddressConst ethCommon.Address wdelayerTestAddressConst ethCommon.Address tokenHEZ TokenConfig donationAccount *accounts.Account donationAddressConst ethCommon.Address bootCoordinatorAccount *accounts.Account bootCoordinatorAddressConst ethCommon.Address ) // Ethereum Accounts var ( emergencyCouncilAccount *accounts.Account emergencyCouncilAddressConst ethCommon.Address governanceAccount *accounts.Account governanceAddressConst ethCommon.Address auxAccount *accounts.Account auxAddressConst ethCommon.Address aux2Account *accounts.Account aux2AddressConst ethCommon.Address hermezRollupTestAccount *accounts.Account hermezRollupTestAddressConst ethCommon.Address ) var ( ks *keystore.KeyStore ethClient *ethclient.Client ethereumClientEmergencyCouncil *EthereumClient ethereumClientAux *EthereumClient ethereumClientAux2 *EthereumClient ethereumClientHermez *EthereumClient ) func getEnvVariables() { err := godotenv.Load() if err != nil { fmt.Println("Variables loaded from environment") } else { fmt.Println("Variables loaded from .env file") } var auctionAddressStr = os.Getenv("AUCTION") var auctionTestAddressStr = os.Getenv("AUCTION_TEST") var tokenHEZAddressStr = os.Getenv("TOKENHEZ") var hermezRollupAddressStr = os.Getenv("HERMEZ") var wdelayerAddressStr = os.Getenv("WDELAYER") var wdelayerTestAddressStr = os.Getenv("WDELAYER_TEST") genesisBlockEnv := os.Getenv("GENESIS_BLOCK") genesisBlock, err = strconv.ParseInt(genesisBlockEnv, 10, 64) if err != nil { log.Fatal(errEnvVar) } if auctionAddressStr == "" || auctionTestAddressStr == "" || tokenHEZAddressStr == "" || hermezRollupAddressStr == "" || wdelayerAddressStr == "" || wdelayerTestAddressStr == "" || genesisBlockEnv == "" { log.Fatal(errEnvVar) } auctionAddressConst = ethCommon.HexToAddress(auctionAddressStr) auctionTestAddressConst = ethCommon.HexToAddress(auctionTestAddressStr) tokenHEZAddressConst = ethCommon.HexToAddress(tokenHEZAddressStr) hermezRollupAddressConst = ethCommon.HexToAddress(hermezRollupAddressStr) wdelayerAddressConst = ethCommon.HexToAddress(wdelayerAddressStr) wdelayerTestAddressConst = ethCommon.HexToAddress(wdelayerTestAddressStr) tokenHEZ = TokenConfig{ Address: tokenHEZAddressConst, Name: "Hermez Network Token", } } func TestMain(m *testing.M) { exitVal := 0 if os.Getenv("INTEGRATION") != "" { getEnvVariables() dir, err := ioutil.TempDir("", "tmpks") if err != nil { log.Fatal(err) } defer func() { if err := os.RemoveAll(dir); err != nil { log.Fatal(err) } }() ks = keystore.NewKeyStore(dir, keystore.LightScryptN, keystore.LightScryptP) w, err := hdwallet.NewFromMnemonic(mnemonic) if err != nil { log.Fatal(err) } // Create ethereum accounts from mnemonic and load private keys // into the keystore bootCoordinatorAccount, bootCoordinatorAddressConst = genAcc(w, ks, 0) governanceAccount, governanceAddressConst = genAcc(w, ks, 1) emergencyCouncilAccount, emergencyCouncilAddressConst = genAcc(w, ks, 2) donationAccount, donationAddressConst = genAcc(w, ks, 3) hermezRollupTestAccount, hermezRollupTestAddressConst = genAcc(w, ks, 4) auxAccount, auxAddressConst = genAcc(w, ks, 5) aux2Account, aux2AddressConst = genAcc(w, ks, 6) ethClient, err = ethclient.Dial(ethClientDialURL) if err != nil { log.Fatal(err) } // Controllable Governance Address ethereumClientGov, err := NewEthereumClient(ethClient, governanceAccount, ks, nil) if err != nil { log.Fatal(err) } auctionClient, err = NewAuctionClient(ethereumClientGov, auctionAddressConst, tokenHEZ) if err != nil { log.Fatal(err) } auctionClientTest, err = NewAuctionClient(ethereumClientGov, auctionTestAddressConst, tokenHEZ) if err != nil { log.Fatal(err) } rollupClient, err = NewRollupClient(ethereumClientGov, hermezRollupAddressConst, tokenHEZ) if err != nil { log.Fatal(err) } wdelayerClient, err = NewWDelayerClient(ethereumClientGov, wdelayerAddressConst) if err != nil { log.Fatal(err) } wdelayerClientTest, err = NewWDelayerClient(ethereumClientGov, wdelayerTestAddressConst) if err != nil { log.Fatal(err) } ethereumClientEmergencyCouncil, err = NewEthereumClient(ethClient, emergencyCouncilAccount, ks, nil) if err != nil { log.Fatal(err) } ethereumClientAux, err = NewEthereumClient(ethClient, auxAccount, ks, nil) if err != nil { log.Fatal(err) } ethereumClientAux2, err = NewEthereumClient(ethClient, aux2Account, ks, nil) if err != nil { log.Fatal(err) } ethereumClientHermez, err = NewEthereumClient(ethClient, hermezRollupTestAccount, ks, nil) if err != nil { log.Fatal(err) } exitVal = m.Run() } os.Exit(exitVal) }