WIP: parse msig accounts file and include it into the genesis template

This commit is contained in:
whyrusleeping 2020-07-07 16:39:32 -07:00
parent 9b6afd82aa
commit fb34d2b9e3
2 changed files with 85 additions and 1 deletions

View File

@ -2,6 +2,7 @@ package main
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"github.com/google/uuid" "github.com/google/uuid"
@ -10,6 +11,7 @@ import (
"golang.org/x/xerrors" "golang.org/x/xerrors"
"github.com/filecoin-project/go-address" "github.com/filecoin-project/go-address"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/build"
@ -23,6 +25,7 @@ var genesisCmd = &cli.Command{
Subcommands: []*cli.Command{ Subcommands: []*cli.Command{
genesisNewCmd, genesisNewCmd,
genesisAddMinerCmd, genesisAddMinerCmd,
genesisAddMsigsCmd,
}, },
} }
@ -141,3 +144,73 @@ var genesisAddMinerCmd = &cli.Command{
return nil return nil
}, },
} }
type GenAccountEntry struct {
ID string
CustodianID int
M int
N int
Addresses []address.Address
Type string
Sig1 string
Sig2 string
}
var genesisAddMsigsCmd = &cli.Command{
Name: "add-msigs",
Action: func(cctx *cli.Context) error {
if cctx.Args().Len() < 2 {
return fmt.Errorf("must specify template file and csv file with accounts")
}
genf, err := homedir.Expand(cctx.Args().First())
if err != nil {
return err
}
var template genesis.Template
b, err := ioutil.ReadFile(genf)
if err != nil {
return xerrors.Errorf("read genesis template: %w", err)
}
if err := json.Unmarshal(b, &template); err != nil {
return xerrors.Errorf("unmarshal genesis template: %w", err)
}
var entries []GenAccountEntry
// TODO: parse that csv
for i, e := range entries {
if len(e.Addresses) != e.N {
return fmt.Errorf("entry %d had mismatch between 'N' and number of addresses", i)
}
msig := &genesis.MultisigMeta{
Signers: e.Addresses,
Threshold: e.M,
VestingDuration: 0, // TODO
VestingStart: 0, // TODO
}
act := genesis.Actor{
Type: genesis.TMultisig,
Balance: abi.NewTokenAmount(0), // TODO
Meta: msig.ActorMeta(),
}
template.Accounts = append(template.Accounts, act)
}
b, err = json.MarshalIndent(&template, "", " ")
if err != nil {
return err
}
if err := ioutil.WriteFile(genf, b, 0644); err != nil {
return err
}
return nil
},
}

View File

@ -51,7 +51,18 @@ func (am *AccountMeta) ActorMeta() json.RawMessage {
} }
type MultisigMeta struct { type MultisigMeta struct {
// TODO Signers []address.Address
Threshold int
VestingDuration int
VestingStart int
}
func (mm *MultisigMeta) ActorMeta() json.RawMessage {
out, err := json.Marshal(mm)
if err != nil {
panic(err)
}
return out
} }
type Actor struct { type Actor struct {