Support t3 addresses

This commit is contained in:
Hanh 2023-02-17 12:34:00 +10:00
parent c1b4c88fe1
commit e3dfd17e33
3 changed files with 46 additions and 10 deletions

View File

@ -164,8 +164,8 @@ pub fn build_tx(
for output in plan.outputs.iter() {
let value = Amount::from_u64(output.amount).unwrap();
match &output.destination {
Destination::Transparent(addr) => {
let transparent_address = TransparentAddress::PublicKey(*addr);
Destination::Transparent(_addr) => {
let transparent_address = output.destination.transparent();
builder.add_transparent_output(&transparent_address, value)?;
}
Destination::Sapling(addr) => {

View File

@ -57,16 +57,46 @@ pub enum Source {
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
#[serde_as]
pub enum Destination {
Transparent(#[serde(with = "SerHex::<Strict>")] [u8; 20]), // MD5
Transparent(#[serde(with = "SerHex::<Strict>")] [u8; 21]), // t1/t3 + Hash
Sapling(#[serde(with = "SerHex::<Strict>")] [u8; 43]), // Diversifier + Jubjub Point
Orchard(#[serde(with = "SerHex::<Strict>")] [u8; 43]), // Diviersifer + Pallas Point
}
impl Destination {
pub fn address(&self, network: &Network) -> String {
pub fn from_transparent(ta: &TransparentAddress) -> Self {
let mut d = [0u8; 21];
match ta {
TransparentAddress::PublicKey(data) => {
d[0] = 0;
d[1..21].copy_from_slice(&*data);
}
TransparentAddress::Script(data) => {
d[0] = 1;
d[1..21].copy_from_slice(&*data);
}
}
Destination::Transparent(d)
}
pub fn transparent(&self) -> TransparentAddress {
match self {
Destination::Transparent(data) => {
let ta = TransparentAddress::PublicKey(data.clone());
let hash: [u8; 20] = data[1..21].try_into().unwrap();
let ta = if data[0] == 0 {
TransparentAddress::PublicKey(hash)
} else {
TransparentAddress::Script(hash)
};
ta
}
_ => unreachable!(),
}
}
pub fn address(&self, network: &Network) -> String {
match self {
Destination::Transparent(_data) => {
let ta = self.transparent();
ta.encode(network)
}
Destination::Sapling(data) => {

View File

@ -10,12 +10,12 @@ pub fn decode(network: &Network, address: &str) -> anyhow::Result<[Option<Destin
if let Ok(data) = decode_payment_address(network.hrp_sapling_payment_address(), address) {
let destination = Destination::Sapling(data.to_bytes());
destinations[Pool::Sapling as usize] = Some(destination);
} else if let Ok(Some(TransparentAddress::PublicKey(data))) = decode_transparent_address(
} else if let Ok(Some(ta)) = decode_transparent_address(
&network.b58_pubkey_address_prefix(),
&network.b58_script_address_prefix(),
address,
) {
let destination = Destination::Transparent(data);
let destination = Destination::from_transparent(&ta);
destinations[Pool::Transparent as usize] = Some(destination);
} else if let Ok(address) = ZcashAddress::try_from_encoded(address) {
// ZcashAddress only supports Zcash
@ -37,16 +37,22 @@ pub fn decode(network: &Network, address: &str) -> anyhow::Result<[Option<Destin
destinations[Pool::Sapling as usize] = Some(destination);
}
Receiver::P2pkh(data) => {
let destination = Destination::Transparent(data);
let destination =
Destination::from_transparent(&TransparentAddress::PublicKey(data));
destinations[Pool::Transparent as usize] = Some(destination);
}
Receiver::P2sh(data) => {
let destination =
Destination::from_transparent(&TransparentAddress::Script(data));
destinations[Pool::Transparent as usize] = Some(destination);
}
Receiver::P2sh(_) => {}
Receiver::Unknown { .. } => {}
}
}
}
AddressKind::P2pkh(data) => {
let destination = Destination::Transparent(data);
let destination =
Destination::from_transparent(&TransparentAddress::PublicKey(data));
destinations[Pool::Transparent as usize] = Some(destination);
}
AddressKind::P2sh(_) => {}