{-# OPTIONS_HADDOCK prune #-}
{-# LANGUAGE BangPatterns #-}
module Lightning.Protocol.BOLT3.Encode (
encode_tx
, encode_htlc_tx
, encode_closing_tx
, encode_tx_for_signing
, encode_witness
, encode_funding_witness
, encode_varint
, encode_le32
, encode_le64
, encode_outpoint
, encode_output
) where
import Data.Word (Word32, Word64)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Builder as BSB
import qualified Data.ByteString.Lazy as BSL
import Lightning.Protocol.BOLT3.Types
import Lightning.Protocol.BOLT3.Tx
encode_le32 :: Word32 -> BS.ByteString
encode_le32 :: Word32 -> ByteString
encode_le32 = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString)
-> (Word32 -> LazyByteString) -> Word32 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString)
-> (Word32 -> Builder) -> Word32 -> LazyByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Builder
BSB.word32LE
{-# INLINE encode_le32 #-}
encode_le64 :: Word64 -> BS.ByteString
encode_le64 :: Word64 -> ByteString
encode_le64 = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString)
-> (Word64 -> LazyByteString) -> Word64 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString)
-> (Word64 -> Builder) -> Word64 -> LazyByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> Builder
BSB.word64LE
{-# INLINE encode_le64 #-}
encode_varint :: Word64 -> BS.ByteString
encode_varint :: Word64 -> ByteString
encode_varint !Word64
n
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
< Word64
0xFD = Word8 -> ByteString
BS.singleton (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n)
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word64
0xFFFF = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word8 -> Builder
BSB.word8 Word8
0xFD Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word16 -> Builder
BSB.word16LE (Word64 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n)
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word64
0xFFFFFFFF = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word8 -> Builder
BSB.word8 Word8
0xFE Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word32 -> Builder
BSB.word32LE (Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n)
| Bool
otherwise = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word8 -> Builder
BSB.word8 Word8
0xFF Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word64 -> Builder
BSB.word64LE Word64
n
{-# INLINE encode_varint #-}
encode_outpoint :: Outpoint -> BS.ByteString
encode_outpoint :: Outpoint -> ByteString
encode_outpoint !Outpoint
op = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
ByteString -> Builder
BSB.byteString (TxId -> ByteString
unTxId (TxId -> ByteString) -> TxId -> ByteString
forall a b. (a -> b) -> a -> b
$ Outpoint -> TxId
outpoint_txid Outpoint
op) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Outpoint -> Word32
outpoint_index Outpoint
op)
{-# INLINE encode_outpoint #-}
encode_output :: TxOutput -> BS.ByteString
encode_output :: TxOutput -> ByteString
encode_output !TxOutput
out = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
let !script :: ByteString
script = Script -> ByteString
unScript (TxOutput -> Script
txout_script TxOutput
out)
!scriptLen :: Word64
scriptLen = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (ByteString -> Int
BS.length ByteString
script) :: Word64
in Word64 -> Builder
BSB.word64LE (Satoshi -> Word64
unSatoshi (Satoshi -> Word64) -> Satoshi -> Word64
forall a b. (a -> b) -> a -> b
$ TxOutput -> Satoshi
txout_value TxOutput
out) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
scriptLen Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
BSB.byteString ByteString
script
{-# INLINE encode_output #-}
encode_witness :: Witness -> BS.ByteString
encode_witness :: Witness -> ByteString
encode_witness (Witness ![ByteString]
items) = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
let !count :: Word64
count = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([ByteString] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
items) :: Word64
in Word64 -> Builder
varint_builder Word64
count Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> [Builder] -> Builder
forall a. Monoid a => [a] -> a
mconcat ((ByteString -> Builder) -> [ByteString] -> [Builder]
forall a b. (a -> b) -> [a] -> [b]
map ByteString -> Builder
encode_witness_item [ByteString]
items)
{-# INLINE encode_witness #-}
encode_witness_item :: BS.ByteString -> BSB.Builder
encode_witness_item :: ByteString -> Builder
encode_witness_item !ByteString
bs =
let !len :: Word64
len = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (ByteString -> Int
BS.length ByteString
bs) :: Word64
in Word64 -> Builder
varint_builder Word64
len Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
BSB.byteString ByteString
bs
{-# INLINE encode_witness_item #-}
encode_funding_witness
:: BS.ByteString
-> BS.ByteString
-> Script
-> BS.ByteString
encode_funding_witness :: ByteString -> ByteString -> Script -> ByteString
encode_funding_witness !ByteString
sig1 !ByteString
sig2 (Script !ByteString
witnessScript) =
LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word64 -> Builder
varint_builder Word64
4 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
encode_witness_item ByteString
BS.empty Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
encode_witness_item ByteString
sig1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
encode_witness_item ByteString
sig2 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
encode_witness_item ByteString
witnessScript
{-# INLINE encode_funding_witness #-}
encode_tx :: CommitmentTx -> BS.ByteString
encode_tx :: CommitmentTx -> ByteString
encode_tx !CommitmentTx
tx = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word32 -> Builder
BSB.word32LE (CommitmentTx -> Word32
ctx_version CommitmentTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
BSB.word8 Word8
0x00 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
BSB.word8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
BSB.byteString (Outpoint -> ByteString
encode_outpoint (CommitmentTx -> Outpoint
ctx_input_outpoint CommitmentTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Sequence -> Word32
unSequence (Sequence -> Word32) -> Sequence -> Word32
forall a b. (a -> b) -> a -> b
$ CommitmentTx -> Sequence
ctx_input_sequence CommitmentTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word64) -> Int -> Word64
forall a b. (a -> b) -> a -> b
$ [TxOutput] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([TxOutput] -> Int) -> [TxOutput] -> Int
forall a b. (a -> b) -> a -> b
$ CommitmentTx -> [TxOutput]
ctx_outputs CommitmentTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
[Builder] -> Builder
forall a. Monoid a => [a] -> a
mconcat ((TxOutput -> Builder) -> [TxOutput] -> [Builder]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> Builder
BSB.byteString (ByteString -> Builder)
-> (TxOutput -> ByteString) -> TxOutput -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxOutput -> ByteString
encode_output) (CommitmentTx -> [TxOutput]
ctx_outputs CommitmentTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Locktime -> Word32
unLocktime (Locktime -> Word32) -> Locktime -> Word32
forall a b. (a -> b) -> a -> b
$ CommitmentTx -> Locktime
ctx_locktime CommitmentTx
tx)
encode_htlc_tx :: HTLCTx -> BS.ByteString
encode_htlc_tx :: HTLCTx -> ByteString
encode_htlc_tx !HTLCTx
tx = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word32 -> Builder
BSB.word32LE (HTLCTx -> Word32
htx_version HTLCTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
BSB.word8 Word8
0x00 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
BSB.word8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
BSB.byteString (Outpoint -> ByteString
encode_outpoint (HTLCTx -> Outpoint
htx_input_outpoint HTLCTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Sequence -> Word32
unSequence (Sequence -> Word32) -> Sequence -> Word32
forall a b. (a -> b) -> a -> b
$ HTLCTx -> Sequence
htx_input_sequence HTLCTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
BSB.word64LE (Satoshi -> Word64
unSatoshi (Satoshi -> Word64) -> Satoshi -> Word64
forall a b. (a -> b) -> a -> b
$ HTLCTx -> Satoshi
htx_output_value HTLCTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
let !script :: ByteString
script = Script -> ByteString
unScript (HTLCTx -> Script
htx_output_script HTLCTx
tx)
!scriptLen :: Word64
scriptLen = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (ByteString -> Int
BS.length ByteString
script) :: Word64
in Word64 -> Builder
varint_builder Word64
scriptLen Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
BSB.byteString ByteString
script Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Locktime -> Word32
unLocktime (Locktime -> Word32) -> Locktime -> Word32
forall a b. (a -> b) -> a -> b
$ HTLCTx -> Locktime
htx_locktime HTLCTx
tx)
encode_closing_tx :: ClosingTx -> BS.ByteString
encode_closing_tx :: ClosingTx -> ByteString
encode_closing_tx !ClosingTx
tx = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word32 -> Builder
BSB.word32LE (ClosingTx -> Word32
cltx_version ClosingTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
BSB.word8 Word8
0x00 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
BSB.word8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
BSB.byteString (Outpoint -> ByteString
encode_outpoint (ClosingTx -> Outpoint
cltx_input_outpoint ClosingTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Sequence -> Word32
unSequence (Sequence -> Word32) -> Sequence -> Word32
forall a b. (a -> b) -> a -> b
$ ClosingTx -> Sequence
cltx_input_sequence ClosingTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word64) -> Int -> Word64
forall a b. (a -> b) -> a -> b
$ [TxOutput] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([TxOutput] -> Int) -> [TxOutput] -> Int
forall a b. (a -> b) -> a -> b
$ ClosingTx -> [TxOutput]
cltx_outputs ClosingTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
[Builder] -> Builder
forall a. Monoid a => [a] -> a
mconcat ((TxOutput -> Builder) -> [TxOutput] -> [Builder]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> Builder
BSB.byteString (ByteString -> Builder)
-> (TxOutput -> ByteString) -> TxOutput -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxOutput -> ByteString
encode_output) (ClosingTx -> [TxOutput]
cltx_outputs ClosingTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Locktime -> Word32
unLocktime (Locktime -> Word32) -> Locktime -> Word32
forall a b. (a -> b) -> a -> b
$ ClosingTx -> Locktime
cltx_locktime ClosingTx
tx)
encode_tx_for_signing :: CommitmentTx -> BS.ByteString
encode_tx_for_signing :: CommitmentTx -> ByteString
encode_tx_for_signing !CommitmentTx
tx = LazyByteString -> ByteString
BSL.toStrict (LazyByteString -> ByteString) -> LazyByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> LazyByteString
BSB.toLazyByteString (Builder -> LazyByteString) -> Builder -> LazyByteString
forall a b. (a -> b) -> a -> b
$
Word32 -> Builder
BSB.word32LE (CommitmentTx -> Word32
ctx_version CommitmentTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
ByteString -> Builder
BSB.byteString (Outpoint -> ByteString
encode_outpoint (CommitmentTx -> Outpoint
ctx_input_outpoint CommitmentTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder Word64
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Sequence -> Word32
unSequence (Sequence -> Word32) -> Sequence -> Word32
forall a b. (a -> b) -> a -> b
$ CommitmentTx -> Sequence
ctx_input_sequence CommitmentTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
varint_builder (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word64) -> Int -> Word64
forall a b. (a -> b) -> a -> b
$ [TxOutput] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([TxOutput] -> Int) -> [TxOutput] -> Int
forall a b. (a -> b) -> a -> b
$ CommitmentTx -> [TxOutput]
ctx_outputs CommitmentTx
tx) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
[Builder] -> Builder
forall a. Monoid a => [a] -> a
mconcat ((TxOutput -> Builder) -> [TxOutput] -> [Builder]
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> Builder
BSB.byteString (ByteString -> Builder)
-> (TxOutput -> ByteString) -> TxOutput -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxOutput -> ByteString
encode_output) (CommitmentTx -> [TxOutput]
ctx_outputs CommitmentTx
tx)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
BSB.word32LE (Locktime -> Word32
unLocktime (Locktime -> Word32) -> Locktime -> Word32
forall a b. (a -> b) -> a -> b
$ CommitmentTx -> Locktime
ctx_locktime CommitmentTx
tx)
varint_builder :: Word64 -> BSB.Builder
varint_builder :: Word64 -> Builder
varint_builder !Word64
n
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
< Word64
0xFD = Word8 -> Builder
BSB.word8 (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n)
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word64
0xFFFF = Word8 -> Builder
BSB.word8 Word8
0xFD Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word16 -> Builder
BSB.word16LE (Word64 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n)
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word64
0xFFFFFFFF = Word8 -> Builder
BSB.word8 Word8
0xFE Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word32 -> Builder
BSB.word32LE (Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n)
| Bool
otherwise = Word8 -> Builder
BSB.word8 Word8
0xFF Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word64 -> Builder
BSB.word64LE Word64
n
{-# INLINE varint_builder #-}