PageSourceSearch

https://docs-abidock-mvx.netlify.app/assets/js/1e02f48d.96d59994.js

js docs-abidock-mvx.netlify.app collected 2026-10-03 10:40:54 UTC 9,492 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9557],{8453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>l});var t=r(6540);const a={},s=t.createContext(a);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(s.Provider,{value:n},e.children)}},9543:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"wallet/pem-wallets","title":"PEM Wallets","description":"Load MultiversX accounts from PEM files for development, testing, and automated server scripts.","source":"@site/docs/wallet/pem-wallets.md","sourceDirName":"wallet","slug":"/wallet/pem-wallets","permalink":"/docs/wallet/pem-wallets","draft":false,"unlisted":false,"editUrl":"https://github.com/ABIdock/abidock_mvx/tree/main/docs/docs/wallet/pem-wallets.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"id":"pem-wallets","title":"PEM Wallets","sidebar_position":3,"description":"Load MultiversX accounts from PEM files for development, testing, and automated server scripts."},"sidebar":"docsSidebar","previous":{"title":"Mnemonic Wallets","permalink":"/docs/wallet/mnemonic-wallets"},"next":{"title":"Keystore Wallets","permalink":"/docs/wallet/keystore-wallets"}}');var a=r(4848),s=r(8453);const i={id:"pem-wallets",title:"PEM Wallets",sidebar_position:3,description:"Load MultiversX accounts from PEM files for development, testing, and automated server scripts."},l="PEM Wallets",o={},d=[{value:"What is a PEM File?",id:"what-is-a-pem-file",level:2},{value:"Load Account from PEM File",id:"load-account-from-pem-file",level:2},{value:"Load from PEM String",id:"load-from-pem-string",level:2},{value:"Parse PEM to Secret Key",id:"parse-pem-to-secret-key",level:2},{value:"PEM File Format Details",id:"pem-file-format-details",level:2},{value:"Multiple Wallets in One File",id:"multiple-wallets-in-one-file",level:2},{value:"Complete Example",id:"complete-example",level:2},{value:"Next Steps",id:"next-steps",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"pem-wallets",children:"PEM Wallets"})}),"\n",(0,a.jsx)(n.p,{children:"PEM (Privacy Enhanced Mail) files are a common format for storing cryptographic keys. They're widely used in MultiversX development and testing."}),"\n",(0,a.jsx)(n.h2,{id:"what-is-a-pem-file",children:"What is a PEM File?"}),"\n",(0,a.jsx)(n.p,{children:"A PEM file contains the private key encoded in base64:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"-----BEGIN PRIVATE KEY for erd1abc...-----\r\nNTYzMjEw...base64 encoded key...MTIzNDU2\r\n-----END PRIVATE KEY for erd1abc...-----\n"})}),"\n",(0,a.jsxs)(n.admonition,{title:"Security Warning",type:"caution",children:[(0,a.jsx)(n.p,{children:"PEM files contain your private key in an easily readable format. They are NOT encrypted. Use only for:"}),(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Development and testing"}),"\n",(0,a.jsx)(n.li,{children:"Automated scripts on secure servers"}),"\n",(0,a.jsx)(n.li,{children:"Never for user-facing applications"}),"\n"]})]}),"\n",(0,a.jsx)(n.h2,{id:"load-account-from-pem-file",children:"Load Account from PEM File"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"import 'package:abidock_mvx/abidock_mvx.dart';\r\nimport 'dart:io';\r\n\r\nvoid main() async {\r\n  // Read PEM content from file\r\n  final pemContent = await File('path/to/wallet.pem').readAsString();\r\n  \r\n  // Create account from PEM\r\n  final account = await Account.fromPem(pemContent);\r\n  \r\n  print('Address: ${account.address.bech32}');\r\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"load-from-pem-string",children:"Load from PEM String"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"void main() async {\r\n  final pemContent = '''\r\n-----BEGIN PRIVATE KEY for erd1...-----\r\nNTYzMjEw...\r\n-----END PRIVATE KEY for erd1...-----\r\n''';\r\n\r\n  final account = await Account.fromPem(pemContent);\r\n  print('Address: ${account.address.bech32}');\r\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"parse-pem-to-secret-key",children:"Parse PEM to Secret Key"}),"\n",(0,a.jsxs)(n.p,{children:["For more control, use ",(0,a.jsx)(n.code,{children:"UserSecretKey.fromPem()"})," directly:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"void main() async {\r\n  final pemContent = await File('wallet.pem').readAsString();\r\n  \r\n  // Parse to secret key\r\n  final secretKey = UserSecretKey.fromPem(pemContent);\r\n  \r\n  // Generate public key and address\r\n  final publicKey = await secretKey.generatePublicKey();\r\n  final address = publicKey.toAddress();\r\n  \r\n  print('Address: ${address.bech32}');\r\n  \r\n  // Create signer for transactions\r\n  final signer = UserSigner(secretKey);\r\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"pem-file-format-details",children:"PEM File Format Details"}),"\n",(0,a.jsx)(n.p,{children:"The MultiversX PEM format includes:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Header"}),": ",(0,a.jsx)(n.code,{children:"-----BEGIN PRIVATE KEY for erd1...-----"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Body"}),": Base64-encoded secret key (64 bytes = 32 byte seed + 32 byte public key)"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Footer"}),": ",(0,a.jsx)(n.code,{children:"-----END PRIVATE KEY for erd1...-----"})]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// Parse PEM manually if needed\r\nvoid parsePem(String pemContent) {\r\n  final lines = pemContent.split('\\n');\r\n  \r\n  // Extract address from header\r\n  final header = lines.first;\r\n  final addressMatch = RegExp(r'erd1[a-z0-9]+').firstMatch(header);\r\n  print('Address: ${addressMatch?.group(0)}');\r\n  \r\n  // The body contains the secret key\r\n  final body = lines\r\n      .where((l) => !l.startsWith('-----'))\r\n      .join('');\r\n  print('Key (base64): $body');\r\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"multiple-wallets-in-one-file",children:"Multiple Wallets in One File"}),"\n",(0,a.jsx)(n.p,{children:"Some tools generate PEM files with multiple wallets. Load a specific one by index:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"void main() async {\r\n  final pemContent = await File('wallets.pem').readAsString();
1\r\n  \r\n  // Load specific wallet by index\r\n  final account0 = await Account.fromPem(pemContent, index: 0);\r\n  final account1 = await Account.fromPem(pemContent, index: 1);\r\n  \r\n  print('Wallet 0: ${account0.address.bech32}');\r\n  print('Wallet 1: ${account1.address.bech32}');\r\n}\n"})}),"\n",(0,a.jsx)(n.p,{children:"Or parse all keys manually:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"void main() async {\r\n  final pemContent = await File('wallets.pem').readAsString();\r\n  \r\n  // Parse all keys\r\n  final keys = parseUserKeys(pemContent);\r\n  \r\n  for (var i = 0; i < keys.length; i++) {\r\n    final publicKey = await keys[i].generatePublicKey();\r\n    final address = publicKey.toAddress();\r\n    print('Wallet $i: ${address.bech32}');\r\n  }\r\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"complete-example",children:"Complete Example"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"import 'package:abidock_mvx/abidock_mvx.dart';\r\nimport 'dart:io';\r\n\r\nvoid main() async {\r\n  print('=== PEM Wallet Demo ===\\n');\r\n  \r\n  // 1. Generate a new secret key\r\n  final secretKey = UserSecretKey.generate();\r\n  final publicKey = await secretKey.generatePublicKey();\r\n  final address = publicKey.toAddress();\r\n  print('Generated wallet: ${address.bech32}');\r\n  \r\n  // 2. Create Account from secret key\r\n  final account = await Account.fromSecretKey(secretKey);\r\n  print('Account address: ${account.address.bech32}');\r\n  \r\n  // 3. If you have an existing PEM file\r\n  // final pemContent = await File('wallet.pem').readAsString();\r\n  // final loadedAccount = await Account.fromPem(pemContent);\r\n  // print('Loaded address: ${loadedAccount.address.bech32}');\r\n  \r\n  // Note: abidock_mvx doesn't currently support exporting to PEM format\r\n  // Use keystores for saving encrypted wallets\r\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/wallet/keystore-wallets",children:"Keystore Wallets"})," - Encrypted wallet storage"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/wallet/signing-transactions",children:"Signing Transactions"})," - Sign with your wallet"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/docs/transactions/overview",children:"Transactions"})," - Send transactions"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.