Skip to content

Commit d23859c

Browse files
committed
Work toward adding photo size, paper formats, more paper wallet sizes
1 parent 2dd2dc0 commit d23859c

File tree

8 files changed

+177
-63
lines changed

8 files changed

+177
-63
lines changed

macOS.org

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ of the cards and regain access to all of the cryptocurrency accounts related to
8383
** Trezor
8484

8585
The [[https://shop.trezor.io/product/trezor-model-t?offer_id=15&aff_id=10388][Trezor Model T hardware wallet]] has built-in SLIP-39 generation and recovery capability.
86+
Enter the words on the SLIP-39 cards directly into the screen of the Trezor to recover your
87+
Cryptocurrency accounts.
8688

8789
#+BEGIN_EXPORT html
8890
<a href="https://shop.trezor.io/product/trezor-model-t?offer_id=15&aff_id=10388&file_id=534" target="_blank"><img src="https://media.go2speed.org/brand/files/trezor/15/20210707060206-T1TT_banner_728x90_3.png" width="728" height="90" border="0" /></a><img src="http://trezor.go2cloud.org/aff_i?offer_id=15&file_id=534&aff_id=10388" width="0" height="0" style="position:absolute;visibility:hidden;" border="0" />
@@ -110,6 +112,29 @@ of the cards and regain access to all of the cryptocurrency accounts related to
110112

111113
The Crypto.com exchange has many more coins available, as well as a crypto-funded credit card
112114
that presently works in Canada.
115+
116+
** Protecting your SLIP-39 Cards
117+
118+
Protect your printed SLIP-39 cards from water damage by laminating them in plastic or storing
119+
them in [[https://amzn.to/346xBU8][zip-loc bags]] before [[https://amzn.to/35m4][mailing them]].
120+
#+BEGIN_EXPORT html
121+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07X9GWPH1&linkId=69a3c4648067d4268b83e20be281ebb4"></iframe>
122+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07WXMYX87&linkId=06e0f5d889c93f5427c379ddc5fa6857"></iframe>
123+
#+END_EXPORT
124+
125+
Print the SLIP-39 cards and cut them out, and then lay them out with 1/2" margins (so you can cut
126+
them out after lamination and retain 1/4" borders), either with [[https://amzn.to/3K6wp2p][self-adhesive full-page
127+
laminating sheets - no laminating machine required]] (or [[https://amzn.to/3vyyKPw][index-card size]]),
128+
#+BEGIN_EXPORT html
129+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B00007E7D2&linkId=608ce5dd44a7a227327c9000d6442c92"></iframe>
130+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B00ENFRAX8&linkId=4ef3861c37b523826fcf6d3a87349890"></iframe>
131+
#+END_EXPORT
132+
or with a [[https://amzn.to/3IyMkGt][heat-laminating machine]] in [[https://amzn.to/3C1N3NI][full-page pouches]] (or in [[https://amzn.to/35z7RA5][index-card size pouches]]).
133+
#+BEGIN_EXPORT html
134+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B018UOYJZ4&linkId=12211cd757266604642e6fb78d04377d"></iframe>
135+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B00BWU3HNY&linkId=dcc0671406aa42d30b3e09a1cc08154f"></iframe>
136+
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-na.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=pjkundert-20&language=en_CA&o=15&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B001B0ES1K&linkId=6c8f34fe77e3b87e6f8c53e3485bf594"></iframe>
137+
#+END_EXPORT
113138

114139
* Privacy Policy
115140
:PROPERTIES:

macOS.pdf

1.78 KB
Binary file not shown.

macOS.txt

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Table of Contents
3838
.. 1. Trezor
3939
.. 2. Netcoins.app
4040
.. 3. Crypto.com
41+
.. 4. Protecting your SLIP-39 Cards
4142
3. Privacy Policy
4243

4344

@@ -99,7 +100,9 @@ Table of Contents
99100
──────────
100101

101102
The [Trezor Model T hardware wallet] has built-in SLIP-39 generation
102-
and recovery capability.
103+
and recovery capability. Enter the words on the SLIP-39 cards
104+
directly into the screen of the Trezor to recover your Cryptocurrency
105+
accounts.
103106

104107

105108
[Trezor Model T hardware wallet]
@@ -135,6 +138,36 @@ Table of Contents
135138
[Crypto.com] <https://crypto.com/app/2x4hk92dnf>
136139

137140

141+
2.4 Protecting your SLIP-39 Cards
142+
─────────────────────────────────
143+
144+
Protect your printed SLIP-39 cards from water damage by laminating
145+
them in plastic or storing them in [zip-loc bags] before [mailing
146+
them].
147+
Print the SLIP-39 cards and cut them out, and then lay them out with
148+
1/2" margins (so you can cut them out after lamination and retain 1/4"
149+
borders), either with [self-adhesive full-page laminating sheets - no
150+
laminating machine required] (or [index-card size]),
151+
or with a [heat-laminating machine] in [full-page pouches] (or in
152+
[index-card size pouches]).
153+
154+
155+
[zip-loc bags] <https://amzn.to/346xBU8>
156+
157+
[mailing them] <https://amzn.to/35m4>
158+
159+
[self-adhesive full-page laminating sheets - no laminating machine
160+
required] <https://amzn.to/3K6wp2p>
161+
162+
[index-card size] <https://amzn.to/3vyyKPw>
163+
164+
[heat-laminating machine] <https://amzn.to/3IyMkGt>
165+
166+
[full-page pouches] <https://amzn.to/3C1N3NI>
167+
168+
[index-card size pouches] <https://amzn.to/35z7RA5>
169+
170+
138171
3 Privacy Policy
139172
════════════════
140173

slip39/defaults.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,43 @@
4444
BUSINESS_CARD = (2, 3+1/2), 1/32 # noqa: E241
4545
CREDIT_CARD = (2+1/4, 3+3/8), 1/32
4646
INDEX_CARD = (3, 5), 1/16 # noqa: E241
47-
HALF_LETTER = (4+1/2, 8), 1/8 # noqa: E241 (actually, 2/letter, 3/legal)
48-
THIRD_LETTER = (10.5/4,8), 1/8 # noqa: E241 (actually, 3/letter, 4/legal)
47+
PHOTO_CARD = (3+1/2, 5+1/2), 1/16 # prints on 4x6 photo paper w/ 1/4" default outer border
48+
HALF_LETTER = (13.5/3,8), 1/8 # noqa: E241 (actually, 2/letter, 3/legal)
49+
THIRD_LETTER = (13.5/4,8), 1/8 # noqa: E241 (actually, 3/letter, 4/legal)
50+
QUARTER_LETTER = (10.5/4,8), 1/8 # noqa: E241 (actually, 4/letter, 5/legal)
4951

5052
# SLIP-39 Mnemonic Card Sizes
5153
CARD = 'index'
5254
CARD_SIZES = dict(
5355
index = INDEX_CARD,
56+
photo = PHOTO_CARD,
5457
credit = CREDIT_CARD,
5558
business = BUSINESS_CARD,
5659
half = HALF_LETTER,
5760
third = THIRD_LETTER,
61+
quarter = THIRD_LETTER,
5862
)
5963

60-
# Paper Wallet Bill Sizes
61-
WALLET = 'third'
64+
# Paper Wallet Bill Sizes, by default on PAPER format paper
65+
WALLET = 'quarter'
6266
WALLET_SIZES = dict(
67+
half = HALF_LETTER,
6368
third = THIRD_LETTER,
69+
quarter = QUARTER_LETTER,
6470
)
6571

6672
PAGE_MARGIN = 1/4 # Typical printers cannot print within 1/4" of edge
6773

74+
MM_IN = 25.4
75+
PT_IN = 72
76+
6877
PAPER = 'Letter'
78+
PAPER_FORMATS = dict(
79+
Letter = 'Letter',
80+
Legal = 'Legal',
81+
A4 = 'A4',
82+
Photo = (int( 4 * MM_IN ), int( 6 * MM_IN )),
83+
)
6984

7085
BITS = (128, 256, 512)
7186
BITS_DEFAULT = 128

slip39/gui/main.py

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
from ..util import log_level, log_cfg, ordinal, chunker
1616
from ..layout import write_pdfs
1717
from ..defaults import (
18-
GROUPS, GROUP_THRESHOLD_RATIO, CARD, CARD_SIZES, MNEM_PREFIX, CRYPTO_PATHS, BITS
18+
GROUPS, GROUP_THRESHOLD_RATIO, MNEM_PREFIX, CRYPTO_PATHS, BITS,
19+
CARD_SIZES, CARD, PAPER_FORMATS, PAPER, WALLET_SIZES, WALLET,
1920
)
2021

2122
log = logging.getLogger( __package__ )
@@ -42,7 +43,7 @@
4243
prefix = (20, 1)
4344
inputs = (40, 1)
4445
inlong = (128,1) # 512-bit seeds require 128 hex nibbles
45-
number = (10, 1)
46+
shorty = (10, 1)
4647

4748

4849
def groups_layout(
@@ -72,13 +73,13 @@ def groups_layout(
7273
),
7374
sg.Frame(
7475
'# Needed', [[ sg.Column( [
75-
[ sg.Input( f'{g_need}', key=f'-G-NEED-{g}', size=number, **I_kwds ) ]
76+
[ sg.Input( f'{g_need}', key=f'-G-NEED-{g}', size=shorty, **I_kwds ) ]
7677
for g,(g_name,(g_need,g_size)) in enumerate( groups.items() )
7778
], key='-GROUP-NEEDS-' ) ]], **F_kwds
7879
),
7980
sg.Frame(
8081
'of # in Group', [[ sg.Column( [
81-
[ sg.Input( f'{g_size}', key=f'-G-SIZE-{g}', size=number, **I_kwds ) ]
82+
[ sg.Input( f'{g_size}', key=f'-G-SIZE-{g}', size=shorty, **I_kwds ) ]
8283
for g,(g_name,(g_need,g_size)) in enumerate( groups.items() )
8384
], key='-GROUP-SIZES-' ) ]], **F_kwds
8485
),
@@ -103,7 +104,10 @@ def groups_layout(
103104
[
104105
sg.Text( "Seed Name(s): ", size=prefix, **T_kwds ),
105106
sg.Input( f"{', '.join( names )}", key='-NAMES-', size=inputs, **I_kwds ),
106-
sg.Text( "(default is 'SLIP39...'; enter Seed names, comma-separated)", **T_kwds ),
107+
sg.Text( "(comma-separated). Paper size: ", **T_kwds ),
108+
] + [
109+
sg.Radio( f"{pf}", "PF", key=f"-PF-{pf}", default=(pf == PAPER), **B_kwds )
110+
for pf in PAPER_FORMATS
107111
],
108112
], key='-OUTPUT-F-', **F_kwds ),
109113
],
@@ -177,7 +181,7 @@ def groups_layout(
177181
sg.Column( [
178182
[
179183
sg.Text( "Requires recovery of: ", size=prefix, **T_kwds ),
180-
sg.Input( f"{group_threshold}", key='-THRESHOLD-', size=number, **I_kwds ),
184+
sg.Input( f"{group_threshold}", key='-THRESHOLD-', size=shorty, **I_kwds ),
181185
sg.Text( f"of {len(groups)}", key='-RECOVERY-', **T_kwds ),
182186
sg.Button( '+', **B_kwds ),
183187
sg.Text( "SLIP-39 Recovery Groups", **T_kwds ),
@@ -212,20 +216,31 @@ def groups_layout(
212216
int( round( math.sqrt( len( Account.CRYPTOCURRENCIES )))))
213217
] )
214218
] + [
215-
sg.Frame( 'Paper Wallet Passphrase/Hint (leave empty, if no Paper Wallets desired)', [
219+
sg.Frame( 'Paper Wallet Password/Hint (empty, if no Paper Wallets desired)', [
216220
[
217221
sg.Input( f"{wallet_pwd or ''}",
218222
key='-WALLET-PASS-', size=inputs, **I_kwds ), # noqa: E127
219223
sg.Text( "Hint: ", **T_kwds ),
220224
sg.Input( "",
221-
key='-WALLET-HINT-', size=inputs, **I_kwds ), # noqa: E127
225+
key='-WALLET-HINT-', size=shorty, **I_kwds ), # noqa: E127
222226
],
223227
], **F_kwds ),
224228
sg.Frame( '# to Derive:', [
225229
[
226-
sg.Input( "1", key='-WALLET-DERIVE-', size=number, **I_kwds ), # noqa: E127
230+
sg.Input( "1", key='-WALLET-DERIVE-', size=shorty, **I_kwds ), # noqa: E127
227231
],
228232
], **F_kwds ),
233+
] + [
234+
sg.Column( [
235+
[
236+
sg.Text( 'Paper wallets / page:', **T_kwds )
237+
],
238+
[
239+
sg.Radio( f"{ws}", "WS", default=ws == WALLET,
240+
key=f"-WALLET-SIZE-{ws}-", **B_kwds ) # noqa: E127
241+
for ws in WALLET_SIZES
242+
],
243+
] )
229244
],
230245
], key='-WALLET-F-', visible=wallet_pwd is not False, **F_kwds ), # noqa: E126
231246
],
@@ -638,7 +653,7 @@ def app(
638653
window['-SD-SEED-F-'].expand( expand_x=True )
639654
window['-SE-SEED-F-'].expand( expand_x=True )
640655
window['-OUTPUT-F-'].expand( expand_x=True )
641-
if wallet_pwd is not None:
656+
if wallet_pwd is not False:
642657
window['-WALLET-F-'].expand( expand_x=True )
643658
window['-SUMMARY-F-'].expand( expand_x=True )
644659
window['-STATUS-F-'].expand( expand_x=True )
@@ -668,8 +683,8 @@ def app(
668683
values[f"-G-SIZE-{g}"] = needs[1]
669684
window.extend_layout( window['-GROUP-NUMBER-'], [[ sg.Text( f"{g+1}", **T_kwds ) ]] ) # noqa: 241
670685
window.extend_layout( window['-GROUP-NAMES-'], [[ sg.Input( f"{name}", key=f"-G-NAME-{g}", **I_kwds ) ]] ) # noqa: 241
671-
window.extend_layout( window['-GROUP-NEEDS-'], [[ sg.Input( f"{needs[0]}", key=f"-G-NEED-{g}", size=number, **I_kwds ) ]] ) # noqa: 241
672-
window.extend_layout( window['-GROUP-SIZES-'], [[ sg.Input( f"{needs[1]}", key=f"-G-SIZE-{g}", size=number, **I_kwds ) ]] ) # noqa: 241
686+
window.extend_layout( window['-GROUP-NEEDS-'], [[ sg.Input( f"{needs[0]}", key=f"-G-NEED-{g}", size=shorty, **I_kwds ) ]] ) # noqa: 241
687+
window.extend_layout( window['-GROUP-SIZES-'], [[ sg.Input( f"{needs[1]}", key=f"-G-SIZE-{g}", size=shorty, **I_kwds ) ]] ) # noqa: 241
673688

674689
# Attempt to compute the 1st Master Secret Seed, collecting any failure status detected.
675690
# Compute the Master Secret Seed, from the supplied Seed Data and any extra Seed Entropy.
@@ -896,6 +911,7 @@ def app(
896911
edit = edit,
897912
wallet_pwd = values['-WALLET-PASS-'], # Produces Paper Wallet(s) iff set
898913
wallet_pwd_hint = values['-WALLET-HINT-'],
914+
wallet_format = next( (f for f in WALLET_SIZES if values.get( f"-WALLET-SIZE-{f}-" )), None ),
899915
)
900916
except Exception as exc:
901917
status = f"Error saving PDF(s): {exc}"

0 commit comments

Comments
 (0)