"""Offline, deliberately limited PSBT v0 exercise; no networking or wallet access.""" import base64,io,json,struct def compact(n): if not 0<=n<253:raise ValueError("fixture length out of range") return bytes([n]) def blob(b):return compact(len(b))+b def item(k,v):return blob(k)+blob(v) def script(byte):return bytes.fromhex("0014")+bytes([byte])*20 def output(value,byte):return struct.pack("=253:raise ValueError("this exercise only supports short CompactSize values") return n def var(s):return read(s,size(s)) def mapping(s): result={} while True: k=var(s) if not k:return result if k in result:raise ValueError("duplicate map key") result[k]=var(s) def parse(data): s=io.BytesIO(data) if read(s,5)!=b"psbt\xff":raise ValueError("bad magic") g=mapping(s) if set(g)!={b"\x00"}:raise ValueError("exercise requires only global unsigned tx") tx=io.BytesIO(g[b"\x00"]);version=struct.unpack("