Skip to content

Commit f73a2bb

Browse files
committed
update avax
1 parent ec888dd commit f73a2bb

5 files changed

Lines changed: 268 additions & 33 deletions

File tree

libs/ur-registry/src/avalanche/avax_sign_request.rs

Lines changed: 82 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::cbor::{cbor_array, cbor_map};
22
use crate::error::{URError, URResult};
3-
use crate::registry_types::{RegistryType, AVAX_SIGN_REQUEST, UUID, CRYPTO_KEYPATH};
3+
use crate::registry_types::{RegistryType, AVAX_SIGN_REQUEST, UUID, CRYPTO_KEYPATH, AVAX_UTXO};
44
use crate::crypto_key_path::CryptoKeyPath;
55
use crate::traits::{From as FromCbor, RegistryItem, To};
66
use crate::types::{Bytes, Fingerprint};
7+
use super::avax_utxo::AvaxUtxo;
78
use alloc::string::{String, ToString};
89
use alloc::vec::Vec;
910
use minicbor::data::{Int, Tag};
@@ -13,24 +14,28 @@ use minicbor::{Decoder, Encoder};
1314
const REQUEST_ID: u8 = 1;
1415
const SIGN_DATA: u8 = 2;
1516
const DERIVATION_PATH: u8 = 3;
17+
const UTXOS: u8 = 4;
1618

1719
#[derive(Debug, Clone, Default)]
1820
pub struct AvaxSignRequest {
1921
request_id: Bytes,
2022
sign_data: Bytes,
21-
derivation_path: CryptoKeyPath,
23+
derivation_path: Vec<CryptoKeyPath>,
24+
utxos: Vec<AvaxUtxo>,
2225
}
2326

2427
impl AvaxSignRequest {
2528
pub fn new(
2629
request_id: Bytes,
2730
sign_data: Bytes,
28-
derivation_path: CryptoKeyPath,
31+
derivation_path: Vec<CryptoKeyPath>,
32+
utxos: Vec<AvaxUtxo>,
2933
) -> Self {
3034
AvaxSignRequest {
3135
request_id,
3236
sign_data,
3337
derivation_path,
38+
utxos: utxos,
3439
}
3540
}
3641

@@ -50,13 +55,21 @@ impl AvaxSignRequest {
5055
self.sign_data = data;
5156
}
5257

53-
pub fn get_derivation_path(&self) -> CryptoKeyPath {
58+
pub fn get_derivation_path(&self) -> Vec<CryptoKeyPath> {
5459
self.derivation_path.clone()
5560
}
5661

57-
pub fn set_derivation_path(&mut self, derivation_path: CryptoKeyPath) {
62+
pub fn set_derivation_path(&mut self, derivation_path: Vec<CryptoKeyPath>) {
5863
self.derivation_path = derivation_path;
5964
}
65+
66+
pub fn get_utxos(&self) -> Vec<AvaxUtxo> {
67+
self.utxos.clone()
68+
}
69+
70+
pub fn set_utxos(&mut self, utxos: Vec<AvaxUtxo>) {
71+
self.utxos = utxos;
72+
}
6073
}
6174

6275
impl RegistryItem for AvaxSignRequest {
@@ -71,21 +84,43 @@ impl<C> minicbor::Encode<C> for AvaxSignRequest {
7184
e: &mut Encoder<W>,
7285
_ctx: &mut C,
7386
) -> Result<(), minicbor::encode::Error<W::Error>> {
74-
e.map(3)?;
87+
let utxos = self.get_utxos();
88+
let map_size = if utxos.is_empty() { 3 } else { 4 };
89+
90+
e.map(map_size)?;
7591
e.int(Int::from(REQUEST_ID))?
7692
.tag(Tag::Unassigned(UUID.get_tag()))?
7793
.bytes(&self.request_id)?;
7894
e.int(Int::from(SIGN_DATA))?.bytes(&self.sign_data)?;
79-
e.int(Int::from(DERIVATION_PATH))?;
80-
e.tag(Tag::Unassigned(CRYPTO_KEYPATH.get_tag()))?;
81-
CryptoKeyPath::encode(&self.derivation_path, e, _ctx)?;
95+
96+
let key_derivation_paths = self.get_derivation_path();
97+
if key_derivation_paths.is_empty() {
98+
return Err(minicbor::encode::Error::message(
99+
"key derivation paths is invalid",
100+
));
101+
}
102+
103+
e.int(Int::from(DERIVATION_PATH))?.array(key_derivation_paths.len() as u64)?;
104+
for path in key_derivation_paths {
105+
e.tag(Tag::Unassigned(CRYPTO_KEYPATH.get_tag()))?;
106+
CryptoKeyPath::encode(&path, e, _ctx)?;
107+
}
108+
109+
if !utxos.is_empty() {
110+
e.int(Int::from(UTXOS))?
111+
.array(utxos.len() as u64)?;
112+
for utxo in utxos {
113+
e.tag(Tag::Unassigned(AvaxUtxo::get_registry_type().get_tag()))?;
114+
AvaxUtxo::encode(&utxo, e, _ctx)?;
115+
}
116+
}
82117

83118
Ok(())
84119
}
85120
}
86121

87122
impl<'b, C> minicbor::Decode<'b, C> for AvaxSignRequest {
88-
fn decode(d: &mut Decoder<'b>, _ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
123+
fn decode(d: &mut Decoder<'b>, ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
89124
let mut result = AvaxSignRequest::default();
90125

91126
cbor_map(d, &mut result, |key, obj, d| {
@@ -100,8 +135,36 @@ impl<'b, C> minicbor::Decode<'b, C> for AvaxSignRequest {
100135
obj.sign_data = d.bytes()?.to_vec();
101136
}
102137
DERIVATION_PATH => {
103-
d.tag()?;
104-
obj.derivation_path = CryptoKeyPath::decode(d, _ctx)?;
138+
cbor_array(
139+
d,
140+
&mut obj.derivation_path,
141+
|_key, obj, d| {
142+
let tag = d.tag()?;
143+
if !tag.eq(&Tag::Unassigned(
144+
CryptoKeyPath::get_registry_type().get_tag(),
145+
)) {
146+
return Err(minicbor::decode::Error::message(
147+
"CryptoKeyPath tag is invalid",
148+
));
149+
}
150+
obj.push(CryptoKeyPath::decode(d, ctx)?);
151+
Ok(())
152+
},
153+
)?;
154+
}
155+
UTXOS => {
156+
cbor_array(d, &mut obj.utxos, |_key, obj, d| {
157+
let tag = d.tag()?;
158+
if !tag.eq(&Tag::Unassigned(
159+
AvaxUtxo::get_registry_type().get_tag(),
160+
)) {
161+
return Err(minicbor::decode::Error::message(
162+
"AvaxUtxo tag is invalid",
163+
));
164+
}
165+
obj.push(AvaxUtxo::decode(d, ctx)?);
166+
Ok(())
167+
})?;
105168
}
106169
_ => {}
107170
}
@@ -139,19 +202,21 @@ mod tests {
139202
let components = vec![
140203
PathComponent::new(Some(44), true).unwrap(),
141204
PathComponent::new(Some(9000), true).unwrap(),
142-
PathComponent::new(Some(1), true).unwrap(),
205+
PathComponent::new(Some(0), true).unwrap(),
143206
PathComponent::new(Some(0), false).unwrap(),
144207
PathComponent::new(Some(0), false).unwrap(),
145208
];
209+
let utxos = vec![];
146210
let unsigned_data = AvaxSignRequest {
147211
request_id: [12, 34, 56, 78].to_vec(),
148-
sign_data: Vec::from_hex("000000000022000000050000000000000000000000000000000000000000000000000000000000000000000000023d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa0000000700000000000f42400000000000000000000000010000000132336f8715dd313a426155cccc15ba27c3033dae3d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000007000000004d58ade90000000000000000000000010000000132336f8715dd313a426155cccc15ba27c3033dae00000001410b47f7c7aa13f88122be58735c5e985edc65d86fb0baf0b016359c22253d75000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa00000005000000004d680464000000010000000000000000")
212+
sign_data: Vec::from_hex("0000000000220000000100000000000000000000000000000000000000000000000000000000000000000000000221e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000070000000000007d4c00000000000000000000000100000001b5e66be5c7093d1114d74940333c0c45f81092c521e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000070000000002ed658f00000000000000000000000100000001b5e66be5c7093d1114d74940333c0c45f81092c500000001918cf421e834d4d7031175ac9605ba292ee04a17beb4fb81f8557969b4651b860000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000050000000002edf716000000010000000000000000")
149213
.unwrap(),
150-
derivation_path: CryptoKeyPath::new(
214+
derivation_path: vec![CryptoKeyPath::new(
151215
components,
152216
Some([45,11,218,188]),
153217
None,
154-
),
218+
)],
219+
utxos
155220
};
156221
let result: Vec<u8> = unsigned_data.try_into().unwrap();
157222
println!("result = {:?}", hex::encode(&result));
@@ -164,7 +229,7 @@ mod tests {
164229
let ur_string = "ur:avax-sign-request/otadtpdafybncpetglaohkaddmaeaeaeaeaecpaeaeaeahaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaofsndtnrtwecakobwdytkisbazcwmcyfwbznnqdlttbtdmdbnmtyltdmyhsrkvopkaeaeaeataeaeaeaeaebsfwfzaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadeyeojlltbzutehftfwhsgosfsfbzrddisraxfsplfsndtnrtwecakobwdytkisbazcwmcyfwbznnqdlttbtdmdbnmtyltdmyhsrkvopkaeaeaeataeaeaeaegthdpmwlaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadeyeojlltbzutehftfwhsgosfsfbzrddisraxfsplaeaeaeadfpbdflylstpkbwyalycprnhdjkhhhymkhyuoihtpjlpfrdwtpfcmecnscpdafskpaeaeaeadfsndtnrtwecakobwdytkisbazcwmcyfwbznnqdlttbtdmdbnmtyltdmyhsrkvopkaeaeaeahaeaeaeaegtisaaieaeaeaeadaeaeaeaeaeaeaeaeaxtaaddyoeadlecsdwykcfcndeykaeykaewkaewkaocybggdrprfknlulrbk";
165230

166231
let bytes =
167-
Vec::from_hex("a501d825440c22384e0258de00000000000000000001ed5f38341e436e5d46e2bb00b45d62ae97d1b050c64bc634ae10626739e35c4b0000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000007000000000089544000000000000000000000000100000001512e7191685398f00663e12197a3d8f6012d9ea300000001db720ad6707915cc4751fb7e5491a3af74e127a1d81817abe9438590c0833fe10000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000050000000000989680000000010000000000000000031a0102030406786f7870756236445872797a384b6437586368745876446e6b6a61726138337368474a4838756275374b5a684868506670344c3173687644455969465a6d3332454b486e796f34627661346778586a61624647715937664e7338476764346b68597a326f4e73324b594c663536613947580706")
232+
Vec::from_hex("a401d82550d797b45aef4b483cb106506e288b2c77025903960000000000220000000100000000000000000000000000000000000000000000000000000000000000000000000221e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000007000000000031cb3a00000000000000000000000100000001b5e66be5c7093d1114d74940333c0c45f81092c521e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000070000000005dabac900000000000000000000000100000001b5e66be5c7093d1114d74940333c0c45f81092c500000008120d0def706b8b759935b8ea9727662aafa5381e598a074daddc82492549cd760000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000000000046239d0000000100000000174d1a9b28e1d4d518f1999d4f8ac422b8a3a4755001f5965e8d05c93359feb10000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000000000131021c0000000100000000174d1a9b28e1d4d518f1999d4f8ac422b8a3a4755001f5965e8d05c93359feb10000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000000000176b6a5000000010000000065a3b1de10620296debfa01aa953e45ddd19d2c39e3dacb9a92e6a85ca8a309c0000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000000000098968000000001000000006f6522ae52b0231076dc63ff95f7ea22e2fd80943e37235302c7ee32afce4cd60000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000500000000009896800000000100000000845649c3d1a630d8b466f7b727f6577cb4a17864699e6de756e484b81d84cd2a0000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000500000000006c2b440000000100000000d1e6480c1825197e2ec293a60bacdc7f60bfba2f3cc5383855180b45d595a7030000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000500000000007a12000000000100000000f59b9a175ebe4ccd8de5dcfc6a26870414f30c696cce19283f30145624b445b70000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000005000000000107a4930000000100000000000000000382d90130a2018a182cf5192328f500f500f400f4021a2d0bdabcd90130a2018a182cf5192328f500f500f401f4021a2d0bdabc0480")
168233
.unwrap();
169234
let data = AvaxSignRequest::try_from(bytes).unwrap();
170235
assert_eq!(

libs/ur-registry/src/avalanche/avax_signature.rs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::cbor::cbor_map;
1+
use crate::cbor::{cbor_map, cbor_array};
22
use crate::error::{URError, URResult};
33
use crate::registry_types::{RegistryType, AVAX_SIGNATURE, UUID};
44
use crate::traits::{From as FromCbor, RegistryItem, To};
@@ -15,7 +15,7 @@ const SIGNATURE: u8 = 2;
1515
#[derive(Clone, Debug, Default)]
1616
pub struct AvaxSignature {
1717
request_id: Bytes,
18-
signature: Bytes,
18+
signatures: Vec<Bytes>,
1919
}
2020

2121
impl AvaxSignature {
@@ -27,22 +27,22 @@ impl AvaxSignature {
2727
self.request_id = id;
2828
}
2929

30-
pub fn set_signature(&mut self, signature: Bytes) {
31-
self.signature = signature;
30+
pub fn set_signature(&mut self, signatures: Vec<Bytes>) {
31+
self.signatures = signatures;
3232
}
3333

34-
pub fn new(request_id: Bytes, signature: Bytes) -> Self {
34+
pub fn new(request_id: Bytes, signatures: Vec<Bytes>) -> Self {
3535
AvaxSignature {
3636
request_id,
37-
signature,
37+
signatures,
3838
}
3939
}
4040

4141
pub fn get_request_id(&self) -> Bytes {
4242
self.request_id.clone()
4343
}
44-
pub fn get_signature(&self) -> Bytes {
45-
self.signature.clone()
44+
pub fn get_signatures(&self) -> Vec<Bytes> {
45+
self.signatures.clone()
4646
}
4747
}
4848

@@ -61,7 +61,12 @@ impl<C> minicbor::Encode<C> for AvaxSignature {
6161
let mut size = 2;
6262
e.map(size)?;
6363
e.int(Int::from(REQUEST_ID))?.bytes(&self.request_id)?;
64-
e.int(Int::from(SIGNATURE))?.bytes(&self.signature)?;
64+
65+
e.int(Int::from(SIGNATURE))?
66+
.array(self.signatures.len() as u64)?;
67+
for signature in &self.signatures {
68+
e.bytes(signature)?;
69+
}
6570
Ok(())
6671
}
6772
}
@@ -77,7 +82,13 @@ impl<'b, C> minicbor::Decode<'b, C> for AvaxSignature {
7782
obj.request_id = d.bytes()?.to_vec();
7883
}
7984
SIGNATURE => {
80-
obj.signature = d.bytes()?.to_vec();
85+
let signature_len = d.array()?;
86+
obj.signatures = Vec::new();
87+
if signature_len.is_some() {
88+
for _ in 0..signature_len.unwrap() {
89+
obj.signatures.push(d.bytes()?.to_vec());
90+
}
91+
}
8192
}
8293
_ => {}
8394
}
@@ -101,16 +112,19 @@ impl FromCbor<AvaxSignature> for AvaxSignature {
101112

102113
#[cfg(test)]
103114
mod tests {
104-
use crate::{avalanche::avax_signature::AvaxSignature, traits::{From as FromCbor, To}};
115+
use crate::{
116+
avalanche::avax_signature::AvaxSignature,
117+
traits::{From as FromCbor, To},
118+
};
105119
use alloc::vec::Vec;
120+
use alloc::vec;
106121
use hex::FromHex;
107122

108123
#[test]
109124
fn test_avax_signature_encode() {
110-
let request_id =
111-
[01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15].to_vec();
125+
let request_id = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15].to_vec();
112126
let signature = hex::decode("80337c3a47f1b69a38544c69f379a4aa0ea8ef1f853b718d992c6a73c643e63ca6dff9186cd2f41a45c6405ef6b71353c3b6864c799699964e559afa7aa7f7c345c1966c998193539985e2724831025beadb0a1a269f54ec4a95c69a3bc4295a5c6c5f926dcc84fbf2251b56c841f764b162e062c8db5302090aa1d528d83cf48b53aa0709009f3975d63ea8ff26e80b4f2f01380e100860b304fccbbc0877278efbf72fb045331f76df132a5119bd51590f0502350d3cb31f14daba731893c5834e2e8bfa5bf517ac63693b81041cf7f8ed7293d034b3e54c4d02c66542d3b9648e9ecf912101a20b87f39d75d4f1a02c816f424c8a1fda05a9e7e8ccf064d31c0bf10c661872a7f40c0b1d75dbfae6a95ddcc81eead3f49cfa3803517cf9d79f2541041416c3e8ecfc0292d864f34fe613866e86b7b0bc7abc5b3f84e6ee3b06933c4f82552bb985f6b7fac0a580e94d7a0e8e295dd2e49ece66ead0ee6a46b84553302b94701a9d24b91c085154b7e67a7ac59e3a41ae96c8e1afd1aa778633457005555cff4198820c2aa8ea1ff0f86a9f4ae03d96b215449c63bff7cae9a114c9db05cc4e4d9993a13149393b6a6992b6042bb82d34ffdc7f1aeaf17fa5240ca6ebd9e62fd6c90bce91747af37bf8fc3c72859a1dfec2cf2c49295e1ccdc09b91d9074d204dea74a70002baa05fc86acfcff45fe7f0dd7e5e24c8f69575").unwrap();
113-
let avax_signature = AvaxSignature::new(request_id, signature);
127+
let avax_signature = AvaxSignature::new(request_id, vec![signature]);
114128
assert_eq!(
115129
"a2014f0102030405060708090a0b0c0d0e0f0259020080337c3a47f1b69a38544c69f379a4aa0ea8ef1f853b718d992c6a73c643e63ca6dff9186cd2f41a45c6405ef6b71353c3b6864c799699964e559afa7aa7f7c345c1966c998193539985e2724831025beadb0a1a269f54ec4a95c69a3bc4295a5c6c5f926dcc84fbf2251b56c841f764b162e062c8db5302090aa1d528d83cf48b53aa0709009f3975d63ea8ff26e80b4f2f01380e100860b304fccbbc0877278efbf72fb045331f76df132a5119bd51590f0502350d3cb31f14daba731893c5834e2e8bfa5bf517ac63693b81041cf7f8ed7293d034b3e54c4d02c66542d3b9648e9ecf912101a20b87f39d75d4f1a02c816f424c8a1fda05a9e7e8ccf064d31c0bf10c661872a7f40c0b1d75dbfae6a95ddcc81eead3f49cfa3803517cf9d79f2541041416c3e8ecfc0292d864f34fe613866e86b7b0bc7abc5b3f84e6ee3b06933c4f82552bb985f6b7fac0a580e94d7a0e8e295dd2e49ece66ead0ee6a46b84553302b94701a9d24b91c085154b7e67a7ac59e3a41ae96c8e1afd1aa778633457005555cff4198820c2aa8ea1ff0f86a9f4ae03d96b215449c63bff7cae9a114c9db05cc4e4d9993a13149393b6a6992b6042bb82d34ffdc7f1aeaf17fa5240ca6ebd9e62fd6c90bce91747af37bf8fc3c72859a1dfec2cf2c49295e1ccdc09b91d9074d204dea74a70002baa05fc86acfcff45fe7f0dd7e5e24c8f69575",
116130
hex::encode(avax_signature.to_bytes().unwrap()).to_lowercase()
@@ -128,6 +142,6 @@ mod tests {
128142
[01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15].to_vec(),
129143
avax_signature.get_request_id()
130144
);
131-
assert_eq!(hex::decode("80337c3a47f1b69a38544c69f379a4aa0ea8ef1f853b718d992c6a73c643e63ca6dff9186cd2f41a45c6405ef6b71353c3b6864c799699964e559afa7aa7f7c345c1966c998193539985e2724831025beadb0a1a269f54ec4a95c69a3bc4295a5c6c5f926dcc84fbf2251b56c841f764b162e062c8db5302090aa1d528d83cf48b53aa0709009f3975d63ea8ff26e80b4f2f01380e100860b304fccbbc0877278efbf72fb045331f76df132a5119bd51590f0502350d3cb31f14daba731893c5834e2e8bfa5bf517ac63693b81041cf7f8ed7293d034b3e54c4d02c66542d3b9648e9ecf912101a20b87f39d75d4f1a02c816f424c8a1fda05a9e7e8ccf064d31c0bf10c661872a7f40c0b1d75dbfae6a95ddcc81eead3f49cfa3803517cf9d79f2541041416c3e8ecfc0292d864f34fe613866e86b7b0bc7abc5b3f84e6ee3b06933c4f82552bb985f6b7fac0a580e94d7a0e8e295dd2e49ece66ead0ee6a46b84553302b94701a9d24b91c085154b7e67a7ac59e3a41ae96c8e1afd1aa778633457005555cff4198820c2aa8ea1ff0f86a9f4ae03d96b215449c63bff7cae9a114c9db05cc4e4d9993a13149393b6a6992b6042bb82d34ffdc7f1aeaf17fa5240ca6ebd9e62fd6c90bce91747af37bf8fc3c72859a1dfec2cf2c49295e1ccdc09b91d9074d204dea74a70002baa05fc86acfcff45fe7f0dd7e5e24c8f69575").unwrap(), avax_signature.get_signature());
145+
assert_eq!(hex::decode("80337c3a47f1b69a38544c69f379a4aa0ea8ef1f853b718d992c6a73c643e63ca6dff9186cd2f41a45c6405ef6b71353c3b6864c799699964e559afa7aa7f7c345c1966c998193539985e2724831025beadb0a1a269f54ec4a95c69a3bc4295a5c6c5f926dcc84fbf2251b56c841f764b162e062c8db5302090aa1d528d83cf48b53aa0709009f3975d63ea8ff26e80b4f2f01380e100860b304fccbbc0877278efbf72fb045331f76df132a5119bd51590f0502350d3cb31f14daba731893c5834e2e8bfa5bf517ac63693b81041cf7f8ed7293d034b3e54c4d02c66542d3b9648e9ecf912101a20b87f39d75d4f1a02c816f424c8a1fda05a9e7e8ccf064d31c0bf10c661872a7f40c0b1d75dbfae6a95ddcc81eead3f49cfa3803517cf9d79f2541041416c3e8ecfc0292d864f34fe613866e86b7b0bc7abc5b3f84e6ee3b06933c4f82552bb985f6b7fac0a580e94d7a0e8e295dd2e49ece66ead0ee6a46b84553302b94701a9d24b91c085154b7e67a7ac59e3a41ae96c8e1afd1aa778633457005555cff4198820c2aa8ea1ff0f86a9f4ae03d96b215449c63bff7cae9a114c9db05cc4e4d9993a13149393b6a6992b6042bb82d34ffdc7f1aeaf17fa5240ca6ebd9e62fd6c90bce91747af37bf8fc3c72859a1dfec2cf2c49295e1ccdc09b91d9074d204dea74a70002baa05fc86acfcff45fe7f0dd7e5e24c8f69575").unwrap(), avax_signature.get_signatures()[0]);
132146
}
133147
}

0 commit comments

Comments
 (0)