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 }