Skip to content

Commit 93eec1c

Browse files
committed
wip
1 parent 9dac0bb commit 93eec1c

File tree

3 files changed

+82
-24
lines changed

3 files changed

+82
-24
lines changed

ghcjs/lightning-verifier/src/App/Widgets/Bolt11.hs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,14 @@ invoiceWidget ln =
7676
)
7777
<> [ pair "Signature"
7878
. B11.inspectHex
79-
$ B11.bolt11Signature ln
79+
$ B11.bolt11SigVal sig,
80+
pair "Pubkey Recovery Flag"
81+
. inspect
82+
$ B11.bolt11SigRecoveryFlag sig
8083
]
8184
)
85+
where
86+
sig = B11.bolt11Signature ln
8287

8388
invoiceTagWidget :: B11.Tag -> [FieldPair DynamicField Identity]
8489
invoiceTagWidget = \case
@@ -89,7 +94,7 @@ invoiceTagWidget = \case
8994
B11.DescriptionHash x -> hex "Description Hash" x
9095
B11.Expiry x -> pure . pair "Expiry" $ inspect x
9196
B11.MinFinalCltvExpiry x -> pure . pair "Min Final CLTV Expiry" $ inspect x
92-
B11.OnchainFallback x -> hex "Onchain Fallback" x
97+
B11.OnchainFallback -> mempty
9398
B11.ExtraRouteInfo -> mempty
9499
B11.FeatureBits x ->
95100
pure

pub/functora/src/bolt11/Functora/Bolt11.hs

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module Functora.Bolt11
1111
Bolt11HrpAmt (..),
1212
inspectBolt11HrpAmt,
1313
Bolt11Hrp (..),
14+
Bolt11Sig (..),
1415
Bolt11 (..),
1516
decodeBolt11,
1617
)
@@ -33,7 +34,10 @@ import Prelude (Show (..), error, splitAt, take)
3334
newtype Hex = Hex
3435
{ unHex :: ByteString
3536
}
36-
deriving stock (Eq, Ord, Show, Data, Generic)
37+
deriving stock (Eq, Ord, Data, Generic)
38+
39+
instance Show Hex where
40+
show = inspectHex
3741

3842
inspectHex :: forall a. (From String a) => Hex -> a
3943
inspectHex =
@@ -70,7 +74,7 @@ data Tag
7074
| DescriptionHash Hex
7175
| Expiry Int
7276
| MinFinalCltvExpiry Int
73-
| OnchainFallback Hex -- TODO: address type
77+
| OnchainFallback -- TODO: address type
7478
| ExtraRouteInfo
7579
| FeatureBits [Word5]
7680
deriving stock (Eq, Ord, Show, Generic)
@@ -149,11 +153,17 @@ data Bolt11Hrp = Bolt11Hrp
149153
}
150154
deriving stock (Eq, Ord, Show, Data, Generic)
151155

156+
data Bolt11Sig = Bolt11Sig
157+
{ bolt11SigVal :: Hex,
158+
bolt11SigRecoveryFlag :: Int
159+
}
160+
deriving stock (Eq, Ord, Show, Data, Generic)
161+
152162
data Bolt11 = Bolt11
153163
{ bolt11Hrp :: Bolt11Hrp,
154164
bolt11Timestamp :: Int, -- posix
155165
bolt11Tags :: [Tag], -- posix
156-
bolt11Signature :: Hex
166+
bolt11Signature :: Bolt11Sig
157167
}
158168
deriving stock (Eq, Ord, Show, Generic)
159169

@@ -200,13 +210,13 @@ w5bs = BS.pack . fromMaybe (error "what") . Bech32.toBase256
200210
w5txt :: [Word5] -> Text
201211
w5txt = decodeUtf8 . w5bs
202212

203-
tagParser :: [Word5] -> (Maybe Tag, [Word5])
204-
tagParser [] = (Nothing, [])
205-
tagParser ws@[_] = (Nothing, ws)
206-
tagParser ws@[_, _] = (Nothing, ws) -- appease the compiler warning gods
207-
tagParser ws
213+
parseTag :: [Word5] -> (Maybe Tag, [Word5])
214+
parseTag [] = (Nothing, [])
215+
parseTag ws@[_] = (Nothing, ws)
216+
parseTag ws@[_, _] = (Nothing, ws) -- appease the compiler warning gods
217+
parseTag ws
208218
| length ws < 8 = (Nothing, ws)
209-
tagParser ws@(typ : d1 : d2 : rest)
219+
parseTag ws@(typ : d1 : d2 : rest)
210220
| length rest < 7 = (Nothing, ws)
211221
| otherwise = (Just tag, leftovers)
212222
where
@@ -222,7 +232,7 @@ tagParser ws@(typ : d1 : d2 : rest)
222232
19 -> PayeePubkey datBs
223233
6 -> Expiry (w5int dat)
224234
24 -> MinFinalCltvExpiry (w5int dat)
225-
9 -> OnchainFallback datBs
235+
9 -> OnchainFallback
226236
3 -> ExtraRouteInfo
227237
5 -> FeatureBits dat
228238
n -> error ("unhandled typ " ++ show n)
@@ -232,24 +242,35 @@ data MSig
232242
| Unk [Word5]
233243
deriving stock (Eq, Ord, Show, Generic)
234244

235-
tagsParser :: [Word5] -> ([Tag], MSig)
236-
tagsParser ws
245+
parseTags :: [Word5] -> ([Tag], MSig)
246+
parseTags ws
237247
| length ws == 104 = ([], Sig ws)
238248
| otherwise =
239-
let (mtag, rest) = tagParser ws
249+
let (mtag, rest) = parseTag ws
240250
in maybe
241251
([], Unk rest)
242-
(\tag -> first (tag :) (tagsParser rest))
252+
(\tag -> first (tag :) (parseTags rest))
243253
mtag
244254

245255
decodeBolt11 :: Text -> Either String Bolt11
246256
decodeBolt11 raw = do
247257
(rawHrp, rawDp) <- first show $ Bech32.decodeLenient raw
248-
let (timestampBits, rest) = splitAt 7 $ Bech32.dataPartToWords rawDp
249-
timestamp = w5int timestampBits
250-
(tags, leftover) = tagsParser rest
251-
sig <- case leftover of
252-
Sig ws -> maybe (Left "corrupt") Right (Bech32.toBase256 ws)
253-
Unk left -> Left ("corrupt, leftover: " ++ show (Hex (w5bs left)))
254258
hrp <- parseOnly parseHrp $ Bech32.humanReadablePartToText rawHrp
255-
Right (Bolt11 hrp timestamp tags (Hex (BS.pack sig)))
259+
let (ts, rest) = splitAt 7 $ Bech32.dataPartToWords rawDp
260+
let (tags, leftover) = parseTags rest
261+
(rawSig, recFlag) <- case leftover of
262+
Sig ws -> Right $ splitAt 103 ws
263+
Unk left -> Left ("corrupt, leftover: " ++ show (Hex (w5bs left)))
264+
sig <-
265+
maybe (Left "corrupt") Right $ Bech32.toBase256 rawSig
266+
Right
267+
Bolt11
268+
{ bolt11Hrp = hrp,
269+
bolt11Timestamp = w5int ts,
270+
bolt11Tags = tags,
271+
bolt11Signature =
272+
Bolt11Sig
273+
{ bolt11SigVal = Hex $ BS.pack sig,
274+
bolt11SigRecoveryFlag = w5int recFlag
275+
}
276+
}

pub/functora/src/test/Functora/Bolt11Spec.hs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,39 @@ goodSamples =
2121
FeatureBits $ fmap toEnum [16, 8, 0]
2222
],
2323
bolt11Signature =
24-
"8d3ce9e28357337f62da0162d9454df827f83cfe499aeb1c1db349d4d81127425e434ca29929406c23bba1ae8ac6ca32880b38d4bf6ff874024cac34ba9625f101"
24+
Bolt11Sig
25+
{ bolt11SigVal =
26+
"8d3ce9e28357337f62da0162d9454df827f83cfe499aeb1c1db349d4d81127425e434ca29929406c23bba1ae8ac6ca32880b38d4bf6ff874024cac34ba9625f1",
27+
bolt11SigRecoveryFlag = 1
28+
}
29+
}
30+
),
31+
( "lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqsfpp3qjmp7lwpagxun9pygexvgpjdc4jdj85fr9yq20q82gphp2nflc7jtzrcazrra7wwgzxqc8u7754cdlpfrmccae92qgzqvzq2ps8pqqqqqqpqqqqq9qqqvpeuqafqxu92d8lr6fvg0r5gv0heeeqgcrqlnm6jhphu9y00rrhy4grqszsvpcgpy9qqqqqqgqqqqq7qqzqj9n4evl6mr5aj9f58zp6fyjzup6ywn3x6sk8akg5v4tgn2q8g4fhx05wf6juaxu9760yp46454gpg5mtzgerlzezqcqvjnhjh8z3g2qqdhhwkj",
32+
Bolt11
33+
{ bolt11Hrp =
34+
Bolt11Hrp
35+
{ bolt11HrpNet = BitcoinMainnet,
36+
bolt11HrpAmt =
37+
Just
38+
Bolt11HrpAmt
39+
{ bolt11HrpAmtNum = 20,
40+
bolt11HrpAmtMul = Milli
41+
}
42+
},
43+
bolt11Timestamp = 1496314658,
44+
bolt11Tags =
45+
[ PaymentHash "0001020304050607080900010203040506070809000102030405060708090102",
46+
DescriptionHash
47+
"3925b6f67e2c340036ed12093dd44e0368df1b6ea26c53dbe4811f58fd5db8c1",
48+
OnchainFallback,
49+
ExtraRouteInfo
50+
],
51+
bolt11Signature =
52+
Bolt11Sig
53+
{ bolt11SigVal =
54+
"91675cb3fad8e9d915343883a49242e074474e26d42c7ed914655689a8074553733e8e4ea5ce9b85f69e40d755a55014536b12323f8b220600c94ef2b9c51428",
55+
bolt11SigRecoveryFlag = 0
56+
}
2557
}
2658
)
2759
]

0 commit comments

Comments
 (0)