{"id":19223762,"url":"https://github.com/coldcard/psbt_faker","last_synced_at":"2025-05-13T10:50:09.145Z","repository":{"id":46871808,"uuid":"239574958","full_name":"Coldcard/psbt_faker","owner":"Coldcard","description":"Create test PSBT files which are valid, but garbage values","archived":false,"fork":false,"pushed_at":"2025-04-17T13:57:34.000Z","size":70,"stargazers_count":19,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-18T04:10:53.645Z","etag":null,"topics":["coldcard","psbt-faker","wallet"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Coldcard.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-10T17:47:26.000Z","updated_at":"2025-04-17T13:57:37.000Z","dependencies_parsed_at":"2022-07-22T20:47:32.889Z","dependency_job_id":null,"html_url":"https://github.com/Coldcard/psbt_faker","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Coldcard%2Fpsbt_faker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Coldcard%2Fpsbt_faker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Coldcard%2Fpsbt_faker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Coldcard%2Fpsbt_faker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Coldcard","download_url":"https://codeload.github.com/Coldcard/psbt_faker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253928476,"owners_count":21985793,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coldcard","psbt-faker","wallet"],"created_at":"2024-11-09T15:09:28.632Z","updated_at":"2025-05-13T10:50:09.133Z","avatar_url":"https://github.com/Coldcard.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PSBT Faker\n\nA simple program to create test PSBT files, that are plausible and\nself-consistent so that PSBT-signing tools will actually sign them.\nDoes not involve any blockchains... completely made up inputs and \noutput addresses are chosen at random.\n\nYou should use the XPUB of the Coldcard you want experiment against.\nThis can be retrieved using `ckcc xpub` with the `ckcc-protocol`\nCLI tool, or by exporting the wallet (see Advanced \u003e MicroSD \u003e Export Wallet menu).\n\nFor the Coldcard Simulator, you could use `tpubD6NzVbkrYhZ4XzL5Dhayo67Gorv1YMS7j8pRUvVMd5odC2LBPLAygka9p7748JtSq82FNGPppFEz5xxZUdasBRCqJqXvUHq6xpnsMcYJzeh` which is also default.\n\n## Installation\n\n```sh\ngit clone https://github.com/Coldcard/psbt_faker.git\ncd psbt_faker\npython3 -m pip install -U pip setuptools\npython3 -m pip install --editable .\nrehash\n```\n\n## Usage\n\n```sh\n$ psbt_faker --help\nUsage: psbt_faker [OPTIONS] OUTPUT.PSBT [XPUB]\n\n  Construct a valid PSBT which spends non-existant BTC to random addresses!\n\nOptions:\n  -i, --num-ins INTEGER           Number of inputs (default 1)\n  -o, --num-outs INTEGER          Number of all txn outputs (default 2)\n  -c, --num-change INTEGER        Number of change outputs (default 1) from\n                                  num-outs\n  -f, --fee INTEGER               Miner's fee in Satoshis\n  -2, --psbt2                     Make PSBTv2\n  -s, --segwit                    [SS] Make inputs be segwit style\n  -w, --wrapped                   [SS] Make inputs be wrapped segwit style\n                                  (requires --segwit flag)\n  -a, --styles [p2wsh|p2sh|p2sh-p2wsh|p2wsh-p2sh|p2wpkh|p2pkh|p2wpkh-p2sh|p2sh-p2wpkh|p2tr]\n                                  Output address style (multiple ok). If\n                                  multisig only applies to non-change\n                                  addresses.\n  -6, --base64                    Output base64 (default binary)\n  -t, --testnet                   Assume testnet4 addresses (default mainnet)\n  -p, --partial                   [SS] Change first input so its different\n                                  XPUB and result cannot be finalized\n  -z, --zero-xfp                  [SS] Provide zero XFP and junk XPUB (cannot\n                                  be signed, but should be decodable)\n  -m, --multisig config.txt       [MS] CC Multisig config file (text)\n  -l, --locktime TEXT             nLocktime value (default 0), use 'current'\n                                  to fetch best block height from\n                                  mempool.space\n  -n, --input-amount INTEGER      Size of each input in sats (default 100k\n                                  sats each input)\n  -I, --incl-xpubs                [MS] Include XPUBs in PSBT global section\n  --help                          Show this message and exit.\n```\n\nOptions with `[MS]` are not supported \u0026 ignored for single-sig.\nOptions with `[SS]` are not supported \u0026 ignored for multi-sig.\n\n## Examples\n\n```sh\n$ export XPUB=tpubD6NzVbkrYhZ4Xp6tGusznF6KMdYHy1JSCdDk3XVLDuAA7EgJKghA5J1FP4pDXb4sCypJjAYPB4uTTXkVo2iWzK8BsMaccXTNyShDx3gxagi\n\n$ psbt_faker foo.psbt $XPUB -s -a p2wsh --fee 15000000 -n 300000000 -o 1 -c 0\n\nFake PSBT would send 3 BTC to: \n 2.85000000 =\u003e bc1qppvspp5ahvjg28rv90644857c5df3mwr7ypcy7a093n90prg992qtjkkgv \n 0.15000000 =\u003e miners fee\n\n\n$ psbt_faker foo.psbt $XPUB -o 10 -n 300000000\n\nFake PSBT would send 3 BTC to: \n 0.29999900 =\u003e 12YjQWLgh1TAtSzSS1BHKQaCrhEd2Cypv4  (change back)\n 0.29999900 =\u003e 136QZHT1icbGUkQNcAv4CLFp6Gfoxf9ixN \n 0.29999900 =\u003e 1M667r3frAjiLMWucHS14MBcgtmAjYL6fi \n 0.29999900 =\u003e 17puZckh3RzNaac3XmX2JYFaF4wNrNu1ng \n 0.29999900 =\u003e 1HbtSJcovvkTpCuKq7UPVfYyTg7G8wAdAk \n 0.29999900 =\u003e 1CYN8P1vPyfCscsUbWy2nRU4tLccewtBVQ \n 0.29999900 =\u003e 1KhMtnJGSk9pRN2DrGgEzdEZUs8w1H4zna \n 0.29999900 =\u003e 1Dx6uFvs2jY4xA4o9g36UFwSqrSGsUzxhD \n 0.29999900 =\u003e 1CvBjipyE9Vbdi8AJw345YMbhvq7TbTN7u \n 0.29999900 =\u003e 1AW1Z4oseyWj6ib2CkwYY9eEBS5mkvgymN \n 0.00001000 =\u003e miners fee\n\n\n$ psbt_faker foo.psbt $XPUB -n 10000000000  -o 13 -c 10\n\nFake PSBT would send 100 BTC to: \n 7.69230692 =\u003e 12YjQWLgh1TAtSzSS1BHKQaCrhEd2Cypv4  (change back)\n 7.69230692 =\u003e 1Pqtjz6c6fg3pduEGmnzUbBbZ8JzgERtR5  (change back)\n 7.69230692 =\u003e 1DsDJeZwmwsU9TY2vEmsVMWMfDrtGHHc2T  (change back)\n 7.69230692 =\u003e 18W8nXPVKwUFovKpTffLbL3uik3x4Qf6TX  (change back)\n 7.69230692 =\u003e 1qNozdz8fFMn7LVszM77WYwoJowUtKyaY  (change back)\n 7.69230692 =\u003e 1AtvwyUV634pGG46wyuZkZ5WhK7UCrhdgf  (change back)\n 7.69230692 =\u003e 1ABABZuHK2VF5w8pHQE23878adHYXSPWz3  (change back)\n 7.69230692 =\u003e 1GSfhvFLj75Xz7cHsLMMaLhuLMoYaUna4B  (change back)\n 7.69230692 =\u003e 16fBJHM7z91JxSnbrcHsDYTviespdouXUT  (change back)\n 7.69230692 =\u003e 1errmuAqcQNMW42XG1p2G7RqX2uBqeF8F  (change back)\n 7.69230692 =\u003e 15Kd3GBpTqbS6rzMMKHDPnSAktUoKDRqgc \n 7.69230692 =\u003e 15wErNoy7QSgovSHWUPWUt73fAs3bq98gN \n 7.69230692 =\u003e 1NkpHeWJ1dXeYQP8CWp6NuVLkTsZpNKQjx \n 0.00001000 =\u003e miners fee\n\n\npsbt_faker foo.psbt $XPUB -o 10 -a p2wpkh -a p2wsh -a p2sh -a p2pkh -a p2wsh-p2sh -a p2wpkh-p2sh\n\nFake PSBT would send 0.001 BTC to: \n 0.00009900 =\u003e bc1qzruxkvnknt2xmqu9y5pr09n4ewhtm89w6mfelv  (change back)\n 0.00009900 =\u003e bc1qc6yc0dmeu7tshepwsa7q8gwmxsa64gv0u476kqgdlruvndqe7nmsqh6krs \n 0.00009900 =\u003e 37UA1NpD2XNyLcn1eQXAFjJn3SFssXS84V \n 0.00009900 =\u003e 1A3okvZp3wGF2XZNqRhd8AAR23KH7rxt8W \n 0.00009900 =\u003e 34U4wbXXDsgn7Msr3Z1dgRybqLgJ2uN3qL \n 0.00009900 =\u003e 35FWGXE75wiedtsUe873qmKNZqJyCruCEf \n 0.00009900 =\u003e bc1q8qwl4vyj2avfa95st5zc5yj28kq4t874f0qkfk \n 0.00009900 =\u003e bc1qsxjshmg4zn6mul23gq2wk868qpm3f3tcmaqvr7zkz2xf6vwvl3vsqszsl6 \n 0.00009900 =\u003e 3G4GWg8v9mCQA9rFVncgyYPZqRSuQmhs7o \n 0.00009900 =\u003e 1Fwnq5tgepfYytk4n6cHcAjA44fXB7AYMz \n 0.00001000 =\u003e miners fee\n \n\n# how much BTC is send is regulated by -n/--input-amount and -i/--num-ins\n# by default all inputs have size of 100k SATS\n# below: 3 inputs each sending 1 million SATS\npsbt_faker foo.psbt $XPUB -i 3 -n 1000000\n\nFake PSBT would send 0.03 BTC to: \n 0.01499500 =\u003e 12YjQWLgh1TAtSzSS1BHKQaCrhEd2Cypv4  (change back)\n 0.01499500 =\u003e 1Cadzk6VAJaQasRnAxgoC43DUoDcq6dGua \n 0.00001000 =\u003e miners fee\n \n\n# fetches actual block height from mempool.space\npsbt_faker foo.psbt $XPUB -i 3 -n 10000000 -s -w --locktime current\n\nFake PSBT would send 0.3 BTC to: \n 0.14999500 =\u003e 3GcLByjaiNtTriQx2pSiU1sJoENFfKiUaf  (change back)\n 0.14999500 =\u003e 32VSUWdkJDGEJSuKd1oRUoowy22ThyA7LB \n 0.00001000 =\u003e miners fee\n\nPSBT to be signed: foo.psbt\n\n \npsbt_faker foo.psbt -o 10 -a p2wpkh -a p2wsh -a p2sh -a p2pkh -a p2wsh-p2sh -a p2wpkh-p2sh --multisig ms-example-segwit.txt -c 3\n\nFake PSBT would send 0.001 BTC to: \n 0.00009900 =\u003e bc1qme4du64p8q3l8aedn83vdh4exe7a8mxelsdcwvcx67hgyd9jfqeshx863n  (change back)\n 0.00009900 =\u003e bc1qc6qdln78rw8xhfc847v8jk4qdzx2pepvux3wrx403jmzwumqvwfq5st3vk  (change back)\n 0.00009900 =\u003e bc1qngfqnl7p6pkrmpyz7ttcqt6mx3phq4c7dm23f2dvgvczmkfajjzq98cjpm  (change back)\n 0.00009900 =\u003e bc1qpgdcenn3yecd0p28gk3guh4f2w4l4xrfas83z3 \n 0.00009900 =\u003e bc1q6tvdfcn0emctdg3vvpx2kn40msan34glku9pm7tsn8557kzjyqzstuekem \n 0.00009900 =\u003e 3CC1pUNnrMqp7gG2GfPDZe4JmjrJEqpmnk \n 0.00009900 =\u003e 1AjT1kjfcbS8aMRQc27FwzknqeqzHzM7Vs \n 0.00009900 =\u003e 36w5DNqWSR3vuKNrZsLF42SnFfjkEMMHv2 \n 0.00009900 =\u003e 3ETZ6Cp9Fsdrh5pkB9q9ay17E5JELJvma4 \n 0.00009900 =\u003e bc1qwse4nh9ful5ww95j7ej8jw562tas6j8aqa6qd6 \n 0.00001000 =\u003e miners fee\n \n \npsbt_faker foo.psbt -i 3 -o 5 -c 3 -n 1000000000 --multisig ms-example-segwit.txt --incl-xpubs\n\nFake PSBT would send 30 BTC to: \n 5.99999800 =\u003e bc1qngfqnl7p6pkrmpyz7ttcqt6mx3phq4c7dm23f2dvgvczmkfajjzq98cjpm  (change back)\n 5.99999800 =\u003e bc1qlt8yharuphh08l5trw96kz8w4jts2t45zwvafq72ma2rqgfktdvqcfa5xq  (change back)\n 5.99999800 =\u003e bc1qnytf7s8crz35lwk6822kqdajdlr30n2tl43jusdx0q2q26gfneyssc3lc5  (change back)\n 5.99999800 =\u003e bc1qrtz4gvmk453zplt78c264hkl3333f8xxcg2nq8cgvkrnucwgxzjqm05kge \n 5.99999800 =\u003e bc1qep2a66uh3kz20qk4vgr6yw8rezyzppszd3fyqzmmmt8xqamg66zqvjkg2h \n 0.00001000 =\u003e miners fee\n \n\n# PSBT version 2\npsbt_faker foo.psbt -i 3 -o 5 -c 3 -n 1000000000 --multisig ms-example-segwit.txt --psbt2 -a p2pkh\n\nFake PSBT would send 30 BTC to: \n 5.99999800 =\u003e bc1qngfqnl7p6pkrmpyz7ttcqt6mx3phq4c7dm23f2dvgvczmkfajjzq98cjpm  (change back)\n 5.99999800 =\u003e bc1qlt8yharuphh08l5trw96kz8w4jts2t45zwvafq72ma2rqgfktdvqcfa5xq  (change back)\n 5.99999800 =\u003e bc1qnytf7s8crz35lwk6822kqdajdlr30n2tl43jusdx0q2q26gfneyssc3lc5  (change back)\n 5.99999800 =\u003e 1HRPDRJ9tVSpE2gsn2qfphJbXGneDsqiDA \n 5.99999800 =\u003e 1CW14Y5ZzjHSxCidm2wWBRwgeHmzsFNbQM \n 0.00001000 =\u003e miners fee\n \n \npsbt_faker foo.psbt $XPUB -i 3  -n 100000000 --multisig ms-example.txt\n\nFake PSBT would send 3 BTC to: \n 1.49999500 =\u003e 3JeauQqiGXd5znAMums9KSpsXe8UhpS1tf  (change back)\n 1.49999500 =\u003e 3Q7NmnYDxh4yyFuT152SQbLtFsn19EJVED \n 0.00001000 =\u003e miners fee\n\n\npsbt_faker foo.psbt $XPUB -i 3  -o 10 -n 100000000 --multisig ms-example.txt --locktime 899000\n\nFake PSBT would send 3 BTC to: \n 0.29999900 =\u003e 3JeauQqiGXd5znAMums9KSpsXe8UhpS1tf  (change back)\n 0.29999900 =\u003e 3NVNTQVFNwLEN5qBK7292cbSeQhY8DCDCm \n 0.29999900 =\u003e 3K4UA17iU9UXhULNa3yC5B3WB8qq6XE5hp \n 0.29999900 =\u003e 37kfug24cD6AhZhukJrDPRU5sxwAvAYwU6 \n 0.29999900 =\u003e 38imUgvwSBJbo4CeUBQMFX7TeeKNsBnvdK \n 0.29999900 =\u003e 3CAzLxDv3fefoPQCDWkiuuwmsnSUBFzD4w \n 0.29999900 =\u003e 39SjZMdSfVAf5b2hBm1VmhegWYYHUnTnpn \n 0.29999900 =\u003e 38hJkV67aF6mX2Q6GGepGV8JModVs4k4VL \n 0.29999900 =\u003e 3L8uS7WF2K1Qbp3s8321zdZEpHJRo2KB2Z \n 0.29999900 =\u003e 3Euxvk1HcejZBc8VySTHp6icgieP4m2k7s \n 0.00001000 =\u003e miners fee\n \n \n# extended private key can be used instead of extended public key XPUB for signle-sig PSBTs\n# proper BIP-44 derivation path from master used in that case\nXPRV=tprv8ZgxMBicQKsPeXJHL3vPPgTAEqQ5P2FD9qDeCQT4Cp1EMY5QkwMPWFxHdxHrxZhhcVRJ2m7BNWTz9Xre68y7mX5vCdMJ5qXMUfnrZ2si2X4\n\npsbt_faker foo.psbt $XPRV -i 2  -o 2 -n 50000000 --locktime 899000 -s -w -6\n\nFake PSBT would send 1 BTC to: \n 0.49999500 =\u003e 36q7XpzinU7hM7eDaF37fBKV4sz73MPsfq  (change back)\n 0.49999500 =\u003e 38q4ecMQt33o6HP1kh1dZJ6CdRcUUAdftd \n 0.00001000 =\u003e miners fee\n \n \n# or use extended public key with key origin info to have \"deeper\" derivations in PSBT\n# no validation is run against the xpub\nXPUB='[0F056943/84h/1h/0h]tpubDC7jGaaSE66Pn4dgtbAAstde4bCyhSUs4r3P8WhMVvPByvcRrzrwqSvpF9Ghx83Z1LfVugGRrSBko5UEKELCz9HoMv5qKmGq3fqnnbS5E9r'\n\npsbt_faker foo.psbt $XPUB -i 3  -o 3 -c 2 -n 50000000 --locktime current -s -6\n\nFake PSBT would send 1.5 BTC to: \n 0.49999666 =\u003e bc1qupyd58ndsh7lut0et0vtrq432jvu9jtdwgtkgk  (change back)\n 0.49999666 =\u003e bc1qceytj4vfrg22cy7mp5mnfps4ffgseas20ak7fj  (change back)\n 0.49999666 =\u003e bc1qj55nlp4ntq35sklzgq34pr0ujz2muuws5nrvrg \n 0.00001000 =\u003e miners fee\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoldcard%2Fpsbt_faker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoldcard%2Fpsbt_faker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoldcard%2Fpsbt_faker/lists"}