-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathunsigned.tar.gz
More file actions
1514 lines (1343 loc) · 163 KB
/
unsigned.tar.gz
File metadata and controls
1514 lines (1343 loc) · 163 KB
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
Amanciojsilvjr= test ✓
test XBT
test XBT
test XBT
test XBT
test XBT
test XBT
/master/test">regression and integration tests</a>, written in Python. These tests can be run (if the <a href="/bitcoin/bitcoin/blob/master/test">test dependencies</a> are installed) with: <code>test/functional/test_runner.py</code></p>
<p dir="auto">The CI (Continuous Integration) systems make sure that every pull request is built for Windows, Linux, and macOS, and that unit/sanity tests are run automatically.</p>
<h3 dir="auto"><a id="user-content-manual-quality-assurance-qa-testing" class="anchor" aria-hidden="true" href="#manual-quality-assurance-qa-testing">
<svg class="octicon octicon-link" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg></a>Manual Quality Assurance (QA) Testing</h3>
<html itemscope itemtype="http://schema.org/SearchResultsPage" lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0" name="viewport">
<meta content="telephone=no" name="format-detection">
<meta content="address=no" name="format-detection">
<meta content="origin" name="referrer">
<meta content="notranslate" name="google">
<meta content="ArHAWg0ewNomlEl2qYgjNhbWCoCLddu7NoPE65peO0iKWjFvx5NV9kgsr1mikcOOFiAey315+lfuFUlsFERF7QoAAABgeyJvcmlnaW4iOiJodHRwczovL3d3dy5nb29nbGUuY29tOjQ0MyIsImZlYXR1cmUiOiJTcGVjdWxhdGlvblJ1bGVzUHJlZmV0Y2giLCJleHBpcnkiOjE2NTk0ODQ3OTl9" http-equiv="origin-trial">
<link href="/images/branding/product/1x/gsa_android_144dp.png" rel="icon">
<meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image">
<title>amanciojsilvjr - Pesquisa Google</title>
<script nonce="">(function(){
var b=window.addEventListener;window.addEventListener=function(a,c,d){"unload"!==a&&b(a,c,d)};}).call(this);(function(){window.google={kEI:'5qdQY-LnL4jM1sQPnKWfmAs',kEXPI:'31',kBL:'lHUN'};google.sn='web';google.kHL='pt-BR';})();(function(){
var f=this||self;var h,k=[];function l(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||h}function m(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b}
function n(a,b,c,d,g){var e="";c||-1!==b.search("&ei=")||(e="&ei="+l(d),-1===b.search("&lei=")&&(d=m(d))&&(e+="&lei="+d));d="";!c&&f._cshid&&-1===b.search("&cshid=")&&"slh"!==a&&(d="&cshid="+f._cshid);c=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+"&zx="+Date.now()+d;/^http:/i.test(c)&&"https:"===window.location.protocol&&(google.ml&&google.ml(Error("a"),!1,{src:c,glmm:1}),c="");return c};h=google.kEI;google.getEI=l;google.getLEI=m;google.ml=function(){return null};google.log=function(a,b,c,d,g){if(c=n(a,b,c,d,g)){a=new Image;var e=k.length;k[e]=a;a.onerror=a.onload=a.onabort=function(){delete k[e]};a.src=c}};google.logUrl=n;}).call(this);(function(){
google.y={};google.sy=[];google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.sx=function(a){google.sy.push(a)};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};google.bx=!1;google.lx=function(){};}).call(this);google.f={};(function(){
document.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"===c||"q"===c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName){a="1"===a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);(function(){google.hs={h:true,nhs:false,sie:false};})();(function(){google.c={ataf:false,btfi:false,cap:2500,fil:false,frt:true,gecoh:false,gl:false,lhc:false,logo:false,raf:false,sxs:false,taf:true,timl:false};})();(function(){
var f=this||self;var g=window.performance;function h(a,b,d,c){a.addEventListener?a.addEventListener(b,d,c||!1):a.attachEvent&&a.attachEvent("on"+b,d)}function k(a,b,d,c){"addEventListener"in a?a.removeEventListener(b,d,c||!1):a.attachEvent&&a.detachEvent("on"+b,d)};google.c.iim=google.c.iim||{};function l(a){a&&f.google.aft(a.target)}var m;function n(){k(document.documentElement,"load",m,!0);k(document.documentElement,"error",m,!0)};google.timers={};google.startTick=function(a){google.timers[a]={t:{start:Date.now()},e:{},m:{}}};google.tick=function(a,b,d){google.timers[a]||google.startTick(a);d=void 0!==d?d:Date.now();b instanceof Array||(b=[b]);for(var c=0,e;e=b[c++];)google.timers[a].t[e]=d};google.c.e=function(a,b,d){google.timers[a].e[b]=d};google.c.b=function(a,b){b=google.timers[b||"load"].m;b[a]&&google.ml(Error("a"),!1,{m:a});b[a]=!0};google.c.u=function(a,b){var d=google.timers[b||"load"],c=d.m;if(c[a]){c[a]=!1;for(a in c)if(c[a])return;google.csiReport(d,"load2"===b?"all2":"all")}else{b="";for(var e in c)b+=e+":"+c[e]+";";google.ml(Error("b"),!1,{m:a,b:!1===c[a],s:b})}};google.rll=function(a,b,d){function c(e){d(e);k(a,"load",c);k(a,"error",c)}h(a,"load",c);b&&h(a,"error",c)};f.google.aft=function(a){a.setAttribute("data-iml",String(Date.now()))};google.startTick("load");var p=google.timers.load;a:{var q=p.t;if(g){var r=g.timing;if(r){var t=r.navigationStart,u=r.responseStart;if(u>t&&u<=q.start){q.start=u;p.wsrt=u-t;break a}}g.now&&(p.wsrt=Math.floor(g.now()))}}google.c.b("pr","load");google.c.b("xe","load");function v(a){if("hidden"===document.visibilityState){google.c.fh=a;var b;window.performance&&window.performance.timing&&(b=Math.floor(window.performance.timing.navigationStart+a));google.tick("load","fht",b);return!0}return!1}
function w(a){v(a.timeStamp)&&k(document,"visibilitychange",w,!0)}google.c.fh=Infinity;h(document,"visibilitychange",w,!0);v(0);google.c.gl&&(m=l,h(document.documentElement,"load",m,!0),google.c.glu=n);}).call(this);(function(){
function g(){return window.performance&&window.performance.navigation&&window.performance.navigation.type};function k(a,b){if(!a||n(a))return 0;if(!a.getBoundingClientRect)return 1;var c=function(d){return d.getBoundingClientRect()};return r(a,c,b)?0:t(a,c)}function r(a,b,c){a:{for(var d=a;d&&void 0!==d;d=d.parentElement)if("hidden"===d.style.overflow||c&&"G-EXPANDABLE-CONTENT"===d.tagName&&"hidden"===getComputedStyle(d).getPropertyValue("overflow")){c=d;break a}c=null}if(!c)return!1;a=b(a);b=b(c);return a.bottom<b.top||a.top>=b.bottom||a.right<b.left||a.left>=b.right}
function n(a){return"none"===a.style.display?!0:document.defaultView&&document.defaultView.getComputedStyle?(a=document.defaultView.getComputedStyle(a),!!a&&("hidden"===a.visibility||"0px"===a.height&&"0px"===a.width)):!1}
function t(a,b){var c=b(a);a=c.left+window.pageXOffset;b=c.top+window.pageYOffset;var d=c.width;c=c.height;var e=0;if(0>=c&&0>=d)return e;var f=window.innerHeight||document.documentElement.clientHeight;0>b+c?e=2:b>=f&&(e=4);if(0>a+d||a>=(window.innerWidth||document.documentElement.clientWidth))e|=8;e||(e=1,b+c>f&&(e|=4));return e};var u=window.location,v="aft afti afts cbs cbt fht frt hct prt sct".split(" ");function w(a){return(a=u.search.match(new RegExp("[?&]"+a+"=(\\d+)")))?Number(a[1]):-1}
function x(a,b){var c=google.timers[b||"load"];b=c.m;if(!b||!b.prs){var d=g()?0:w("qsubts");0<d&&(b=w("fbts"),0<b&&(c.t.start=Math.max(d,b)));var e=c.t,f=e.start;b={wsrt:c.wsrt||0};if(f)for(var q=0,m;m=v[q++];){var l=e[m];l&&(b[m]=Math.max(l-f,0))}0<d&&(b.gsasrt=c.t.start-d);c=c.e;a="/gen_204?s="+google.sn+"&t="+a+"&atyp=csi&ei="+google.kEI+"&rt=";d="";for(h in b)a+=""+d+h+"."+b[h],d=",";for(var p in c)a+="&"+p+"="+c[p];window._cshid&&(a+="&cshid="+window._cshid);2===g()&&(a+="&bb=1");1===g()&&(a+=
"&r=1");if("gsasrt"in b){var h=w("qsd");0<h&&(a+="&qsd="+h)}google.kBL&&(a+="&bl="+google.kBL);h=a;navigator.sendBeacon?navigator.sendBeacon(h,""):google.log("","",h)}};function y(a){a&&google.tick("load","cbs",a);google.tick("load","cbt");x("cap")};var z="src bsrc url ll image img-url".split(" ");function A(a){for(var b=0;b<z.length;++b)if(a.getAttribute("data-"+z[b]))return!0;return!1}function B(a){var b=a.parentElement;if(b&&("G-IMG"===b.tagName||b.classList.contains("uhHOwf"))&&(b.style.height||b.style.width)){var c=b.getBoundingClientRect(),d=a.getBoundingClientRect();if(c.height<=d.height||c.width<=d.width)a=b}var e;return k(a,null==(e=google.c)?void 0:e.gecoh)}google.c.iim=google.c.iim||{};var C=window.innerHeight||document.documentElement.clientHeight,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=!0,L=!0,M=-1,N,P=google.c.sxs?"load2":"load";function Q(a,b,c,d){var e=google.timers[P].t[a];e&&(c||d&&null!=b&&b<e)||google.tick(P,a,b)}function R(a,b,c){"1"===a.getAttribute("data-frt")&&(Q("frt",c,!1,!0),++G,S());b&&(Q("aft",c,!1,!0),Q("afti",c,!1,!0),++I,S());google.c.timl&&Q("iml",c,!1,!0);++E;a.setAttribute("data-frt","0");(google.c.timl||b)&&T()}
function T(){var a=google.c.timl?E===D:H===I;!L&&a&&google.c.u("il",P)}
function S(){if(!K){var a=I===H,b=G===F;a&&b&&(google.c.e(P,"ima",String(H)),google.c.e(P,"imad",String(J)),google.c.e(P,"aftp",String(Math.round(M))),document.getElementsByClassName("Ib7Efc").length&&google.c.e(P,"ddl","1"),N&&clearTimeout(N),x(google.c.sxs?"aft2":"aft",P));"hidden"===document.visibilityState&&google.c.e(P,"hddn","1");if(!google.c.sxs&&null!==google.aftq&&(2===google.fevent||3===google.fevent?google.fevent:1)&((a?1:0)|(b?2:0))){google.tick("load","aftqf",Date.now());var c;for(a=
0;b=null==(c=google.aftq)?void 0:c[a++];)try{b()}catch(d){google.ml(d,!1)}google.aftq=null}}}function U(a,b){0===b||b&8||(a.setAttribute("data-frt","1"),++F)}if(0<google.c.cap&&!google.c.sxs)a:{var V=google.c.cap;if(window.performance&&window.performance.timing&&"navigationStart"in window.performance.timing){var W=window.performance.now(),X=V-W;if(0<X){N=setTimeout(y,X,Math.floor(window.performance.timing.navigationStart+W));break a}y()}N=void 0}google.c.wh=Math.floor(window.innerHeight||document.documentElement.clientHeight);google.c.e(P,"wh",String(google.c.wh));google.c.b("il",P);google.c.setup=function(a,b,c){var d=a.getAttribute("data-atf");if(d)return c=Number(d),b&&!a.hasAttribute("data-frt")&&U(a,c),c;var e="string"!==typeof a.src||!a.src,f=!!a.getAttribute("data-bsrc");d=!!a.getAttribute("data-deferred");var q=!d&&A(a);q&&a.setAttribute("data-lzy_","1");var m=B(a);a.setAttribute("data-atf",String(m));var l=!!(m&1);e=(e||a.complete)&&!d&&!f&&!(l&&q);f=!google.c.lhc&&Number(a.getAttribute("data-iml"))||0;++D;if(e&&!f||a.hasAttribute("data-noaft"))a.setAttribute("data-frt","0"),++E;else{var p=google.c.btfi&&m&4&&f&&M<C;if(p){var h=a.getBoundingClientRect().top+window.pageYOffset;!c||h<c?M=l?C:h:p=!1}l&&(++H,d&&++J);b&&U(a,m);p&&(Q("aft",f,!1,!0),Q("aftb",f,!1,!0));if(e&&f)R(a,l,google.c.btfi?0:f);else{l&&(!c||c>=C)&&(M=C);var O=a.src;google.rll(a,!0,function(){google.c.fil&&("1"===a.getAttribute("data-deferred")||q&&O&&O===a.src)?google.rll(a,!0,function(){R(a,l,Date.now())}):R(a,l,Date.now())})}}return m};google.c.ubr=function(a,b,c,d){google.c.taf&&M<C?(M=c||-1,Q("aft",b)):0>M&&(c&&(M=c),google.c.btfi&&Q("aft",b));a||Q("afts",b,!0);d||(Q("aft",b,!0),K&&!google.c.frt&&(K=!1,S()),a&&L&&(Q("prt",b),google.c.timl&&Q("iml",b,!0),L=!1,T(),google.c.setup=function(){return 0},google.c.ubr=function(){}))};}).call(this);(function(){
var b=[function(){google.tick&&google.tick("load","dcl")}];google.dclc=function(a){b.length?b.push(a):a()};function c(){for(var a=b.shift();a;)a(),a=b.shift()}window.addEventListener?(document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1)):window.attachEvent&&window.attachEvent("onload",c);}).call(this);(function(){
var b=[];google.jsc={xx:b,x:function(a){b.push(a)},mm:[],m:function(a){google.jsc.mm.length||(google.jsc.mm=a)}};}).call(this);(function(){
var e=this||self; 🅱️<p dir="auto">Changes should be tested by somebody other than the developer who wrote the code. This is especially important for large or high-risk changes. It is useful to add a test plan to the pull request description if testing the changes is not straightforward.</p>
<h2 dir="auto"><a id="user-content-translations" class="anchor" aria-hidden="true" href="#translations">
<svg class="octicon octicon-link" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg></a>Translations</h2>
<p dir="auto">Changes to translations as well as new translations can be submitted to <a href="https://www.transifex.com/bitcoin/bitcoin/" rel="nofollow">Bitcoin Core's Transifex page</a>.</p>
<p dir="auto">Translations are periodically pulled from Transifex and merged into the git repository. See the <a href="/bitcoin/bitcoin/blob/master/doc/translation_process.md">translation process</a> for details on how this works.</p>
<p dir="auto"><strong>Important</strong>: We do not accept translation changes as GitHub pull requests because the next pull from Transifex would automatically overwrite them again.</p>
</article>
</div>
</div>
</readme-toc> <html dir="ltr" lang="pt" style="overflow-y: scroll; overscroll-behavior-y: none;">
<head>
<style>input::placeholder { user-select: none; -webkit-user-select: none; } iframe { color-scheme: auto; }</style>
<style>@font-face {
font-family: TwitterChirpExtendedHeavy;
src: url(https://abs.twimg.com/fonts/v1/chirp-extended-heavy-web.woff2) format('woff2');
src: url(https://abs.twimg.com/fonts/v1/chirp-extended-heavy-web.woff) format('woff');
font-weight: 800;
font-style: 'normal';
font-display: 'swap';
}
@font-face {
font-family: TwitterChirp;
src: url(https://abs.twimg.com/fonts/v2/chirp-regular-web.woff2) format('woff2');
src: url(https://abs.twimg.com/fonts/v2/chirp-regular-web.woff) format('woff');
font-weight: 400;
font-style: 'normal';
font-display: 'swap';
}
@font-face {
font-family: TwitterChirp;
src: url(https://abs.twimg.com/fonts/v2/chirp-medium-web.woff2) format('woff2');
src: url(https://abs.twimg.com/fonts/v2/chirp-medium-web.woff) format('woff');
font-weight: 500;
font-style: 'normal';
font-display: 'swap';
}
@font-face {
font-family: TwitterChirp;
src: url(https://abs.twimg.com/fonts/v2/chirp-bold-web.woff2) format('woff2');
src: url(https://abs.twimg.com/fonts/v2/chirp-bold-web.woff) format('woff');
font-weight: 700;
font-style: 'normal';
font-display: 'swap';
}
@font-face {
font-family: TwitterChirp;
src: url(https://abs.twimg.com/fonts/v2/chirp-heavy-web.woff2) format('woff2');
src: url(https://abs.twimg.com/fonts/v2/chirp-heavy-web.woff) format('woff');
font-weight: 800;
font-style: 'normal';
font-display: 'swap';
}</style>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0,viewport-fit=cover">
<link rel="preconnect" href="//abs.twimg.com">
<link rel="dns-prefetch" href="//abs.twimg.com">
<link rel="preconnect" href="//api.twitter.com">
<link rel="dns-prefetch" href="//api.twitter.com">
<link rel="preconnect" href="//pbs.twimg.com">
<link rel="dns-prefetch" href="//pbs.twimg.com">
<link rel="preconnect" href="//t.co">
<link rel="dns-prefetch" href="//t.co">
<link rel="preconnect" href="//video.twimg.com">
<link rel="dns-prefetch" href="//video.twimg.com">
<link rel="preload" as="script" crossorigin="anonymous" href="https://abs.twimg.com/responsive-web/client-web/feature-switch-manifest.25c45e89.js" nonce="">
<link rel="preload" as="script" crossorigin="anonymous" href="https://abs.twimg.com/responsive-web/client-web/vendor.77b95e49.js" nonce="">
<link rel="preload" as="script" crossorigin="anonymous" href="https://abs.twimg.com/responsive-web/client-web/i18n/pt.897040c9.js" nonce="">
<link rel="preload" as="script" crossorigin="anonymous" href="https://abs.twimg.com/responsive-web/client-web/main.14c53429.js" nonce="">
<meta property="fb:app_id" content="2231777543">
<meta property="og:site_name" content="Twitter">
<meta name="google-site-verification" content="acYOOcR5z6puMzLn6hLDZI1nNHXPxt57OIstz1vnCV0">
<meta name="facebook-domain-verification" content="x6sdcc8b5ju3bh8nbm59eswogvg6t1">
<meta http-equiv="onion-location" content="https://twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion/">
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<link rel="alternate" hreflang="x-default" href="https://twitter.com/amanciojsilvjr">
<link rel="alternate" hreflang="en" href="https://twitter.com/amanciojsilvjr?lang=en">
<link rel="alternate" hreflang="ar" href="https://twitter.com/amanciojsilvjr?lang=ar">
<link rel="alternate" hreflang="ar-x-fm" href="https://twitter.com/amanciojsilvjr?lang=ar-x-fm">
<link rel="alternate" hreflang="bg" href="https://twitter.com/amanciojsilvjr?lang=bg">
<link rel="alternate" hreflang="bn" href="https://twitter.com/amanciojsilvjr?lang=bn">
<link rel="alternate" hreflang="ca" href="https://twitter.com/amanciojsilvjr?lang=ca">
<link rel="alternate" hreflang="cs" href="https://twitter.com/amanciojsilvjr?lang=cs">
<link rel="alternate" hreflang="da" href="https://twitter.com/amanciojsilvjr?lang=da">
<link rel="alternate" hreflang="de" href="https://twitter.com/amanciojsilvjr?lang=de">
<link rel="alternate" hreflang="el" href="https://twitter.com/amanciojsilvjr?lang=el">
<link rel="alternate" hreflang="en-GB" href="https://twitter.com/amanciojsilvjr?lang=en-GB">
<link rel="alternate" hreflang="es" href="https://twitter.com/amanciojsilvjr?lang=es">
<link rel="alternate" hreflang="eu" href="https://twitter.com/amanciojsilvjr?lang=eu">
<link rel="alternate" hreflang="fa" href="https://twitter.com/amanciojsilvjr?lang=fa">
<link rel="alternate" hreflang="fi" href="https://twitter.com/amanciojsilvjr?lang=fi">
<link rel="alternate" hreflang="fil" href="https://twitter.com/amanciojsilvjr?lang=fil">
<link rel="alternate" hreflang="fr" href="https://twitter.com/amanciojsilvjr?lang=fr">
<link rel="alternate" hreflang="ga" href="https://twitter.com/amanciojsilvjr?lang=ga">
<link rel="alternate" hreflang="gl" href="https://twitter.com/amanciojsilvjr?lang=gl">
<link rel="alternate" hreflang="gu" href="https://twitter.com/amanciojsilvjr?lang=gu">
<link rel="alternate" hreflang="ha" href="https://twitter.com/amanciojsilvjr?lang=ha">
<link rel="alternate" hreflang="he" href="https://twitter.com/amanciojsilvjr?lang=he">
<link rel="alternate" hreflang="hi" href="https://twitter.com/amanciojsilvjr?lang=hi">
<link rel="alternate" hreflang="hr" href="https://twitter.com/amanciojsilvjr?lang=hr">
<link rel="alternate" hreflang="hu" href="https://twitter.com/amanciojsilvjr?lang=hu">
<link rel="alternate" hreflang="id" href="https://twitter.com/amanciojsilvjr?lang=id">
<link rel="alternate" hreflang="ig" href="https://twitter.com/amanciojsilvjr?lang=ig">
<link rel="alternate" hreflang="it" href="https://twitter.com/amanciojsilvjr?lang=it">
<link rel="alternate" hreflang="ja" href="https://twitter.com/amanciojsilvjr?lang=ja">
<link rel="alternate" hreflang="kn" href="https://twitter.com/amanciojsilvjr?lang=kn">
<link rel="alternate" hreflang="ko" href="https://twitter.com/amanciojsilvjr?lang=ko">
<link rel="alternate" hreflang="mr" href="https://twitter.com/amanciojsilvjr?lang=mr">
<link rel="alternate" hreflang="ms" href="https://twitter.com/amanciojsilvjr?lang=ms">
<link rel="alternate" hreflang="nb" href="https://twitter.com/amanciojsilvjr?lang=nb">
<link rel="alternate" hreflang="nl" href="https://twitter.com/amanciojsilvjr?lang=nl">
<link rel="alternate" hreflang="pl" href="https://twitter.com/amanciojsilvjr?lang=pl">
<link rel="alternate" hreflang="pt" href="https://twitter.com/amanciojsilvjr?lang=pt">
<link rel="alternate" hreflang="ro" href="https://twitter.com/amanciojsilvjr?lang=ro">
<link rel="alternate" hreflang="ru" href="https://twitter.com/amanciojsilvjr?lang=ru">
<link rel="alternate" hreflang="sk" href="https://twitter.com/amanciojsilvjr?lang=sk">
<link rel="alternate" hreflang="sr" href="https://twitter.com/amanciojsilvjr?lang=sr">
<link rel="alternate" hreflang="sv" href="https://twitter.com/amanciojsilvjr?lang=sv">
<link rel="alternate" hreflang="ta" href="https://twitter.com/amanciojsilvjr?lang=ta">
<link rel="alternate" hreflang="th" href="https://twitter.com/amanciojsilvjr?lang=th">
<link rel="alternate" hreflang="tr" href="https://twitter.com/amanciojsilvjr?lang=tr">
<link rel="alternate" hreflang="uk" href="https://twitter.com/amanciojsilvjr?lang=uk">
<link rel="alternate" hreflang="ur" href="https://twitter.com/amanciojsilvjr?lang=ur">
<link rel="alternate" hreflang="vi" href="https://twitter.com/amanciojsilvjr?lang=vi">
<link rel="alternate" hreflang="yo" href="https://twitter.com/amanciojsilvjr?lang=yo">
<link rel="alternate" hreflang="zh" href="https://twitter.com/amanciojsilvjr?lang=zh">
<link rel="alternate" hreflang="zh-Hant" href="https://twitter.com/amanciojsilvjr?lang=zh-Hant">
<link rel="canonical" href="https://twitter.com/amanciojsilvjr">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Twitter">
<link rel="mask-icon" sizes="any" href="https://abs.twimg.com/responsive-web/client-web/icon-svg.168b89d9.svg" color="#1D9BF0">
<link rel="shortcut icon" href="//abs.twimg.com/favicons/twitter.2.ico">
<link rel="apple-touch-icon" sizes="192x192" href="https://abs.twimg.com/responsive-web/client-web/icon-ios.b1fc7279.png">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="Twitter">
<meta name="apple-mobile-web-app-status-bar-style" content="white">
<meta name="theme-color" content="#ffffff">
<meta http-equiv="origin-trial" content="AlpCmb40F5ZjDi9ZYe+wnr/V8MF+XmY41K4qUhoq+2mbepJTNd3q4CRqlACfnythEPZqcjryfAS1+ExS0FFRcA8AAABmeyJvcmlnaW4iOiJodHRwczovL3R3aXR0ZXIuY29tOjQ0MyIsImZlYXR1cmUiOiJMYXVuY2ggSGFuZGxlciIsImV4cGlyeSI6MTY1NTI1MTE5OSwiaXNTdWJkb21haW4iOnRydWV9">
<style>html,body{height: 100%;}</style>
<style id="react-native-stylesheet">[stylesheet-group="0"]{}
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);}
body{margin:0;}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}
input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-webkit-search-results-button,input::-webkit-search-results-decoration{display:none;}
[stylesheet-group="0.1"]{}
:focus:not([data-focusvisible-polyfill]){outline: none;}
[stylesheet-group="1"]{}
.css-1dbjc4n{-ms-flex-align:stretch;-ms-flex-direction:column;-ms-flex-negative:0;-ms-flex-preferred-size:auto;-webkit-align-items:stretch;-webkit-box-align:stretch;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-flex-basis:auto;-webkit-flex-direction:column;-webkit-flex-shrink:0;align-items:stretch;border:0 solid black;box-sizing:border-box;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-basis:auto;flex-direction:column;flex-shrink:0;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;min-height:0px;min-width:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;position:relative;z-index:0;}
.css-901oao{border:0 solid black;box-sizing:border-box;color:rgba(0,0,0,1.00);display:inline;font:14px -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space:pre-wrap;word-wrap:break-word;}
.css-16my406{color:inherit;font:inherit;white-space:inherit;}
[stylesheet-group="2"]{}
.r-13awgt0{-ms-flex:1 1 0%;-webkit-flex:1;flex:1;}
.r-4qtqp9{display:inline-block;}
.r-ywje51{margin-bottom:auto;margin-left:auto;margin-right:auto;margin-top:auto;}
.r-hvic4v{display:none;}
.r-1adg3ll{display:block;}
[stylesheet-group="2.2"]{}
.r-12vffkv>*{pointer-events:auto;}
.r-12vffkv{pointer-events:none!important;}
.r-14lw9ot{background-color:rgba(255,255,255,1.00);}
.r-1p0dtai{bottom:0px;}
.r-1d2f490{left:0px;}
.r-1xcajam{position:fixed;}
.r-zchlnj{right:0px;}
.r-ipm5af{top:0px;}
.r-yyyyoo{fill:currentcolor;}
.r-1xvli5t{height:1.25em;}
.r-dnmrzs{max-width:100%;}
.r-bnwqim{position:relative;}
.r-1plcrui{vertical-align:text-bottom;}
.r-lrvibr{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;}
.r-13gxpu9{color:rgba(29,161,242,1.00);}
.r-wy61xf{height:72px;}
.r-u8s1d{position:absolute;}
.r-1blnp2b{width:72px;}
.r-1ykxob0{top:60%;}
.r-q4m81j{text-align:center;}
.r-bcqeeo{min-width:0px;}
.r-qvutc0{word-wrap:break-word;}
.r-rjixqe{line-height:20px;}
.r-1qd0xha{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;}
.r-a023e6{font-size:15px;}
.r-16dba41{font-weight:400;}
.r-poiln3{font-family:inherit;}</style>
</head>
<body style="background-color: #FFFFFF;">
<noscript>
<style>
body {
-ms-overflow-style: scrollbar;
overflow-y: scroll;
overscroll-behavior-y: none;
}
.errorContainer {
background-color: #FFF;
color: #0F1419;
max-width: 600px;
margin: 0 auto;
padding: 10%;
font-family: Helvetica, sans-serif;
font-size: 16px;
}
.errorButton {
margin: 3em 0;
}
.errorButton a {
background: #1DA1F2;
border-radius: 2.5em;
color: white;
padding: 1em 2em;
text-decoration: none;
}
.errorButton a:hover,
.errorButton a:focus {
background: rgb(26, 145, 218);
}
.errorFooter {
color: #657786;
font-size: 80%;
line-height: 1.5;
padding: 1em 0;
}
.errorFooter a,
.errorFooter a:visited {
color: #657786;
text-decoration: none;
padding-right: 1em;
}
.errorFooter a:hover,
.errorFooter a:active {
text-decoration: underline;
}
#placeholder,
#react-root {
display: none !important;
}
body {
background-color: #FFF !important;
}
</style>
<div class="errorContainer">
<img width="46" height="38" srcset="https://abs.twimg.com/errors/logo46x38.png 1x, https://abs.twimg.com/errors/logo46x38@2x.png 2x" src="https://abs.twimg.com/errors/logo46x38.png" alt="Twitter">
<h1>O JavaScript não está disponível.</h1>
<p>Detectamos que o JavaScript está desabilitado neste navegador. Mude para um navegador compatível para continuar usando o twitter.com. Veja uma lista de navegadores compatíveis na Central de Ajuda.</p>
<p class="errorButton"><a href="https://help.twitter.com/using-twitter/twitter-supported-browsers">Central de Ajuda</a></p>
<p class="errorFooter"> <a href="https://twitter.com/tos">Termos de Serviço</a> <a href="https://twitter.com/privacy">Política de Privacidade</a> <a href="https://support.twitter.com/articles/20170514">Política de cookies</a> <a href="https://legal.twitter.com/imprint.html">Imprint</a> <a href="https://business.twitter.com/en/help/troubleshooting/how-twitter-ads-work.html?ref=web-twc-ao-gbl-adsinfo&utm_source=twc&utm_medium=web&utm_campaign=ao&utm_content=adsinfo">Informações de anúncios</a> © 2022 Twitter, Inc. </p>
</div>
</noscript>
<div id="react-root" style="height:100%;display:flex;">
<div class="css-1dbjc4n r-13awgt0 r-12vffkv">
<div class="css-1dbjc4n r-13awgt0 r-12vffkv">
<style>
@media (prefers-color-scheme: dark) {
#placeholder {
background-color: #000000
}
}
</style>
<div aria-label="Loading…" class="css-1dbjc4n r-14lw9ot r-1p0dtai r-1d2f490 r-1xcajam r-zchlnj r-ipm5af" id="placeholder">
<svg viewbox="0 0 24 24" aria-hidden="true" class="r-1p0dtai r-13gxpu9 r-4qtqp9 r-yyyyoo r-wy61xf r-1d2f490 r-ywje51 r-dnmrzs r-u8s1d r-zchlnj r-1plcrui r-ipm5af r-lrvibr r-1blnp2b">
<g>
<path d="M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0 .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112-.065 2.062 1.323 4.51 2.093 7.14 2.093 8.57 0 13.255-7.098 13.255-13.254 0-.2-.005-.402-.014-.602.91-.658 1.7-1.477 2.323-2.41z"></path>
</g>
</svg>
</div>
<div class="css-1dbjc4n r-hvic4v r-1d2f490 r-1xcajam r-zchlnj r-1ykxob0" id="ScriptLoadFailure">
<form action="" method="GET">
<div class="css-1dbjc4n r-1adg3ll r-q4m81j">
<div dir="auto" class="css-901oao r-1qd0xha r-a023e6 r-16dba41 r-rjixqe r-bcqeeo r-qvutc0" style="color:rgba(15,20,25,1.00)">
<span class="css-901oao css-16my406 r-poiln3 r-bcqeeo r-qvutc0">Something went wrong, but don’t fret — let’s give it another shot.</span>
</div>
<br>
<input type="hidden" name="failedScript" value="">
<input type="submit" value="Try again">
</div>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript" charset="utf-8" nonce="">window.__SCRIPTS_LOADED__ = {};(()=>{"use strict";var e,d,n,a,o,r={},i={};function t(e){var d=i[e];if(void 0!==d)return d.exports;var n=i[e]={id:e,loaded:!1,exports:{}};return r[e].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}t.m=r,t.amdO={},e=[],t.O=(d,n,a,o)=>{if(!n){var r=1/0;for(b=0;b<e.length;b++){for(var[n,a,o]=e[b],i=!0,l=0;l<n.length;l++)(!1&o||r>=o)&&Object.keys(t.O).every((e=>t.O[e](n[l])))?n.splice(l--,1):(i=!1,o<r&&(r=o));if(i){e.splice(b--,1);var s=a();void 0!==s&&(d=s)}}return d}o=o||0;for(var b=e.length;b>0&&e[b-1][2]>o;b--)e[b]=e[b-1];e[b]=[n,a,o]},t.n=e=>{var d=e&&e.__esModule?()=>e.default:()=>e;return t.d(d,{a:d}),d},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);t.r(o);var r={};d=d||[null,n({}),n([]),n(n)];for(var i=2&a&&e;"object"==typeof i&&!~d.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((d=>r[d]=()=>e[d]));return r.default=()=>e,t.d(o,r),o},t.d=(e,d)=>{for(var n in d)t.o(d,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:d[n]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((d,n)=>(t.f[n](e,d),d)),[])),t.u=e=>e+"."+{"bundle.NetworkInstrument":"82eb1bc","loader.HoverCard":"4d4eb8b","ondemand.Dropdown":"b3b0628","ondemand.ModelViewer":"44e23f0","loader.graphQLDarkReads":"11a5fbf","shared~bundle.Conversation":"b32ef7a","shared~loader.AudioDock~bundle.AudioSpacePeek~bundle.AudioSpaceAnalytics~bundle.AudioSpaceReport~bundle.Birdw":"b1367d7","loader.AudioDock":"83ef42f","loader.richScribeAction":"9f48b74","shared~loader.DashMenu~bundle.Account":"6dce6fe","loader.DashMenu":"4b40b31","shared~bundle.Articles~bundle.AudioSpaceDetail~bundle.AudioSpaceDiscovery~bundle.Birdwatch~bundle.BookmarkFol":"ee46db8","shared~bundle.AudioSpaceDetail~bundle.AudioSpaceDiscovery~bundle.Birdwatch~bundle.BookmarkFolders~bundle.Book":"096d5ae","shared~bundle.Birdwatch~bundle.Compose~bundle.RichTextCompose~bundle.Settings~bundle.Display~bundle.Ocf~bundl":"a35632c","shared~loader.DMDrawer~bundle.DirectMessages~bundle.Notifications":"18b731b","bundle.Notifications":"4438d2f","loader.NewTweetsPill":"74d5abb","loader.SideNav":"1aeda18","shared~loader.Typeahead~loader.DMDrawer~bundle.AudioSpaceDiscovery~bundle.Communities~bundle.Compose~bundle.R":"94f4a88","shared~loader.Typeahead~loader.DMDrawer~bundle.Communities~bundle.Compose~bundle.RichTextCompose~bundle.Deleg":"e40af6b","shared~loader.Typeahead~loader.DMDrawer~bundle.Communities~bundle.Delegate~bundle.DirectMessages~bundle.DMRic":"17927b9","shared~loader.Typeahead~bundle.Communities~bundle.Delegate~bundle.Ocf~bundle.LoggedOutHome~bundle.Search~bund":"cabc132","shared~loader.Typeahead~bundle.LoggedOutHome~bundle.Search":"2f8a719","loader.Typeahead":"3767136","loader.AppModules":"f162004","ondemand.BranchSdk":"e9a9d4e","shared~loader.DMDrawer~bundle.Compose~bundle.RichTextCompose~bundle.AccountVerification~bundle.SettingsProfil":"483dfe4","shared~loader.DMDrawer~bundle.Compose~bundle.RichTextCompose~bundle.DirectMessages~bundle.DMRichTextCompose~b":"429b459","shared~loader.DMDrawer~bundle.Compose~bundle.RichTextCompose~bundle.DMRichTextCompose~bundle.DirectMessages~b":"8423241","shared~loader.DMDrawer~bundle.DMRichTextCompose~bundle.DirectMessages":"723bf49","shared~loader.DMDrawer~bundle.DirectMessages~bundle.DMRichTextCompose":"19b6ddd","shared~loader.DMDrawer~bundle.DirectMessages":"087eb03","loader.DMDrawer":"0ce888f","bundle.AboutThisAd":"63c6e59","bundle.NotMyAccount":"b6efb41","bundle.Account":"e1bab1c","shared~bundle.MultiAccount~bundle.Birdwatch~bundle.BookmarkFolders~bundle.Communities~ondemand.ComposeSchedul":"23de6ca","bundle.MultiAccount":"35b4f70","bundle.Articles":"ddc8ae3","bundle.AudioSpaceDetail":"d656c85","shared~bundle.AudioSpacePeek~bundle.Communities~ondemand.CommunityHandler":"d084a40","bundle.AudioSpacePeek":"0d65488","bundle.AudioSpaceDiscovery":"9ff6660","bundle.AudioSpaceAnalytics":"30be2e2","bundle.AudioSpaceReport":"080ef90","shared~bundle.Birdwatch~ondemand.inlineTombstoneHandler~ondemand.tweetHandler":"963d0e8","shared~bundle.Birdwatch~bundle.Explore~bundle.Topics":"556a1fd","bundle.Birdwatch":"4621cf8","bundle.BookmarkFolders":"f329d0b","bundle.Bookmarks":"6cc0a81","src_app_screens_BrandedLikesPreview_index_js-modules_horizon-web_src_exports_Reaction_tempAss-ae55df":"135e5b1","bundle.LiveEvent":"03f6cb7","bundle.Collection":"fdac8ea","shared~bundle.Communities~bundle.ComposeMedia~bundle.SettingsProfile~bundle.Ocf~bundle.TwitterArticles~bundle":"bf44254","shared~bundle.Communities~bundle.UserLists":"f9bee14","bundle.Communities":"e10ffd0","shared~bundle.Compose~bundle.RichTextCompose~bundle.Ocf~bundle.PlainTextCompose":"2c8142c","shared~bundle.Compose~bundle.RichTextCompose~bundle.PlainTextCompose":"26d9b4d","shared~bundle.Compose~bundle.RichTextCompose":"6632b39","bundle.Compose":"a483b5b","shared~bundle.ComposeMedia~bundle.TwitterArticles":"f04f6d4","bundle.ComposeMedia":"b20d915","shared~ondemand.ComposeScheduling~bundle.SettingsProfessionalProfileLocationSpotlight":"5e83113","ondemand.ComposeScheduling":"f1987e8","shared~bundle.RichTextCompose~bundle.DMRichTextCompose~bundle.TwitterArticles~ondemand.RichText":"7c8fadf","bundle.RichTextCompose":"f884d6a","bundle.ConnectTab":"db4d4ed",src_app_screens_ConversationFollowNudge_index_js:"6d36010","bundle.CustomTimelineTools":"dc65b01","shared~bundle.Delegate~ondemand.SettingsRevamp~ondemand.SettingsInternals~ondemand.SensitiveMediaSettings~bun":"afe4814","shared~bundle.AccountVerification~bundle.BadgeViolationsNotification~bundle.SettingsRevamp":"d899356","shared~bundle.AccountVerification~bundle.TwitterArticles":"18c3364","bundle.AccountVerification":"29bd84c","shared~ondemand.SettingsInternals~bundle.SettingsRevamp~bundle.SettingsTransparency":"f9e941f","shared~ondemand.SettingsInternals~ondemand.SettingsRevamp":"97cd58a","ondemand.SettingsInternals":"4a61306","shared~ondemand.SettingsRevamp~ondemand.SettingsMonetization~ondemand.SettingsSuperFollows~bundle.SuperFollow":"2519d2f","shared~ondemand.SettingsRevamp~ondemand.SettingsMonetization":"b46dce7","ondemand.SettingsRevamp":"8a2e746","bundle.AccountAutomation":"713de14","shared~bundle.Settings~bundle.Display":"875a008","bundle.Settings":"0c52e58","bundle.SettingsInternals":"0bc3497","shared~bundle.SettingsProfile~bundle.Ocf":"8400485","bundle.SettingsProfile":"2f4fce5","ondemand.SensitiveMediaSettings":"3497acc","shared~ondemand.SettingsMonetization~ondemand.SettingsSuperFollows~bundle.SuperFollowsSubscribe":"945fc78","shared~ondemand.SettingsMonetization~ondemand.SettingsSuperFollows":"00e5ef0","ondemand.SettingsMonetization":"fe0b7e3","ondemand.SettingsSuperFollows":"4cf85fa","shared~bundle.DirectMessages~bundle.TweetMediaDetail~bundle.UserAvatar~bundle.UserNft":"eb6af14","shared~bundle.DMRichTextCompose~bundle.DirectMessages":"beaddf3","bundle.DirectMessages":"d76c1b5","bundle.DMRichTextCompose":"0d154e2","bundle.Display":"b2e2086","bundle.Explore":"67c863c","bundle.GenericTimeline":"9374f55","shared~bundle.GifSearch~bundle.TwitterArticles":"8a93f11","bundle.GifSearch":"765fd67","bundle.KeyboardShortcuts":"0d9bf7a","bundle.HomeTimeline":"9348559","bundle.Login":"7ec1e3a","bundle.SmsLogin":"c62b272","bundle.Logout":"01b874c","bundle.MomentMaker":"02586aa","ondemand.ReactBeautifulDnd":"e951c2f","bundle.NewsLanding":"b88c41a","bundle.Newsletters":"8f73f32","bundle.BadgeViolationsNotification":"15ad931","bundle.Twitterversary":"2838420","bundle.NotificationDetail":"57e7558","bundle.OAuth":"60345cc","bundle.Ocf":"0dddd12","bundle.Place":"9b667b0","bundle.SettingsProfessionalProfile":"2f4fa60","shared~bundle.SettingsProfessionalProfileProfileSpotlight~bundle.SettingsProfessionalProfileLocationSpotlight":"329a306","bundle.SettingsProfessionalProfileProfileSpotlight":"055692b","bundle.SettingsProfessionalProfileLocationSpotlight":"5ac25a3","bundle.SettingsProfessionalProfileMobileAppSpotlight":"e1172b6","bundle.ProfessionalHome":"f03c180","shared~bundle.ReaderMode~bundle.TweetMediaDetail~bundle.ImmersiveMediaViewer":"0786ef1","bundle.ReaderMode":"44ffcd3","bundle.Report":"eef03a1","shared~bundle.ReportCenter~bundle.SafetyCenter":"b17329d","bundle.ReportCenter":"12fc69a","bundle.SafetyCenter":"24464a6","shared~bundle.LoggedOutHome~bundle.Search":"359a055","bundle.LoggedOutHome":"07b4030","bundle.SafetyModeModal":"345dd9c","bundle.Search":"a7c8ae3","bundle.AdvancedSearch":"324aa26","bundle.SettingsRevamp":"676ced0","bundle.SettingsTransparency":"f2bddfc","bundle.Download":"afd5ca9","bundle.Topics":"08ba184","bundle.ExploreTopics":"39b6386","bundle.Trends":"965f9ae","bundle.TrustedFriendsManagement":"fd02e8d","bundle.TrustedFriendsRedirect":"0ebea01","bundle.Conversation":"62765bc","bundle.ConversationWithRelay":"2b8ec5e","bundle.TweetMediaTags":"612a05d","bundle.ConversationParticipants":"bf43e55","shared~bundle.TweetMediaDetail~bundle.ImmersiveMediaViewer":"e4a15b0","bundle.TweetMediaDetail":"6713738","bundle.ImmersiveMediaViewer":"9845280","bundle.TweetEditHistory":"aff37d0","bundle.QuoteTweetActivity":"1518d2b","bundle.TweetActivity":"47e3893","bundle.TweetActivityReactions":"15ad2dc","bundle.TwitterArticles":"a4cdcbe","bundle.TwitterBluePaymentFailureFix":"aa46ba5","bundle.TwitterBlue":"6504a13","bundle.Moment":"1da3ace","shared~bundle.UserLists~ondemand.HoverCard":"87cf13f","bundle.UserLists":"4e2245b","shared~ondemand.EditPinned~ondemand.EventSummaryHandler~ondemand.ListHandler":"c85516e","shared~ondemand.EditPinned~ondemand.ListHandler":"4ae6199","ondemand.EditPinned":"3601fe9","bundle.UserMoments":"117c778","bundle.UserAvatar":"4c2f5d3","bundle.UserNft":"ef821bc","bundle.UserRedirect":"5b8a6fb","bundle.SuperFollowsManage":"3391ba7","bundle.FollowerRequests":"f8334f4","bundle.ProfileRedirect":"41b0860","bundle.SuperFollowsSubscribe":"d71f548","bundle.UserFollowLists":"72d5a43","bundle.UserProfile":"201675f","ondemand.StaticAssets":"c7b0056","loader.LoggedOutNotifications":"f0d51f4","shared~ondemand.EmojiPickerData~ondemand.ParticipantReaction~ondemand.EmojiPicker":"a05a33c","shared~loaders.video.VideoPlayerDefaultUI~loaders.video.VideoPlayerHashtagHighlightUI~loaders.video.VideoPlay":"2278777","shared~loaders.video.VideoPlayerDefaultUI~loaders.video.VideoPlayerEventsUI":"1c9a9d8","loaders.video.VideoPlayerDefaultUI":"c6bf40b","loaders.video.VideoPlayerHashtagHighlightUI":"f4126b3","shared~ondemand.HoverCard~ondemand.topicLandingHeaderHandler":"30405ca","ondemand.HoverCard":"9bb0dd1","loader.AudioContextSpaceClip":"fa77584","loader.AudioContextSpaceMedia":"f36ccbf","loader.AudioContextVoiceMedia":"1181ea2","shared~ondemand.InlinePlayer~loader.AudioOnlyVideoPlayer~ondemand.immersiveTweetHandler":"fba53cc","ondemand.InlinePlayer":"5548a50","ondemand.video.PlayerHls1.2":"ec3acce","loaders.video.PlayerHls1.1":"d3acbf2","ondemand.emoji.ar":"c4515ee","ondemand.emoji.ar-x-fm":"79cb984","ondemand.emoji.bg":"153cc24","ondemand.emoji.bn":"3d5848e","ondemand.emoji.ca":"433f96b","ondemand.emoji.cs":"dfe42bc","ondemand.emoji.da":"3f52eea","ondemand.emoji.de":"db210be","ondemand.emoji.el":"4b51519","ondemand.emoji.en":"e28c053","ondemand.emoji.en-GB":"82e7756","ondemand.emoji.en-ss":"0b47096","ondemand.emoji.en-xx":"1813930","ondemand.emoji.es":"45ddee6","ondemand.emoji.eu":"a60c54c","ondemand.emoji.fa":"e8247cc","ondemand.emoji.fi":"1daecd9","ondemand.emoji.fil":"5060f69","ondemand.emoji.fr":"a7c4e3a","ondemand.emoji.ga":"a22b03f","ondemand.emoji.gl":"d2ac12c","ondemand.emoji.gu":"b758226","ondemand.emoji.ha":"de019b8","ondemand.emoji.he":"23b2430","ondemand.emoji.hi":"6085132","ondemand.emoji.hr":"a3c8ca8","ondemand.emoji.hu":"ecd33b8","ondemand.emoji.id":"e8df797","ondemand.emoji.ig":"5848835","ondemand.emoji.it":"f39638e","ondemand.emoji.ja":"504be20","ondemand.emoji.kn":"648b339","ondemand.emoji.ko":"e70fb0f","ondemand.emoji.mr":"4a7690e","ondemand.emoji.ms":"9300da7","ondemand.emoji.nb":"16989fd","ondemand.emoji.nl":"577c681","ondemand.emoji.pl":"64bdd48","ondemand.emoji.pt":"74f7678","ondemand.emoji.ro":"9394714","ondemand.emoji.ru":"3fafb41","ondemand.emoji.sk":"6678b28","ondemand.emoji.sr":"2486369","ondemand.emoji.sv":"9ae8739","ondemand.emoji.ta":"1f1d891","ondemand.emoji.th":"8d331d9","ondemand.emoji.tr":"7f81f1c","ondemand.emoji.uk":"640da18","ondemand.emoji.ur":"a24c935","ondemand.emoji.vi":"2042935","ondemand.emoji.yo":"80b576e","ondemand.emoji.zh":"e196306","ondemand.emoji.zh-Hant":"8002ed1","ondemand.ParticipantReaction":"e519e03","loader.AudioOnlyVideoPlayer":"50b5b36","loader.WideLayout":"2b68136","loader.AbsolutePower":"64ed833","ondemand.LottieWeb":"2a17e33","loader.TimelineRenderer":"4bd9685","ondemand.DividerHandler":"619fe40","ondemand.TombstonedEntryHandler":"2623c30","ondemand.ArticleHandler":"6bcc548","ondemand.collectionHeaderHandler":"fd2ade8","ondemand.CommunityHandler":"1ed8359","ondemand.EventSummaryHandler":"4bad705","ondemand.InlinePromptHandler":"300788c","ondemand.TransparentLabelHandler":"5b5340a","ondemand.LabelHandler":"ece14bf","ondemand.MomentAnnotationHandler":"0db1046","ondemand.MomentSummaryHandler":"6833af7","ondemand.newsArticleHandler":"69ec5fb","ondemand.newsPreviewHandler":"1c5bad7","ondemand.NotificationHandler":"41f9296","ondemand.ScoreEventSummaryHandler":"a6cd9e2","ondemand.TimelineCardHandler":"5a511a4","ondemand.topicHandler":"b9064b1","ondemand.TopicFollowPromptHandler":"8b9d8b3","ondemand.topicLandingHeaderHandler":"477931b","ondemand.TrendHandler":"8529e75","ondemand.VerticalGridItemHandler":"0bc64db","ondemand.MessageHandler":"a933a31","ondemand.PagedCarouselItemHandler":"578a6e9","ondemand.RelatedSearchHandler":"7b162fb","ondemand.selfThreadTweetComposerHandler":"01e9699","ondemand.spellingHandler":"07802c9","ondemand.ThreadHeaderHandler":"d3ae36e","ondemand.TileHandler":"ab274e3","ondemand.GapHandler":"7e08a0f","ondemand.IconLabelHandler":"be5d1a4","ondemand.ListHandler":"c4c397a","ondemand.newsEntriesGapHandler":"f024332","ondemand.promptHandler":"aa24e8a","ondemand.CarouselTimelineHandler":"49b0ff4","ondemand.ConversationGapHandler":"bb4ea80","ondemand.FooterLoader":"ffca5bc","ondemand.ModuleHeader":"5fa6c91","ondemand.ImpressionPlaceholderHandler":"cd28b46","ondemand.ShowMoreHandler":"925740e","ondemand.VerticalGridListHandler":"e190507","ondemand.VerticalGridRowHandler":"33fe149","shared~ondemand.inlineTombstoneHandler~ondemand.tweetHandler":"80d473a","ondemand.inlineTombstoneHandler":"c48f7d1","ondemand.tweetUnavailableTombstoneHandler":"2ffd58a","ondemand.disconnectedRepliesTombstoneHandler":"1232fd1","ondemand.tweetHandler":"ae90725","ondemand.unsupportedHandler":"884930a","ondemand.UserHandler":"2dec280","loader.ExploreSidebar":"1b2ed2c","loader.SignupModule":"10a581f","loader.FeedbackSheet":"2acf6e6","ondemand.RichText":"b89c253","loader.PushNotificationsPrompt":"c163874","ondemand.EmojiPicker":"c35240a","loader.MediaPreviewVideoPlayer":"2a9ce57","ondemand.inertPolyfill":"2df6945","loader.PreviewActions":"acec8e0","ondemand.IntentPrompt":"070826e","loader.TweetCurationActionMenu":"0d3593b","ondemand.PivotLabelHandler":"aa13213","loaders.video.VideoPlayerEventsUI":"01ad998","loader.MediaPickerWithPreview":"b7c734e","ondemand.countries-ar":"6e283ff","ondemand.countries-bg":"206e67c","ondemand.countries-bn":"ada13be","ondemand.countries-ca":"e604986","ondemand.countries-cs":"62a617d","ondemand.countries-da":"47fef47","ondemand.countries-de":"c87885b","ondemand.countries-el":"743a450","ondemand.countries-en-GB":"e489124","ondemand.countries-en":"b85f503","ondemand.countries-es":"9f0424c","ondemand.countries-eu":"4be663b","ondemand.countries-fa":"2039b08","ondemand.countries-fi":"9e8f5b2","ondemand.countries-fil":"cc13c01","ondemand.countries-fr":"86f67b2","ondemand.countries-ga":"cc0b5bc","ondemand.countries-gl":"37727cf","ondemand.countries-gu":"66ce688","ondemand.countries-he":"7932e03","ondemand.countries-hi":"37bb496","ondemand.countries-hr":"eaa486e","ondemand.countries-hu":"9708b88","ondemand.countries-id":"8cdcb1b","ondemand.countries-ig":"8e78c6c","ondemand.countries-it":"92d1618","ondemand.countries-ja":"ac1fb55","ondemand.countries-kn":"0eb939a","ondemand.countries-ko":"3fdfa56","ondemand.countries-mr":"3c855dc","ondemand.countries-ms":"ac88b1c","ondemand.countries-nb":"c797cb9","ondemand.countries-nl":"d058e2c","ondemand.countries-pl":"c7e5be1","ondemand.countries-pt":"ad59220","ondemand.countries-ro":"6618031","ondemand.countries-ru":"d9bb8d1","ondemand.countries-sk":"442e484","ondemand.countries-sr":"ddc59d5","ondemand.countries-sv":"5b1fa8a","ondemand.countries-ta":"4cbd0da","ondemand.countries-th":"13fabf4","ondemand.countries-tr":"0f542be","ondemand.countries-uk":"e174270","ondemand.countries-ur":"6eb865b","ondemand.countries-yo":"914c44a","ondemand.countries-zh-Hant":"2c03aa8","ondemand.countries-zh":"c1bd765","ondemand.EditBirthdate":"f2962ae","loader.AudioSpacebar":"d290b6d","ondemand.framerateTracking":"0e976ba","ondemand.qrcode":"c20b720","bundle.TimezoneSelector.timezones":"e30ca37","ondemand.immersiveTweetHandler":"6acff00","loader.ProfileClusterFollow":"3600b71","ondemand.Balloons":"b96ebd7","ondemand.ProfileSidebar":"9da3c6a","loaders.video.VideoPlayerPrerollUI":"36598cc","ondemand.CarouselScroller":"82df1d3","bundle.PlainTextCompose":"b8c1886","ondemand.DownvoteEducation":"987862e","ondemand.LeaveThisConversation":"bf89129","ondemand.CommunityTweetPinning":"f007522","ondemand.AudioSpacebar.Mocks":"643fe11"}[e]+"9.js",t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),t.o=(e,d)=>Object.prototype.hasOwnProperty.call(e,d),a={},o="@twitter/responsive-web:",t.l=(e,d,n,r)=>{if(a[e])a[e].push(d);else{var i,l;if(void 0!==n)for(var s=document.getElementsByTagName("script"),b=0;b<s.length;b++){var u=s[b];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==o+n){i=u;break}}i||(l=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,t.nc&&i.setAttribute("nonce",t.nc),i.setAttribute("data-webpack",o+n),i.src=e),a[e]=[d];var c=(d,n)=>{i.onerror=i.onload=null,clearTimeout(m);var o=a[e];if(delete a[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach((e=>e(n))),d)return d(n)},m=setTimeout(c.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=c.bind(null,i.onerror),i.onload=c.bind(null,i.onload),l&&document.head.appendChild(i)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.p="https://abs.twimg.com/responsive-web/client-web/",(()=>{var e={runtime:0};t.f.j=(d,n)=>{var a=t.o(e,d)?e[d]:void 0;if(0!==a)if(a)n.push(a[2]);else if("runtime"!=d){var o=new Promise(((n,o)=>a=e[d]=[n,o]));n.push(a[2]=o);var r=t.p+t.u(d),i=new Error;t.l(r,(n=>{if(t.o(e,d)&&(0!==(a=e[d])&&(e[d]=void 0),a)){var o=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;i.message="Loading chunk "+d+" failed.\n("+o+": "+r+")",i.name="ChunkLoadError",i.type=o,i.request=r,a[1](i)}}),"chunk-"+d,d)}else e[d]=0},t.O.j=d=>0===e[d];var d=(d,n)=>{var a,o,[r,i,l]=n,s=0;if(r.some((d=>0!==e[d]))){for(a in i)t.o(i,a)&&(t.m[a]=i[a]);if(l)var b=l(t)}for(d&&d(n);s<r.length;s++)o=r[s],t.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return t.O(b)},n=self.webpackChunk_twitter_responsive_web=self.webpackChunk_twitter_responsive_web||[];n.forEach(d.bind(null,0)),n.push=d.bind(null,n.push.bind(n))})()})(),window.__SCRIPTS_LOADED__.runtime=!0;
</script>
<script nonce="">(function () {
if (!window.__SCRIPTS_LOADED__['main']) {
document.getElementById('ScriptLoadFailure').style.display = 'block';
var criticalScripts = ["vendor","i18n","main"];
for (var i = 0; j < criticalScripts.length; i++) {
var criticalScript = criticalScripts[i];
if (!window.__SCRIPTS_LOADED__[criticalScript]) {
document.getElementsByName('failedScript')[0].value = criticalScript;
break;
}
}
}
})();</script>
</body>
</html>
</div>
<div data-view-component="true" class="Layout-sidebar">
<div class="BorderGrid BorderGrid--spacious" data-pjax="">
<div class="BorderGrid-row hide-sm hide-md">
<div class="BorderGrid-cell">
<h2 class="mb-3 h4">About</h2>
<p class="f4 my-3"> Bitcoin Core integration/staging tree </p>
<div class="my-3 d-flex flex-items-center">
<svg aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg>
<span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://bitcoincore.org/en/download" role="link" target="_blank" rel="noopener noreferrer nofollow" class="text-bold" href="https://bitcoincore.org/en/download">bitcoincore.org/en/download</a> </span>
</div>
<h3 class="sr-only">Topics</h3>
<div class="my-3">
<div class="f6">
<a data-ga-click="Topic
people lots of money.</p>
<h3 dir="auto"><a id="user-content-automated-testing" class="anchor" aria-hidden="true" href="#automated-testing">
<svg class="octicon octicon-link" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg></a>Automated Testing</h3>
<p dir="auto">Developers are strongly encouraged to write <a href="/bitcoin/bitcoin/blob/master/src/test/README.md">unit tests</a> for new code, and to submit new unit tests for old code. Unit tests can be compiled and run (assuming they weren't disabled in configure) with: <code>make check</code>. Further details on running and extending unit tests can be found in <a href="/bitcoin/bitcoin/blob/master/src/test/README.md">/src/test/README.md</a>.</p>
<p dir="auto">There are also <a href="/bitcoin/bitcoin/blob/master/test">regression and integration tests</a>, written in Python. These tests can be run (if the <a href="/bitcoin/bitcoin/blob/master/test">test dependencies</a> are installed) with: <code>test/functional/test_runner.py</code></p>
<p dir="auto">The CI (Continuous Integration) systems make sure that every pull request is built for Windows, Linux, and macOS, and that unit/sanity tests are run automatically.</p>
<h3 dir="auto"><a id="user-content-manual-quality-assurance-qa-testing" class="anchor" aria-hidden="true" href="#manual-quality-assurance-qa-testing">
<svg class="octicon octicon-link" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg></a>Manual Quality Assurance (QA) Testing</h3>
<p dir="auto">Changes should be tested by somebody other than the developer who wrote the code. This is especially important for large or high-risk changes. It is useful to add a test plan to the pull request description if testing the changes is not straightforward.</p>
<h2 dir="auto"><a id="user-content-translations" class="anchor" aria-hidden="true" href="#translations">
<svg class="octicon octicon-link" viewbox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg></a>Translations</h2>
<p dir="auto">Changes to translations as well as new translations can be submitted to <a href="https://www.transifex.com/bitcoin/bitcoin/" rel="nofollow">Bitcoin Core's Transifex page</a>.</p>
<p dir="auto">Translations are periodically pulled from Transifex and merged into the git repository. See the <a href="/bitcoin/bitcoin/blob/master/doc/translation_process.md">translation process</a> for details on how this works.</p>
<p dir="auto"><strong>Important</strong>: We do not accept translation changes as GitHub pull requests because the next pull from Transifex would automatically overwrite them again.</p>
</article>
</div>
</div>
</readme-toc>
</div>
<div data-view-component="true" class="Layout-sidebar">
<div class="BorderGrid BorderGrid--spacious" data-pjax="">
<div class="BorderGrid-row hide-sm hide-md">
<div class="BorderGrid-cell">
<h2 class="mb-3 h4">About</h2>
<p class="f4 my-3"> Bitcoin Core integration/staging tree </p>
<div class="my-3 d-flex flex-items-center">
<svg aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2">
<path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path>
</svg>
<span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://bitcoincore.org/en/download" role="link" target="_blank" rel="noopener noreferrer nofollow" class="text-bold" href="https://bitcoincore.org/en/download">bitcoincore.org/en/download</a> </span>
</div>
<h3 class="sr-only">Topics</h3>
<div class="my-3">
<div class="f6">
<a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:c-plus-plus" href="/topics/c-plus-plus" title="Topic: c-plus-plus" data-view-component="true" class="topic-tag topic-tag-link"> c-plus-plus </a>
<a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:cryptography" href="/topics/cryptography" title="Topic: cryptography" data-view-component="true" class="topic-tag topic-tag-link"> cryptography </a>
<a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:bitcoin" href="/topics/bitcoin" title="Topic: bitcoin" data-view-component="true" class="topic-tag topic-tag-link"> bitcoin </a>
<a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:p2p" href="/topics/p2p" title="Topic: p2p" data-view-component="true" class="topic-tag topic-tag-link"> p2p </a>
<a data-ga-click="Topic,
bitcoin/commit/d25699280af1ea45bebc884f63a10da7ea275ef9"><tt>d256992</tt></a> Verify PSBT inputs rather than check for fields being empty (Greg Sanders)
Pull request description:
In a few keys spots, PSBT finality is checked by looking for non-empty witness data.
This complicates a couple things:
1) Empty data can be valid in certain cases
2) User may be passed bogus final data by a counterparty during PSBT work happening, and end up with incorrect signatures that they may not be able to check in other contexts if the UTXO doesn't exist yet in chain/mempool, timelocks, etc.
On the whole I think these heavier checks are worth it in case someone is actually assuming the signatures are correct if our API is saying so.
ACKs for top commit:
achow101:
ACK <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/bitcoin/bitcoin/commit/e133264c5b1f72e94dcb9cebd85cdb523fcf8070/hovercard" href="https://github.com/bitcoin/bitcoin/commit/e133264c5b1f72e94dcb9cebd85cdb523fcf8070"><tt>e133264</tt></a>
Tree-SHA512: 9de4fbb0be1257b081781f5df908fd55666e3acd5c4e36beb3b3f2f5a6aed69ff77068c44cde6127e159e773293fd9ced4c0bb47e693969f337e74dc8af030da</pre>
<div class="d-flex flex-items-center">
<code class="border d-lg-none mt-2 px-1 rounded-2">2ac71d2</code>
</div>
</div>
<div class="flex-shrink-0">
<h2 class="sr-only">Git stats</h2>
<ul class="list-style-none d-flex">
<li class="ml-0 ml-md-3"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/bitcoin/bitcoin/commits/master" class="pl-3 pr-3 py-3 p-md-0 mt-n3 mb-n3 mr-n3 m-md-0 Link--primary no-underline no-wrap">
<svg text="gray" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history">
<path fill-rule="evenodd" d="M1.643 3.143L.427 1.927A.25.25 0 000 2.104V5.75c0 .138.112.25.25.25h3.646a.25.25 0 00.177-.427L2.715 4.215a6.5 6.5 0 11-1.18 4.458.75.75 0 10-1.493.154 8.001 8.001 0 101.6-5.684zM7.75 4a.75.75 0 01.75.75v2.992l2.028.812a.75.75 0 01-.557 1.392l-2.5-1A.75.75 0 017 8.25v-3.5A.75.75 0 017.75 4z"></path>
</svg> <span class="d-none d-sm-inline"> <strong>35,675</strong> <span aria-label="Commits on master" class="color-fg-muted d-none d-lg-inline"> commits </span> </span> </a> </li>
</ul>
</div>
</div>
</div>
<h2 id="files" class="sr-only">Files</h2>
<a class="d-none js-permalink-shortcut" data-hotkey="y" href="/bitcoin/bitcoin/tree/2ac71d20b2ebbfea76ee7369fddffbd78bd2c010">Permalink</a>
<div data-view-component="true" class="include-fragment-error flash flash-error flash-full py-2">
<svg aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"></path>
</svg> Failed to load latest commit information.
</div>
<div class="js-details-container Details" data-hpc="">
<div role="grid" aria-labelledby="files" class="Details-content--hidden-not-important js-navigation-container js-active-navigation-container d-md-block" data-pjax="">
<div class="sr-only" role="row">
<div role="columnheader">
Type
</div>
<div role="columnheader">
Name
</div>
<div role="columnheader" class="d-none d-md-block">
Latest commit message
</div>
<div role="columnheader">
Commit time
</div>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
unsigned.tar.gz
32164cfa7c06ead63305485653f37d74c6ada82d28b79f58e66faf6e72e130bb guix-build-859644b3c855/output/x86_64-w64-mingw32/bitcoin-859644b3c855-win64.zip
```
ACKs for top commit:
jarolrod:
re-ACK 859644b
hebasto:
ACK 859644b3c8550bb596fc8823747859e772dd493a, I've verified introduced changes in compiler flags, including the case with `DEBUG=1`.
Tree-SHA512: 6e181ced7e474a80aa191663b08dc594179a0593b8e2d1e4b7c8683794fd7de8d37faedb9a36997645ce6a2a6151e1461678b4db95170fc9b1fcadd6e1bddbe5" class="Link--secondary" href="/bitcoin/bitcoin/commit/a5f95bafcd4244ead51db84d73885ac46c383c2c">Merge</a> <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1357213605" data-permission-text="Title is private" data-url="https://github.com/bitcoin/bitcoin/issues/25964" data-hovercard-type="pull_request" data-hovercard-url="/bitcoin/bitcoin/pull/25964/hovercard" href="https://github.com/bitcoin/bitcoin/pull/25964">#25964</a><a data-pjax="true" title="Merge bitcoin/bitcoin#25964: build: fix mingw miniupnpc cflags
859644b3c8550bb596fc8823747859e772dd493a build: set D_WIN32_WINNT=0x0601 for mingw miniupnpc (fanquake)
8e2d93ff0fee36baf7fe88662c83f5b4f40f0add build: fix cflags passing for mingw miniupnpc (fanquake)
Pull request description:
Pulls in a patch I've upstreamed to miniupnpc so that we properly pass our cflags when building it for mingw. See https://github.com/miniupnp/miniupnp/pull/619. Also set `D_WIN32_WINNT` to `0x0601` to match libevent, configure etc. Previously it was being set to `0X501`.
Guix Build (x86_64 / arm64):
```bash
39a66c473a45b83ca85500b32ccf8f30d4ae80f965ca064566ee9fd84a51964b guix-build-859644b3c855/output/aarch64-linux-gnu/SHA256SUMS.part
7b0515e422f350cb23f4f0b2f87eaa1b30d1c80389da6f1cbe700794902c88e9 guix-build-859644b3c855/output/aarch64-linux-gnu/bitcoin-859644b3c855-aarch64-linux-gnu-debug.tar.gz
192253fb387a2216b6d63d47a18e34bfa284874488d7ebc6ba656ca76a905519 guix-build-859644b3c855/output/aarch64-linux-gnu
description:
In a few keys spots, PSBT finality is checked by looking for non-empty witness data.
This complicates a couple things:
1) Empty data can be valid in certain cases
2) User may be passed bogus final data by a counterparty during PSBT work happening, and end up with incorrect signatures that they may not be able to check in other contexts if the UTXO doesn't exist yet in chain/mempool, timelocks, etc.
On the whole I think these heavier checks are worth it in case someone is actually assuming the signatures are correct if our API is saying so.
ACKs for top commit:
achow101:
ACK e133264c5b1f72e94dcb9cebd85cdb523fcf8070
Tree-SHA512: 9de4fbb0be1257b081781f5df908fd55666e3acd5c4e36beb3b3f2f5a6aed69ff77068c44cde6127e159e773293fd9ced4c0bb47e693969f337e74dc8af030da" class="Link--secondary" href="/bitcoin/bitcoin/commit/2ac71d20b2ebbfea76ee7369fddffbd78bd2c010">: Verify PSBT inputs rather than check for fields being e…</a> </span>
</div>
<div role="gridcell" class="color-fg-muted text-right" style="width:100px;">
<time-ago datetime="2022-10-20T00:13:14Z" data-view-component="true" class="no-wrap" title="19 de out. de 2022 21:13 BRT">
42 minutes ago
</time-ago>
</div>
<a style="opacity:0;" class="position-absolute top-0 right-0 bottom-0 left-0 d-block d-sm-none" href="/bitcoin/bitcoin/tree/master/src"> src </a>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
<svg aria-label="Directory" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-directory-fill hx_color-icon-directory">
<path d="M1.75 1A1.75 1.75 0 000 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0016 13.25v-8.5A1.75 1.75 0 0014.25 3H7.5a.25.25 0 01-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75z"></path>
</svg>
</div>
<div role="rowheader" class="flex-auto min-width-0 col-md-2 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit"><a class="js-navigation-open Link--primary" title="test" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/bitcoin/bitcoin/tree/master/test">test</a></span>
</div>
<div role="gridcell" class="flex-auto min-width-0 d-none d-md-block col-5 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit markdown-title"> <a data-pjax="true" title="Merge bitcoin/bitcoin#25595: Verify PSBT inputs rather than check for fields being empty
e133264c5b1f72e94dcb9cebd85cdb523fcf8070 Add test for PSBT input verification (Greg Sanders)
d25699280af1ea45bebc884f63a10da7ea275ef9 Verify PSBT inputs rather than check for fields being empty (Greg Sanders)
Pull request description:navigator&&/Macintosh/.test(navigator.userAgent),J=function(){this._mouseEventsPrevented=!0};var aa=function(a){this.g=a;this.h=[]},K=function(a){for(var c=0;c<a.h.length;++c){var d=a.g,b=a.h[c];d.removeEventListener?d.removeEventListener(b.eventType,b.i,b.capture):d.detachEvent&&d.detachEvent("on"+b.eventType,b.i)}a.h=[]};
var L=e._jsa||{};L._cfc=void 0;L._aeh=void 0;
var N=function(){this.s=[];this.g=[];this.h=[];this.o={};this.j=null;this.l=[];M(this,"_custom")},P=function(a){return String.prototype.trim?a.trim():a.replace(/^\s+/,"").replace(/\s+$/,"")},fa=function(a,c){return function l(b,g){g=void 0===g?!0:g;var k=c;if("_custom"==k){k=b.detail;if(!k||!k._type)return;k=k._type}var m=k;"click"==m&&(G&&b.metaKey||!G&&b.ctrlKey||2==b.which||null==b.which&&4==b.button||b.shiftKey)?m="clickmod":"keydown"==m&&!b.a11ysc&&(m="maybe_click");var F=b.srcElement||b.target;k=R(m,b,F,"",null);for(var n,p,O,w=F;w&&w!=this;w=w.__owner||("#document-fragment"!==(null==(p=w.parentNode)?void 0:p.nodeName)?w.parentNode:null==(O=w.parentNode)?void 0:O.host)){var h=w;var u=n=void 0,C=h,t=m,ba=b,q=C.__jsaction;if(!q){var z=S(C,"jsaction");if(z){q=f[z];if(!q){q={};for(var D=z.split(ca),H=D?D.length:0,x=0;x<H;x++){var r=D[x];if(r){var y=r.indexOf(":"),Q=-1!=y,A=Q?P(r.substr(0,y)):da;r=Q?P(r.substr(y+1)):r;q[A]=r}}f[z]=q}z=q;q={};for(u in z){D=q;H=u;b:if(x=z[u],!(0<=x.indexOf(".")))for(A=
C;A;A=A.parentNode){r=A;y=r.__jsnamespace;void 0===y&&(y=S(r,"jsnamespace"),r.__jsnamespace=y);if(r=y){x=r+"."+x;break b}if(A==this)break}D[H]=x}C.__jsaction=q}else q=ea,C.__jsaction=q}u=q;"maybe_click"==t&&u.click?(n=t,t="click"):"clickkey"==t?t="click":"click"!=t||u.click||(t="clickonly");n=L._cfc&&u.click?L._cfc(C,ba,u,t,n):{eventType:n?n:t,action:u[t]||"",event:null,ignore:!1};if(n.ignore||n.action)break}n&&(k=R(n.eventType,n.event||b,F,n.action||"",h,k.timeStamp));k&&"touchend"==k.eventType&&
(k.event._preventMouseEvents=J);if(n&&n.action){if("mouseenter"==m||"mouseleave"==m||"pointerenter"==m||"pointerleave"==m)if(p=b.relatedTarget,!("mouseover"==b.type&&"mouseenter"==m||"mouseout"==b.type&&"mouseleave"==m||"pointerover"==b.type&&"pointerenter"==m||"pointerout"==b.type&&"pointerleave"==m)||p&&(p===h||B(h,p)))k.action="",k.actionElement=null;else{p={};for(var v in b)"function"!==typeof b[v]&&"srcElement"!==v&&"target"!==v&&(p[v]=b[v]);p.type="mouseover"==b.type?"mouseenter":"mouseout"==
b.type?"mouseleave":"pointerover"==b.type?"pointerenter":"pointerleave";p.target=p.srcElement=h;p.bubbles=!1;k.event=p;k.targetElement=h}}else k.action="",k.actionElement=null;h=k;a.j&&!h.event.a11ysgd&&(v=R(h.eventType,h.event,h.targetElement,h.action,h.actionElement,h.timeStamp),"clickonly"==v.eventType&&(v.eventType="click"),a.j(v,!0));if(h.actionElement||"maybe_click"==h.eventType){if(a.j){if(!h.actionElement||"A"!=h.actionElement.tagName||"click"!=h.eventType&&"clickmod"!=h.eventType||(b.preventDefault?b.preventDefault():b.returnValue=!1),(b=a.j(h))&&g){l.call(this,b,!1);return}}else{if((g=e.document)&&!g.createEvent&&g.createEventObject)try{var I=g.createEventObject(b)}catch(ja){I=b}else I=b;h.event=I;a.l.push(h)}L._aeh&&L._aeh(h)}}},R=function(a,c,d,b,g,l){return{eventType:a,event:c,targetElement:d,action:b,actionElement:g,timeStamp:l||Date.now()}},S=function(a,c){var d=null;"getAttribute"in a&&(d=a.getAttribute(c));return d},ha=function(a,c){return function(d){var b=a,g=c,l=!1;"mouseenter"==
b?b="mouseover":"mouseleave"==b?b="mouseout":"pointerenter"==b?b="pointerover":"pointerleave"==b&&(b="pointerout");if(d.addEventListener){if("focus"==b||"blur"==b||"error"==b||"load"==b||"toggle"==b)l=!0;d.addEventListener(b,g,l)}else d.attachEvent&&("focus"==b?b="focusin":"blur"==b&&(b="focusout"),g=E(d,g),d.attachEvent("on"+b,g));return{eventType:b,i:g,capture:l}}},M=function(a,c){if(!a.o.hasOwnProperty(c)){var d=fa(a,c),b=ha(c,d);a.o[c]=d;a.s.push(b);for(d=0;d<a.g.length;++d){var g=a.g[d];g.h.push(b.call(null,g.g))}"click"==c&&M(a,"keydown")}};N.prototype.i=function(a){return this.o[a]};var W=function(a,c){var d=new aa(c);a:{for(var b=0;b<a.g.length;b++)if(T(a.g[b].g,c)){c=!0;break a}c=!1}if(c)return a.h.push(d),d;U(a,d);a.g.push(d);V(a);return d},V=function(a){for(var c=a.h.concat(a.g),d=[],b=[],g=0;g<a.g.length;++g){var l=a.g[g];X(l,c)?(d.push(l),K(l)):b.push(l)}for(g=0;g<a.h.length;++g)l=a.h[g],X(l,c)?d.push(l):(b.push(l),U(a,l));a.g=b;a.h=d},U=function(a,c){var d=c.g;ia&&(d.style.cursor="pointer");for(d=0;d<a.s.length;++d)c.h.push(a.s[d].call(null,c.g))},Y=function(a,c){a.j=
c;a.l&&(0<a.l.length&&c(a.l),a.l=null)},X=function(a,c){for(var d=0;d<c.length;++d)if(c[d].g!=a.g&&T(c[d].g,a.g))return!0;return!1},T=function(a,c){for(;a!=c&&c.parentNode;)c=c.parentNode;return a==c},ia="undefined"!=typeof navigator&&/iPhone|iPad|iPod/.test(navigator.userAgent),ca=/\s*;\s*/,da="click",ea={};var Z=new N;W(Z,window.document.documentElement);M(Z,"click");M(Z,"focus");M(Z,"blur");M(Z,"mousedown");M(Z,"mouseenter");M(Z,"mouseleave");M(Z,"mouseout");M(Z,"mouseover");M(Z,"mouseup");M(Z,"touchmove");M(Z,"dragover");M(Z,"dragenter");M(Z,"dragleave");M(Z,"drop");M(Z,"dragstart");M(Z,"dragend");M(Z,"change");M(Z,"contextmenu");M(Z,"beforeinput");M(Z,"input");M(Z,"keydown");M(Z,"keypress");M(Z,"keyup");M(Z,"error");M(Z,"load");M(Z,"touchstart");M(Z,"touchend");M(Z,"touchcancel");M(Z,"paste");(function(a){google.jsad=function(c){Y(a,c)};google.jsaac=function(c){return W(a,c)};google.jsarc=function(c){K(c);for(var d=!1,b=0;b<a.g.length;++b)if(a.g[b]===c){a.g.splice(b,1);d=!0;break}if(!d)for(d=0;d<a.h.length;++d)if(a.h[d]===c){a.h.splice(d,1);break}V(a)}})(Z);e.gws_wizbind=function(a){return{trigger:function(c){var d=a.i(c.type);d||(M(a,c.type),d=a.i(c.type));var b=c.target||c.srcElement;d&&d.call(b.ownerDocument.documentElement,c)},bind:function(c){Y(a,c)}}}(Z);}).call(this);(function(){
google.ctpacw={};google.ctpacw.cm=function(a){a.ping&&(a.href=a.ping,a.removeAttribute("ping"))};}).call(this);(function(){
window.document.documentElement.addEventListener("contextmenu",function(a){a:{for(a=a.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName&&"1"===a.getAttribute("data-ctpacw"))break a;a=null}a&&google.ctpacw.cm(a);return!0},!0);}).call(this);(function(){window._skwEvts=[];})();(function(){window.google.erd={jsr:1,bv:1670,sd:true,de:true};})();(function(){var sdo=false;var mei=10;
var h=this||self;var k,l=null!=(k=h.mei)?k:1,n,p=null!=(n=h.sdo)?n:!0,q=0,r,t=google.erd,v=t.jsr;google.ml=function(a,b,d,m,e){e=void 0===e?2:e;b&&(r=a&&a.message);if(google.dl)return google.dl(a,e,d),null;if(0>v){window.console&&console.error(a,d);if(-2===v)throw a;b=!1}else b=!a||!a.message||"Error loading script"===a.message||q>=l&&!m?!1:!0;if(!b)return null;q++;d=d||{};b=encodeURIComponent;var c="/gen_204?atyp=i&ei="+b(google.kEI);google.kEXPI&&(c+="&jexpid="+b(google.kEXPI));c+="&srcpg="+b(google.sn)+"&jsr="+b(t.jsr)+"&bver="+b(t.bv);var f=a.lineNumber;void 0!==f&&(c+="&line="+f);var g=
a.fileName;g&&(0<g.indexOf("-extension:/")&&(e=3),c+="&script="+b(g),f&&g===window.location.href&&(f=document.documentElement.outerHTML.split("\n")[f],c+="&cad="+b(f?f.substring(0,300):"No script found.")));c+="&jsel="+e;for(var u in d)c+="&",c+=b(u),c+="=",c+=b(d[u]);c=c+"&emsg="+b(a.name+": "+a.message);c=c+"&jsst="+b(a.stack||"N/A");12288<=c.length&&(c=c.substr(0,12288));a=c;m||google.log(0,"",a);return a};window.onerror=function(a,b,d,m,e){r!==a&&(a=e instanceof Error?e:Error(a),void 0===d||"lineNumber"in a||(a.lineNumber=d),void 0===b||"fileName"in a||(a.fileName=b),google.ml(a,!1,void 0,!1,"SyntaxError"===a.name||"SyntaxError"===a.message.substring(0,11)||-1!==a.message.indexOf("Script error")?3:0));r=null;p&&q>=l&&(window.onerror=null)};})();
var h="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a},k=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("a");},l=k(this),m=function(a,b){if(b)a:{var c=l;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in
c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&h(c,a,{configurable:!0,writable:!0,value:b})}};m("String.prototype.startsWith",function(a){return a?a:function(b,c){if(null==this)throw new TypeError("The 'this' value for String.prototype.startsWith must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype.startsWith must not be a regular expression");var d=this+"";b+="";var e=d.length,g=b.length;c=Math.max(0,Math.min(c|0,d.length));for(var f=0;f<g&&c<e;)if(d[c++]!=b[f++])return!1;return f>=g}});google.arwt=function(a){a.href=document.getElementById(a.id.substring(a.id.startsWith("vcs")?3:1)).href;return!0};(function(){google.eufsv=true;(function(){
var e=function(a){var c=a.url;a=a.l;this.i=c;this.o=a;a=/[?&]dsh=1(&|$)/.test(c);this.h=!a&&/[?&]ae=1(&|$)/.test(c);this.s=!a&&/[?&]ae=2(&|$)/.test(c);if((this.g=/[?&]adurl=([^&]*)/.exec(c))&&this.g[1]){try{var b=decodeURIComponent(this.g[1])}catch(f){b=null}this.j=b}},l=function(a,c){return a.h&&a.j||a.s?1==c?a.h?a.j:k(a,"&dct=1"):2==c?k(a,"&ri=2"):k(a,"&ri=16"):a.i},k=function(a,c){return a.g?a.i.slice(0,a.g.index)+c+a.i.slice(a.g.index):a.i+c},n=function(a){a=a.o;var c=encodeURIComponent,b="";a.platform&&(b+="&uap="+c(a.platform));a.platformVersion&&(b+="&uapv="+c(a.platformVersion));a.uaFullVersion&&(b+="&uafv="+c(a.uaFullVersion));a.architecture&&(b+="&uaa="+c(a.architecture));a.model&&(b+="&uam="+c(a.model));a.bitness&&(b+="&uab="+c(a.bitness));a.fullVersionList&&(b+="&uafvl="+c(a.fullVersionList.map(function(f){return c(f.brand)+";"+c(f.version)}).join("|")));"undefined"!==typeof a.wow64&&(b+="&uaw="+Number(a.wow64));return b};var r=function(a,c){this.g=c===q?a:""};r.prototype.toString=function(){return this.g.toString()};r.prototype.i=!0;r.prototype.h=function(){return this.g.toString()};var t=function(a){return a instanceof r&&a.constructor===r?a.g:"type_error:SafeUrl"},v=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i,q={},w=new r("about:invalid#zClosurez",q);var x=/^((market|itms|intent|itms-appss):\/\/)/i;
var A;try{new URL("s://g"),A=!0}catch(a){A=!1}var B=A;var C=function(a){this.A=a};function D(a){return new C(function(c){return c.substr(0,a.length+1).toLowerCase()===a+":"})}var E=[D("data"),D("http"),D("https"),D("mailto"),D("ftp"),new C(function(a){return/^[^:]*([/?#]|$)/.test(a)})];function F(a,c){var b=/[?&]adurl=/.exec(c);return b?""+c.slice(0,b.index+1)+a+"&"+c.slice(b.index+1):""+c+(-1===c.indexOf("?")?"?":"&")+a}function G(a,c){a=a.href;var b=/[?&]nis=([^&]*)/.exec(a);return b&&b[1]===c?a:b?a.replace(/([?&])nis=([^&]*)/,function(f,h){return h+"nis="+c}):F("nis="+c,a)}function H(){var a;return!(null==(a=document.featurePolicy)||!a.allowedFeatures().includes("attribution-reporting"))};var I=new function(){var a={v:google.eufsv},c=this;a=(void 0===a?{}:a).v;this.g=null;a&&navigator.userAgentData&&navigator.userAgentData.getHighEntropyValues&&(a=navigator.userAgentData.getHighEntropyValues("platform platformVersion uaFullVersion architecture model bitness fullVersionList wow64".split(" ")))&&a.then(function(b){c.g=b})};google.ausb=function(a){if(!a)return google.ml(Error("a"),!1),!0;if(a.hasAttribute("data-impdclcc"))try{var c=a.hasAttribute("attributionsourceid")&&a.hasAttribute("attributeon")&&a.hasAttribute("attributiondestination")?"2":a.hasAttribute("attributionsrc")?H()?"6":"5":H()?"7":"8";var b=G(a,c);var f=void 0===f?E:f;a:{c=f;c=void 0===c?E:c;for(f=0;f<c.length;++f){var h=c[f];if(h instanceof C&&h.A(b)){var g=new r(b,q);break a}}g=void 0}var d=g||w;if(d instanceof r)var m=t(d);else{b:if(B){try{var J=new URL(d)}catch(y){var p=
"https:";break b}p=J.protocol}else c:{var z=document.createElement("a");try{z.href=d}catch(y){p=void 0;break c}var u=z.protocol;p=":"===u||""===u?"https:":u}m="javascript:"!==p?d:void 0}d=m;void 0!==d&&(a.href=d)}catch(y){}a.getAttribute("data-sbv2")&&(a.hasAttribute("data-ohref")?d=a.getAttribute("data-ohref"):(d=a.href,a.setAttribute("data-ohref",d)),g=d,b={l:I.g},b=new e({url:g,l:(void 0===b?{}:b).l}),b.h&&b.j||b.s?navigator.sendBeacon?(g=navigator,h=g.sendBeacon,m="&act=1&ri=1",b.h&&b.o&&(m+=
n(b)),b=h.call(g,k(b,m),"")?l(b,1):l(b,2)):b=l(b,0):b=g,b=b instanceof r||!x.test(b)?b:new r(b,q),d!=b&&(b instanceof r?d=b:(d=b,d instanceof r||(d="object"==typeof d&&d.i?d.h():String(d),v.test(d)||(d="about:invalid#zClosurez"),d=new r(d,q))),a.href=t(d)));return!0};}).call(this);})();(function(){
var c=this||self;function d(a){for(;a&&a!=document.documentElement;a=a.parentElement)if("A"==a.tagName)return a;return null}function e(a){if(a=d(a.target))switch(a.getAttribute("data-agdh")){case "arwt":google.arwt(a);break;case "fvd3vc":c.J4LCUe(a);break;case "EdKoMd":(0,google.f.LmvwCb)(a)}return!0};window.document.documentElement.addEventListener("mousedown",e,!0);window.document.documentElement.addEventListener("touchstart",e,!0);window.document.documentElement.addEventListener("click",function(a){var b=d(a.target);if(b)switch(b.getAttribute("data-agch")){case "ausb":google.ausb(b);break;case "HJ3bqe":window.YvikHb(a,b);break;case "cqUJI":(0,google.f.DfwaCb)(b)}return!0},!0);}).call(this);</script>
<style>html,body,h1{font-family:Roboto,Helvetica Neue,Arial,sans-serif}head,body,head *,body *{max-height:999999px}body,h1{font-size:small;}h3{font-weight:normal;margin:0;padding:0;font-size:20px;}body{margin:0;background:#fff;color:#4d5156;}a{color:#1558d6;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,.1)}a:visited{color:#681da8}cite,cite a:link,cite a:visited{color:#3c4043;font-style:normal}button{margin:0}ol li{list-style:none}ol,ul,li{margin:0;padding:0}em{font-weight:bold;font-style:normal}.aCOpRe em,.yXK7lf em{color:#3c4043;font-weight:normal}.aCOpRe a em{color:inherit}@-webkit-keyframes qs-timer {0%{}}html:not(.zAoYTe) [tabindex]{outline:0}html:not(.zAoYTe) [href],html:not(.zAoYTe) button,html:not(.zAoYTe) iframe,html:not(.zAoYTe) input,html:not(.zAoYTe) select,html:not(.zAoYTe) textarea{outline:0}html:not(.zAoYTe) .F0azHf{outline:0}.z1asCe{display:inline-block;fill:currentColor;height:24px;line-height:24px;position:relative;width:24px}.z1asCe svg{display:block;height:100%;width:100%}.iUh30{font-size:12px;white-space:nowrap;}.f{color:#3c4043;}.std{font-family:Roboto,Helvetica Neue,Arial,sans-serif;font-size:small}.UmPJJf{color:#202124;font-weight:400;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.UmPJJf{color:#1558d6}.bOFGdf{color:#202124;font-family:Roboto,Helvetica Neue,Arial,sans-serif;font-weight:400;line-height:20px}.bOFGdf a{color:inherit}.gsrt,.gsmt{font-family:Google Sans,Roboto,Helvetica Neue,Arial,sans-serif;font-weight:400}.zbA8Me{font-weight:bold;font-size:12px;line-height:12px;letter-spacing:0.3px;text-transform:uppercase}#rso h3,#topstuff h3{font-size:20px}#rso,#topstuff{font-size:medium}#botstuff,#taw,#bottomads{font-size:14px}.iUh30{max-width:95%;}.FzvWSb{margin-bottom:5px}.vk_c{position:relative;line-height:normal}#rhs .fIcnad{border:none;margin-left:0}.vk_c .vk_c{border-radius:0;box-shadow:none;background-color:transparent;border:0;box-shadow:none;margin:0;padding:0;position:static}.vkc_np{margin-left:-16px;margin-right:-16px}.WIDPrb{padding-left:16px}.iiFzhd{padding-right:16px}.feGi6e{border-top:1px solid #dadce0;padding:20px 16px;display:block}.V5niGc{border-bottom:1px solid #dadce0;display:block;padding:20px 16px;background-color:#fff}.card-section{display:block;margin:0;padding:11px 16px 11px}.card-section~.card-section:not(.rQUFld){border-top:1px solid #dadce0}.card:not(:empty),.mnr-c:not(:empty){background-color:#fff;margin:0 0 8px 0;box-shadow:0 0 0 1px #ebedef;border-radius:0}.mnr-c .mnr-c{background-color:transparent;box-shadow:none}.IcwJCe{border-radius:0;overflow:auto}.card .card,.mnr-c .mnr-c{margin-bottom:0 !important}#gsr{background:#f1f3f4}.HOslld,.mnr-c:not(:empty){box-shadow:0 0 0 1px #ebedef;border-radius:0;}.mnr-c .mnr-c,.mnr-c .HOslld,.HOslld .mnr-c,.HOslld .etUWZd{box-shadow:none;border-radius:0;border:none}.mnr-c.TrGfxd{box-shadow:none;background-color:transparent}.IcwJCe{border-radius:0}.Djmdh{padding:16px}.KnLVwb{margin:16px}.D609Zb{border-radius:16px;overflow:hidden}.tcWIhf{padding-left:16px;padding-right:16px}.Q1sKX{padding-top:16px}.cpylJb{margin-left:8px;margin-right:8px}.hcuDkb{border-top:1px solid #dadce0;border-bottom:none;margin:0 16px}.hcuDkb.zbp8B{margin:0}.hcuDkb.siZgh{margin:0 16px}.hcuDkb.jkjFzc{margin:0 16px}.ilo1Ac{background:#fff}.a3tgt{border-bottom-style:dotted}.nRxP td{border-top-style:dotted}.vk_arc{border-top:1px solid #dadce0;cursor:pointer;height:0;margin-bottom:-11px;overflow:hidden;padding:10px 0 30px;text-align:center}.vk_ard{margin:auto;position:relative;width:10px}.vk_ard:before,.vk_aru:before{content:' ';display:block;height:24px;margin-left:-7px;margin-top:-2px;opacity:0.9;width:24px}.vk_ard:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTYuNTkgOC41OUwxMiAxMy4xNyA3LjQxIDguNTkgNiAxMGw2IDYgNi02eiIvPjwvc3ZnPg==)}.vk_aru:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgOGwtNiA2IDEuNDEgMS40MUwxMiAxMC44M2w0LjU5IDQuNThMMTggMTR6Ii8+PC9zdmc+)}.xpdopen:not(.rYczAc) .xpdclps,.xpdclose:not(.rYczAc) .xpdxpnd{display:none}.xpdopen .xpdbox .xpdxpnd,.xpdopen .xpdbox.xpdopen .xpdclps{max-height:0}.xpdopen .xpdbox.xpdopen .xpdxpnd,.xpdopen .xpdbox .xpdclps{max-height:none}.xpdclose .k5nfEc{display:none}.fp-i .SzDvzc{display:none}.fp-f{bottom:0;height:auto;left:0;position:fixed !important;right:0;top:0;width:auto;z-index:127}.fp-h:not(.fp-nh):not(.goog-modalpopup-bg):not(.goog-modalpopup){display:none !important}.fp-zh.fp-h:not(.fp-nh):not(.goog-modalpopup-bg):not(.goog-modalpopup){display:block !important;height:0;overflow:hidden;transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.fp-i .fp-c{display:block;min-height:100vh}li.fp-c{list-style:none}.fp-w{box-sizing:border-box;left:0;margin-left:auto;margin-right:auto;max-width:1181px;right:0}.ellip{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sXtWJb,.UyheGb{margin:-27px -16px 0 -16px;padding:39px 16px 8px 16px;color:#1558d6;display:block}.sXtWJb:visited{color:#681da8}.UyheGb{margin-left:-64px;padding-left:64px}.cUnQKe .sXtWJb,.ruTcId .sXtWJb,.c2xzTb .sXtWJb,.fm06If .sXtWJb,.LjTgvd .sXtWJb,.trNcde .sXtWJb{padding-top:30px;padding-bottom:0}.tF2Cxc{position:relative}.RUXr2d{display:inline}.MTB56{margin-right:12px;vertical-align:middle}.Pthbuf{display:flex;align-items:center}.m164Nd{vertical-align:middle;display:inline-block}.fG8Fp{color:#70757a}.lKX58c{align-items:center;display:-webkit-box;display:-webkit-flex;display:flex}.Dejxbb{flex-shrink:0}.Xv4xee{display:block;position:relative}.V1nn0e .JtG40d{display:block}.V1nn0e{border-bottom:1px solid #dadce0;display:block;line-height:20px;margin:0 0 8px;padding:0 0 11px}.V1nn0e .uo4vr{margin-top:0;overflow:hidden;white-space:nowrap}.V1nn0e.wgFKp{border-bottom:none;margin-bottom:0;padding-bottom:0}.V1nn0e.R5lVqb{border-bottom:none;margin-bottom:0;padding-bottom:0}.kno-kp .V1nn0e{border-bottom:none;margin-top:0;padding-bottom:0}.vBnbff .mO5MMe .Xv4xee a{font-weight:400px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical}.c2xzTb .vBnbff .Xv4xee a{font-size:16px;line-height:22px;-webkit-line-clamp:2;}.cUnQKe .vBnbff .Xv4xee a,.cUnQKe .vBnbff .Xv4xee a{font-size:14px;line-height:19px;-webkit-line-clamp:1;}.cUnQKe .jnybnd .Xv4xee a{padding-right:0}.mO5MMe .RUXr2d{font-size:12px;font-family:Google Sans,Roboto,Helvetica Neue,Arial,sans-serif;line-height:16px}.mO5MMe .RUXr2d cite{color:#202124}.mO5MMe .d8AiX img{border-radius:80%}.qpGQpf{clear:both;}.Xv4xee .vkeLSd{margin-top:13px}.tcPEUc .MTB56{display:none}.cUnQKe .MTB56,.ruTcId .MTB56,.c2xzTb .MTB56,.fm06If .MTB56,.LjTgvd .MTB56{margin-right:8px}.c2xzTb .card-section{padding-top:8px;padding-bottom:8px}.cUnQKe .card-section{padding-top:8px}.aCOpRe{line-height:1.24;word-wrap:break-word}.aCOpRe sup{line-height:0.9}.JtG40d a{word-wrap:break-word}.IsZvec{max-width:42em;color:#4d5156;}.uo4vr{color:#3c4043;}.IjZ7ze{display:inline-block;color:#70757a;font-size:14px;white-space:nowrap}.FyYA1e{margin:5px 0}.OSrXXb{overflow:hidden;text-overflow:ellipsis}.cHaqb{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.P1usbc{color:#70757a;margin-top:16px}.G1Rrjc{display:inline;margin-left:8px;}.i4vd5e{display:inline;}.k6DEPe{margin-top:4px}.P1usbc .FUUCsd{color:#202124}.P1usbc .FUUCsd span{color:#70757a}.kVul8c .VNLkW,.kVul8c .k6DEPe{border-top:1px solid #dadce0;margin:0 -16px;padding:11px 16px;padding-right:0;position:relative}.kVul8c{margin-bottom:0}.kVul8c a:link,.kVul8c a:visited{color:#202124}.kItQef{margin-right:48px}.gstewf{align-items:center;bottom:0;display:flex;justify-content:center;position:absolute;top:0;width:48px}.GOpTEc{right:0}.AJP1u,.gstewf{color:#70757a}.AJP1u .eVSPgf{color:#202124;display:block;overflow:hidden;text-overflow:ellipsis;width:100%;white-space:nowrap}.kVul8c .G1Rrjc{margin-left:0}.kVul8c .RgmXyd{margin-bottom:-11px}.OoEKOd .AJP1u{color:#202124}.JIedhc{left:0}.WIPImf{margin-left:48px;padding-right:16px}.TXwUJf{color:#3c4043}.Y0xEAe{color:#202124}.xiQ7Zc{color:#70757a}.NnEaBd{text-align:right}.BBwThe{font-weight:700}.Q7PwXb{text-decoration:none}.PcHvNb{position:absolute}.N3nEGc{background-color:#fff;float:left;margin-top:4px}.wEQKyf.N3nEGc{float:right;margin:7px 0 5px 12px}.wEQKyf.Ik9SRc.N3nEGc{margin:2px 0 0 0}.Ixi80c{margin-top:13px;}.i0PvJb{background-color:#000}.mWTy7c{border-top-left-radius:2px;bottom:0;font-size:11px;padding:1px 3px;position:absolute;right:0;background-color:rgba(0,0,0,.7);color:#fff}.rGhul{display:block;position:relative;overflow:hidden}.rGhul:focus{outline-style:solid;outline-width:2px}.vYWbhc{margin-top:0}.TbwUpd a.fl{font-size:12px}.AraNOb{text-decoration:underline}.Uo8X3b{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px;z-index:-1000;-webkit-user-select:none}.OhScic{margin:0px}.zsYMMe{padding:0px}.qzEoUe{color:#3c4043;white-space:-webkit-nowrap}hr{border:0;border-bottom:1px solid #dadce0;margin:0}.BUybKe,.HsnFBf{margin-left:16px}.BUybKe,.oM2GA{margin-right:16px}.XO7rhc{margin-right:-16px;margin-left:-16px}.ZM7ZNb{margin-right:-16px}.MUxGbd{padding-top
In a few keys spots, PSBT finality is checked by looking for non-empty witness data.
This complicates a couple things:
1) Empty data can be valid in certain cases
2) User may be passed bogus final data by a counterparty during PSBT work happening, and end up with incorrect signatures that they may not be able to check in other contexts if the UTXO doesn't exist yet in chain/mempool, timelocks, etc.
On the whole I think these heavier checks are worth it in case someone is actually assuming the signatures are correct if our API is saying so.
ACKs for top commit:
achow101:
ACK e133264c5b1f72e94dcb9cebd85cdb523fcf8070
Tree-SHA512: 9de4fbb0be1257b081781f5df908fd55666e3acd5c4e36beb3b3f2f5a6aed69ff77068c44cde6127e159e773293fd9ced4c0bb47e693969f337e74dc8af030da" class="Link--secondary" href="/bitcoin/bitcoin/commit/2ac71d20b2ebbfea76ee7369fddffbd78bd2c010">Merge</a> <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1302190679" data-permission-text="Title is private" data-url="https://github.com/bitcoin/bitcoin/issues/25595" data-hovercard-type="pull_request" data-hovercard-url="/bitcoin/bitcoin/pull/25595/hovercard" href="https://github.com/bitcoin/bitcoin/pull/25595">#25595</a><a data-pjax="true" title="Merge bitcoin/bitcoin#25595: Verify PSBT inputs rather than check for fields being empty
e133264c5b1f72e94dcb9cebd85cdb523fcf8070 Add test for PSBT input verification (Greg Sanders)
d25699280af1ea45bebc884f63a10da7ea275ef9 Verify PSBT inputs rather than check for fields being empty (Greg Sanders)
Pull request description:
In a few keys spots, PSBT finality is checked by looking for non-empty witness data.
This complicates a couple things:
1) Empty data can be valid in certain cases
2) User may be passed bogus final data by a counterparty during PSBT work happening, and end up with incorrect signatures that they may not be able to check in other contexts if the UTXO doesn't exist yet in chain/mempool, timelocks, etc.
On the whole I think these heavier checks are worth it in case someone is actually assuming the signatures are correct if our API is saying so.
ACKs for top commit:
achow101:
ACK e133264c5b1f72e94dcb9cebd85cdb523fcf8070
$(BITCOIN_CORE_H)
if USE_LIBEVENT
libbitcoin_util_a_SOURCES += util/url.cpp
endif
#
# cli #
libbitcoin_cli_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libbitcoin_cli_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_cli_a_SOURCES = \
compat/stdin.h \
compat/stdin.cpp \
rpc/client.cpp \
$(BITCOIN_CORE_H)
nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h
#
# bitcoind & bitcoin-node binaries #
bitcoin_daemon_sources = bitcoind.cpp
bitcoin_bin_cppflags = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
bitcoin_bin_cxxflags = $(AM_CXXFLAGS) $(PIE_FLAGS)
bitcoin_bin_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
if TARGET_WINDOWS
bitcoin_daemon_sources += bitcoind-res.rc
endif
bitcoin_bin_ldadd = \
$(LIBBITCOIN_WALLET) \
$(LIBBITCOIN_COMMON) \
$(LIBBITCOIN_UTIL) \
$(LIBUNIVALUE) \
$(LIBBITCOIN_ZMQ) \
$(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_CRYPTO) \
$(LIBLEVELDB) \
$(LIBMEMENV) \
$(LIBSECP256K1)
bitcoin_bin_ldadd += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(SQLITE_LIBS)
bitcoind_SOURCES = $(bitcoin_daemon_sources) init/bitcoind.cpp
bitcoind_CPPFLAGS = $(bitcoin_bin_cppflags)
bitcoind_CXXFLAGS = $(bitcoin_bin_cxxflags)
bitcoind_LDFLAGS = $(bitcoin_bin_ldflags)
bitcoind_LDADD = $(LIBBITCOIN_NODE) $(bitcoin_bin_ldadd)
bitcoin_node_SOURCES = $(bitcoin_daemon_sources) init/bitcoin-node.cpp
bitcoin_node_CPPFLAGS = $(bitcoin_bin_cppflags)
bitcoin_node_CXXFLAGS = $(bitcoin_bin_cxxflags)
bitcoin_node_LDFLAGS = $(bitcoin_bin_ldflags)
bitcoin_node_LDADD = $(LIBBITCOIN_NODE) $(bitcoin_bin_ldadd) $(LIBBITCOIN_IPC) $(LIBMULTIPROCESS_LIBS)
# bitcoin-cli binary #
bitcoin_cli_SOURCES = bitcoin-cli.cpp
bitcoin_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)
bitcoin_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
if TARGET_WINDOWS
bitcoin_cli_SOURCES += bitcoin-cli-res.rc
endif
bitcoin_cli_LDADD = \
$(LIBBITCOIN_CLI) \
$(LIBUNIVALUE) \
$(LIBBITCOIN_UTIL) \
$(LIBBITCOIN_CRYPTO)
bitcoin_cli_LDADD += $(EVENT_LIBS)
#
# bitcoin-tx binary #
bitcoin_tx_SOURCES = bitcoin-tx.cpp
bitcoin_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
bitcoin_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
Tree-SHA512: 9de4fbb0be1257b081781f5df908fd55666e3acd5c4e36beb3b3f2f5a6aed69ff77068c44cde6127e159e773293fd9ced4c0bb47e693969f337e74dc8af030da" class="Link--secondary" href="/bitcoin/bitcoin/commit/2ac71d20b2ebbfea76ee7369fddffbd78bd2c010">: Verify PSBT inputs rather than check for fields being e…</a> </span>
</div>
<div role="gridcell" class="color-fg-muted text-right" style="width:100px;">
<time-ago datetime="2022-10-20T00:13:14Z" data-view-component="true" class="no-wrap" title="19 de out. de 2022 21:13 BRT">
42 minutes ago
</time-ago>
</div>
<a style="opacity:0;" class="position-absolute top-0 right-0 bottom-0 left-0 d-block d-sm-none" href="/bitcoin/bitcoin/tree/master/test"> test </a>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
<svg aria-label="File" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file color-fg-muted">
<path fill-rule="evenodd" d="M3.75 1.5a.25.25 0 00-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 00.25-.25V6h-2.75A1.75 1.75 0 019 4.25V1.5H3.75zm6.75.062V4.25c0 .138.112.25.25.25h2.688a.252.252 0 00-.011-.013l-2.914-2.914a.272.272 0 00-.013-.011zM2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0113.25 16h-9.5A1.75 1.75 0 012 14.25V1.75z"></path>
</svg>
</div>
<div role="rowheader" class="flex-auto min-width-0 col-md-2 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit"><a class="js-navigation-open Link--primary" title=".cirrus.yml" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/bitcoin/bitcoin/blob/master/.cirrus.yml">.cirrus.yml</a></span>
</div>
<div role="gridcell" class="flex-auto min-width-0 d-none d-md-block col-5 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit markdown-title"> <a data-pjax="true" title="Merge bitcoin/bitcoin#26297: ci: Use all available CPUs for functional tests in "Win64 native" task
6fbd173d8a4519967d75d2707b2285d62faa4424 ci: Use all available CPUs for functional tests in "Win64 native" task (Hennadii Stepanov)
Pull request description:
On the [master](https://cirrus-ci.com/task/5422842484359168) branch:

This [PR](https://cirrus-ci.com/task/6392972617973760) branch:

Also consider "CPU Usage" charts provided by CI.
Overlooked in cda62657e95a90a5fd61ba43e2acbd407e3a4135 (bitcoin/bitcoin#25929).
ACKs for top commit:
hebasto:
Indeed. Reverted back to 6fbd173d8a4519967d75d2707b2285d62faa4424 ([pr26297.01](https://github.com/hebasto/bitcoin/commits/pr26297.01)), which was already [ACKed](https://github.com/bitcoin/bitcoin/pull/26297#pullrequestreview-1138724890) by @aureleoules.
aureleoules:
ACK 6fbd173d8a4519967d75d2707b2285d62faa4424
jarolrod:
ACK 6fbd173d8a4519967d75d2707b2285d62faa4424
shaavan:
ACK 6fbd173d8a4519967d75d2707b2285d62faa4424
Tree-SHA512: ddd4b41af95bd735f881a3b2c64ee308de2725381f770e313e66555f929d88c8848c98cc5fcd15dfa6845b5dd84ca6c8764ef5d01602b0a62041820856af2b98" class="Link--secondary" href="/bitcoin/bitcoin/commit/3b85e17b496d9774087366df0bf0042bf82a2993">Merge</a> <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1405830206" data-permission-text="Title is private" data-url="https://github.com/bitcoin/bitcoin/issues/26297" data-hovercard-type="pull_request" data-hovercard-url="/bitcoin/bitcoin/pull/26297/hovercard" href="https://github.com/bitcoin/bitcoin/pull/26297">#26297</a><a data-pjax="true" title="Merge bitcoin/bitcoin#26297: ci: Use all available CPUs for functional tests in "Win64 native" task
6fbd173d8a4519967d75d2707b2285d62faa4424 ci: Use all available CPUs for functional tests in "Win64 native" task (Hennadii Stepanov)
Pull request description:
On the [master](https://cirrus-ci.com/task/5422842484359168) branch:

This [PR](https://cirrus-ci.com/task/6392972617973760) branch:

Also consider "CPU Usage" charts provided by CI.
Overlooked in cda62657e95a90a5fd61ba43e2acbd407e3a4135 (bitcoin/bitcoin#25929).
ACKs for top commit:
hebasto:
Indeed. Reverted back to 6fbd173d8a4519967d75d2707b2285d62faa4424 ([pr26297.01](https://github.com/hebasto/bitcoin/commits/pr26297.01)), which was already [ACKed](https://github.com/bitcoin/bitcoin/pull/26297#pullrequestreview-1138724890) by @aureleoules.
aureleoules:
ACK 6fbd173d8a4519967d75d2707b2285d62faa4424
jarolrod:
ACK 6fbd173d8a4519967d75d2707b2285d62faa4424
shaavan:
ACK 6fbd173d8a4519967d75d2707b2285d62faa4424
Tree-SHA512: ddd4b41af95bd735f881a3b2c64ee308de2725381f770e313e66555f929d88c8848c98cc5fcd15dfa6845b5dd84ca6c8764ef5d01602b0a62041820856af2b98" class="Link--secondary" href="/bitcoin/bitcoin/commit/3b85e17b496d9774087366df0bf0042bf82a2993">: ci: Use all available CPUs for functional tests in "Win…</a> </span>
</div>
<div role="gridcell" class="color-fg-muted text-right" style="width:100px;">
<time-ago datetime="2022-10-14T03:37:44Z" data-view-component="true" class="no-wrap" title="14 de out. de 2022 00:37 BRT">
6 days ago
</time-ago>
</div>
<a style="opacity:0;" class="position-absolute top-0 right-0 bottom-0 left-0 d-block d-sm-none" href="/bitcoin/bitcoin/blob/master/.cirrus.yml"> .cirrus.yml </a>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
<svg aria-label="File" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file color-fg-muted">
<path fill-rule="evenodd" d="M3.75 1.5a.25.25 0 00-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 00.25-.25V6h-2.75A1.75 1.75 0 019 4.25V1.5H3.75zm6.75.062V4.25c0 .138.112.25.25.25h2.688a.252.252 0 00-.011-.013l-2.914-2.914a.272.272 0 00-.013-.011zM2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0113.25 16h-9.5A1.75 1.75 0 012 14.25V1.75z"></path>
</svg>
</div>
<div role="rowheader" class="flex-auto min-width-0 col-md-2 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit"><a class="js-navigation-open Link--primary" title=".editorconfig" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/bitcoin/bitcoin/blob/master/.editorconfig">.editorconfig</a></span>
</div>
<div role="gridcell" class="flex-auto min-width-0 d-none d-md-block col-5 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit markdown-title"> <a data-pjax="true" title="ci: Drop AppVeyor CI integration" class="Link--secondary" href="/bitcoin/bitcoin/commit/97292b19140db32c6d85d63b70382e7bf60a55c4">ci: Drop AppVeyor CI integration</a> </span>
</div>
<div role="gridcell" class="color-fg-muted text-right" style="width:100px;">
<time-ago datetime="2021-09-07T03:12:53Z" data-view-component="true" class="no-wrap" title="7 de set. de 2021 00:12 BRT">
14 months ago
</time-ago>
</div>
<a style="opacity:0;" class="position-absolute top-0 right-0 bottom-0 left-0 d-block d-sm-none" href="/bitcoin/bitcoin/blob/master/.editorconfig"> .editorconfig </a>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
<svg aria-label="File" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file color-fg-muted">
<path fill-rule="evenodd" d="M3.75 1.5a.25.25 0 00-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 00.25-.25V6h-2.75A1.75 1.75 0 019 4.25V1.5H3.75zm6.75.062V4.25c0 .138.112.25.25.25h2.688a.252.252 0 00-.011-.013l-2.914-2.914a.272.272 0 00-.013-.011zM2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0113.25 16h-9.5A1.75 1.75 0 012 14.25V1.75z"></path>
</svg>
</div>
<div role="rowheader" class="flex-auto min-width-0 col-md-2 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit"><a class="js-navigation-open Link--primary" title=".gitattributes" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/bitcoin/bitcoin/blob/master/.gitattributes">.gitattributes</a></span>
</div>
<div role="gridcell" class="flex-auto min-width-0 d-none d-md-block col-5 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit markdown-title"> <a data-pjax="true" title="Separate protocol versioning from clientversion" class="Link--secondary" href="/bitcoin/bitcoin/commit/71697f97d3f9512f0af934070690c14f1c0d95ea">Separate protocol versioning from clientversion</a> </span>
</div>
<div role="gridcell" class="color-fg-muted text-right" style="width:100px;">
<time-ago datetime="2014-10-29T04:24:40Z" data-view-component="true" class="no-wrap" title="29 de out. de 2014 01:24 BRT">
8 years ago
</time-ago>
</div>
<a style="opacity:0;" class="position-absolute top-0 right-0 bottom-0 left-0 d-block d-sm-none" href="/bitcoin/bitcoin/blob/master/.gitattributes"> .gitattributes </a>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
<svg aria-label="File" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file color-fg-muted">
<path fill-rule="evenodd" d="M3.75 1.5a.25.25 0 00-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 00.25-.25V6h-2.75A1.75 1.75 0 019 4.25V1.5H3.75zm6.75.062V4.25c0 .138.112.25.25.25h2.688a.252.252 0 00-.011-.013l-2.914-2.914a.272.272 0 00-.013-.011zM2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0113.25 16h-9.5A1.75 1.75 0 012 14.25V1.75z"></path>
</svg>
</div>
<div role="rowheader" class="flex-auto min-width-0 col-md-2 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit"><a class="js-navigation-open Link--primary" title=".gitignore" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/bitcoin/bitcoin/blob/master/.gitignore">.gitignore</a></span>
</div>
<div role="gridcell" class="flex-auto min-width-0 d-none d-md-block col-5 mr-3">
<span class="css-truncate css-truncate-target d-block width-fit markdown-title"> <a data-pjax="true" title="refactor: cleanups post unsubtree'ing univalue
Mostly changes to remove src/univalue exceptions from the various linters,
and the required code changes to make them happy. As well as minor doc
changes." class="Link--secondary" href="/bitcoin/bitcoin/commit/d873ff96e51a3e7f2fdc3fdd1baee2bbe7583e06">refactor: cleanups post unsubtree'ing univalue</a> </span>
</div>
<div role="gridcell" class="color-fg-muted text-right" style="width:100px;">
<time-ago datetime="2022-06-15T11:56:44Z" data-view-component="true" class="no-wrap" title="15 de jun. de 2022 08:56 BRT">
4 months ago
</time-ago>
</div>
<a style="opacity:0;" class="position-absolute top-0 right-0 bottom-0 left-0 d-block d-sm-none" href="/bitcoin/bitcoin/blob/master/.gitignore"> .gitignore </a>
</div>
<div role="row" class="Box-row Box-row--focus-gray py-2 d-flex position-relative js-navigation-item ">
<div role="gridcell" class="mr-3 flex-shrink-0" style="width: 16px;">
<svg aria-label="File" aria-hidden="true" height="16" viewbox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file color-fg-muted">
<path fill-rule="evenodd" d="M3.75 1.5a.25.25 0 00-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 00.25-.25V6h-2.75A1.75 1.75 0 019 4.25V1.5H3.75zm6.75.062V4.25c0 .138.112.25.25.25h2.688a.252.252 0 00-.011-.013l-2.914-2.914a.272.272 0 00-.013-.011zM2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0113.25 16h-9.5A1.75 1.75 0 012 14.25V1.75z"></path>
</svg>
# 
[](https://github.com/freqtrade/freqtrade/actions/)
[](https://coveralls.io/github/freqtrade/freqtrade?branch=develop)
[](https://www.freqtrade.io)
[](https://codeclimate.com/github/freqtrade/freqtrade/maintainability)
Freqtrade is a free and open source crypto trading bot written in Python. It is designed to support all major exchanges and be controlled via Telegram or webUI. It contains backtesting, plotting and money management tools as well as strategy optimization by machine learning.

## Disclaimer
This software is for educational purposes only. Do not risk money which
you are afraid to lose. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHORS
AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR TRADING RESULTS.
Always start by running a trading bot in Dry-run and do not engage money
before you understand how it works and what profit/loss you should
expect.
We strongly recommend you to have coding and Python knowledge. Do not
hesitate to read the source code and understand the mechanism of this bot.
## Supported Exchange marketplaces
Please read the [exchange specific notes](docs/exchanges.md) to learn about eventual, special configurations needed for each exchange.
- [X] [Binance](https://www.binance.com/)
- [X] [Bittrex](https://bittrex.com/)
- [X] [FTX](https://ftx.com/#a=2258149)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [Huobi](http://huobi.com/)
- [X] [Kraken](https://kraken.com/)
- [X] [OKX](https://okx.com/) (Former OKEX)
- [ ] [potentially many others](https://github.com/ccxt/ccxt/). _(We cannot guarantee they will work)_
### Supported Futures Exchanges (experimental)
- [X] [Binance](https://www.binance.com/)
- [X] [Gate.io](https://www.gate.io/ref/6266643)
- [X] [OKX](https://okx.com/).
Please make sure to read the [exchange specific notes](docs/exchanges.md), as well as the [trading with leverage](docs/leverage.md) documentation before diving in.
### Community tested
Exchanges confirmed working by the community:
- [X] [Bitvavo](https://bitvavo.com/)
- [X] [Kucoin](https://www.kucoin.com/)
## Documentation
We invite you to read the bot documentation to ensure you understand how the bot is working.
Please find the complete documentation on the [freqtrade website](https://www.freqtrade.io).
## Features
- [x] **Based on Python 3.8+**: For botting on any operating system - Windows, macOS and Linux.
- [x] **Persistence**: Persistence is achieved through sqlite.
- [x] **Dry-run**: Run the bot without paying money.
- [x] **Backtesting**: Run a simulation of your buy/sell strategy.
- [x] **Strategy Optimization by machine learning**: Use machine learning to optimize your buy/sell strategy parameters with real exchange data.
- [X] **Adaptive prediction modeling**: Build a smart strategy with FreqAI that self-trains to the market via adaptive machine learning methods. [Learn more](https://www.freqtrade.io/en/stable/freqai/)
- [x] **Edge position sizing** Calculate your win rate, risk reward ratio, the best stoploss and adjust your position size before taking a position for each specific market. [Learn more](https://www.freqtrade.io/en/stable/edge/).
- [x] **Whitelist crypto-currencies**: Select which crypto-currency you want to trade or use dynamic whitelists.
- [x] **Blacklist crypto-currencies**: Select which crypto-currency you want to avoid.
- [x] **Builtin WebUI**: Builtin web UI to manage your bot.
- [x] **Manageable via Telegram**: Manage the bot with Telegram.
- [x] **Display profit/loss in fiat**: Display your profit/loss in fiat currency.
- [x] **Performance status report**: Provide a performance status of your current trades.
## Quick start
Please refer to the [Docker Quickstart documentation](https://www.freqtrade.io/en/stable/docker_quickstart/) on how to get started quickly.
For further (native) installation methods, please refer to the [Installation documentation page](https://www.freqtrade.io/en/stable/installation/).
## Basic Usage
### Bot commands
```
usage: freqtrade [-h] [-V]
{trade,create-userdir,new-config,new-strategy,download-data,convert-data,convert-trade-data,list-data,backtesting,edge,hyperopt,hyperopt-list,hyperopt-show,list-exchanges,list-hyperopts,list-markets,list-pairs,list-strategies,list-timeframes,show-trades,test-pairlist,install-ui,plot-dataframe,plot-profit,webserver}
...
Free, open source crypto trading bot
positional arguments:
{trade,create-userdir,new-config,new-strategy,download-data,convert-data,convert-trade-data,list-data,backtesting,edge,hyperopt,hyperopt-list,hyperopt-show,list-exchanges,list-hyperopts,list-markets,list-pairs,list-strategies,list-timeframes,show-trades,test-pairlist,install-ui,plot-dataframe,plot-profit,webserver}
trade Trade module.
create-userdir Create user-data directory.
new-config Create new config
new-strategy Create new strategy
download-data Download backtesting data.
convert-data Convert candle (OHLCV) data from one format to
another.
convert-trade-data Convert trade data from one format to another.
list-data List downloaded data.
backtesting Backtesting module.
edge Edge module.
hyperopt Hyperopt module.
hyperopt-list List Hyperopt results
hyperopt-show Show details of Hyperopt results
list-exchanges Print available exchanges.
list-hyperopts Print available hyperopt classes.
list-markets Print markets on exchange.
list-pairs Print pairs on exchange.
list-strategies Print available strategies.
list-timeframes Print available timeframes for the exchange.
show-trades Show trades.
test-pairlist Test your pairlist configuration.
install-ui Install FreqUI
plot-dataframe Plot candles with indicators.
plot-profit Generate plot showing profits.
webserver Webserver module.
optional arguments:
-h, --help show this help message and exit
-V, --version show program's version number and exit
```
### Telegram RPC commands
Telegram is not mandatory. However, this is a great way to control your bot. More details and the full command list on the [documentation](https://www.freqtrade.io/en/latest/telegram-usage/)
- `/start`: Starts the trader.
- `/stop`: Stops the trader.
- `/stopentry`: Stop entering new trades.
- `/status <trade_id>|[table]`: Lists all or specific open trades.
- `/profit [<n>]`: Lists cumulative profit from all finished trades, over the last n days.
- `/forceexit <trade_id>|all`: Instantly exits the given trade (Ignoring `minimum_roi`).
- `/fx <trade_id>|all`: Alias to `/forceexit`
- `/performance`: Show performance of each finished trade grouped by pair
- `/balance`: Show account balance per currency.
- `/daily <n>`: Shows profit or loss per day, over the last n days.
- `/help`: Show help message.
- `/version`: Show version.
## Development branches
The project is currently setup in two main branches:
- `develop` - This branch has often new features, but might also contain breaking changes. We try hard to keep this branch as stable as possible.
- `stable` - This branch contains the latest stable release. This branch is generally well tested.
- `feat/*` - These are feature branches, which are being worked on heavily. Please don't use these unless you want to test a specific feature.
## Support
### Help / Discord
For any questions not covered by the documentation or for further information about the bot, or to simply engage with like-minded individuals, we encourage you to join the Freqtrade [discord server](https://discord.gg/p7nuUNVfP7).
### [Bugs / Issues](https://github.com/freqtrade/freqtrade/issues?q=is%3Aissue)
If you discover a bug in the bot, please
[search the issue tracker](https://github.com/freqtrade/freqtrade/issues?q=is%3Aissue)
first. If it hasn't been reported, please
[create a new issue](https://github.com/freqtrade/freqtrade/issues/new/choose) and
ensure you follow the template guide so that the team can assist you as
quickly as possible.
### [Feature Requests](https://github.com/freqtrade/freqtrade/labels/enhancement)
Have you a great idea to improve the bot you want to share? Please,
first search if this feature was not [already discussed](https://github.com/freqtrade/freqtrade/labels/enhancement).
If it hasn't been requested, please
[create a new request](https://github.com/freqtrade/freqtrade/issues/new/choose)
and ensure you follow the template guide so that it does not get lost
in the bug reports.
### [Pull Requests](https://github.com/freqtrade/freqtrade/pulls)
Feel like the bot is missing a feature? We welcome your pull requests!
Please read the
[Contributing document](https://github.com/freqtrade/freqtrade/blob/develop/CONTRIBUTING.md)
to understand the requirements before sending your pull-requests.
Coding is not a necessity to contribute - maybe start with improving the documentation?
Issues labeled [good first issue](https://github.com/freqtrade/freqtrade/labels/good%20first%20issue) can be good first contributions, and will help get you familiar with the codebase.
**Note** before starting any major new feature work, *please open an issue describing what you are planning to do* or talk to us on [discord](https://discord.gg/p7nuUNVfP7) (please use the #dev channel for this). This will ensure that interested parties can give valuable feedback on the feature, and let others know that you are working on it.
**Important:** Always create your PR against the `develop` branch, not `stable`.
## Requirements
### Up-to-date clock