github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/test/scripts/deploy_sc/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"math/big"
     7  	"time"
     8  
     9  	"github.com/0xPolygon/supernets2-node/encoding"
    10  	"github.com/0xPolygon/supernets2-node/hex"
    11  	"github.com/0xPolygon/supernets2-node/log"
    12  	"github.com/0xPolygon/supernets2-node/test/contracts/bin/Counter"
    13  	"github.com/0xPolygon/supernets2-node/test/contracts/bin/ERC20"
    14  	"github.com/0xPolygon/supernets2-node/test/contracts/bin/EmitLog"
    15  	"github.com/0xPolygon/supernets2-node/test/contracts/bin/Storage"
    16  	"github.com/0xPolygon/supernets2-node/test/operations"
    17  	"github.com/ethereum/go-ethereum"
    18  	"github.com/ethereum/go-ethereum/accounts/abi/bind"
    19  	"github.com/ethereum/go-ethereum/common"
    20  	"github.com/ethereum/go-ethereum/core/types"
    21  	"github.com/ethereum/go-ethereum/ethclient"
    22  )
    23  
    24  const (
    25  	txTimeout = 60 * time.Second
    26  )
    27  
    28  func main() {
    29  	var networks = []struct {
    30  		Name       string
    31  		URL        string
    32  		ChainID    uint64
    33  		PrivateKey string
    34  	}{
    35  		{Name: "Local L1", URL: operations.DefaultL1NetworkURL, ChainID: operations.DefaultL1ChainID, PrivateKey: operations.DefaultSequencerPrivateKey},
    36  		{Name: "Local L2", URL: operations.DefaultL2NetworkURL, ChainID: operations.DefaultL2ChainID, PrivateKey: operations.DefaultSequencerPrivateKey},
    37  	}
    38  
    39  	for _, network := range networks {
    40  		ctx := context.Background()
    41  
    42  		log.Infof("connecting to %v: %v", network.Name, network.URL)
    43  		client, err := ethclient.Dial(network.URL)
    44  		chkErr(err)
    45  		log.Infof("connected")
    46  
    47  		auth := operations.MustGetAuth(network.PrivateKey, network.ChainID)
    48  		chkErr(err)
    49  
    50  		const receiverAddr = "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D"
    51  
    52  		balance, err := client.BalanceAt(ctx, auth.From, nil)
    53  		chkErr(err)
    54  		log.Debugf("ETH Balance for %v: %v", auth.From, balance)
    55  
    56  		// Counter
    57  		log.Debugf("Sending TX to deploy Counter SC")
    58  		_, tx, counterSC, err := Counter.DeployCounter(auth, client)
    59  		chkErr(err)
    60  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
    61  		chkErr(err)
    62  		log.Debugf("Calling Increment method from Counter SC")
    63  		tx, err = counterSC.Increment(auth)
    64  		chkErr(err)
    65  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
    66  		chkErr(err)
    67  		fmt.Println()
    68  
    69  		// EmitLog
    70  		log.Debugf("Sending TX to deploy EmitLog SC")
    71  		_, tx, emitLogSC, err := EmitLog.DeployEmitLog(auth, client)
    72  		chkErr(err)
    73  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
    74  		chkErr(err)
    75  		log.Debugf("Calling EmitLogs method from EmitLog SC")
    76  		tx, err = emitLogSC.EmitLogs(auth)
    77  		chkErr(err)
    78  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
    79  		chkErr(err)
    80  		fmt.Println()
    81  
    82  		// ERC20
    83  		mintAmount, _ := big.NewInt(0).SetString("1000000000000000000000", encoding.Base10)
    84  		log.Debugf("Sending TX to deploy ERC20 SC")
    85  		_, tx, erc20SC, err := ERC20.DeployERC20(auth, client, "Test Coin", "TCO")
    86  		chkErr(err)
    87  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
    88  		chkErr(err)
    89  		log.Debugf("Sending TX to do a ERC20 mint")
    90  		tx, err = erc20SC.Mint(auth, mintAmount)
    91  		chkErr(err)
    92  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
    93  		chkErr(err)
    94  		transferAmount, _ := big.NewInt(0).SetString("900000000000000000000", encoding.Base10)
    95  		log.Debugf("Sending TX to do a ERC20 transfer")
    96  		tx, err = erc20SC.Transfer(auth, common.HexToAddress(receiverAddr), transferAmount)
    97  		chkErr(err)
    98  		auth.Nonce = big.NewInt(0).SetUint64(tx.Nonce() + 1)
    99  		log.Debugf("Sending invalid TX to do a ERC20 transfer")
   100  		invalidTx, err := erc20SC.Transfer(auth, common.HexToAddress(receiverAddr), transferAmount)
   101  		chkErr(err)
   102  		log.Debugf("Invalid ERC20 tx hash: %v", invalidTx.Hash())
   103  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
   104  		chkErr(err)
   105  		operations.WaitTxToBeMined(ctx, client, invalidTx, txTimeout) //nolint:errcheck
   106  		chkErr(err)
   107  		auth.Nonce = nil
   108  		fmt.Println()
   109  
   110  		// Storage
   111  		const numberToStore = 22
   112  		log.Debugf("Sending TX to deploy Storage SC")
   113  		_, tx, storageSC, err := Storage.DeployStorage(auth, client)
   114  		chkErr(err)
   115  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
   116  		chkErr(err)
   117  		log.Debugf("Calling Store method from Storage SC")
   118  		tx, err = storageSC.Store(auth, big.NewInt(numberToStore))
   119  		chkErr(err)
   120  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
   121  		chkErr(err)
   122  		fmt.Println()
   123  
   124  		// Valid ETH Transfer
   125  		balance, err = client.BalanceAt(ctx, auth.From, nil)
   126  		log.Debugf("ETH Balance for %v: %v", auth.From, balance)
   127  		chkErr(err)
   128  		const halfDivision = 2
   129  		transferAmount = balance.Quo(balance, big.NewInt(halfDivision))
   130  		log.Debugf("Transfer Amount: %v", transferAmount)
   131  
   132  		log.Debugf("Sending TX to transfer ETH")
   133  		to := common.HexToAddress(receiverAddr)
   134  		tx = ethTransfer(ctx, client, auth, to, transferAmount, nil)
   135  		fmt.Println()
   136  
   137  		// Invalid ETH Transfer
   138  		log.Debugf("Sending Invalid TX to transfer ETH")
   139  		nonce := tx.Nonce() + 1
   140  		ethTransfer(ctx, client, auth, to, transferAmount, &nonce)
   141  		err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout)
   142  		chkErr(err)
   143  		fmt.Println()
   144  	}
   145  }
   146  
   147  func ethTransfer(ctx context.Context, client *ethclient.Client, auth *bind.TransactOpts, to common.Address, amount *big.Int, nonce *uint64) *types.Transaction {
   148  	if nonce == nil {
   149  		log.Infof("reading nonce for account: %v", auth.From.Hex())
   150  		var err error
   151  		n, err := client.NonceAt(ctx, auth.From, nil)
   152  		log.Infof("nonce: %v", n)
   153  		chkErr(err)
   154  		nonce = &n
   155  	}
   156  
   157  	gasPrice, err := client.SuggestGasPrice(context.Background())
   158  	chkErr(err)
   159  
   160  	gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{To: &to})
   161  	chkErr(err)
   162  
   163  	tx := types.NewTransaction(*nonce, to, amount, gasLimit, gasPrice, nil)
   164  
   165  	signedTx, err := auth.Signer(auth.From, tx)
   166  	chkErr(err)
   167  
   168  	log.Infof("sending transfer tx")
   169  	err = client.SendTransaction(ctx, signedTx)
   170  	chkErr(err)
   171  	log.Infof("tx sent: %v", signedTx.Hash().Hex())
   172  
   173  	rlp, err := signedTx.MarshalBinary()
   174  	chkErr(err)
   175  
   176  	log.Infof("tx rlp: %v", hex.EncodeToHex(rlp))
   177  
   178  	return signedTx
   179  }
   180  
   181  func chkErr(err error) {
   182  	if err != nil {
   183  		log.Fatal(err)
   184  	}
   185  }