Skip to content

Commit

Permalink
added xpub methods
Browse files Browse the repository at this point in the history
  • Loading branch information
alessandrokonrad committed Feb 10, 2025
1 parent 2d6bdb0 commit 0baefd0
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 4 deletions.
2 changes: 2 additions & 0 deletions rs_lib/pkg/lucid_core.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ export class Crypto {
free(): void;
static privateKeyToDetails(key: string): KeyDetails;
static seedToDetails(seed: string, index: number, part: Part): KeyDetails;
static seedToXpub(seed: string, index: number): string;
static xpubToPublicKey(xpub: string, part: Part): string;
static generateSeed(): string;
/**
* generates extended ed25519 private key
Expand Down
50 changes: 50 additions & 0 deletions rs_lib/pkg/lucid_core_bg.js
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,56 @@ export class Crypto {
}
return takeFromExternrefTable0(ret[0]);
}
/**
* @param {string} seed
* @param {number} index
* @returns {string}
*/
static seedToXpub(seed, index) {
let deferred3_0;
let deferred3_1;
try {
const ptr0 = passStringToWasm0(seed, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ret = wasm.crypto_seedToXpub(ptr0, len0, index);
var ptr2 = ret[0];
var len2 = ret[1];
if (ret[3]) {
ptr2 = 0; len2 = 0;
throw takeFromExternrefTable0(ret[2]);
}
deferred3_0 = ptr2;
deferred3_1 = len2;
return getStringFromWasm0(ptr2, len2);
} finally {
wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
}
}
/**
* @param {string} xpub
* @param {Part} part
* @returns {string}
*/
static xpubToPublicKey(xpub, part) {
let deferred3_0;
let deferred3_1;
try {
const ptr0 = passStringToWasm0(xpub, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ret = wasm.crypto_xpubToPublicKey(ptr0, len0, part);
var ptr2 = ret[0];
var len2 = ret[1];
if (ret[3]) {
ptr2 = 0; len2 = 0;
throw takeFromExternrefTable0(ret[2]);
}
deferred3_0 = ptr2;
deferred3_1 = len2;
return getStringFromWasm0(ptr2, len2);
} finally {
wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
}
}
/**
* @returns {string}
*/
Expand Down
Binary file modified rs_lib/pkg/lucid_core_bg.wasm
Binary file not shown.
2 changes: 2 additions & 0 deletions rs_lib/pkg/lucid_core_bg.wasm.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ export const codec_decodeUtxo: (a: number, b: number) => [number, number, number
export const codec_encodeNativeScript: (a: any) => [number, number, number, number];
export const crypto_privateKeyToDetails: (a: number, b: number) => [number, number, number];
export const crypto_seedToDetails: (a: number, b: number, c: number, d: any) => [number, number, number];
export const crypto_seedToXpub: (a: number, b: number, c: number) => [number, number, number, number];
export const crypto_xpubToPublicKey: (a: number, b: number, c: any) => [number, number, number, number];
export const crypto_generateSeed: () => [number, number];
export const crypto_generatePrivateKey: () => [number, number];
export const crypto_sign: (a: number, b: number, c: number, d: number) => [number, number, number, number];
Expand Down
41 changes: 37 additions & 4 deletions rs_lib/src/crypto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ use bech32::Hrp;
use pallas_crypto::key::ed25519::{PublicKey, SecretKey, SecretKeyExtended, Signature};
use pallas_primitives::Bytes;
use pallas_traverse::ComputeHash;
use pallas_wallet::{hd::Bip32PrivateKey, PrivateKey};
use pallas_wallet::{
hd::{Bip32PrivateKey, Bip32PublicKey},
PrivateKey,
};
use rand::rngs::OsRng;
use serde::{Deserialize, Serialize};
use tsify::Tsify;
Expand Down Expand Up @@ -73,6 +76,35 @@ impl Crypto {
})
}

#[wasm_bindgen(js_name = seedToXpub)]
pub fn seed_to_xpub(seed: &str, index: u32) -> CoreResult<String> {
let bip32_priv = Bip32PrivateKey::from_bip39_mnenomic(seed.to_string(), "".to_string())
.map_err(CoreError::msg)?;
let account_key = bip32_priv
.derive(harden(1852))
.derive(harden(1815))
.derive(harden(index));

Ok(account_key.to_public().to_bech32())
}

#[wasm_bindgen(js_name = xpubToPublicKey)]
pub fn xpub_to_public_key(xpub: &str, part: Part) -> CoreResult<String> {
let bip32_public = Bip32PublicKey::from_bech32(xpub.to_string()).map_err(CoreError::msg)?;

let public_key = bip32_public
.derive(match part {
Part::Payment => 0,
Part::Delegation => 2,
})
.map_err(CoreError::msg)?
.derive(0)
.map_err(CoreError::msg)?
.to_ed25519_pubkey();

Ok(public_key.to_string())
}

#[wasm_bindgen(js_name = generateSeed)]
pub fn generate_seed() -> String {
Bip32PrivateKey::generate_with_mnemonic(OsRng, "".to_string())
Expand Down Expand Up @@ -144,9 +176,6 @@ impl Crypto {
}

pub fn seed_to_private_key(seed: &str, index: u32, part: Part) -> CoreResult<PrivateKey> {
fn harden(n: u32) -> u32 {
0x80000000 + n
}
let bip32_priv = Bip32PrivateKey::from_bip39_mnenomic(seed.to_string(), "".to_string())
.map_err(CoreError::msg)?;
let account_key = bip32_priv
Expand All @@ -166,6 +195,10 @@ impl Crypto {
}
}

fn harden(n: u32) -> u32 {
0x80000000 + n
}

#[derive(Tsify, Serialize, Deserialize, Debug, Clone)]
#[tsify(into_wasm_abi, from_wasm_abi)]
pub enum Part {
Expand Down

0 comments on commit 0baefd0

Please sign in to comment.