package main import ( "fmt" "github.com/urfave/cli/v2" ) const ( PrecursorSelectAll = "all" PrecursorSelectSender = "sender" ) type extractOpts struct { id string block string class string cid string tsk string file string retain string precursor string ignoreSanityChecks bool } var extractFlags extractOpts var extractCmd = &cli.Command{ Name: "extract", Description: "generate a test vector by extracting it from a live chain", Action: runExtract, Before: initialize, After: destroy, Flags: []cli.Flag{ &repoFlag, &cli.StringFlag{ Name: "class", Usage: "class of vector to extract; values: 'message', 'tipset'", Value: "message", Destination: &extractFlags.class, }, &cli.StringFlag{ Name: "id", Usage: "identifier to name this test vector with", Value: "(undefined)", Destination: &extractFlags.id, }, &cli.StringFlag{ Name: "block", Usage: "optionally, the block CID the message was included in, to avoid expensive chain scanning", Destination: &extractFlags.block, }, &cli.StringFlag{ Name: "exec-block", Usage: "optionally, the block CID of a block where this message was executed, to avoid expensive chain scanning", Destination: &extractFlags.block, }, &cli.StringFlag{ Name: "cid", Usage: "message CID to generate test vector from", Destination: &extractFlags.cid, }, &cli.StringFlag{ Name: "tsk", Usage: "tipset key to extract into a vector", Destination: &extractFlags.tsk, }, &cli.StringFlag{ Name: "out", Aliases: []string{"o"}, Usage: "file to write test vector to", Destination: &extractFlags.file, }, &cli.StringFlag{ Name: "state-retain", Usage: "state retention policy; values: 'accessed-cids', 'accessed-actors'", Value: "accessed-cids", Destination: &extractFlags.retain, }, &cli.StringFlag{ Name: "precursor-select", Usage: "precursors to apply; values: 'all', 'sender'; 'all' selects all preceding " + "messages in the canonicalised tipset, 'sender' selects only preceding messages from the same " + "sender. Usually, 'sender' is a good tradeoff and gives you sufficient accuracy. If the receipt sanity " + "check fails due to gas reasons, switch to 'all', as previous messages in the tipset may have " + "affected state in a disruptive way", Value: "sender", Destination: &extractFlags.precursor, }, &cli.BoolFlag{ Name: "ignore-sanity-checks", Usage: "generate vector even if sanity checks fail", Value: false, Destination: &extractFlags.ignoreSanityChecks, }, }, } func runExtract(_ *cli.Context) error { switch extractFlags.class { case "message": return doExtractMessage(extractFlags) case "tipset": return doExtractTipset(extractFlags) default: return fmt.Errorf("unsupported vector class") } }