Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fidelity bond wallets #544

Merged
merged 16 commits into from
Jun 2, 2020
Merged

Fidelity bond wallets #544

merged 16 commits into from
Jun 2, 2020

Conversation

chris-belcher
Copy link
Contributor

@chris-belcher chris-belcher commented Mar 21, 2020

A pull request to add to joinmarket wallets that can support fidelity bonds, including watch-only wallets. See this writeup about fidelity bonds and why they are useful: https://gist.github.com/chris-belcher/18ea0e6acdb885a2bfbdee43dcd6b5af/ and also #371

Later pull requests will have the makers and takers actually make use of fidelity bonds. This one is just the wallet side.

Commits in this PR are logically separated to aid in review.

The PR has a few smaller commits which lay the groundwork, including one commit 145eb34 that adds support for freeze addresses which are addresses which use OP_CHECKLOCKTIMEVERIFY to freeze funds until a certain date. This commit will probably conflict slightly with #536, but I skimmed that PR and it doesn't seem too bad.

@chris-belcher
Copy link
Contributor Author

chris-belcher commented Mar 21, 2020

A brief tour of the wallet.

The script generating a wallet now asks the user if it should support fidelity bonds

(jmvenv) scripts$ python3 wallet-tool.py generate
User data location: .
2020-03-21 22:33:22,957 [DEBUG]  rpc: getnewaddress []
Would you like to use a two-factor mnemonic recovery phrase? write 'n' if you don't know what this is (y/n): n
Not using mnemonic extension
Enter wallet file encryption passphrase: 
Reenter wallet file encryption passphrase: 
Input wallet file name (default: wallet.jmdat): testfidelity.jmdat
Would you like this wallet to support fidelity bonds? write 'n' if you don't know what this is (y/n): y
Write down this wallet recovery mnemonic

evidence initial knee image inspire plug dad midnight blast awkward clean between

Generated wallet OK

The wallet-tool script has a new method gettimelockaddress which is used to obtain a new address which locks coins until a user-specified date.

(jmvenv) scripts$ python3 wallet-tool.py testfidelity.jmdat gettimelockaddress 2020-4
User data location: .
2020-03-21 22:03:47,930 [DEBUG]  rpc: getnewaddress []
Enter wallet decryption passphrase: 
2020-03-21 22:03:49,915 [DEBUG]  rpc: listaddressgroupings []
2020-03-21 22:03:49,916 [DEBUG]  Fast sync in progress. Got this many used addresses: 3
2020-03-21 22:04:51,042 [DEBUG]  rpc: listunspent [0]
2020-03-21 22:04:51,045 [DEBUG]  bitcoind sync_unspent took 0.0074367523193359375sec
path = m/49'/1'/0'/2/3:1585699200
Coins sent to this address will be not be spendable until the year 2020. Full date: 2020-04-01 00:00:00
bcrt1qrc2qu3m2l2spayu5kr0k0rnn9xgjz46zsxmruh87a3h3f5zmnkaqlfx7v5

After funding those addresses they appear in the usual wallet-tool display. Locktimes are fixed to midnight on the first of each month, for a maximum locktime until the year 2050. This means that the synchronization code keeps track of 360 addresses per public key. Only mixdepth zero has timelocked addresses and burner output pubkeys.

(jmvenv) scripts$ python3 wallet-tool.py testfidelity.jmdat
User data location: .
2020-03-21 22:13:20,046 [DEBUG]  rpc: getnewaddress []
Enter wallet decryption passphrase: 
2020-03-21 22:13:21,793 [DEBUG]  rpc: listaddressgroupings []
2020-03-21 22:13:21,795 [DEBUG]  Fast sync in progress. Got this many used addresses: 4
2020-03-21 22:14:21,596 [DEBUG]  rpc: listunspent [0]
2020-03-21 22:14:21,601 [DEBUG]  bitcoind sync_unspent took 0.0073413848876953125sec
JM wallet
mixdepth	0	tpubDDCbCPdf5wJVGYWB4mZr3E3Lys4NBcEKysrrUrLfhG6sekmrvs6KZNe4i5p5z3FyfwRmKMqB9NWEcEUiTS4LwqfrKPQzhKj6aLihu2EejaU
external addresses	m/49'/1'/0'/0	tpubDEGdmPwmQRcZmGKhaudjch9Fgw4J5yP4bYw5B8LoSDkMdmhBxM4ndEQXHK4r1TPexGjLidxdpeEzsJcdXEe7khWToxCZuN6JiLzvUoHAki2
m/49'/1'/0'/0/0     	2N8jHuQaApgFtQ8UKxKbREAvNxKn4BGX4x2	0.00000000	new
m/49'/1'/0'/0/1     	2Mx5CwDoNcuCT38EDmgenQxv9skHbZfXFdo	0.00000000	new
m/49'/1'/0'/0/2     	2N1tNTTwNyucGGmfDWNVk3AUi3i5S8jVKqn	0.00000000	new
m/49'/1'/0'/0/3     	2N8eBEU5wpWb6kS1gvbRgewtxsmXsMkShV6	0.00000000	new
m/49'/1'/0'/0/4     	2MuHgeSgMsvkcn6aGNW2uk2UXP3xVVnkfh2	0.00000000	new
m/49'/1'/0'/0/5     	2NA8d8um5KmBNNR8dadhbEDYGiTJPFCdjMB	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/0'/1	
Balance:	0.00000000
internal addresses	m/49'/1'/0'/2	tpubDEGdmPwmQRcZrzjRmUFqXXyLdRedwxCWQviAFqDe6sXJeZzRNTwmwqMfxN6Ka3v7hEebstrU5kqUNoHsFKaA3RoB2vopL6kLHVo1EQq6USw
m/49'/1'/0'/2/0:1583020800	bcrt1qv8m7e7glte648dw8lyskf2ahg9pur9xz26m3p7y5n8mr3rrmvv7s9ze43k	0.20000000	2020-03-01 [UNLOCKED]
m/49'/1'/0'/2/1:1580515200	bcrt1qv2p8vuc2dmvkevau4chtgsna9yljjygy4fzyphz3rpw47jv64lxq39mqfj	0.10000000	2020-02-01 [UNLOCKED]
m/49'/1'/0'/2/2:1577836800	bcrt1qawcwt6r3sc4heyz8klgcw04szy4rfsgswm93cznj5n5ksrpumdks888q5k	0.50000000	2020-01-01 [UNLOCKED]
m/49'/1'/0'/2/3:1585699200	bcrt1qrc2qu3m2l2spayu5kr0k0rnn9xgjz46zsxmruh87a3h3f5zmnkaqlfx7v5	0.15000000	2020-04-01 [LOCKED]
Balance:	0.95000000
Balance for mixdepth 0:	0.95000000
mixdepth	1	tpubDDCbCPdf5wJVHb7e7SxBTAR4dXPYHKRkYb5nGg5B3VnP6FeJP5hhoJQpdswSk27C8dZv2hVKSQF2vQNC6To59XeM47hSEZUszePYjYiQjFz
external addresses	m/49'/1'/1'/0	tpubDF7NixWJjNXox8b5ZgMBZbnVYwaSP7x8AZ1Qda5Chb34uNFCxFyP3GY5TT5vk5yTrKcMnWhfU2MAs2aCHCwMnVFESesNTvLcjwZtiiPjyq6
m/49'/1'/1'/0/0     	2N9Y8VELwFZReMkV2xuQmgnWp73Cox3c3os	0.00000000	new
m/49'/1'/1'/0/1     	2Mw9RfNKHYFBxtNRSiZsQKJDbYCYdFWnuNs	0.00000000	new
m/49'/1'/1'/0/2     	2N4tztWe9MvaczWTPc7taZTKH9bw6NcEsdk	0.00000000	new
m/49'/1'/1'/0/3     	2N4fHvekU2m6Mq5JoaZD1kpJMrZfKWaNgpY	0.00000000	new
m/49'/1'/1'/0/4     	2N8pzRyqmACMjFeaASi42krhLzSyjbPzrNY	0.00000000	new
m/49'/1'/1'/0/5     	2N3THzBFawU4Vxf1Du3FZZcnBVjyGhhT7CG	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/1'/1	
Balance:	0.00000000
Balance for mixdepth 1:	0.00000000
mixdepth	2	tpubDDCbCPdf5wJVLFZLF81zYau2jYcVxiZgpSvuom7b7AuK6nJPQ9rjYd9nbDeVcs5pkHjtA28RjeZXZF3hiJcvWyWPnLsBqXfz8eXTfgY141v
external addresses	m/49'/1'/2'/0	tpubDEDzg7BcspkbgFvNbaV16wph4MjzuA7UEyRcamYEh3MerdntE85r3PvPd7SGebC54BgnWiudNPjY3HTV9HHWFZbRFkoZj4P24zCWMd4H9pz
m/49'/1'/2'/0/0     	2N2FPN8yfQbtiE7C5sEnpH7yhrgMX9GEJcL	0.00000000	new
m/49'/1'/2'/0/1     	2N5Z2yUsZrzGqxKVvvua8EFP3yht1zQHd34	0.00000000	new
m/49'/1'/2'/0/2     	2N3KhJKmeVBgPzkq35Q8WjHsyXoZHnmTjqu	0.00000000	new
m/49'/1'/2'/0/3     	2N8KubaKFxpdMhnnSw1R2t7eQfzLkGdP9wL	0.00000000	new
m/49'/1'/2'/0/4     	2N2377KNZ38qudxg6b2fA7jonTZ6AnfwXBx	0.00000000	new
m/49'/1'/2'/0/5     	2MyhCnxndn31Xm2e82KiofzEYFi8SbzfHTe	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/2'/1	
Balance:	0.00000000
Balance for mixdepth 2:	0.00000000
mixdepth	3	tpubDDCbCPdf5wJVPGeDbX8nL27w68uxeb1GnNyJzXfjTsnZp9g2BsFozL1azyCkXcojQCxoebd1EVD39gykEzpEP2LZPToL5ZPg1GivBshvyoD
external addresses	m/49'/1'/3'/0	tpubDEojnXr1GPgcXhGGWg9mreAGDoqddCMpw8J4eLZ1r9mgSqyoXFQWN8rGFR3x5xeYSZG5UoeqDnfqm9oYgJDbqwnpQ9PVqoozwPCnyYEfdCF
m/49'/1'/3'/0/0     	2MuuykQmFC3MVj3XuDG5CW51QoWx6XNjy4T	0.00000000	new
m/49'/1'/3'/0/1     	2N5KnLBZ3ho2MKYWrKZx69FPFZDdTVvvG3o	0.00000000	new
m/49'/1'/3'/0/2     	2N3JoKCR9whNdbDRupdTbMsKRxix7pM965o	0.00000000	new
m/49'/1'/3'/0/3     	2MyjTeuL63EbJJKLBpVSif1Y5nkdfjDJD7e	0.00000000	new
m/49'/1'/3'/0/4     	2NG9Ka6Dj26JS9CLmGgXvqND6pA4hXr1Ych	0.00000000	new
m/49'/1'/3'/0/5     	2Mtoy7eL9gxBAVbB8sa7GCqf5s4Ua26SDVw	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/3'/1	
Balance:	0.00000000
Balance for mixdepth 3:	0.00000000
mixdepth	4	tpubDDCbCPdf5wJVR4PJE8r7qJdynDWiQtbAxqz3rSj4PB4dadj51ix22RLrsBk4Q7ak9Jih3GJPsBqSUkswnTcEqvPLduANQ72op5iyv6cR3ma
external addresses	m/49'/1'/4'/0	tpubDEUoKpgjkrTumyHkvH8rgTBahw5SLn5B9DLFXntGJHYXdaU8xrRisaUjKenyzqRix2PbzaRTd8bHjUwPWsV9mfiYeGs6yPHJfSHXyUJbfnh
m/49'/1'/4'/0/0     	2NDL6kWdkM3QQvbXT4rUkoGSshNLqCtGgz8	0.00000000	new
m/49'/1'/4'/0/1     	2NEwPz1yVwAbsuWFoMHTHH2QxeWAsbDYADF	0.00000000	new
m/49'/1'/4'/0/2     	2N3UrQ7HNzDLpddJe7EDvhpHQ7PZ3ZPQBqg	0.00000000	new
m/49'/1'/4'/0/3     	2My6tLqJ6R63N94eCBgbYrw8cY5x7sX5sgX	0.00000000	new
m/49'/1'/4'/0/4     	2NDhzUU8XixbcVPhCE5Pm32B5CfX2o1AvtX	0.00000000	new
m/49'/1'/4'/0/5     	2NASJXZfEhYUZe4B615kRPbmF4kELSLmV7v	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/4'/1	
Balance:	0.00000000
Balance for mixdepth 4:	0.00000000
Total balance:	0.95000000

The wallet-tool method dumpprivkey works as usual, although to spend from such an address you also need the locktime value as well as the privkey.
This PR extends the BIP32 HD path format to include locktime values, in this example we've got m/49'/1'/0'/2/0:1583020800 where the number after the colon is the locktime value in Unix time.

scripts$ python3 wallet-tool.py -H "m/49'/1'/0'/2/0:1583020800" testfidelity.jmdat dumpprivkey
User data location: .
2020-03-21 23:02:24,902 [DEBUG]  rpc: getnewaddress []
Enter wallet decryption passphrase: 
cNEuE5ypNTxVFCyC5iH7u5AQTrddamcUHRPNweiLvmHUWd6XXDkz

Using the wallet-tool method displayall we can see all tracked timelocked addresses. The default gaplimit for timelocked addresses is 1 instead of 6 as with other addresses.

(jmvenv) scripts$ python3 wallet-tool.py testfidelity2.jmdat displayall
User data location: .
2020-03-21 22:35:00,182 [DEBUG]  rpc: getnewaddress []
Enter wallet decryption passphrase: 
2020-03-21 22:35:02,013 [DEBUG]  rpc: listaddressgroupings []
2020-03-21 22:35:02,014 [INFO]  Detected new wallet, performing initial import
2020-03-21 22:35:02,014 [DEBUG]  requesting detailed wallet history
2020-03-21 22:35:02,249 [DEBUG]  rpc: getaddressesbyaccount ['joinmarket-wallet-04651a']
2020-03-21 22:35:02,250 [DEBUG]  rpc: listlabels []
2020-03-21 22:35:02,252 [DEBUG]  rpc: getaddressesbylabel ['joinmarket-wallet-04651a']
2020-03-21 22:35:02,303 [DEBUG]  got used indices: {0: [0, 0, 0, 0], 1: [0, 0, 0, 0], 2: [0, 0, 0, 0], 3: [0, 0, 0, 0], 4: [0, 0, 0, 0]}
2020-03-21 22:35:02,567 [DEBUG]  rpc: getaddressesbyaccount ['joinmarket-wallet-04651a']
2020-03-21 22:35:02,568 [DEBUG]  rpc: listlabels []
2020-03-21 22:35:02,570 [DEBUG]  rpc: getaddressesbylabel ['joinmarket-wallet-04651a']
2020-03-21 22:35:02,617 [DEBUG]  Wallet successfully synced
2020-03-21 22:35:02,619 [DEBUG]  rpc: listunspent [0]
2020-03-21 22:35:02,621 [DEBUG]  bitcoind sync_unspent took 0.0037746429443359375sec
JM wallet
mixdepth	0	tpubDDCXgSpdxuVbXgzRYBggFeMRNeV9eH24jJuQNunyqwYtDFiB7ZS63LhXwHkf7o9ZcZW4qUz7uvD6yk4BkkF3bBPmJRPv7RBTEA5hHwEdV2f
external addresses	m/49'/1'/0'/0	tpubDEJGorVywRb6LoLQbaqWZh2gYwpdZqViCNZ2ejB5kpBuUp16LHpK6ESFaJLixidtbmmjcDwVZ4QjnAbKmypfuGaEk3ifgonPv4vsugqgp9G
m/49'/1'/0'/0/0     	2Mzs6cTucmCRHKam8t7vj46AQCvebHJ3vUa	0.00000000	new
m/49'/1'/0'/0/1     	2Mw37csadfWHy8gh9RHKutJTWvE43vfsgsX	0.00000000	new
m/49'/1'/0'/0/2     	2MviB2FfLKZjFb3W2dJ8kXcQBj3jqMJg7TL	0.00000000	new
m/49'/1'/0'/0/3     	2MtsAQhE2u9VGV3aZ7XM4PzwWGHXr4PAhqP	0.00000000	new
m/49'/1'/0'/0/4     	2N3iXNjS4vkTXzy5Jidnovc6FJeNQJx5Fnt	0.00000000	new
m/49'/1'/0'/0/5     	2MtT4XAjwQQ7PBbrTxv7qcQMMmz4Rs5XrE3	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/0'/1	
m/49'/1'/0'/1/0     	2N3caSmDWFroxTvjKnoikwXXxHz8QuzKjbP	0.00000000	new
m/49'/1'/0'/1/1     	2NCyYaMNZvXubt7hrWcxmCBQ34t9o4EFHN3	0.00000000	new
m/49'/1'/0'/1/2     	2MzWGjuatcYF8wXy3rf1pNVCLsTKJhbcSk1	0.00000000	new
m/49'/1'/0'/1/3     	2NBuwtk63LF1RMRFFjVWzcUTw8C4nvJeGDi	0.00000000	new
m/49'/1'/0'/1/4     	2Mt7Y13B9Wr5AJCoQNiVqXmH1tx43qbodKW	0.00000000	new
m/49'/1'/0'/1/5     	2Mw8KVFxuQ3NHCMnjRpPM3vnm6P5cP2Jgn2	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/0'/2	tpubDEJGorVywRb6T34X7ZAEz9hQYn6CCEhrcFa8kA2mqNau2DvoggZP2QTtXRe8t9NSfMkx3ye8QDzqCE9gEqso6fw5ALk5xycWLFwTRLSqSUV
m/49'/1'/0'/2/0:1577836800	bcrt1q2nccynx9g3ruvufj0gf9yfa4k0jkusjh0epmv68f3javxx2rgvsqgus78s	0.00000000	2020-01-01 [UNLOCKED]
m/49'/1'/0'/2/0:1580515200	bcrt1qnzkkhklkyujvra7ssjdvluql0lm4u3mae4j6kcynkehnezfwc2kq9wrfxk	0.00000000	2020-02-01 [UNLOCKED]
m/49'/1'/0'/2/0:1583020800	bcrt1qv6p35gcj6j8fkr46gemhu5qv60nqe346pv325mnhw0nmrk262qus0367qj	0.00000000	2020-03-01 [UNLOCKED]
m/49'/1'/0'/2/0:1585699200	bcrt1q60dfxrrveugna0t9me7my8ac75jd5tyf4w42fvgjuefvryr2u2gshkxsu2	0.00000000	2020-04-01 [LOCKED]
m/49'/1'/0'/2/0:1588291200	bcrt1q46uqhkjq0y8ctmxp7f3fqtc90yez50c9v66u630s8e3hyrym8kdqjuw25m	0.00000000	2020-05-01 [LOCKED]
m/49'/1'/0'/2/0:1590969600	bcrt1qr767egthzn4xmkd3pshs80f3rczxrkguevg3yqwgw2elvcutxmpq6u00hv	0.00000000	2020-06-01 [LOCKED]
m/49'/1'/0'/2/0:1593561600	bcrt1qf0sujqfgjf87qfy3la2vpmv4vmxrrm35x4ajyms2nqdc635hz28st4n7gq	0.00000000	2020-07-01 [LOCKED]
m/49'/1'/0'/2/0:1596240000	bcrt1qjghyjfhpkky5vld4ehzvk3zfcugsh2n59gh86fqdhkf84pdfamlsv8lzg3	0.00000000	2020-08-01 [LOCKED]
m/49'/1'/0'/2/0:1598918400	bcrt1qe5dtvjhwc7mzdkeg8sytrd3m8y0uj9acn6dnv80lf57dd608s80qmmasv0	0.00000000	2020-09-01 [LOCKED]
m/49'/1'/0'/2/0:1601510400	bcrt1qmymutm2qzkw0jr2ggevdt3m7fdpeu2g5ya2k07rn6qje24yv28qsc6z326	0.00000000	2020-10-01 [LOCKED]
m/49'/1'/0'/2/0:1604188800	bcrt1qg6jps0s5trvnyv9rzd7j8lvcdq603yx7xs49r7mqz9e7f0yt9c2sdlfj2c	0.00000000	2020-11-01 [LOCKED]
m/49'/1'/0'/2/0:1606780800	bcrt1q6xvs33lsc79rky3sm7nztzta939xx4y7nj29nv6tkwe2d0n2zdcqffx8ln	0.00000000	2020-12-01 [LOCKED]
m/49'/1'/0'/2/0:1609459200	bcrt1qqngkharmng74hlhdsfgn90ty3djwwf7dh557kg7sr6rpy28pwjwqua53rr	0.00000000	2021-01-01 [LOCKED]
m/49'/1'/0'/2/0:1612137600	bcrt1qld30fz3ugsdc56tkwsj6a5c3yxs9gk2ee04gak8t6nkmyf93dxkskanrvn	0.00000000	2021-02-01 [LOCKED]
m/49'/1'/0'/2/0:1614556800	bcrt1qym7dsmt0vt99f92ph0yt6zgvwg5hyncsnh3p5a9mgrz69uqcyrfsnpuwu9	0.00000000	2021-03-01 [LOCKED]
m/49'/1'/0'/2/0:1617235200	bcrt1qwt0aen9j3e6klvvpszjgw2l7wh98hggaz9l7c66gphrpgnkuc38qw8jf7l	0.00000000	2021-04-01 [LOCKED]
m/49'/1'/0'/2/0:1619827200	bcrt1quza24j54ctgfyl0ncve5ufwqatz89zj7fka4gqa342edrxx0fdaq2e2fhy	0.00000000	2021-05-01 [LOCKED]
m/49'/1'/0'/2/0:1622505600	bcrt1qw5ffqaen8n76mqegyaupjm4fe403sj979perxcdymx75hddf68usstnxlp	0.00000000	2021-06-01 [LOCKED]
m/49'/1'/0'/2/0:1625097600	bcrt1qtjfkkel9qup9hsag0syp9l5mfta4auqx8uaq3anfy97fpdug80ysc4v8ys	0.00000000	2021-07-01 [LOCKED]
m/49'/1'/0'/2/0:1627776000	bcrt1q09awvpsfnn4cej8us023vaquchu57alxgk0px6q9jwvvvvewd2es96htxt	0.00000000	2021-08-01 [LOCKED]
m/49'/1'/0'/2/0:1630454400	bcrt1q7zynexn2drj2yg3l3cs64dkn4h0flqwnrr73sz7sp6u87akdj35s2rxp60	0.00000000	2021-09-01 [LOCKED]
m/49'/1'/0'/2/0:1633046400	bcrt1qtft0pejpzaxneutqvhnhppe67agywuqds3zmcvfhv2wsjfhyd6wqayfyyl	0.00000000	2021-10-01 [LOCKED]
m/49'/1'/0'/2/0:1635724800	bcrt1qmu29rx2n8202jrxddw33lc9wa676u0wvt0tpny82d8zhw07wtquqrn5c3x	0.00000000	2021-11-01 [LOCKED]
m/49'/1'/0'/2/0:1638316800	bcrt1qm5050dlfgp0420wk23tluut3d99hswjpkvu7760ul9rkhr5fat6s5rkpkd	0.00000000	2021-12-01 [LOCKED]
m/49'/1'/0'/2/0:1640995200	bcrt1q6nfever5u49vfj6cxzx9fpdyfrspngzd7qtxd6vtma7uqsud6cls2wcvam	0.00000000	2022-01-01 [LOCKED]
m/49'/1'/0'/2/0:1643673600	bcrt1qf386p6yg50jzut00z9wk3tcsmtk0jhmknpdh862jdu3kwfaxf7eq25pe7d	0.00000000	2022-02-01 [LOCKED]
m/49'/1'/0'/2/0:1646092800	bcrt1qys5d5cftkthv6nmv94597z0nqtm7dvn0uxlagzrsymulvd3vn7psnm2wz2	0.00000000	2022-03-01 [LOCKED]
m/49'/1'/0'/2/0:1648771200	bcrt1qdsr97qwzxje5eu5l565p0pfk2y779knwj85g2l6czvhux6jh5m2saax2jq	0.00000000	2022-04-01 [LOCKED]
m/49'/1'/0'/2/0:1651363200	bcrt1q762j0t30cng56puqxve9wdf9g3sj6j6v0uzauxndt960f797kv6s9r5nmq	0.00000000	2022-05-01 [LOCKED]
m/49'/1'/0'/2/0:1654041600	bcrt1qwk5s64n5990d7e5unljj3pntyxjwfpwfsek6cty5q9wmj55wlk6s9egq0j	0.00000000	2022-06-01 [LOCKED]
m/49'/1'/0'/2/0:1656633600	bcrt1qjcr9m8al3md6st2q6p4dlgd93de9sg6jnw5t5dr6yh2jhmd2fjysu36vkd	0.00000000	2022-07-01 [LOCKED]
m/49'/1'/0'/2/0:1659312000	bcrt1q6t35qxexwaae0z3emy7fmzrjudzaepycg9gyahzc5fe3zna2554qewx4rs	0.00000000	2022-08-01 [LOCKED]
m/49'/1'/0'/2/0:1661990400	bcrt1q5te4nvdxyrk8vqzfvmtgd47m9t3r5e43p457s5nmwc2asase3eksc9wtk4	0.00000000	2022-09-01 [LOCKED]
m/49'/1'/0'/2/0:1664582400	bcrt1qspl6qg3h0l85rm6ex663l479vfuu7cla4dr56x96l2psae8w837sy40g6v	0.00000000	2022-10-01 [LOCKED]
m/49'/1'/0'/2/0:1667260800	bcrt1q6t8xvqa49qeryfjgk7azvvukjnn6s9p936sdewjz0erhhwzu2xkqz0wr5z	0.00000000	2022-11-01 [LOCKED]
m/49'/1'/0'/2/0:1669852800	bcrt1q3r8c77elep0g0cyatawf0qdn9hd8cqzp0calxf53v2m6l9x0t3mq44094p	0.00000000	2022-12-01 [LOCKED]
m/49'/1'/0'/2/0:1672531200	bcrt1qa3akamzlqf35ujsegtnk4sj5cak8x54p7slfe6fhagq84z68784sf5nt2m	0.00000000	2023-01-01 [LOCKED]
m/49'/1'/0'/2/0:1675209600	bcrt1qpmx2sxs686fknmp2ygewku8p6lzpe2z9zqeusnj7fzajuwuztshs5y76fz	0.00000000	2023-02-01 [LOCKED]
m/49'/1'/0'/2/0:1677628800	bcrt1qj86h7a4j4nc5kwk57a2np9nu2089stcrexxe5et45r3cmf7c55rqjkaj9m	0.00000000	2023-03-01 [LOCKED]
m/49'/1'/0'/2/0:1680307200	bcrt1q4x3t56cucrlmm4s4hrkygwh2hr9fpmxyj5lp69vh5n87p8p82cmswj059j	0.00000000	2023-04-01 [LOCKED]
m/49'/1'/0'/2/0:1682899200	bcrt1qfazqsxp5ds38xfhsymq7c8r6mexx7a6apvvc6ta7vfl08m2cv4pqm9c26e	0.00000000	2023-05-01 [LOCKED]
m/49'/1'/0'/2/0:1685577600	bcrt1qnskk4wkeykjdg8my9js6jpr55gt2x0h48h2njfqydxggtygn9cwqsr6963	0.00000000	2023-06-01 [LOCKED]
m/49'/1'/0'/2/0:1688169600	bcrt1qc2qqks5gajwnejqr5sse68a5gmgzkkf2k4ff25xw5hpglnd7hegqu5xejz	0.00000000	2023-07-01 [LOCKED]
m/49'/1'/0'/2/0:1690848000	bcrt1qkkh6zqdw0cffc8p56fdkevg4zshuaa9jnfrdmwtz3a5x2wflk6msyj9fz7	0.00000000	2023-08-01 [LOCKED]
m/49'/1'/0'/2/0:1693526400	bcrt1q0rpcu68wsyrzqkvthh08feuf9xxcx3l3l6wmmg7625d5hfdnj05qy49ayy	0.00000000	2023-09-01 [LOCKED]
m/49'/1'/0'/2/0:1696118400	bcrt1qnuxkj3stvt0urap3thjz9598vssgcgakxhyg50rlwc4fvd26c7gqt3ngvu	0.00000000	2023-10-01 [LOCKED]
m/49'/1'/0'/2/0:1698796800	bcrt1qp8dr9uunpr4qshz2vp4ewa57xnr84wyjpc557x2cy2yzexdt6lpsflkr0y	0.00000000	2023-11-01 [LOCKED]
m/49'/1'/0'/2/0:1701388800	bcrt1q2tv04lz6cl4075ftj08ls3ah4tay3ca8dt04lv3lx8rz3umkux0q269qc8	0.00000000	2023-12-01 [LOCKED]
m/49'/1'/0'/2/0:1704067200	bcrt1qy70hwf3lvqgec4st6sws8pfn5n8y89relxpymlenjqe5jepx2zjqsu0jgy	0.00000000	2024-01-01 [LOCKED]
m/49'/1'/0'/2/0:1706745600	bcrt1qssa3q3xt4cm0tuzapqzgcvxfkkdramn5nm4l0fg0d85c6jdhzuwspyff2n	0.00000000	2024-02-01 [LOCKED]
m/49'/1'/0'/2/0:1709251200	bcrt1qzmqdg9uwjvymclxv58cx7hwqcll74j08z2qed9m02rp0d0exjuds3ctmq9	0.00000000	2024-03-01 [LOCKED]
m/49'/1'/0'/2/0:1711929600	bcrt1qpcpmkv88s580ae7shlp5249vtxngrlz7sarfue6ttvw9dpjhvl7stauvg0	0.00000000	2024-04-01 [LOCKED]
m/49'/1'/0'/2/0:1714521600	bcrt1qc0k733tqu5ddqlhfeehcs8mc394cxy2vq3g950yfv7ce8lv9ft9qz3vk4e	0.00000000	2024-05-01 [LOCKED]
m/49'/1'/0'/2/0:1717200000	bcrt1qh8wyxfp3g70dkpezhw293h0ysgwl9jvfmw4zzw4c4mdgu0jp6zes8rspw4	0.00000000	2024-06-01 [LOCKED]
m/49'/1'/0'/2/0:1719792000	bcrt1qz6ppkdrfymawtgrsmw3ctvdyhzajgxxlprydeljs5wulek9clpcs7c4phu	0.00000000	2024-07-01 [LOCKED]
m/49'/1'/0'/2/0:1722470400	bcrt1qmkq346eeshj2jce0992zf47fn0c2hqf439qsrkcstghw06m740csj0qswp	0.00000000	2024-08-01 [LOCKED]
m/49'/1'/0'/2/0:1725148800	bcrt1q7elywuq42v328r4gt3xj84adwpp9tuyhmkle7q8zv3a0c9p3ww7s0sz5zw	0.00000000	2024-09-01 [LOCKED]
m/49'/1'/0'/2/0:1727740800	bcrt1qetf2vakwn85dx5vkp4erc9h39pllys0zqg6eznkuar8htw8pr02s5eduyt	0.00000000	2024-10-01 [LOCKED]
m/49'/1'/0'/2/0:1730419200	bcrt1q5geetrk2y3ggp4fjl9qu8hraw7qp2y8dwt7tks3sx5wjexlzf2ls7pzxgr	0.00000000	2024-11-01 [LOCKED]
m/49'/1'/0'/2/0:1733011200	bcrt1qnpseraj78h6ff46fj0lk20w8xnr4ah7v56zw606y7dv266rwn32sc2976u	0.00000000	2024-12-01 [LOCKED]
m/49'/1'/0'/2/0:1735689600	bcrt1qc2f9xpjfdtanss0s7qd8yfkk2rak73mlltpppfnw4ugxrc0a3x5s46eqev	0.00000000	2025-01-01 [LOCKED]
m/49'/1'/0'/2/0:1738368000	bcrt1qejccvl05pejnqj3sftqmlvlg6fm3kplex7p0385k9phlnce9vr2s6r3cld	0.00000000	2025-02-01 [LOCKED]
m/49'/1'/0'/2/0:1740787200	bcrt1qhutuqemgyez6le6ayh8d3k2nc8mn4stgv7ss8z22hs092eukff3saea5hj	0.00000000	2025-03-01 [LOCKED]
m/49'/1'/0'/2/0:1743465600	bcrt1q0cqhsczf4v9eysaqkzjrhywlm4dyuv7pzhe4xdhk6ccxwufmtqnsx8du37	0.00000000	2025-04-01 [LOCKED]
m/49'/1'/0'/2/0:1746057600	bcrt1qycten4srs3cs3f6e6306q32vtlac303avtv7c2dmcctnzjlu69pqa9fycs	0.00000000	2025-05-01 [LOCKED]
m/49'/1'/0'/2/0:1748736000	bcrt1qafjmjz87yq50jm5aty044cjrghck6kj7n6mzz002p3erqh7cte2s0kfwyk	0.00000000	2025-06-01 [LOCKED]
m/49'/1'/0'/2/0:1751328000	bcrt1qhmkq9tesecvjd2qv7myhmak9g9qfyyp2tpcqhtyx8lglqax6mdzs7nmxla	0.00000000	2025-07-01 [LOCKED]
m/49'/1'/0'/2/0:1754006400	bcrt1qvtl532nyjjn0qw5fv4th5ngvn7csu32sthhdhjyg7ncajuhdw0zsk7cfl8	0.00000000	2025-08-01 [LOCKED]
m/49'/1'/0'/2/0:1756684800	bcrt1q8pdnge00cju5jfr7xszy0lrdm2uz4avnu9x4h6zvczn0jkdkm0ns6kg0jw	0.00000000	2025-09-01 [LOCKED]
m/49'/1'/0'/2/0:1759276800	bcrt1q3varacc3z2vqxmemhax7uauc2t8stlfnrfy0h8kdgz30xasxp2lssur36e	0.00000000	2025-10-01 [LOCKED]
m/49'/1'/0'/2/0:1761955200	bcrt1qlx5265ymylnt3nrjlsgpm0kqkadr5fhkc8wtjj084x3trwrzgzkqse04uk	0.00000000	2025-11-01 [LOCKED]
m/49'/1'/0'/2/0:1764547200	bcrt1qkgwre70dltxfrrdhaqd2upnr907jyv3ds0qzg342x750np275slqyf2dvd	0.00000000	2025-12-01 [LOCKED]
m/49'/1'/0'/2/0:1767225600	bcrt1qqljk3ut3qpdnl877qvw8uyqu77l9z3828yg3z2gadv4t052cnrdqfrepn7	0.00000000	2026-01-01 [LOCKED]
m/49'/1'/0'/2/0:1769904000	bcrt1qn207euadf6wg02sreqp0kpr2j8y3xnytgeqpwxcej3nrazc9yz5s4hzrgv	0.00000000	2026-02-01 [LOCKED]
m/49'/1'/0'/2/0:1772323200	bcrt1qq3tpml2j2gxsl38eje5fczl8lhl80szr773s46mjwry0w9582tzq0pea7s	0.00000000	2026-03-01 [LOCKED]
m/49'/1'/0'/2/0:1775001600	bcrt1qn7yhqk0lqqjpgj9vg5yvt5727ghhla59n085v7jk6laxhw2usrqsq5n3yd	0.00000000	2026-04-01 [LOCKED]
m/49'/1'/0'/2/0:1777593600	bcrt1qkvfhcdpujj7ndyqgyz3tgakrh7rjgyw0l0mmm4tan430w7dtk40sse78tq	0.00000000	2026-05-01 [LOCKED]
m/49'/1'/0'/2/0:1780272000	bcrt1q80lefrgnssfn6apvqrpd0cjcw30485ef4907ctp7uvcz3dqv46ys5yfv36	0.00000000	2026-06-01 [LOCKED]
m/49'/1'/0'/2/0:1782864000	bcrt1qtac8l20zl6jdffy69hhv8ta0878whpa5lv9qa65yn9qkjc4w25cscpu4cp	0.00000000	2026-07-01 [LOCKED]
m/49'/1'/0'/2/0:1785542400	bcrt1qppmexz0kuzl7xuz2t79wduphmrkgqz4xpf5ds74gx6apwxwjeufq6qjk4a	0.00000000	2026-08-01 [LOCKED]
m/49'/1'/0'/2/0:1788220800	bcrt1qw29huj0jqq5thu7q3frsw2k3vjzcyzpzhkq0ttp7tmj5kztg9yjqctqknd	0.00000000	2026-09-01 [LOCKED]
m/49'/1'/0'/2/0:1790812800	bcrt1qqwull8x0skjwk0447mx4rukq964hahw9cdx9hm7g3prf7zj7akwsmp7yms	0.00000000	2026-10-01 [LOCKED]
m/49'/1'/0'/2/0:1793491200	bcrt1qqq0whzzwxudwaq0247vre9kqjhgxqm453tuljhzpf4vh4phev05q4hcs7u	0.00000000	2026-11-01 [LOCKED]
m/49'/1'/0'/2/0:1796083200	bcrt1q5g2gew26xhxtyvnlfl78n5v4mde93lvye3jqr9r9unhheammsu3sn69ehf	0.00000000	2026-12-01 [LOCKED]
m/49'/1'/0'/2/0:1798761600	bcrt1qfceh5q8vm8ptlthwc3laxyc6xgk0rn5fgf28w6y59q8eawf935cszrdm5c	0.00000000	2027-01-01 [LOCKED]
m/49'/1'/0'/2/0:1801440000	bcrt1qq27sx5ygp5t2qlr6kmkg70a5czd406k662a8xqcklw0zkdafqt7qkpwfpl	0.00000000	2027-02-01 [LOCKED]
m/49'/1'/0'/2/0:1803859200	bcrt1qs7yg2jgvve7yjlg8kw2dhu8edgljwznz7asafrhjjk7duawkzl5srumk9f	0.00000000	2027-03-01 [LOCKED]
m/49'/1'/0'/2/0:1806537600	bcrt1qjclfrmfk6kl0xdvuctlj2v4fe5mgsl70hk4ccyukqrkzyw7wy9ksam3xzr	0.00000000	2027-04-01 [LOCKED]
m/49'/1'/0'/2/0:1809129600	bcrt1q366llxuh02xxy3kwp40neae5949nj2tqd3kynm3ud9aa62lfxuhswfm95s	0.00000000	2027-05-01 [LOCKED]
m/49'/1'/0'/2/0:1811808000	bcrt1qt2g3sk8tvp7t9gvlvvg534lvuekzf46tvfvpedhgtqq6uxl55eds9py59w	0.00000000	2027-06-01 [LOCKED]
m/49'/1'/0'/2/0:1814400000	bcrt1q75pc72l8xp9jdvdxr97zjjkynvq9gh4enugczmrnanjydd2834cq7aw8nx	0.00000000	2027-07-01 [LOCKED]
m/49'/1'/0'/2/0:1817078400	bcrt1qgvj4ydhmpt8s7eevd6lw6lyz9q2jw6ka8ux064hlwltsqvggecasy85kcd	0.00000000	2027-08-01 [LOCKED]
m/49'/1'/0'/2/0:1819756800	bcrt1q3f74gvyuawxc90vmvnwf4977le7908h7x3jmtc2y37f09nf8ghvqq4kuny	0.00000000	2027-09-01 [LOCKED]
m/49'/1'/0'/2/0:1822348800	bcrt1qnprghehussq7qd46sqgq77q9myy3jxczz6lrkqxmshugxxsgtgsqyexe0y	0.00000000	2027-10-01 [LOCKED]
m/49'/1'/0'/2/0:1825027200	bcrt1qyuar5jnjj45cwy8rfzxtw0w5vly2qd2qmcln20zqpha73asnju2qszwk6u	0.00000000	2027-11-01 [LOCKED]
m/49'/1'/0'/2/0:1827619200	bcrt1qxd98gny3cwng8syqh4jhlhwush00nd7e4056cw2w2uxevzjhsrts4c47v9	0.00000000	2027-12-01 [LOCKED]
m/49'/1'/0'/2/0:1830297600	bcrt1q9n4wquyq3g8czcal3u6qj770len5pum9zvmlgmakdcxs2lxxh09snpht4d	0.00000000	2028-01-01 [LOCKED]
m/49'/1'/0'/2/0:1832976000	bcrt1qdgrx6xfh23m9n22qesw0cxazx07az6mj7r8zn6up5p09ga54me7sg6yddu	0.00000000	2028-02-01 [LOCKED]
m/49'/1'/0'/2/0:1835481600	bcrt1qfwfa2hjp4tazmu8qtuk4yxs7mtue3j27g7cq2s23pd9rm6q3q6csdxy4r0	0.00000000	2028-03-01 [LOCKED]
m/49'/1'/0'/2/0:1838160000	bcrt1qs5f7pmy9pangta6e9y07vgara9gnpa3lkkphjg68q7kmukjwl3xql7lsff	0.00000000	2028-04-01 [LOCKED]
m/49'/1'/0'/2/0:1840752000	bcrt1q4v4xd3ug6a7v3rdts2mma63el4jpr7wj7ascf4u6jqfdesqlpt3sspq5al	0.00000000	2028-05-01 [LOCKED]
m/49'/1'/0'/2/0:1843430400	bcrt1q5raagvu4vss7ywslpstxxpjakg4dkf9p2azn3pep4zucplx8gn3s897x3u	0.00000000	2028-06-01 [LOCKED]
m/49'/1'/0'/2/0:1846022400	bcrt1quptmuel49j3nzmvh3vvq37d0vn8cuus86nes3k36ectkqv7rtplse9kw3a	0.00000000	2028-07-01 [LOCKED]
m/49'/1'/0'/2/0:1848700800	bcrt1qcg8xw0xa52uz50000a3yeccq5ngscqx03rw2ffdlutf894umyekqwfwkk0	0.00000000	2028-08-01 [LOCKED]
m/49'/1'/0'/2/0:1851379200	bcrt1qrl7qtg2tdexrps3ty72vk9n09an3esudsnqdegdw55lx8dh50u6sdjxkqw	0.00000000	2028-09-01 [LOCKED]
m/49'/1'/0'/2/0:1853971200	bcrt1qhx946ulkw4pxsc2nlf9mppzjjg6yw3239gxtnawtkh0u7jdagm0sw80r87	0.00000000	2028-10-01 [LOCKED]
m/49'/1'/0'/2/0:1856649600	bcrt1qz8sct5lpce56zpmpqy8g724pnunr2feq2uz3eqejg55vk86ua6zsav2a6a	0.00000000	2028-11-01 [LOCKED]
m/49'/1'/0'/2/0:1859241600	bcrt1qg4e7kp9yjrp092y3edj5d9n4h9562qwnr0jkcpxdxrpa9lyslekqg0fv6q	0.00000000	2028-12-01 [LOCKED]
m/49'/1'/0'/2/0:1861920000	bcrt1q5xcyhzhrs7j3h6lfx73zen8zrnqfdkruht3r5gl4dw9qugc2ywwspv3ua8	0.00000000	2029-01-01 [LOCKED]
m/49'/1'/0'/2/0:1864598400	bcrt1q33mppc95054upgfsfksgql5jw9umelgf8meqwc0hxrzl74jawd6ss3cs0j	0.00000000	2029-02-01 [LOCKED]
m/49'/1'/0'/2/0:1867017600	bcrt1qzaycxggaa2edzafjn6hcg2tfsvyrepu5mf949y2qw8v5f6lavrjsfl97uz	0.00000000	2029-03-01 [LOCKED]
m/49'/1'/0'/2/0:1869696000	bcrt1qxkqwwya45z7jjcmg74qs7x27xj7clkndcunen4mnd09nngseynksxcufre	0.00000000	2029-04-01 [LOCKED]
m/49'/1'/0'/2/0:1872288000	bcrt1q0f0yd4tsucu206w44g8d4ag8rr7ys8eak0nk4zecz2axrrz7legsg5q0q7	0.00000000	2029-05-01 [LOCKED]
m/49'/1'/0'/2/0:1874966400	bcrt1qfc6lxrpg733d05dvcx36fqw6wuha45myhueqep0tkcrl6hvxwjnq6qlefy	0.00000000	2029-06-01 [LOCKED]
m/49'/1'/0'/2/0:1877558400	bcrt1qwwu260mstq3tnycv5457alv65nresquu3nnfepn5lznl9flpfc5smhc0kh	0.00000000	2029-07-01 [LOCKED]
m/49'/1'/0'/2/0:1880236800	bcrt1qwua59vu9lhylxa8e3jqdaupvf2pv5su746pcl8sdwuaq6phn4h8snf258c	0.00000000	2029-08-01 [LOCKED]
m/49'/1'/0'/2/0:1882915200	bcrt1qkz4wfwc2hu4wpd3s0sfhz7grcu2ts928gl2xk9uuls0nzjaac5dqmyfmdg	0.00000000	2029-09-01 [LOCKED]
m/49'/1'/0'/2/0:1885507200	bcrt1q5rd9fw29vymktuacf2sx79sat856lp507v0nl3y5nvvqskn5y43s6r8utd	0.00000000	2029-10-01 [LOCKED]
m/49'/1'/0'/2/0:1888185600	bcrt1qvlklntdvttw75yvkzpy9ecsjch79q248m4q5u8pcux5pn03vamtqt5ekrw	0.00000000	2029-11-01 [LOCKED]
m/49'/1'/0'/2/0:1890777600	bcrt1q0f699kfrtg4mvmr2slheav5y5dch9tykep8t883caauqm4qwfsuq4hx87s	0.00000000	2029-12-01 [LOCKED]
m/49'/1'/0'/2/0:1893456000	bcrt1qrw4jjnnmfnp49k5rkvgz6sj0twx5m6qwwgdgg48cd9waty034g4q27q45z	0.00000000	2030-01-01 [LOCKED]
m/49'/1'/0'/2/0:1896134400	bcrt1q69mfejw3dptjqj4ezke5kmjscr8kf0wj7xzytjunzaqy3whfst7sqsf4x6	0.00000000	2030-02-01 [LOCKED]
m/49'/1'/0'/2/0:1898553600	bcrt1qwjjnla3ttvumq9hq6zs8pf0gv9pful7x0u5fpx5pl35tzgry0g3sdgz6lq	0.00000000	2030-03-01 [LOCKED]
m/49'/1'/0'/2/0:1901232000	bcrt1qqthajya3rlrkz9ces3qjzw8yk98dfkvpdyzy5lyljw3l8g2j6zhs9djjxe	0.00000000	2030-04-01 [LOCKED]
m/49'/1'/0'/2/0:1903824000	bcrt1q77rp9x4wfnj07yfu6qnxg2kgg4q2drv565cg8kjeyya40hy9lejs3cqnc4	0.00000000	2030-05-01 [LOCKED]
m/49'/1'/0'/2/0:1906502400	bcrt1qtpkygxjcty8f8zklfn8x3fgcygrwkh6lf9f5j6alrfjh9rvhk0qqr0xj00	0.00000000	2030-06-01 [LOCKED]
m/49'/1'/0'/2/0:1909094400	bcrt1qkgyr6c92z206r3ms8efp2u82gzjqmy7025kkpk4zduad372q7qgqymtu99	0.00000000	2030-07-01 [LOCKED]
m/49'/1'/0'/2/0:1911772800	bcrt1qcvtw2d6hf9jgy3fgnk5dpwnzx83ygndppcx5h8jrcqvng3ue6d7sgv9dg2	0.00000000	2030-08-01 [LOCKED]
m/49'/1'/0'/2/0:1914451200	bcrt1q8gv77l6ytr5t24w0t47h875r2q4m0x90xxx6zc0uh6uh3t9zxpmsfdaw92	0.00000000	2030-09-01 [LOCKED]
m/49'/1'/0'/2/0:1917043200	bcrt1q2g7ynrwgq9a4uwwychjpj4nsy9ar0lh370488fq0sdh9re4d4ahq7e95dx	0.00000000	2030-10-01 [LOCKED]
m/49'/1'/0'/2/0:1919721600	bcrt1qlzqdfn36fqdy9kuyrua72wp5urygrwamt8pkuldcwuuys4ly83dsrvfxnn	0.00000000	2030-11-01 [LOCKED]
m/49'/1'/0'/2/0:1922313600	bcrt1qrp46use9lu55jkggu2dvkryd4gwyc2l2y8w84e0ak8ca9zheu8rq7l0nd4	0.00000000	2030-12-01 [LOCKED]
m/49'/1'/0'/2/0:1924992000	bcrt1qxqtnme47mkwl8skatcz3cg6zltj8hu4zq40l9wdd6wqys5swlcpq6e8spt	0.00000000	2031-01-01 [LOCKED]
m/49'/1'/0'/2/0:1927670400	bcrt1qk79qacnzsqq30fmp39gxqefh0r0696q6dxe4gnqdhtrn6mlr3u8q4e9mex	0.00000000	2031-02-01 [LOCKED]
m/49'/1'/0'/2/0:1930089600	bcrt1q6g9068sr70paraks5rr2x4dfqzklfshta5n3j9dxtukgx3njvu0q5wgwvc	0.00000000	2031-03-01 [LOCKED]
m/49'/1'/0'/2/0:1932768000	bcrt1q2ejndyjrz6ejsjyy3hluy72x7aexshhhlsv9klcgm8pwjy6665zs45vdw2	0.00000000	2031-04-01 [LOCKED]
m/49'/1'/0'/2/0:1935360000	bcrt1qr7dm2tjfy4yjzedj86cwuxaqyanl2p8gnzyklwwrfkxqkxk44h6q0dsmra	0.00000000	2031-05-01 [LOCKED]
m/49'/1'/0'/2/0:1938038400	bcrt1qcujtg9e0jan6ukfw5kydsxdt8cwg5sqlzfqdfu8nhwu589qastrq5c45jf	0.00000000	2031-06-01 [LOCKED]
m/49'/1'/0'/2/0:1940630400	bcrt1qcatdm7ywpjy2denvyu2n5x4y869yjy65chj3hq48l4ta5a2hzfjsylkm0k	0.00000000	2031-07-01 [LOCKED]
m/49'/1'/0'/2/0:1943308800	bcrt1q8u2ge3ltv0nlns9n8qrumnf05q5yvl274jcj3v4ep9x4fgddtvdqzpytf4	0.00000000	2031-08-01 [LOCKED]
m/49'/1'/0'/2/0:1945987200	bcrt1qnq6up0x6advlfpe0wz0xgxsz44urlqeuur4kuwpvyrplx9wtw0pqry6nhf	0.00000000	2031-09-01 [LOCKED]
m/49'/1'/0'/2/0:1948579200	bcrt1qyz3ljgm903mc9537lnm47nwuefe7ja8jfw6m95sj69xz23z6vensppgdu8	0.00000000	2031-10-01 [LOCKED]
m/49'/1'/0'/2/0:1951257600	bcrt1qh4qn5p7hr3zu6dvcme9x7aulyrsmtg7a8dqdjetwsvl8yxcn6tcszsj2fp	0.00000000	2031-11-01 [LOCKED]
m/49'/1'/0'/2/0:1953849600	bcrt1quzjw76ynug6jn3krer567y90kpd2h9qcux9ecfsmlfvzrnff078sxjkpgh	0.00000000	2031-12-01 [LOCKED]
m/49'/1'/0'/2/0:1956528000	bcrt1qj5uvq4y0ln3dm8f45vf7hm9t4gyehqlkzdf4nxl7mpsc0xadrypq3fv6ku	0.00000000	2032-01-01 [LOCKED]
m/49'/1'/0'/2/0:1959206400	bcrt1qepe65y5m3ddyd8uxa75xyfxfxuelz4ksyhtu3ep3ymxgar8dyr5qjpx7y9	0.00000000	2032-02-01 [LOCKED]
m/49'/1'/0'/2/0:1961712000	bcrt1quggywyuk755mf0af9ppq2hy0e8w32uaspt63nkvymgwu2rdmusqqzm7zny	0.00000000	2032-03-01 [LOCKED]
m/49'/1'/0'/2/0:1964390400	bcrt1qdaj8avylmmxucvxk85f0r3gt9p3jq9jy7ywtg47aa5hgxgsykfdqqhx4js	0.00000000	2032-04-01 [LOCKED]
m/49'/1'/0'/2/0:1966982400	bcrt1q87lajahmnwxlxxdkeekugyleawz4h5cdz0ffrma60sarnfdk6rmqn3205d	0.00000000	2032-05-01 [LOCKED]
m/49'/1'/0'/2/0:1969660800	bcrt1q86ctp24q4maxdfpeerfgh8yw676sc9nmsrlauxeup4628d588uaq9d2s35	0.00000000	2032-06-01 [LOCKED]
m/49'/1'/0'/2/0:1972252800	bcrt1q4cc649aqunuh282qwaweva7tss6e0px3a8ftctw24cqg2yactzaqxc786e	0.00000000	2032-07-01 [LOCKED]
m/49'/1'/0'/2/0:1974931200	bcrt1q5wnx96y3y42yhce7gxlkghf6wh2ds2xk4wk9gsrc0vl5jgsd4apswynkwn	0.00000000	2032-08-01 [LOCKED]
m/49'/1'/0'/2/0:1977609600	bcrt1qd6rgnrddgskue38y00xjhscw62rykyvhfh9vw58w85705m6cw5jsg5s9ah	0.00000000	2032-09-01 [LOCKED]
m/49'/1'/0'/2/0:1980201600	bcrt1ql74q59quzh8qndtrhfk9wn98jyf0p39qk97tzd6qul3lewnw0u6q0s00hz	0.00000000	2032-10-01 [LOCKED]
m/49'/1'/0'/2/0:1982880000	bcrt1qtaj2qw2dnn85se4kynq87fwl80uer3puguh8mmh5k2qd0hd0h6qq6g2qay	0.00000000	2032-11-01 [LOCKED]
m/49'/1'/0'/2/0:1985472000	bcrt1qr27t689z5veyz3qf776jmu9wap0pvwtg8pmpcmynx23sje6h3juq4k2gz4	0.00000000	2032-12-01 [LOCKED]
m/49'/1'/0'/2/0:1988150400	bcrt1qqz053zrkkeqelj0unvhqj94r3jkpre0ssxdp2g9gknnehk462wnstgkpz8	0.00000000	2033-01-01 [LOCKED]
m/49'/1'/0'/2/0:1990828800	bcrt1qmp74kqvmrmhce5j9ktqjjgfaaz5j0f3kdusjgqhw9yvay77scrfqtj0g0h	0.00000000	2033-02-01 [LOCKED]
m/49'/1'/0'/2/0:1993248000	bcrt1q3udt9nl6esn2qtpens42ujcq867mrqkecnwqlranj7rw8w635peqcwdmy3	0.00000000	2033-03-01 [LOCKED]
m/49'/1'/0'/2/0:1995926400	bcrt1q4xt9jwq8x3tlefz7stnvqff2leqpc33vkwf70ngvgnepfyvn0sasxxfrsu	0.00000000	2033-04-01 [LOCKED]
m/49'/1'/0'/2/0:1998518400	bcrt1qrlxdkh33watvvgcdxjj2mjge977ctd897n87qhh6yluqgcwf28msnxyqe2	0.00000000	2033-05-01 [LOCKED]
m/49'/1'/0'/2/0:2001196800	bcrt1qhyqf3s8zq82dahnw8hqw3yyftajfljaf9y67huzxfyaghxxq0mcsd7zytu	0.00000000	2033-06-01 [LOCKED]
m/49'/1'/0'/2/0:2003788800	bcrt1qw465xkxf2m78cf7ewfr3m8uyw5vt9vp2muzh0ue859y0gupelegsa428jg	0.00000000	2033-07-01 [LOCKED]
m/49'/1'/0'/2/0:2006467200	bcrt1qet6gjsmuq2f0xxrjecqwx6rtrzhx3xz5wysxd8xt3edwmnxhnaas4cswat	0.00000000	2033-08-01 [LOCKED]
m/49'/1'/0'/2/0:2009145600	bcrt1q7z2f0mdamvggffg7p6uak8j9t3pslq7ldphcl4mla7hrgnckdvxsm5f0d7	0.00000000	2033-09-01 [LOCKED]
m/49'/1'/0'/2/0:2011737600	bcrt1q2zqtll9cl22mn8s9ptfel6cl68pq520c0uqyehgtwkl5l4e2556s2enkeh	0.00000000	2033-10-01 [LOCKED]
m/49'/1'/0'/2/0:2014416000	bcrt1qzjg7sn7u4dgrmrtnf9zvh28wu5ryanrxq35e8x0kl7kstgr7sg9qplhfcp	0.00000000	2033-11-01 [LOCKED]
m/49'/1'/0'/2/0:2017008000	bcrt1qdken7kt7ua5xkyxgmcfz3qe0dqqtg729dk5kq4xn2xnga7u22esqvywwhs	0.00000000	2033-12-01 [LOCKED]
m/49'/1'/0'/2/0:2019686400	bcrt1qlerypt4zhjeqalc2eedp5twg23m2x5ntyx0yntyh0zhdf5wrg3asgz6n20	0.00000000	2034-01-01 [LOCKED]
m/49'/1'/0'/2/0:2022364800	bcrt1q694kuwy8e8kxy5jyll3krv9kn4v886rj4fjw67k0lnplmm53hgkqsk5ghv	0.00000000	2034-02-01 [LOCKED]
m/49'/1'/0'/2/0:2024784000	bcrt1qz4qj0hmjmkghu8zlxh6dc9ahhh47lyqvn0ay7v4zshnunt5y7zmsw64za9	0.00000000	2034-03-01 [LOCKED]
m/49'/1'/0'/2/0:2027462400	bcrt1qeqy9ufjxh9mt08fl6cgu5fghgpchvsh5gvygtkpvs3vy7650599s2raxsl	0.00000000	2034-04-01 [LOCKED]
m/49'/1'/0'/2/0:2030054400	bcrt1qpdj779r2kwhtkte6xmlld7g3uesu0pxhrway3red5j7shsfj753s7pk9fh	0.00000000	2034-05-01 [LOCKED]
m/49'/1'/0'/2/0:2032732800	bcrt1q40ke075ch905tg708wp03kc554swlcnazfynsek893he9009ectsatnuwl	0.00000000	2034-06-01 [LOCKED]
m/49'/1'/0'/2/0:2035324800	bcrt1qe2s8wg3sja2gclvudtmwx8fjdasxsna0ltu9ze47ytckrn23eyysvn9el7	0.00000000	2034-07-01 [LOCKED]
m/49'/1'/0'/2/0:2038003200	bcrt1qesjd0qq0f7zwyn5urz4u2v9f7yzew04z988hgser2lrndaq5cccs0xh8uw	0.00000000	2034-08-01 [LOCKED]
m/49'/1'/0'/2/0:2040681600	bcrt1qfsayaxpg4dhn69v7jxnl3e3y2ena3mzyd7tl674nk53nq4wcle2smavf0d	0.00000000	2034-09-01 [LOCKED]
m/49'/1'/0'/2/0:2043273600	bcrt1qv9qyfghq9nnr7alm9tm3mumk0yzy3yh0wyyte8c8q2m32nykjlysjskl8t	0.00000000	2034-10-01 [LOCKED]
m/49'/1'/0'/2/0:2045952000	bcrt1qvcef9gm2lt455f8q2d7tvdkvxpnemypewhj6n2g8ud9au2u8p8nqz0lpa3	0.00000000	2034-11-01 [LOCKED]
m/49'/1'/0'/2/0:2048544000	bcrt1qsvya3p9z9hcym0vxqeh8jd8p4veqqea569ucnym4ghwlqmr4uthsjzggr6	0.00000000	2034-12-01 [LOCKED]
m/49'/1'/0'/2/0:2051222400	bcrt1qjvk07u7f478p6uasy38ahg9cs9zd985vqv4ujhcnmktdlstr44xqxva5fg	0.00000000	2035-01-01 [LOCKED]
m/49'/1'/0'/2/0:2053900800	bcrt1qegrr8j3rwvnlsr3gclupm074l8zg8x9xk28zhy3ycwcxq7t5p75sgdf5ny	0.00000000	2035-02-01 [LOCKED]
m/49'/1'/0'/2/0:2056320000	bcrt1q584fn2aev2ranemyrg55rxf24nad8y6s56g0r5csaxlfk36qy0xq929vju	0.00000000	2035-03-01 [LOCKED]
m/49'/1'/0'/2/0:2058998400	bcrt1qyyc0mtzt4ew7dq9k4kk3lwux0dmu4fsg0cx9l7x997e4u2fl4kjszqde3u	0.00000000	2035-04-01 [LOCKED]
m/49'/1'/0'/2/0:2061590400	bcrt1qxqqv59p6u8nsh28qpg9076f689rr263wwuvtzdrwucn9f479yhds6p2x5c	0.00000000	2035-05-01 [LOCKED]
m/49'/1'/0'/2/0:2064268800	bcrt1qjmsyw8qnxrjjzklgf26stdne2dvwv04pad6yl7yl760sx9eyld5spc0rl0	0.00000000	2035-06-01 [LOCKED]
m/49'/1'/0'/2/0:2066860800	bcrt1qw3fk2h2sjg4tfktc9wkzmle7x2zfvvy8hathxh55cvre2nqrw4lq67538k	0.00000000	2035-07-01 [LOCKED]
m/49'/1'/0'/2/0:2069539200	bcrt1q2495mcqth5rw6vvms20w22j0ee4za4kzkl4gxdag92u9g2z5jlxqwydfum	0.00000000	2035-08-01 [LOCKED]
m/49'/1'/0'/2/0:2072217600	bcrt1qrlzla25j3wlpx83u84nxv0ml70upcsvfhmc35prtws3ghyxsxrrshe2xcc	0.00000000	2035-09-01 [LOCKED]
m/49'/1'/0'/2/0:2074809600	bcrt1q662wxfv350m2urr4x44vq02eg86cq645na2m2g0ykgeyuaypfajq7dwlu7	0.00000000	2035-10-01 [LOCKED]
m/49'/1'/0'/2/0:2077488000	bcrt1q0xz6rdfmujvfjumq9ayays5a85mrc67lntv0dtavac6gcevx0tvqkuaecm	0.00000000	2035-11-01 [LOCKED]
m/49'/1'/0'/2/0:2080080000	bcrt1quu7ljx5yy0tcfztyxsld75k2zhua5jgpr54202vx3j0w7sq3ur3suyezea	0.00000000	2035-12-01 [LOCKED]
m/49'/1'/0'/2/0:2082758400	bcrt1qw96qpp8cs2la0faz5ekn7c34z3uy4fq6xk5d6cq9cvz47rmgvs0syqxqnh	0.00000000	2036-01-01 [LOCKED]
m/49'/1'/0'/2/0:2085436800	bcrt1qjkye3fjndh4gar6tgmckp9eet6nyegp59pp408gtw4dmwauznv0su74gwt	0.00000000	2036-02-01 [LOCKED]
m/49'/1'/0'/2/0:2087942400	bcrt1qzzc8efsg8jn720kwdsmyyk0hrtksa04qdfppqrpfn9cmj3kdu08s6daqra	0.00000000	2036-03-01 [LOCKED]
m/49'/1'/0'/2/0:2090620800	bcrt1qa4k0pc7t240sqzfs9y4k2un8336zk70heag8ap3kzr9tv36u9p6qqg7j7q	0.00000000	2036-04-01 [LOCKED]
m/49'/1'/0'/2/0:2093212800	bcrt1qctlh6al33drd88zvldcts8ndugq6ymmhy2n0k2l94rdz9fzfj5cs4vnj30	0.00000000	2036-05-01 [LOCKED]
m/49'/1'/0'/2/0:2095891200	bcrt1qdjxsgtevk0syj9e6qc6ufq3l45r85x85atksz69l4v6wkxz76sxs4apd27	0.00000000	2036-06-01 [LOCKED]
m/49'/1'/0'/2/0:2098483200	bcrt1q8vxj9wvf0akdh9srhweyw8gps40wcyyuf6lncyg9t2a8c0tv5n3scdynrj	0.00000000	2036-07-01 [LOCKED]
m/49'/1'/0'/2/0:2101161600	bcrt1qpzhaup4ysdj4za0745fqd5m74re5dx9dreyrcvaa64jmep6v9uvq5cck67	0.00000000	2036-08-01 [LOCKED]
m/49'/1'/0'/2/0:2103840000	bcrt1qpppdnesz9t437egkm2hrz0wgzv9str7sglmj69pff4ug0plurg9scvcc8p	0.00000000	2036-09-01 [LOCKED]
m/49'/1'/0'/2/0:2106432000	bcrt1qzs6q2lp5lyusgcntq64ejrcyqg9rlcfpgrwhra3d64een4dl4zpq2uhp27	0.00000000	2036-10-01 [LOCKED]
m/49'/1'/0'/2/0:2109110400	bcrt1q7yx6sgh93ww4sf8qkqufllhewzxnevn7vf6pw5tl8g7gjwhda68srt87qf	0.00000000	2036-11-01 [LOCKED]
m/49'/1'/0'/2/0:2111702400	bcrt1qjdmrrj0svx3yt2mr4zmfmmvjljmgp4rm4wm40z4a97u8auwty3aqf2cxvc	0.00000000	2036-12-01 [LOCKED]
m/49'/1'/0'/2/0:2114380800	bcrt1qeey9mhlwzvlfd9jth8txe557zeflk6zxu6j9tzvl7h3un6u7j0jqkkaguz	0.00000000	2037-01-01 [LOCKED]
m/49'/1'/0'/2/0:2117059200	bcrt1q5rnme3gu6pwmxz5x9czr4v033lmq430tvq88e0rpvj6yt3yh0t9stn84jk	0.00000000	2037-02-01 [LOCKED]
m/49'/1'/0'/2/0:2119478400	bcrt1qj4pstu3vzef2etgm7kjczgfce08xfg049kllcjqxzyg8kp9pd9hsjjuxcf	0.00000000	2037-03-01 [LOCKED]
m/49'/1'/0'/2/0:2122156800	bcrt1q24lrgptlmkgdc6ganammw0yma3zjchkyzeqnp8lnr4l575nftjuqug4v23	0.00000000	2037-04-01 [LOCKED]
m/49'/1'/0'/2/0:2124748800	bcrt1qt5lcjtcxzugsvxxd3fqg5nugth054ug2zz5anyk9fufgqwusejzqvpgq6f	0.00000000	2037-05-01 [LOCKED]
m/49'/1'/0'/2/0:2127427200	bcrt1qlgnxeqlfk8z3gxf2vpug3s5h65a6nr65kv4wz0y9f2vv64afha8s8wffeg	0.00000000	2037-06-01 [LOCKED]
m/49'/1'/0'/2/0:2130019200	bcrt1qc63ta8w7yga85s05cw938zrlw0dvwapyde2n9nqcr3atqm958ewsafp2vn	0.00000000	2037-07-01 [LOCKED]
m/49'/1'/0'/2/0:2132697600	bcrt1qjejukpev0mkk4236ce28pm6rcpwel7fnrnvekrxrn2995kumzr7q4wvk6v	0.00000000	2037-08-01 [LOCKED]
m/49'/1'/0'/2/0:2135376000	bcrt1qfyrtl20r37h6vlgdxsyssyp05tjd9w4l48h2e55ugzggj0wrgvqs75alxg	0.00000000	2037-09-01 [LOCKED]
m/49'/1'/0'/2/0:2137968000	bcrt1qfmvk3w6ef777jg906w3zaf6xjtvt7z4s8d2kh0uul8y8jnfcv5tqtxkfqk	0.00000000	2037-10-01 [LOCKED]
m/49'/1'/0'/2/0:2140646400	bcrt1qdwnxfdnsxkmdqrgmpskujcanf6tdj8fykepke23wuadw584usxpqta3x4q	0.00000000	2037-11-01 [LOCKED]
m/49'/1'/0'/2/0:2143238400	bcrt1qp5enwkp6schktpxfk9peaa48gcug5v0uuv3h4n2g2spufrv752ssjskfm3	0.00000000	2037-12-01 [LOCKED]
m/49'/1'/0'/2/0:2145916800	bcrt1q54jdh9rdsw07gkm5c5ljatpc8ndlvzc2cv7na28g8rvweu70v8hsrxjy93	0.00000000	2038-01-01 [LOCKED]
m/49'/1'/0'/2/0:2148595200	bcrt1qwj7wv0neh65etsp8djtfzheyucqrp7u3jrszvngntn773cvjgtuqe24sx4	0.00000000	2038-02-01 [LOCKED]
m/49'/1'/0'/2/0:2151014400	bcrt1qtejv6hh6jkmvvz3almfyr8wnnkejjehxqk4fgzlzak9csw8unj0q04tswr	0.00000000	2038-03-01 [LOCKED]
m/49'/1'/0'/2/0:2153692800	bcrt1qmmgdwruq7sf3q3095wchxy2l287l5a30fh0jhcgga4e703sxalaqg3whjx	0.00000000	2038-04-01 [LOCKED]
m/49'/1'/0'/2/0:2156284800	bcrt1qk8mu9rulrhcs3kxvty7vyll66hrcq96ltaamk2t0p09gmhfkn6mqw8fsql	0.00000000	2038-05-01 [LOCKED]
m/49'/1'/0'/2/0:2158963200	bcrt1qlyglrg05ljd80rgek8rdr63f2gj80xznraqvkk56y8azcu59sm7q0dvjz2	0.00000000	2038-06-01 [LOCKED]
m/49'/1'/0'/2/0:2161555200	bcrt1q2xj2pw6r4ks8f43cd46c6kwlp7a790qyl627l2zctf28mk9l5jmq43auun	0.00000000	2038-07-01 [LOCKED]
m/49'/1'/0'/2/0:2164233600	bcrt1qekazg9mfm9cauajun2gqdckak999fp6xl32tr6gjwl4yfdr9zltsnxcp9p	0.00000000	2038-08-01 [LOCKED]
m/49'/1'/0'/2/0:2166912000	bcrt1qckpdx65wrm6c65gj7w3h5t06txcq36uqjr8q5mxs0qpqpgxet9hqxn3yhp	0.00000000	2038-09-01 [LOCKED]
m/49'/1'/0'/2/0:2169504000	bcrt1qm6jmkzkkf8v8y7jz6pretse9hz2acsl36pp6cu8xvax28fcnm82qcd4vqn	0.00000000	2038-10-01 [LOCKED]
m/49'/1'/0'/2/0:2172182400	bcrt1qlv64wufrde6mazla8gxnwvcvxmmgef7vnljxdy9aruwydgze055s4p55rn	0.00000000	2038-11-01 [LOCKED]
m/49'/1'/0'/2/0:2174774400	bcrt1q50k8pcxdlpw0vjale0tlju24hm00l05g4revqshhs6xe9p0lm4as2rsucq	0.00000000	2038-12-01 [LOCKED]
m/49'/1'/0'/2/0:2177452800	bcrt1qcaywugke6yz7ueu4h6fwj5nvgcgf5wca9trh2ke2nj39m300qugssc04ej	0.00000000	2039-01-01 [LOCKED]
m/49'/1'/0'/2/0:2180131200	bcrt1qtnvtegvtfzwr7fsyjd5ulr6qptxk556jrs7dmpptzt0auct6t9asueewnn	0.00000000	2039-02-01 [LOCKED]
m/49'/1'/0'/2/0:2182550400	bcrt1q6q0egr255h755ps5wsf59fjqhw87mads77ywvg5hgt0jk60cqf0s64l0dw	0.00000000	2039-03-01 [LOCKED]
m/49'/1'/0'/2/0:2185228800	bcrt1qneexxm6629tdpk75gszwdwvrgankr7y47jfz5mnqvq8r7meytetsxwrwg4	0.00000000	2039-04-01 [LOCKED]
m/49'/1'/0'/2/0:2187820800	bcrt1qcjuvynrf0lgxgdu924rqwfjnccgwy9txykrn2lnsx59a5z87ukkq9m5qju	0.00000000	2039-05-01 [LOCKED]
m/49'/1'/0'/2/0:2190499200	bcrt1q0dnlz367txz32fskymyqyjzm0j64rqjfs20rvs9qh33ytprxa7csz4rq3c	0.00000000	2039-06-01 [LOCKED]
m/49'/1'/0'/2/0:2193091200	bcrt1qzewck4cs4q595u34rz9n506hr68vy3qfu39n8xg8zvum890cz37qx3z3ev	0.00000000	2039-07-01 [LOCKED]
m/49'/1'/0'/2/0:2195769600	bcrt1qpafhp4uv6par372wz5uswg8trjlm89rduv0laxn8vpezt0gl0vasj3yw5l	0.00000000	2039-08-01 [LOCKED]
m/49'/1'/0'/2/0:2198448000	bcrt1qf5jmqz88rk9sm0efef5l689kthlgdyyrdyn7jc0lj8njev7whjmqwej739	0.00000000	2039-09-01 [LOCKED]
m/49'/1'/0'/2/0:2201040000	bcrt1qdg8kzw2l2td0f2zj0gaxznz4l0673n9epqukfwq0wty8hennuphqx36740	0.00000000	2039-10-01 [LOCKED]
m/49'/1'/0'/2/0:2203718400	bcrt1q66k273n2d3454su5wrwhd777aslkxyuz7f5vnatdvnv809nnmgus2erd7z	0.00000000	2039-11-01 [LOCKED]
m/49'/1'/0'/2/0:2206310400	bcrt1qd8qqeq2wsm4gh3at4vtjajppe5t22tg23pqwh0zfx8dgxgp3w25qr8lzkz	0.00000000	2039-12-01 [LOCKED]
m/49'/1'/0'/2/0:2208988800	bcrt1qsrpwm67wh9g68256gx298rj88ut8296dsuhpz6y60yng76l0lsuqw0xcwu	0.00000000	2040-01-01 [LOCKED]
m/49'/1'/0'/2/0:2211667200	bcrt1q2pkfv0gpy7c788a0p9wem5lm485v8x666y3du54hkwvdw32nujcsyr2hx2	0.00000000	2040-02-01 [LOCKED]
m/49'/1'/0'/2/0:2214172800	bcrt1qkfhre05nwrff8cy3g49efw5l74v4pt86xqq0c4qj7effsdrcskssx0um6p	0.00000000	2040-03-01 [LOCKED]
m/49'/1'/0'/2/0:2216851200	bcrt1qz3pnra85vackdeanrvv4m3af9fk9ytqqr8jrrhfnqjvzm07galzs7m8sxl	0.00000000	2040-04-01 [LOCKED]
m/49'/1'/0'/2/0:2219443200	bcrt1q4luf2csutz80nshyfskedepr8dghl033vetxn2cmyuh0mzvf8eaqplwdhf	0.00000000	2040-05-01 [LOCKED]
m/49'/1'/0'/2/0:2222121600	bcrt1qdq22kd8ggx2wq9xl88tc6h7m6xkkcdgysva406ydwt49z5kaqrvq44wslx	0.00000000	2040-06-01 [LOCKED]
m/49'/1'/0'/2/0:2224713600	bcrt1q4p6mt80kgnlu56nythek94gprfxha9la3v3ch3zfcev9mgjp76kqg787td	0.00000000	2040-07-01 [LOCKED]
m/49'/1'/0'/2/0:2227392000	bcrt1qt8t9ewydehmz9e2qg6xhguuyetpnxjz5jnwvjuc5ygf2w7gr7w6sz8ahle	0.00000000	2040-08-01 [LOCKED]
m/49'/1'/0'/2/0:2230070400	bcrt1qupfhqqyh2ky36gdftq8vwp78svaej2g07mpt9j7j8cs6863gvtms3s6lv4	0.00000000	2040-09-01 [LOCKED]
m/49'/1'/0'/2/0:2232662400	bcrt1q2qwlf9kywt0ekdfwxd0n4078kw5g7x53xs95qt3whca3rrhznvyqg92dnf	0.00000000	2040-10-01 [LOCKED]
m/49'/1'/0'/2/0:2235340800	bcrt1qj24ewrttztv984z57mmdalmn8alvzr0yehuyhf9r4qxledmh908qw8sgsm	0.00000000	2040-11-01 [LOCKED]
m/49'/1'/0'/2/0:2237932800	bcrt1q7x54gy7us7nag82w6lzz5fktskx9y6vzqkevelap0cdtlnc3g8zsehxwhr	0.00000000	2040-12-01 [LOCKED]
m/49'/1'/0'/2/0:2240611200	bcrt1q9ka3uy0gy0qjwf69tkv508tarygxeqkkhhaqveur3mry7dqlxlvqqhw3dv	0.00000000	2041-01-01 [LOCKED]
m/49'/1'/0'/2/0:2243289600	bcrt1qxa6fxdu0h9q54jeahmwwk3rf6wj7jalzywkd0g4nm83zcgfxsmfs42wxfq	0.00000000	2041-02-01 [LOCKED]
m/49'/1'/0'/2/0:2245708800	bcrt1qngettfw0rpksgursadvan47l0lk2d7xc2mculke8xkrepgwkm4fqj7n7zt	0.00000000	2041-03-01 [LOCKED]
m/49'/1'/0'/2/0:2248387200	bcrt1qgvg2zfl4s772jjq6v0hvp292d2fvnk9fd5mzw4d0sdeuhd8q2xdsfa7ysm	0.00000000	2041-04-01 [LOCKED]
m/49'/1'/0'/2/0:2250979200	bcrt1q2hemzms2aaq5c7fadhxd7jhna2dukwfu5d0j4ysuv2ut39rekj6shgvxmp	0.00000000	2041-05-01 [LOCKED]
m/49'/1'/0'/2/0:2253657600	bcrt1qurr37e3ez98dk2vg4q7zfznghec4wz5hgsjy45wxrdfg4wy52saqry4dul	0.00000000	2041-06-01 [LOCKED]
m/49'/1'/0'/2/0:2256249600	bcrt1qferccwvsl3576tga64zjncdhk7g4zyfll54tac4hfuv0a3zs0vas86vdgu	0.00000000	2041-07-01 [LOCKED]
m/49'/1'/0'/2/0:2258928000	bcrt1q8jnrdqam7tn0g74g96ssyxc0jd8zf98zm954yw02zz4w9ptjre3qnsha3a	0.00000000	2041-08-01 [LOCKED]
m/49'/1'/0'/2/0:2261606400	bcrt1q9ck32dnurej8hxdq2pmhal005685g3e39knqnr2ge6vcyu0emesqehv7jv	0.00000000	2041-09-01 [LOCKED]
m/49'/1'/0'/2/0:2264198400	bcrt1qe7af36lvey5z5ejc4lxc5z8rkz020kjf47ry0zzwcnh0mg8pervsh00sdn	0.00000000	2041-10-01 [LOCKED]
m/49'/1'/0'/2/0:2266876800	bcrt1qnxmccf7zc2znzfq7t29hk5jn2yghg8fzhgwldyelncev0pk5j7qqqtfe8g	0.00000000	2041-11-01 [LOCKED]
m/49'/1'/0'/2/0:2269468800	bcrt1qw3jaq7nqfux6dfd3eqmfqrwg4l4qvsy8txhys9826z0dt057t7pszc3svu	0.00000000	2041-12-01 [LOCKED]
m/49'/1'/0'/2/0:2272147200	bcrt1qrla8tng0ajudqupfgucs2a57qcr52669jtn7gd0uwasyhkhw504q768sxp	0.00000000	2042-01-01 [LOCKED]
m/49'/1'/0'/2/0:2274825600	bcrt1qehv50cpzjfwqfqqve64l593pxpa875mle43qs0jgnz459tudqwlsuwqhm2	0.00000000	2042-02-01 [LOCKED]
m/49'/1'/0'/2/0:2277244800	bcrt1qjch5pvuxpm2l35vw2zumu5r3nmred5v3wvy6xh79g6yljup7e68q7te0n9	0.00000000	2042-03-01 [LOCKED]
m/49'/1'/0'/2/0:2279923200	bcrt1qcqgyyekcc7gza76hm76rg0k7j8z0780rgawhx2wex4jux7he0q6qs8yr6m	0.00000000	2042-04-01 [LOCKED]
m/49'/1'/0'/2/0:2282515200	bcrt1q3uftxl8glrl82zkrfam2x2duj5y69xxcyft8ntmglk7n300fkpks3q6gpa	0.00000000	2042-05-01 [LOCKED]
m/49'/1'/0'/2/0:2285193600	bcrt1q45fqcx70tw7ktv7j2rmyc8wtea0ateg4hy98tcdfxm3upn39hkzsfc9ktd	0.00000000	2042-06-01 [LOCKED]
m/49'/1'/0'/2/0:2287785600	bcrt1qfaumuxdvx2g39ysrhgywld8nmzuyvclhdwpyu7829hefz9qpnlks9eaaqv	0.00000000	2042-07-01 [LOCKED]
m/49'/1'/0'/2/0:2290464000	bcrt1qert8r8qm7aceuajapj9pdev3npwfm9q4edj563jd9uem4pgwuwvq9lzmfp	0.00000000	2042-08-01 [LOCKED]
m/49'/1'/0'/2/0:2293142400	bcrt1qen2tz5wqx409kk6nhd58chkp76v0e6mul4tyzuv8ua5wq528507qp6aw5j	0.00000000	2042-09-01 [LOCKED]
m/49'/1'/0'/2/0:2295734400	bcrt1qv7u90qmlk38zzphfag6c0lqudpf2lprmwd5wr7fjtmy57q4snuls3jfzys	0.00000000	2042-10-01 [LOCKED]
m/49'/1'/0'/2/0:2298412800	bcrt1qply8twwuvuad67fkutpdle02sn8cjjxakztnurtcmd3rvkkqusqq0ncklm	0.00000000	2042-11-01 [LOCKED]
m/49'/1'/0'/2/0:2301004800	bcrt1q8kcsvca8y5m7yta4cmr5g0994mgeq99r0zt4zrtq36j9kxu2jzpssagj54	0.00000000	2042-12-01 [LOCKED]
m/49'/1'/0'/2/0:2303683200	bcrt1qh79qfzke8kw9xhc8vvgccsyvwa8vxanqyzk33kju3aahmme9quhsrfgk53	0.00000000	2043-01-01 [LOCKED]
m/49'/1'/0'/2/0:2306361600	bcrt1qrq64c30grmydt0dmfdu780d4hmh3n8lqmyttc8cn3qnqdxdll54qs09arm	0.00000000	2043-02-01 [LOCKED]
m/49'/1'/0'/2/0:2308780800	bcrt1ql2hk8au52fpuvd4ljqh57zx5fpq8rcwd8ehkc4qjhnmnz9cwegjq0kpz8r	0.00000000	2043-03-01 [LOCKED]
m/49'/1'/0'/2/0:2311459200	bcrt1qwx47amjp47rra90xw8wu5k0920d0s6l8z2x4c2c4msqx86vx8uas3lw87e	0.00000000	2043-04-01 [LOCKED]
m/49'/1'/0'/2/0:2314051200	bcrt1q8vmu4ey8fdujtjeq092rfte7m4zdgekf4kk78es2yfvut7f9xd0q2xc66w	0.00000000	2043-05-01 [LOCKED]
m/49'/1'/0'/2/0:2316729600	bcrt1qufhl9nvj6gpy543te0lwy5wxz69wph7t5m949tu4hwzsj8djqezqxeu34x	0.00000000	2043-06-01 [LOCKED]
m/49'/1'/0'/2/0:2319321600	bcrt1qyyyvfa9v4m02awneddxrtmusx6tt9z4ynzsderdanj4wu8qxdt6sms266v	0.00000000	2043-07-01 [LOCKED]
m/49'/1'/0'/2/0:2322000000	bcrt1q3wxws93stpxrqhzwc3vexcthzhynn7llz95ss7fzu8cjxr2azqtq753f6e	0.00000000	2043-08-01 [LOCKED]
m/49'/1'/0'/2/0:2324678400	bcrt1q3gawnuysh2xpxwxycvzu4u5lupu2he3say7qs630jatym5hnzcnsx3nrvd	0.00000000	2043-09-01 [LOCKED]
m/49'/1'/0'/2/0:2327270400	bcrt1q87hxf3eudhy9mthhjhjfnjzaszpp22wt74cmfmflnmxw6qp0njrsevu5p9	0.00000000	2043-10-01 [LOCKED]
m/49'/1'/0'/2/0:2329948800	bcrt1qxz98wq22zxgxsdfd0833x9664znh5rm2p6ca9mgetu8qaeuda9vq6k0utz	0.00000000	2043-11-01 [LOCKED]
m/49'/1'/0'/2/0:2332540800	bcrt1qsytc4d8s82pxge4mtwrrnudnhgvnnac0culezh4fr5e4wwc0s5mqq7m4vd	0.00000000	2043-12-01 [LOCKED]
m/49'/1'/0'/2/0:2335219200	bcrt1q36teefd7x7pv5y8pt7gwfd4vqjdu8swndk3yvmsvs37pmv3g265sc4v55e	0.00000000	2044-01-01 [LOCKED]
m/49'/1'/0'/2/0:2337897600	bcrt1qruumf8m2ufkahr87fwl363akuue4ku4qkdrjn579x9ndu22ypr2sgk2y2q	0.00000000	2044-02-01 [LOCKED]
m/49'/1'/0'/2/0:2340403200	bcrt1q8d9sggjjaecul8ad80kp3fg4fakma8xhu4ktl7zwyef32akkvkws5677n4	0.00000000	2044-03-01 [LOCKED]
m/49'/1'/0'/2/0:2343081600	bcrt1qz5djuzxp30n2mgxp5rxp6ldz3v4uahspzlxmwa8cf3dk6a6f2c5s9cygl8	0.00000000	2044-04-01 [LOCKED]
m/49'/1'/0'/2/0:2345673600	bcrt1qhn0qjkscejg2gnpkfrhsvhv56g6affewq5vmwy8zwg8p3zdm656stxe6tf	0.00000000	2044-05-01 [LOCKED]
m/49'/1'/0'/2/0:2348352000	bcrt1qtrgl0ygg522cgakvr6ud4jp257la2p8r5kuddxgne3cm6t4xz65sw55w7p	0.00000000	2044-06-01 [LOCKED]
m/49'/1'/0'/2/0:2350944000	bcrt1qnakhqgvk90yue5wapdrsm84fk8rhg2jk22zk3jd759yh8wwly3hsnyzka8	0.00000000	2044-07-01 [LOCKED]
m/49'/1'/0'/2/0:2353622400	bcrt1qvglu5nqhcclhrqq9v4p82pqzphsqe6hn34fulg87rk9h02qkae3qwdp6ca	0.00000000	2044-08-01 [LOCKED]
m/49'/1'/0'/2/0:2356300800	bcrt1qmdl8pwcral2h44c25p8gw2r606hxdt63cw85u5jyvr8yfsajly6spd5uhx	0.00000000	2044-09-01 [LOCKED]
m/49'/1'/0'/2/0:2358892800	bcrt1q0wrejy9t4npsf6ych00qnhpldk6ptzjuy6gfjhfceww488xtuufqnwt48d	0.00000000	2044-10-01 [LOCKED]
m/49'/1'/0'/2/0:2361571200	bcrt1q39dhyvha5vyamhw3yjpvdj4m6kt374u4wp8ttwch8vd2mpl7v58qhug8v2	0.00000000	2044-11-01 [LOCKED]
m/49'/1'/0'/2/0:2364163200	bcrt1q33t9t2x9ydnagzr4q387eqts5xx6hfyen8fxgf7v5fpcjwg8f6nqa8wwxa	0.00000000	2044-12-01 [LOCKED]
m/49'/1'/0'/2/0:2366841600	bcrt1q205ttw25uvfpeqqw72f86uuwnug0m4gjxz84gclx87wulq2th47qlqvp2p	0.00000000	2045-01-01 [LOCKED]
m/49'/1'/0'/2/0:2369520000	bcrt1qzslceeqhad4n8epkcef08uan2qs7tlaldmf5xv2vpgwwnmpkc73qvtx0j0	0.00000000	2045-02-01 [LOCKED]
m/49'/1'/0'/2/0:2371939200	bcrt1qy6tnej9guxn46xl2sls9r64xt5pcsn855mtayjzc2607z20vvh5q2r4wcu	0.00000000	2045-03-01 [LOCKED]
m/49'/1'/0'/2/0:2374617600	bcrt1q0thgdu3lham8term35ywa684ch0wxjwkcq5whwlpm4fye5zt2csqu3836y	0.00000000	2045-04-01 [LOCKED]
m/49'/1'/0'/2/0:2377209600	bcrt1q7e9rw8wyc2e0lh4uechq297zzum5h443tcwkqe0nrc0aq9ndcs3qdxdn2a	0.00000000	2045-05-01 [LOCKED]
m/49'/1'/0'/2/0:2379888000	bcrt1qrpe9f5j2zjpqw6qurxzfs059q4t3w97s76rp7ge6vfejluvw896qksgd4p	0.00000000	2045-06-01 [LOCKED]
m/49'/1'/0'/2/0:2382480000	bcrt1q9085t8qruggdrrk9d78vjcd0ehe02xxg4pdhenhkatkfva25mp9s95pnc7	0.00000000	2045-07-01 [LOCKED]
m/49'/1'/0'/2/0:2385158400	bcrt1qscnlvuhtcjmjp3a7ld8fm99r3e4jncqs2536curx3ytlw0tq7v8q0h0e4p	0.00000000	2045-08-01 [LOCKED]
m/49'/1'/0'/2/0:2387836800	bcrt1qac275hyk6hh9cdz0d833s9p63qn85cyvskzadqcqt66wuv82re4sdha44y	0.00000000	2045-09-01 [LOCKED]
m/49'/1'/0'/2/0:2390428800	bcrt1qywzz88u2xlfda4q2wqw2ejwhn5drdmx4x44lgt98q8vh0vgmllysnjrc9r	0.00000000	2045-10-01 [LOCKED]
m/49'/1'/0'/2/0:2393107200	bcrt1qpr2lumsdux9prjkyw26neknrw2u8u4wuf3aqtayqqrypfcagpmqqprejl5	0.00000000	2045-11-01 [LOCKED]
m/49'/1'/0'/2/0:2395699200	bcrt1q0presjwjnktdy0m3djsxcf0x0tfrr9q72wk2r8jjdwkts7vunsus6yl79c	0.00000000	2045-12-01 [LOCKED]
m/49'/1'/0'/2/0:2398377600	bcrt1qyss7uf0thd82zyvj832lnah5ap6t3zruek9gk2p3h0es92tarq8qdq9fr0	0.00000000	2046-01-01 [LOCKED]
m/49'/1'/0'/2/0:2401056000	bcrt1qdclf8lgzfxn4dduc0m876ywt8ldlam88ng8eckytnn0sck2knehqngphhw	0.00000000	2046-02-01 [LOCKED]
m/49'/1'/0'/2/0:2403475200	bcrt1qvldkw9zywqf35y5ag7k5xqlz93ln2wv39249wpjd68rh7ra85s2sx0r2d4	0.00000000	2046-03-01 [LOCKED]
m/49'/1'/0'/2/0:2406153600	bcrt1q6ztffswvs6mqusddekwvunlegyt4qsxmr690e9pahvn2fh6aexzs3l9psl	0.00000000	2046-04-01 [LOCKED]
m/49'/1'/0'/2/0:2408745600	bcrt1q9d764hx224gg9l2r37tjd4anl50etkk2swyz8l5jr5u0msp72mqqr33d07	0.00000000	2046-05-01 [LOCKED]
m/49'/1'/0'/2/0:2411424000	bcrt1qm0gy5dtgxq4uw63vxmsqcqq6xjj46692wwv0ynphyjh4y8a9xtlqp44vcm	0.00000000	2046-06-01 [LOCKED]
m/49'/1'/0'/2/0:2414016000	bcrt1qa88u8c0ynm2zq6l8s0syvdgnutmxrp4g94eu95txrl7sfmwa550snryptf	0.00000000	2046-07-01 [LOCKED]
m/49'/1'/0'/2/0:2416694400	bcrt1qe5lljg33j773d253kefkhw4fgqxuek046x0hcxhxh5r4qzp9ck2qmy8fke	0.00000000	2046-08-01 [LOCKED]
m/49'/1'/0'/2/0:2419372800	bcrt1q3f7h7lezh8cm7g2nj6t3uq3tfv8xfc9u36zd9sv0m00vcf0gxqnq4w5pgx	0.00000000	2046-09-01 [LOCKED]
m/49'/1'/0'/2/0:2421964800	bcrt1q7tchcktlmwqp20dmjln7p6gypncuvcfhqtkc6kuzk6n05esng97q8jakvn	0.00000000	2046-10-01 [LOCKED]
m/49'/1'/0'/2/0:2424643200	bcrt1q9xatfdmxrjmqmnfd2sgfqfln3572kpz9e00gd2k6xch575spqvfq5cf57h	0.00000000	2046-11-01 [LOCKED]
m/49'/1'/0'/2/0:2427235200	bcrt1q9qwdknzkhlaqvavxt33fkh3jruz4tdnufpt3hz9dvh49vgzeuavsufhdc0	0.00000000	2046-12-01 [LOCKED]
m/49'/1'/0'/2/0:2429913600	bcrt1qftmvanggmulj0jvlml7hf9d445emxtnveexvq5cygekedrhug2aqvfj27y	0.00000000	2047-01-01 [LOCKED]
m/49'/1'/0'/2/0:2432592000	bcrt1qlrqkg52n3220tr7r6wlxncq3jqd6d3cv46xd775x2qugmugvjtaqvaun2u	0.00000000	2047-02-01 [LOCKED]
m/49'/1'/0'/2/0:2435011200	bcrt1q74jhnlthmd32q2knetp9lw5az83ay3ht673uq8punf8naxescxeq6xxqpr	0.00000000	2047-03-01 [LOCKED]
m/49'/1'/0'/2/0:2437689600	bcrt1q7ckrhlrtd7ws4u63xskqcjyj4nfddaaj8tdwsjgxkgnd0sqvzdcqy7280e	0.00000000	2047-04-01 [LOCKED]
m/49'/1'/0'/2/0:2440281600	bcrt1q5329ajc32xlu6vpkvsqsjem60mvg6pvxhkpuljzccdvq6sg60z7qhge7s8	0.00000000	2047-05-01 [LOCKED]
m/49'/1'/0'/2/0:2442960000	bcrt1qeyuw4kp6wgayvu04ff22e2d85a5qe4fn0src8jaupg9h45uzgf8sd859va	0.00000000	2047-06-01 [LOCKED]
m/49'/1'/0'/2/0:2445552000	bcrt1q95gvrm6gup44km3cwpp2d9agygvk452gpslrqjwn3hj34pq8ruvqqdcgfv	0.00000000	2047-07-01 [LOCKED]
m/49'/1'/0'/2/0:2448230400	bcrt1q487d9spl3qfegnmpcxkg3fwgx42438rl6238fe8yuyljexw9edaq5k3t4t	0.00000000	2047-08-01 [LOCKED]
m/49'/1'/0'/2/0:2450908800	bcrt1qczcngej03zg3gqmen27qrpn8fsmdrl3lq3vjltzgrdmr29zuanasy7282n	0.00000000	2047-09-01 [LOCKED]
m/49'/1'/0'/2/0:2453500800	bcrt1qljyh480237n8u9gwa87heg72g60gvtsxpeyrt34d2qcflzmjqq8s9clg6a	0.00000000	2047-10-01 [LOCKED]
m/49'/1'/0'/2/0:2456179200	bcrt1qsvp4xclkdj50mxx6nltq3etq7enwxsjdw4sngxvwj4umfj0awgzqaepxgd	0.00000000	2047-11-01 [LOCKED]
m/49'/1'/0'/2/0:2458771200	bcrt1qnast64utmqsje0m93hz023sl5hmddnsyzm6j4lyft4qhzl4a8cuq2q7krv	0.00000000	2047-12-01 [LOCKED]
m/49'/1'/0'/2/0:2461449600	bcrt1q7tyr2x7dnffvdfmadt9r5cxumvj5nrseg9zhzsn5yg8kfcesxahqw9yqch	0.00000000	2048-01-01 [LOCKED]
m/49'/1'/0'/2/0:2464128000	bcrt1qtfn7fv35nftafkj6k4xfqjpzwysmqyfvps35d9d64amneuj6r9dq7mpgwj	0.00000000	2048-02-01 [LOCKED]
m/49'/1'/0'/2/0:2466633600	bcrt1q063p6j8vtjetsdmyn3xsh9frwennzwu4e6fwk4zc6xzq0hltxyjqa6zl00	0.00000000	2048-03-01 [LOCKED]
m/49'/1'/0'/2/0:2469312000	bcrt1qc6lp86aks38q7ta8gyllhsw4xrl9sh7v6f5jszfk9aj657p7nycs9sknwc	0.00000000	2048-04-01 [LOCKED]
m/49'/1'/0'/2/0:2471904000	bcrt1qyj7u3gshgyhttc7nrgvw7xc2562fsnt8n8gctqvs2p5jnqxf8x9q9pv8xl	0.00000000	2048-05-01 [LOCKED]
m/49'/1'/0'/2/0:2474582400	bcrt1qwxs88jdns5q48lppa8twrrg3g7hlxe2v9rdcc2kfz47gc45v6a2qxh02ge	0.00000000	2048-06-01 [LOCKED]
m/49'/1'/0'/2/0:2477174400	bcrt1qcktxpvtw4m2tn02avnmkkghnzwfyr6jusz9teprqfxn2kctmm7fsqlw3km	0.00000000	2048-07-01 [LOCKED]
m/49'/1'/0'/2/0:2479852800	bcrt1qru7armscz8vsj35eyacuh94j27jasr5wnkynjwwg8cfws9dl3wusvlrx63	0.00000000	2048-08-01 [LOCKED]
m/49'/1'/0'/2/0:2482531200	bcrt1q3ww5fx9shsyyjhdn028nshcq3j4rfthjal60c48dgux26su6xw9sqlxgem	0.00000000	2048-09-01 [LOCKED]
m/49'/1'/0'/2/0:2485123200	bcrt1qum6uhkxc7dy42f8d7mqx6gculzzkl99x3cxst7ng5ektvuqcy0vq3clulw	0.00000000	2048-10-01 [LOCKED]
m/49'/1'/0'/2/0:2487801600	bcrt1q9rhzmul7skc334sl97jutn8rg9dsgkjq0xs77nsrz6f5hvk337eq27qcut	0.00000000	2048-11-01 [LOCKED]
m/49'/1'/0'/2/0:2490393600	bcrt1qfcx6u2m32a0th6aj5nyx4mu4uz4tt340u53nvwym6l8jl9jz5x8s8ern5a	0.00000000	2048-12-01 [LOCKED]
m/49'/1'/0'/2/0:2493072000	bcrt1qshhc6473sxhc4v8ky86g0mpjmly786lyvh40lj8z5smsg7w430zsnsh2sj	0.00000000	2049-01-01 [LOCKED]
m/49'/1'/0'/2/0:2495750400	bcrt1qvw0gnv5ql4ku532hc26hazz8sgxhdmf26mmp4r4h0r6at6xk75xsaqlgq2	0.00000000	2049-02-01 [LOCKED]
m/49'/1'/0'/2/0:2498169600	bcrt1qm89yhdqpn02jmdy38r0mjt2c6hegevfxzccyhxq8y04syf2n66tqdx97kj	0.00000000	2049-03-01 [LOCKED]
m/49'/1'/0'/2/0:2500848000	bcrt1qg0trs55zs5w62r4j725dmrpuqna4fnfp9dqxumlcpmtqvw9wg94q4cy3nd	0.00000000	2049-04-01 [LOCKED]
m/49'/1'/0'/2/0:2503440000	bcrt1qh0v4430ec9r92yzxrcuqgx9xm3xjj6vvgd2cppm7emgaa0hk4acs2u74wm	0.00000000	2049-05-01 [LOCKED]
m/49'/1'/0'/2/0:2506118400	bcrt1q5hl97refxejqte3vkaq7xext08qpcyuz6av99daek4d4w4a0k7hsjsnw6f	0.00000000	2049-06-01 [LOCKED]
m/49'/1'/0'/2/0:2508710400	bcrt1q9pt5dserxssazekzpl2jj0e4csfy7mnwnxhpyq02svwzav22qj8q67k4yw	0.00000000	2049-07-01 [LOCKED]
m/49'/1'/0'/2/0:2511388800	bcrt1q74g4mp44djv5qwld7q0azgvc6pf2ep2jas4ecwmvedvvkwl7v55s4s33lm	0.00000000	2049-08-01 [LOCKED]
m/49'/1'/0'/2/0:2514067200	bcrt1qsy0zyx8aqqv5akdns5uffwwaqu5gw23xpa82j5mg39m78mu48mlsy26797	0.00000000	2049-09-01 [LOCKED]
m/49'/1'/0'/2/0:2516659200	bcrt1q9gyrfd2almsp6n0qrcpu2wk493v5n8lmu98d7cuhvyucd937tdvs0sgfcv	0.00000000	2049-10-01 [LOCKED]
m/49'/1'/0'/2/0:2519337600	bcrt1qtdyeanm62cua45k5jdf4cwfuz2nuyxgrp0la5v362zvytszk9acqs7rwvt	0.00000000	2049-11-01 [LOCKED]
m/49'/1'/0'/2/0:2521929600	bcrt1qn7n6s5fysf4p8e4xpt3c029c7rr8lmds8j6yv23ayqpt8x6xmn2set4mjl	0.00000000	2049-12-01 [LOCKED]
Balance:	0.00000000
Balance for mixdepth 0:	0.00000000
mixdepth	1	tpubDDCXgSpdxuVbaWpPN6nkNTL7B1kKURDWfKYrpocw8EBK4bYuKzWcB1Yi1uTsXprXb6HDy6TpacWxv448aoqnmyMsmPWVwxuvdEaDSHwZgWu
external addresses	m/49'/1'/1'/0	tpubDEApBoUZABayhFrRnYKR4eaQVqJjXHyLMDLiUJ3LfYS9RB2LpCWqsEwKLGtLKqP7a8SQjPKoZ1PyRNFQBgTDh4uN7rzfS2RSkuxanbvF8Vf
m/49'/1'/1'/0/0     	2MvX2wkiAUg5AAsxLZBTxRRxYqAqCQDTUzN	0.00000000	new
m/49'/1'/1'/0/1     	2MtF5BUyQsMFczjx5gmd2U7HvF1LiEpXq29	0.00000000	new
m/49'/1'/1'/0/2     	2NECJHzjUmbxndKqZfaZJ2qSN1oZCDYCSf2	0.00000000	new
m/49'/1'/1'/0/3     	2N4mxgDnEerFUviDd5W8LHXfy1sn4F1iYRc	0.00000000	new
m/49'/1'/1'/0/4     	2MzRazUtT23iJX2VFQVVb3PewR6nHsVhqnj	0.00000000	new
m/49'/1'/1'/0/5     	2N6UvUSUicat6QtecHAYV4acN2JLq9uZTzQ	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/1'/1	
m/49'/1'/1'/1/0     	2Mws8HX7wQXnasyDMQ12RwFRbL2gJgavqNK	0.00000000	new
m/49'/1'/1'/1/1     	2Mt84329Z1DY2NHSy63fJJootPbsBbjfdSm	0.00000000	new
m/49'/1'/1'/1/2     	2N4rUpdMeMgvXs9H1QotG9rrNX7G1gQTZaA	0.00000000	new
m/49'/1'/1'/1/3     	2NCQTGY9SeByrBhtoTx9dJQEh2968VYARWW	0.00000000	new
m/49'/1'/1'/1/4     	2NFmBQyUSYYBt7eBcfrb1piCbqkX47FWDib	0.00000000	new
m/49'/1'/1'/1/5     	2MuaHh4HoF7PvMKqExF23UyWSde8DmY9Qg2	0.00000000	new
Balance:	0.00000000
Balance for mixdepth 1:	0.00000000
mixdepth	2	tpubDDCXgSpdxuVbbKVb3VuaEwouzKkWbWjGEi75TWBoj9dWnMYUrxHR5M4REANJnca3DGF7m3k7Kn6eP2vVfeCteqDfwxj3VnHc3ahG7KcnYwA
external addresses	m/49'/1'/2'/0	tpubDEWU8RnwYfmFj7j5j2EeDAzy2JxyxooXi1wtAxbXL8McYHTXGKZ3p5qFBZqt5N9YZrherQ4FFNpz9Y34zYhJCaVwBsTQBnnMvFhMnB8Z9Js
m/49'/1'/2'/0/0     	2MwCicX6N1PZdtNVE6wUCRcYksBqGpzNA4D	0.00000000	new
m/49'/1'/2'/0/1     	2N7rE4qC6avsTFth5XrGS7RBc6frfCFDDFs	0.00000000	new
m/49'/1'/2'/0/2     	2MutaH9aWeoxX8SPqbRU9cGLfHMAyPniYCa	0.00000000	new
m/49'/1'/2'/0/3     	2NB73i5AUf4aG19LV3wea5tebXb7W1hz27o	0.00000000	new
m/49'/1'/2'/0/4     	2N3iCF6qxFzYhCnJeQzakNKgrGwLDM3C3Ke	0.00000000	new
m/49'/1'/2'/0/5     	2N2UgyRLYTuW4DTWEdqt61d3oN1WsijZw6v	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/2'/1	
m/49'/1'/2'/1/0     	2N9aEWxu9UcMDNjHT476dfJLg8gPqBXrKdV	0.00000000	new
m/49'/1'/2'/1/1     	2N9sVKbz7n6QvSjqXGfkJs6jfzjFSaHVfxK	0.00000000	new
m/49'/1'/2'/1/2     	2MvXBaj85qNt8JjE89nu3ZqaXreyH3M63EP	0.00000000	new
m/49'/1'/2'/1/3     	2NCB22WeXWi1W4nrFRVBorDrFGqRcVE2KEh	0.00000000	new
m/49'/1'/2'/1/4     	2N8bYTraFinBqPN1ymQc8Fywx8EPVbEonBE	0.00000000	new
m/49'/1'/2'/1/5     	2MykmrhYG663fYFjyaPgmHyRR3dNevBg5GE	0.00000000	new
Balance:	0.00000000
Balance for mixdepth 2:	0.00000000
mixdepth	3	tpubDDCXgSpdxuVbdm7gKAPSkRgHS3zCDLESs1aD7xL9zGDeVmiBSUPpB19hqV17BhNYYR251C4mDvurk9uaoKD3PCbfQ49EdkyHrztaPQLYeZK
external addresses	m/49'/1'/3'/0	tpubDEPWmQPAcQ7jSyDBtokLJ7PH831BfibuMC1cHDT1AaA6fUyq9CKhKwzSjZ7QF5gYHU3wgRZKLQDvBLMUXCzRJa1RrP6FMzEVc8crTWFCykt
m/49'/1'/3'/0/0     	2NA6HGyqaY4uyMdA36nVJ2r2gemSKcHNExZ	0.00000000	new
m/49'/1'/3'/0/1     	2N9VUiNf7ZFui912jmowTapaZtyXPRvJTKJ	0.00000000	new
m/49'/1'/3'/0/2     	2NBAzK5GNXMMD2aZdYQK2ae6uAdRPaxoayh	0.00000000	new
m/49'/1'/3'/0/3     	2Mzydq9JMux53WvvAm7ZaWTcEaPTbJ1Xans	0.00000000	new
m/49'/1'/3'/0/4     	2NBz1LVzwZQGxWdXiBuxeEuAZPVzwBbgQ5b	0.00000000	new
m/49'/1'/3'/0/5     	2NBv2wB5BjuVsp5hLtRAVb8M7gy1jGxS9TS	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/3'/1	
m/49'/1'/3'/1/0     	2NBgBjYLVqw4Bp8omdKu8MwLyVZ17YSw1is	0.00000000	new
m/49'/1'/3'/1/1     	2N1gxHqh4DvYN9tXLB9nYGcDEq6k86bZn7M	0.00000000	new
m/49'/1'/3'/1/2     	2MsZawkJVNf4b8ziqyi4AAkmEJpkEq46NDV	0.00000000	new
m/49'/1'/3'/1/3     	2N7f3t4L9eGgQstCYq6BEQMme5qgw67K5HJ	0.00000000	new
m/49'/1'/3'/1/4     	2MsfMKT6A5YpEPQfQPtHjxpPXY5UoCzz2zW	0.00000000	new
m/49'/1'/3'/1/5     	2N9kwWZW611T9wVQpqXHevGknr4bWSacJmw	0.00000000	new
Balance:	0.00000000
Balance for mixdepth 3:	0.00000000
mixdepth	4	tpubDDCXgSpdxuVbhUXTEvYeXJFz4av8MTT9R93vy8zhHxv5ZSWbuQhbJNesPSa6kXuaSQbUXFw157hWtwLsymU14886ezLwWX3jupciHxA7Cgc
external addresses	m/49'/1'/4'/0	tpubDFUUeK3KK4ojAQ4NNmW3WgyJvd9cwqgsf4DABV2K1djgJtzfb8hqhxm5C188r5rNS7MzRrG8s2ugLh5vZMLHeoccWL229nsPPN39n7gCv8S
m/49'/1'/4'/0/0     	2NCUTXEsZ8Cy5TnDCG7bh2JHQXhBN7skuLu	0.00000000	new
m/49'/1'/4'/0/1     	2N6gVBmjV9ckWndmNnK8ay6dUqe7JNQaxFh	0.00000000	new
m/49'/1'/4'/0/2     	2NFxKXKitAqzqQDedUgM6ig5x1sz2TMSkWn	0.00000000	new
m/49'/1'/4'/0/3     	2NCYN1D1JVzkgcCmYKcrYN46UoFn1oLt7tN	0.00000000	new
m/49'/1'/4'/0/4     	2MvDjmNwR8hKBM6UErMeN8J6uEcVJGi6imf	0.00000000	new
m/49'/1'/4'/0/5     	2N9t5nsLBYUZzCofrGXUPTFxMLSpHADRRWr	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/4'/1	
m/49'/1'/4'/1/0     	2N5TDmcHk3DnWovHWQdfGyPeCFMYowJAo4P	0.00000000	new
m/49'/1'/4'/1/1     	2Mtbd3nLxsYsfqUnbJcUpH1EVfd9jDqtCSg	0.00000000	new
m/49'/1'/4'/1/2     	2MwBcFr4kcz5SMWgfXbvtYnjyA8YcV8ZARJ	0.00000000	new
m/49'/1'/4'/1/3     	2NGFEL6MAWUo2Tcz4BthYJmdRFYZRS2W439	0.00000000	new
m/49'/1'/4'/1/4     	2Mta5t3mDiyC11Pre5JsRdo6myboW2eYzKJ	0.00000000	new
m/49'/1'/4'/1/5     	2N6bwRwxRbh73ZPhqm4HCg7bhVuhDFwjVae	0.00000000	new
Balance:	0.00000000
Balance for mixdepth 4:	0.00000000
Total balance:	0.00000000

@chris-belcher chris-belcher force-pushed the fidelity-bonds branch 2 times, most recently from 080e4eb to c83b907 Compare March 24, 2020 16:27
@AdamISZ
Copy link
Member

AdamISZ commented Mar 28, 2020

I will incrementally add further notable testing results in this comment to avoid clutter :

Some simple regtest tests:
generate : wallet created OK.

Created a timelock address OK.

Then went to fund that address from a wallet created via ygrunner (so just a hex-seed generated test wallet, though I don't think that's relevant at a cursory glance), got this stack trace:

2020-03-28 16:53:39,653 [DEBUG]  Fast sync in progress. Got this many used addresses: 4
Traceback (most recent call last):
  File "wallet-tool.py", line 6, in <module>
    jmprint(wallet_tool_main("wallets"), "success")
  File "/home/waxwing/testjminstall/joinmarket-clientserver/jmclient/jmclient/wallet_utils.py", line 1309, in wallet_tool_main
    if wallet_service.sync_wallet(fast = not options.recoversync):
  File "/home/waxwing/testjminstall/joinmarket-clientserver/jmclient/jmclient/wallet_service.py", line 381, in sync_wallet
    self.sync_wallet_fast()
  File "/home/waxwing/testjminstall/joinmarket-clientserver/jmclient/jmclient/wallet_service.py", line 408, in sync_wallet_fast
    self.sync_addresses_fast()
  File "/home/waxwing/testjminstall/joinmarket-clientserver/jmclient/jmclient/wallet_service.py", line 512, in sync_addresses_fast
    used_indices = self.get_used_indices(self.used_addresses)
  File "/home/waxwing/testjminstall/joinmarket-clientserver/jmclient/jmclient/wallet.py", line 1002, in get_used_indices
    self.BIP32_TIMELOCK_ID, self.BIP32_BURN_ID):
AttributeError: 'SegwitLegacyWallet' object has no attribute 'BIP32_TIMELOCK_ID'

OK I presumptively fixed this by making the references on linke 1002 in wallet.py to FidelityBondMixin.** instead of self.** and it seemed to work. I could examine the non-fidelity bond wallet fine.

Then sent funds to the timelocked address and wallet-tool-ed the fidelity bond wallet I created. All looks good including this output in mixdepth 0:

internal addresses	m/49'/1'/0'/2	tpubDEr8rpnofBYWi9jHYV3eyiMEPRngpkzvWTjG38xioetVVvPfdZyZR2ebhsxhiTwC6K8mdrHbUd8yT2z2kmChduMhMJrUJEDt8b5zDHJo1yC
m/49'/1'/0'/2/0:1890777600	bcrt1qylp7xhhrv0cv8nenjzw42kgv9hsj7jvmkqts6hmaxaznekt24mps9tq2hv	0.30000000	2029-12-01 [LOCKED]

I tried displayall on the same wallet and got the same output as yours above, except it shows the /1 as well as the /0 branch at the end, i.e. i have m/49'/1'/0'/2/1 as well as m/49'/1'/0'/2/0.

@AdamISZ
Copy link
Member

AdamISZ commented Mar 30, 2020

I'll leave the above tests until that error in wallet.py is fixed, but just had another thought about this:

Recovery: by being BIP49 compatible we gain the ability of users to recover from seedphrase in other wallets - albeit it can be significantly more of a hassle than most wallets, because of both the multiple accounts and (also) potentially the heavy usage with gaps.

If we go with more than two address types - that is to say, deviate from the bip32 scheme of 0/1 for external/internal, then you lose the automatically recoverable feature for the timelocked funds.

Hmm now I've typed this out I can see the logic though. There is no sense in which some vanilla wallet software will be able to import a custom script like that - unless we are moving into a world where such a thing is standardised. Does miniscript/wallet descriptors come in here somehow?

So anyway, I'm happy for it to be like this, as long as there isn't an argument that says "this could be long term incompatible with standard X which is coming" (or does such a standard for timelocks already exist and I missed it? I know of a BIP for an atomic swap script standard but don't think it's used; BIP199 iirc). Did you consider just having a separate account; not because other wallets can currently import it, but because that way it doesn't use a /2 or /3 branch that wouldn't be recognized by other wallets, if such imports became possible in future? (just thoughts; I really don't know).

@chris-belcher
Copy link
Contributor Author

Regarding recovery in other wallets, I intend to write one or two BIP documents documenting the format here, so maybe other wallets will support recovering freeze addresses or burner outputs. The only other way to create freeze addresses I'm aware of is this javascript site: https://coinb.in/#newTimeLocked (Although it doesn't create segwit freeze addresses like this PR)

When I write the BIPs there might be feedback and then the BIP32 path or serialization can be changed if needed. I briefly considered other accounts (mixdepth = 5) but thought that sometimes tumbler uses more mixdepths than the default in normal usage, so the number of mixdepths cant be limited. Another issue with using another account and using the branches 0/1 is that it might be possible for those same pubkeys to be accidentally reused as regular single-sig addresses.

@chris-belcher chris-belcher force-pushed the fidelity-bonds branch 2 times, most recently from 3c6a841 to a0e57a9 Compare April 1, 2020 00:01
@chris-belcher
Copy link
Contributor Author

chris-belcher commented Apr 8, 2020

Some notes on the commits I just pushed. Writing them now because they can be useful when later writing documentation and tests.

Commits where the first letter of the subject line is lowercase are intended to be squished later.

This bunch of commits adds code for supporting burner outputs.

Burned output can be created with sendpayment.py using BURN as an address. It destroys money from your own wallet.

$ python3 sendpayment.py --datadir=. -N 0 testfidelity3.jmdat 0 BURN
User data location: .
2020-04-07 20:45:25,658 [INFO]  Using this min relay fee as tx fee floor: 1000 sat/vkB (1.0 sat/vB)
Enter wallet decryption passphrase: 
2020-04-07 20:46:50,449 [INFO]  Estimated miner/tx fees for this coinjoin amount: 0.0%
2020-04-07 20:46:50,452 [INFO]  Using this min relay fee as tx fee floor: 1000 sat/vkB (1.0 sat/vB)
2020-04-07 20:46:50,452 [INFO]  Using a fee of : 0.00000200 BTC (200 sat).
2020-04-07 20:46:50,454 [INFO]  Got signed transaction:

2020-04-07 20:46:50,455 [INFO]  {'ins': [{'outpoint': {'hash': '61d69b4e7abe0ef8a5a9cbabb05463259c3b497a142130a56f81a9259f048cb0',
                       'index': 0},
          'script': '160014295beb4eba9b35896683d5b5ff455ee2c646054c',
          'sequence': 4294967294,
          'txinwitness': ['3045022100939de908e30015c6b22d2c0f25153e395268466ce44eeeb4ec03a8920440e87b0220155d1c43dedb3fc2654205541bb2821dd5211180e2d7f93d67301470652830d401',
                          '03ec0f8b267f99ff5259195ce63813d58f38ffbaada894ce06af0c0303c74bbf82']}],
 'locktime': 1361,
 'outs': [{'script': '6a147631c805d8ad9239677b8d7530353fda3fec07ca',
           'value': 11999800}],
 'version': 2}
2020-04-07 20:46:50,455 [INFO]  In serialized form (for copy-paste):
2020-04-07 20:46:50,455 [INFO]  02000000000101b08c049f25a9816fa53021147a493b9c256354b0abcba9a5f80ebe7a4e9bd6610000000017160014295beb4eba9b35896683d5b5ff455ee2c646054cfeffffff01381ab70000000000166a147631c805d8ad9239677b8d7530353fda3fec07ca02483045022100939de908e30015c6b22d2c0f25153e395268466ce44eeeb4ec03a8920440e87b0220155d1c43dedb3fc2654205541bb2821dd5211180e2d7f93d67301470652830d4012103ec0f8b267f99ff5259195ce63813d58f38ffbaada894ce06af0c0303c74bbf8251050000
2020-04-07 20:46:50,456 [INFO]  Sends: 0.11999800 BTC (11999800 sat) to destination: BURNER OUTPUT embedding pubkey at m/49'/1'/0'/3/0

WARNING: This transaction if broadcasted will PERMANENTLY DESTROY your bitcoins

Would you like to push to the network? (y/n):y
2020-04-07 20:47:52,047 [DEBUG]  rpc: sendrawtransaction ['02000000000101b08c049f25a9816fa53021147a493b9c256354b0abcba9a5f80ebe7a4e9bd6610000000017160014295beb4eba9b35896683d5b5ff455ee2c646054cfeffffff01381ab70000000000166a147631c805d8ad9239677b8d7530353fda3fec07ca02483045022100939de908e30015c6b22d2c0f25153e395268466ce44eeeb4ec03a8920440e87b0220155d1c43dedb3fc2654205541bb2821dd5211180e2d7f93d67301470652830d4012103ec0f8b267f99ff5259195ce63813d58f38ffbaada894ce06af0c0303c74bbf8251050000']
2020-04-07 20:47:52,049 [WARNING]  Connection had broken pipe, attempting reconnect.
2020-04-07 20:47:52,440 [INFO]  Transaction sent: 656bb4538f14f2cc874043915907b6c9c46a807ef9818bde771d07630d54b0f7
done

Embedded in the OP_RETURN output is the pubkeyhash of a pubkey from the wallet. In this case the pubkeyhash is 7631c805d8ad9239677b8d7530353fda3fec07ca.

OP_RETURN outputs don't appear in list of addresses, so they can't be sync'd with fast sync. So sync'ing for the first time requires --recoversync.

$ python3 wallet-tool.py --datadir=. --recoversync testfidelity2.jmdat
User data location: .
Enter wallet decryption passphrase: 
2020-04-07 23:09:54,644 [INFO]  Found a burner transaction txid=656bb4538f14f2cc874043915907b6c9c46a807ef9818bde771d07630d54b0f7 path = m/49'/1'/0'/3/0
2020-04-07 23:09:54,769 [WARNING]  Merkle branch not available, use wallet-tool `addtxoutproof`
2020-04-07 23:09:55,420 [INFO]  Found a burner transaction txid=656bb4538f14f2cc874043915907b6c9c46a807ef9818bde771d07630d54b0f7 path = m/49'/1'/0'/3/0
2020-04-07 23:09:55,422 [WARNING]  Merkle branch not available, use wallet-tool `addtxoutproof`
JM wallet
mixdepth	0	tpubDDCXgSpdxuVbXgzRYBggFeMRNeV9eH24jJuQNunyqwYtDFiB7ZS63LhXwHkf7o9ZcZW4qUz7uvD6yk4BkkF3bBPmJRPv7RBTEA5hHwEdV2f
external addresses	m/49'/1'/0'/0	tpubDEJGorVywRb6LoLQbaqWZh2gYwpdZqViCNZ2ejB5kpBuUp16LHpK6ESFaJLixidtbmmjcDwVZ4QjnAbKmypfuGaEk3ifgonPv4vsugqgp9G
m/49'/1'/0'/0/2     	2MviB2FfLKZjFb3W2dJ8kXcQBj3jqMJg7TL	0.00000000	new
m/49'/1'/0'/0/3     	2MtsAQhE2u9VGV3aZ7XM4PzwWGHXr4PAhqP	0.00000000	new
m/49'/1'/0'/0/4     	2N3iXNjS4vkTXzy5Jidnovc6FJeNQJx5Fnt	0.00000000	new
m/49'/1'/0'/0/5     	2MtT4XAjwQQ7PBbrTxv7qcQMMmz4Rs5XrE3	0.00000000	new
m/49'/1'/0'/0/6     	2NEuG23BQESuZTqSDtab9zYsd1Jb4KfMULB	0.00000000	new
m/49'/1'/0'/0/7     	2N6NGJRX6KYQWtYWK8iHFuJNpZRs8NbUAC9	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/0'/1	
Balance:	0.00000000
internal addresses	m/49'/1'/0'/2	tpubDEJGorVywRb6T34X7ZAEz9hQYn6CCEhrcFa8kA2mqNau2DvoggZP2QTtXRe8t9NSfMkx3ye8QDzqCE9gEqso6fw5ALk5xycWLFwTRLSqSUV
Balance:	0.00000000
internal addresses	m/49'/1'/0'/3	tpubDEJGorVywRb6V5em9Q7LFJ9eLEAEZmZxUdDmkknrKNUs7vKcCWPKwP8YPjuxFCCXk2F1wJnubNbmgbtWed5yiE3D1qxzLonVuXT6QEZPaof
m/49'/1'/0'/3/0     	BURN-7631c805d8ad9239677b8d7530353fda3fec07ca	0.11999800	656bb4538f14f2cc874043915907b6c9c46a807ef9818bde771d07630d54b0f7 [NO MERKLE PROOF]
Balance:	0.11999800
Balance for mixdepth 0:	0.11999800
mixdepth	1	tpubDDCXgSpdxuVbaWpPN6nkNTL7B1kKURDWfKYrpocw8EBK4bYuKzWcB1Yi1uTsXprXb6HDy6TpacWxv448aoqnmyMsmPWVwxuvdEaDSHwZgWu
external addresses	m/49'/1'/1'/0	tpubDEApBoUZABayhFrRnYKR4eaQVqJjXHyLMDLiUJ3LfYS9RB2LpCWqsEwKLGtLKqP7a8SQjPKoZ1PyRNFQBgTDh4uN7rzfS2RSkuxanbvF8Vf
m/49'/1'/1'/0/0     	2MvX2wkiAUg5AAsxLZBTxRRxYqAqCQDTUzN	0.00000000	new
m/49'/1'/1'/0/1     	2MtF5BUyQsMFczjx5gmd2U7HvF1LiEpXq29	0.00000000	new
m/49'/1'/1'/0/2     	2NECJHzjUmbxndKqZfaZJ2qSN1oZCDYCSf2	0.00000000	new
m/49'/1'/1'/0/3     	2N4mxgDnEerFUviDd5W8LHXfy1sn4F1iYRc	0.00000000	new
m/49'/1'/1'/0/4     	2MzRazUtT23iJX2VFQVVb3PewR6nHsVhqnj	0.00000000	new
m/49'/1'/1'/0/5     	2N6UvUSUicat6QtecHAYV4acN2JLq9uZTzQ	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/1'/1	
Balance:	0.00000000
Balance for mixdepth 1:	0.00000000
mixdepth	2	tpubDDCXgSpdxuVbbKVb3VuaEwouzKkWbWjGEi75TWBoj9dWnMYUrxHR5M4REANJnca3DGF7m3k7Kn6eP2vVfeCteqDfwxj3VnHc3ahG7KcnYwA
external addresses	m/49'/1'/2'/0	tpubDEWU8RnwYfmFj7j5j2EeDAzy2JxyxooXi1wtAxbXL8McYHTXGKZ3p5qFBZqt5N9YZrherQ4FFNpz9Y34zYhJCaVwBsTQBnnMvFhMnB8Z9Js
m/49'/1'/2'/0/0     	2MwCicX6N1PZdtNVE6wUCRcYksBqGpzNA4D	0.00000000	new
m/49'/1'/2'/0/1     	2N7rE4qC6avsTFth5XrGS7RBc6frfCFDDFs	0.00000000	new
m/49'/1'/2'/0/2     	2MutaH9aWeoxX8SPqbRU9cGLfHMAyPniYCa	0.00000000	new
m/49'/1'/2'/0/3     	2NB73i5AUf4aG19LV3wea5tebXb7W1hz27o	0.00000000	new
m/49'/1'/2'/0/4     	2N3iCF6qxFzYhCnJeQzakNKgrGwLDM3C3Ke	0.00000000	new
m/49'/1'/2'/0/5     	2N2UgyRLYTuW4DTWEdqt61d3oN1WsijZw6v	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/2'/1	
Balance:	0.00000000
Balance for mixdepth 2:	0.00000000
mixdepth	3	tpubDDCXgSpdxuVbdm7gKAPSkRgHS3zCDLESs1aD7xL9zGDeVmiBSUPpB19hqV17BhNYYR251C4mDvurk9uaoKD3PCbfQ49EdkyHrztaPQLYeZK
external addresses	m/49'/1'/3'/0	tpubDEPWmQPAcQ7jSyDBtokLJ7PH831BfibuMC1cHDT1AaA6fUyq9CKhKwzSjZ7QF5gYHU3wgRZKLQDvBLMUXCzRJa1RrP6FMzEVc8crTWFCykt
m/49'/1'/3'/0/0     	2NA6HGyqaY4uyMdA36nVJ2r2gemSKcHNExZ	0.00000000	new
m/49'/1'/3'/0/1     	2N9VUiNf7ZFui912jmowTapaZtyXPRvJTKJ	0.00000000	new
m/49'/1'/3'/0/2     	2NBAzK5GNXMMD2aZdYQK2ae6uAdRPaxoayh	0.00000000	new
m/49'/1'/3'/0/3     	2Mzydq9JMux53WvvAm7ZaWTcEaPTbJ1Xans	0.00000000	new
m/49'/1'/3'/0/4     	2NBz1LVzwZQGxWdXiBuxeEuAZPVzwBbgQ5b	0.00000000	new
m/49'/1'/3'/0/5     	2NBv2wB5BjuVsp5hLtRAVb8M7gy1jGxS9TS	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/3'/1	
Balance:	0.00000000
Balance for mixdepth 3:	0.00000000
mixdepth	4	tpubDDCXgSpdxuVbhUXTEvYeXJFz4av8MTT9R93vy8zhHxv5ZSWbuQhbJNesPSa6kXuaSQbUXFw157hWtwLsymU14886ezLwWX3jupciHxA7Cgc
external addresses	m/49'/1'/4'/0	tpubDFUUeK3KK4ojAQ4NNmW3WgyJvd9cwqgsf4DABV2K1djgJtzfb8hqhxm5C188r5rNS7MzRrG8s2ugLh5vZMLHeoccWL229nsPPN39n7gCv8S
m/49'/1'/4'/0/0     	2NCUTXEsZ8Cy5TnDCG7bh2JHQXhBN7skuLu	0.00000000	new
m/49'/1'/4'/0/1     	2N6gVBmjV9ckWndmNnK8ay6dUqe7JNQaxFh	0.00000000	new
m/49'/1'/4'/0/2     	2NFxKXKitAqzqQDedUgM6ig5x1sz2TMSkWn	0.00000000	new
m/49'/1'/4'/0/3     	2NCYN1D1JVzkgcCmYKcrYN46UoFn1oLt7tN	0.00000000	new
m/49'/1'/4'/0/4     	2MvDjmNwR8hKBM6UErMeN8J6uEcVJGi6imf	0.00000000	new
m/49'/1'/4'/0/5     	2N9t5nsLBYUZzCofrGXUPTFxMLSpHADRRWr	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/4'/1	
Balance:	0.00000000
Balance for mixdepth 4:	0.00000000
Total balance:	0.11999800

--recoversync only needs to be used once, after that the burner output is saved in the wallet.jmdat file and can be accesses by all future syncs. So the wallet is sync'd now in almost all cases.

The merkle branch of the transaction may be required to prove its existence to third parties. If the block containing the transaction has been pruned then there will be a warning that the merkle branch is unavailable. Note the [WARNING] Merkle branch not available, use wallet-tool 'addtxoutproof' and [NO MERKLE PROOF].

Any other unpruned Core node can trustlessly obtain the proof and give it to our user with the RPC call gettxoutproof. Then wallet-tool.py has a new method for adding it to the wallet.jmdat file.

First we obtain the proof.

23:20:09
gettxoutproof "[\"656bb4538f14f2cc874043915907b6c9c46a807ef9818bde771d07630d54b0f7\"]" 4cce28f4eb1ea1762ec4ceb90529b3ab28c0423ac630c6292319e2b2712daada
23:20:09
0000002056e4050f54084a1d6e6944b209cce76ebe2da4b37f3aa47ab6c612831d3220471015e80d3050cf0ee05b216036030fe3d4906221196943a30e828741ad4cfaeb05d98c5effff7f20010000000200000002a5910e5cf4e6cb6d55e1e2ca979987772a482e8a8f30b7a6cab8c5671f5c161df7b0540d63071d77de8b81f97e806ac4c9b6075991434087ccf2148f53b46b650105

Then add it to the wallet.

$ python3 wallet-tool.py --datadir=. -H "m/49'/1'/0'/3/0" testfidelity2.jmdat addtxoutproof 0000002056e4050f54084a1d6e6944b209cce76ebe2da4b37f3aa47ab6c612831d3220471015e80d3050cf0ee05b216036030fe3d4906221196943a30e828741ad4cfaeb05d98c5effff7f20010000000200000002a5910e5cf4e6cb6d55e1e2ca979987772a482e8a8f30b7a6cab8c5671f5c161df7b0540d63071d77de8b81f97e806ac4c9b6075991434087ccf2148f53b46b650105
User data location: .
Enter wallet decryption passphrase: 
Done

Now sync'ing the wallet doesnt have the no merkle proof warning


$ python3 wallet-tool.py --datadir=. testfidelity2.jmdat
User data location: .
Enter wallet decryption passphrase: 
JM wallet
mixdepth	0	tpubDDCXgSpdxuVbXgzRYBggFeMRNeV9eH24jJuQNunyqwYtDFiB7ZS63LhXwHkf7o9ZcZW4qUz7uvD6yk4BkkF3bBPmJRPv7RBTEA5hHwEdV2f
external addresses	m/49'/1'/0'/0	tpubDEJGorVywRb6LoLQbaqWZh2gYwpdZqViCNZ2ejB5kpBuUp16LHpK6ESFaJLixidtbmmjcDwVZ4QjnAbKmypfuGaEk3ifgonPv4vsugqgp9G
m/49'/1'/0'/0/2     	2MviB2FfLKZjFb3W2dJ8kXcQBj3jqMJg7TL	0.00000000	new
m/49'/1'/0'/0/3     	2MtsAQhE2u9VGV3aZ7XM4PzwWGHXr4PAhqP	0.00000000	new
m/49'/1'/0'/0/4     	2N3iXNjS4vkTXzy5Jidnovc6FJeNQJx5Fnt	0.00000000	new
m/49'/1'/0'/0/5     	2MtT4XAjwQQ7PBbrTxv7qcQMMmz4Rs5XrE3	0.00000000	new
m/49'/1'/0'/0/6     	2NEuG23BQESuZTqSDtab9zYsd1Jb4KfMULB	0.00000000	new
m/49'/1'/0'/0/7     	2N6NGJRX6KYQWtYWK8iHFuJNpZRs8NbUAC9	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/0'/1	
Balance:	0.00000000
internal addresses	m/49'/1'/0'/2	tpubDEJGorVywRb6T34X7ZAEz9hQYn6CCEhrcFa8kA2mqNau2DvoggZP2QTtXRe8t9NSfMkx3ye8QDzqCE9gEqso6fw5ALk5xycWLFwTRLSqSUV
Balance:	0.00000000
internal addresses	m/49'/1'/0'/3	tpubDEJGorVywRb6V5em9Q7LFJ9eLEAEZmZxUdDmkknrKNUs7vKcCWPKwP8YPjuxFCCXk2F1wJnubNbmgbtWed5yiE3D1qxzLonVuXT6QEZPaof
m/49'/1'/0'/3/0     	BURN-7631c805d8ad9239677b8d7530353fda3fec07ca	0.11999800	656bb4538f14f2cc874043915907b6c9c46a807ef9818bde771d07630d54b0f7
Balance:	0.11999800
Balance for mixdepth 0:	0.11999800
mixdepth	1	tpubDDCXgSpdxuVbaWpPN6nkNTL7B1kKURDWfKYrpocw8EBK4bYuKzWcB1Yi1uTsXprXb6HDy6TpacWxv448aoqnmyMsmPWVwxuvdEaDSHwZgWu
external addresses	m/49'/1'/1'/0	tpubDEApBoUZABayhFrRnYKR4eaQVqJjXHyLMDLiUJ3LfYS9RB2LpCWqsEwKLGtLKqP7a8SQjPKoZ1PyRNFQBgTDh4uN7rzfS2RSkuxanbvF8Vf
m/49'/1'/1'/0/0     	2MvX2wkiAUg5AAsxLZBTxRRxYqAqCQDTUzN	0.00000000	new
m/49'/1'/1'/0/1     	2MtF5BUyQsMFczjx5gmd2U7HvF1LiEpXq29	0.00000000	new
m/49'/1'/1'/0/2     	2NECJHzjUmbxndKqZfaZJ2qSN1oZCDYCSf2	0.00000000	new
m/49'/1'/1'/0/3     	2N4mxgDnEerFUviDd5W8LHXfy1sn4F1iYRc	0.00000000	new
m/49'/1'/1'/0/4     	2MzRazUtT23iJX2VFQVVb3PewR6nHsVhqnj	0.00000000	new
m/49'/1'/1'/0/5     	2N6UvUSUicat6QtecHAYV4acN2JLq9uZTzQ	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/1'/1	
Balance:	0.00000000
Balance for mixdepth 1:	0.00000000
mixdepth	2	tpubDDCXgSpdxuVbbKVb3VuaEwouzKkWbWjGEi75TWBoj9dWnMYUrxHR5M4REANJnca3DGF7m3k7Kn6eP2vVfeCteqDfwxj3VnHc3ahG7KcnYwA
external addresses	m/49'/1'/2'/0	tpubDEWU8RnwYfmFj7j5j2EeDAzy2JxyxooXi1wtAxbXL8McYHTXGKZ3p5qFBZqt5N9YZrherQ4FFNpz9Y34zYhJCaVwBsTQBnnMvFhMnB8Z9Js
m/49'/1'/2'/0/0     	2MwCicX6N1PZdtNVE6wUCRcYksBqGpzNA4D	0.00000000	new
m/49'/1'/2'/0/1     	2N7rE4qC6avsTFth5XrGS7RBc6frfCFDDFs	0.00000000	new
m/49'/1'/2'/0/2     	2MutaH9aWeoxX8SPqbRU9cGLfHMAyPniYCa	0.00000000	new
m/49'/1'/2'/0/3     	2NB73i5AUf4aG19LV3wea5tebXb7W1hz27o	0.00000000	new
m/49'/1'/2'/0/4     	2N3iCF6qxFzYhCnJeQzakNKgrGwLDM3C3Ke	0.00000000	new
m/49'/1'/2'/0/5     	2N2UgyRLYTuW4DTWEdqt61d3oN1WsijZw6v	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/2'/1	
Balance:	0.00000000
Balance for mixdepth 2:	0.00000000
mixdepth	3	tpubDDCXgSpdxuVbdm7gKAPSkRgHS3zCDLESs1aD7xL9zGDeVmiBSUPpB19hqV17BhNYYR251C4mDvurk9uaoKD3PCbfQ49EdkyHrztaPQLYeZK
external addresses	m/49'/1'/3'/0	tpubDEPWmQPAcQ7jSyDBtokLJ7PH831BfibuMC1cHDT1AaA6fUyq9CKhKwzSjZ7QF5gYHU3wgRZKLQDvBLMUXCzRJa1RrP6FMzEVc8crTWFCykt
m/49'/1'/3'/0/0     	2NA6HGyqaY4uyMdA36nVJ2r2gemSKcHNExZ	0.00000000	new
m/49'/1'/3'/0/1     	2N9VUiNf7ZFui912jmowTapaZtyXPRvJTKJ	0.00000000	new
m/49'/1'/3'/0/2     	2NBAzK5GNXMMD2aZdYQK2ae6uAdRPaxoayh	0.00000000	new
m/49'/1'/3'/0/3     	2Mzydq9JMux53WvvAm7ZaWTcEaPTbJ1Xans	0.00000000	new
m/49'/1'/3'/0/4     	2NBz1LVzwZQGxWdXiBuxeEuAZPVzwBbgQ5b	0.00000000	new
m/49'/1'/3'/0/5     	2NBv2wB5BjuVsp5hLtRAVb8M7gy1jGxS9TS	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/3'/1	
Balance:	0.00000000
Balance for mixdepth 3:	0.00000000
mixdepth	4	tpubDDCXgSpdxuVbhUXTEvYeXJFz4av8MTT9R93vy8zhHxv5ZSWbuQhbJNesPSa6kXuaSQbUXFw157hWtwLsymU14886ezLwWX3jupciHxA7Cgc
external addresses	m/49'/1'/4'/0	tpubDFUUeK3KK4ojAQ4NNmW3WgyJvd9cwqgsf4DABV2K1djgJtzfb8hqhxm5C188r5rNS7MzRrG8s2ugLh5vZMLHeoccWL229nsPPN39n7gCv8S
m/49'/1'/4'/0/0     	2NCUTXEsZ8Cy5TnDCG7bh2JHQXhBN7skuLu	0.00000000	new
m/49'/1'/4'/0/1     	2N6gVBmjV9ckWndmNnK8ay6dUqe7JNQaxFh	0.00000000	new
m/49'/1'/4'/0/2     	2NFxKXKitAqzqQDedUgM6ig5x1sz2TMSkWn	0.00000000	new
m/49'/1'/4'/0/3     	2NCYN1D1JVzkgcCmYKcrYN46UoFn1oLt7tN	0.00000000	new
m/49'/1'/4'/0/4     	2MvDjmNwR8hKBM6UErMeN8J6uEcVJGi6imf	0.00000000	new
m/49'/1'/4'/0/5     	2N9t5nsLBYUZzCofrGXUPTFxMLSpHADRRWr	0.00000000	new
Balance:	0.00000000
internal addresses	m/49'/1'/4'/1	
Balance:	0.00000000
Balance for mixdepth 4:	0.00000000
Total balance:	0.11999800

@chris-belcher
Copy link
Contributor Author

chris-belcher commented Apr 22, 2020

Just pushed a commit adding support for watch-only fidelity bond wallets.

A brief tour:

When fidelity bond wallets are displayed they now highlight a bip32 xpub key. This is done by adding the prefix string fbonds-mpk-.

$ python3 wallet-tool.py --datadir=. testfidelity.jmdat
User data location: .
Enter wallet decryption passphrase: 
JM wallet
mixdepth	0	fbonds-mpk-tpubDDCbCPdf5wJVGYWB4mZr3E3Lys4NBcEKysrrUrLfhG6sekmrvs6KZNe4i5p5z3FyfwRmKMqB9NWEcEUiTS4LwqfrKPQzhKj6aLihu2EejaU
external addresses	m/49'/1'/0'/0	tpubDEGdmPwmQRcZmGKhaudjch9Fgw4J5yP4bYw5B8LoSDkMdmhBxM4ndEQXHK4r1TPexGjLidxdpeEzsJcdXEe7khWToxCZuN6JiLzvUoHAki2
m/49'/1'/0'/0/0     	2N8jHuQaApgFtQ8UKxKbREAvNxKn4BGX4x2	0.25000000	used
m/49'/1'/0'/0/1     	2Mx5CwDoNcuCT38EDmgenQxv9skHbZfXFdo	0.00000000	new
m/49'/1'/0'/0/2     	2N1tNTTwNyucGGmfDWNVk3AUi3i5S8jVKqn	0.00000000	new
m/49'/1'/0'/0/3     	2N8eBEU5wpWb6kS1gvbRgewtxsmXsMkShV6	0.00000000	new
m/49'/1'/0'/0/4     	2MuHgeSgMsvkcn6aGNW2uk2UXP3xVVnkfh2	0.00000000	new
m/49'/1'/0'/0/5     	2NA8d8um5KmBNNR8dadhbEDYGiTJPFCdjMB	0.00000000	new
m/49'/1'/0'/0/6     	2NG76BAHPccfyy6sH68EHrB9QJBycx3FKb6	0.00000000	new
Balance:	0.25000000
internal addresses	m/49'/1'/0'/1	
Balance:	0.00000000
internal addresses	m/49'/1'/0'/2	tpubDEGdmPwmQRcZrzjRmUFqXXyLdRedwxCWQviAFqDe6sXJeZzRNTwmwqMfxN6Ka3v7hEebstrU5kqUNoHsFKaA3RoB2vopL6kLHVo1EQq6USw
m/49'/1'/0'/2/0:1583020800	bcrt1qv8m7e7glte648dw8lyskf2ahg9pur9xz26m3p7y5n8mr3rrmvv7s9ze43k	0.20000000	2020-03-01 [UNLOCKED]
m/49'/1'/0'/2/1:1580515200	bcrt1qv2p8vuc2dmvkevau4chtgsna9yljjygy4fzyphz3rpw47jv64lxq39mqfj	0.10000000	2020-02-01 [UNLOCKED]
m/49'/1'/0'/2/2:1577836800	bcrt1qawcwt6r3sc4heyz8klgcw04szy4rfsgswm93cznj5n5ksrpumdks888q5k	0.50000000	2020-01-01 [UNLOCKED]
m/49'/1'/0'/2/3:1585699200	bcrt1qrc2qu3m2l2spayu5kr0k0rnn9xgjz46zsxmruh87a3h3f5zmnkaqlfx7v5	0.15000000	2020-04-01 [UNLOCKED]
Balance:	0.95000000

...

This master public key can be used to create a watch-only wallet using a new method of wallet-tool:

$ python3 wallet-tool.py --datadir=. createwatchonly fbonds-mpk-tpubDDCbCPdf5wJVGYWB4mZr3E3Lys4NBcEKysrrUrLfhG6sekmrvs6KZNe4i5p5z3FyfwRmKMqB9NWEcEUiTS4LwqfrKPQzhKj6aLihu2EejaU
User data location: .
Input wallet file name (default: watchonly.jmdat): watchfidelity.jmdat
Enter wallet file encryption passphrase: 
Reenter wallet file encryption passphrase: 
Done

Once the .jmdat file is created it can be displayed like a normal wallet. Of course only the zeroth mixdepth is displayed and stored because that's where the fidelity bonds are.

$ python3 wallet-tool.py --datadir=. watchfidelity.jmdat
User data location: .
Enter wallet decryption passphrase: 
JM wallet
mixdepth	0	fbonds-mpk-tpubDDCbCPdf5wJVGYWB4mZr3E3Lys4NBcEKysrrUrLfhG6sekmrvs6KZNe4i5p5z3FyfwRmKMqB9NWEcEUiTS4LwqfrKPQzhKj6aLihu2EejaU
external addresses	m/49'/1'/0'/0	tpubDEGdmPwmQRcZmGKhaudjch9Fgw4J5yP4bYw5B8LoSDkMdmhBxM4ndEQXHK4r1TPexGjLidxdpeEzsJcdXEe7khWToxCZuN6JiLzvUoHAki2
m/49'/1'/0'/0/0     	2N8jHuQaApgFtQ8UKxKbREAvNxKn4BGX4x2	0.25000000	used
m/49'/1'/0'/0/1     	2Mx5CwDoNcuCT38EDmgenQxv9skHbZfXFdo	0.00000000	new
m/49'/1'/0'/0/2     	2N1tNTTwNyucGGmfDWNVk3AUi3i5S8jVKqn	0.00000000	new
m/49'/1'/0'/0/3     	2N8eBEU5wpWb6kS1gvbRgewtxsmXsMkShV6	0.00000000	new
m/49'/1'/0'/0/4     	2MuHgeSgMsvkcn6aGNW2uk2UXP3xVVnkfh2	0.00000000	new
m/49'/1'/0'/0/5     	2NA8d8um5KmBNNR8dadhbEDYGiTJPFCdjMB	0.00000000	new
m/49'/1'/0'/0/6     	2NG76BAHPccfyy6sH68EHrB9QJBycx3FKb6	0.00000000	new
Balance:	0.25000000
internal addresses	m/49'/1'/0'/1	
Balance:	0.00000000
internal addresses	m/49'/1'/0'/2	tpubDEGdmPwmQRcZrzjRmUFqXXyLdRedwxCWQviAFqDe6sXJeZzRNTwmwqMfxN6Ka3v7hEebstrU5kqUNoHsFKaA3RoB2vopL6kLHVo1EQq6USw
m/49'/1'/0'/2/0:1583020800	bcrt1qv8m7e7glte648dw8lyskf2ahg9pur9xz26m3p7y5n8mr3rrmvv7s9ze43k	0.20000000	2020-03-01 [UNLOCKED]
m/49'/1'/0'/2/1:1580515200	bcrt1qv2p8vuc2dmvkevau4chtgsna9yljjygy4fzyphz3rpw47jv64lxq39mqfj	0.10000000	2020-02-01 [UNLOCKED]
m/49'/1'/0'/2/2:1577836800	bcrt1qawcwt6r3sc4heyz8klgcw04szy4rfsgswm93cznj5n5ksrpumdks888q5k	0.50000000	2020-01-01 [UNLOCKED]
m/49'/1'/0'/2/3:1585699200	bcrt1qrc2qu3m2l2spayu5kr0k0rnn9xgjz46zsxmruh87a3h3f5zmnkaqlfx7v5	0.15000000	2020-04-01 [UNLOCKED]
Balance:	0.95000000
internal addresses	m/49'/1'/0'/3	tpubDEGdmPwmQRcZuX3uNrCouu5bRgp2GJcoQTvhkFAJMTA3yxhKmQyeGwecbnkms4DYmBhCJn2fGTuejTe3g8oyJW3qKcfB4b3Swj2hDk1h4Y2
Balance:	0.00000000
Balance for mixdepth 0:	1.20000000
Total balance:	1.20000000

@chris-belcher chris-belcher force-pushed the fidelity-bonds branch 2 times, most recently from e336b4a to d1df086 Compare May 2, 2020 00:05
@chris-belcher
Copy link
Contributor Author

chris-belcher commented May 2, 2020

Pushed commit which adds tests.

With this the PR is finished. Removing the WIP tag.

@chris-belcher chris-belcher changed the title [WIP] Fidelity bond wallets Fidelity bond wallets May 2, 2020
@AdamISZ
Copy link
Member

AdamISZ commented May 9, 2020

I'm continuing to read through all the (non-test at least) code, but one question cropped up pretty much immediately and you could probably save me some thinking time by helping me with the reasoning:

Is it not feasible to, either in the wallet class or (possibly, I think not) in the engine class, to make WatchOnly a mixin?

One motivation for that is: I was considering using the new PSBT functionality in #536 to support offline hardware-wallet signing of generic coinjoins or other partially signed with the JM wallet, which should be entirely possible since using BIP49/84, but it makes little to no sense unless we have a watch-only mode for the existing SegwitLegacyWallet/SegwitWallet classes. So mixin makes sense there.

@chris-belcher
Copy link
Contributor Author

chris-belcher commented May 9, 2020

Right now the Wallet class and cryptoengine class never deals with public keys, only private keys, scripts and addresses. So in this PR I implemented watch-only wallet with a bit of a hack where the watch only wallet private key is actually a public key. So for creating watch-only wallets a mixin wouldn't be enough, I think it would require a slight rewrite where each wallet stores a bip32 pubkey as well as a bip32 privkey. Note that the fidelity bond watchonly wallet only has keys for the zeroth mixdepth, it cant access the other mixdepths because they use hardened key derivation.

A further problem with watch only wallets for SegwitLegacyWallet and SegwitWallet is that the key ident (which is used as the wallet_name in Core labels, as in "joinmarket-wallet-xxxxx") actually depends on a private key, so a watch only wallet couldn't generate it, and therefore wouldn't know which Core wallet label to access. In this PR I worked around that problem by making key idents in fidelity bonds depend on a public key. We could modify this for the existing wallet types but then on the next release everybody would have to re-import their joinmarket wallets into Core and perhaps rescan. (This is a lesson in unfortunate design decisions, as in hindsight it seems pretty clear that the whole wallet label thing isn't even that useful for us) (Maybe there could be a workaround where the wallet uses the RPC listlabels and uses all of them)

@kristapsk
Copy link
Member

Checked Qt did not allow created fidelity wallets (note after message box it goes back to 'decrypt wallet' dialog, but this is a trivial point).

This can be fixed with a very simple patch.

diff --git a/scripts/joinmarket-qt.py b/scripts/joinmarket-qt.py
index 2b80352..383f897 100644
--- a/scripts/joinmarket-qt.py
+++ b/scripts/joinmarket-qt.py
@@ -1660,9 +1660,7 @@ class JMMainWindow(QMainWindow):
             # only used for GUI display on regtest:
             self.testwalletname = wallet.seed = str(firstarg)
         if isinstance(wallet, FidelityBondMixin):
-            JMQtMessageBox(self, "Fidelity bond wallets not supported by Qt",
-                mbtype="warn", title="Error")
-            return False
+            raise Exception("Fidelity bond wallets not supported by Qt.")
         if 'listunspent_args' not in jm_single().config.options('POLICY'):
             jm_single().config.set('POLICY', 'listunspent_args', '[0]')
         assert wallet, "No wallet loaded"

docs/fidelity-bonds.md Outdated Show resolved Hide resolved
jmclient/jmclient/wallet_utils.py Show resolved Hide resolved
@chris-belcher
Copy link
Contributor Author

Fixed those review comments by @kristapsk

@kristapsk
Copy link
Member

I've done some basic testing, both with previously created wallets and fidelity bonds wallet, haven't find any new issues so far. Didn't test burning, only timelocking.

Previously an example of a BIP32 path
would be: m/wallet-type'/mixdepth'/internal/index

The 'internal' name referred to internal and external addresses (also
called change and receive). The renaming to 'address_type' is in
preparation to add more branches for timelocked addresses and burner
outputs.

The variable formally known as 'internal' is now no longer a boolean
but always an integer. This almost-always seemlessly fits because the
values False and Ture correspond to 0 and 1. The function
_get_internal_type therefore has no purpose anymore. Delete it.
The new functions implement creating fund freezing redeem scripts
and transactions which spend from such scripts.

Also there is a new test function.
Fidelity bond wallets are intended to be used when at a later date
using fidelity bonds to greatly increase joinmarket's resistance to
sybil attacks. This commit adds support for timelocked addresses.
It allows users to optionally create wallet which support such
addresses. The synchronization code is modified to also scan for
timelocked addresses. The keypairs of the timelocked addresses go in
the newly created 2nd address type, where before the zeroth index were
receive addresses and first index was change.

The locktime dates are fixed at the first of each month for the next 30
years. This means users dont need to remember any dates, and so just
their seed phrase and wallet type will still be enough to recover all
funds. Each keypair used for timelocking requires an additional 360
addresses to be scanned for, which isn't a problem for Bitcoin Core.
Fidelity bonds are only stored in the zeroth mixdepth, as they are not
used in repeated coinjoins so theres no point having them in multiple
mixdepths.

Timelocked addresses don't use the get_new_script() family of functions
because they all assume that one index equals one address, and that
therefore it's possible to ask for a "next" address. For timelocked
addresses knowing the index is not enough to know the address, the
timestamp must be known too. Also once one address made of
(index, timestamp) is used you mustn't use that index and pubkey again,
even though all the other timelocks for that index/pubkey are unused.
This is for privacy reasons, as its equivalent to address reuse.
Users burn coins by passing "BURN" as an address to sendpayment
Watch only wallets can now be created via wallet-tool. The wallets
store a bip32 xpub key from which all the public keys are generated.

Watch only wallets only store and display the zeroth mixdepth, which
is the only one needed for fidelity bonds.

The bip32 xpub key needed to create a watch only wallet is now
specially highlighted in the wallet-tool display, this is to help users
actually find it amongst all the other xpubs.

The field key_ident in the wallet class was previously generated using
private keys, which are not available in watch only wallets. So now
for fidelity bond wallets key_ident is generated using a public key.
Existing non-fidelity-bond wallets are unaffected
The cryptoengine class BTC_Timelocked_P2WSH now implements
sign_transaction() which can be used to spend timelocked UTXOs.

FidelityBondMixin.is_timelocked_path() is now used outside the class
so its leading underscore has been removed.
Watchonly wallets use pubkeys instead of privkeys, but in a bit of
hack the functions previously called "_get_priv_from_path" would
actually return public keys for watchonly wallets. This could have
pretty terrible consequences one day, so functions like that have
been renamed to use the word "key" instead, which could be either
private or public.
Previously timelocked UTXOs would be returned by calls like
select_utxo() and get_utxos_by_mixdepth(). This caused annoyances
if trying to burn a single UTXO. It could also cause recently-
unlocked coins to accidently get spent, perhaps co-spent with other
coins.

This commit fixes that by freezing UTXOs with the coin control
feature whenever the wallet is sync'd. When the timelock of a coin
passes the user must explicitly use coin control to spend it.
Leave disabled until the rest of the fidelity bond feature is created
@chris-belcher chris-belcher merged commit c1f34f0 into master Jun 2, 2020
@RiccardoMasutti
Copy link

Good job guys!

@chris-belcher chris-belcher deleted the fidelity-bonds branch June 3, 2020 16:15
AdamISZ added a commit that referenced this pull request Jun 6, 2020
Note in particular that:
bitcoin.mktx in this PR now does support script
entries in outputs to account for nonstandard
destinations (as is needed for burn).
bitcoin.sign now supports p2wsh (as is needed
for timelocks).
AdamISZ added a commit that referenced this pull request Jul 4, 2020
Note in particular that:
bitcoin.mktx in this PR now does support script
entries in outputs to account for nonstandard
destinations (as is needed for burn).
bitcoin.sign now supports p2wsh (as is needed
for timelocks).
AdamISZ added a commit that referenced this pull request Jul 6, 2020
Note in particular that:
bitcoin.mktx in this PR now does support script
entries in outputs to account for nonstandard
destinations (as is needed for burn).
bitcoin.sign now supports p2wsh (as is needed
for timelocks).
AdamISZ added a commit that referenced this pull request Jul 10, 2020
41540ab Modify Payjoin code for BIP78 changes. (Adam Gibson)
3ed4e88 Search for correct library extension on mac os (Jules Comte)
6e6bf0a Use VERIFY_STRICTENC flag for Script verification (Adam Gibson)
55295e8 first waypoint on bip78 (Adam Gibson)
d34c53b Various fixups: (Adam Gibson)
53ef79b Updates to account for code changes in #544 (Adam Gibson)
4cf77ed Various bugfixes: (Adam Gibson)
ca0de5c Add bip78 payjoin module and client-server test: See: https://github.com/bitcoin/bips/blob/master/bip-0078.mediawiki (Adam Gibson)
ad459d2 Add human readable representations of txs and PSBTs (Adam Gibson)
03a1359 Adds libsecp256k1 installation and addresses reviews (Adam Gibson)
037a2c1 Adds full payjoin workflow test (Adam Gibson)
de3ad53 Support output of PSBT instead of broadcast in direct_send (Adam Gibson)
f060781 Add SNICKER support to wallets. (Adam Gibson)
22ed0e0 Adds psbt creation and signing support in JM wallet. (Adam Gibson)
070c5bf python-bitcointx backend for jmbitcoin. (Adam Gibson)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants