metaboss 0.49.0

The Metaplex NFT-standard Swiss Army Knife tool.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
<!DOCTYPE HTML>
<html lang="en" class="light" dir="ltr">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>Metaboss</title>
        <meta name="robots" content="noindex">


        <!-- Custom HTML head -->
        
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff">

        <link rel="icon" href="favicon.svg">
        <link rel="shortcut icon" href="favicon.png">
        <link rel="stylesheet" href="css/variables.css">
        <link rel="stylesheet" href="css/general.css">
        <link rel="stylesheet" href="css/chrome.css">
        <link rel="stylesheet" href="css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
        <link rel="stylesheet" href="fonts/fonts.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="highlight.css">
        <link rel="stylesheet" href="tomorrow-night.css">
        <link rel="stylesheet" href="ayu-highlight.css">

        <!-- Custom theme stylesheets -->

    </head>
    <body class="sidebar-visible no-js">
    <div id="body-container">
        <!-- Provide site root to javascript -->
        <script>
            var path_to_root = "";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script>
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script>
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('light')
            html.classList.add(theme);
            var body = document.querySelector('body');
            body.classList.remove('no-js')
            body.classList.add('js');
        </script>

        <input type="checkbox" id="sidebar-toggle-anchor" class="hidden">

        <!-- Hide / unhide sidebar before it is displayed -->
        <script>
            var body = document.querySelector('body');
            var sidebar = null;
            var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            } else {
                sidebar = 'hidden';
            }
            sidebar_toggle.checked = sidebar === 'visible';
            body.classList.remove('sidebar-visible');
            body.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item expanded "><a href="overview.html"><strong aria-hidden="true">1.</strong> Overview</a></li><li class="chapter-item expanded "><a href="quick_start.html"><strong aria-hidden="true">2.</strong> Quick Start</a></li><li class="chapter-item expanded "><a href="installation.html"><strong aria-hidden="true">3.</strong> Installation</a></li><li class="chapter-item expanded "><a href="examples.html"><strong aria-hidden="true">4.</strong> Examples</a></li><li class="chapter-item expanded "><a href="recipes.html"><strong aria-hidden="true">5.</strong> Recipes</a></li><li class="chapter-item expanded "><a href="global_options.html"><strong aria-hidden="true">6.</strong> Global Options</a></li><li class="chapter-item expanded "><a href="airdrop.html"><strong aria-hidden="true">7.</strong> Airdrop</a></li><li class="chapter-item expanded "><a href="burn.html"><strong aria-hidden="true">8.</strong> Burn</a></li><li class="chapter-item expanded "><a href="check.html"><strong aria-hidden="true">9.</strong> Check</a></li><li class="chapter-item expanded "><a href="collections.html"><strong aria-hidden="true">10.</strong> Collections</a></li><li class="chapter-item expanded "><a href="create.html"><strong aria-hidden="true">11.</strong> Create</a></li><li class="chapter-item expanded "><a href="decode.html"><strong aria-hidden="true">12.</strong> Decode</a></li><li class="chapter-item expanded "><a href="derive.html"><strong aria-hidden="true">13.</strong> Derive</a></li><li class="chapter-item expanded "><a href="find.html"><strong aria-hidden="true">14.</strong> Find</a></li><li class="chapter-item expanded "><a href="mint.html"><strong aria-hidden="true">15.</strong> Mint</a></li><li class="chapter-item expanded "><a href="set.html"><strong aria-hidden="true">16.</strong> Set</a></li><li class="chapter-item expanded "><a href="sign.html"><strong aria-hidden="true">17.</strong> Sign</a></li><li class="chapter-item expanded "><a href="snapshot.html"><strong aria-hidden="true">18.</strong> Snapshot</a></li><li class="chapter-item expanded "><a href="transfer.html"><strong aria-hidden="true">19.</strong> Transfer</a></li><li class="chapter-item expanded "><a href="update.html"><strong aria-hidden="true">20.</strong> Update</a></li><li class="chapter-item expanded "><a href="verify_unverify.html"><strong aria-hidden="true">21.</strong> Verify/Unverify</a></li><li class="chapter-item expanded "><a href="withdraw.html"><strong aria-hidden="true">22.</strong> Withdraw</a></li><li class="chapter-item expanded "><a href="priority_fees.html"><strong aria-hidden="true">23.</strong> Priority Fees</a></li><li class="chapter-item expanded "><a href="contact.html"><strong aria-hidden="true">24.</strong> Contact</a></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                <div class="sidebar-resize-indicator"></div>
            </div>
        </nav>

        <!-- Track and set sidebar scroll position -->
        <script>
            var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
            sidebarScrollbox.addEventListener('click', function(e) {
                if (e.target.tagName === 'A') {
                    sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
                }
            }, { passive: true });
            var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
            sessionStorage.removeItem('sidebar-scroll');
            if (sidebarScrollTop) {
                // preserve sidebar scroll position when navigating via links within sidebar
                sidebarScrollbox.scrollTop = sidebarScrollTop;
            } else {
                // scroll sidebar to current active section when navigating via "next/previous chapter" buttons
                var activeSection = document.querySelector('#sidebar .active');
                if (activeSection) {
                    activeSection.scrollIntoView({ block: 'center' });
                }
            }
        </script>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky">
                    <div class="left-buttons">
                        <label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </label>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                    </div>

                    <h1 class="menu-title">Metaboss</h1>

                    <div class="right-buttons">
                        <a href="print.html" title="Print this book" aria-label="Print this book">
                            <i id="print-button" class="fa fa-print"></i>
                        </a>

                    </div>
                </div>

                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script>
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1 id="metaboss"><a class="header" href="#metaboss">Metaboss</a></h1>
<p><a href="https://github.com/samuelvanderwaal/metaboss"><img src="https://img.shields.io/github/stars/samuelvanderwaal/metaboss?style=social" alt="Stars" /></a>
<a href="https://github.com/samuelvanderwaal/metaboss"><img src="https://img.shields.io/github/forks/samuelvanderwaal/metaboss?style=social" alt="Forks" /></a>
<a href="https://crates.io/crates/metaboss"><img src="https://img.shields.io/crates/v/metaboss" alt="Crate" /></a>
<a href="https://crates.io/crates/metaboss"><img src="https://img.shields.io/crates/d/metaboss" alt="Downloads" /></a></p>
<p>The Solana Metaplex NFT 'Swiss Army Knife' tool.</p>
<p>Current Commands:</p>
<pre><code>SUBCOMMANDS:
    airdrop         Airdrop assets to a list of addresses
    burn            Full Burn an asset
    burn-nft        Full Burn a NFT
    burn-print      Full Burn a print edition NFT
    check           Check specific metadata values for a list of NFTs
    collections     NFT collections commands
    create          Create accounts
    decode          Decode on-chain data into JSON format
    derive          Derive PDAs for various account types
    find            Find things
    help            Prints this message or the help of the given subcommand(s)
    mint            Mint new NFTs from JSON files
    parse-errors    Parse Errors commands
    set             Set non-Data struct values for a NFT
    sign            Sign metadata for an unverified creator
    snapshot        Get snapshots of various blockchain states
    transfer        Transfer Metaplex assets
    unverify        Unverify Creators
    update          Update various aspects of NFTs
    uses            NFT uses commands
    verify          Verify Creators
</code></pre>
<p>Each subcommand has additional commands. Run <code>metaboss &lt;subcommand&gt; --help</code> and <code>metaboss &lt;subcommand&gt; &lt;command&gt; --help</code> for more information on particular commands.</p>
<p>Suggestions and PRs welcome!</p>
<p><strong>Note: This is experimental software for a young ecosystem. Use at your own risk. The author is not responsible for misuse of the software or failing to test specific commands before using on production NFTs.</strong></p>
<p><strong>Test on devnet or localnet before using on mainnet.</strong></p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="quick-start"><a class="header" href="#quick-start">Quick Start</a></h2>
<h3 id="install-binary"><a class="header" href="#install-binary">Install Binary</a></h3>
<p>Copy the following to a terminal:</p>
<pre><code>bash &lt;(curl -sSf https://raw.githubusercontent.com/samuelvanderwaal/metaboss/main/scripts/install.sh)
</code></pre>
<p>If you get errors you may need dependencies:</p>
<p>Ubuntu:</p>
<pre><code>sudo apt install libssl-dev libudev-dev pkg-config
</code></pre>
<p>MacOS may need openssl:</p>
<pre><code>brew install openssl@3
</code></pre>
<p>Or get the binary yourself: <a href="https://github.com/samuelvanderwaal/metaboss/releases">binary</a>.</p>
<h3 id="install-with-cargo"><a class="header" href="#install-with-cargo">Install With Cargo</a></h3>
<p>So you're a Rust dev. . .</p>
<pre><code class="language-bash">cargo install metaboss
</code></pre>
<h3 id="see-usage-commands"><a class="header" href="#see-usage-commands">See Usage Commands</a></h3>
<pre><code class="language-bash">metaboss -h
</code></pre>
<p>Decode a mint account's metadata:</p>
<pre><code class="language-bash">metaboss decode mint -a 23gaZq8578xHozMWADsmZ2hAFqZ15iyHmQtRw14meds2
</code></pre>
<p>Get a snapshot of mint accounts by first verified creator:</p>
<pre><code class="language-bash">metaboss snapshot mint -c PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="installation"><a class="header" href="#installation">Installation</a></h1>
<h2 id="recommended-way-to-install"><a class="header" href="#recommended-way-to-install">Recommended Way to Install</a></h2>
<p>The recommended way to install is to use the install script to install on <strong>MacOs</strong>, <strong>Ubuntu</strong>, or other <strong>Unix-like OS</strong>, by copying the following into a terminal:</p>
<pre><code>bash &lt;(curl -sSf https://raw.githubusercontent.com/samuelvanderwaal/metaboss/main/scripts/install.sh)
</code></pre>
<p>This will download the appropriate binary for your system and install it. Feel free to inspect the install script directly at <a href="https://raw.githubusercontent.com/samuelvanderwaal/metaboss/main/scripts/install.sh">the link</a> to see what you are running before you run the command.</p>
<p>For <strong>Windows</strong>, either use the prebuilt binary in the following section, or install Windows Subsystem Linux (WSL) to use the Ubuntu terminal to run the above installation script.</p>
<p>To install WSL on Windows, either run <code>wsl --install -d ubuntu</code> in the cmd prompt terminal, or install "Ubuntu" from the Windows app store. Once you have that set up you can simply run the install script in the WSL terminal. You will then run all your Metaboss commands from WSL as well.</p>
<p><a href="https://discord.gg/n3H9rQ8s4R">The Metaboss Discord</a> has a step-by-step guide for installing on Windows in the #windows-install channel.</p>
<h2 id="binaries"><a class="header" href="#binaries">Binaries</a></h2>
<p>Linux, MacOS and Windows binaries available in <a href="https://github.com/samuelvanderwaal/metaboss/releases">releases</a>, thanks to CI work done by <a href="https://github.com/KartikSoneji">Kartik Soneji</a>.</p>
<h2 id="cratesio"><a class="header" href="#cratesio">Crates.io</a></h2>
<pre><code class="language-bash">cargo install metaboss
</code></pre>
<h2 id="install-from-source"><a class="header" href="#install-from-source">Install From Source</a></h2>
<p>Install <a href="https://www.rust-lang.org/tools/install">Rust</a>.</p>
<pre><code class="language-bash">curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
</code></pre>
<p>Clone the source:</p>
<pre><code class="language-bash">git clone git@github.com:samuelvanderwaal/metaboss.git
</code></pre>
<p>or</p>
<pre><code class="language-bash">git clone https://github.com/samuelvanderwaal/metaboss.git
</code></pre>
<p>On Ubuntu you may need some additional packages:</p>
<pre><code>sudo apt install libssl-dev libudev-dev pkg-config
</code></pre>
<p>Change directory and check out the <code>main</code> branch:</p>
<pre><code class="language-bash">cd metaboss
git checkout main
</code></pre>
<p>Install or build with Rust:</p>
<pre><code class="language-bash">cargo install --path ./
</code></pre>
<p>or</p>
<pre><code class="language-bash">cargo build --release
</code></pre>
<h2 id="set-up-your-solana-config"><a class="header" href="#set-up-your-solana-config">Set Up Your Solana Config</a></h2>
<p>If you have the <a href="https://docs.solana.com/cli/install-solana-cli-tools">Solana CLI</a> installed (recommended) you can setup your RPC and keypair so you don't have to pass them into Metaboss:</p>
<pre><code>solana config set --url &lt;rpc url&gt; --keypair &lt;path to keypair file&gt;
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="examples"><a class="header" href="#examples">Examples</a></h2>
<h3 id="update-the-uri-of-an-existing-nft"><a class="header" href="#update-the-uri-of-an-existing-nft">Update the URI of an existing NFT</a></h3>
<pre><code class="language-bash">metaboss update uri -k ~/.config/solana/devnet.json -a CQNKXw1rw2eWwi812Exk4cKUjKuomZ2156STGRyXd2Mp -u https://arweave.net/N36gZYJ6PEH8OE11i0MppIbPG4VXKV4iuQw1zaq3rls
</code></pre>
<h3 id="mint-a-new-nft"><a class="header" href="#mint-a-new-nft">Mint a new NFT</a></h3>
<p>Prepare a JSON file.</p>
<pre><code class="language-json">{
    "name": "TestNFT2",
    "symbol": "TNFT",
    "uri": "https://arweave.net/FPGAv1XnyZidnqquOdEbSY6_ES735ckcDTdaAtI7GFw",
    "seller_fee_basis_points": 200,
    "creators": [
        {
            "address": "AVdBTNhDqYgXGaaVkqiaUJ1Yqa61hMiFFaVRtqwzs5GZ",
            "verified": false,
            "share": 50
        },
        {
            "address": "42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB",
            "verified": false,
            "share": 50
        }
    ]
}
</code></pre>
<p>Call command. In this case we do not set <code>--receiver</code> so we mint directly to the <code>keypair</code> address.</p>
<pre><code class="language-bash">metaboss mint one -k ~/.config/solana/devnet.json -d ./new_nft.json
</code></pre>
<h3 id="snapshot-candy-machine-mint-accounts"><a class="header" href="#snapshot-candy-machine-mint-accounts">Snapshot Candy Machine Mint Accounts</a></h3>
<p>We call the command with no output specified so it creates the file in the current directory.</p>
<pre><code class="language-bash">metaboss snapshot mints -c BHZWQEtGRMs7voC7vDyVQCXawB1P6UvxG899ATGwxmaR
</code></pre>
<p>The file <code>BHZWQEtGRMs7voC7vDyVQCXawB1P6UvxG899ATGwxmaR_mint_accounts.json</code> is created with the contents:</p>
<pre><code class="language-json">[
    "D5ycm2mgBWDR37QVkvM389x84V4ux48bSeHLeiHPtX28",
    "4kYdMRRYtXjmkusgKEBntSXLDhqkHNE57GF3RPdtx6MW",
    "J8xuCFCeBRESoXewtMwrrpVUGikUG3B1WznNdLffyymz",
    "4gRtRjrbD7g5ZKUvSVA1tYMK9LZqz6uWuSc3rKeinySh"
]
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="update-list-of-nft-metadata"><a class="header" href="#update-list-of-nft-metadata">Update List of NFT Metadata</a></h2>
<ol>
<li>Get your NFT mint list using <code>metaboss snapshot</code> or another tool.</li>
<li>Decode all the metadata into files using <code>metaboss decode mint -L &lt;NFT_MINT_LIST_FILE&gt; --full -o &lt;DATA_FILES_DIR&gt;</code>.</li>
<li>Update the specific data you want changed in each file in the <code>&lt;DATA_FILES_DIR&gt;</code>.</li>
<li>Update the NFTs with <code>metaboss update data-all -d &lt;DATA_FILES_DIR&gt;</code>.</li>
</ol>
<p><strong>Note</strong>: many fields have specific <code>update &lt;field&gt;-all</code> commands which are easier to use as they don't require updating a bunch of metadata files manually. Check the <code>update</code> and <code>set</code> sections first to see if they have what you need.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="global-options"><a class="header" href="#global-options">Global Options</a></h2>
<p>These are the options that apply to all subcommands and can be passed in at any level.</p>
<pre><code class="language-bash">metaboss &lt;option&gt; &lt;subcommand&gt; &lt;subcommand&gt;
</code></pre>
<pre><code class="language-bash">metaboss &lt;subcommand&gt; &lt;option&gt; &lt;subcommand&gt;
</code></pre>
<pre><code class="language-bash">metaboss &lt;subcommand&gt; &lt;subcommand&gt; &lt;option&gt;
</code></pre>
<h2 id="options"><a class="header" href="#options">Options</a></h2>
<p>-r, --rpc <rpc> The RPC endpoint to use for commands.</p>
<p>Metaboss will try to read your Solana config settings for both the RPC endpoint and also the Commitment setting by reading from <code>$HOME/.config/solana/cli/config.yml</code>. If it can't find a config file it defaults to using <code>https://dev.genesysgo.net</code> and <code>confirmed</code>.</p>
<p>Running Metaboss with the <code>--rpc</code> option will override the above with whatever RPC endpoint the user provides.</p>
<p>-T, --timeout <timeout> The timeout in seconds to use for RPC calls.</p>
<p>This defaults to 90 seconds which should be fine for most cases but can be overridden if needed.</p>
<p>Example:</p>
<pre><code class="language-bash">metaboss snapshot holders -r https://ssc-dao.genesysgo.net/ -T 120 -u DC2mkgwhy56w3viNtHDjJQmc7SGu2QX785bS4aexojwX
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="airdrop"><a class="header" href="#airdrop">Airdrop</a></h2>
<p>This is an experimental feature that uses the <a href="https://github.com/samuelvanderwaal/jib">Jib library</a> for batching and transmitting instructions. <strong>You should carefully test it on devnet prior to running it on mainnet.</strong></p>
<h3 id="airdrop-sol"><a class="header" href="#airdrop-sol">Airdrop SOL</a></h3>
<p>Airdrop SOL to a list of accounts.</p>
<pre><code>Airdrop SOL

USAGE:
    metaboss airdrop sol [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;            Cache file
    -k, --keypair &lt;keypair&gt;                  Path to the owner keypair file
    -l, --log-level &lt;log-level&gt;              Log level [default: off]
    -n, --network &lt;network&gt;                  Network cluster to use, defaults to devnet [default: devnet]
    -L, --recipient-list &lt;recipient-list&gt;    Path to the mint list file
    -r, --rpc &lt;rpc&gt;                          RPC endpoint url to override using the Solana config or the hard-coded
                                             default
    -T, --timeout &lt;timeout&gt;                  Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<p>This command requires a recipient list file that should be a JSON file of addresses and the amount of lamports to send to them. (1 SOL = 1,000,000,000 lamports) E.g.:</p>
<pre><code class="language-json">{
  "HVtodaLcq6zVvqp7h6JwLLrsAGxeJ9BatvgpUfp9b4oM": 1000,
  "5VXU4QbhUZbkBqKxT3Mv55krE4MomMgtV68whNRotjk5": 1000,
  "GSFKDFeCe93aUscmG84ugtXXNPMGoMcbZwRaamPLXS9o": 5000,
  "DCYHBcWGgdUUCBbj7rjbkBJWkuoHAH88BzMKfbbkFUNJ": 7000,
  "8MUCm4HxRXQUKMyanyNcvcG4qbAmw5s6y9exiszFZgg": 5000,
  "sknqbvGgVFpniWRK9kM1e77Fuq5oEhSZ5He4PtbTeZh": 3000  
}
</code></pre>
<h4 id="usage"><a class="header" href="#usage">Usage</a></h4>
<pre><code class="language-bash">metaboss airdrop sol  -L &lt;PATH_TO_RECIPIENTS_LIST_FILE&gt; -n devnet
</code></pre>
<p>This command creates two files: <code>mb-cache-airdrop-&lt;TIMESTAMP&gt;.json</code> and <code>mb-successful-airdrops-&lt;TIMESTAMP&gt;.json</code>. The cache file is used to track the airdrop progress by storing failed transactions and the successful airdrops file is used to track the successful airdrops by storing transaction signatures of the successful airdrops.</p>
<p>To re-run failed transactions run the command with the cache file instead of the recipient list file:</p>
<pre><code class="language-bash">metaboss airdrop sol  -c &lt;PATH_TO_CACHE_FILE&gt; -n devnet
</code></pre>
<p>The command will first check the status of all the failed transactions to ensure they were not already successful before re-running them which should prevent any double-sends.</p>
<p>If transactions continuously fail you should look at the errors in the cache file and determine the cause.</p>
<h3 id="airdrop-spl-tokens"><a class="header" href="#airdrop-spl-tokens">Airdrop SPL Tokens</a></h3>
<p>Airdrop SPL tokens to a list of accounts.</p>
<pre><code class="language-bash">Airdrop SPL tokens

USAGE:
    metaboss airdrop spl [FLAGS] [OPTIONS] --mint &lt;mint&gt;

FLAGS:
        --boost          Boost the transactions w/ priority fees
    -h, --help           Prints help information
        --mint-tokens    
    -V, --version        Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;            Cache file
    -k, --keypair &lt;keypair&gt;                  Path to the owner keypair file
    -l, --log-level &lt;log-level&gt;              Log level [default: off]
    -m, --mint &lt;mint&gt;                        Mint from the SPL token mint
    -n, --network &lt;network&gt;                  Network cluster to use, defaults to devnet [default: devnet]
    -L, --recipient-list &lt;recipient-list&gt;    Path to the mint list file
    -r, --rpc &lt;rpc&gt;                          RPC endpoint url to override using the Solana config or the hard-coded
                                             default
    -T, --timeout &lt;timeout&gt;                  Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<p>This command works similarly to the SOL airdrop command, but expects the amount to be in the display units of the SPL token. E.g. for a token with three decimal places the amount of 10 will be converted to 10,000 base units behind the scenes.</p>
<p>Be aware that airdropping SPL tokens to wallets that do not already have a token account for that mint will cost 0.002 SOL per transaction. This is because the token account needs to be created first. This could end up being a significant cost if you are airdropping to a large number of wallets.</p>
<p>For large SPL token airdrops you may want to consider setting up a claim site instead.</p>
<h3 id="read-cache-file"><a class="header" href="#read-cache-file">Read Cache File</a></h3>
<p>For storage and speed constraints, the cache file is not human-readable. To read the cache file you can use the <code>read-cache</code> command with either or both the <code>--json</code> and <code>--errors</code> flags which convert the cache file to a JSON file and print the errors respectively.</p>
<pre><code class="language-bash">metaboss airdrop read-cache &lt;PATH_TO_CACHE_FILE&gt; --json
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="burn"><a class="header" href="#burn">Burn</a></h2>
<p>Burn Master Editions NFTs, as long as they do not have any editions (supply == 0). Only the owner/token holder of the NFT can burn it.</p>
<h3 id="burn-one"><a class="header" href="#burn-one">Burn One</a></h3>
<p>Fully burn a single NFT by calling the Token Metadata program <a href="https://docs.metaplex.com/programs/token-metadata/instructions#burn-a-nft">burn_nft</a> handler.</p>
<h4 id="usage-1"><a class="header" href="#usage-1">Usage</a></h4>
<pre><code class="language-bash">metaboss burn one -k &lt;OWNER_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt;
</code></pre>
<h3 id="burn-all"><a class="header" href="#burn-all">Burn All</a></h3>
<p>Fully burn multiple NFTs by providing a JSON list file of mint accounts.</p>
<p>E.g. JSON file:</p>
<pre><code class="language-json">[
    "D5ycm2mgBWDR37QVkvM389x84V4ux48bSeHLeiHPtX28",
    "4kYdMRRYtXjmkusgKEBntSXLDhqkHNE57GF3RPdtx6MW",
    "J8xuCFCeBRESoXewtMwrrpVUGikUG3B1WznNdLffyymz",
    "4gRtRjrbD7g5ZKUvSVA1tYMK9LZqz6uWuSc3rKeinySh"
]
</code></pre>
<h4 id="usage-2"><a class="header" href="#usage-2">Usage</a></h4>
<pre><code class="language-bash">metaboss burn all -k &lt;OWNER_KEYPAIR&gt; -L &lt;JSON_LIST_OF_MINTS_ACCOUNTS&gt;
</code></pre>
<p>As in all other commands, keypair can be elided if set in the Solana config file.</p>
<h2 id="burn-print"><a class="header" href="#burn-print">Burn-Print</a></h2>
<p>Burn Print Edition NFTs. Only the owner/token holder of the NFT can burn it.</p>
<h3 id="burn-print-one"><a class="header" href="#burn-print-one">Burn-Print One</a></h3>
<p>Fully burn a single Print Edition NFT by called the Token Metadata <a href="https://docs.metaplex.com/programs/token-metadata/instructions#burn-a-print-edition-nft">burn_edition_nft</a> handler.</p>
<h4 id="usage-3"><a class="header" href="#usage-3">Usage</a></h4>
<pre><code class="language-bash">metaboss burn-print one -k &lt;OWNER_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt;
</code></pre>
<h3 id="burn-print-all"><a class="header" href="#burn-print-all">Burn-Print All</a></h3>
<p>Fully burn multiple Print Edition NFTs by providing a JSON list file of mint accounts.</p>
<p>E.g. JSON file:</p>
<pre><code class="language-json">[
    "D5ycm2mgBWDR37QVkvM389x84V4ux48bSeHLeiHPtX28",
    "4kYdMRRYtXjmkusgKEBntSXLDhqkHNE57GF3RPdtx6MW",
    "J8xuCFCeBRESoXewtMwrrpVUGikUG3B1WznNdLffyymz",
    "4gRtRjrbD7g5ZKUvSVA1tYMK9LZqz6uWuSc3rKeinySh"
]
</code></pre>
<p>Due to on-chain limitations, you also have to provide the mint account of the Master Edition NFT.</p>
<h4 id="usage-4"><a class="header" href="#usage-4">Usage</a></h4>
<pre><code class="language-bash">metaboss burn-print all -k &lt;OWNER_KEYPAIR&gt; -L &lt;JSON_LIST_OF_MINT_ACCOUNTS&gt; -m &lt;MASTER_EDITION_MINT_ACCOUNT&gt;
</code></pre>
<p>As in all other commands, keypair can be elided if set in the Solana config file.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="check"><a class="header" href="#check">Check</a></h2>
<h3 id="metadata-values"><a class="header" href="#metadata-values">Metadata Values</a></h3>
<p>Check for a specific metadata value in downloaded metadata files.</p>
<h3 id="usage-5"><a class="header" href="#usage-5">Usage</a></h3>
<p>Run</p>
<pre><code class="language-bash">metaboss decode mint -L &lt;mint_list_json&gt; -o &lt;output_dir&gt; --full
</code></pre>
<p>to decode all the metadata files in the <code>mint_list_json</code> file and save them to the <code>output_dir</code> directory.</p>
<p>Then run</p>
<pre><code class="language-bash">metaboss check metadata-value -d &lt;files_dir&gt; METADATA_VALUE=VALUE
</code></pre>
<p>where the <code>files_dir</code> is the location of the metadata files downloaded in the previous command and <code>METADATA_VALUE</code> is one of the following
values:</p>
<ul>
<li><code>name</code></li>
<li><code>symbol</code></li>
<li><code>uri</code></li>
<li><code>sfbp</code></li>
<li><code>creators</code></li>
<li><code>update_authority</code></li>
<li><code>primary_sale_happened</code></li>
<li><code>is_mutable</code></li>
<li><code>token_standard</code></li>
<li><code>collection_parent</code></li>
<li><code>collection_verified</code></li>
<li><code>rule_set</code></li>
</ul>
<p>and <code>VALUE</code> is the specific value of the field you wish to check for in the metadata files.</p>
<p>E.g., to see if all the metadata files in the <code>output_dir</code> directory have a specific <code>update_authority</code> value:</p>
<pre><code class="language-bash">metaboss check metadata-value -d my_collection_files/ update_authority="PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8"
</code></pre>
<p>The command will print a list of files that do not have the specified value as well as create a files with the list of mints.
The mint file will have the name format: "mb_check_mints_&lt;METADATA_VALUE&gt;.json" and will be created in the directory where the command is run.
In the above example the mint file will be "mb_check_mints_update_authority.json" and will contain all the mints that do not have the specified
update authority. This will allow you to easily rerun an update or set command to fix metadata values that weren't set properly.</p>
<p>The "name" field will check that the name on the metadata <em>contains</em> the name you specify so you can check for partial matches.
E.g. if your collection's name format is "MyCollection #xx" you can set the name to be "MyCollection" and it will match all the metadata files
that have the name "MyCollection" in their name.</p>
<div style="break-before: page; page-break-before: always;"></div><h1 id="collections"><a class="header" href="#collections">Collections</a></h1>
<h2 id="migrate"><a class="header" href="#migrate">Migrate</a></h2>
<p>Migrate a collection of NFTs or pNFTs to be part of a single on-chain Metaplex Certified Collection (MCC).</p>
<ol>
<li>
<p>Create your Collection Parent NFT using a minting tool such as <a href="https://sol-tools.tonyboyle.io/nft-tools/create-nft">Sol Tools</a>. Alternately, use <code>metaboss mint one</code> or <code>metaboss mint asset</code>. This NFT will have your collection name, cover art, description, traits etc. It's the parent NFT for you collection and all items in your collection will point to this mint account.</p>
</li>
<li>
<p>Get your mint list. If your collection is a single candy machine you can use the <code>--candy-machine-id</code> option, otherwise provide the path to your mint list formatted as a JSON file with the <code>--mint-list</code> option.</p>
</li>
</ol>
<p>Example contents of the mint list file:</p>
<pre><code class="language-json">[
    "D5ycm2mgBWDR37QVkvM389x84V4ux48bSeHLeiHPtX28",
    "4kYdMRRYtXjmkusgKEBntSXLDhqkHNE57GF3RPdtx6MW",
    "J8xuCFCeBRESoXewtMwrrpVUGikUG3B1WznNdLffyymz",
    "4gRtRjrbD7g5ZKUvSVA1tYMK9LZqz6uWuSc3rKeinySh"
]
</code></pre>
<p>Your Collection Parent NFT must have the <em>same update authority</em> as the items you will put in the collection. If you don't want to connect your update authority keypair to a website, you can mint with a different keypair and then change the update authority with Metaboss, or mint with Metaboss's <code>mint one</code> command.</p>
<h3 id="running-the-commands"><a class="header" href="#running-the-commands">Running the Commands</a></h3>
<h4 id="single-candy-machine-collection"><a class="header" href="#single-candy-machine-collection">Single Candy Machine Collection</a></h4>
<p>Let's say you've created a parent NFT for your collection with a mint address of <code>9wtpdjMysSphxipTSJi7pYWGzSZFm2PRFtQucJiiXUzq</code> and you have a candy machine id of <code>8yuhovH7fb63ed7Q3rcxL3kYZDhps4qspjaxx1N8WSni</code> and your update authority is in the file <code>my_keypair.json</code> in the same directory you are running the command. Your Metaboss command would be:</p>
<pre><code class="language-bash">metaboss collections migrate -k my_keypair.json -c 8yuhovH7fb63ed7Q3rcxL3kYZDhps4qspjaxx1N8WSni --mint-address 9wtpdjMysSphxipTSJi7pYWGzSZFm2PRFtQucJiiXUzq
</code></pre>
<h4 id="using-a-mint-list-file"><a class="header" href="#using-a-mint-list-file">Using a Mint List File</a></h4>
<p>Assume the same scenario above but with a mint list file named "my_mint_list.json" in the same directory you are running the command. Your Metaboss command would be:</p>
<pre><code class="language-bash">metaboss collections migrate -k my_keypair.json -L my_mint_list.json --mint-address 9wtpdjMysSphxipTSJi7pYWGzSZFm2PRFtQucJiiXUzq
</code></pre>
<p>This assumes you have your RPC set in your <a href="https://docs.solana.com/cli/choose-a-cluster">Solana config</a>, otherwise it can be passed in with the <code>-r</code> option. As with all Metaboss commands, if you've set your keypair in your Solana config, you can omit the <code>-k</code> option. I recommend setting both in the Solana config to simplify commands:</p>
<pre><code>solana config set --url &lt;rpc url&gt; --keypair &lt;path to keypair file&gt;
</code></pre>
<h4 id="retry-flow-and-cache-file"><a class="header" href="#retry-flow-and-cache-file">Retry Flow and Cache File</a></h4>
<p>The <code>migrate</code> command rapidly fires off a lot of network requests to try to migrate over your collection as quickly as possible. If some of them fail, it keeps track of them and will automatically retry them based on the maximum number of retries you specify with the <code>--retries</code> option. (Defaults to one retry.)</p>
<p><img src="./images/retry_flow.png" alt="retry flow" /></p>
<p>If it hits the maximum number of retries with errors remaining, it will write them to the cache file (<code>metaboss-cache-migrate-collections.json</code>).</p>
<p>To retry from a cache file, you can use the <code>--cache-file</code> option.</p>
<pre><code class="language-metaboss">metaboss collections migrate -k my_keypair.json --cache-file metaboss-cache-migrate-collections.json --mint-address 9wtpdjMysSphxipTSJi7pYWGzSZFm2PRFtQucJiiXUzq
</code></pre>
<p>This will read the items from the cache file and retry them.</p>
<p>When retrying, if you consistently end up with the same number being retried each time it probably indicates those items cannot be migrated for some reason. Check the errors on the items that failed to migrate.</p>
<p>Example cache file:</p>
<pre><code class="language-json">{
    "FqKGC9CCVThn857VAyZtZQq5L31njnbeUTe1JoCsCX8J": {
        "error": "Migration failed with error: RPC response error -32002: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x39 [5 log messages]"
    },
    "H7xrCZwA7oqsFeRcPsP6EEYHCxqq7atUBuuQAursXvWF": {
        "error": "Migration failed with error: RPC response error -32002: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x39 [5 log messages]"
    }
}
</code></pre>
<p>In this case <a href="https://github.com/samuelvanderwaal/wtf-is">our error is</a>:</p>
<pre><code>0x39:
        Token Metadata            |     IncorrectOwner: Incorrect account owner
</code></pre>
<p>which means these items cannot be migrated over as all items in the collection must have the same update authority as the Parent NFT.</p>
<h3 id="output-file"><a class="header" href="#output-file">Output File</a></h3>
<p>Use <code>--output-file</code> or <code>-o</code> to specify the path and name of the JSON file to write the cache results to.</p>
<p>e.g.:</p>
<pre><code class="language-bash">metaboss collections migrate -L devnet_test_mints.json -m 9wtpdjMysSphxipTSJi7pYWGzSZFm2PRFtQucJiiXUzq -o ~/Desktop/my-cache3.json
</code></pre>
<p>This will override both the default cache file name ('mb-cache-migrate.json') and the cache file name passed in with <code>--cache-file</code>.</p>
<h2 id="get-and-check-collection-items"><a class="header" href="#get-and-check-collection-items">Get and Check Collection Items</a></h2>
<h3 id="get-items"><a class="header" href="#get-items">Get-Items</a></h3>
<p>Metaboss now has experimental support for getting all collection items from a given mint using off-chain, indexed data from https://theindex.io/. Other indexers or methods may be supported later. To use this feature, you need to sign up for a free account with TheIndex to get an API key.</p>
<pre><code class="language-bash">metaboss collections get-items --collection-mint &lt;COLLECTION_NFT_MINT_ADDRESS&gt; --api-key &lt;THE_INDEX_API_KEY&gt;
</code></pre>
<p>where <code>--collection_mint</code> is the mint account of the parent collection NFT and <code>--api-key</code> is your API Key from theindex.io. There's an additional command <code>--method</code> which can be used to support other indexers in the future but defaults to theindex.io for now so can be elided.</p>
<p>This command creates a JSON file named <code>&lt;COLLECTION_MINT&gt;_collection_items.json</code> in the directory it is run in.</p>
<h3 id="check-items"><a class="header" href="#check-items">Check-Items</a></h3>
<p>Given a list of mint addresses and a collection mint address, this command checks all the items in the list to see if they belong to the specified collection.</p>
<pre><code class="language-bash">metaboss collections check-items --collection-mint &lt;COLLECTION_NFT_MINT_ADDRESS&gt; -L &lt;PATH_TO_MINT_LIST&gt;
</code></pre>
<p>This command has a <code>--debug</code> flag, which creates a JSON file when set with a mapping of all collection NFTs found associated with the list of addresses and which ones belong to each.</p>
<p>Report bugs and questions to the <a href="https://discord.gg/2f7N25NJkg">Metaboss Discord</a>.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="create"><a class="header" href="#create">Create</a></h2>
<h3 id="fungible"><a class="header" href="#fungible">Fungible</a></h3>
<p>Create a new SPL token mint and corresponding metadata account.</p>
<h4 id="usage-6"><a class="header" href="#usage-6">Usage</a></h4>
<p>Specify the token decimals and path to a metadata file that contains the <code>name</code>, <code>symbol</code> and <code>uri</code> fields in a JSON format.</p>
<pre><code class="language-bash">metaboss create fungible -d &lt;decimals&gt; -m &lt;metadata_file&gt;
</code></pre>
<p>E.g.:</p>
<p>// crab.json</p>
<pre><code class="language-json">{
  "name": "Crabbie",
  "symbol": "CRAB",
  "uri": "https://arweave.net/KZDlKw8aCG4kfZtj9Qmh8tmYpH4Q287P_jmUtkl2s-k"
}
</code></pre>
<pre><code class="language-bash">metaboss create fungible -d 6 -m crab.json
</code></pre>
<p>Use the <code>--initial-suply</code> option to mint the specified amount directly to your keypair upon token creation. The amount is specified is the UI amount as a float. E.g. <code>--initial-supply 10.123</code> with three decimals will mint 10123 base unit tokens to your keypair.</p>
<pre><code class="language-bash">
```bash
metaboss create fungible -d 3 -m crab.json --initial-supply 10.1
</code></pre>
<h4 id="vanity-mints"><a class="header" href="#vanity-mints">Vanity Mints</a></h4>
<p>You can specify a vanity mint address by using the <code>--mint-path</code> option to specify a path to a keypair on your file system.
It will use this for the mint account instead of creating a new one.</p>
<pre><code class="language-bash">metaboss create fungible -d &lt;decimals&gt; -m &lt;metadata_file&gt; --mint-path &lt;path_to_keypair&gt;
</code></pre>
<h3 id="metadata"><a class="header" href="#metadata">Metadata</a></h3>
<p>Decorate an existing SPL token mint with metadata.</p>
<h4 id="usage-7"><a class="header" href="#usage-7">Usage</a></h4>
<p>Specify the token decimals and path to a metadata file that contains the <code>name</code>, <code>symbol</code> and <code>uri</code> fields in a JSON format.</p>
<p>E.g. (Note the snake_case field name):</p>
<p>// crab.json</p>
<pre><code class="language-json">{
  "name": "Crabbie",
  "symbol": "CRAB",
  "uri": "https://arweave.net/KZDlKw8aCG4kfZtj9Qmh8tmYpH4Q287P_jmUtkl2s-k"
}
</code></pre>
<pre><code class="language-bash">metaboss create metadata -a &lt;mint_address&gt; -m &lt;metadata_file&gt;
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="decode"><a class="header" href="#decode">Decode</a></h2>
<h3 id="decode-mint"><a class="header" href="#decode-mint">Decode Mint</a></h3>
<p>Decodes a mint account's metadata into a JSON file. It accepts either a single account or a list of accounts.</p>
<h4 id="usage-8"><a class="header" href="#usage-8">Usage</a></h4>
<pre><code class="language-bash">metaboss decode mint --account &lt;MINT_ACCOUNT&gt; -o &lt;OUPUT_DIRECTORY&gt;
</code></pre>
<p>The command will write the metadata JSON file to the output directory with the mint account as the name: e.g. <code>CQNKXw1rw2eWwi812Exk4cKUjKuomZ2156STGRyXd2Mp.json</code>. The output option defaults to the current directory.</p>
<pre><code class="language-bash">metaboss decode mint --list-file &lt;LIST_FILE&gt; -o &lt;OUPUT_DIRECTORY&gt;
</code></pre>
<p>The JSON list file should be an array of mint accounts to be decoded:</p>
<pre><code class="language-json">["xSy...", "Cnb..." ...]
</code></pre>
<p>The command will write each metadata JSON file to the output directory as a separate file with the mint account as the name: e.g. <code>CQNKXw1rw2eWwi812Exk4cKUjKuomZ2156STGRyXd2Mp.json</code>. The output option defaults to the current directory.</p>
<p>As of v0.4.0, the default output will only be the <code>Data</code> struct matching the input format of the <code>update data</code> and <code>update data-all</code> commands. To get the full <code>Metadata</code> struct, use the <code>--full</code> option.</p>
<p>Use <code>--raw</code> to get the account data as raw bytes for debugging purposes.</p>
<h3 id="decode-edition"><a class="header" href="#decode-edition">Decode Edition</a></h3>
<p>Decodes a single Print Edition account from a mint account into a JSON file. This is a Print Edition PDA.</p>
<h4 id="usage-9"><a class="header" href="#usage-9">Usage</a></h4>
<pre><code class="language-bash">metaboss decode edition --account &lt;MINT_ACCOUNT&gt; 
</code></pre>
<h3 id="decode-edition-marker"><a class="header" href="#decode-edition-marker">Decode Edition Marker</a></h3>
<p>Decodes a single Edition Marker PDA account from a mint account into a JSON file. This takes the Master Edition NFT mint account and either the edition number or the desired edition marker number, zero-indexed.</p>
<h4 id="usage-10"><a class="header" href="#usage-10">Usage</a></h4>
<p>In this example, it will decode the 2nd Edition Marker PDA which corresponds to Edition numbers 248-495.</p>
<pre><code class="language-bash">metaboss decode edition-marker --account &lt;MASTER_EDITION_MINT_ACCOUNT&gt; -m 1
</code></pre>
<h3 id="decode-master"><a class="header" href="#decode-master">Decode Master</a></h3>
<p>Decodes a single Master Edition account from a mint account into a JSON file. This is a Master Edition PDA.</p>
<h4 id="usage-11"><a class="header" href="#usage-11">Usage</a></h4>
<pre><code class="language-bash">metaboss decode master --account &lt;MINT_ACCOUNT&gt; 
</code></pre>
<h3 id="decode-rulset"><a class="header" href="#decode-rulset">Decode Rulset</a></h3>
<p>Decode a programmable NFT rule set from a pubkey.</p>
<h4 id="usage-12"><a class="header" href="#usage-12">Usage</a></h4>
<pre><code class="language-bash">metaboss decode rule-set AdH2Utn6Fus15ZhtenW4hZBQnvtLgM1YCW2MfVp7pYS5
</code></pre>
<h3 id="decode-pubkey"><a class="header" href="#decode-pubkey">Decode Pubkey</a></h3>
<p>Decode a pubkey from a u8 array.</p>
<h4 id="usage-13"><a class="header" href="#usage-13">Usage</a></h4>
<pre><code class="language-bash">metaboss decode pubkey "[198,63,89,223,232,36,128,201,194,84,163,124,239,91,140,18,189,137,137,47,53,111,44,226,53,45,91,202,241,224,183,205]"
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="derive"><a class="header" href="#derive">Derive</a></h2>
<h3 id="derive-candy-machine-v2-creator"><a class="header" href="#derive-candy-machine-v2-creator">Derive Candy Machine V2 Creator</a></h3>
<p>Derive the candy machine creator PDA from the candy machine id.</p>
<h4 id="usage-14"><a class="header" href="#usage-14">Usage</a></h4>
<pre><code class="language-bash">metaboss derive cmv2-creator &lt;candy_machine_id&gt;
</code></pre>
<h3 id="derive-edition"><a class="header" href="#derive-edition">Derive Edition</a></h3>
<p>Derive the edition PDA from the mint account.</p>
<pre><code class="language-bash">metaboss derive edition &lt;mint_account&gt;
</code></pre>
<h3 id="derive-metadata"><a class="header" href="#derive-metadata">Derive Metadata</a></h3>
<p>Derive the metadata PDA from the mint account.</p>
<pre><code class="language-bash">metaboss derive metadata &lt;mint_account&gt;
</code></pre>
<h3 id="derive-pda"><a class="header" href="#derive-pda">Derive PDA</a></h3>
<p>Derive a generic PDA from a list of seeds and a program id.</p>
<h4 id="usage-15"><a class="header" href="#usage-15">Usage</a></h4>
<pre><code class="language-bash">metaboss derive pda &lt;seed1&gt;,&lt;seed2&gt;,&lt;seed3&gt; &lt;program_id&gt;
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="find"><a class="header" href="#find">Find</a></h2>
<h3 id="error"><a class="header" href="#error">Error</a></h3>
<p>Look up Metaplex program error codes by hex or decimal values.</p>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss find error 0x1770
</code></pre>
<p>or</p>
<pre><code class="language-bash">metaboss find error 6000
</code></pre>
<p>returns:</p>
<pre><code class="language-bash">Auction House | PublicKeyMismatch: PublicKeyMismatch
Auctioneer |    BumpSeedNotInHashMap: Bump seed not in hash map
Candy Machine | IncorrectOwner: Account does not have correct owner!
</code></pre>
<p>Currently supported programs:</p>
<ul>
<li>Token Metadata</li>
<li>Auction House</li>
<li>Auctioneer</li>
<li>Candy Machine</li>
</ul>
<p>It also decodes Anchor specific errors.</p>
<pre><code class="language-bash">metaboss find 3000
</code></pre>
<pre><code>Anchor Program |        AccountDiscriminatorAlreadySet: The account discriminator was already set on this account
</code></pre>
<h3 id="missing-editions"><a class="header" href="#missing-editions">Missing Editions</a></h3>
<p>Find any edition numbers in the sequence that have not been minted. See [editions][https://metaboss.rs/mint.html#editions] for more details on how to interact with editions with Metaboss.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="mint"><a class="header" href="#mint">Mint</a></h2>
<p>Mint new NFTs from JSON files.</p>
<p>For both subcommands the <code>--immutable</code> flag sets the NFT data to be immutable and the <code>--primary-sale-happened</code> flag sets the primary sale happened bool to true.</p>
<h3 id="mint-one"><a class="header" href="#mint-one">Mint One</a></h3>
<p>Mint a single NFT from a JSON file.</p>
<h4 id="usage-16"><a class="header" href="#usage-16">Usage</a></h4>
<pre><code class="language-bash">metaboss mint one --keypair &lt;KEYPAIR&gt; --nft-data-file &lt;PATH_TO_NFT_DATA_FILE&gt; --receiver &lt;RECEIVER_ADDRESS&gt;
</code></pre>
<pre><code class="language-bash">metaboss mint one --keypair &lt;KEYPAIR&gt; --external-metadata-uri &lt;EXTERNAL_METADATA_URI&gt; --receiver &lt;RECEIVER_ADDRESS&gt; --immutable --primary-sale-happened
</code></pre>
<p>The JSON files should contain all the necessary data required to create an NFT's metadata fields. Creator <code>verified</code> fields must be false unless the creator is also the <code>keypair</code>.</p>
<p>Example JSON file:</p>
<pre><code class="language-json">{
    "name": "TestNFT1",
    "symbol": "TNFT",
    "uri": "https://arweave.net/FPGAv1XnyZidnqquOdEbSY6_ES735ckcDTdaAtI7GFw",
    "seller_fee_basis_points": 100,
    "creators": [
        {
            "address": "PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8",
            "verified": false,
            "share": 100
        }
    ]
}
</code></pre>
<p>The --external-metadata-uri option takes a URI to an external metadata file such as an Arweave link pointing to a JSON file.</p>
<p>If <code>receiver</code> is set, the NFT will be minted directly to the receiver's address, otherwise it is minted to <code>keypair</code>. Observant users may note that with a simple bash script this allows airdrops to be deployed with Metaboss.</p>
<p>Use the <code>--sign</code> option to sign the metadata with the keypair immediately after minting.</p>
<h4 id="vanity-mints-1"><a class="header" href="#vanity-mints-1">Vanity Mints</a></h4>
<p>You can specify a vanity mint address by using the <code>--mint-path</code> option to specify a path to a keypair on your file system.
It will use this for the mint account instead of creating a new one.</p>
<h4 id="editions"><a class="header" href="#editions">Editions</a></h4>
<p>To mint a NFT with the ability to print editions from it use the <code>--max-editions &lt;max-editions&gt;</code> option. This defaults to <code>0</code> meaning no editions are allowed. Setting it to a positive integer means you can print up to that many editions. Setting to a value of <code>-1</code> means unlimited editions. Because of how the CLI interprets the <code>-</code> symbol to set max editions to infinite you should use the <code>=</code> sign for the <code>--max-editions</code> option: <code>metaboss mint one -a &lt;master_account&gt; --max-editions='-1'</code>.</p>
<p>To mint editions from a master NFT use the<code>metaboss mint editions</code> command to either mint the next <code>n</code> editions sequentially using <code>--next-editions &lt;int&gt;</code> or mint specific edition numbers using <code>--specific-editions &lt;int&gt; &lt;int&gt; &lt;int&gt;</code> with a list of integer edition numbers to mint.</p>
<p>To find any edition numbers in the sequence that have not been minted use <code>metaboss find missing-editions</code>.</p>
<p>To find and mint any missing editions and mint them to the authority keypair use <code>metaboss mint missing-editions</code>.</p>
<p>To find the full list of options for each command use <code>-h</code> or <code>--help</code> as normal.</p>
<h3 id="mint-list"><a class="header" href="#mint-list">Mint List</a></h3>
<p>Mint multiple NFTs from a list of JSON files.</p>
<h4 id="usage-17"><a class="header" href="#usage-17">Usage</a></h4>
<pre><code class="language-bash">metaboss mint list --keypair &lt;KEYPAIR&gt; --nft-data-dir &lt;PATH_TO_NFT_DATA_FILE&gt; --receiver &lt;RECEIVER_ADDRESS&gt;
</code></pre>
<p>This command functions the same as <code>mint one</code> except instead of a single JSON file, provide a path to a directory with multiple JSON files, one for each NFT to be minted.</p>
<pre><code class="language-bash">metaboss mint list --keypair &lt;KEYPAIR&gt; --external-metadata-uris &lt;PATH_TO_JSON_FILE&gt; --receiver &lt;RECEIVER_ADDRESS&gt; --immutable --primary-sale-happened
</code></pre>
<p>To mint from URIs provide the path to a JSON file containing a list of URIs.</p>
<p>By default, new NFTs are minted as mutable, to make them immutable use the <code>--immutable</code> option.</p>
<p>Use the <code>--sign</code> option to sign the metadata with the keypair immediately after minting.</p>
<h3 id="mint-asset"><a class="header" href="#mint-asset">Mint Asset</a></h3>
<p>Mint various types of Metaplex assets, including pNFTs.</p>
<pre><code>USAGE:
    metaboss mint asset [OPTIONS] --asset-data &lt;asset-data&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --amount &lt;amount&gt;
            Amount of tokens to mint, for NonFungible types this must be 1 [default: 1]

    -d, --asset-data &lt;asset-data&gt;                                Asset data
        --decimals &lt;decimals&gt;                                    Mint decimals for fungible tokens [default: 0]
    -k, --keypair &lt;keypair&gt;                                      Path to the update_authority keypair file
    -l, --log-level &lt;log-level&gt;                                  Log level [default: off]
    -s, --max-print-edition-supply &lt;max-print-edition-supply&gt;
            Max supply of print editions. Only applies to NonFungible types. 0 for no prints, n for n prints,
            'unlimited' for unlimited prints
    -m, --mint-path &lt;mint-path&gt;
            Path to mint keypair file, if minting from existing keypair

    -R, --receiver &lt;receiver&gt;                                    Receiving address, if different from update authority
    -r, --rpc &lt;rpc&gt;
            RPC endpoint url to override using the Solana config or the hard-coded default

    -T, --timeout &lt;timeout&gt;
            Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-18"><a class="header" href="#usage-18">Usage</a></h4>
<p>You need an asset json file of this format:</p>
<pre><code class="language-json">    {
        "name": "Studious Crab #1",
        "symbol": "CRAB",
        "uri": "https://arweave.net/uVtABL4PYv0wVke3LL4DLMkqkSMcQl1qswRZNkJ0a0g",
        "seller_fee_basis_points": 100,
        "creators": [
            {
                "address": "ccc9XfyEMh9sU6DRkUmqQGJqgdKb6QyUaaT5h5BGYw4",
                "verified": true,
                "share": 100
            }
        ],
        "primary_sale_happened": false,
        "is_mutable": true,
        "token_standard": "ProgrammableNonFungible",
        "collection": null,
        "uses": null,
        "collection_details": null,
        "rule_set": null
    }
</code></pre>
<p>Substitute appropriate values for each field. The creator can only be set as verified if it is the same keypair as the one used to mint the asset, otherwise leave it as <code>false</code>.</p>
<pre><code class="language-bash">metaboss mint asset -d &lt;asset_json_file&gt; -k &lt;keypair&gt; -R &lt;receiver&gt; -s &lt;print_supply&gt;
</code></pre>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss mint asset -d crab.json -k ccc9XfyEMh9sU6DRkUmqQGJqgdKb6QyUaaT5h5BGYw4.json -R  PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8 -s 0
</code></pre>
<p>Leave off the <code>--receiver</code> option to mint to your keypair.</p>
<p><strong>Print Supply</strong></p>
<p>All non-fungible type assets: currently <code>NonFungible</code> and <code>ProgrammableNonFungible</code>, require the <code>print-supply</code> option to be specified to set the maximum number of print editions that can be minted from the asset. For most PFP, 1/1, style NFTs, this should be set to <code>0</code> to prevent any editions being minted. Other options are: <code>n</code> for a limited number of <code>n</code> editions (e.g. <code>10</code>), or <code>unlimited</code> to allow unlimited editions to be minted.</p>
<p>Fungible types such as <code>Fungible</code> and <code>FungibleAsset</code> should leave this value off as it has no meaning for them and the <code>mint asset</code> command will fail if that is specified for a fungible type.</p>
<h4 id="vanity-mints-2"><a class="header" href="#vanity-mints-2">Vanity Mints</a></h4>
<p>You can specify a vanity mint address by using the <code>--mint-path</code> option to specify a path to a keypair on your file system.
It will use this for the mint account instead of creating a new one.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="set"><a class="header" href="#set">Set</a></h2>
<p><strong>Warning: These commands modify your NFT and are for advanced users. Use with caution.
Set commands are either irreversible or require a new update authority to reverse.</strong></p>
<p>Set non-Data struct values for a NFT.</p>
<h3 id="set-secondary-sale"><a class="header" href="#set-secondary-sale">Set Secondary Sale</a></h3>
<p>Set <code>primary_sale_happened</code> to be <code>true</code>, enabling secondary sale royalties. <strong>This is not reversible.</strong></p>
<pre><code class="language-bash">metaboss set secondary-sale --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt;
</code></pre>
<p>Outputs a TxId to the command line so you can check the result.</p>
<h3 id="set-secondary-sale-all"><a class="header" href="#set-secondary-sale-all">Set Secondary Sale All</a></h3>
<p>Same as <code>set secondary-sale</code> but takes a mint list instead of a single account file. <strong>This is not reversible.</strong></p>
<h3 id="set-update-authority"><a class="header" href="#set-update-authority">Set Update-Authority</a></h3>
<p>Set <code>update_authority</code> to a different public key. <strong>This is not reversible by the original update authority.</strong></p>
<pre><code class="language-bash">metaboss set update-authority --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt; --new-update-authority &lt;NEW_UPDATE_AUTHORITY&gt;
</code></pre>
<h3 id="set-update-authority-all"><a class="header" href="#set-update-authority-all">Set Update-Authority-All</a></h3>
<p>Set <code>update_authority</code> to a different public key for a list of NFTs. <strong>This is not reversible by the original update authority.</strong></p>
<pre><code class="language-bash">metaboss set update-authority-all --keypair &lt;PATH_TO_KEYPAIR&gt; --mint-list &lt;PATH_TO_MINT_ACCOUNTS&gt; --new-update-authority &lt;NEW_UPDATE_AUTHORITY&gt;
</code></pre>
<p>The mint accounts file should be a JSON file with an array of NFT mint accounts to be updated:</p>
<pre><code class="language-json">[
    "C2eGm8iQPnKVWxakyo8QhwJUvYrZHKF52DPQuAejpTWG",
    "8GcRqxy4VAocTcAkoxCXkPCEmM36HMtjBc8ZarWhAD6o",
    "CK2npuck3WTRNFXSdZv8YjudJJEa69EVGd6GFfeSzfGP"
]
</code></pre>
<h3 id="set-immutable"><a class="header" href="#set-immutable">Set Immutable</a></h3>
<p>Set an NFT's <code>Data</code> struct to be immutable. <strong>This is not reversible.</strong></p>
<pre><code class="language-bash">metaboss set immutable --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt;
</code></pre>
<h3 id="set-immutable-all"><a class="header" href="#set-immutable-all">Set Immutable-All</a></h3>
<p>Set all NFTs in a list to be immutable. <strong>This is not reversible.</strong></p>
<pre><code class="language-bash">metaboss set immutable-all --keypair &lt;PATH_TO_KEYPAIR&gt; --mint-list &lt;PATH_TO_MINT_ACCOUNTS&gt;
</code></pre>
<h3 id="set-token-standard"><a class="header" href="#set-token-standard">Set Token Standard</a></h3>
<p>Set an asset's Token Standard to automatically be the correct type. <strong>This is not reversible.</strong></p>
<pre><code>USAGE:
    metaboss set token-standard [OPTIONS] --account &lt;account&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -a, --account &lt;account&gt;        Mint account of corresponding metadata to update
    -k, --keypair &lt;keypair&gt;        Path to the update authority's keypair file
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-19"><a class="header" href="#usage-19">Usage</a></h4>
<pre><code class="language-bash">metaboss set token-standard --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt;
</code></pre>
<h3 id="set-token-standard-all"><a class="header" href="#set-token-standard-all">Set Token Standard-All</a></h3>
<p>Set all assets in a list to be the correct Token Standard. <strong>This is not reversible.</strong></p>
<pre><code>USAGE:
    metaboss set token-standard-all [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;    Cache file
    -k, --keypair &lt;keypair&gt;          Path to the update authority's keypair file
    -l, --log-level &lt;log-level&gt;      Log level [default: off]
    -L, --mint-list &lt;mint-list&gt;      Mint list
    -R, --rate-limit &lt;rate-limit&gt;    Maximum number of requests per second [default: 10]
        --retries &lt;retries&gt;          Maximum retries: retry failed items up to this many times [default: 0]
    -r, --rpc &lt;rpc&gt;                  RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;          Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-20"><a class="header" href="#usage-20">Usage</a></h4>
<pre><code class="language-bash">metaboss set token-standard-all --keypair &lt;PATH_TO_KEYPAIR&gt; --mint-list &lt;PATH_TO_MINT_ACCOUNTS&gt;
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="sign"><a class="header" href="#sign">Sign</a></h2>
<p><strong>Warning: These commands modify your NFT and are for advanced users. Use with caution.</strong></p>
<p>Sign metadata for an unverified creator.</p>
<h3 id="sign-one"><a class="header" href="#sign-one">Sign One</a></h3>
<p>Sign the metadata for a single mint account.</p>
<h4 id="usage-21"><a class="header" href="#usage-21">Usage</a></h4>
<pre><code class="language-bash">metaboss sign one --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt;
</code></pre>
<p>Outputs a TxId to the command line so you can check the result.</p>
<h3 id="sign-all"><a class="header" href="#sign-all">Sign All</a></h3>
<p>Sign all metadata from a JSON list or for a given first verified creator. First verified creator can be the candy machine creator id or whatever the first verified creator in the creators array is for your NFTs.</p>
<h4 id="usage-22"><a class="header" href="#usage-22">Usage</a></h4>
<pre><code class="language-bash">metaboss sign all --keypair &lt;PATH_TO_KEYPAIR&gt; --creator &lt;FIRST_CREATOR&gt;
</code></pre>
<p><strong>For candy machine v2, you can add the <code>--v2</code> option when using it with the candy machine id.</strong>
Candy machine v2 has a separate creator id from the candy machine account id.</p>
<pre><code class="language-bash">metaboss sign all --keypair &lt;PATH_TO_KEYPAIR&gt; --creator &lt;CANDY_MACHINE_ID&gt; --v2
</code></pre>
<p>or you can use the candy machine creator id which will be the first creator in the creators array.</p>
<pre><code class="language-bash">metaboss sign all --keypair &lt;PATH_TO_KEYPAIR&gt; --creator &lt;CANDY_MACHINE_CREATOR_ID&gt;
</code></pre>
<p>With a mint accounts JSON list:</p>
<pre><code class="language-bash">metaboss sign all --keypair &lt;PATH_TO_KEYPAIR&gt; --mint-accounts-file &lt;PATH_TO_MINT_ACCOUNTS_FILE&gt;
</code></pre>
<p>For the latter usage, the mint accounts file should be a JSON file with a list of mint accounts to be signed:</p>
<pre><code class="language-json">[
    "C2eGm8iQPnKVWxakyo8QhwJUvYrZHKF52DPQuAejpTWG",
    "8GcRqxy4VAocTcAkoxCXkPCEmM36HMtjBc8ZarWhAD6o",
    "CK2npuck3WTRNFXSdZv8YjudJJEa69EVGd6GFfeSzfGP"
]
</code></pre>
<p>Outputs a TxId to the command line so you can check the result.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="snapshot"><a class="header" href="#snapshot">Snapshot</a></h2>
<p>Get snapshots of various blockchain states.</p>
<p><strong>Note</strong>: Most of the snapshot commands rely on the <a href="https://developers.metaplex.com/bubblegum#metaplex-das-api">Digital Asset Standard (DAS) API</a>, which is a read layer for Metaplex NFTs that uses indexed data to serve up information without having to make onerous getProgramAccounts RPC calls to validators. To use these commands you will need to have a RPC URL set with a provider that supports the DAS API. The current official list from Metaplex is <a href="https://developers.metaplex.com/rpc-providers">here</a>.</p>
<p>Metaboss recommends using <a href="https://helius.dev">Helius</a> for DAS API calls as they are the only provider that fully supported the DAS API spec on both mainnet and devnet when these commands were tested. In addition, they have a very generous free tier that should be sufficient for most casual users. The <code>snapshot holders</code> command with the group key set to <code>mint</code> is only supported on Helius endpoints currently, as it relies on their <code>getTokenAccounts</code> custom addition to the DAS API.</p>
<h3 id="snapshot-holders-gpa"><a class="header" href="#snapshot-holders-gpa">Snapshot Holders-GPA</a></h3>
<p>(Legacy: not recommended for use.)</p>
<p>Snapshot all current holders of NFTs using the legacy getProgramAccounts method, filtered by verified candy_machine_id/first creator or update_authority.
<strong>Note:</strong> Update authority can be faked so use that option with caution.</p>
<h4 id="usage-23"><a class="header" href="#usage-23">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot holders --creator &lt;CREATOR_ADDRESS&gt; -p &lt;POSITION&gt; --output &lt;OUTPUT_DIR&gt;
</code></pre>
<p>Use the position to indicate which creator in the creators array to filter by; defaults to the first one (position 0).</p>
<p>or</p>
<pre><code class="language-bash">metaboss snapshot holders --update-authority &lt;UPDATE_AUTHORITY&gt; --output &lt;OUTPUT_DIR&gt;
</code></pre>
<p><strong>For candy machine v2, you can add the <code>--v2</code> option when using it with candy machine id.</strong>
Candy machine v2 has a separate creator id from the candy machine account id.</p>
<pre><code class="language-bash">metaboss snapshot holders --creator &lt;CANDY_MACHINE_ID&gt; --v2 --output &lt;OUTPUT_DIR&gt;
</code></pre>
<p>where &lt;CANDY_MACHINE_ID&gt; is the candy machine id retrieved from the cache file.</p>
<p>Creates a JSON file in the output directory with the name format of <code>&lt;CREATOR/UPDATE_AUTHORITY&gt;_holders.json</code> consisting of an array of objects with the following fields:</p>
<ul>
<li>owner -- the address of the holder of the token</li>
<li>ata -- the associated  token address the NFT is stored at</li>
<li>mint -- the token mint address for the NFT</li>
<li>metadata-- the address of the metadata decorating the mint account that defines the NFT</li>
</ul>
<p>Example file:</p>
<pre><code class="language-json">[
    {
        "owner": "42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB",
        "ata": "7yGA66LYDU7uoPW2x9jrUKaDWTs9jqZ5cSNKR1VaLQdw",
        "mint": "C2eGm8iQPnKVWxakyo8QhwJUvYrZHKF52DPQuAejpTWG",
        "metadata": "8WTA3sLxwRNDKHxZFbn2CFo3FX1ZP59EqrvuDPLbmmWV"
    }
]
</code></pre>
<h3 id="snapshot-mints-gpa"><a class="header" href="#snapshot-mints-gpa">Snapshot Mints-GPA</a></h3>
<p>(Legacy: not recommended for use.)</p>
<p>Snapshot all mint accounts using the legacy getProgramAccounts method, for a given verified candy machine id/first creator or update authority</p>
<h4 id="usage-24"><a class="header" href="#usage-24">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot mints --creator &lt;FIRST_CREATOR&gt; --output &lt;OUTPUT_DIR&gt;
</code></pre>
<p>Use the position to indicate which creator in the creators array to filter by; defaults to the first one (position 0).</p>
<p>or</p>
<pre><code class="language-bash">metaboss snapshot mints --update-authority &lt;UPDATE_AUTHORITY&gt; --output &lt;OUTPUT_DIR&gt;
</code></pre>
<p><strong>For candy machine v2, you can add the <code>--v2</code> option when using it with candy machine id.</strong>
Candy machine v2 has a separate creator id from the candy machine account id.</p>
<pre><code class="language-bash">metaboss snapshot mints --creator &lt;CANDY_MACHINE_ID&gt; --v2 --output &lt;OUTPUT_DIR&gt;
</code></pre>
<p>where &lt;CANDY_MACHINE_ID&gt; is the candy machine id retrieved from the cache file.</p>
<p>Creates a JSON file in the output directory with the name format of <code>&lt;CANDY_MACHINE_ID/UPDATE_AUTHORITY&gt;_mint_accounts.json</code> consisting of an array of mint accounts.</p>
<pre><code class="language-json">[
    "CQNKXw1rw2eWwi812Exk4cKUjKuomZ2156STGRyXd2Mp",
    "5pgGJ5npeMxBzTiQctDgoofEVGSwZMYm3QMz4F4NDShz",
    "8GcRqxy4VAocTcAkoxCXkPCEmM36HMtjBc8ZarWhAD6o"
]
</code></pre>
<h3 id="snapshot-holders----das-api"><a class="header" href="#snapshot-holders----das-api">Snapshot Holders -- DAS API</a></h3>
<p>Snapshot all current holders by various group types:</p>
<ul>
<li>
<p><strong>Mint:</strong> Gets all token holders of a specific mint (currently only supported on Helius endpoints).</p>
</li>
<li>
<p><strong>First Verified Creator Address (FVCA):</strong>
Gets all holders of NFTs with a specific FVCA.</p>
</li>
<li>
<p><strong>Metaplex Collection Id (MCC):</strong>
Gets all holders of NFTs with a specific verified MCC ID.</p>
</li>
</ul>
<h4 id="usage-25"><a class="header" href="#usage-25">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot holders &lt;GROUP_VALUE&gt; --group-key &lt;GROUP_KEY&gt;
</code></pre>
<p>Creates a JSON file in the output directory with the name format of <code>&lt;GROUP_VALUE&gt;_&lt;GROUP_KEY&gt;_holders.json</code> consisting of an array of objects with the following fields:</p>
<ul>
<li>owner -- the address of the holder of the token</li>
<li>ata -- the associated  token address the NFT is stored at</li>
<li>mint -- the token mint address for the NFT</li>
<li>metadata-- the address of the metadata decorating the mint account that defines the NFT</li>
</ul>
<p>E.g.:</p>
<pre><code class="language-json">  {
    "owner": "42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB",
    "mint": "2pwsTyuM4Cb2zmN3xydti2ysPYdmu242w1J7TmQya3At",
    "metadata": "Art3NUzP2DxqfzwwMgjLdu8KY9NQLBp2zuEZ63dx9iU2",
    "ata": "FfwoNCYYC5wUkTYTmtYmBSgk9YRWpTTWZCpJB6MjwvSk"
  },
</code></pre>
<p>Example command:</p>
<pre><code class="language-bash">metaboss snapshot holders PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8 -g fvca
</code></pre>
<h3 id="snapshot-mints----das-api"><a class="header" href="#snapshot-mints----das-api">Snapshot Mints -- DAS API</a></h3>
<p>Snapshot all mint accounts by various group types:</p>
<ul>
<li>
<p><strong>Authority:</strong>
Gets all NFT mint addresses for a given update authority.
<strong>Warning:</strong> update authority can be set to any address so use this option with caution.</p>
</li>
<li>
<p><strong>Creator:</strong>
Gets all NFT mint addresses that have a specific verified creator.</p>
</li>
<li>
<p><strong>Metaplex Collection Id (MCC):</strong>
Gets all NFT mint addresses with a specific verified MCC ID.</p>
</li>
</ul>
<h4 id="usage-26"><a class="header" href="#usage-26">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot mints &lt;GROUP_VALUE&gt; --group-key &lt;GROUP_KEY&gt;
</code></pre>
<p>Creates a JSON file in the output directory with the name format of <code>&lt;GROUP_VALUE&gt;_&lt;GROUP_KEY&gt;_mints.json</code> consisting of an array of mint accounts.</p>
<p>For the creator method you can optionally specify which creator position to use with the <code>--position</code> option. This defaults to 0, which is the first verified creator in the creators array.</p>
<p>Example command:</p>
<pre><code class="language-bash">metaboss snapshot mints PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8 -g creator --position 1
</code></pre>
<h3 id="snapshot-fvca----das-api"><a class="header" href="#snapshot-fvca----das-api">Snapshot FVCA -- DAS API</a></h3>
<p>An alias for snapshot mints with the group key set to <code>creator</code> and the default position of 0 used to find all mints with a given FVCA.</p>
<h4 id="usage-27"><a class="header" href="#usage-27">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot fvca &lt;FVCA&gt;
</code></pre>
<p>Creates a JSON file in the output directory with the name format of <code>&lt;FVCA&gt;_fvca_mints.json</code> consisting of an array of mint accounts.</p>
<p>Example command:</p>
<pre><code class="language-bash">metaboss snapshot fvca PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8
</code></pre>
<h3 id="snapshot-mcc----das-api"><a class="header" href="#snapshot-mcc----das-api">Snapshot MCC -- DAS API</a></h3>
<p>An alias for snapshot mints with the group key set to <code>mcc</code> used to find all mints with a given MCC.</p>
<h4 id="usage-28"><a class="header" href="#usage-28">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot mcc &lt;MCC&gt;
</code></pre>
<p>Creates a JSON file in the output directory with the name format of <code>&lt;MCC&gt;_mcc_mints.json</code> consisting of an array of mint accounts.</p>
<p>Example command:</p>
<pre><code class="language-bash">metaboss snapshot mcc PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8
</code></pre>
<h3 id="snapshot-prints"><a class="header" href="#snapshot-prints">Snapshot Prints</a></h3>
<p>Snapshot the print editions of a given master edition. This returns a JSON object of edition mints where the key is the edition number and the value is the mint address.</p>
<p>E.g.:</p>
<pre><code class="language-json">{
  "1": "CgCmZJCBeJs9m596NzqxLg3HB8eerHHWXQPiiigB3fpt",
  "2": "C7kfCVwadqrQwjCBewE147r3xg8ZgYgqeUJk2tMsZ5zi",
  "3": "6HQBWdC9BpY6Ky3YvmxoEJGce8PgQ6NqfkLgP3dJRDpb",
  "4": "FiDSNjCM5sLPmMvHvCWtnqEp9yt4NvZ2ThXJ9kpvBT73",
  "5": "4DwpsvxzemsHxDjz8qrVkQFP7nK5QwT6irL1KQkt5NJy",
  "6": "DBLeCRfF8t7q2oe5DYip8J9m4eRTc46EKMazqitth5eL",
  "7": "AUYNrra3XmPg4FBZ5t3w1m9Nou1AQqGEs5RUPqMu9Bz1",
  "8": "Ewj5hZ7Z2HLojk3Du7RXcHnNtqBv8UrMCNxuukHA436J",
  "9": "CJgszcJTg5MKFrRa9pcty42ybaaoq13thh3a71Ep2G8t",
  "10": "7zZKJ9g5Bz4UZnAjY9DoiGzsV56JSTbx3ejgrzuupKQ2",
  "11": "Fq1rT9krzj6zMUJbDUraMEekHKcTdwyfYeYdbcAgN5qE",
  "12": "EqnXBCwU2eTCVTE6G82PnZ5ujKpxeCnGrGvaURYMyjvr",
  "13": "4oWVGXtCMA7QQi8KJaWD2sc89kapQ9yYybTwqD99LVhi",
  "14": "3P7aumi3e4ZALiMY6g9Ec7H6zpN4jfyRC5Hs1G5n4Nt4",
  "15": "5pwz2Fn3YGFFLzNVFAZZESfpjjjnA2k71Hd2mHPCX1ro"
}
</code></pre>
<p>There is no direct way to find all print editions of a given master edition, so this command uses the following heuristic:</p>
<ol>
<li>Derive the master edition account from the provided master_edition_mint</li>
<li>Decode the master edition NFT metadata account</li>
<li>Find the first verified creator of the master edition's metadata account</li>
<li>Snapshot all metadata accounts with the same first verified creator</li>
<li>Decode all the metadata accounts</li>
<li>Get the mint from each metadata account</li>
<li>Derive the edition for each mint account</li>
<li>Decode the edition and check if it's a master or a print</li>
<li>If it's a print and its parent is the master edition, add it to the list with its edition number as the key</li>
</ol>
<p>The user can optionally pass in a first verified creator to use instead of deriving it from the master edition.</p>
<p>Limitations:</p>
<p>For master editions that have had prints minted, and then had their first verified creator changed and then more prints minted, it will take multiple runs of this command with each of the first verified creators to find all the prints and the user will need to track them in separate files and merge them manually as it will overwrite the default output file each time.</p>
<h4 id="usage-29"><a class="header" href="#usage-29">Usage</a></h4>
<pre><code class="language-bash">metaboss snapshot prints -m &lt;MASTER_EDITION_MINT&gt; -c &lt;OPTIONAL_FIRST_VERIFIED_CREATOR&gt;
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="transfer"><a class="header" href="#transfer">Transfer</a></h2>
<p>Transfer Metaplex assets such as NFTs and pNFTs.</p>
<h3 id="transfer-asset"><a class="header" href="#transfer-asset">Transfer Asset</a></h3>
<pre><code>USAGE:
    metaboss transfer asset [OPTIONS] --mint &lt;mint&gt; --receiver &lt;receiver&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --amount &lt;amount&gt;          Amount of tokens to transfer, for NonFungible types this must be 1 [default: 1]
    -k, --keypair &lt;keypair&gt;        Path to the update_authority keypair file
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -m, --mint &lt;mint&gt;              Mint account of token to transfer
    -R, --receiver &lt;receiver&gt;      Receiving address, if different from update authority
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h3 id="usage-30"><a class="header" href="#usage-30">Usage</a></h3>
<pre><code class="language-bash">metaboss transfer asset --mint &lt;asset_mint_address&gt; --receiver &lt;receiver_wallet_address&gt;
</code></pre>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss transfer asset --mint 2KGQLgypChErw3kKPqG26uyUjVtZj8QSJg2AUNR7BWdM -R PanbgtcTiZ2PveV96t2FHSffiLHXXjMuhvoabUUKKm8
</code></pre>
<p><strong>Amount</strong></p>
<p>For non-fungible types such as <code>NonFungible</code> and <code>ProgrammableNonFungible</code>, the amount can only be <code>1</code> and that is the default value for the CLI argument if not specified.</p>
<p>For fungible types, specify the amount to be transferred with <code>--amount &lt;number&gt;</code>.</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="update"><a class="header" href="#update">Update</a></h2>
<p><strong>Warning: These commands modify your NFT and are for advanced users. Use with caution.</strong></p>
<p>Update various aspects of an NFT.</p>
<p>See also <strong>Set</strong> commands for updatable values that cannot be reversed (e.g. set immutable).</p>
<h3 id="update-data"><a class="header" href="#update-data">Update Data</a></h3>
<p>Update the <code>Data</code> struct on a NFT from a JSON file.</p>
<h4 id="usage-31"><a class="header" href="#usage-31">Usage</a></h4>
<pre><code class="language-bash">metaboss update data --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt; --new-data-file &lt;PATH_TO_NEW_DATA_FILE&gt;
</code></pre>
<p>The JSON file should include all the fields of the metadata <code>Data</code> struct and should match <code>creator</code> <code>verified</code> bools for existing creators. E.g. if your NFT was minted by the Metaplex Candy Machine program, and you wish to keep your candy machine as a verified creator <em>you must add the candy machine to your creators array with <code>verified</code> set to <code>true</code></em>.</p>
<p>Note: The on-chain <code>Data</code> struct is <em>different</em> than the external metadata stored at the link in the <code>uri</code> field so make you understand the difference before running this command.</p>
<p><strong>Make sure you understand how the Metaplex Metadata <code>Data</code> struct works and how this command will affect your NFT. Always test on <code>devnet</code> before running on mainnet.</strong></p>
<pre><code class="language-json">{
    "name": "FerrisCrab #4",
    "symbol": "FERRIS",
    "uri": "https://arweave.net/N36gZYJ6PEH8OE11i0MppIbPG4VXKV4iuQw1zaq3rls",
    "seller_fee_basis_points": 100,
    "creators": [
        {
            "address": "&lt;YOUR_CANDY_MACHINE_ID&gt;",
            "verified": true,
            "share": 0
        },
        {
            "address": "&lt;KEYPAIR_CREATOR&gt;",
            "verified": true,
            "share": 50
        },
        {
            "address": "42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB",
            "verified": false,
            "share": 50
        }
    ]
}
</code></pre>
<p>Outputs a TxId to the command line so you can check the result.</p>
<h3 id="update-data-all"><a class="header" href="#update-data-all">Update Data All</a></h3>
<p>Update the <code>Data</code> struct on a list of NFTs from JSON files.</p>
<h4 id="usage-32"><a class="header" href="#usage-32">Usage</a></h4>
<pre><code class="language-bash">metaboss update data-all --keypair &lt;PATH_TO_KEYPAIR&gt; --data-dir &lt;PATH_TO_DATA_DIR&gt;
</code></pre>
<p>Each JSON file in the data directory should include the mint account and all the fields of the metadata <code>Data</code> struct and should match <code>creator</code> <code>verified</code> bools for existing creators. E.g. if your NFT was minted by the Metaplex Candy Machine program, and you wish to keep your candy machine as a verified creator <em>you must add the candy machine to your creators array with <code>verified</code> set to <code>true</code></em>.</p>
<p>Note: The on-chain <code>Data</code> struct is <em>different</em> than the external metadata stored at the link in the <code>uri</code> field so make you understand the difference before running this command.</p>
<p><strong>Make sure you understand how the Metaplex Metadata <code>Data</code> struct works and how this command will affect your NFT. Always test on <code>devnet</code> before running on mainnet.</strong></p>
<pre><code class="language-json">{
    "mint": "CQNKXw1rw2eWwi812Exk4cKUjKuomZ2156STGRyXd2Mp",
    "name": "FerrisCrab #4",
    "symbol": "FERRIS",
    "uri": "https://arweave.net/N36gZYJ6PEH8OE11i0MppIbPG4VXKV4iuQw1zaq3rls",
    "seller_fee_basis_points": 100,
    "creators": [
        {
            "address": "&lt;YOUR_CANDY_MACHINE_ID&gt;",
            "verified": true,
            "share": 0
        },
        {
            "address": "&lt;KEYPAIR_CREATOR&gt;",
            "verified": true,
            "share": 50
        },
        {
            "address": "42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB",
            "verified": false,
            "share": 50
        }
    ]}
</code></pre>
<p>One approach to using <code>update data-all</code> is you can get all the JSON files using the <code>metaboss decode mint -L &lt;mint_list&gt; --full</code> command, and then write a script to modify the specific fields you want to change.
The file output from <code>decode mint</code> when using the <code>--full</code> option provides the correct format that metaboss expects because it uses the same field names as what <code>update data-all</code> expects.
The extra fields will be ignored.</p>
<p>Outputs a TxId to the command line so you can check the result.</p>
<h3 id="update-name"><a class="header" href="#update-name">Update Name</a></h3>
<p>Update the on-chain name of a NFT, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-33"><a class="header" href="#usage-33">Usage</a></h4>
<pre><code class="language-bash"> metaboss update name --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt; --new-name &lt;NEW_NAME&gt;
</code></pre>
<h3 id="update-symbol"><a class="header" href="#update-symbol">Update Symbol</a></h3>
<p>Update the on-chain symbol of a NFT, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-34"><a class="header" href="#usage-34">Usage</a></h4>
<pre><code class="language-bash"> metaboss update symbol --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt; --new-symbol &lt;NEW_SYMBOL&gt;
</code></pre>
<h3 id="update-symbol-all"><a class="header" href="#update-symbol-all">Update Symbol All</a></h3>
<p>Update the on-chain symbol of a list of NFTs, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-35"><a class="header" href="#usage-35">Usage</a></h4>
<pre><code class="language-bash"> metaboss update symbol-all --keypair &lt;PATH_TO_KEYPAIR&gt; -L &lt;PATH_TO_LIST_MINT_ADDRESSES&gt; --new-symbol &lt;NEW_SYMBOL&gt;
</code></pre>
<h3 id="update-creators"><a class="header" href="#update-creators">Update Creators</a></h3>
<p>Update the creators of a NFT, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-36"><a class="header" href="#usage-36">Usage</a></h4>
<pre><code class="language-bash">metaboss update creators -k &lt;PATH_TO_KEYPAIR&gt; -a &lt;MINT_ACCOUNT&gt; -n &lt;CREATOR1:SHARE:VERIFIED,CREATOR2:SHARE:VERIFIED&gt;
</code></pre>
<p>Creators should be a comma-delimited list of creator:share:verified. E.g.</p>
<p>Example:</p>
<pre><code class="language-bash">metaboss update creators -k ~/.config/solana/devnet.json -a 4rxTT8pKeYFrFgNBgTspBWVEnMnsAZGwChkjRUtP4Xpi -n 42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB:70:false,AVdBTNhDqYgXGaaVkqiaUJ1Yqa61hMiFFaVRtqwzs5GZ:30:false
</code></pre>
<p>Using the <code>--append</code> flag will set the shares to 0 and append to the existing creators list, otherwise the creators are overwritten with the list you pass in.</p>
<h3 id="update-creators-all"><a class="header" href="#update-creators-all">Update Creators All</a></h3>
<p>Same as update creators but takes a mint list instead of a single account.</p>
<pre><code class="language-bash">metaboss update creators-all  -k ~/.config/solana/devnet.json -L mints.json -n 42NevAWA6A8m9prDvZRUYReQmhNC3NtSZQNFUppPJDRB:70:false,AVdBTNhDqYgXGaaVkqiaUJ1Yqa61hMiFFaVRtqwzs5GZ:30:false
</code></pre>
<h3 id="update-uri"><a class="header" href="#update-uri">Update URI</a></h3>
<p>Update the metadata URI, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-37"><a class="header" href="#usage-37">Usage</a></h4>
<pre><code class="language-bash">metaboss update uri --keypair &lt;PATH_TO_KEYPAIR&gt; --account &lt;MINT_ACCOUNT&gt; --new-uri &lt;NEW_URI&gt;
</code></pre>
<h3 id="update-uri-all"><a class="header" href="#update-uri-all">Update URI All</a></h3>
<p>Update the metadata URI for a list of mint accounts, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-38"><a class="header" href="#usage-38">Usage</a></h4>
<pre><code class="language-bash">metaboss update uri-all --keypair &lt;PATH_TO_KEYPAIR&gt; --new-uris-file &lt;PATH_TO_JSON_FILE&gt;
</code></pre>
<pre><code class="language-json">[
    {
        "mint_account": "xZ43...",
        "new_uri": "https://arweave.net/N36gZYJ6PEH8OE11i0MppIbPG4VXKV4iuQw1zaq3rls"
    },
        {
        "mint_account": "71bk...",
        "new_uri": "https://arweave.net/FPGAv1XnyZidnqquOdEbSY6_ES735ckcDTdaAtI7GFw"
    }
]
</code></pre>
<h3 id="update-seller-fee-basis-points"><a class="header" href="#update-seller-fee-basis-points">Update Seller Fee Basis Points</a></h3>
<p>Update the seller fee basis points field on an NFT, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-39"><a class="header" href="#usage-39">Usage</a></h4>
<pre><code class="language-bash">metaboss update sfbp --keypair &lt;PATH_TO_KEYPAIR&gt; -a &lt;MINT_ACCOUNT&gt; -n &lt;NEW_SELLER_FEE_BASIS_POINTS_VALUE&gt;
</code></pre>
<h3 id="update-seller-fee-basis-points-all"><a class="header" href="#update-seller-fee-basis-points-all">Update Seller Fee Basis Points All</a></h3>
<p>Update the seller fee basis points field on a list of NFTs, keeping the rest of the <code>Data</code> struct the same.</p>
<h4 id="usage-40"><a class="header" href="#usage-40">Usage</a></h4>
<pre><code class="language-bash">metaboss update sfbp-all --keypair &lt;PATH_TO_KEYPAIR&gt; -L &lt;PATH_TO_MINT_LIST.json&gt; -n &lt;NEW_SELLER_FEE_BASIS_POINTS_VALUE&gt;
</code></pre>
<h3 id="update-rule-set"><a class="header" href="#update-rule-set">Update Rule Set</a></h3>
<p>Update a Metaplex pNFT's rule set pubkey.</p>
<pre><code>USAGE:
    metaboss update rule-set [OPTIONS] --mint &lt;mint&gt; --new-rule-set &lt;new-rule-set&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -k, --keypair &lt;keypair&gt;              Path to the creator's keypair file
    -l, --log-level &lt;log-level&gt;          Log level [default: off]
    -a, --mint &lt;mint&gt;                    Mint account of token to transfer
    -n, --new-rule-set &lt;new-rule-set&gt;    New rule set pubkey
    -r, --rpc &lt;rpc&gt;                      RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;              Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-41"><a class="header" href="#usage-41">Usage</a></h4>
<pre><code class="language-bash">metaboss update rule-set --mint &lt;MINT_ADDRESS&gt; --new-rule-set &lt;NEW_RULE_SET_PUBKEY&gt;
</code></pre>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss update rule-set --mint 2KGQLgypChErw3kKPqG26uyUjVtZj8QSJg2AUNR7BWdM -n D4YHFZPWASGpvBDJSUrPtqZqxTgTm7eL5rikBY9Y5dwf
</code></pre>
<h3 id="update-rule-set-all"><a class="header" href="#update-rule-set-all">Update Rule Set All</a></h3>
<p>Update the rule set of a batch of pNFTs.</p>
<pre><code>USAGE:
    metaboss update rule-set-all [OPTIONS] --new-rule-set &lt;new-rule-set&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;        Cache file
    -k, --keypair &lt;keypair&gt;              Path to the creator's keypair file
    -l, --log-level &lt;log-level&gt;          Log level [default: off]
    -L, --mint-list &lt;mint-list&gt;          Path to the mint list file
    -n, --new-rule-set &lt;new-rule-set&gt;    New rule set pubkey
    -R, --rate-limit &lt;rate-limit&gt;        Maximum number of requests per second [default: 10]
        --retries &lt;retries&gt;              Maximum retries: retry failed items up to this many times [default: 0]
    -r, --rpc &lt;rpc&gt;                      RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;              Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-42"><a class="header" href="#usage-42">Usage</a></h4>
<pre><code class="language-bash">metaboss update rule-set-all -L &lt;MINT_LIST&gt; -n &lt;NEW_RULE_SET_ADDRESS&gt;
</code></pre>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss update rule-set-all -L rule_set_mints.json -n 1CfDY5sYBnspaXvjnN3y9WRdaoD5v3HXrZDrWhjZZTN
</code></pre>
<h3 id="update-clear-rule-set"><a class="header" href="#update-clear-rule-set">Update Clear Rule Set</a></h3>
<p>Remove the rule set on a pNFT.</p>
<pre><code>USAGE:
    metaboss update clear-rule-set [OPTIONS] --mint &lt;mint&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -k, --keypair &lt;keypair&gt;        Path to the creator's keypair file
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -a, --mint &lt;mint&gt;              Mint account of token to transfer
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-43"><a class="header" href="#usage-43">Usage</a></h4>
<pre><code class="language-bash">metaboss update clear-rule-set --mint &lt;MINT_ADDRESS&gt;
</code></pre>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss update clear-rule-set --mint 2KGQLgypChErw3kKPqG26uyUjVtZj8QSJg2AUNR7BWdM
</code></pre>
<h3 id="update-clear-rule-set-all"><a class="header" href="#update-clear-rule-set-all">Update Clear Rule Set All</a></h3>
<p>Remove the rule set of a batch of pNFTs</p>
<pre><code>USAGE:
    metaboss update clear-rule-set-all [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;    Cache file
    -k, --keypair &lt;keypair&gt;          Path to the creator's keypair file
    -l, --log-level &lt;log-level&gt;      Log level [default: off]
    -L, --mint-list &lt;mint-list&gt;      Path to the mint list file
    -R, --rate-limit &lt;rate-limit&gt;    Maximum number of requests per second [default: 10]
        --retries &lt;retries&gt;          Maximum retries: retry failed items up to this many times [default: 0]
    -r, --rpc &lt;rpc&gt;                  RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;          Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-44"><a class="header" href="#usage-44">Usage</a></h4>
<pre><code class="language-bash">metaboss update clear-rule-set-all -L &lt;MINT_LIST&gt;
</code></pre>
<p>E.g.:</p>
<pre><code class="language-bash">metaboss update rule-set-all -L rule_set_mints.json
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="verify"><a class="header" href="#verify">Verify</a></h2>
<pre><code>Verify Creators

USAGE:
    metaboss verify [OPTIONS] &lt;SUBCOMMAND&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]

SUBCOMMANDS:
    creator        
    creator-all    
    help           Prints this message or the help of the given subcommand(s)
</code></pre>
<h3 id="creator"><a class="header" href="#creator">Creator</a></h3>
<p>Verify a creator in the metadata creators array by signing for it with its keypair. Creators can only verify themselves.</p>
<pre><code>USAGE:
    metaboss verify creator [OPTIONS] --mint &lt;mint&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -k, --keypair &lt;keypair&gt;        Path to the update_authority keypair file
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -a, --mint &lt;mint&gt;              Mint account of token to transfer
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-45"><a class="header" href="#usage-45">Usage</a></h4>
<pre><code class="language-bash">metaboss verify creator --account &lt;MINT_ACCOUNT&gt; --keypair &lt;CREATOR_KEYPAIR_FILE&gt;
</code></pre>
<h3 id="creator-all"><a class="header" href="#creator-all">Creator All</a></h3>
<p>Verify a creator in the metadata creators array of a list of metadata accounts, by signing for it with its keypair. Creators can only verify themselves.</p>
<pre><code>USAGE:
    metaboss verify creator-all [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;    Cache file
    -k, --keypair &lt;keypair&gt;          Path to the update_authority keypair file
    -l, --log-level &lt;log-level&gt;      Log level [default: off]
    -L, --mint-list &lt;mint-list&gt;      Mint list
    -R, --rate-limit &lt;rate-limit&gt;    Maximum number of requests per second [default: 10]
        --retries &lt;retries&gt;          Maximum retries: retry failed items up to this many times [default: 0]
    -r, --rpc &lt;rpc&gt;                  RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;          Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-46"><a class="header" href="#usage-46">Usage</a></h4>
<pre><code class="language-bash">metaboss verify creator-all --mint-list &lt;MINT_LIST_FILE&gt; --keypair &lt;CREATOR_KEYPAIR_FILE&gt;
</code></pre>
<h2 id="unverify"><a class="header" href="#unverify">Unverify</a></h2>
<pre><code>Unverify Creators

USAGE:
    metaboss unverify [OPTIONS] &lt;SUBCOMMAND&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]

SUBCOMMANDS:
    creator        
    creator-all    
    help           Prints this message or the help of the given subcommand(s)
</code></pre>
<h3 id="creator-1"><a class="header" href="#creator-1">Creator</a></h3>
<p>Unverify a creator in the metadata creators array by signing for it with its keypair. Creators can only unverify themselves.</p>
<pre><code>USAGE:
    metaboss unverify creator [OPTIONS] --mint &lt;mint&gt;

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -k, --keypair &lt;keypair&gt;        Path to the update_authority keypair file
    -l, --log-level &lt;log-level&gt;    Log level [default: off]
    -a, --mint &lt;mint&gt;              Mint account of token to transfer
    -r, --rpc &lt;rpc&gt;                RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;        Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-47"><a class="header" href="#usage-47">Usage</a></h4>
<pre><code class="language-bash">metaboss unverify creator --account &lt;MINT_ACCOUNT&gt; --keypair &lt;CREATOR_KEYPAIR_FILE&gt;
</code></pre>
<h3 id="creator-all-1"><a class="header" href="#creator-all-1">Creator All</a></h3>
<p>Unverify a creator in the metadata creators array of a list of metadata accounts, by signing for it with its keypair. Creators can only unverify themselves.</p>
<pre><code>USAGE:
    metaboss unverify creator-all [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --cache-file &lt;cache-file&gt;    Cache file
    -k, --keypair &lt;keypair&gt;          Path to the update_authority keypair file
    -l, --log-level &lt;log-level&gt;      Log level [default: off]
    -L, --mint-list &lt;mint-list&gt;      Mint list
    -R, --rate-limit &lt;rate-limit&gt;    Maximum number of requests per second [default: 10]
        --retries &lt;retries&gt;          Maximum retries: retry failed items up to this many times [default: 0]
    -r, --rpc &lt;rpc&gt;                  RPC endpoint url to override using the Solana config or the hard-coded default
    -T, --timeout &lt;timeout&gt;          Timeout to override default value of 90 seconds [default: 90]
</code></pre>
<h4 id="usage-48"><a class="header" href="#usage-48">Usage</a></h4>
<pre><code class="language-bash">metaboss unverify creator-all --mint-list &lt;MINT_LIST_FILE&gt; --keypair &lt;CREATOR_KEYPAIR_FILE&gt;
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h2 id="withdraw-deprecated"><a class="header" href="#withdraw-deprecated">Withdraw (Deprecated)</a></h2>
<p>Use Metaplex's <a href="https://docs.metaplex.com/sugar/introduction">Sugar</a> tool for withdrawing from candy machines instead.</p>
<div style="break-before: page; page-break-before: always;"></div><h1 id="priority-fees"><a class="header" href="#priority-fees">Priority Fees</a></h1>
<p>To specify priority fees on Metaboss transactions, use the <code>--priority/-p</code> flag. The current priority values are set at:</p>
<div class="table-wrapper"><table><thead><tr><th>Priority</th><th>MicroLamport Units</th></tr></thead><tbody>
<tr><td>"none"</td><td>20</td></tr>
<tr><td>"low"</td><td>20_000</td></tr>
<tr><td>"medium"</td><td>200_000</td></tr>
<tr><td>"high"</td><td>1_000_000</td></tr>
<tr><td>"max"</td><td>2_000_000</td></tr>
<tr><td>------------</td><td>--------------------</td></tr>
</tbody></table>
</div>
<p>The default value if no priority is specified is <code>None</code>.</p>
<p>The total amount spennt on priority fees per transaction is the microlamports multiplied by the compute units used. Metaboss simulates each transaction to determine the compute units required, and then uses that value or a default.</p>
<p>Setting higher levels of priority fees are unlikely to make a significant difference in the getting transactions confirmed, so it's recommended to use "none" or "low" until Solana network performance improves. However, higher levels are included to give users options.</p>
<p><strong>When running large batch updates be sure to consider the cost of priority fees for the level you set!! Medium, High and Max could cost significant amounts of SOL when updating thousands of NFTs.</strong></p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="contact"><a class="header" href="#contact">Contact</a></h2>
<p>Email: sam@vanderwaal.dev</p>
<p>Twitter: <a href="https://twitter.com/samvwaal">@samvwaal</a></p>
<p>Discord:</p>
<p>@archaeopteryx#7615</p>
<p><a href="https://discord.gg/n3H9rQ8s4R">Metaboss Discord Server</a></p>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->


                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">

            </nav>

        </div>




        <script>
            window.playground_copyable = true;
        </script>


        <script src="elasticlunr.min.js"></script>
        <script src="mark.min.js"></script>
        <script src="searcher.js"></script>

        <script src="clipboard.min.js"></script>
        <script src="highlight.js"></script>
        <script src="book.js"></script>

        <!-- Custom JS scripts -->

        <script>
        window.addEventListener('load', function() {
            window.setTimeout(window.print, 100);
        });
        </script>

    </div>
    </body>
</html>