moonstream/robots/cmd/robots/signer.go

66 wiersze
1.6 KiB
Go

package main
import (
"errors"
"fmt"
"io/ioutil"
"strings"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/common"
)
type SignerInstance struct {
Address common.Address
PrivateKey *keystore.Key
}
// initializeSigner parse secrets directory with keyfile and passfile,
// then opens keyfile with password to privateKey
func initializeSigner(keyfileName, passfileName string) (*SignerInstance, error) {
if ROBOTS_SIGNER_SECRETS_DIR_PATH == "" {
return nil, errors.New("Directory with signer secrets not set")
}
keyfilePath := fmt.Sprintf("%s/%s", ROBOTS_SIGNER_SECRETS_DIR_PATH, keyfileName)
keyfilePasswordPath := fmt.Sprintf("%s/%s", ROBOTS_SIGNER_SECRETS_DIR_PATH, passfileName)
passfile, err := ioutil.ReadFile(keyfilePasswordPath)
if err != nil {
return nil, err
}
passfile_lines := strings.Split(string(passfile), "\n")
password := passfile_lines[0]
keyfile, err := ioutil.ReadFile(keyfilePath)
if err != nil {
return nil, err
}
privateKey, err := keystore.DecryptKey(keyfile, password)
if err != nil {
return nil, err
}
signer := SignerInstance{
Address: privateKey.Address,
PrivateKey: privateKey,
}
return &signer, nil
}
func (s *SignerInstance) CreateTransactor(network NetworkInstance) (*bind.TransactOpts, error) {
auth, err := bind.NewKeyedTransactorWithChainID(s.PrivateKey.PrivateKey, network.ChainID)
if err != nil {
return nil, err
}
// auth.Nonce = big.NewInt(int64(nonce))
// auth.Value = big.NewInt(0)
// auth.GasLimit = uint64(300000)
// auth.GasPrice = gasPrice
return auth, nil
}