mirror of
https://github.com/SeedSigner/seedsigner.git
synced 2026-10-05 15:08:25 +00:00
444 lines
52 KiB
Python
444 lines
52 KiB
Python
import pytest
|
|
from mock import MagicMock
|
|
from seedsigner.models import Seed, DecodeQR, DecodeQRStatus, QRType, EncodeQRDensity, PSBTParser
|
|
from embit import psbt, bip39
|
|
|
|
|
|
# this is an of this bug: https://github.com/Foundation-Devices/foundation-ur-py/issues/3
|
|
def test_ur_qr_decode_multisig():
|
|
|
|
qrcodes = [
|
|
"UR:CRYPTO-PSBT/28-29/LPCSCECSCACFCMCPCYBBRSPTSKHDSSJESGHTGYJLCLRHSGLFKPBDRPGHAMIYBBIACWHGRSHHPFMNVLCELPDNDYMYDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEAOAEAEAECPAOAOPMIHLFKBPRAEGOHKBNDTZMBELOKKDLWNZOWKNLHHAEYAGHKTYTVSJSIYNSPEHEMUCEVTLYCWJEDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEAOAEAEAECPAOAOPLYNMOKTBAIYVWNSJLSABYKGZTFGSKCSMUYTDYIDAXLPTBUTJOLFRTCYSTPTRLLUCECSGTATWMDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEAOAEAEAECPAOAXASFGRNDPFEFHJZNDJNUEJSIDHSGRQDSK"
|
|
, "UR:CRYPTO-PSBT/29-29/LPCSCACSCACFCMCPCYBBRSPTSKHDSSJYCLTKPFPELTISCMINESYTSGWFBZHTJLLRRSNLCKCEKBURNSHKDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEAOAEAEAECPAOAXSASBZTLSJKHHREFYCPHDBNSEEYWLFGDKKOWDROBGPMHLSPQDPDCPKGYTSTBDCPRECEQZEOVTMDDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEAOAEAEAECPAOAXTDSEBSOTLGIAGMTLRHTSWDCPDKEEBSCEHPJYPASKMSWLOTSTLEZOOLZSFYZOHDCSCEFMFECKZEDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEAOAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEEMEHMHSO"
|
|
, "UR:CRYPTO-PSBT/1-29/LPADCSCACFCMCPCYBBRSPTSKHDSSHKCMCTJOJKIDJYZMADAELDAOAEAEAEADOEVWFXYKGYENNSKTCXHPISFEEOLFNNPMPAKENSCXZEKBTTYKJOJYGTEEVDMDLBTYCAAEAEAEAEZCZMZMZMAOUOTIAXAEAEAEAEAECPAECXBDAHGMLSLACKTBGYLGCTFNRKWDEYSNVSIEMHINDAIOMOTAVAEEDYJPRKZTDKNEPAGDSRAEAEAEAEAEAECPAECXNSLPIEMSRKSTBBCNHYNYAAAMCMZTMKLDCYRKTEOYOYPFTDWSCMTPSWJYFDLKMDBGAEAEAEAEGWADAALOPRCKAAAHLFRLTNLAAEAEAOOTZTPMISSTBZBEIYGSFELEURTIAHLGUEMTOTHPDYTLGSIHLALUTTESGYTYETKOVOAXFEBZTTET"
|
|
, "UR:CRYPTO-PSBT/2-29/LPAOCSCACFCMCPCYBBRSPTSKHDSSFTUEZSUERESFWDLEBZHLJSHYTITKRHFLBEFGCASFYLJZVYTTMTPYWZPFSBFNMOMHBBKBURNSHKDYAEAELAAEAEAELAAEAEAELAAOAEAELAGWADAALOPRCKAAGMCXWSVDLAAEAEAORHRFBNKEMUHPSBKEURNETNDYLRHGVTMSYKUEZTISLTJPCNBNSTBEKIRSPKRKAHIOAORDREKIPSLBLEWZVDBZGUKEESTNIOAARPTIVWKTFMVELTMSBGTEBEJNHTTOWTNLENBBVTLYCWJEDYAEAELAAEAEAELAAEAEAELAAOAEAELAGWADAALOPRCKAAHEWSAMDMLAAEAEAOWSGEHKUONSIOCLGHDISGWYTAWFCEYKHDJOBBHHJPGTASCFBDPSOXHSBTIOSNFH"
|
|
, "UR:CRYPTO-PSBT/3-29/LPAXCSCACFCMCPCYBBRSPTSKHDSSINJOIAZEHSAOAEHLLSLSJESRSPCHKSGLFTKPCKHNKSIHRSLSTIYTFGFWIADTTIAYWDBKLYGMGYLNBBCSGTATWMDYAEAELAAEAEAELAAEAEAELAAOAEAELAGWADAALOPRCKAAHNMHAHGOLAAEAEAOSPBDDRHETNLNBGSTRYDLYLBKTPKBWKKTHYTSIAATDKWYGWFHSSFYDRTBTBMOOTLGAOWNBWPDLDGSFSIDLBLBHPLYRYCXLNCMJLQDSFENDINSFZJNROAMCNIYDKDNTOFHIYBBQZEOVTMDDYAEAELAAEAEAELAAEAEAELAAOAEAELAGWADAALOPRCKAAQZDADIASLAAEAEAOVTLSLUKKAEZCOEEMBSJTCKGDCYSRTLGMURVTYTTIOEPRVWNBDL"
|
|
, "UR:CRYPTO-PSBT/4-29/LPAACSCACFCMCPCYBBRSPTSKHDSSFWRHHKTYFRTADNJNHTLGZMAOEMLNLGBSONFGCYCMCPCMTDFSEEUOOSJEWFEEUELUVAEOLSTDLSKKTTWPEMZCMNSGBBLPDNDYMYDYAEAELAAEAEAELAAEAEAELAAOAEAELAGWADAALOPRCKAASELPFZINLAAEAEAOPEJTRHKKFSWMPFLAFZGHPDSSDRAHLRTNGTCTMYGYWZPYESKETKFXTOTLJLCPVTHEAXAHBGMTAMWNSBYAMTENCHZSVDNDCWFDGADPKGAXWTPEGRJKTDRPFGOLLYMKGUPMSPBBFMFECKZEDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEADAEZCAXBNAOAEAEAEAXNSMNIAMKWYMHDWTNSSBZGSCNCFURCFINGDHYCMGABKMWBE"
|
|
, "UR:CRYPTO-PSBT/5-29/LPAHCSCACFCMCPCYBBRSPTSKHDSSPSASCFNTRTFNKIIYCYMURNCFGTFWAEAEAEAEZMZMZMZMDPDYNLHPPTTTCAJYTIQDMKCFVAIHJYNTBBHGSNGTFNSRWNYLJYDLINKPVAMOGTHPAOAEAEAEAEZMZMZMZMWPSGRYMEAOENPAMWPRRECAHDMTIOATLGOSWDRYGYLNDPHGMEFNMYQDYTSTRDCEPDBBAEAEAEAEZMZMZMZMHTHPUYAAAEAEAEAEAECHPTBBOYMNWDWYSKCEKBDTDPGMJZSRFSADOEZMYLSKRYKELTJLMNADAEAEAEAEAECHPTBBSTRDAHSBNLKIWTZEGDLPLPESCTIMHKUEKPBGATPSLTLNHDAOAEAEAEAEAECFKOPTBBBBCFAOWMDMONPDMUCMLTTOUERHJZGTLYISRYZO"
|
|
, "UR:CRYPTO-PSBT/6-29/LPAMCSCACFCMCPCYBBRSPTSKHDSSMHMDWESKFPLOPSLPUOAHAEAEAEAEAECFKOPTBBHELDQZKBJZBSASFXRDONSFFNIHRFKOIDGSOXDELKLOPSTIAODIAEAEAEAEAECMAEBBRHVSZSZSLABSGUHEFTFLFZAOSWTTGOCWHTISZSLPFRBYAHAEAEAEAEAECFKOPTBBSWNTMHYKEHWTIOYLIAOSJPIADKFYFSLRJEVDTEOYLOPSBGGRAOAEAEAEAEAECHPTBBRFOTFHBYEMHECNRLKONNSOTSLBSBWSTDRPLYDWKPLTBDIMEMAEAEAEAEAECHPTBBKTMKCPOXOSBSFMFGROCHVETTKOVLDWWLIMEEHYLSLTDMAYCHAEAEAEAEAECFKOPTBBFTDSKTAMLPDWBTBAKBEYURLPKPWNOXPRZMCX"
|
|
, "UR:CRYPTO-PSBT/7-29/LPATCSCACFCMCPCYBBRSPTSKHDSSCFLTCNSADLKSLOPSLNHDAOAEAEAEAEAECFKOPTBBNTKEENNSPDZSMNWKCNSBWNHPHGWZYTHLTOGDISWLLOPSGAHDAOAEAEAEAEAECMAEBBJYBALOJZCHTKFHUOENONSFLNJPCHIYGUOEDSTEGRBZVEDPAEAEAEAEAECFKOPTBBYTONSFSBDRLGKGLODYCXHHSNWDYLRFIEKBCFKBSGLOPSEYFZAOAEAEAEAEAECFKOPTBBWEYLREAOFDRKFSTEJTJYJPTBMEKEESOTVSPYTASNLOPSYKAYCHAEAEAEAEAECMAEBBRHUYOYSACPHKOLVLDEPSTLFNHTBNTBUEAYCLPRCKFGOXADAEAEAEAEAECHPTBBCPZMESGYPDRHOXHPRYVYAHTYHSIMFZLOSF"
|
|
, "UR:CRYPTO-PSBT/8-29/LPAYCSCACFCMCPCYBBRSPTSKHDSSGLMKHGOLHDZTKKLTFLSPADAEAEAEAEAECFKOPTBBVYSWTTSALFVWLNDIESEOCKMOKOSEZTNDSWSKTBKNLOPSTIJLAMAEAEAEAEAECFKOPTBBGDGHEOHGJEJYFDTPHGEHEMIHAXPDKOCYCWGOVLFPLOPSCAGRAOAEAEAEAEAECFKOPTBBGOVLSOMSDPPYRDSBHSWTSGTTMYSBBSTPHKJPAXFLLOPSBSVWAMAEAEAEAEAECFKOPTBBLNWDJYSOCFJESKUONSFHUEKSUEADKSCEFLHDGOKBLOPSFDMDAAAEAEAEAEAECHPTBBTECELTFMMYVAFPVTTEHKKIWYCAVDBZFWRYTIEMASLTDMECAXAEAEAEAEAECFKOPTBBFLLNMDTIKSSAZCREWMIOBYAX"
|
|
, "UR:CRYPTO-PSBT/9-29/LPASCSCACFCMCPCYBBRSPTSKHDSSIYFRATVLHYSWUOEOECJZJNCPLOPSWDLEAAAEAEAEAEAECMAEBBBWCTDNLRONEOBSKTSTHKTDRPRSOXKISSKGSKPDKNGSLPAOAEAEAEAEAECFKOPTBBFDLSJEROFRBAYACXDYNSCSOLDIPRSAPTFTDPMDKKLOPSEMOLCWAEAEAEAEAECHPTBBFWFDEEZCMELGSTRNFXGDCNMYEECYHNUORKSTURKBLTBNFPAXAEAEAEAEAECFKOPTBBFNUTJLLGMYCKNELDKPUYHHGTCTBZCTGDKEBTEODSLOPSKOAYCHAEAEAEAEAECHPTBBFSZMJKTLCFNBFYGTHKGSYTPYLNVSRTHGMOOTHTWLLTMHRLGLAEAEAEAEAECFKOPTBBFLMKHYDRLBIOTPPSUTHNWN"
|
|
, "UR:CRYPTO-PSBT/10-29/LPBKCSCACFCMCPCYBBRSPTSKHDSSPYCSJTHNZOONFZCPFDLNFWPROTLOPSKIMNADAEAEAEAEAECHPTBBCWTPWLDYSEGTDKJTEMMUKNMHIDKGISFLWKUOOYSBLTKSNBAOAEAEAEAEAECHPTBBRFJKCYWZWNDSLKPSZSHYCTRFDISTSPOTHETKCKHGLTEMMDAAAEAEAEAEAECPAECXHDGWFDVTSPHDOLBNKIGETEECLKOSOXLPJSSNFXSGCLAHESJSVTURDYJZCWSRKNDTKSFZAOAEAEAEAEAECHPTBBMKFXHYPYSFZEEOKEBZNSFHMWKPVERDRTSADABBVTLTIMROAOAEAEAEAEAECHPTBBRESPVDFLDKJNAEVAPFAOJOJLEODEATKKSESTFYDELTCXLDBDAEAEAEAEAECFKOHYCMFNGH"
|
|
, "UR:CRYPTO-PSBT/11-29/LPBDCSCACFCMCPCYBBRSPTSKHDSSPTBBWEKBWDJKRNRKIYIEKKTBVDBWPATOFGUEWMROHHDYLOPSTIIOAXAEAEAEAEAECHPTBBTLDAFECTLDJOBNSGJLIEFLRSLSLSMSFNBSTTWKFLLTJOLSAXAEAEAEAEAECHPTBBLNGARENTKKZOVTMWPEDNJOHPZTWMGHSGHEPAYADMLTKNUOAHAEAEAEAEAECHPTBBFRDTJOSOFDJTOTEECXWLVEVOCNPTYTGOHFPFLTLOLTHHWPADAEAEAEAEAECFKOPTBBKNVTLGWMTYJSJOAOYLDPSKGEPYFPVTWYMKCECHZCLOPSIDSPAAAEAEAEAEAECMAEBBMDLYTNMKOTJERSKOJYEYTNSTWLFRMOLGWMJKJKBWNLTLADAEAEAEAEAECMAEBBVORDKSSW"
|
|
, "UR:CRYPTO-PSBT/12-29/LPBNCSCACFCMCPCYBBRSPTSKHDSSSSKTTDWDVYBBESBAONPYBBFWFGTECLPFGWCNFGHFJZSPADAEAEAEAEAECHPTBBRYBTISHEFEZEBGOXPYYNKKRHSOHDBWBGPKPFJZBGLTZEEHASAEAEAEAEAECMAEBBRHFXTAZOHPBKFXWNHELSOYGEYKFMCWHTFMEHAETONSETAXAEAEAEAEAECFKOPTBBMDJYWPFMPMGUECDEKTCAMTGRSRRHBKMNEHURPLJLLOPSHYJYCTAEAEAEAEAECFKOPTBBDYBKBTKINECMJNRPAAHDGHUYIMNDPMYAMESBWTCNLOPSMDKPCHAEAEAEAEAECHPTBBCAOLZETDWNFPRTREGSVYEMTLCNBSENRTTBRSDAUELTJEJOAXAEAEAEAEAECHPTBBHFFRECTSMENN"
|
|
, "UR:CRYPTO-PSBT/13-29/LPBTCSCACFCMCPCYBBRSPTSKHDSSWEMWENFZLBBGAHLEMWVOHPDYESDPMOEOJKINLTBZWSASAEAEAEAEAECHPTBBFZLUEMFXNDBSGUGRNDFMVDUYCXIEVWVWOSVSPMFELTHYTIAOAEAEAEAEAECFKOPTBBOEIEVDJPYLDLJELGSPLPAYSBGMLBVTMETSFZAXMYLOPSRYJZAXAEAEAEAEAECHPTBBCHFWATRHAHSETAIYFMGDPDGLRLHSHYTYWFWKHNOSLTTODNLNAXAEAEAEAECMAEBBDSRTJPENOYDATNSPGRBABAJTCPPSPYOLJKEYHHRKISHKBTAEAEAEAEAECHPTBBMHFEHSGYBTYLHHEYRLFTOSGYIEFRTEYNHTJPLTMHLTNBTEASAEAEAEAEAECHPTBBPDCYOYRSGOIOQZFGOE"
|
|
, "UR:CRYPTO-PSBT/14-29/LPBACSCACFCMCPCYBBRSPTSKHDSSEHWDWEESMYMDJOYNHSLPFNLECAATFPLTIMKBBDAEAEAEAEAECFKOPTBBSOTLCLDMOXASWSFSIAMOSWMSCHCMKOURGHDWKOPELOPSPFPMADAEAEAEAEAECHPTBBUYWSYAPKWKPMWFLPMOAMMUFEINBBCWHDLDGMKGUYLTAXKPCHAEAEAEAEAECFKOPTBBFLMUCFSRVSRNDTHSSBDWHDMSIMMHFTVELGPLVENLLOPSOEGEAOAEAEAEAEAECHPTBBZOVWGDPLMNFELEBZMYVOKBWSWKFTROYLDAFEJYIOLTQDLKAAAEAEAEAEAECMAEBBCYHGWNTSHGFZNEKKHGDLWSURETRNSOLNGOLUZTNBMTPFAAAEAEAEAEAECHPTBBLUBZVDDLEHGUPTIALYCP"
|
|
, "UR:CRYPTO-PSBT/15-29/LPBSCSCACFCMCPCYBBRSPTSKHDSSAERKCSSTTKPDMONEFEWLKIBSKELALTGTGTCSAEAEAEAEAECHPTBBCATBNEFDBEPAPSMSWNSROXBKTAMOCHWFGYSBGWEOLTMWBBATAEAEAEAEAECFKOPTBBRPVLHETEVDAYCESODTHDLUMHREJKSPSFDPHGAXGHLOPSLDGAAHAEAEAEAEAECHPTBBTIUYPFOYKSIYDWWNFDCWMKWPTTTPNSVYDMFSWLPALTTDWNHPAEAEAEAEAECHPTBBPKVDNSMNSTLAMDOYDTCTBWUOWFKGZTMHIHAHKOGRLTDLEEAYAEAEAEAEAECHPTBBHGWZYKGORHSGPKCMADZSMKIDGWBEPERSPMVOKOOYLTJYUOAHAEAEAEAEAECHPTBBCWADIYWFHGCTLEZSYTJZLBWE"
|
|
, "UR:CRYPTO-PSBT/16-29/LPBECSCACFCMCPCYBBRSPTSKHDSSFGMYDEMNPLDNMKIEUOENTIIDLTTANYADAEAEAEAEAECFKOPTBBHEISASFZFYNYLBINAXHGHLHLMENLMNSTSSCMSRBALOPSSSTKAHAEAEAEAEAECFKOPTBBJSDICLTSAEJZKSPAWKGMYKHSYAKGCPGRCKDLMTKTLOPSDPZSDPAEAEAEAEAECHPTBBMNFGMNGHFDWTGUDMADSSRSDISGLYYASAPDSPIONDLTDWHDAOAEAEAEAEAECFKOPTBBMEFXVLVTATQZSTFENSZMPLUYECIHHLIEATKEFWGULOPSLNGEAOAEAEAEAEAECFKOPTBBWDTNFZDLLYECIANTVYOSCNFXSGWDJYEETAAYHKNTLOPSKONYADAEAEAEAEAECHPTBBJYDELOHFZEVTTPBA"
|
|
, "UR:CRYPTO-PSBT/17-29/LPBYCSCACFCMCPCYBBRSPTSKHDSSTKGYADWYOLLPESSEPMNEJEHHESLYGUBKLTEHBZATAEAEAEAEAECMAEBBHFBNZTIHVEMDFGZOTOTIHYKKZSNDCYVSKNLDCHKNAMTLBKAEAEAEAEAECHPTBBJKHKTACHCXENSOAADASWEHRKRTDLAANLSFBGHNAMLTMOLEBDAEAEAEAEAECFKOPTBBJNIADANBGAEODPMTMYMOPTPEMYMYCYSGEOYNVOMDLOPSONSEASAEAEAEAEAECHPTBBLNLEWKAHBWBEFDJKDNQDSPJTCERKKTFHESDSSEMYLTDPEEAOAEAEAEAEAECHPTBBJTUYWDYTFENEKGPSAOVYMWJZSBJSFTMSDLGEMTAHLTJNKPAOAEAEAEAEAECHPTBBWMWSHEOSRODEJYCENLISAE"
|
|
, "UR:CRYPTO-PSBT/18-29/LPBGCSCACFCMCPCYBBRSPTSKHDSSPMBEHEHNADVLYTPRVDMOHTLOZTLTSFGEAOAEAEAEAEAECHPTBBQZCNPTSKGUTNNBMDZSCNPSKSPALTEHLUFPGYMENDLTCEGRAOAEAEAEAEAECHPTBBJYLGJORFLBNYTORFQDDIISDRLGJZHDHNHSHLGOCNLTPRNEAHAEAEAEAEAECHPTBBPTFSCSBYYLYNEOTPAODESNYLSOMHLDJYBDRTWYPMLTOEMDAAAEAEAEAEAECHPTBBSSAHTPRFAXBNCYMSMWSEQZNNLPBAPRMSQDURAAOLLTLRBNAMAEAEAEAEAECHPTBBNBBGOEECWZAXDEJESGAXKKUTSNNDBTCKTIMKRTENLTJZBEAOAEAEAEAEAECFKOPTBBNLMDSKKBLONDPDEOHSKKFMCPFXDP"
|
|
, "UR:CRYPTO-PSBT/19-29/LPBWCSCACFCMCPCYBBRSPTSKHDSSCFTEGRLRASLDATSATAMELOPSBSTYADAEAEAEAEAECHPTBBVWQZWDHEEYEYSOAXKOQZVDPEIADLJKNTDNUEOXDPLTMHHYAOAEAEAEAEAECFKOPTBBGASSRSLRSAHLFDWECABBGOCMEYLNZTMUKOBYPMYTLOPSLSGEAOAEAEAEAEAECFKOPTBBPYECBGRTFPASBAPAPSSFASGDEEVETOSGDASTCFTOLOPSKIDRASAEAEAEAEAECHPTBBAXTPDKIYKPWMRTFSVDGEDRUTVEYATPZEIDPYMNPRLTPMMDAAAEAEAEAEAECHPTBBKOCSPLMYFYWTMWKPVTSELDZSVEHYONHFVSVSTEHFLTDAKPCHAEAEAEAEAECMAEBBLABDLDVWLBLNGUJPDPCAVDENHD"
|
|
, "UR:CRYPTO-PSBT/20-29/LPBBCSCACFCMCPCYBBRSPTSKHDSSDTSBTKDECHRHPKHKVWMDMNKSGDAOAEAEAEAEAECHPTBBEODKPLETLBLDAMJOPMBNPEPLWMFZLTZTHGOEQZTELTLGAYCHAEAEAEAEAECHPTBBFXSAWKIDLTENBSKPJLFEFLMNCLPKEMTPWPMHMHIOLTKECSAMAEAEAEAEAECHPTBBINTKMWZMYNKNKEZCBGKTHDFEZOPAYNPRMEFTHPKGLTAEAEAEAEADADDNEMMDAAAEAEAEAEAECPAECXHDGWFDVTSPHDOLBNKIGETEECLKOSOXLPJSSNFXSGCLAHESJSVTURDYJZCWSRKNDTADAHTKGHCLAOFSTDLNUYSAASIESFDNRKHSMNJZTONLPSLDWFTDMNINOXEHHNKOTODRWPCHRORHDACLAEETWDVL"
|
|
, "UR:CRYPTO-PSBT/21-29/LPBZCSCACFCMCPCYBBRSPTSKHDSSAOHYTYLNWFESHNBNMEWLPRGDVWGSRSRSDYYAPRDYKPROTELTDEVTWSHGSACYSKDKFMCLAOSWMKBTHTBWLKWZKPSWJTGECPNLMDLKWSAEKNRELPMYWECPMYRKIDTYINEHRSCPFHCLAXBTDIMERPQZJKFTCSIHZCETSGSBTLPLGRDWHDWNUTWPLTBWTSFGWFZCEEAAIDKNZOCLAXHPFZFZWKBBOELSFGCSFPSRCLISDKESBGAOHSHNZTJYCAWFBTPRGATOBWEOGOAHYTCLAXMYZOWPFWSOYNQZYLZOETHTFYURSBUEHKFNTYFDNNVWTAFWCNHYGMROTYYAVWMDKBHFPLCPAMAOFSTDLNUYSAASIESFDNRKHSMNJZTONLPSLDWFTDMNINOXPTKNSSDR"
|
|
, "UR:CRYPTO-PSBT/22-29/LPCMCSCACFCMCPCYBBRSPTSKHDSSEHHNKOTODRWPCHRORHDACEFMFECKZEDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEADAEAEAECPAMAOHYTYLNWFESHNBNMEWLPRGDVWGSRSRSDYYAPRDYKPROTELTDEVTWSHGSACYSKDKFMCEVTLYCWJEDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEADAEAEAECPAMAOSWMKBTHTBWLKWZKPSWJTGECPNLMDLKWSAEKNRELPMYWECPMYRKIDTYINEHRSCPFHCELPDNDYMYDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEADAEAEAECPAMAXBTDIMERPQZJKFTCSIHZCETSGSBTLPLGRDWHDWNUTWPLTBWTSFGWFLTTBCFDR"
|
|
, "UR:CRYPTO-PSBT/23-29/LPCHCSCACFCMCPCYBBRSPTSKHDSSZCEEAAIDKNZOCECSGTATWMDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEADAEAEAECPAMAXHPFZFZWKBBOELSFGCSFPSRCLISDKESBGAOHSHNZTJYCAWFBTPRGATOBWEOGOAHYTCEQZEOVTMDDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEADAEAEAECPAMAXMYZOWPFWSOYNQZYLZOETHTFYURSBUEHKFNTYFDNNVWTAFWCNHYGMROTYYAVWMDKBCEKBURNSHKDYAEAELAAEAEAELAAEAEAELAAOAEAELAAEAEAEAEADAEAEAEAEADADTKGHCLAOVWVEPMOXMSKKSBOTDTJTFENBGYLRHSDLOXPMJEJOFZQZVLGLFDFZVSFRTIBZ"
|
|
, "UR:CRYPTO-PSBT/24-29/LPCSCSCSCACFCMCPCYBBRSPTSKHDSSRPROLPTSCLSECLAXBAHSMTDLKPDPVYVWDWKGYTHKCKRSSWEMSKGLDYPSHEBYFSEYTEQZSEHETNWYIEVDCLAXBWWKLKUTLYEYFXSKBTAOFRMONYTYKTDIHLYNSENSDIGREMTEHKPSEYLKLBKOKBHKCLAXNENBIDEEENKGHNMYZMPMDNNLMNQDFDIAGAEEBDKSKGDYBYDMPEYTWFDIROBZCHGWCLAXREAMJNKKZCESYKSWJOJPTBRDEOKGBSHHDTIYPSBEPSVWKSYKJPCPDKUYIMPEOSFECLAXWTSOSKSKFNWYBYLBNSHTEEEEECTORFLRBYCWROTKVTEMBDPDQDTEVALECAWNWDVYHFPLCPAOAOVWVEPMOXMSKKSBOTDTJTFENBGYLRHSTYRPGOLN"
|
|
, "UR:CRYPTO-PSBT/25-29/LPCSCFCSCACFCMCPCYBBRSPTSKHDSSDLOXPMJEJOFZQZVLGLFDFZRPROLPTSCLSECECSGTATWMDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXBAHSMTDLKPDPVYVWDWKGYTHKCKRSSWEMSKGLDYPSHEBYFSEYTEQZSEHETNWYIEVDCEVTLYCWJEDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXBWWKLKUTLYEYFXSKBTAOFRMONYTYKTDIHLYNSENSDIGREMTEHKPSEYLKLBKOKBHKCEKBURNSHKDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXNENBIDEEENKGHNMYZMPMDNNLMNQDFDIAGAEEBDWFWYAAGH"
|
|
, "UR:CRYPTO-PSBT/27-29/LPCSCWCSCACFCMCPCYBBRSPTSKHDSSRPGHAMIYBBIACWHGRSHHPFMNVLCLAOPMIHLFKBPRAEGOHKBNDTZMBELOKKDLWNZOWKNLHHAEYAGHKTYTVSJSIYNSPEHEMUCLAOPLYNMOKTBAIYVWNSJLSABYKGZTFGSKCSMUYTDYIDAXLPTBUTJOLFRTCYSTPTRLLUCLAXASFGRNDPFEFHJZNDJNUEJSIDJYCLTKPFPELTISCMINESYTSGWFBZHTJLLRRSNLCKCLAXSASBZTLSJKHHREFYCPHDBNSEEYWLFGDKKOWDROBGPMHLSPQDPDCPKGYTSTBDCPRECLAXTDSEBSOTLGIAGMTLRHTSWDCPDKEEBSCEHPJYPASKMSWLOTSTLEZOOLZSFYZOHDCSHFPLCPAOAOOEWLYATYBAOYLKOLSWMTTPMW"
|
|
, "UR:CRYPTO-PSBT/26-29/LPCSCYCSCACFCMCPCYBBRSPTSKHDSSKSKGDYBYDMPEYTWFDIROBZCHGWCEFMFECKZEDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXREAMJNKKZCESYKSWJOJPTBRDEOKGBSHHDTIYPSBEPSVWKSYKJPCPDKUYIMPEOSFECEQZEOVTMDDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXWTSOSKSKFNWYBYLBNSHTEEEEECTORFLRBYCWROTKVTEMBDPDQDTEVALECAWNWDVYCELPDNDYMYDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAEAEADADTKGHCLAOOEWLYATYBAOYLKOLJESGHTGYJLCLRHSGLFKPBDCLSEHYMT"
|
|
]
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
for i in qrcodes:
|
|
d.add_data(i)
|
|
assert d.qrType() == QRType.PSBTUR2
|
|
|
|
#complete should be true
|
|
assert d.isComplete() == True
|
|
|
|
base64_psbt = "cHNidP8BAIkCAAAAAaLlQ/VRNpx3IFtoRTOCnq2xfJwg/n7R9XB0TTTnlX/UHQAAAAD9////AtzQAwAAAAAAIgAgCwVSg4Ae1lGNHzy76jLN6GSQaSVnktnmNDByu/wkn7FQwwAAAAAAACIAIJyFZJe7xxQjXpoEBhb8mIkau9OhobDS7xbYxnRIjJUSAAAAAE8BBIiyHgQFgrfagAAAAqP8rWjHFRBmTEWK39AFjd6Wo1sw1UxlgIvROVHUOHbiAzre+t61zOqKFV1xXtDPuUcQRh3M92zh0Zar8rDLPJKQFH7fnFkwAACAAAAAgAAAAIACAACATwEEiLIeBFIg7+eAAAACubwMfJNby3zfn9owhFfgl/Xe/GiHciMMxxB9v6q7BWcCurV9rH+K8ucVU3w52mcEttDldz7kh5cS0xBtWs7wmTYU4IEbazAAAIAAAACAAAAAgAIAAIBPAQSIsh4EX+8GLoAAAALvSlncnGchVCfK7tnzHPVYcBRcck0JGQuspGFpcGP+YQIAXYODa8PIF3hOOnUeYHhlv4PQ+UZCYynQCOoKgVJRhhQYTQfrMAAAgAAAAIAAAACAAgAAgE8BBIiyHgRgkAVVgAAAAsgLKl/ahhLHvS/3Cth+9Hde12MHJO5PP8REKtbWkqONAvETqIlMPWJ/f1uBvSCGFm+zzDYnnEBtuAYjZiQrzj9mFLQz4JUwAACAAAAAgAAAAIACAACATwEEiLIeBLQlJwmAAAAC4IOLeQD9ojcPbh5QGsPVUt/g+dCiQrlZ1DvZK21ajf8CN4aND6VGGhYiFtI9NNyna/M03ovmM4PSg3nR7Df9jsoUhSswjzAAAIAAAACAAAAAgAIAAIBPAQSIsh4EwYVAaYAAAAKvbrl5PeuwgEBUqMQqBYTaTR+PUfKrOXzPQ87VbyLgXwMFEpYG8cv4ljYX+uebG0hJLXsD8K9Lc9K2RqaBmFOtyBQ+RR7+MAAAgAAAAIAAAACAAgAAgAABAP0DDAIAAAADnI5jmO6QLNrEFUwjGd8ZaVBeFqwJGZ3APH1mGpO+GU1CAAAAAP////8tMJlbqdEddNCzmBnmZXSdFFfNTTzD8fd0L2l15pJNWwIAAAAA/////+zKvZECNrGUsrUdWJZnB42n6r1Rhi1XkTyPs/nHuhyoFAAAAAD/////WlvbBAAAAAAAF6kUoY7q7sUcfiktUmzDPQGi//fFvXyHb44BAAAAAAAXqRTHugXLmX3w/lCFhTkfalnedRIHrIeGWAIAAAAAABl2qRQUGQLrLqWokxaHzt65bE2Qle3FQYishdwFAAAAAAAZdqkUX4m0fmwPCUO6pcw8Zbx2YkykKIyIrNACJwAAAAAAFgAUuej6+oAPU186R0ACxtFVG1po+oU7EQUAAAAAABl2qRTGnZD1MfBn92OncmMkRD2Ea+fToYisEksCAAAAAAAXqRS8oz8RN18jt3aeydd/y+/StoEsdYcLajcAAAAAABepFHeYIqSnDz5GuBfk0XbjLOlqNF6Dhy4IFwAAAAAAGXapFDomdwaFLA0OfjLfhXXxGYcjwi94iKyGWAIAAAAAABl2qRSdfDacqPqO9CPL8VtX8vldzlBo6YisSVgCAAAAAAAWABR0DohsF88/3DalzIZyF2ZToibTSxXkLQAAAAAAGXapFPmlzMsqjXuIMCBczer3vGR+GX7KiKwyQAIAAAAAABl2qRTt97UCSLs90250ctaRfDmj6KvZzYis9QgXAAAAAAAWABS526HCIlmm4yis1TxaDNbeCCGyHkakAQAAAAAAF6kUIv85Uai5pFu94QXUYU6YV6ZY/HmHR8gBAAAAAAAZdqkU4cbRwoLlhic5Mx6SdsH8m8bF1nqIrNBvBgAAAAAAGXapFFBUM1drdEjYVzE3ZQOodhobVeNBiKwdSwIAAAAAABl2qRRV48mXLau6y2HwytGPyw/YWXIDR4isD+UGAAAAAAAZdqkUhup0yRlrxdycP9543gF4HEdYVX6IrEiVBAAAAAAAF6kU0xyHPo/mQeDTWX3uHecVQr3QNwmHLjUDAAAAAAAZdqkUR4aV0HjC/bVmOwfjXsbcMzVsbSKIrOqKBAAAAAAAFgAUEx8rhKUzD3fHWdK2v6R9xHvFqHpMhQIAAAAAABl2qRRIg2u4Ow74IDCcGKYnssKpOi2VeYisN6YbAAAAAAAXqRRCSDT9kY3HvkNQI480GmDcu8fffocMQQMAAAAAABl2qRQ83W+Njx6fiXXbXE0fFR9QfA0zJoisdggXAAAAAAAXqRQ9/3PVGaBETVlM+auG6MBXkqNa6YeQt04AAAAAABl2qRRHmF4qf2fYqxhuYPulQCJIhkKyo4isfY4BAAAAAAAXqRQb2OkwwU0kbjeTepBie2hH9Nyhy4d4oAIAAAAAABepFLxzGvLxJoys+l4fvCfHyKNfzx5XhzeVBAAAAAAAIgAgWE9I4MhYpgx9StM1jKekhXHNQ8ohBTlx4N8wbBvDeil4QAIAAAAAABepFJhDXqvM/jN8FZw/lHXkusDCJRTgh2q4AgAAAAAAF6kUtcjnRyRtAOawAnBvMygHecHHRCiHIIkLAAAAAAAZdqkU7X7qc767ZmR51ucTsc5G3uu4XDCIrNBnAwAAAAAAF6kU1SVFH4lwDMpvZEe/g4OXPA/R9EeHcIMDAAAAAAAXqRSGSbWdefvglK8rcFv861TKX7H4Lod63AUAAAAAABepFDspcMlIbqM0IOnk4iOp+VVWsIeIh1zsAQAAAAAAGXapFHrgjevUcXAC9y3FSqtB4O6YHBf9iKxiyAQAAAAAABYAFJWB2pija792dDLax+k7ko3rc3MTmdUBAAAAAAAWABTEd9Lq4RQ5DqWrFEJG0yGwTyNGVmzIAQAAAAAAF6kUvQ1oX0X+EqSr9nm5yVgTEqqwbBKH/jEJAAAAAAAWABS5Q9n7WwpD8V+DoUr1PhtaPjEAzpw4AwAAAAAAGXapFJV07D6tUzUodx2WS8O5Co4x365viKxedB8AAAAAABl2qRQwCg19nxZttgRYVNtqm634kcvwI4islXUXAAAAAAAXqRQdpv7S8UHAtUzhN9UjDzbA1r8l3odrcAMAAAAAABepFFY77ZQ2QH8SBYqU4lswOS2SM3NphxXvCQAAAAAAF6kUQIs3Q5sPU0ubPufbIGTl5aforUWHXtACAAAAAAAZdqkUomTncvcva43IhQjLUn/gkddAA4+IrL1sAwAAAAAAF6kUF0IHuQXB2WY+UKhOt2Fe1PP0YKeHziuGAwAAAAAWABQmwHI2oSXayEsODm4irKumczJcu2hZDQAAAAAAF6kUkEVhUQ33XDK3OqdRZDvT9lpyh5CHoNMJAAAAAAAXqRSoGqG/VTHq7TmPlXD2YYU8ih0HQYdqfgsAAAAAABl2qRTJ1SEupAnvPWOSxpcXFnbfVCx2r4issK0BAAAAAAAXqRTb7/iq9K3zhZIGk0VpFBtYiVJ724cDdRcAAAAAABl2qRRHkxnD6L4pYcssWJdqkDrkja7kmYisokoCAAAAAAAXqRT75VCujkWKFY/ifu/0Orj3JUV0Z4ezjAQAAAAAABYAFBpX8ddXQJ95Vy/v3zi+yYZVi/yglrAEAAAAAAAXqRSLFecvMVMAuxjHz6iSn0XpfQ98gIdNTRgAAAAAABepFB3Wn0gQsayX8cOkCtmSF/NRy08zh5QUBwAAAAAAGXapFLbjX9PnCBzJKViLkLVzyMwtVwNUiKyJSQUAAAAAABepFNDbsKF4ZizxSBuY7NHYnOEuPemxh9LxWwAAAAAAF6kUquecjseAlaEpHxPc83v8kGUFdkuHLzQIAAAAAAAXqRRX8vVVucqqFgH6mGJPEK+/reJ2oYd03AUAAAAAABepFBsBZvNXH4r6Ro8ojq4rmGTcNtBih9maAQAAAAAAGXapFF9oCUBEmn9pA1ddXZGZjsfEFsMOiKzEzwUAAAAAABl2qRRxJyHXAGx4sfRS9WH4eyJLHi+Wd4isLfotAAAAAAAXqRSORo5USPBTLgHEvyfKgfjCqMhnm4csWAIAAAAAABl2qRSRQ+PgB7THRZz/rts1ZV1kB3xCU4ishkoCAAAAAAAZdqkU6tpAL4E1Y53hpyNDyup0NNkIWZ2IrHaaAQAAAAAAF6kUdCiIVs9RAe6mhTnBrZ9rXDmBUwqHMRUHAAAAAAAWABRWDPxl5JVG+87QXnn6mxroeokXegbVCgAAAAAAF6kUc1nZFyA2yQQlxjG7wC8EmcwSYAaHkooLAAAAAAAZdqkUbWMloEkzLZaPkqmvj48ayjP24pWIrKXBCQAAAAAAF6kUhor0BRMQSHMrs8huHLt3PzkmwY+HLTQCAAAAAAAXqRRu2+r5RZ97rALhlGzLcTqXL0qWBYdtdQIAAAAAABepFOvvX6e4KHStEF9gAeP5sueSWoj8h8xKAgAAAAAAF6kUtCOpxVPaoJX6I6x4sYcxi0FRkZuHHEsCAAAAAAAXqRR0jXC8f5rOvLMnaCqNbFhgYV1VI4eynwUAAAAAABepFKk9GBH39jPYAijN98mQiXQLwO6th6KVBAAAAAAAF6kUxAXYvAMMGpeUwbSehQ6yl7PfBKaHhAwGAAAAAAAXqRSgEqI18gMoa8oDed3Nmw0e0JjANodsEAIAAAAAABl2qRSZlcV+iJuoM2F5GdNLhAmJB8LZkYisD9QBAAAAAAAXqRTltOpfMjLJA3a0569jL3OdK96kLYeQXgIAAAAAABl2qRRJxL+Ewl1I7R0UVRYyhvyTdhGt+Yisg0oCAAAAAAAZdqkUqzUSwEEJDrGszAlQNOTOyiXHGc6IrH0qCQAAAAAAF6kUA9gkZnXrwD3nSird5PjY/mKrjrKHrZUEAAAAAAAXqRR2GK6PRPCUdeDBifrkXqVW6OjTVocldRcAAAAAABYAFIALieV/hlNyLSnLzygXuapZ5ZWOeFACAAAAAAAXqRQzJK44f4kGcK0Mr67rQIf8V6K004eNCBcAAAAAABepFEPC9GKHNg91b0VHjiGqN9jskJBnh3wYBgAAAAAAF6kUac+U//Z6fP0Sd1hF+7H2spE6W3uHAAAAAAEBKzeVBAAAAAAAIgAgWE9I4MhYpgx9StM1jKekhXHNQ8ohBTlx4N8wbBvDeikBBc9UIQI90obbwglkzCu7YY5szpmsifPSjmmkMWB2zirsF7i5JSECXtSG8zlgDJHpslDlTL+/MPiyMHW404co4O9XwhrFJD4hAsaYDVoTjPJ1xm5KIpmVjO8AerWFj+0ij7ti1GkxvyI/IQMNJ5G2tHM6GGX9OMrL1a5LLFjx3eyHE9dG8/00BGJ6+yEDW0BA9BSig0YYQcMhaCQ5EgJhYPx0HfMNsknOEzNVBfkhA4/77ELJ9rT3+zhaRN/L3lk81Eie5dlCI15SuNT45ZV+Vq4iBgI90obbwglkzCu7YY5szpmsifPSjmmkMWB2zirsF7i5JRw+RR7+MAAAgAAAAIAAAACAAgAAgAAAAAABAAAAIgYCXtSG8zlgDJHpslDlTL+/MPiyMHW404co4O9XwhrFJD4c4IEbazAAAIAAAACAAAAAgAIAAIAAAAAAAQAAACIGAsaYDVoTjPJ1xm5KIpmVjO8AerWFj+0ij7ti1GkxvyI/HIUrMI8wAACAAAAAgAAAAIACAACAAAAAAAEAAAAiBgMNJ5G2tHM6GGX9OMrL1a5LLFjx3eyHE9dG8/00BGJ6+xwYTQfrMAAAgAAAAIAAAACAAgAAgAAAAAABAAAAIgYDW0BA9BSig0YYQcMhaCQ5EgJhYPx0HfMNsknOEzNVBfkctDPglTAAAIAAAACAAAAAgAIAAIAAAAAAAQAAACIGA4/77ELJ9rT3+zhaRN/L3lk81Eie5dlCI15SuNT45ZV+HH7fnFkwAACAAAAAgAAAAIACAACAAAAAAAEAAAAAAQHPVCEC5eStpJd5y6MpbkWgUYRhL6Sta3BAtONOSEC2uIXXIcEhAw5hli91LeHlLHv5WR6/xjfFTjCsXxE9MtO0wV/a7mTnIQMT9IzdgTJDxQ0CO5Ka1HcnXfbBnCdLN9NZrDKMf3Z+WSEDn6BiNDZ7YI//rSuZjrNIY0k0C3h7MBEur/nzJ7gVF08hA7UGbXn9OfXGcHLWujN7D1wpZqwQrOV49XIiJNtqr6dFIQPwycXFPO4Rf5xaNDQ1zryEERu4z+A3C6iz0+aKHfHq4VauIgIC5eStpJd5y6MpbkWgUYRhL6Sta3BAtONOSEC2uIXXIcEcGE0H6zAAAIAAAACAAAAAgAIAAIABAAAAAAAAACICAw5hli91LeHlLHv5WR6/xjfFTjCsXxE9MtO0wV/a7mTnHOCBG2swAACAAAAAgAAAAIACAACAAQAAAAAAAAAiAgMT9IzdgTJDxQ0CO5Ka1HcnXfbBnCdLN9NZrDKMf3Z+WRx+35xZMAAAgAAAAIAAAACAAgAAgAEAAAAAAAAAIgIDn6BiNDZ7YI//rSuZjrNIY0k0C3h7MBEur/nzJ7gVF08cPkUe/jAAAIAAAACAAAAAgAIAAIABAAAAAAAAACICA7UGbXn9OfXGcHLWujN7D1wpZqwQrOV49XIiJNtqr6dFHLQz4JUwAACAAAAAgAAAAIACAACAAQAAAAAAAAAiAgPwycXFPO4Rf5xaNDQ1zryEERu4z+A3C6iz0+aKHfHq4RyFKzCPMAAAgAAAAIAAAACAAgAAgAEAAAAAAAAAAAEBz1QhAqLp+NQOoYyma8paUW8hucqCdQu2VAZmFGMbV79csI7jIQKtZYJ+sgBVWQwp/xCIeS/x+/SZXAD4VHf56HFmnK9fkyECrvaSdw5m5ZxvwhF7/EbFGJP5MGIDhdbdcILAGsept4shAwlGvi1FP2ybbd5xYnQhz7Cvh2gWaTn5yvMVWm+Ev5keIQPCy/yDc1y1RCJYDMEy6UYkduq4Eq1dyLOoInv5xwsitSED0sEPo41jUtW51+oiJDQPHFt0scWX6aPHivum+kT7WBhWriICAqLp+NQOoYyma8paUW8hucqCdQu2VAZmFGMbV79csI7jHIUrMI8wAACAAAAAgAAAAIACAACAAAAAAAIAAAAiAgKtZYJ+sgBVWQwp/xCIeS/x+/SZXAD4VHf56HFmnK9fkxzggRtrMAAAgAAAAIAAAACAAgAAgAAAAAACAAAAIgICrvaSdw5m5ZxvwhF7/EbFGJP5MGIDhdbdcILAGsept4scGE0H6zAAAIAAAACAAAAAgAIAAIAAAAAAAgAAACICAwlGvi1FP2ybbd5xYnQhz7Cvh2gWaTn5yvMVWm+Ev5keHH7fnFkwAACAAAAAgAAAAIACAACAAAAAAAIAAAAiAgPCy/yDc1y1RCJYDMEy6UYkduq4Eq1dyLOoInv5xwsitRy0M+CVMAAAgAAAAIAAAACAAgAAgAAAAAACAAAAIgID0sEPo41jUtW51+oiJDQPHFt0scWX6aPHivum+kT7WBgcPkUe/jAAAIAAAACAAAAAgAIAAIAAAAAAAgAAAAA="
|
|
|
|
assert base64_psbt == d.getBase64PSBT()
|
|
|
|
tx = d.getPSBT()
|
|
|
|
assert str(tx) == base64_psbt
|
|
|
|
def test_base64_single_frame_singlsig():
|
|
|
|
qrcodes = [
|
|
"cHNidP8BAHICAAAAAQDo5ey+2HIrNUkExsFhsImv1OK1cYA9x/bRjYQD+0UaAQAAAAD9////Apg6AAAAAAAAF6kUVuVZEcdpQ2zgABa9dRUNYHD4VuaHgSYAAAAAAAAWABQaLE4t0JbDRg4pNnmcf+cAWIcyawAAAAAAAQEfqGEAAAAAAAAWABRyuw9od6yuS0yiZljV0X12wG9e5CIGA/ZlEZvQubb6PmcnK+vlnd8aftYnrQ8wHYSxsD8tDp61GIshjoFUAACAAQAAgAAAAIAAAAAAAAAAAAAAAA=="
|
|
]
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
for i in qrcodes:
|
|
d.add_data(i)
|
|
assert d.qrType() == QRType.PSBTBASE64
|
|
|
|
#complete should be true
|
|
assert d.isComplete() == True
|
|
|
|
base64_psbt = "cHNidP8BAHICAAAAAQDo5ey+2HIrNUkExsFhsImv1OK1cYA9x/bRjYQD+0UaAQAAAAD9////Apg6AAAAAAAAF6kUVuVZEcdpQ2zgABa9dRUNYHD4VuaHgSYAAAAAAAAWABQaLE4t0JbDRg4pNnmcf+cAWIcyawAAAAAAAQEfqGEAAAAAAAAWABRyuw9od6yuS0yiZljV0X12wG9e5CIGA/ZlEZvQubb6PmcnK+vlnd8aftYnrQ8wHYSxsD8tDp61GIshjoFUAACAAQAAgAAAAIAAAAAAAAAAAAAAAA=="
|
|
|
|
assert base64_psbt == d.getBase64PSBT()
|
|
|
|
tx = d.getPSBT()
|
|
|
|
assert str(tx) == base64_psbt
|
|
|
|
mnemonic = "height demise useless trap grow lion found off key clown transfer enroll"
|
|
pw = ""
|
|
seed = Seed(mnemonic, passphrase=pw, wordlist=bip39.WORDLIST)
|
|
|
|
assert seed.mnemonic == mnemonic
|
|
|
|
assert seed.seed != None
|
|
|
|
pp = PSBTParser(tx,seed,"test")
|
|
|
|
assert tx.inputs[0].witness_utxo.value == 25000 # input amount in psbt
|
|
|
|
assert (pp.spend_amount + pp.change_amount + pp.fee_amount) == 25000
|
|
|
|
assert pp.change_amount == 0 # should have change, but not sure why not
|
|
|
|
assert pp.spend_amount == 24857
|
|
|
|
assert len(pp.destination_addresses) == 2
|
|
|
|
def test_ur2_sparrow_singlesig_to_self():
|
|
|
|
qrcodes = [
|
|
"UR:CRYPTO-PSBT/435-3/LPCFADQDAXCFAOOECYMSTBHDCSHDVYHTAXLATPBEOEDPAYIAWSYNAMSGSARSURCLDRKNFYZEWLHLMDTNATNYNSETJNZOKBGLFMRTMWOTLAFSSTYNTIPTLTTLWPVOZEHTAHTESNYADSHYVYFPDEBTBAIHIYTLWFUERDLKWTLSNLMWCHNDPSBWGRUTKSYLFLATVDCYNTDNGDTNURYLTTGUSSHNAEEEFZSRLEKEHDEMCYOTLDEMOTZORFDPKBCLBEHNREFWIDOSRSLRIOIAOXNLADDYENFMVOGLSGECDKBECSDSLUHNDTWYYTWFSNSPPESAZCGUDLDABAISLNJLWKJPRHBBRTEHYALRJYNYKPEOGLGLOLCPPYSEZTCHVLFMPELDGWCXGMSPHPGWAOKNBALOFXJLKNONPRBAPKYKIEVETEDWFXMDRTVWBYKSZTBTCLSGCSCPIYTPTYGYKIYNRTJLHLIEMNJYCTVYUEHGPRHN"
|
|
, "UR:CRYPTO-PSBT/440-3/LPCFADROAXCFAOOECYMSTBHDCSHDVYAOAEAEAEAORTHKYLIDWSLTBGSGTBSNIHDMPKVSAAWYKNIACELDCMGRLULRKNLUMKRSBACNCPTBADAEAEAECNCPAECXJPRPLBLURFIHEMSWRFLNECGOTKGRMHLBCSAXTYJKREPKWEBWEYAYIYNDJPCWFSLSZCZMZMZMDLIHKNPYASHLWECEMEGSSSVTAEEEFZSRNSKEGSVYWNCMAMTNATMWCYMYWTUEPDTDAEAEAEAECNCPAECXONRSTTHSLBCPREBTRHBGJKSEWYPMTNPKEHIHHELPQDLSLPFRWNKBBTVAPMDTBEDAZCZMZMZMAOPKPEAOAEAEAEAEAECHPTBBCAWPEEVAOYIMDISSIDNNRFISRHBDGLATSASWAXGULTPDHSAEAEAEAEAEAECMAEBBJPRKBSISKTPSPLGRGSOEIYHDTLTTKIKORTJLHYVEMNKPCTAEDLFPBASG"
|
|
, "UR:CRYPTO-PSBT/441-3/LPCFADRHAXCFAOOECYMSTBHDCSHDVYHTAXLATPBEOEDPAYIAWSYNAMSGSARSURCLDRKNFYZEWLHLMDTNATNYNSETJNZOKBGLFMRTMWOTLAFSSTYNTIPTLTTLWPVOZEHTAHTESNYADSHYVYFPDEBTBAIHIYTLWFUERDLKWTLSNLMWCHNDPSBWGRUTKSYLFLATVDCYNTDNGDTNURYLTTGUSSHNAEEEFZSRLEKEHDEMCYOTLDEMOTZORFDPKBCLBEHNREFWIDOSRSLRIOIAOXNLADDYENFMVOGLSGECDKBECSDSLUHNDTWYYTWFSNSPPESAZCGUDLDABAISLNJLWKJPRHBBRTEHYALRJYNYKPEOGLGLOLCPPYSEZTCHVLFMPELDGWCXGMSPHPGWAOKNBALOFXJLKNONPRBAPKYKIEVETEDWFXMDRTVWBYKSZTBTCLSGCSCPIYTPTYGYKIYNRTJLHLIEMNJYCTVYWZGSVWDN"
|
|
, "UR:CRYPTO-PSBT/443-3/LPCFADRKAXCFAOOECYMSTBHDCSHDVYAXADCTPDIARTHKYLIDWSLTAASGSARSUECLSANEPDFZEHDLRNWSGLNNHTYTBNGRYLVYWDCPCLTDAEAEAEAEADDKAXTBCHOSVEHPAHTESNYAUYOYCKRNDRTBGWIHIYTLWFUERDNYWTMSLSROHKRPKELPLONDKOUEJSKBKGIHKNDNAYHLWENSMEGSSSHNAEEEFZSRNSKEGSVYWNEEAATAPYIMPASNHPFWMETEAYBYHFRSBBZCDSRDTTLNADLBEMFTTSSOAHENPFNTVSVEBDHNDTWYKBBDEYTSLPFRJSLBBTVADPDTBEDAKIZEZMZMAOPKPEAOAEAECPAOAXWKGRNLJEVSZMWSIDSOTTEHHETYFTFXCASBMKGTURBWJLIMTLLUFWSTSSKIZMLAFXBALUECZTFTHPISKTDWPEGRGSCPIYHDTLGYKIKORTJLHLVEMNKPCTAERKWPCMJN"
|
|
]
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
for i in qrcodes:
|
|
d.add_data(i)
|
|
assert d.qrType() == QRType.PSBTUR2
|
|
|
|
#complete should be true
|
|
assert d.isComplete() == True
|
|
|
|
base64_psbt = "cHNidP8BAHECAAAAAQDo5ey+2HIrNUkExsFhsImv1OK1cYA9x/bRjYQD+0UaAQAAAAD9////AttBAAAAAAAAFgAUGixOLdCWw0YOKTZ5nH/nAFiHMmtAHwAAAAAAABYAFNbrl43uCJEN4CVjgbO9UzQYq3lB2XUfAE8BBDWHzwOUjfDCgAAAAIf4/x8q+YwsIsMjQZZKiYxG68KbV4Z0mlcxTbrtu8ApA/iB9364EPRoi0aEmjfRmywFry7wyW6Im2SQIsigPN9KEIshjoFUAACAAQAAgAAAAIAAAQDhAgAAAALAWfdi74cSytbNZS6q6ATuemMciRZLi4R6i5i/DiMi1gEAAAAjIgAgcrZ/i7xlN8a8hjVVz0uQfxgD1HO1qu0TMghmm3IbPYP9////L2V6qwld7RyRTMTgADRAw5x8TOHxFgbaB5Qaj/DeqNIAAAAAIyIAIKW/0WF/IrUNuRJzwe6t2qoxZV+Fs4OFO/F+DeatKRAl/f///wKqrwIAAAAAABepFB3sNOahaifEYp68aLkLTgfCxgNTh6hhAAAAAAAAFgAUcrsPaHesrktMomZY1dF9dsBvXuSOdR8AAQEfqGEAAAAAAAAWABRyuw9od6yuS0yiZljV0X12wG9e5AEDBAEAAAAiBgP2ZRGb0Lm2+j5nJyvr5Z3fGn7WJ60PMB2EsbA/LQ6etRiLIY6BVAAAgAEAAIAAAACAAAAAAAAAAAAAIgIDrP6rQqucOQEIEVa/N98mmnQ50B5IGGLEvCTDXAZJ0coYiyGOgVQAAIABAACAAAAAgAEAAAAAAAAAACICA+PijXYEywnDo/b1PUqGK6TA1kod1Ww5UiMjx8R9/4BDGIshjoFUAACAAQAAgAAAAIAAAAAAAwAAAAA="
|
|
|
|
assert base64_psbt == d.getBase64PSBT()
|
|
|
|
tx = d.getPSBT()
|
|
|
|
assert str(tx) == d.getBase64PSBT()
|
|
|
|
def test_base64_2_input_p2wsh():
|
|
|
|
base64_psbt = "cHNidP8BALICAAAAAq1DhxRK+mUH4T6uUNob8bUaZ7MP+44MW4+Y9bOxpjhZAAAAAAD9////aWclWQ+45HKrI07r878E2UrAupT2paT4QurbmtNjYNQBAAAAAP3///8CQEIPAAAAAAAiACCpkDPDhmIzPlkJrjw9A71xjbIUWf3VUB7ooFJhTVm04tjSIQEAAAAAIgAgjQKFDauIXsV5u23LBdYgOwX1FwGGrLiQfWzBtFKZ7dIAAAAATwEENYfPBD5i336AAAACQStJhNVJul7vHKbo83VdmuAW2m0WaXLKDlFANn7dUNoCNbhLMdw4Knz7Q7o6exdL6UFhQegW9nJb0SUStbLEpawUAgjLdzAAAIABAACAAAAAgAIAAIBPAQQ1h88EnbHQAIAAAAI/2Nc7x7iMpJNapTe/OJTV4oifqzQcYY9KV2+PGRjCdQJoww1WnSNqfcxXGyux0q1PqfmzUqgJNqKJCpmqI9t47BQmu4PEMAAAgAEAAIAAAACAAgAAgE8BBDWHzwS6wUg5gAAAAh1Pvr3ZZ+GvcUwJl9OPz2cLXOnTAcBEC7zDtqIOt3IcA1aOofNgUZFu0baQw54SqOcGA7KAvTDOXygfKRilU2OqFHPF2gowAACAAQAAgAAAAIACAACAAAEBK4CWmAAAAAAAIgAgiYAxcG7dnrEiZ4VHFVHOo18XCalvhZYuMqBr9n7HESQBBWlSIQJOjQgMfX26XEf+trHIEk3rYkEX5Y2NfrFKQARPcd2X8iEDBWHUgq25PfHvE+hlcBryJG7wo2y8jKUSPY7sd85OOMchA2iVcuKLD+2p1pgcAjfZ5d7b/sFt5xQ/aAoC7V0Vn3WHU64iBgJOjQgMfX26XEf+trHIEk3rYkEX5Y2NfrFKQARPcd2X8hwmu4PEMAAAgAEAAIAAAACAAgAAgAAAAAABAAAAIgYDBWHUgq25PfHvE+hlcBryJG7wo2y8jKUSPY7sd85OOMccAgjLdzAAAIABAACAAAAAgAIAAIAAAAAAAQAAACIGA2iVcuKLD+2p1pgcAjfZ5d7b/sFt5xQ/aAoC7V0Vn3WHHHPF2gowAACAAQAAgAAAAIACAACAAAAAAAEAAAAAAQErgJaYAAAAAAAiACAzd60wM9EFnPHSNbsSJfyipL8myVLVP2/vwzotVUSNxQEFaVIhAiKCMRLlzIhLkRbLIUIMx5KYJM0v6LcjW/mS6K7eFGwiIQKDzUflU23LeecRgzDo5IBCEvaWGfHW7JkNxzXvuc7FdCEDC5DtLoa61/Kk/pdpu0F9e6nKoRJIB9v7Ni377rZefgFTriIGAiKCMRLlzIhLkRbLIUIMx5KYJM0v6LcjW/mS6K7eFGwiHAIIy3cwAACAAQAAgAAAAIACAACAAAAAAAAAAAAiBgKDzUflU23LeecRgzDo5IBCEvaWGfHW7JkNxzXvuc7FdBwmu4PEMAAAgAEAAIAAAACAAgAAgAAAAAAAAAAAIgYDC5DtLoa61/Kk/pdpu0F9e6nKoRJIB9v7Ni377rZefgEcc8XaCjAAAIABAACAAAAAgAIAAIAAAAAAAAAAAAABAWlSIQKtIdmtKKuZrH7f2R4iIU8RWVOrCdHVWBCS+0e9pZJy/iEDoH074LrWPIA10hyXtBCJDT06GdLkA6+z/PxoJqomPHYhA6GoQ/otQdk71nUpYZFfbkSKdBkkSj4CuPTPYrzGp6JrU64iAgKtIdmtKKuZrH7f2R4iIU8RWVOrCdHVWBCS+0e9pZJy/hwCCMt3MAAAgAEAAIAAAACAAgAAgAEAAAAAAAAAIgIDoH074LrWPIA10hyXtBCJDT06GdLkA6+z/PxoJqomPHYcc8XaCjAAAIABAACAAAAAgAIAAIABAAAAAAAAACICA6GoQ/otQdk71nUpYZFfbkSKdBkkSj4CuPTPYrzGp6JrHCa7g8QwAACAAQAAgAAAAIACAACAAQAAAAAAAAAAAA=="
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(base64_psbt)
|
|
assert d.qrType() == QRType.PSBTBASE64
|
|
|
|
tx = d.getPSBT()
|
|
|
|
assert str(tx) == base64_psbt
|
|
|
|
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
|
|
pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test")
|
|
|
|
assert tx.inputs[0].witness_utxo.value == 10000000 # input amount 1 in psbt
|
|
|
|
assert tx.inputs[1].witness_utxo.value == 10000000 # input amount 2 in psbt
|
|
|
|
assert pp.input_amount == 20000000
|
|
|
|
assert (pp.spend_amount + pp.change_amount + pp.fee_amount) == 20000000
|
|
|
|
assert pp.destination_addresses[0] == "tb1q35pg2rdt3p0v27dmdh9st43q8vzl29cps6kt3yradnqmg55eahfqfgn83n"
|
|
|
|
assert len(pp.destination_addresses) == 1
|
|
|
|
def test_base64_1_input_p2sh_p2wsh():
|
|
|
|
base64_psbt = "cHNidP8BAHICAAAAAR30J629i3Y/R8woRpLQ9JUa31rKxyM+Ny4NEsme48GWAAAAAAD9////Atw5XQUAAAAAF6kUdSESczdYagEyToVUSXyT8VTNz+OHgJaYAAAAAAAWABTmav7/w4OOcfCiewfjsA7eaujhYAAAAABPAQQ1h88EPmLffoAAAAHdXEj2dn8EYJ+rRdXEYu5laq6lJI5Mp+3t63ckwty05QKrJBNPewhwQaGPYRif6+XaxozFXvTXn7pU24H6fRy1FxQCCMt3MAAAgAEAAIAAAACAAQAAgE8BBDWHzwSdsdAAgAAAAeeOv56oeaaFTrNonMKDHk1C8brbWGFvdlecVue+v0/RAn/g4yI3oYsyen7OOcT7caYl4Mn7nQbyonHcusUR+GhzFCa7g8QwAACAAQAAgAAAAIABAACATwEENYfPBLrBSDmAAAABpzrb4oeEh2NNy/w/fr3osfyZTx7AaGDPAcP+LqeR3bYC5ioqmXPuazp69HwimlvecLylm9BLuyl/VpPXqiVrl20Uc8XaCjAAAIABAACAAAAAgAEAAIAAAQEgAOH1BQAAAAAXqRSv3gkn8731qcPbSDu4TJOlJJZ/PocBBCIAIOeiFBX5x0vX6CacrAUVovrs1DDCcKJS5qptFS3sjpDpAQVpUiECZ+pFYkOTVjB+eG+vQFA3MNjZWiA6DjRcs1Wl36A/zgMhA2Ygckuwjah29wiVRgA6wFx51+6ayrzeCIQ2eE4zfxPtIQOnUlBn22cn2CPCZkMSI6cDaZK2SlLV20rT6pqMoQCJsFOuIgYCZ+pFYkOTVjB+eG+vQFA3MNjZWiA6DjRcs1Wl36A/zgMcc8XaCjAAAIABAACAAAAAgAEAAIAAAAAAAAAAACIGA2Ygckuwjah29wiVRgA6wFx51+6ayrzeCIQ2eE4zfxPtHCa7g8QwAACAAQAAgAAAAIABAACAAAAAAAAAAAAiBgOnUlBn22cn2CPCZkMSI6cDaZK2SlLV20rT6pqMoQCJsBwCCMt3MAAAgAEAAIAAAACAAQAAgAAAAAAAAAAAAAEAIgAgZBwTq05RkpqKv6FV6LQjuM07Qv0/bYfWVc9NUQOFvwQBAWlSIQI32jVSdTgeu7+YZKrWfgOZ2J/LV36c5rBoApTzhrNlDCEC+hEqm3XmRt862AFFeyJ7p1m8A+V7czj6OajUNgCfg4EhA/MUVfxGh4k3Po3LB8CmMRsvIHcGNO0elUgETaITZA3UU64iAgI32jVSdTgeu7+YZKrWfgOZ2J/LV36c5rBoApTzhrNlDBwCCMt3MAAAgAEAAIAAAACAAQAAgAEAAAAAAAAAIgIC+hEqm3XmRt862AFFeyJ7p1m8A+V7czj6OajUNgCfg4EcJruDxDAAAIABAACAAAAAgAEAAIABAAAAAAAAACICA/MUVfxGh4k3Po3LB8CmMRsvIHcGNO0elUgETaITZA3UHHPF2gowAACAAQAAgAAAAIABAACAAQAAAAAAAAAAAA=="
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(base64_psbt)
|
|
assert d.qrType() == QRType.PSBTBASE64
|
|
|
|
tx = d.getPSBT()
|
|
|
|
assert str(tx) == base64_psbt
|
|
|
|
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
|
|
pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test")
|
|
|
|
assert tx.inputs[0].witness_utxo.value == 100000000 # input amount 1 in psbt
|
|
|
|
assert pp.input_amount == 100000000
|
|
|
|
assert (pp.spend_amount + pp.change_amount + pp.fee_amount) == 100000000
|
|
|
|
assert pp.destination_addresses[0] == "tb1que40al7rsw88ru9z0vr78vqwme4w3ctqj694kx"
|
|
|
|
assert len(pp.destination_addresses) == 1
|
|
|
|
def test_ur_legacy():
|
|
|
|
qrcodes = [
|
|
"UR:BYTES/2OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3DJV07U94KMSQQQQQQQQZQ8A0CQSYQQQQQQQZQHA78FG5TANFV9Z2TPDWE57AUVCN2T06TDGCAJNYPAT9LVG5QFMU5QSQQQQQRLLLLLL3NZ3KK6TMJ2TTRH6SKU05V76GHEANAT2QSDCDPFG67YZQQPFFZKSZQQQQQQ0LLLLLUPYQRGRQQQQQQQQYGQZP4XCCZ3WFNWK"
|
|
, "UR:BYTES/2OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3DJV07U94KMSQQQQQQQQZQ8A0CQSYQQQQQQQZQHA78FG5TANFV9Z2TPDWE57AUVCN2T06TDGCAJNYPAT9LVG5QFMU5QSQQQQQRLLLLLL3NZ3KK6TMJ2TTRH6SKU05V76GHEANAT2QSDCDPFG67YZQQPFFZKSZQQQQQQ0LLLLLUPYQRGRQQQQQQQQYGQZP4XCCZ3WFNWK"
|
|
, "UR:BYTES/3OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GMPEQQQQQQQQQQ9SQZSRR3CY9AYW5V4Y0A5DMWD57JD7FXX9G95PYWVZYQGSX2Y0YENNVNLEHXVMTDS86QM4VNDHG9V0K3PNDMGAJLWLSTS6504SZYP80TGGDPFZR8AM7XZNM77XWKRHP0D0Y540FLPTA5C2HRUQ0"
|
|
, "UR:BYTES/3OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GMPEQQQQQQQQQQ9SQZSRR3CY9AYW5V4Y0A5DMWD57JD7FXX9G95PYWVZYQGSX2Y0YENNVNLEHXVMTDS86QM4VNDHG9V0K3PNDMGAJLWLSTS6504SZYP80TGGDPFZR8AM7XZNM77XWKRHP0D0Y540FLPTA5C2HRUQ0"
|
|
, "UR:BYTES/3OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GMPEQQQQQQQQQQ9SQZSRR3CY9AYW5V4Y0A5DMWD57JD7FXX9G95PYWVZYQGSX2Y0YENNVNLEHXVMTDS86QM4VNDHG9V0K3PNDMGAJLWLSTS6504SZYP80TGGDPFZR8AM7XZNM77XWKRHP0D0Y540FLPTA5C2HRUQ0"
|
|
, "UR:BYTES/4OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3Y0PYQFPQW6EJAC7ZGZUYVSCVLPJUS8CVFT8389KFXX82VM3YQMT26FRVHLVUQJ8XPZQYGR9FH3H26HSK99ZH3MQ4D7EHCS7Y752EP37HGG2X6RU5V3PKD7PMSPZQF9L7DESNZNS0H4V56978HCMAEG9D99CNY5LYCV247F58T7M66QUQYSS907LVPMZLKYAWMDGRRKT"
|
|
, "UR:BYTES/4OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3Y0PYQFPQW6EJAC7ZGZUYVSCVLPJUS8CVFT8389KFXX82VM3YQMT26FRVHLVUQJ8XPZQYGR9FH3H26HSK99ZH3MQ4D7EHCS7Y752EP37HGG2X6RU5V3PKD7PMSPZQF9L7DESNZNS0H4V56978HCMAEG9D99CNY5LYCV247F58T7M66QUQYSS907LVPMZLKYAWMDGRRKT"
|
|
, "UR:BYTES/5OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/GX8KAW6FYVRQ2HKD5T4WUJJ7K68T5262QQQQQQQPQY45QRGRQQQQQQQQYGQZP4XCCZ3WFNWK0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GQYZ5W53PQFMWVTS2CUAWJ43C87WR6ZZ705V5LU2AEKGEF8AM8FWP6TQFTD7AZGGZMKAVTUW8HDRTKMEET55FK6MX"
|
|
, "UR:BYTES/5OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/GX8KAW6FYVRQ2HKD5T4WUJJ7K68T5262QQQQQQQPQY45QRGRQQQQQQQQYGQZP4XCCZ3WFNWK0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GQYZ5W53PQFMWVTS2CUAWJ43C87WR6ZZ705V5LU2AEKGEF8AM8FWP6TQFTD7AZGGZMKAVTUW8HDRTKMEET55FK6MX"
|
|
, "UR:BYTES/5OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/GX8KAW6FYVRQ2HKD5T4WUJJ7K68T5262QQQQQQQPQY45QRGRQQQQQQQQYGQZP4XCCZ3WFNWK0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GQYZ5W53PQFMWVTS2CUAWJ43C87WR6ZZ705V5LU2AEKGEF8AM8FWP6TQFTD7AZGGZMKAVTUW8HDRTKMEET55FK6MX"
|
|
, "UR:BYTES/6OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/KTS8U3XQP95WYR8VQ9V2KWHCTS399T3ZQCP8DE3WPTRN462K8QLEC0GGTE73JNL3THXER9YLHVA9C8FVP9DHM5GUKUGYR2PSQQQGQQGQQZQQQQQQSQPQQQYQQQQQQQQRQQQQQGSXQTWM4303C7A5DWM089WJ3XMTV6EWQLJYCQYK3CSVASQ432E6LPWZY8XYUTHDXVQQ"
|
|
, "UR:BYTES/6OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/KTS8U3XQP95WYR8VQ9V2KWHCTS399T3ZQCP8DE3WPTRN462K8QLEC0GGTE73JNL3THXER9YLHVA9C8FVP9DHM5GUKUGYR2PSQQQGQQGQQZQQQQQQSQPQQQYQQQQQQQQRQQQQQGSXQTWM4303C7A5DWM089WJ3XMTV6EWQLJYCQYK3CSVASQ432E6LPWZY8XYUTHDXVQQ"
|
|
, "UR:BYTES/7OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/QZQQZQQQSQQQQQYQQGQQPQQQQQQQQQCQQQQQQQQPQ9R4YGGZDYQESZAAQHLY3L9L5VMSYRCQAXPWR6ES83NEC5XTMD4HPKVNGF4ZZQ4XNF7SKKG5KVH0UZPD3XXVNDWVP2CQAP0GLNRGQP2DHAD0U9HYLAF2UGSZQF5SRXQTH5ZLUJ8UH73NWQS0QR5C9C0TXQ7X08ZS"
|
|
, "UR:BYTES/7OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/QZQQZQQQSQQQQQYQQGQQPQQQQQQQQQCQQQQQQQQPQ9R4YGGZDYQESZAAQHLY3L9L5VMSYRCQAXPWR6ES83NEC5XTMD4HPKVNGF4ZZQ4XNF7SKKG5KVH0UZPD3XXVNDWVP2CQAP0GLNRGQP2DHAD0U9HYLAF2UGSZQF5SRXQTH5ZLUJ8UH73NWQS0QR5C9C0TXQ7X08ZS"
|
|
, "UR:BYTES/1OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/TYPUUURNVF607QGQ05PQQQQQQ9VXGQQDUMWH3LD9GH8XF4ZYJQNMQ80L6MC0KMV6JMVV22RDPZP0SQQQQQQQPLLLLLLSYS8ZQYQQQQQQQQTQQ9P6MG599TND0NJ54AZSE0ZHSHLY7Q4P94C79GQSQQQQQQQZYQPQ68Q0NLXPZYTUVURY6X4G8U7T5H4QVCHY3KKXAW0R"
|
|
, "UR:BYTES/1OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/TYPUUURNVF607QGQ05PQQQQQQ9VXGQQDUMWH3LD9GH8XF4ZYJQNMQ80L6MC0KMV6JMVV22RDPZP0SQQQQQQQPLLLLLLSYS8ZQYQQQQQQQQTQQ9P6MG599TND0NJ54AZSE0ZHSHLY7Q4P94C79GQSQQQQQQQZYQPQ68Q0NLXPZYTUVURY6X4G8U7T5H4QVCHY3KKXAW0R"
|
|
, "UR:BYTES/2OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3DJV07U94KMSQQQQQQQQZQ8A0CQSYQQQQQQQZQHA78FG5TANFV9Z2TPDWE57AUVCN2T06TDGCAJNYPAT9LVG5QFMU5QSQQQQQRLLLLLL3NZ3KK6TMJ2TTRH6SKU05V76GHEANAT2QSDCDPFG67YZQQPFFZKSZQQQQQQ0LLLLLUPYQRGRQQQQQQQQYGQZP4XCCZ3WFNWK"
|
|
, "UR:BYTES/2OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3DJV07U94KMSQQQQQQQQZQ8A0CQSYQQQQQQQZQHA78FG5TANFV9Z2TPDWE57AUVCN2T06TDGCAJNYPAT9LVG5QFMU5QSQQQQQRLLLLLL3NZ3KK6TMJ2TTRH6SKU05V76GHEANAT2QSDCDPFG67YZQQPFFZKSZQQQQQQ0LLLLLUPYQRGRQQQQQQQQYGQZP4XCCZ3WFNWK"
|
|
, "UR:BYTES/3OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GMPEQQQQQQQQQQ9SQZSRR3CY9AYW5V4Y0A5DMWD57JD7FXX9G95PYWVZYQGSX2Y0YENNVNLEHXVMTDS86QM4VNDHG9V0K3PNDMGAJLWLSTS6504SZYP80TGGDPFZR8AM7XZNM77XWKRHP0D0Y540FLPTA5C2HRUQ0"
|
|
, "UR:BYTES/3OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GMPEQQQQQQQQQQ9SQZSRR3CY9AYW5V4Y0A5DMWD57JD7FXX9G95PYWVZYQGSX2Y0YENNVNLEHXVMTDS86QM4VNDHG9V0K3PNDMGAJLWLSTS6504SZYP80TGGDPFZR8AM7XZNM77XWKRHP0D0Y540FLPTA5C2HRUQ0"
|
|
, "UR:BYTES/3OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/0QXPCDECDVJ8PS0DPW59YDWSH262DUZV6VAT4E4GMPEQQQQQQQQQQ9SQZSRR3CY9AYW5V4Y0A5DMWD57JD7FXX9G95PYWVZYQGSX2Y0YENNVNLEHXVMTDS86QM4VNDHG9V0K3PNDMGAJLWLSTS6504SZYP80TGGDPFZR8AM7XZNM77XWKRHP0D0Y540FLPTA5C2HRUQ0"
|
|
, "UR:BYTES/4OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3Y0PYQFPQW6EJAC7ZGZUYVSCVLPJUS8CVFT8389KFXX82VM3YQMT26FRVHLVUQJ8XPZQYGR9FH3H26HSK99ZH3MQ4D7EHCS7Y752EP37HGG2X6RU5V3PKD7PMSPZQF9L7DESNZNS0H4V56978HCMAEG9D99CNY5LYCV247F58T7M66QUQYSS907LVPMZLKYAWMDGRRKT"
|
|
, "UR:BYTES/4OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/3Y0PYQFPQW6EJAC7ZGZUYVSCVLPJUS8CVFT8389KFXX82VM3YQMT26FRVHLVUQJ8XPZQYGR9FH3H26HSK99ZH3MQ4D7EHCS7Y752EP37HGG2X6RU5V3PKD7PMSPZQF9L7DESNZNS0H4V56978HCMAEG9D99CNY5LYCV247F58T7M66QUQYSS907LVPMZLKYAWMDGRRKT"
|
|
, "UR:BYTES/6OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/KTS8U3XQP95WYR8VQ9V2KWHCTS399T3ZQCP8DE3WPTRN462K8QLEC0GGTE73JNL3THXER9YLHVA9C8FVP9DHM5GUKUGYR2PSQQQGQQGQQZQQQQQQSQPQQQYQQQQQQQQRQQQQQGSXQTWM4303C7A5DWM089WJ3XMTV6EWQLJYCQYK3CSVASQ432E6LPWZY8XYUTHDXVQQ"
|
|
, "UR:BYTES/7OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/QZQQZQQQSQQQQQYQQGQQPQQQQQQQQQCQQQQQQQQPQ9R4YGGZDYQESZAAQHLY3L9L5VMSYRCQAXPWR6ES83NEC5XTMD4HPKVNGF4ZZQ4XNF7SKKG5KVH0UZPD3XXVNDWVP2CQAP0GLNRGQP2DHAD0U9HYLAF2UGSZQF5SRXQTH5ZLUJ8UH73NWQS0QR5C9C0TXQ7X08ZS"
|
|
, "UR:BYTES/7OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/QZQQZQQQSQQQQQYQQGQQPQQQQQQQQQCQQQQQQQQPQ9R4YGGZDYQESZAAQHLY3L9L5VMSYRCQAXPWR6ES83NEC5XTMD4HPKVNGF4ZZQ4XNF7SKKG5KVH0UZPD3XXVNDWVP2CQAP0GLNRGQP2DHAD0U9HYLAF2UGSZQF5SRXQTH5ZLUJ8UH73NWQS0QR5C9C0TXQ7X08ZS"
|
|
, "UR:BYTES/8OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/E0DKKUXEJDPX589HZPQ6SVQQQZQQZQQQSQQQQQYQQGQQPQQPQQQQQPQQQQQZYQSZ56D86Z6EZJEJALSG9KYCEJD4ES9TQR59AR7VDQQ9FKL44LSKUNL3E38ZAMFNQQQQSQQSQQYQQQQQPQQZQQQGQQGQQQQQGQQQQQQQ0P6SEH"
|
|
]
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
for i in qrcodes:
|
|
if d.add_data(i) == DecodeQRStatus.COMPLETE:
|
|
break
|
|
assert d.qrType() == QRType.PSBTURLEGACY
|
|
|
|
#complete should be true
|
|
assert d.isComplete() == True
|
|
|
|
tx = d.getPSBT()
|
|
|
|
mnemonic = "zone zone zone zone zone abandon ability able abandon ability able abstract"
|
|
pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test")
|
|
|
|
assert pp.input_amount == 200000
|
|
|
|
assert pp.fee_amount == 226
|
|
|
|
assert pp.spend_amount == 123456
|
|
|
|
assert pp.change_amount == (pp.input_amount - pp.spend_amount - pp.fee_amount)
|
|
|
|
assert pp.change_amount == 76318
|
|
|
|
def test_specter_multisig_animated_qr():
|
|
|
|
qrcodes = [
|
|
"p2of5 OUsU2k9a6Valj6kLb/Bh2gB7YuxenNz7LY5PFJkKc60wAACAAQAAgAAAAIACAACATwEENYfPBEgFouKAAAACOeERUyCmIJuSdQNDB1mxkahw4tc2UCtjxJQoQGnRCtQCZUSXwQF+nA8dl/RG6U1b9ViWJxkzNrDCCagYEWch72cUrnhJ4jAAAIABAACAAAAAgAIAAIAAAQErckUPAAAAAAAiACDwHjagvyTvVDVn+RqxW0xaMLODBm2IVCwDBQm5uK8rDQEFR1IhAi/hk/Tz0aHcNwsVyv86bqQj30sUexPl"
|
|
, "p3of5 c738CqJg+flLIQKmgeTdVjPh9P+MPnsTPbFRcGGLPAO3iTyYBR7eYQC4VlKuIgYCL+GT9PPRodw3CxXK/zpupCPfSxR7E+VzvfwKomD5+UscrnhJ4jAAAIABAACAAAAAgAIAAIABAAAACgAAACIGAqaB5N1WM+H0/4w+exM9sVFwYYs8A7eJPJgFHt5hALhWHJkKc60wAACAAQAAgAAAAIACAACAAQAAAAoAAAAAAQErMHUAAAAAAAAiACAUS+ztgOw4wxEOYDdQEZp42Ii3sA39MdXZMWolM3s9VgEFR1Ih"
|
|
, "p4of5 Amdcnz6cgLhxNS0Lv3mz7OVOGunGsAlEsekZiQRDLDXHIQLfPg77+MKPe073vgkXRfWAZMxohe3ysPahJ0jIFl3GU1KuIgYCZ1yfPpyAuHE1LQu/ebPs5U4a6cawCUSx6RmJBEMsNcccrnhJ4jAAAIABAACAAAAAgAIAAIAAAAAAQgAAACIGAt8+Dvv4wo97Tve+CRdF9YBkzGiF7fKw9qEnSMgWXcZTHJkKc60wAACAAQAAgAAAAIACAACAAAAAAEIAAAAAAQEr8FUAAAAAAAAiACCcheUwIAj6XLtEe5QO"
|
|
, "p5of5 +fTi25/ZvJGX9MuZkpghbW3VMgEFR1IhAkhWBpUeAB+UbbJc8f1fkEMEZgIChQVpMdJnD05uBtU4IQMUAdnwr2UVz6AhNBI5j6an4wHRGVX3uhSLaWy2qS70xlKuIgYCSFYGlR4AH5Rtslzx/V+QQwRmAgKFBWkx0mcPTm4G1TgcmQpzrTAAAIABAACAAAAAgAIAAIAAAAAARAAAACIGAxQB2fCvZRXPoCE0EjmPpqfjAdEZVfe6FItpbLapLvTGHK54SeIwAACAAQAAgAAAAIACAACAAAAAAEQAAAAAAA=="
|
|
, "p1of5 cHNidP8BAKQCAAAAA6DLc9RAdKwWQb/7Nrq1FyAtDQ3e0w5E4LkLpcrwBL0aAAAAAAD9////78NG2vqjywKaa0QHfo6C44o1+odXeWZ43FfHy4bLdxABAAAAAP3///8rhueJha90HzgJ6alnJ1uvi0Zbq0JQoXnwDb0Cjn79DwAAAAAA/f///wHWCBAAAAAAABYAFDraKFKubXzlSvRQy8V4X+TwKhLXAAAAAE8BBDWHzwQJeplqgAAAAqmHnnoRR+XJd7gJt/PhLazKeWAfCBLJ4/OF/s0PqqF1AzK8fctt"
|
|
]
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
for i in qrcodes:
|
|
if d.add_data(i) == DecodeQRStatus.COMPLETE:
|
|
break
|
|
assert d.qrType() == QRType.PSBTSPECTER
|
|
|
|
#complete should be true
|
|
assert d.isComplete() == True
|
|
|
|
tx = d.getPSBT()
|
|
|
|
mnemonic = "zone zone zone zone zone abandon ability able abandon ability able abstract"
|
|
pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test")
|
|
|
|
assert pp.input_amount == 1052818
|
|
|
|
assert pp.change_amount == 0
|
|
|
|
assert pp.spend_amount == 1052818 - pp.fee_amount
|
|
|
|
assert pp.fee_amount == 1980
|
|
|
|
tx.sign_with(pp.root)
|
|
|
|
trimmed_tx = PSBTParser.trim(tx)
|
|
|
|
expected_signed_trimmed_base64 = "cHNidP8BAKQCAAAAA6DLc9RAdKwWQb/7Nrq1FyAtDQ3e0w5E4LkLpcrwBL0aAAAAAAD9////78NG2vqjywKaa0QHfo6C44o1+odXeWZ43FfHy4bLdxABAAAAAP3///8rhueJha90HzgJ6alnJ1uvi0Zbq0JQoXnwDb0Cjn79DwAAAAAA/f///wHWCBAAAAAAABYAFDraKFKubXzlSvRQy8V4X+TwKhLXAAAAAAAiAgKmgeTdVjPh9P+MPnsTPbFRcGGLPAO3iTyYBR7eYQC4VkcwRAIga3QJaZWl+pwWMjMc2PjxNIeFHeg6TF5bb57VYY5qg5cCIGRT9zijaAwbPkBMDqmKQSjEmqWSiAEDkRznqZYggIRGAQAiAgLfPg77+MKPe073vgkXRfWAZMxohe3ysPahJ0jIFl3GU0cwRAIgFEHGf3EbOMs/MPoWmbm/rBqSKyaST4XC+7WLqEsukgUCIFtimNwjtrGq4oI0QbIfJNC2HuedHKE9PyO7HULWTUfHAQAiAgJIVgaVHgAflG2yXPH9X5BDBGYCAoUFaTHSZw9ObgbVOEcwRAIgAsQjpMwk1Hz+LOIc4WWcR4dGA7h/IIqUPpqvVZup1HgCIDkKf/vx5xUQnI3ISjv5/vMd5qpXkMdy6mv8bnn881/pAQAA"
|
|
|
|
assert str(trimmed_tx) == expected_signed_trimmed_base64
|
|
|
|
qrcodes2 = [
|
|
"p3of5 c738CqJg+flLIQKmgeTdVjPh9P+MPnsTPbFRcGGLPAO3iTyYBR7eYQC4VlKuIgYCL+GT9PPRodw3CxXK/zpupCPfSxR7E+VzvfwKomD5+UscrnhJ4jAAAIABAACAAAAAgAIAAIABAAAACgAAACIGAqaB5N1WM+H0/4w+exM9sVFwYYs8A7eJPJgFHt5hALhWHJkKc60wAACAAQAAgAAAAIACAACAAQAAAAoAAAAAAQErMHUAAAAAAAAiACAUS+ztgOw4wxEOYDdQEZp42Ii3sA39MdXZMWolM3s9VgEFR1Ih"
|
|
, "p4of5 Amdcnz6cgLhxNS0Lv3mz7OVOGunGsAlEsekZiQRDLDXHIQLfPg77+MKPe073vgkXRfWAZMxohe3ysPahJ0jIFl3GU1KuIgYCZ1yfPpyAuHE1LQu/ebPs5U4a6cawCUSx6RmJBEMsNcccrnhJ4jAAAIABAACAAAAAgAIAAIAAAAAAQgAAACIGAt8+Dvv4wo97Tve+CRdF9YBkzGiF7fKw9qEnSMgWXcZTHJkKc60wAACAAQAAgAAAAIACAACAAAAAAEIAAAAAAQEr8FUAAAAAAAAiACCcheUwIAj6XLtEe5QO"
|
|
, "p5of5 +fTi25/ZvJGX9MuZkpghbW3VMgEFR1IhAkhWBpUeAB+UbbJc8f1fkEMEZgIChQVpMdJnD05uBtU4IQMUAdnwr2UVz6AhNBI5j6an4wHRGVX3uhSLaWy2qS70xlKuIgYCSFYGlR4AH5Rtslzx/V+QQwRmAgKFBWkx0mcPTm4G1TgcmQpzrTAAAIABAACAAAAAgAIAAIAAAAAARAAAACIGAxQB2fCvZRXPoCE0EjmPpqfjAdEZVfe6FItpbLapLvTGHK54SeIwAACAAQAAgAAAAIACAACAAAAAAEQAAAAAAA=="
|
|
, "p1of5 cHNidP8BAKQCAAAAA6DLc9RAdKwWQb/7Nrq1FyAtDQ3e0w5E4LkLpcrwBL0aAAAAAAD9////78NG2vqjywKaa0QHfo6C44o1+odXeWZ43FfHy4bLdxABAAAAAP3///8rhueJha90HzgJ6alnJ1uvi0Zbq0JQoXnwDb0Cjn79DwAAAAAA/f///wHWCBAAAAAAABYAFDraKFKubXzlSvRQy8V4X+TwKhLXAAAAAE8BBDWHzwQJeplqgAAAAqmHnnoRR+XJd7gJt/PhLazKeWAfCBLJ4/OF/s0PqqF1AzK8fctt"
|
|
, "p2of5 OUsU2k9a6Valj6kLb/Bh2gB7YuxenNz7LY5PFJkKc60wAACAAQAAgAAAAIACAACATwEENYfPBEgFouKAAAACOeERUyCmIJuSdQNDB1mxkahw4tc2UCtjxJQoQGnRCtQCZUSXwQF+nA8dl/RG6U1b9ViWJxkzNrDCCagYEWch72cUrnhJ4jAAAIABAACAAAAAgAIAAIAAAQErckUPAAAAAAAiACDwHjagvyTvVDVn+RqxW0xaMLODBm2IVCwDBQm5uK8rDQEFR1IhAi/hk/Tz0aHcNwsVyv86bqQj30sUexPl"
|
|
]
|
|
|
|
d2 = DecodeQR(wordlist=bip39.WORDLIST)
|
|
for i in qrcodes2:
|
|
if d2.add_data(i) == DecodeQRStatus.COMPLETE:
|
|
break
|
|
assert d2.qrType() == QRType.PSBTSPECTER
|
|
|
|
#complete should be true
|
|
assert d2.isComplete() == True
|
|
|
|
tx2 = d2.getPSBT()
|
|
|
|
mnemonic2 = "able bacon cable able bacon cable abandon abandon abandon abandon abandon access"
|
|
pp2 = PSBTParser(tx2,Seed(mnemonic2, wordlist=bip39.WORDLIST),"test")
|
|
|
|
assert pp2.input_amount == 1052818
|
|
|
|
assert pp2.change_amount == 0
|
|
|
|
assert pp2.spend_amount == 1052818 - pp.fee_amount
|
|
|
|
assert pp2.fee_amount == 1980
|
|
|
|
tx2.sign_with(pp2.root)
|
|
|
|
trimmed_tx2 = PSBTParser.trim(tx2)
|
|
|
|
expected_signed_trimmed_base642 = "cHNidP8BAKQCAAAAA6DLc9RAdKwWQb/7Nrq1FyAtDQ3e0w5E4LkLpcrwBL0aAAAAAAD9////78NG2vqjywKaa0QHfo6C44o1+odXeWZ43FfHy4bLdxABAAAAAP3///8rhueJha90HzgJ6alnJ1uvi0Zbq0JQoXnwDb0Cjn79DwAAAAAA/f///wHWCBAAAAAAABYAFDraKFKubXzlSvRQy8V4X+TwKhLXAAAAAAAiAgIv4ZP089Gh3DcLFcr/Om6kI99LFHsT5XO9/AqiYPn5S0cwRAIgMJcGjoczA/ht/oTuE30a5StXa9l72t5+jayaURudfnECIGw+ymYS2RDszHL+KXRuoiNjvAUiIIKE7wa7+RKORevBAQAiAgJnXJ8+nIC4cTUtC795s+zlThrpxrAJRLHpGYkEQyw1x0cwRAIgH5pFuC079UUXzPJU1ya57Lak9Yc4NkAttmOEsNphd/cCIBnVkzO/wVfD5dxWKXbqdHazwUirh2zcY1MIH1skRqkbAQAiAgMUAdnwr2UVz6AhNBI5j6an4wHRGVX3uhSLaWy2qS70xkcwRAIgVrv+vZ9iG1njv8wrSCuhhLIlkMRqk4lxnHBRMHTzVWUCIELRLHVXUTyL0rFWA8aNADWjkOB/pepeQst7u2GryIylAQAA"
|
|
|
|
assert str(trimmed_tx2) == expected_signed_trimmed_base642
|
|
|
|
def test_mnemonic_qr():
|
|
|
|
mnemonic = "height demise useless trap grow lion found off key clown transfer enroll"
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
|
|
assert d.add_data(mnemonic) == DecodeQRStatus.COMPLETE
|
|
assert d.getSeedPhrase() == mnemonic.split()
|
|
|
|
bad_mnemonic = "height useless trap grow lion found off key clown transfer enroll"
|
|
d2 = DecodeQR(wordlist=bip39.WORDLIST)
|
|
assert d2.add_data(bad_mnemonic) == DecodeQRStatus.INVALID
|
|
|
|
bad2_mnemonic = "words not in the list of bip39"
|
|
d3 = DecodeQR(wordlist=bip39.WORDLIST)
|
|
assert d3.add_data(bad2_mnemonic) == DecodeQRStatus.INVALID
|
|
|
|
def test_short_4_letter_mnemonic_qr():
|
|
|
|
short_nm = "heig demi usel trap grow lion foun off key clow tran enro"
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(short_nm)
|
|
|
|
assert d.isComplete() == True
|
|
assert d.getSeedPhrase() == ["height", "demise", "useless", "trap", "grow", "lion", "found", "off", "key", "clown", "transfer", "enroll"]
|
|
|
|
def test_bitcoin_address():
|
|
|
|
bad1 = "loremipsum"
|
|
bad2 = "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae"
|
|
bad3 = "121802020768124106400009195602431595117715840445"
|
|
|
|
legacy_address1 = "1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY"
|
|
legacy_address2 = "16ftSEQ4ctQFDtVZiUBusQUjRrGhM3JYwe"
|
|
|
|
main_bech32_address = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"
|
|
test_bech32_address = "tb1qkurj377gtlmu0j5flcykcsh2xagexh9h3jk06a"
|
|
|
|
main_nested_segwit_address = "3Nu78Cqcf6hsD4sUBAN9nP13tYiHU9QPFX"
|
|
test_nested_segwit_address = "2N6JbrvPMMwbBhu2KxqXyyHUQz3XKspvyfm"
|
|
|
|
main_bech32_address2 = "bitcoin:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq?amount=12000"
|
|
main_bech32_address3 = "BITCOIN:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq?junk"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(bad1)
|
|
|
|
assert d.qrType() == QRType.INVALID
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(legacy_address1)
|
|
|
|
assert d.getAddress() == legacy_address1
|
|
assert d.getAddressType() == "P2PKH-main"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(legacy_address2)
|
|
|
|
assert d.getAddress() == legacy_address2
|
|
assert d.getAddressType() == "P2PKH-main"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(main_bech32_address)
|
|
|
|
assert d.getAddress() == main_bech32_address
|
|
assert d.getAddressType() == "Bech32-main"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(test_bech32_address)
|
|
|
|
assert d.getAddress() == test_bech32_address
|
|
assert d.getAddressType() == "Bech32-test"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(main_nested_segwit_address)
|
|
|
|
assert d.getAddress() == main_nested_segwit_address
|
|
assert d.getAddressType() == "P2SH-main"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(test_nested_segwit_address)
|
|
|
|
assert d.getAddress() == test_nested_segwit_address
|
|
assert d.getAddressType() == "P2SH-test"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(main_bech32_address2)
|
|
|
|
assert d.getAddress() == "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"
|
|
assert d.getAddressType() == "Bech32-main"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(main_bech32_address3)
|
|
|
|
assert d.getAddress() == "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"
|
|
assert d.getAddressType() == "Bech32-main"
|
|
|
|
def test_seed_qr():
|
|
seed = "121802020768124106400009195602431595117715840445"
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(seed)
|
|
|
|
assert d.qrType() == QRType.SEEDQR
|
|
assert d.getSeedPhrase() == "obscure bone gas open exotic abuse virus bunker shuffle nasty ship dash".split()
|
|
|
|
def test_specter_wallet_json():
|
|
|
|
parts = [
|
|
'p1of3 {"label": "SeedSigner Dev Funds", "blockheight": 692143, "descriptor": "wsh(sortedmulti(4,[e0811b6b/48h/0h/0h/2h]xpub6E8v7uy63pCeJvHe5W8ea8zTnCtKMFgMRb5bueWWcUFMw6sWmUwTqxM8cFiKQRWkA2Fxth9HJZufJwjWTTvU1UGZNpTrh9khrswYMgeHiCt/0/*,[852b308f/48h/0h/0h/2h]xpub6ErhgAWfnEqW7xDBm1iLq5JjNyUS65YUFnjHLrRv9zmdDEtuE75bpWQ8o6bSBnpT6AkrrsA8eA5SmEFArZn11KEPaZJzx9mHTXPWZCsxLyh/0/*,[7edf9c59/48h/0h/0h/2h]xpub6DaFfKoe7Wpofr'
|
|
, 'p2of3 bYeNo3Wv2AiLUMeyrPwotXfukFxUHbK4JxaLHTd5394QtH5wnjFzBgr2YnJpHhXv25Zsqv2APmMFvH1DsKHj5LCr3pmXs/0/*,[b433e095/48h/0h/0h/2h]xpub6EF51itHko2YhGTjVeuYbBgJjVbTzzpYzn2a3JwZHpDrMePRVgXGBHMx2Yv1KwgLsUn9i7ExcAo8uqMx4pDjVRY9J7qnceFAwRRj16dd5AS/0/*,[184d07eb/48h/0h/0h/2h]xpub6EEoTpcQu7N4R8D84pJjZ69j3mi'
|
|
, 'p3of3 nevnYLDDoo2HBzYBXTQ4rGVf4XGTyCYFwJuZdsF9MyFYJNzYEjg5LGMA1ubTGWuDnjHAZz6ficVRDTSy/0/*,[3e451efe/48h/0h/0h/2h]xpub6ExQPvQxGBMaPxr8Fv7Vq91ztJFFX3VWvtpvex6UPZ1AptTeuAiJGCtKkgwJkrwpMZMagh9ex6rL4sM8axfFcdQbERoFCRUKTJxrBkJh56g/0/*))#c44hel9e", "devices": [{"type": "other", "label": "Keith"}, {"type": "other", "label": "Nick"}, {"type": "other", "label": "Richard"}, {"type": "other", "label": "Stephan"}, {"type": "other", "label": "SeedSigner 1"}, {"type": "other", "label": "SeedSigner 2"}]}'
|
|
]
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(parts[1])
|
|
d.add_data(parts[2])
|
|
d.add_data(parts[0])
|
|
|
|
assert d.qrType() == QRType.SPECTERWALLETQR
|
|
assert d.isComplete() == True
|
|
assert d.getWalletDescriptor() == "wsh(sortedmulti(4,[e0811b6b/48h/0h/0h/2h]xpub6E8v7uy63pCeJvHe5W8ea8zTnCtKMFgMRb5bueWWcUFMw6sWmUwTqxM8cFiKQRWkA2Fxth9HJZufJwjWTTvU1UGZNpTrh9khrswYMgeHiCt/0/*,[852b308f/48h/0h/0h/2h]xpub6ErhgAWfnEqW7xDBm1iLq5JjNyUS65YUFnjHLrRv9zmdDEtuE75bpWQ8o6bSBnpT6AkrrsA8eA5SmEFArZn11KEPaZJzx9mHTXPWZCsxLyh/0/*,[7edf9c59/48h/0h/0h/2h]xpub6DaFfKoe7WpofrbYeNo3Wv2AiLUMeyrPwotXfukFxUHbK4JxaLHTd5394QtH5wnjFzBgr2YnJpHhXv25Zsqv2APmMFvH1DsKHj5LCr3pmXs/0/*,[b433e095/48h/0h/0h/2h]xpub6EF51itHko2YhGTjVeuYbBgJjVbTzzpYzn2a3JwZHpDrMePRVgXGBHMx2Yv1KwgLsUn9i7ExcAo8uqMx4pDjVRY9J7qnceFAwRRj16dd5AS/0/*,[184d07eb/48h/0h/0h/2h]xpub6EEoTpcQu7N4R8D84pJjZ69j3minevnYLDDoo2HBzYBXTQ4rGVf4XGTyCYFwJuZdsF9MyFYJNzYEjg5LGMA1ubTGWuDnjHAZz6ficVRDTSy/0/*,[3e451efe/48h/0h/0h/2h]xpub6ExQPvQxGBMaPxr8Fv7Vq91ztJFFX3VWvtpvex6UPZ1AptTeuAiJGCtKkgwJkrwpMZMagh9ex6rL4sM8axfFcdQbERoFCRUKTJxrBkJh56g/0/*))#c44hel9e"
|
|
|
|
def test_specter_wallet_json2():
|
|
|
|
part = '{"label": "Testnet Single Zone", "blockheight": 2090512, "descriptor": "wpkh([990a73ad/84h/1h/0h]tpubDDHQMDnFdan2GyHBsG32VW9qiygbhVizGRTjiS3H79M49FSvpsvLXqLgp1yC7r43dXVHozWavi2Fc4WHUpZmQYmzoQbit28qJhLjScbAQWU/0/*)#ujr0xunp","devices": [{"type": "seedsigner", "label": "Single Seed Zone Testnet"}]}'
|
|
|
|
d = DecodeQR(wordlist=bip39.WORDLIST)
|
|
d.add_data(part)
|
|
|
|
assert d.qrType() == QRType.SPECTERWALLETQR
|
|
assert d.isComplete() == True
|
|
|
|
|