@tcswap/wallet-keystore 4.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +4 -0
- package/dist/index.cjs.map +11 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +11 -0
- package/dist/types/helpers.d.ts +45 -0
- package/dist/types/helpers.d.ts.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +39 -0
- package/src/helpers.ts +99 -0
- package/src/index.ts +108 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var H=Object.create;var{getPrototypeOf:_,defineProperty:s,getOwnPropertyNames:p,getOwnPropertyDescriptor:v}=Object,P=Object.prototype.hasOwnProperty;var A=(n,l,t)=>{t=n!=null?H(_(n)):{};let a=l||!n||!n.__esModule?s(t,"default",{value:n,enumerable:!0}):t;for(let T of p(n))if(!P.call(a,T))s(a,T,{get:()=>n[T],enumerable:!0});return a},f=new WeakMap,x=(n)=>{var l=f.get(n),t;if(l)return l;if(l=s({},"__esModule",{value:!0}),n&&typeof n==="object"||typeof n==="function")p(n).map((a)=>!P.call(l,a)&&s(l,a,{get:()=>n[a],enumerable:!(t=v(n,a))||t.enumerable}));return f.set(n,l),l};var X=(n,l)=>{for(var t in l)s(n,t,{get:l[t],enumerable:!0,configurable:!0,set:(a)=>l[t]=()=>a})};var j={};X(j,{validatePhrase:()=>O,keystoreWallet:()=>F,generatePhrase:()=>w,encryptToKeyStore:()=>R,decryptFromKeystore:()=>g,createKeystoreWallet:()=>N,KEYSTORE_SUPPORTED_CHAINS:()=>Y});module.exports=x(j);var o=require("@tcswap/helpers"),S=require("@tcswap/wallet-core");var e=require("node:crypto"),m=require("@scure/bip39"),E=require("@scure/bip39/wordlists/english.js");async function K(n){let l=await import("blakejs"),{blake2bFinal:t,blake2bInit:a,blake2bUpdate:T}=l?.default||l,r=n instanceof Buffer?n:Buffer.from(n,"hex"),u=a(32);return T(u,r),Array.from(t(u)).map((C)=>C<16?`0${C.toString(16)}`:C.toString(16)).join("")}async function R(n,l){let a=e.randomBytes(16),T=e.randomBytes(32),r={c:262144,dklen:32,prf:"hmac-sha256",salt:T.toString("hex")},u=e.pbkdf2Sync(l,T,r.c,r.dklen,"sha256"),C=e.createCipheriv("aes-128-ctr",u.subarray(0,16),a),c=Buffer.concat([C.update(Buffer.from(n,"utf8")),C.final()]),i=Buffer.concat([u.subarray(16,32),Buffer.from(c)]),h=await K(i);return{crypto:{cipher:"aes-128-ctr",cipherparams:{iv:a.toString("hex")},ciphertext:c.toString("hex"),kdf:"pbkdf2",kdfparams:r,mac:h},meta:"xchain-keystore",version:1}}function w(n=12){return m.generateMnemonic(E.wordlist,n===12?128:256)}function O(n){return m.validateMnemonic(n,E.wordlist)}async function g(n,l){let{USwapError:t}=await import("@tcswap/helpers");switch(n.version){case 1:{let a=n.crypto.kdfparams,T=Buffer.from(a.salt,"hex"),r=e.pbkdf2Sync(l,T,a.c,a.dklen,"sha256"),u=Buffer.from(n.crypto.ciphertext,"hex"),C=Buffer.concat([r.subarray(16,32),u]);if(await K(C)!==n.crypto.mac)throw new t("wallet_keystore_invalid_password");let i=e.createDecipheriv(n.crypto.cipher,r.subarray(0,16),Buffer.from(n.crypto.cipherparams.iv,"hex"));return Buffer.concat([i.update(u),i.final()]).toString("utf8")}default:throw new t("wallet_keystore_unsupported_version")}}var F=S.createWallet({connect:({addChain:n})=>async function(t,a,T){let r=await N({chains:t,derivationPathMapOrIndex:T,phrase:a});for(let u of Object.values(r))n({...u,chain:u.chain,walletType:o.WalletOption.KEYSTORE});return!0},name:"connectKeystore",supportedChains:[...o.EVMChains,...o.UTXOChains,...o.CosmosChains.filter((n)=>n!==o.Chain.Harbor),...o.SubstrateChains,o.Chain.Cardano,o.Chain.Polkadot,o.Chain.Chainflip,o.Chain.Ripple,o.Chain.Solana,o.Chain.Sui,o.Chain.Ton,o.Chain.Tron,o.Chain.Near],walletType:o.WalletOption.KEYSTORE}),Y=S.getWalletSupportedChains(F);async function N({chains:n,phrase:l,derivationPathMapOrIndex:t}){let a=o.filterSupportedChains({chains:n,supportedChains:Y,walletType:o.WalletOption.KEYSTORE});return(await Promise.all(a.map(async(r)=>{let{getToolbox:u}=await import("@tcswap/toolboxes"),C=typeof t==="number"?t:0,c=t&&typeof t==="object"?t[r]:void 0,i=o.NetworkDerivationPath[r].slice(0,r===o.Chain.Solana?4:5),h=c||o.updateDerivationPath(i,{index:C}),W=await u(r,{derivationPath:h,phrase:l}),y=await W.getAddress()||"";return{...W,address:y,chain:r}}))).reduce((r,u)=>{return r[u.chain]=u,r},{})}
|
|
2
|
+
|
|
3
|
+
//# debugId=9B5BED4A73F0141D64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/helpers.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n Chain,\n CosmosChains,\n type DerivationPathArray,\n EVMChains,\n filterSupportedChains,\n NetworkDerivationPath,\n SubstrateChains,\n UTXOChains,\n updateDerivationPath,\n WalletOption,\n} from \"@tcswap/helpers\";\nimport type { FullWallet } from \"@tcswap/toolboxes\";\nimport { createWallet, getWalletSupportedChains } from \"@tcswap/wallet-core\";\n\nexport {\n decryptFromKeystore,\n encryptToKeyStore,\n generatePhrase,\n type Keystore,\n validatePhrase,\n} from \"./helpers\";\n\nexport const keystoreWallet = createWallet({\n connect: ({ addChain }) =>\n async function connectKeystore(\n chains: Chain[],\n phrase: string,\n derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number,\n ) {\n const wallets = await createKeystoreWallet({ chains, derivationPathMapOrIndex, phrase });\n\n for (const wallet of Object.values(wallets)) {\n addChain({ ...wallet, chain: wallet.chain, walletType: WalletOption.KEYSTORE });\n }\n\n return true;\n },\n name: \"connectKeystore\",\n supportedChains: [\n ...EVMChains,\n ...UTXOChains,\n ...CosmosChains.filter((chain) => chain !== Chain.Harbor),\n ...SubstrateChains,\n Chain.Cardano,\n Chain.Polkadot,\n Chain.Chainflip,\n Chain.Ripple,\n Chain.Solana,\n Chain.Sui,\n Chain.Ton,\n Chain.Tron,\n Chain.Near,\n ],\n walletType: WalletOption.KEYSTORE,\n});\n\nexport const KEYSTORE_SUPPORTED_CHAINS = getWalletSupportedChains(keystoreWallet);\n\nexport async function createKeystoreWallet<T extends Chain[]>({\n chains,\n phrase,\n derivationPathMapOrIndex,\n}: {\n chains: T;\n phrase: string;\n derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number;\n}) {\n const filteredChains = filterSupportedChains({\n chains,\n supportedChains: KEYSTORE_SUPPORTED_CHAINS,\n walletType: WalletOption.KEYSTORE,\n });\n\n const wallets = await Promise.all(\n filteredChains.map(async (chain) => {\n const { getToolbox } = await import(\"@tcswap/toolboxes\");\n\n const derivationPathIndex = typeof derivationPathMapOrIndex === \"number\" ? derivationPathMapOrIndex : 0;\n const derivationPathFromMap =\n derivationPathMapOrIndex && typeof derivationPathMapOrIndex === \"object\"\n ? derivationPathMapOrIndex[chain]\n : undefined;\n\n const derivationArrayToUpdate = NetworkDerivationPath[chain].slice(\n 0,\n chain === Chain.Solana ? 4 : 5,\n ) as DerivationPathArray;\n\n const derivationPath: DerivationPathArray =\n derivationPathFromMap || updateDerivationPath(derivationArrayToUpdate, { index: derivationPathIndex });\n\n const toolbox = await getToolbox(chain, { derivationPath, phrase });\n const address = (await toolbox.getAddress()) || \"\";\n const wallet = { ...toolbox, address, chain };\n\n return wallet;\n }),\n );\n\n return wallets.reduce(\n (acc, wallet) => {\n acc[wallet.chain as T[number]] = wallet as FullWallet[T[number]];\n return acc;\n },\n {} as { [key in T[number]]: FullWallet[key] },\n );\n}\n",
|
|
6
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from \"node:crypto\";\nimport { generateMnemonic, validateMnemonic } from \"@scure/bip39\";\nimport { wordlist } from \"@scure/bip39/wordlists/english.js\";\n\nexport type Keystore = {\n version: number;\n meta: string;\n crypto: {\n cipher: string;\n cipherparams: { iv: string };\n ciphertext: string;\n kdf: string;\n kdfparams: { prf: string; dklen: number; salt: string; c: number };\n mac: string;\n };\n};\n\nasync function blake256(initData: Buffer | string) {\n const blakeModule = await import(\"blakejs\");\n const { blake2bFinal, blake2bInit, blake2bUpdate } = blakeModule?.default || blakeModule;\n const data = initData instanceof Buffer ? initData : Buffer.from(initData as string, \"hex\");\n\n const context = blake2bInit(32);\n blake2bUpdate(context, data);\n\n return Array.from(blake2bFinal(context))\n .map((byte) => (byte < 0x10 ? `0${byte.toString(16)}` : byte.toString(16)))\n .join(\"\");\n}\n\nexport async function encryptToKeyStore(phrase: string, password: string) {\n const cipher = \"aes-128-ctr\";\n const iv = randomBytes(16);\n const salt = randomBytes(32);\n const kdfParams = { c: 262144, dklen: 32, prf: \"hmac-sha256\", salt: salt.toString(\"hex\") };\n\n const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, \"sha256\");\n const cipherIV = createCipheriv(cipher, derivedKey.subarray(0, 16), iv);\n const ciphertext = Buffer.concat([cipherIV.update(Buffer.from(phrase, \"utf8\")), cipherIV.final()]);\n const initData = Buffer.concat([derivedKey.subarray(16, 32), Buffer.from(ciphertext)]);\n const mac = await blake256(initData);\n\n return {\n crypto: {\n cipher,\n cipherparams: { iv: iv.toString(\"hex\") },\n ciphertext: ciphertext.toString(\"hex\"),\n kdf: \"pbkdf2\",\n kdfparams: kdfParams,\n mac,\n },\n meta: \"xchain-keystore\",\n version: 1,\n };\n}\n\nexport function generatePhrase(size: 12 | 24 = 12) {\n return generateMnemonic(wordlist, size === 12 ? 128 : 256);\n}\n\nexport function validatePhrase(phrase: string) {\n return validateMnemonic(phrase, wordlist);\n}\n\nexport async function decryptFromKeystore(keystore: Keystore, password: string) {\n const { USwapError } = await import(\"@tcswap/helpers\");\n\n switch (keystore.version) {\n case 1: {\n const kdfParams = keystore.crypto.kdfparams;\n const salt = Buffer.from(kdfParams.salt, \"hex\");\n const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, \"sha256\");\n\n const ciphertext = Buffer.from(keystore.crypto.ciphertext, \"hex\");\n const initData = Buffer.concat([derivedKey.subarray(16, 32), ciphertext]);\n const mac = await blake256(initData);\n\n if (mac !== keystore.crypto.mac) {\n throw new USwapError(\"wallet_keystore_invalid_password\");\n }\n\n const decipher = createDecipheriv(\n keystore.crypto.cipher,\n derivedKey.subarray(0, 16),\n Buffer.from(keystore.crypto.cipherparams.iv, \"hex\"),\n );\n\n const phrase = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return phrase.toString(\"utf8\");\n }\n\n default:\n throw new USwapError(\"wallet_keystore_unsupported_version\");\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "m3BAWO,IAXP,6BAaA,iCCT0E,IAA1E,yBACA,0BACA,+CAeA,eAAe,CAAQ,CAAC,EAA2B,CACjD,IAAM,EAAc,KAAa,oBACzB,eAAc,cAAa,iBAAkB,GAAa,SAAW,EACvE,EAAO,aAAoB,OAAS,EAAW,OAAO,KAAK,EAAoB,KAAK,EAEpF,EAAU,EAAY,EAAE,EAG9B,OAFA,EAAc,EAAS,CAAI,EAEpB,MAAM,KAAK,EAAa,CAAO,CAAC,EACpC,IAAI,CAAC,IAAU,EAAO,GAAO,IAAI,EAAK,SAAS,EAAE,IAAM,EAAK,SAAS,EAAE,CAAE,EACzE,KAAK,EAAE,EAGZ,eAAsB,CAAiB,CAAC,EAAgB,EAAkB,CAExE,IAAM,EAAK,cAAY,EAAE,EACnB,EAAO,cAAY,EAAE,EACrB,EAAY,CAAE,EAAG,OAAQ,MAAO,GAAI,IAAK,cAAe,KAAM,EAAK,SAAS,KAAK,CAAE,EAEnF,EAAa,aAAW,EAAU,EAAM,EAAU,EAAG,EAAU,MAAO,QAAQ,EAC9E,EAAW,iBANF,cAMyB,EAAW,SAAS,EAAG,EAAE,EAAG,CAAE,EAChE,EAAa,OAAO,OAAO,CAAC,EAAS,OAAO,OAAO,KAAK,EAAQ,MAAM,CAAC,EAAG,EAAS,MAAM,CAAC,CAAC,EAC3F,EAAW,OAAO,OAAO,CAAC,EAAW,SAAS,GAAI,EAAE,EAAG,OAAO,KAAK,CAAU,CAAC,CAAC,EAC/E,EAAM,MAAM,EAAS,CAAQ,EAEnC,MAAO,CACL,OAAQ,CACN,OAbW,cAcX,aAAc,CAAE,GAAI,EAAG,SAAS,KAAK,CAAE,EACvC,WAAY,EAAW,SAAS,KAAK,EACrC,IAAK,SACL,UAAW,EACX,KACF,EACA,KAAM,kBACN,QAAS,CACX,EAGK,SAAS,CAAc,CAAC,EAAgB,GAAI,CACjD,OAAO,mBAAiB,WAAU,IAAS,GAAK,IAAM,GAAG,EAGpD,SAAS,CAAc,CAAC,EAAgB,CAC7C,OAAO,mBAAiB,EAAQ,UAAQ,EAG1C,eAAsB,CAAmB,CAAC,EAAoB,EAAkB,CAC9E,IAAQ,cAAe,KAAa,2BAEpC,OAAQ,EAAS,aACV,GAAG,CACN,IAAM,EAAY,EAAS,OAAO,UAC5B,EAAO,OAAO,KAAK,EAAU,KAAM,KAAK,EACxC,EAAa,aAAW,EAAU,EAAM,EAAU,EAAG,EAAU,MAAO,QAAQ,EAE9E,EAAa,OAAO,KAAK,EAAS,OAAO,WAAY,KAAK,EAC1D,EAAW,OAAO,OAAO,CAAC,EAAW,SAAS,GAAI,EAAE,EAAG,CAAU,CAAC,EAGxE,GAFY,MAAM,EAAS,CAAQ,IAEvB,EAAS,OAAO,IAC1B,MAAM,IAAI,EAAW,kCAAkC,EAGzD,IAAM,EAAW,mBACf,EAAS,OAAO,OAChB,EAAW,SAAS,EAAG,EAAE,EACzB,OAAO,KAAK,EAAS,OAAO,aAAa,GAAI,KAAK,CACpD,EAGA,OADe,OAAO,OAAO,CAAC,EAAS,OAAO,CAAU,EAAG,EAAS,MAAM,CAAC,CAAC,EAC9D,SAAS,MAAM,CAC/B,SAGE,MAAM,IAAI,EAAW,qCAAqC,GDzEzD,IAAM,EAAiB,eAAa,CACzC,QAAS,EAAG,cACV,cAA8B,CAC5B,EACA,EACA,EACA,CACA,IAAM,EAAU,MAAM,EAAqB,CAAE,SAAQ,2BAA0B,QAAO,CAAC,EAEvF,QAAW,KAAU,OAAO,OAAO,CAAO,EACxC,EAAS,IAAK,EAAQ,MAAO,EAAO,MAAO,WAAY,eAAa,QAAS,CAAC,EAGhF,MAAO,IAEX,KAAM,kBACN,gBAAiB,CACf,GAAG,YACH,GAAG,aACH,GAAG,eAAa,OAAO,CAAC,IAAU,IAAU,QAAM,MAAM,EACxD,GAAG,kBACH,QAAM,QACN,QAAM,SACN,QAAM,UACN,QAAM,OACN,QAAM,OACN,QAAM,IACN,QAAM,IACN,QAAM,KACN,QAAM,IACR,EACA,WAAY,eAAa,QAC3B,CAAC,EAEY,EAA4B,2BAAyB,CAAc,EAEhF,eAAsB,CAAuC,EAC3D,SACA,SACA,4BAKC,CACD,IAAM,EAAiB,wBAAsB,CAC3C,SACA,gBAAiB,EACjB,WAAY,eAAa,QAC3B,CAAC,EA4BD,OA1BgB,MAAM,QAAQ,IAC5B,EAAe,IAAI,MAAO,IAAU,CAClC,IAAQ,cAAe,KAAa,6BAE9B,EAAsB,OAAO,IAA6B,SAAW,EAA2B,EAChG,EACJ,GAA4B,OAAO,IAA6B,SAC5D,EAAyB,GACzB,OAEA,EAA0B,wBAAsB,GAAO,MAC3D,EACA,IAAU,QAAM,OAAS,EAAI,CAC/B,EAEM,EACJ,GAAyB,uBAAqB,EAAyB,CAAE,MAAO,CAAoB,CAAC,EAEjG,EAAU,MAAM,EAAW,EAAO,CAAE,iBAAgB,QAAO,CAAC,EAC5D,EAAW,MAAM,EAAQ,WAAW,GAAM,GAGhD,MAFe,IAAK,EAAS,UAAS,OAAM,EAG7C,CACH,GAEe,OACb,CAAC,EAAK,IAAW,CAEf,OADA,EAAI,EAAO,OAAsB,EAC1B,GAET,CAAC,CACH",
|
|
9
|
+
"debugId": "9B5BED4A73F0141D64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var K=Object.create;var{getPrototypeOf:R,defineProperty:A,getOwnPropertyNames:w}=Object;var O=Object.prototype.hasOwnProperty;var s=(n,r,o)=>{o=n!=null?K(R(n)):{};let l=r||!n||!n.__esModule?A(o,"default",{value:n,enumerable:!0}):o;for(let u of w(n))if(!O.call(l,u))A(l,u,{get:()=>n[u],enumerable:!0});return l};var h=((n)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(r,o)=>(typeof require<"u"?require:r)[o]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});import{Chain as T,CosmosChains as x,EVMChains as X,filterSupportedChains as j,NetworkDerivationPath as q,SubstrateChains as G,UTXOChains as J,updateDerivationPath as L,WalletOption as m}from"@tcswap/helpers";import{createWallet as Q,getWalletSupportedChains as U}from"@tcswap/wallet-core";import{createCipheriv as g,createDecipheriv as F,pbkdf2Sync as W,randomBytes as E}from"node:crypto";import{generateMnemonic as Y,validateMnemonic as N}from"@scure/bip39";import{wordlist as f}from"@scure/bip39/wordlists/english.js";async function p(n){let r=await import("blakejs"),{blake2bFinal:o,blake2bInit:l,blake2bUpdate:u}=r?.default||r,t=n instanceof Buffer?n:Buffer.from(n,"hex"),a=l(32);return u(a,t),Array.from(o(a)).map((C)=>C<16?`0${C.toString(16)}`:C.toString(16)).join("")}async function y(n,r){let l=E(16),u=E(32),t={c:262144,dklen:32,prf:"hmac-sha256",salt:u.toString("hex")},a=W(r,u,t.c,t.dklen,"sha256"),C=g("aes-128-ctr",a.subarray(0,16),l),i=Buffer.concat([C.update(Buffer.from(n,"utf8")),C.final()]),e=Buffer.concat([a.subarray(16,32),Buffer.from(i)]),c=await p(e);return{crypto:{cipher:"aes-128-ctr",cipherparams:{iv:l.toString("hex")},ciphertext:i.toString("hex"),kdf:"pbkdf2",kdfparams:t,mac:c},meta:"xchain-keystore",version:1}}function H(n=12){return Y(f,n===12?128:256)}function _(n){return N(n,f)}async function v(n,r){let{USwapError:o}=await import("@tcswap/helpers");switch(n.version){case 1:{let l=n.crypto.kdfparams,u=Buffer.from(l.salt,"hex"),t=W(r,u,l.c,l.dklen,"sha256"),a=Buffer.from(n.crypto.ciphertext,"hex"),C=Buffer.concat([t.subarray(16,32),a]);if(await p(C)!==n.crypto.mac)throw new o("wallet_keystore_invalid_password");let e=F(n.crypto.cipher,t.subarray(0,16),Buffer.from(n.crypto.cipherparams.iv,"hex"));return Buffer.concat([e.update(a),e.final()]).toString("utf8")}default:throw new o("wallet_keystore_unsupported_version")}}var Z=Q({connect:({addChain:n})=>async function(o,l,u){let t=await D({chains:o,derivationPathMapOrIndex:u,phrase:l});for(let a of Object.values(t))n({...a,chain:a.chain,walletType:m.KEYSTORE});return!0},name:"connectKeystore",supportedChains:[...X,...J,...x.filter((n)=>n!==T.Harbor),...G,T.Cardano,T.Polkadot,T.Chainflip,T.Ripple,T.Solana,T.Sui,T.Ton,T.Tron,T.Near],walletType:m.KEYSTORE}),$=U(Z);async function D({chains:n,phrase:r,derivationPathMapOrIndex:o}){let l=j({chains:n,supportedChains:$,walletType:m.KEYSTORE});return(await Promise.all(l.map(async(t)=>{let{getToolbox:a}=await import("@tcswap/toolboxes"),C=typeof o==="number"?o:0,i=o&&typeof o==="object"?o[t]:void 0,e=q[t].slice(0,t===T.Solana?4:5),c=i||L(e,{index:C}),S=await a(t,{derivationPath:c,phrase:r}),P=await S.getAddress()||"";return{...S,address:P,chain:t}}))).reduce((t,a)=>{return t[a.chain]=a,t},{})}export{_ as validatePhrase,Z as keystoreWallet,H as generatePhrase,y as encryptToKeyStore,v as decryptFromKeystore,D as createKeystoreWallet,$ as KEYSTORE_SUPPORTED_CHAINS};
|
|
2
|
+
|
|
3
|
+
//# debugId=B992E9E25B39295264756E2164756E21
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/helpers.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n Chain,\n CosmosChains,\n type DerivationPathArray,\n EVMChains,\n filterSupportedChains,\n NetworkDerivationPath,\n SubstrateChains,\n UTXOChains,\n updateDerivationPath,\n WalletOption,\n} from \"@tcswap/helpers\";\nimport type { FullWallet } from \"@tcswap/toolboxes\";\nimport { createWallet, getWalletSupportedChains } from \"@tcswap/wallet-core\";\n\nexport {\n decryptFromKeystore,\n encryptToKeyStore,\n generatePhrase,\n type Keystore,\n validatePhrase,\n} from \"./helpers\";\n\nexport const keystoreWallet = createWallet({\n connect: ({ addChain }) =>\n async function connectKeystore(\n chains: Chain[],\n phrase: string,\n derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number,\n ) {\n const wallets = await createKeystoreWallet({ chains, derivationPathMapOrIndex, phrase });\n\n for (const wallet of Object.values(wallets)) {\n addChain({ ...wallet, chain: wallet.chain, walletType: WalletOption.KEYSTORE });\n }\n\n return true;\n },\n name: \"connectKeystore\",\n supportedChains: [\n ...EVMChains,\n ...UTXOChains,\n ...CosmosChains.filter((chain) => chain !== Chain.Harbor),\n ...SubstrateChains,\n Chain.Cardano,\n Chain.Polkadot,\n Chain.Chainflip,\n Chain.Ripple,\n Chain.Solana,\n Chain.Sui,\n Chain.Ton,\n Chain.Tron,\n Chain.Near,\n ],\n walletType: WalletOption.KEYSTORE,\n});\n\nexport const KEYSTORE_SUPPORTED_CHAINS = getWalletSupportedChains(keystoreWallet);\n\nexport async function createKeystoreWallet<T extends Chain[]>({\n chains,\n phrase,\n derivationPathMapOrIndex,\n}: {\n chains: T;\n phrase: string;\n derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number;\n}) {\n const filteredChains = filterSupportedChains({\n chains,\n supportedChains: KEYSTORE_SUPPORTED_CHAINS,\n walletType: WalletOption.KEYSTORE,\n });\n\n const wallets = await Promise.all(\n filteredChains.map(async (chain) => {\n const { getToolbox } = await import(\"@tcswap/toolboxes\");\n\n const derivationPathIndex = typeof derivationPathMapOrIndex === \"number\" ? derivationPathMapOrIndex : 0;\n const derivationPathFromMap =\n derivationPathMapOrIndex && typeof derivationPathMapOrIndex === \"object\"\n ? derivationPathMapOrIndex[chain]\n : undefined;\n\n const derivationArrayToUpdate = NetworkDerivationPath[chain].slice(\n 0,\n chain === Chain.Solana ? 4 : 5,\n ) as DerivationPathArray;\n\n const derivationPath: DerivationPathArray =\n derivationPathFromMap || updateDerivationPath(derivationArrayToUpdate, { index: derivationPathIndex });\n\n const toolbox = await getToolbox(chain, { derivationPath, phrase });\n const address = (await toolbox.getAddress()) || \"\";\n const wallet = { ...toolbox, address, chain };\n\n return wallet;\n }),\n );\n\n return wallets.reduce(\n (acc, wallet) => {\n acc[wallet.chain as T[number]] = wallet as FullWallet[T[number]];\n return acc;\n },\n {} as { [key in T[number]]: FullWallet[key] },\n );\n}\n",
|
|
6
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from \"node:crypto\";\nimport { generateMnemonic, validateMnemonic } from \"@scure/bip39\";\nimport { wordlist } from \"@scure/bip39/wordlists/english.js\";\n\nexport type Keystore = {\n version: number;\n meta: string;\n crypto: {\n cipher: string;\n cipherparams: { iv: string };\n ciphertext: string;\n kdf: string;\n kdfparams: { prf: string; dklen: number; salt: string; c: number };\n mac: string;\n };\n};\n\nasync function blake256(initData: Buffer | string) {\n const blakeModule = await import(\"blakejs\");\n const { blake2bFinal, blake2bInit, blake2bUpdate } = blakeModule?.default || blakeModule;\n const data = initData instanceof Buffer ? initData : Buffer.from(initData as string, \"hex\");\n\n const context = blake2bInit(32);\n blake2bUpdate(context, data);\n\n return Array.from(blake2bFinal(context))\n .map((byte) => (byte < 0x10 ? `0${byte.toString(16)}` : byte.toString(16)))\n .join(\"\");\n}\n\nexport async function encryptToKeyStore(phrase: string, password: string) {\n const cipher = \"aes-128-ctr\";\n const iv = randomBytes(16);\n const salt = randomBytes(32);\n const kdfParams = { c: 262144, dklen: 32, prf: \"hmac-sha256\", salt: salt.toString(\"hex\") };\n\n const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, \"sha256\");\n const cipherIV = createCipheriv(cipher, derivedKey.subarray(0, 16), iv);\n const ciphertext = Buffer.concat([cipherIV.update(Buffer.from(phrase, \"utf8\")), cipherIV.final()]);\n const initData = Buffer.concat([derivedKey.subarray(16, 32), Buffer.from(ciphertext)]);\n const mac = await blake256(initData);\n\n return {\n crypto: {\n cipher,\n cipherparams: { iv: iv.toString(\"hex\") },\n ciphertext: ciphertext.toString(\"hex\"),\n kdf: \"pbkdf2\",\n kdfparams: kdfParams,\n mac,\n },\n meta: \"xchain-keystore\",\n version: 1,\n };\n}\n\nexport function generatePhrase(size: 12 | 24 = 12) {\n return generateMnemonic(wordlist, size === 12 ? 128 : 256);\n}\n\nexport function validatePhrase(phrase: string) {\n return validateMnemonic(phrase, wordlist);\n}\n\nexport async function decryptFromKeystore(keystore: Keystore, password: string) {\n const { USwapError } = await import(\"@tcswap/helpers\");\n\n switch (keystore.version) {\n case 1: {\n const kdfParams = keystore.crypto.kdfparams;\n const salt = Buffer.from(kdfParams.salt, \"hex\");\n const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, \"sha256\");\n\n const ciphertext = Buffer.from(keystore.crypto.ciphertext, \"hex\");\n const initData = Buffer.concat([derivedKey.subarray(16, 32), ciphertext]);\n const mac = await blake256(initData);\n\n if (mac !== keystore.crypto.mac) {\n throw new USwapError(\"wallet_keystore_invalid_password\");\n }\n\n const decipher = createDecipheriv(\n keystore.crypto.cipher,\n derivedKey.subarray(0, 16),\n Buffer.from(keystore.crypto.cipherparams.iv, \"hex\"),\n );\n\n const phrase = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return phrase.toString(\"utf8\");\n }\n\n default:\n throw new USwapError(\"wallet_keystore_unsupported_version\");\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "B992E9E25B39295264756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modifications © 2025 Horizontal Systems.
|
|
3
|
+
*/
|
|
4
|
+
export type Keystore = {
|
|
5
|
+
version: number;
|
|
6
|
+
meta: string;
|
|
7
|
+
crypto: {
|
|
8
|
+
cipher: string;
|
|
9
|
+
cipherparams: {
|
|
10
|
+
iv: string;
|
|
11
|
+
};
|
|
12
|
+
ciphertext: string;
|
|
13
|
+
kdf: string;
|
|
14
|
+
kdfparams: {
|
|
15
|
+
prf: string;
|
|
16
|
+
dklen: number;
|
|
17
|
+
salt: string;
|
|
18
|
+
c: number;
|
|
19
|
+
};
|
|
20
|
+
mac: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export declare function encryptToKeyStore(phrase: string, password: string): Promise<{
|
|
24
|
+
crypto: {
|
|
25
|
+
cipher: string;
|
|
26
|
+
cipherparams: {
|
|
27
|
+
iv: string;
|
|
28
|
+
};
|
|
29
|
+
ciphertext: string;
|
|
30
|
+
kdf: string;
|
|
31
|
+
kdfparams: {
|
|
32
|
+
c: number;
|
|
33
|
+
dklen: number;
|
|
34
|
+
prf: string;
|
|
35
|
+
salt: string;
|
|
36
|
+
};
|
|
37
|
+
mac: string;
|
|
38
|
+
};
|
|
39
|
+
meta: string;
|
|
40
|
+
version: number;
|
|
41
|
+
}>;
|
|
42
|
+
export declare function generatePhrase(size?: 12 | 24): string;
|
|
43
|
+
export declare function validatePhrase(phrase: string): boolean;
|
|
44
|
+
export declare function decryptFromKeystore(keystore: Keystore, password: string): Promise<string>;
|
|
45
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH,CAAC;AAeF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;GAwBvE;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,EAAE,GAAG,EAAO,UAEhD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,WAE5C;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBA8B7E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Chain, type DerivationPathArray } from "@tcswap/helpers";
|
|
2
|
+
import type { FullWallet } from "@tcswap/toolboxes";
|
|
3
|
+
export { decryptFromKeystore, encryptToKeyStore, generatePhrase, type Keystore, validatePhrase, } from "./helpers";
|
|
4
|
+
export declare const keystoreWallet: {
|
|
5
|
+
connectKeystore: {
|
|
6
|
+
connectWallet: (connectParams: {
|
|
7
|
+
addChain: import("@tcswap/helpers").AddChainType;
|
|
8
|
+
}) => (chains: Chain[], phrase: string, derivationPathMapOrIndex?: number | {
|
|
9
|
+
ARB?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
10
|
+
AURORA?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
11
|
+
AVAX?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
12
|
+
BASE?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
13
|
+
BERA?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
14
|
+
BSC?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
15
|
+
BTC?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
16
|
+
BCH?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
17
|
+
BOTANIX?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
18
|
+
ADA?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
19
|
+
FLIP?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
20
|
+
CORE?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
21
|
+
CORN?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
22
|
+
GAIA?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
23
|
+
CRO?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
24
|
+
DASH?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
25
|
+
DOGE?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
26
|
+
ETH?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
27
|
+
GNO?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
28
|
+
HARBOR?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
29
|
+
HYPEREVM?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
30
|
+
KUJI?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
31
|
+
LTC?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
32
|
+
MAYA?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
33
|
+
MEGAETH?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
34
|
+
MONAD?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
35
|
+
NEAR?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
36
|
+
NOBLE?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
37
|
+
OP?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
38
|
+
DOT?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
39
|
+
POL?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
40
|
+
XRD?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
41
|
+
XRP?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
42
|
+
SOL?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
43
|
+
SONIC?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
44
|
+
SUI?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
45
|
+
THOR?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
46
|
+
TON?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
47
|
+
TRON?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
48
|
+
UNI?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
49
|
+
XLAYER?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
50
|
+
ZEC?: [44, 118, 0, 0, 0] | [44, 931, 0, 0, 0] | [number, number, number, number, number] | [44, 397, 0, 0, 0] | [0, 0, 0, 0, 0] | [44, 144, 0, 0, 0] | [44, 501, 0, 0, 0] | [44, 607, 0, 0, 0] | [44, 195, 0, 0, 0] | [44, 784, 0, 0, 0] | [1852, 1815, 0, 0, 0] | [number, number, number, number, (number | undefined)?] | [44, 145, 0, 0, 0] | [84, 2, 0, 0, 0] | [44, 3, 0, 0, 0] | [44, 5, 0, 0, 0] | [44, 133, 0, 0, 0] | undefined;
|
|
51
|
+
} | undefined) => Promise<boolean>;
|
|
52
|
+
supportedChains: (Chain.Arbitrum | Chain.Aurora | Chain.Avalanche | Chain.Base | Chain.Berachain | Chain.BinanceSmartChain | Chain.Bitcoin | Chain.BitcoinCash | Chain.Botanix | Chain.Cardano | Chain.Chainflip | Chain.Core | Chain.Corn | Chain.Cosmos | Chain.Cronos | Chain.Dash | Chain.Dogecoin | Chain.Ethereum | Chain.Gnosis | Chain.Hyperevm | Chain.Kujira | Chain.Litecoin | Chain.Maya | Chain.Monad | Chain.Near | Chain.Noble | Chain.Optimism | Chain.Polkadot | Chain.Polygon | Chain.Ripple | Chain.Solana | Chain.Sonic | Chain.Sui | Chain.THORChain | Chain.Ton | Chain.Tron | Chain.Unichain | Chain.XLayer | Chain.Zcash)[];
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export declare const KEYSTORE_SUPPORTED_CHAINS: (Chain.Arbitrum | Chain.Aurora | Chain.Avalanche | Chain.Base | Chain.Berachain | Chain.BinanceSmartChain | Chain.Bitcoin | Chain.BitcoinCash | Chain.Botanix | Chain.Cardano | Chain.Chainflip | Chain.Core | Chain.Corn | Chain.Cosmos | Chain.Cronos | Chain.Dash | Chain.Dogecoin | Chain.Ethereum | Chain.Gnosis | Chain.Hyperevm | Chain.Kujira | Chain.Litecoin | Chain.Maya | Chain.Monad | Chain.Near | Chain.Noble | Chain.Optimism | Chain.Polkadot | Chain.Polygon | Chain.Ripple | Chain.Solana | Chain.Sonic | Chain.Sui | Chain.THORChain | Chain.Ton | Chain.Tron | Chain.Unichain | Chain.XLayer | Chain.Zcash)[];
|
|
56
|
+
export declare function createKeystoreWallet<T extends Chain[]>({ chains, phrase, derivationPathMapOrIndex, }: {
|
|
57
|
+
chains: T;
|
|
58
|
+
phrase: string;
|
|
59
|
+
derivationPathMapOrIndex?: {
|
|
60
|
+
[chain in Chain]?: DerivationPathArray;
|
|
61
|
+
} | number;
|
|
62
|
+
}): Promise<{ [key in T[number]]: FullWallet[key]; }>;
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAEL,KAAK,mBAAmB,EAQzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,KAAK,QAAQ,EACb,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCzB,CAAC;AAEH,eAAO,MAAM,yBAAyB,omBAA2C,CAAC;AAElF,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,EAC5D,MAAM,EACN,MAAM,EACN,wBAAwB,GACzB,EAAE;IACD,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB,CAAC,EAAE;SAAG,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,mBAAmB;KAAE,GAAG,MAAM,CAAC;CAChF,cAsCY,GAAG,oCAEf"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"author": "swapkit-oss",
|
|
3
|
+
"dependencies": {
|
|
4
|
+
"@scure/bip39": "2.0.1",
|
|
5
|
+
"@tcswap/helpers": "4.5.15",
|
|
6
|
+
"@tcswap/toolboxes": "4.3.15",
|
|
7
|
+
"@tcswap/wallet-core": "4.0.59",
|
|
8
|
+
"blakejs": "1.2.1"
|
|
9
|
+
},
|
|
10
|
+
"description": "USwap - Wallet Keystore",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"bun": "./src/index.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs",
|
|
16
|
+
"types": "./dist/types/index.d.ts"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": ["dist/", "src/"],
|
|
20
|
+
"homepage": "https://github.com/thorchain/TCSwap",
|
|
21
|
+
"license": "Apache-2.0",
|
|
22
|
+
"name": "@tcswap/wallet-keystore",
|
|
23
|
+
"repository": {
|
|
24
|
+
"directory": "packages/wallet-keystore",
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/thorchain/TCSwap.git"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "bun run ./build.ts",
|
|
30
|
+
"build:clean": "rm -rf dist && bun run ./build.ts",
|
|
31
|
+
"clean": "rm -rf dist node_modules *.tsbuildinfo",
|
|
32
|
+
"test": "echo 'bun test'",
|
|
33
|
+
"test:ci": "echo 'bun test --coverage'",
|
|
34
|
+
"type-check": "bun tsc --noEmit",
|
|
35
|
+
"type-check:go": "tsgo"
|
|
36
|
+
},
|
|
37
|
+
"type": "module",
|
|
38
|
+
"version": "4.1.15"
|
|
39
|
+
}
|
package/src/helpers.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modifications © 2025 Horizontal Systems.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from "node:crypto";
|
|
6
|
+
import { generateMnemonic, validateMnemonic } from "@scure/bip39";
|
|
7
|
+
import { wordlist } from "@scure/bip39/wordlists/english.js";
|
|
8
|
+
|
|
9
|
+
export type Keystore = {
|
|
10
|
+
version: number;
|
|
11
|
+
meta: string;
|
|
12
|
+
crypto: {
|
|
13
|
+
cipher: string;
|
|
14
|
+
cipherparams: { iv: string };
|
|
15
|
+
ciphertext: string;
|
|
16
|
+
kdf: string;
|
|
17
|
+
kdfparams: { prf: string; dklen: number; salt: string; c: number };
|
|
18
|
+
mac: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
async function blake256(initData: Buffer | string) {
|
|
23
|
+
const blakeModule = await import("blakejs");
|
|
24
|
+
const { blake2bFinal, blake2bInit, blake2bUpdate } = blakeModule?.default || blakeModule;
|
|
25
|
+
const data = initData instanceof Buffer ? initData : Buffer.from(initData as string, "hex");
|
|
26
|
+
|
|
27
|
+
const context = blake2bInit(32);
|
|
28
|
+
blake2bUpdate(context, data);
|
|
29
|
+
|
|
30
|
+
return Array.from(blake2bFinal(context))
|
|
31
|
+
.map((byte) => (byte < 0x10 ? `0${byte.toString(16)}` : byte.toString(16)))
|
|
32
|
+
.join("");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function encryptToKeyStore(phrase: string, password: string) {
|
|
36
|
+
const cipher = "aes-128-ctr";
|
|
37
|
+
const iv = randomBytes(16);
|
|
38
|
+
const salt = randomBytes(32);
|
|
39
|
+
const kdfParams = { c: 262144, dklen: 32, prf: "hmac-sha256", salt: salt.toString("hex") };
|
|
40
|
+
|
|
41
|
+
const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, "sha256");
|
|
42
|
+
const cipherIV = createCipheriv(cipher, derivedKey.subarray(0, 16), iv);
|
|
43
|
+
const ciphertext = Buffer.concat([cipherIV.update(Buffer.from(phrase, "utf8")), cipherIV.final()]);
|
|
44
|
+
const initData = Buffer.concat([derivedKey.subarray(16, 32), Buffer.from(ciphertext)]);
|
|
45
|
+
const mac = await blake256(initData);
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
crypto: {
|
|
49
|
+
cipher,
|
|
50
|
+
cipherparams: { iv: iv.toString("hex") },
|
|
51
|
+
ciphertext: ciphertext.toString("hex"),
|
|
52
|
+
kdf: "pbkdf2",
|
|
53
|
+
kdfparams: kdfParams,
|
|
54
|
+
mac,
|
|
55
|
+
},
|
|
56
|
+
meta: "xchain-keystore",
|
|
57
|
+
version: 1,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function generatePhrase(size: 12 | 24 = 12) {
|
|
62
|
+
return generateMnemonic(wordlist, size === 12 ? 128 : 256);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function validatePhrase(phrase: string) {
|
|
66
|
+
return validateMnemonic(phrase, wordlist);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export async function decryptFromKeystore(keystore: Keystore, password: string) {
|
|
70
|
+
const { USwapError } = await import("@tcswap/helpers");
|
|
71
|
+
|
|
72
|
+
switch (keystore.version) {
|
|
73
|
+
case 1: {
|
|
74
|
+
const kdfParams = keystore.crypto.kdfparams;
|
|
75
|
+
const salt = Buffer.from(kdfParams.salt, "hex");
|
|
76
|
+
const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, "sha256");
|
|
77
|
+
|
|
78
|
+
const ciphertext = Buffer.from(keystore.crypto.ciphertext, "hex");
|
|
79
|
+
const initData = Buffer.concat([derivedKey.subarray(16, 32), ciphertext]);
|
|
80
|
+
const mac = await blake256(initData);
|
|
81
|
+
|
|
82
|
+
if (mac !== keystore.crypto.mac) {
|
|
83
|
+
throw new USwapError("wallet_keystore_invalid_password");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const decipher = createDecipheriv(
|
|
87
|
+
keystore.crypto.cipher,
|
|
88
|
+
derivedKey.subarray(0, 16),
|
|
89
|
+
Buffer.from(keystore.crypto.cipherparams.iv, "hex"),
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const phrase = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
93
|
+
return phrase.toString("utf8");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
default:
|
|
97
|
+
throw new USwapError("wallet_keystore_unsupported_version");
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Chain,
|
|
3
|
+
CosmosChains,
|
|
4
|
+
type DerivationPathArray,
|
|
5
|
+
EVMChains,
|
|
6
|
+
filterSupportedChains,
|
|
7
|
+
NetworkDerivationPath,
|
|
8
|
+
SubstrateChains,
|
|
9
|
+
UTXOChains,
|
|
10
|
+
updateDerivationPath,
|
|
11
|
+
WalletOption,
|
|
12
|
+
} from "@tcswap/helpers";
|
|
13
|
+
import type { FullWallet } from "@tcswap/toolboxes";
|
|
14
|
+
import { createWallet, getWalletSupportedChains } from "@tcswap/wallet-core";
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
decryptFromKeystore,
|
|
18
|
+
encryptToKeyStore,
|
|
19
|
+
generatePhrase,
|
|
20
|
+
type Keystore,
|
|
21
|
+
validatePhrase,
|
|
22
|
+
} from "./helpers";
|
|
23
|
+
|
|
24
|
+
export const keystoreWallet = createWallet({
|
|
25
|
+
connect: ({ addChain }) =>
|
|
26
|
+
async function connectKeystore(
|
|
27
|
+
chains: Chain[],
|
|
28
|
+
phrase: string,
|
|
29
|
+
derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number,
|
|
30
|
+
) {
|
|
31
|
+
const wallets = await createKeystoreWallet({ chains, derivationPathMapOrIndex, phrase });
|
|
32
|
+
|
|
33
|
+
for (const wallet of Object.values(wallets)) {
|
|
34
|
+
addChain({ ...wallet, chain: wallet.chain, walletType: WalletOption.KEYSTORE });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return true;
|
|
38
|
+
},
|
|
39
|
+
name: "connectKeystore",
|
|
40
|
+
supportedChains: [
|
|
41
|
+
...EVMChains,
|
|
42
|
+
...UTXOChains,
|
|
43
|
+
...CosmosChains.filter((chain) => chain !== Chain.Harbor),
|
|
44
|
+
...SubstrateChains,
|
|
45
|
+
Chain.Cardano,
|
|
46
|
+
Chain.Polkadot,
|
|
47
|
+
Chain.Chainflip,
|
|
48
|
+
Chain.Ripple,
|
|
49
|
+
Chain.Solana,
|
|
50
|
+
Chain.Sui,
|
|
51
|
+
Chain.Ton,
|
|
52
|
+
Chain.Tron,
|
|
53
|
+
Chain.Near,
|
|
54
|
+
],
|
|
55
|
+
walletType: WalletOption.KEYSTORE,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export const KEYSTORE_SUPPORTED_CHAINS = getWalletSupportedChains(keystoreWallet);
|
|
59
|
+
|
|
60
|
+
export async function createKeystoreWallet<T extends Chain[]>({
|
|
61
|
+
chains,
|
|
62
|
+
phrase,
|
|
63
|
+
derivationPathMapOrIndex,
|
|
64
|
+
}: {
|
|
65
|
+
chains: T;
|
|
66
|
+
phrase: string;
|
|
67
|
+
derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number;
|
|
68
|
+
}) {
|
|
69
|
+
const filteredChains = filterSupportedChains({
|
|
70
|
+
chains,
|
|
71
|
+
supportedChains: KEYSTORE_SUPPORTED_CHAINS,
|
|
72
|
+
walletType: WalletOption.KEYSTORE,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const wallets = await Promise.all(
|
|
76
|
+
filteredChains.map(async (chain) => {
|
|
77
|
+
const { getToolbox } = await import("@tcswap/toolboxes");
|
|
78
|
+
|
|
79
|
+
const derivationPathIndex = typeof derivationPathMapOrIndex === "number" ? derivationPathMapOrIndex : 0;
|
|
80
|
+
const derivationPathFromMap =
|
|
81
|
+
derivationPathMapOrIndex && typeof derivationPathMapOrIndex === "object"
|
|
82
|
+
? derivationPathMapOrIndex[chain]
|
|
83
|
+
: undefined;
|
|
84
|
+
|
|
85
|
+
const derivationArrayToUpdate = NetworkDerivationPath[chain].slice(
|
|
86
|
+
0,
|
|
87
|
+
chain === Chain.Solana ? 4 : 5,
|
|
88
|
+
) as DerivationPathArray;
|
|
89
|
+
|
|
90
|
+
const derivationPath: DerivationPathArray =
|
|
91
|
+
derivationPathFromMap || updateDerivationPath(derivationArrayToUpdate, { index: derivationPathIndex });
|
|
92
|
+
|
|
93
|
+
const toolbox = await getToolbox(chain, { derivationPath, phrase });
|
|
94
|
+
const address = (await toolbox.getAddress()) || "";
|
|
95
|
+
const wallet = { ...toolbox, address, chain };
|
|
96
|
+
|
|
97
|
+
return wallet;
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
return wallets.reduce(
|
|
102
|
+
(acc, wallet) => {
|
|
103
|
+
acc[wallet.chain as T[number]] = wallet as FullWallet[T[number]];
|
|
104
|
+
return acc;
|
|
105
|
+
},
|
|
106
|
+
{} as { [key in T[number]]: FullWallet[key] },
|
|
107
|
+
);
|
|
108
|
+
}
|