package restricted import ( "fmt" "math" "github.com/openrelayxyz/plugeth-utils/restricted/hexutil" "strings" ) type BlockNumber int64 const ( PendingBlockNumber = BlockNumber(-2) LatestBlockNumber = BlockNumber(-1) EarliestBlockNumber = BlockNumber(0) ) // UnmarshalJSON parses the given JSON fragment into a BlockNumber. It supports: // - "latest", "earliest" or "pending" as string arguments // - the block number // Returned errors: // - an invalid block number error when the given argument isn't a known strings // - an out of range error when the given block number is either too little or too large func (bn *BlockNumber) UnmarshalJSON(data []byte) error { input := strings.TrimSpace(string(data)) if len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' { input = input[1 : len(input)-1] } switch input { case "earliest": *bn = EarliestBlockNumber return nil case "latest": *bn = LatestBlockNumber return nil case "pending": *bn = PendingBlockNumber return nil } blckNum, err := hexutil.DecodeUint64(input) if err != nil { return err } if blckNum > math.MaxInt64 { return fmt.Errorf("block number larger than int64") } *bn = BlockNumber(blckNum) return nil } func (bn BlockNumber) Int64() int64 { return (int64)(bn) }