repo_description: Reference implementation of the Filecoin protocol, written in Go
repo_topics: blockchain filecoin golang ipfs
code: package main
  
  import (
  	"bytes"
  	"encoding/hex"
  	"fmt"
  
  	"github.com/urfave/cli/v2"
  	"golang.org/x/xerrors"
  
  	"github.com/filecoin-project/go-address"
  )
  
  var addressCmd = &cli.Command{
  	Name:  "addr",
  	Usage: "interact with filecoin addresses",
  	Subcommands: cli.Commands{
  		addrDecode,
  		addrEncode,
  	},
  }
  
  var addrDecode = &cli.Command{
  	Name:  "decode",
  	Usage: "decode hex bytes into address",
  	Action: func(cctx *cli.Context) error {
  		addrHex := cctx.Args().First()
  		bs, err := hex.DecodeString(addrHex)
  		if err != nil {
  			return err
  		}
  		// first try cbor
  		var a address.Address
  		err = a.UnmarshalCBOR((bytes.NewReader(bs)))
  		if err != nil {
  			fmt.Printf("failed to unmarshal as CBOR, trying raw\n")
  		} else {
  			fmt.Printf("%s\n", a)
  			return nil
  		}
  
  		// next try raw payload
  		a, err = address.NewFromBytes(bs)
  		if err != nil {
  			return xerrors.New("could not decode as CBOR or raw payload, failing")
  		}
  		fmt.Printf("%s\n", a)
  		return nil
  	},
  }
  
  var addrEncode = &cli.Command{
  	Name:  "encode",
  	Usage: "encode address to hex bytes",
  	Action: func(cctx *cli.Context) error {
  		addr, err := address.NewFromString(cctx.Args().First())
  		if err != nil {
  			return err
  		}
  
  		fmt.Printf("%x\n", addr.Bytes())
  		return nil
  	},
  }
  