[{"data":1,"prerenderedAt":641},["ShallowReactive",2],{"navigation_docs":3,"-blockchains-decred":84,"-blockchains-decred-surround":636},[4,32],{"title":5,"path":6,"stem":7,"children":8,"icon":31},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,15,19,23,27],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Working with Keys","\u002Fguide\u002Fkeys","1.guide\u002F2.keys",{"title":16,"path":17,"stem":18},"Working with Addresses","\u002Fguide\u002Faddresses","1.guide\u002F3.addresses",{"title":20,"path":21,"stem":22},"Generating Wallets","\u002Fguide\u002Fwallets","1.guide\u002F4.wallets",{"title":24,"path":25,"stem":26},"Working with EVM Chains","\u002Fguide\u002Fevm","1.guide\u002F5.evm",{"title":28,"path":29,"stem":30},"Creating Custom Blockchains","\u002Fguide\u002Fcustom","1.guide\u002F6.custom","i-lucide-book-open",{"title":33,"path":34,"stem":35,"children":36,"icon":83},"Blockchains","\u002Fblockchains","2.blockchains\u002F0.index",[37,39,43,47,51,55,59,63,67,71,75,79],{"title":38,"path":34,"stem":35},"Overview",{"title":40,"path":41,"stem":42},"Aptos","\u002Fblockchains\u002Faptos","2.blockchains\u002Faptos",{"title":44,"path":45,"stem":46},"Base","\u002Fblockchains\u002Fbase","2.blockchains\u002Fbase",{"title":48,"path":49,"stem":50},"Bitcoin","\u002Fblockchains\u002Fbitcoin","2.blockchains\u002Fbitcoin",{"title":52,"path":53,"stem":54},"Cardano","\u002Fblockchains\u002Fcardano","2.blockchains\u002Fcardano",{"title":56,"path":57,"stem":58},"Decred","\u002Fblockchains\u002Fdecred","2.blockchains\u002Fdecred",{"title":60,"path":61,"stem":62},"Ethereum","\u002Fblockchains\u002Fethereum","2.blockchains\u002Fethereum",{"title":64,"path":65,"stem":66},"Litecoin","\u002Fblockchains\u002Flitecoin","2.blockchains\u002Flitecoin",{"title":68,"path":69,"stem":70},"Solana","\u002Fblockchains\u002Fsolana","2.blockchains\u002Fsolana",{"title":72,"path":73,"stem":74},"Stellar","\u002Fblockchains\u002Fstellar","2.blockchains\u002Fstellar",{"title":76,"path":77,"stem":78},"Sui","\u002Fblockchains\u002Fsui","2.blockchains\u002Fsui",{"title":80,"path":81,"stem":82},"TRON","\u002Fblockchains\u002Ftron","2.blockchains\u002Ftron","i-lucide-boxes",{"id":85,"title":56,"body":86,"description":629,"extension":630,"links":631,"meta":632,"navigation":160,"path":57,"seo":634,"stem":58,"__hash__":635},"docs\u002F2.blockchains\u002Fdecred.md",{"type":87,"value":88,"toc":621},"minimark",[89,96,101,238,242,246,253,305,396,410,414,464,467,471,481,574,585,589,603,607,617],[90,91],"chain-facts",{"coin":92,"curve":93,"driver":94,"formats":95},"42","secp256k1","decred","legacy ECDSA P2PKH",[97,98,100],"h2",{"id":99},"load-it","Load it",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-js shiki shiki-themes github-light github-light poimandres","import { useBlockchain, blockchains } from \"@agntn\u002Fkeys\";\n\nconst decredChain = useBlockchain(await blockchains.decred()());\nconst testnet = useBlockchain(await blockchains.decred({ network: \"testnet\" })());\n","js","",[109,110,111,155,162,197],"code",{"__ignoreMap":107},[112,113,116,120,124,128,131,134,137,141,145,149,152],"span",{"class":114,"line":115},"line",1,[112,117,119],{"class":118},"sP0CR","import",[112,121,123],{"class":122},"sKlNE"," {",[112,125,127],{"class":126},"snHMy"," useBlockchain",[112,129,130],{"class":122},",",[112,132,133],{"class":126}," blockchains",[112,135,136],{"class":122}," }",[112,138,140],{"class":139},"stCPd"," from",[112,142,144],{"class":143},"scVjq"," \"",[112,146,148],{"class":147},"sQ7BG","@agntn\u002Fkeys",[112,150,151],{"class":143},"\"",[112,153,154],{"class":122},";\n",[112,156,158],{"class":114,"line":157},2,[112,159,161],{"emptyLinePlaceholder":160},true,"\n",[112,163,165,169,173,176,179,182,186,189,192,194],{"class":114,"line":164},3,[112,166,168],{"class":167},"s1TYA","const",[112,170,172],{"class":171},"saoiD"," decredChain",[112,174,175],{"class":167}," =",[112,177,127],{"class":178},"sULi6",[112,180,181],{"class":122},"(",[112,183,185],{"class":184},"sZW6a","await",[112,187,133],{"class":188},"spVlQ",[112,190,191],{"class":122},".",[112,193,94],{"class":178},[112,195,196],{"class":122},"()());\n",[112,198,200,202,205,207,209,211,213,215,217,219,222,225,228,230,233,235],{"class":114,"line":199},4,[112,201,168],{"class":167},[112,203,204],{"class":171}," testnet",[112,206,175],{"class":167},[112,208,127],{"class":178},[112,210,181],{"class":122},[112,212,185],{"class":184},[112,214,133],{"class":188},[112,216,191],{"class":122},[112,218,94],{"class":178},[112,220,221],{"class":122},"({",[112,223,224],{"class":126}," network",[112,226,227],{"class":122},":",[112,229,144],{"class":143},[112,231,232],{"class":147},"testnet",[112,234,151],{"class":143},[112,236,237],{"class":122}," })());\n",[239,240,241],"p",{},"Mainnet and testnet3 only, anything else throws in the constructor.",[97,243,245],{"id":244},"the-address","The address",[239,247,248,249,252],{},"Decred looks like Bitcoin from a distance and swaps the hash the moment you get close. ",[109,250,251],{},"RIPEMD160(BLAKE256(pubkey))",", a two byte prefix in front, then base58check with a double BLAKE-256 checksum instead of double SHA-256.",[254,255,256,272],"table",{},[257,258,259],"thead",{},[260,261,262,266,269],"tr",{},[263,264,265],"th",{},"Network",[263,267,268],{},"Prefix",[263,270,271],{},"Starts with",[273,274,275,291],"tbody",{},[260,276,277,281,286],{},[278,279,280],"td",{},"mainnet",[278,282,283],{},[109,284,285],{},"07 3f",[278,287,288],{},[109,289,290],{},"Ds",[260,292,293,295,300],{},[278,294,232],{},[278,296,297],{},[109,298,299],{},"0f 21",[278,301,302],{},[109,303,304],{},"Ts",[102,306,308],{"className":104,"code":307,"language":106,"meta":107,"style":107},"const privateKey = \"0000000000000000000000000000000000000000000000000000000000000001\";\nconst publicKey = decredChain.getKeyPublic(privateKey);\n\ndecredChain.getAddress(publicKey); \u002F\u002F DsmcYVbP1Nmag2H4AS17UTvmWXmGeA7nLDx\ntestnet.getAddress(publicKey); \u002F\u002F TsmfmUitQApgnNxQypdGd2x36djCCpDpERU\n",[109,309,310,328,352,356,378],{"__ignoreMap":107},[112,311,312,314,317,319,321,324,326],{"class":114,"line":115},[112,313,168],{"class":167},[112,315,316],{"class":171}," privateKey",[112,318,175],{"class":167},[112,320,144],{"class":143},[112,322,323],{"class":147},"0000000000000000000000000000000000000000000000000000000000000001",[112,325,151],{"class":143},[112,327,154],{"class":122},[112,329,330,332,335,337,339,341,344,346,349],{"class":114,"line":157},[112,331,168],{"class":167},[112,333,334],{"class":171}," publicKey",[112,336,175],{"class":167},[112,338,172],{"class":188},[112,340,191],{"class":122},[112,342,343],{"class":178},"getKeyPublic",[112,345,181],{"class":122},[112,347,348],{"class":188},"privateKey",[112,350,351],{"class":122},");\n",[112,353,354],{"class":114,"line":164},[112,355,161],{"emptyLinePlaceholder":160},[112,357,358,361,363,366,368,371,374],{"class":114,"line":199},[112,359,360],{"class":188},"decredChain",[112,362,191],{"class":122},[112,364,365],{"class":178},"getAddress",[112,367,181],{"class":122},[112,369,370],{"class":188},"publicKey",[112,372,373],{"class":122},"); ",[112,375,377],{"class":376},"sjhu3","\u002F\u002F DsmcYVbP1Nmag2H4AS17UTvmWXmGeA7nLDx\n",[112,379,381,383,385,387,389,391,393],{"class":114,"line":380},5,[112,382,232],{"class":188},[112,384,191],{"class":122},[112,386,365],{"class":178},[112,388,181],{"class":122},[112,390,370],{"class":188},[112,392,373],{"class":122},[112,394,395],{"class":376},"\u002F\u002F TsmfmUitQApgnNxQypdGd2x36djCCpDpERU\n",[239,397,398,399,402,403,405,406,409],{},"That's the only format. Ask for ",[109,400,401],{},"\"segwit\""," or anything else and ",[109,404,365],{}," throws a ",[109,407,408],{},"RangeError"," instead of quietly handing you a legacy address. Schnorr and Ed25519 keys, which dcrd also knows, aren't implemented.",[97,411,413],{"id":412},"validation","Validation",[102,415,417],{"className":104,"code":416,"language":106,"meta":107,"style":107},"decredChain.validateAddress(\"DsmcYVbP1Nmag2H4AS17UTvmWXmGeA7nLDx\"); \u002F\u002F true\ndecredChain.validateAddress(\"TsmfmUitQApgnNxQypdGd2x36djCCpDpERU\"); \u002F\u002F false, testnet on a mainnet driver\n",[109,418,419,442],{"__ignoreMap":107},[112,420,421,423,425,428,430,432,435,437,439],{"class":114,"line":115},[112,422,360],{"class":188},[112,424,191],{"class":122},[112,426,427],{"class":178},"validateAddress",[112,429,181],{"class":122},[112,431,151],{"class":143},[112,433,434],{"class":147},"DsmcYVbP1Nmag2H4AS17UTvmWXmGeA7nLDx",[112,436,151],{"class":143},[112,438,373],{"class":122},[112,440,441],{"class":376},"\u002F\u002F true\n",[112,443,444,446,448,450,452,454,457,459,461],{"class":114,"line":157},[112,445,360],{"class":188},[112,447,191],{"class":122},[112,449,427],{"class":178},[112,451,181],{"class":122},[112,453,151],{"class":143},[112,455,456],{"class":147},"TsmfmUitQApgnNxQypdGd2x36djCCpDpERU",[112,458,151],{"class":143},[112,460,373],{"class":122},[112,462,463],{"class":376},"\u002F\u002F false, testnet on a mainnet driver\n",[239,465,466],{},"Base58 decode with the BLAKE-256 checksum, 22 bytes of payload, and both prefix bytes have to match the driver's network. A Bitcoin address fails at the checksum before the prefix even gets a look.",[97,468,470],{"id":469},"mnemonics","Mnemonics",[239,472,473,476,477,480],{},[109,474,475],{},"deriveHDWallet"," throws. dcrd's HD derivation strips leading zero bytes from keys where BIP32 keeps them, so a plain BIP32 walk lands on the wrong key for some paths and looks perfectly fine doing it. A driver that's silently wrong is worse than one that refuses, so it refuses. ",[109,478,479],{},"deriveWallet"," with a private key works as usual, and so does WIF:",[102,482,484],{"className":104,"code":483,"language":106,"meta":107,"style":107},"import { encodeWIF, decodeWIF } from \"@agntn\u002Fkeys\";\n\nencodeWIF(privateKey, { chain: \"decred\" }); \u002F\u002F PmQdGRXNZdAgEqwDZMLAF2XSQRLFeSFKi4HLPbdW3kC66HegjYtxq\ndecodeWIF(wif, { chain: \"decred\" }).privateKey;\n",[109,485,486,512,516,545],{"__ignoreMap":107},[112,487,488,490,492,495,497,500,502,504,506,508,510],{"class":114,"line":115},[112,489,119],{"class":118},[112,491,123],{"class":122},[112,493,494],{"class":126}," encodeWIF",[112,496,130],{"class":122},[112,498,499],{"class":126}," decodeWIF",[112,501,136],{"class":122},[112,503,140],{"class":139},[112,505,144],{"class":143},[112,507,148],{"class":147},[112,509,151],{"class":143},[112,511,154],{"class":122},[112,513,514],{"class":114,"line":157},[112,515,161],{"emptyLinePlaceholder":160},[112,517,518,521,523,525,528,531,533,535,537,539,542],{"class":114,"line":164},[112,519,520],{"class":178},"encodeWIF",[112,522,181],{"class":122},[112,524,348],{"class":188},[112,526,527],{"class":122},", {",[112,529,530],{"class":126}," chain",[112,532,227],{"class":122},[112,534,144],{"class":143},[112,536,94],{"class":147},[112,538,151],{"class":143},[112,540,541],{"class":122}," }); ",[112,543,544],{"class":376},"\u002F\u002F PmQdGRXNZdAgEqwDZMLAF2XSQRLFeSFKi4HLPbdW3kC66HegjYtxq\n",[112,546,547,550,552,555,557,559,561,563,565,567,570,572],{"class":114,"line":199},[112,548,549],{"class":178},"decodeWIF",[112,551,181],{"class":122},[112,553,554],{"class":188},"wif",[112,556,527],{"class":122},[112,558,530],{"class":126},[112,560,227],{"class":122},[112,562,144],{"class":143},[112,564,94],{"class":147},[112,566,151],{"class":143},[112,568,569],{"class":122}," }).",[112,571,348],{"class":188},[112,573,154],{"class":122},[239,575,576,577,580,581,584],{},"Decred WIF has its own layout: two prefix bytes, a scheme byte that's ",[109,578,579],{},"0x00"," for ECDSA, the key, and a single BLAKE-256 checksum. Only the compressed form exists, ",[109,582,583],{},"compressed: false"," throws.",[97,586,588],{"id":587},"signing","Signing",[239,590,591,594,595,598,599,602],{},[109,592,593],{},"\"Decred Signed Message:\\n\""," with compact size lengths in front of the preamble and the message, one round of BLAKE-256, then secp256k1. 64 bytes of ",[109,596,597],{},"r||s"," in hex, verified with ",[109,600,601],{},"verifyMessage"," on the same driver.",[97,604,606],{"id":605},"where-it-lives","Where it lives",[239,608,609,612,613,616],{},[109,610,611],{},"src\u002Fblockchains\u002Fdecred.ts",", all of it. It extends ",[109,614,615],{},"AbstractBlockchain"," directly, not the Bitcoin base, because nothing except the curve is shared.",[618,619,620],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}",{"title":107,"searchDepth":157,"depth":157,"links":622},[623,624,625,626,627,628],{"id":99,"depth":157,"text":100},{"id":244,"depth":157,"text":245},{"id":412,"depth":157,"text":413},{"id":469,"depth":157,"text":470},{"id":587,"depth":157,"text":588},{"id":605,"depth":157,"text":606},"secp256k1 with BLAKE-256 in every hash. Addresses start with Ds. No mnemonic derivation and that's on purpose.","md",null,{"icon":633},"i-token-dcr",{"title":56,"description":629},"gI9Rhd0kSE_XvCFIFOjb3EnQwrHCoUzOlW9wfpJUnbE",[637,639],{"title":52,"path":53,"stem":54,"description":638,"children":-1},"ed25519 with base and enterprise and stake addresses in bech32. Mnemonic derivation is refused on purpose.",{"title":60,"path":61,"stem":62,"description":640,"children":-1},"secp256k1 with EIP-55 checksummed addresses and personal_sign message signatures.",1789825045801]