mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-22 03:30:35 +00:00
update error messages, update VMC addr with newly created, check bytecode (not working yet)
Former-commit-id: 5740a1fd78ab3d0c2641edaa99a0ed61b7f8472c [formerly 79079ffdc3782a2f58b6678f1d22a504a1125cf8] Former-commit-id: a048daa18190deb46d924685657dccd737cb8003
This commit is contained in:
parent
fa117e853f
commit
8754a1de31
@ -1,6 +1,7 @@
|
||||
package sharding
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
@ -28,7 +29,7 @@ func (c *Client) verifyVMC() error {
|
||||
// TODO: Fetch validator manager contract.
|
||||
b, err := c.client.CodeAt(context.Background(), validatorManagerAddress, nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get contract code at %s. %v", validatorManagerAddress, err)
|
||||
return fmt.Errorf("unable to get contract code at %s. %v", validatorManagerAddress, err)
|
||||
}
|
||||
|
||||
if len(b) == 0 {
|
||||
@ -36,18 +37,25 @@ func (c *Client) verifyVMC() error {
|
||||
|
||||
addr, err := c.deployVMC()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to deploy validator management contract: %v", err)
|
||||
return fmt.Errorf("unable to deploy validator management contract: %v", err)
|
||||
}
|
||||
|
||||
log.Info(fmt.Sprintf("Created contract at address %s", addr.String()))
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not deploy validator management contract: %v", err)
|
||||
validatorManagerAddress = *addr
|
||||
|
||||
if b, err = c.client.CodeAt(context.Background(), validatorManagerAddress, nil); err != nil {
|
||||
return fmt.Errorf("unable to get contract code at %s %v", validatorManagerAddress, err)
|
||||
}
|
||||
} else {
|
||||
// TODO: Check contract bytecode is what we expected, otherwise return error.
|
||||
}
|
||||
|
||||
// TODO: Check contract bytecode is what we expected, otherwise return error.
|
||||
if !bytes.Equal(b, abiBytecode) {
|
||||
return fmt.Errorf("bytecode at contract address %s does not match expected bytecode", validatorManagerAddress.String())
|
||||
}
|
||||
|
||||
log.Info("Validator management contract verified!")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -59,43 +67,43 @@ func (c *Client) deployVMC() (*common.Address, error) {
|
||||
|
||||
// TODO: call unlock only if account is actually locked.
|
||||
if err := c.unlockAccount(accounts[0]); err != nil {
|
||||
return nil, fmt.Errorf("failed to unlock account 0: %v", err)
|
||||
return nil, fmt.Errorf("unable to unlock account 0: %v", err)
|
||||
}
|
||||
|
||||
suggestedGasPrice, err := c.client.SuggestGasPrice(context.Background())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get suggested gas price from node: %v", err)
|
||||
return nil, fmt.Errorf("unable to get suggested gas price from node: %v", err)
|
||||
}
|
||||
|
||||
nonce, err := c.client.NonceAt(context.Background(), accounts[0].Address, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get nonce for %s: %v", accounts[0].Address, err)
|
||||
return nil, fmt.Errorf("unable to get nonce for %s: %v", accounts[0].Address, err)
|
||||
}
|
||||
|
||||
tx := types.NewContractCreation(nonce, new(big.Int).SetInt64(0), contractGasLimit, suggestedGasPrice, abiBytecode)
|
||||
signed, err := c.keystore.SignTx(accounts[0], tx, new(big.Int).SetInt64(1000))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to sign transaction: %v", err)
|
||||
return nil, fmt.Errorf("unable to sign transaction: %v", err)
|
||||
}
|
||||
|
||||
log.Info(fmt.Sprintf("Creating validator management contract. Tx: %s", signed.Hash().String()))
|
||||
|
||||
if err := c.client.SendTransaction(context.Background(), signed); err != nil {
|
||||
return nil, fmt.Errorf("failed to send transaction: %v", err)
|
||||
return nil, fmt.Errorf("unable to send transaction: %v", err)
|
||||
}
|
||||
|
||||
log.Info(fmt.Sprintf("Contract creation sent. Waiting for transaction receipt."))
|
||||
|
||||
for pending := true; pending; _, pending, err = c.client.TransactionByHash(context.Background(), signed.Hash()) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Failed to get transaction by hash: %v", err)
|
||||
return nil, fmt.Errorf("unable to get transaction by hash: %v", err)
|
||||
}
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
|
||||
receipt, err := c.client.TransactionReceipt(context.Background(), signed.Hash())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get transaction receipt: %v", err)
|
||||
return nil, fmt.Errorf("unable to get transaction receipt: %v", err)
|
||||
}
|
||||
|
||||
return &receipt.ContractAddress, nil
|
||||
@ -107,7 +115,7 @@ func (c *Client) unlockAccount(account accounts.Account) error {
|
||||
if c.ctx.GlobalIsSet(utils.PasswordFileFlag.Name) {
|
||||
blob, err := ioutil.ReadFile(c.ctx.GlobalString(utils.PasswordFileFlag.Name))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read account password contents in file %s. %v", utils.PasswordFileFlag.Value, err)
|
||||
return fmt.Errorf("unable to read account password contents in file %s. %v", utils.PasswordFileFlag.Value, err)
|
||||
}
|
||||
// Some text files end in new line, remove with strings.Trim.
|
||||
pass = strings.Trim(string(blob), "\n")
|
||||
|
Loading…
Reference in New Issue
Block a user