Skip to content

Commit

Permalink
added drep to addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
alessandrokonrad committed Feb 26, 2025
1 parent 1b9e398 commit a59343a
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 12 deletions.
3 changes: 3 additions & 0 deletions rs_lib/pkg/lucid_core.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ export class Addresses {
static scriptToCredential(script: Script): Credential;
static scriptToAddress(network: Network, script: Script, delegation?: Credential | null): string;
static scriptToRewardAddress(network: Network, script: Script): string;
static scriptToDrep(script: Script): string;
static credentialToDrep(credential: Credential): string;
static drepToCredential(id: string): Credential;
static credentialToAddress(network: Network, payment: Credential, delegation?: Credential | null): string;
static credentialToRewardAddress(network: Network, delegation: Credential): string;
static addressToCredential(address: string): Credential;
Expand Down
57 changes: 57 additions & 0 deletions rs_lib/pkg/lucid_core_bg.js
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,63 @@ export class Addresses {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
}
/**
* @param {Script} script
* @returns {string}
*/
static scriptToDrep(script) {
let deferred2_0;
let deferred2_1;
try {
const ret = wasm.addresses_scriptToDrep(script);
var ptr1 = ret[0];
var len1 = ret[1];
if (ret[3]) {
ptr1 = 0; len1 = 0;
throw takeFromExternrefTable0(ret[2]);
}
deferred2_0 = ptr1;
deferred2_1 = len1;
return getStringFromWasm0(ptr1, len1);
} finally {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
}
/**
* @param {Credential} credential
* @returns {string}
*/
static credentialToDrep(credential) {
let deferred2_0;
let deferred2_1;
try {
const ret = wasm.addresses_credentialToDrep(credential);
var ptr1 = ret[0];
var len1 = ret[1];
if (ret[3]) {
ptr1 = 0; len1 = 0;
throw takeFromExternrefTable0(ret[2]);
}
deferred2_0 = ptr1;
deferred2_1 = len1;
return getStringFromWasm0(ptr1, len1);
} finally {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
}
/**
* @param {string} id
* @returns {Credential}
*/
static drepToCredential(id) {
const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ret = wasm.addresses_drepToCredential(ptr0, len0);
if (ret[2]) {
throw takeFromExternrefTable0(ret[1]);
}
return takeFromExternrefTable0(ret[0]);
}
/**
* @param {Network} network
* @param {Credential} payment
Expand Down
Binary file modified rs_lib/pkg/lucid_core_bg.wasm
Binary file not shown.
3 changes: 3 additions & 0 deletions rs_lib/pkg/lucid_core_bg.wasm.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ export const addresses_scriptHashToCredential: (a: number, b: number) => any;
export const addresses_scriptToCredential: (a: any) => [number, number, number];
export const addresses_scriptToAddress: (a: any, b: any, c: number) => [number, number, number, number];
export const addresses_scriptToRewardAddress: (a: any, b: any) => [number, number, number, number];
export const addresses_scriptToDrep: (a: any) => [number, number, number, number];
export const addresses_credentialToDrep: (a: any) => [number, number, number, number];
export const addresses_drepToCredential: (a: number, b: number) => [number, number, number];
export const addresses_credentialToAddress: (a: any, b: any, c: number) => [number, number, number, number];
export const addresses_credentialToRewardAddress: (a: any, b: any) => [number, number, number, number];
export const addresses_addressToCredential: (a: number, b: number) => [number, number, number];
Expand Down
55 changes: 54 additions & 1 deletion rs_lib/src/addresses.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use super::codec::Script;
use super::error::{CoreErr, CoreError, CoreResult};
use super::hasher::Hasher;
use crate::utils::Utils;
use pallas_addresses::{Address, ShelleyAddress, ShelleyDelegationPart, ShelleyPaymentPart};
use serde::{Deserialize, Serialize};
use std::str::FromStr;
Expand Down Expand Up @@ -43,6 +44,37 @@ impl Addresses {
Self::credential_to_reward_address(network, Self::script_to_credential(script)?)
}

#[wasm_bindgen(js_name = scriptToDrep)]
pub fn script_to_drep(script: Script) -> CoreResult<String> {
Self::credential_to_drep(Self::script_to_credential(script)?)
}

#[wasm_bindgen(js_name = credentialToDrep)]
pub fn credential_to_drep(credential: Credential) -> CoreResult<String> {
match credential {
Credential::Key { hash } => {
Utils::encode_bech32("drep", &(hex::encode([0b0010_0010]) + &hash))
}
Credential::Script { hash } => {
Utils::encode_bech32("drep", &(hex::encode([0b0010_0011]) + &hash))
}
}
}

#[wasm_bindgen(js_name = drepToCredential)]
pub fn drep_to_credential(id: &str) -> CoreResult<Credential> {
let (_, id_raw) = bech32::decode(&id).map_err(CoreError::msg)?;
Ok(match id_raw[0] {
0b0010_0010 => Credential::Key {
hash: hex::encode(&id_raw[1..]),
},
0b0010_0011 => Credential::Script {
hash: hex::encode(&id_raw[1..]),
},
_ => return Err(CoreError::msg("Invalid drep id")),
})
}

#[wasm_bindgen(js_name = credentialToAddress)]
pub fn credential_to_address(
network: Network,
Expand Down Expand Up @@ -166,7 +198,7 @@ impl From<Network> for pallas_addresses::Network {
}
}

#[derive(Tsify, Serialize, Deserialize, Debug, Clone)]
#[derive(Tsify, Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
#[tsify(into_wasm_abi, from_wasm_abi)]
#[serde(tag = "type")]
pub enum Credential {
Expand Down Expand Up @@ -262,3 +294,24 @@ pub enum AddressDetails {
Reward(AddressDetailsInner),
Byron(AddressDetailsInner),
}

#[cfg(test)]
mod tests {
use super::Credential;
use crate::addresses::Addresses;

#[test]
fn test_roundtrip_drep() {
let credential = Credential::Key {
hash: "9257e68f13d3a9fcebc6be8997ccc092781e2fbd45c8891dc73f7e1d".to_string(),
};

assert_eq!(
Addresses::drep_to_credential(
&Addresses::credential_to_drep(credential.clone()).unwrap()
)
.unwrap(),
credential
);
}
}
20 changes: 11 additions & 9 deletions rs_lib/src/codec.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use crate::utils::Utils;

use super::{
addresses::{Addresses, Credential},
error::{CoreErr, CoreError, CoreResult},
};
use crate::utils::Utils;
use pallas_addresses::Address;
use pallas_codec::utils::CborWrap;
use pallas_primitives::{
Expand Down Expand Up @@ -903,15 +902,18 @@ impl TryFrom<Certificate> for pallas_primitives::conway::Certificate {
pallas_primitives::conway::DRep::NoConfidence
}
DelegVariant::DRep(id) => {
let (_, id_raw) = bech32::decode(&id).map_err(CoreError::msg)?;
match id_raw[0] {
0b0010_0010 => {
pallas_primitives::conway::DRep::Key(id_raw[1..].into())
let credential = Addresses::drep_to_credential(&id)?;
match credential {
Credential::Key { hash } => {
pallas_primitives::conway::DRep::Key(
hash.parse().map_err(CoreError::msg)?,
)
}
0b0010_0011 => {
pallas_primitives::conway::DRep::Script(id_raw[1..].into())
Credential::Script { hash } => {
pallas_primitives::conway::DRep::Script(
hash.parse().map_err(CoreError::msg)?,
)
}
_ => return Err(CoreError::msg("Invalid DRep id")),
}
}
_ => unreachable!(),
Expand Down
3 changes: 1 addition & 2 deletions rs_lib/src/crypto.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::str::FromStr;

use super::addresses::Credential;
use crate::error::{CoreError, CoreResult};
use bech32::Hrp;
Expand All @@ -12,6 +10,7 @@ use pallas_wallet::{
};
use rand::rngs::OsRng;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
use tsify::Tsify;
use wasm_bindgen::prelude::wasm_bindgen;

Expand Down

0 comments on commit a59343a

Please sign in to comment.