Skip to content

Commit 478e8c4

Browse files
authoredAug 12, 2020
Merge pull request #48 from Emurgo/updates-gen
Added in Update type
2 parents 4f4e8f0 + ccc1934 commit 478e8c4

File tree

5 files changed

+1305
-1
lines changed

5 files changed

+1305
-1
lines changed
 

‎rust/pkg/cardano_serialization_lib.js.flow

+413
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,43 @@ declare export class GenesisHash {
839839
*/
840840
static from_bytes(bytes: Uint8Array): GenesisHash;
841841
}
842+
/**
843+
*/
844+
declare export class GenesisHashes {
845+
free(): void;
846+
847+
/**
848+
* @returns {Uint8Array}
849+
*/
850+
to_bytes(): Uint8Array;
851+
852+
/**
853+
* @param {Uint8Array} bytes
854+
* @returns {GenesisHashes}
855+
*/
856+
static from_bytes(bytes: Uint8Array): GenesisHashes;
857+
858+
/**
859+
* @returns {GenesisHashes}
860+
*/
861+
static new(): GenesisHashes;
862+
863+
/**
864+
* @returns {number}
865+
*/
866+
len(): number;
867+
868+
/**
869+
* @param {number} index
870+
* @returns {GenesisHash}
871+
*/
872+
get(index: number): GenesisHash;
873+
874+
/**
875+
* @param {GenesisHash} elem
876+
*/
877+
add(elem: GenesisHash): void;
878+
}
842879
/**
843880
*/
844881
declare export class GenesisKeyDelegation {
@@ -1372,6 +1409,38 @@ declare export class MultisigScripts {
13721409
*/
13731410
add(elem: MultisigScript): void;
13741411
}
1412+
/**
1413+
*/
1414+
declare export class Nonce {
1415+
free(): void;
1416+
1417+
/**
1418+
* @returns {Uint8Array}
1419+
*/
1420+
to_bytes(): Uint8Array;
1421+
1422+
/**
1423+
* @param {Uint8Array} bytes
1424+
* @returns {Nonce}
1425+
*/
1426+
static from_bytes(bytes: Uint8Array): Nonce;
1427+
1428+
/**
1429+
* @returns {Nonce}
1430+
*/
1431+
static new_identity(): Nonce;
1432+
1433+
/**
1434+
* @param {Uint8Array} hash
1435+
* @returns {Nonce}
1436+
*/
1437+
static new_from_hash(hash: Uint8Array): Nonce;
1438+
1439+
/**
1440+
* @returns {Uint8Array | void}
1441+
*/
1442+
get_hash(): Uint8Array | void;
1443+
}
13751444
/**
13761445
*/
13771446
declare export class Pointer {
@@ -1664,6 +1733,304 @@ declare export class PrivateKey {
16641733
*/
16651734
sign(message: Uint8Array): Ed25519Signature;
16661735
}
1736+
/**
1737+
*/
1738+
declare export class ProposedProtocolParameterUpdates {
1739+
free(): void;
1740+
1741+
/**
1742+
* @returns {Uint8Array}
1743+
*/
1744+
to_bytes(): Uint8Array;
1745+
1746+
/**
1747+
* @param {Uint8Array} bytes
1748+
* @returns {ProposedProtocolParameterUpdates}
1749+
*/
1750+
static from_bytes(bytes: Uint8Array): ProposedProtocolParameterUpdates;
1751+
1752+
/**
1753+
* @returns {ProposedProtocolParameterUpdates}
1754+
*/
1755+
static new(): ProposedProtocolParameterUpdates;
1756+
1757+
/**
1758+
* @returns {number}
1759+
*/
1760+
len(): number;
1761+
1762+
/**
1763+
* @param {GenesisHash} key
1764+
* @param {ProtocolParamUpdate} value
1765+
* @returns {ProtocolParamUpdate | void}
1766+
*/
1767+
insert(
1768+
key: GenesisHash,
1769+
value: ProtocolParamUpdate
1770+
): ProtocolParamUpdate | void;
1771+
1772+
/**
1773+
* @param {GenesisHash} key
1774+
* @returns {ProtocolParamUpdate | void}
1775+
*/
1776+
get(key: GenesisHash): ProtocolParamUpdate | void;
1777+
1778+
/**
1779+
* @returns {GenesisHashes}
1780+
*/
1781+
keys(): GenesisHashes;
1782+
}
1783+
/**
1784+
*/
1785+
declare export class ProtocolParamUpdate {
1786+
free(): void;
1787+
1788+
/**
1789+
* @returns {Uint8Array}
1790+
*/
1791+
to_bytes(): Uint8Array;
1792+
1793+
/**
1794+
* @param {Uint8Array} bytes
1795+
* @returns {ProtocolParamUpdate}
1796+
*/
1797+
static from_bytes(bytes: Uint8Array): ProtocolParamUpdate;
1798+
1799+
/**
1800+
* @param {BigNum} minfee_a
1801+
*/
1802+
set_minfee_a(minfee_a: BigNum): void;
1803+
1804+
/**
1805+
* @returns {BigNum | void}
1806+
*/
1807+
minfee_a(): BigNum | void;
1808+
1809+
/**
1810+
* @param {BigNum} minfee_b
1811+
*/
1812+
set_minfee_b(minfee_b: BigNum): void;
1813+
1814+
/**
1815+
* @returns {BigNum | void}
1816+
*/
1817+
minfee_b(): BigNum | void;
1818+
1819+
/**
1820+
* @param {number} max_block_body_size
1821+
*/
1822+
set_max_block_body_size(max_block_body_size: number): void;
1823+
1824+
/**
1825+
* @returns {number | void}
1826+
*/
1827+
max_block_body_size(): number | void;
1828+
1829+
/**
1830+
* @param {number} max_tx_size
1831+
*/
1832+
set_max_tx_size(max_tx_size: number): void;
1833+
1834+
/**
1835+
* @returns {number | void}
1836+
*/
1837+
max_tx_size(): number | void;
1838+
1839+
/**
1840+
* @param {number} max_block_header_size
1841+
*/
1842+
set_max_block_header_size(max_block_header_size: number): void;
1843+
1844+
/**
1845+
* @returns {number | void}
1846+
*/
1847+
max_block_header_size(): number | void;
1848+
1849+
/**
1850+
* @param {BigNum} key_deposit
1851+
*/
1852+
set_key_deposit(key_deposit: BigNum): void;
1853+
1854+
/**
1855+
* @returns {BigNum | void}
1856+
*/
1857+
key_deposit(): BigNum | void;
1858+
1859+
/**
1860+
* @param {BigNum} pool_deposit
1861+
*/
1862+
set_pool_deposit(pool_deposit: BigNum): void;
1863+
1864+
/**
1865+
* @returns {BigNum | void}
1866+
*/
1867+
pool_deposit(): BigNum | void;
1868+
1869+
/**
1870+
* @param {number} max_epoch
1871+
*/
1872+
set_max_epoch(max_epoch: number): void;
1873+
1874+
/**
1875+
* @returns {number | void}
1876+
*/
1877+
max_epoch(): number | void;
1878+
1879+
/**
1880+
* @param {number} n_opt
1881+
*/
1882+
set_n_opt(n_opt: number): void;
1883+
1884+
/**
1885+
* @returns {number | void}
1886+
*/
1887+
n_opt(): number | void;
1888+
1889+
/**
1890+
* @param {UnitInterval} pool_pledge_influence
1891+
*/
1892+
set_pool_pledge_influence(pool_pledge_influence: UnitInterval): void;
1893+
1894+
/**
1895+
* @returns {UnitInterval | void}
1896+
*/
1897+
pool_pledge_influence(): UnitInterval | void;
1898+
1899+
/**
1900+
* @param {UnitInterval} expansion_rate
1901+
*/
1902+
set_expansion_rate(expansion_rate: UnitInterval): void;
1903+
1904+
/**
1905+
* @returns {UnitInterval | void}
1906+
*/
1907+
expansion_rate(): UnitInterval | void;
1908+
1909+
/**
1910+
* @param {UnitInterval} treasury_growth_rate
1911+
*/
1912+
set_treasury_growth_rate(treasury_growth_rate: UnitInterval): void;
1913+
1914+
/**
1915+
* @returns {UnitInterval | void}
1916+
*/
1917+
treasury_growth_rate(): UnitInterval | void;
1918+
1919+
/**
1920+
* @param {UnitInterval} d
1921+
*/
1922+
set_d(d: UnitInterval): void;
1923+
1924+
/**
1925+
* @returns {UnitInterval | void}
1926+
*/
1927+
d(): UnitInterval | void;
1928+
1929+
/**
1930+
* @param {Nonce} extra_entropy
1931+
*/
1932+
set_extra_entropy(extra_entropy: Nonce): void;
1933+
1934+
/**
1935+
* @returns {Nonce | void}
1936+
*/
1937+
extra_entropy(): Nonce | void;
1938+
1939+
/**
1940+
* @param {ProtocolVersions} protocol_version
1941+
*/
1942+
set_protocol_version(protocol_version: ProtocolVersions): void;
1943+
1944+
/**
1945+
* @returns {ProtocolVersions | void}
1946+
*/
1947+
protocol_version(): ProtocolVersions | void;
1948+
1949+
/**
1950+
* @param {BigNum} min_utxo_value
1951+
*/
1952+
set_min_utxo_value(min_utxo_value: BigNum): void;
1953+
1954+
/**
1955+
* @returns {BigNum | void}
1956+
*/
1957+
min_utxo_value(): BigNum | void;
1958+
1959+
/**
1960+
* @returns {ProtocolParamUpdate}
1961+
*/
1962+
static new(): ProtocolParamUpdate;
1963+
}
1964+
/**
1965+
*/
1966+
declare export class ProtocolVersion {
1967+
free(): void;
1968+
1969+
/**
1970+
* @returns {Uint8Array}
1971+
*/
1972+
to_bytes(): Uint8Array;
1973+
1974+
/**
1975+
* @param {Uint8Array} bytes
1976+
* @returns {ProtocolVersion}
1977+
*/
1978+
static from_bytes(bytes: Uint8Array): ProtocolVersion;
1979+
1980+
/**
1981+
* @returns {number}
1982+
*/
1983+
major(): number;
1984+
1985+
/**
1986+
* @returns {number}
1987+
*/
1988+
minor(): number;
1989+
1990+
/**
1991+
* @param {number} major
1992+
* @param {number} minor
1993+
* @returns {ProtocolVersion}
1994+
*/
1995+
static new(major: number, minor: number): ProtocolVersion;
1996+
}
1997+
/**
1998+
*/
1999+
declare export class ProtocolVersions {
2000+
free(): void;
2001+
2002+
/**
2003+
* @returns {Uint8Array}
2004+
*/
2005+
to_bytes(): Uint8Array;
2006+
2007+
/**
2008+
* @param {Uint8Array} bytes
2009+
* @returns {ProtocolVersions}
2010+
*/
2011+
static from_bytes(bytes: Uint8Array): ProtocolVersions;
2012+
2013+
/**
2014+
* @returns {ProtocolVersions}
2015+
*/
2016+
static new(): ProtocolVersions;
2017+
2018+
/**
2019+
* @returns {number}
2020+
*/
2021+
len(): number;
2022+
2023+
/**
2024+
* @param {number} index
2025+
* @returns {ProtocolVersion}
2026+
*/
2027+
get(index: number): ProtocolVersion;
2028+
2029+
/**
2030+
* @param {ProtocolVersion} elem
2031+
*/
2032+
add(elem: ProtocolVersion): void;
2033+
}
16672034
/**
16682035
* ED25519 key used as public key
16692036
*/
@@ -2247,6 +2614,16 @@ declare export class TransactionBody {
22472614
*/
22482615
withdrawals(): Withdrawals | void;
22492616

2617+
/**
2618+
* @param {Update} update
2619+
*/
2620+
set_update(update: Update): void;
2621+
2622+
/**
2623+
* @returns {Update | void}
2624+
*/
2625+
update(): Update | void;
2626+
22502627
/**
22512628
* @param {MetadataHash} metadata_hash
22522629
*/
@@ -2839,6 +3216,42 @@ declare export class UnitInterval {
28393216
*/
28403217
static new(numerator: BigNum, denominator: BigNum): UnitInterval;
28413218
}
3219+
/**
3220+
*/
3221+
declare export class Update {
3222+
free(): void;
3223+
3224+
/**
3225+
* @returns {Uint8Array}
3226+
*/
3227+
to_bytes(): Uint8Array;
3228+
3229+
/**
3230+
* @param {Uint8Array} bytes
3231+
* @returns {Update}
3232+
*/
3233+
static from_bytes(bytes: Uint8Array): Update;
3234+
3235+
/**
3236+
* @returns {ProposedProtocolParameterUpdates}
3237+
*/
3238+
proposed_protocol_parameter_updates(): ProposedProtocolParameterUpdates;
3239+
3240+
/**
3241+
* @returns {number}
3242+
*/
3243+
epoch(): number;
3244+
3245+
/**
3246+
* @param {ProposedProtocolParameterUpdates} proposed_protocol_parameter_updates
3247+
* @param {number} epoch
3248+
* @returns {Update}
3249+
*/
3250+
static new(
3251+
proposed_protocol_parameter_updates: ProposedProtocolParameterUpdates,
3252+
epoch: number
3253+
): Update;
3254+
}
28423255
/**
28433256
*/
28443257
declare export class VRFKeyHash {

‎rust/src/crypto.rs

+113-1
Original file line numberDiff line numberDiff line change
@@ -727,4 +727,116 @@ impl_hash_type!(TransactionHash, 32);
727727
impl_hash_type!(GenesisDelegateHash, 28);
728728
impl_hash_type!(GenesisHash, 28);
729729
impl_hash_type!(MetadataHash, 32);
730-
impl_hash_type!(VRFKeyHash, 28);
730+
impl_hash_type!(VRFKeyHash, 28);
731+
732+
// Evolving nonce type (used for Update's crypto)
733+
#[wasm_bindgen]
734+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
735+
pub struct Nonce {
736+
hash: Option<[u8; 32]>,
737+
}
738+
739+
to_from_bytes!(Nonce);
740+
741+
// can't export consts via wasm_bindgen
742+
impl Nonce {
743+
pub const HASH_LEN: usize = 32;
744+
}
745+
746+
#[wasm_bindgen]
747+
impl Nonce {
748+
pub fn new_identity() -> Nonce {
749+
Self {
750+
hash: None,
751+
}
752+
}
753+
754+
pub fn new_from_hash(hash: Vec<u8>) -> Result<Nonce, JsValue> {
755+
use std::convert::TryInto;
756+
match hash[..Self::HASH_LEN].try_into() {
757+
Ok(bytes_correct_size) => Ok(Self {
758+
hash: Some(bytes_correct_size),
759+
}),
760+
Err(e) => Err(JsValue::from_str(&e.to_string())),
761+
}
762+
}
763+
764+
pub fn get_hash(&self) -> Option<Vec<u8>> {
765+
Some(self.hash?.to_vec())
766+
767+
}
768+
}
769+
770+
impl cbor_event::se::Serialize for Nonce {
771+
fn serialize<'se, W: std::io::Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
772+
match &self.hash {
773+
Some(hash) => {
774+
serializer.write_array(cbor_event::Len::Len(2))?;
775+
serializer.write_unsigned_integer(1)?;
776+
serializer.write_bytes(hash)
777+
},
778+
None => {
779+
serializer.write_array(cbor_event::Len::Len(1))?;
780+
serializer.write_unsigned_integer(0)
781+
},
782+
}
783+
}
784+
}
785+
786+
impl Deserialize for Nonce {
787+
fn deserialize<R: std::io::BufRead>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
788+
use std::convert::TryInto;
789+
(|| -> Result<Self, DeserializeError> {
790+
let len = raw.array()?;
791+
let hash = match raw.unsigned_integer()? {
792+
0 => None,
793+
1 => {
794+
let bytes = raw.bytes()?;
795+
if bytes.len() != Self::HASH_LEN {
796+
return Err(DeserializeFailure::CBOR(cbor_event::Error::WrongLen(Self::HASH_LEN as u64, cbor_event::Len::Len(bytes.len() as u64), "hash length")).into());
797+
}
798+
Some(bytes[..Self::HASH_LEN].try_into().unwrap())
799+
},
800+
_ => return Err(DeserializeFailure::NoVariantMatched.into()),
801+
};
802+
match len {
803+
cbor_event::Len::Len(n) => {
804+
let correct_len = match n {
805+
1 => hash.is_none(),
806+
2 => hash.is_some(),
807+
_ => false,
808+
};
809+
if !correct_len {
810+
return Err(DeserializeFailure::NoVariantMatched.into());
811+
}
812+
},
813+
cbor_event::Len::Indefinite => match raw.special()? {
814+
CBORSpecial::Break => /* it's ok */(),
815+
_ => return Err(DeserializeFailure::EndingBreakMissing.into()),
816+
},
817+
};
818+
Ok(Self {
819+
hash,
820+
})
821+
})().map_err(|e| e.annotate(stringify!($name)))
822+
}
823+
}
824+
825+
#[cfg(test)]
826+
mod tests {
827+
use super::*;
828+
829+
#[test]
830+
fn nonce_identity() {
831+
let orig = Nonce::new_identity();
832+
let deser = Nonce::deserialize(&mut Deserializer::from(std::io::Cursor::new(orig.to_bytes()))).unwrap();
833+
assert_eq!(orig.to_bytes(), deser.to_bytes());
834+
}
835+
836+
#[test]
837+
fn nonce_hash() {
838+
let orig = Nonce::new_from_hash(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]).unwrap();
839+
let deser = Nonce::deserialize(&mut Deserializer::from(std::io::Cursor::new(orig.to_bytes()))).unwrap();
840+
assert_eq!(orig.to_bytes(), deser.to_bytes());
841+
}
842+
}

‎rust/src/lib.rs

+320
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ impl UnitInterval {
4949
}
5050
}
5151

52+
type Rational = UnitInterval;
5253
type Epoch = u32;
5354
type Slot = u32;
5455

@@ -174,6 +175,7 @@ pub struct TransactionBody {
174175
ttl: u32,
175176
certs: Option<Certificates>,
176177
withdrawals: Option<Withdrawals>,
178+
update: Option<Update>,
177179
metadata_hash: Option<MetadataHash>,
178180
}
179181

@@ -213,6 +215,13 @@ impl TransactionBody {
213215
self.withdrawals.clone()
214216
}
215217

218+
pub fn set_update(&mut self, update: &Update) {
219+
self.update = Some(update.clone())
220+
}
221+
222+
pub fn update(&self) -> Option<Update> {
223+
self.update.clone()
224+
}
216225
pub fn set_metadata_hash(&mut self, metadata_hash: &MetadataHash) {
217226
self.metadata_hash = Some(metadata_hash.clone())
218227
}
@@ -230,6 +239,7 @@ impl TransactionBody {
230239
ttl: ttl,
231240
certs: None,
232241
withdrawals: None,
242+
update: None,
233243
metadata_hash: None,
234244
}
235245
}
@@ -1462,4 +1472,314 @@ impl MultisigScript {
14621472
_ => None,
14631473
}
14641474
}
1475+
}
1476+
1477+
#[wasm_bindgen]
1478+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
1479+
pub struct Update {
1480+
proposed_protocol_parameter_updates: ProposedProtocolParameterUpdates,
1481+
epoch: Epoch,
1482+
}
1483+
1484+
to_from_bytes!(Update);
1485+
1486+
#[wasm_bindgen]
1487+
impl Update {
1488+
pub fn proposed_protocol_parameter_updates(&self) -> ProposedProtocolParameterUpdates {
1489+
self.proposed_protocol_parameter_updates.clone()
1490+
}
1491+
1492+
pub fn epoch(&self) -> Epoch {
1493+
self.epoch.clone()
1494+
}
1495+
1496+
pub fn new(proposed_protocol_parameter_updates: &ProposedProtocolParameterUpdates, epoch: Epoch) -> Self {
1497+
Self {
1498+
proposed_protocol_parameter_updates: proposed_protocol_parameter_updates.clone(),
1499+
epoch: epoch.clone(),
1500+
}
1501+
}
1502+
}
1503+
1504+
#[wasm_bindgen]
1505+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
1506+
pub struct GenesisHashes(Vec<GenesisHash>);
1507+
1508+
to_from_bytes!(GenesisHashes);
1509+
1510+
#[wasm_bindgen]
1511+
impl GenesisHashes {
1512+
pub fn new() -> Self {
1513+
Self(Vec::new())
1514+
}
1515+
1516+
pub fn len(&self) -> usize {
1517+
self.0.len()
1518+
}
1519+
1520+
pub fn get(&self, index: usize) -> GenesisHash {
1521+
self.0[index].clone()
1522+
}
1523+
1524+
pub fn add(&mut self, elem: &GenesisHash) {
1525+
self.0.push(elem.clone());
1526+
}
1527+
}
1528+
1529+
#[wasm_bindgen]
1530+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
1531+
pub struct ProposedProtocolParameterUpdates(std::collections::BTreeMap<GenesisHash, ProtocolParamUpdate>);
1532+
1533+
to_from_bytes!(ProposedProtocolParameterUpdates);
1534+
1535+
#[wasm_bindgen]
1536+
impl ProposedProtocolParameterUpdates {
1537+
pub fn new() -> Self {
1538+
Self(std::collections::BTreeMap::new())
1539+
}
1540+
1541+
pub fn len(&self) -> usize {
1542+
self.0.len()
1543+
}
1544+
1545+
pub fn insert(&mut self, key: &GenesisHash, value: &ProtocolParamUpdate) -> Option<ProtocolParamUpdate> {
1546+
self.0.insert(key.clone(), value.clone())
1547+
}
1548+
1549+
pub fn get(&self, key: &GenesisHash) -> Option<ProtocolParamUpdate> {
1550+
self.0.get(key).map(|v| v.clone())
1551+
}
1552+
1553+
pub fn keys(&self) -> GenesisHashes {
1554+
GenesisHashes(self.0.iter().map(|(k, _v)| k.clone()).collect::<Vec<GenesisHash>>())
1555+
}
1556+
}
1557+
1558+
#[wasm_bindgen]
1559+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
1560+
pub struct ProtocolVersion {
1561+
major: u32,
1562+
minor: u32,
1563+
}
1564+
1565+
to_from_bytes!(ProtocolVersion);
1566+
1567+
#[wasm_bindgen]
1568+
impl ProtocolVersion {
1569+
pub fn major(&self) -> u32 {
1570+
self.major
1571+
}
1572+
1573+
pub fn minor(&self) -> u32 {
1574+
self.minor
1575+
}
1576+
1577+
pub fn new(major: u32, minor: u32) -> Self {
1578+
Self {
1579+
major,
1580+
minor,
1581+
}
1582+
}
1583+
}
1584+
1585+
#[wasm_bindgen]
1586+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
1587+
pub struct ProtocolVersions(Vec<ProtocolVersion>);
1588+
1589+
to_from_bytes!(ProtocolVersions);
1590+
1591+
#[wasm_bindgen]
1592+
impl ProtocolVersions {
1593+
pub fn new() -> Self {
1594+
Self(Vec::new())
1595+
}
1596+
1597+
pub fn len(&self) -> usize {
1598+
self.0.len()
1599+
}
1600+
1601+
pub fn get(&self, index: usize) -> ProtocolVersion {
1602+
self.0[index].clone()
1603+
}
1604+
1605+
pub fn add(&mut self, elem: &ProtocolVersion) {
1606+
self.0.push(elem.clone());
1607+
}
1608+
}
1609+
1610+
#[wasm_bindgen]
1611+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
1612+
pub struct ProtocolParamUpdate {
1613+
minfee_a: Option<Coin>,
1614+
minfee_b: Option<Coin>,
1615+
max_block_body_size: Option<u32>,
1616+
max_tx_size: Option<u32>,
1617+
max_block_header_size: Option<u32>,
1618+
key_deposit: Option<Coin>,
1619+
pool_deposit: Option<Coin>,
1620+
max_epoch: Option<Epoch>,
1621+
// desired number of stake pools
1622+
n_opt: Option<u32>,
1623+
pool_pledge_influence: Option<Rational>,
1624+
expansion_rate: Option<UnitInterval>,
1625+
treasury_growth_rate: Option<UnitInterval>,
1626+
// decentralization constant
1627+
d: Option<UnitInterval>,
1628+
extra_entropy: Option<Nonce>,
1629+
protocol_version: Option<ProtocolVersions>,
1630+
min_utxo_value: Option<Coin>,
1631+
}
1632+
1633+
to_from_bytes!(ProtocolParamUpdate);
1634+
1635+
#[wasm_bindgen]
1636+
impl ProtocolParamUpdate {
1637+
pub fn set_minfee_a(&mut self, minfee_a: &Coin) {
1638+
self.minfee_a = Some(minfee_a.clone())
1639+
}
1640+
1641+
pub fn minfee_a(&self) -> Option<Coin> {
1642+
self.minfee_a.clone()
1643+
}
1644+
1645+
pub fn set_minfee_b(&mut self, minfee_b: &Coin) {
1646+
self.minfee_b = Some(minfee_b.clone())
1647+
}
1648+
1649+
pub fn minfee_b(&self) -> Option<Coin> {
1650+
self.minfee_b.clone()
1651+
}
1652+
1653+
pub fn set_max_block_body_size(&mut self, max_block_body_size: u32) {
1654+
self.max_block_body_size = Some(max_block_body_size)
1655+
}
1656+
1657+
pub fn max_block_body_size(&self) -> Option<u32> {
1658+
self.max_block_body_size.clone()
1659+
}
1660+
1661+
pub fn set_max_tx_size(&mut self, max_tx_size: u32) {
1662+
self.max_tx_size = Some(max_tx_size)
1663+
}
1664+
1665+
pub fn max_tx_size(&self) -> Option<u32> {
1666+
self.max_tx_size.clone()
1667+
}
1668+
1669+
pub fn set_max_block_header_size(&mut self, max_block_header_size: u32) {
1670+
self.max_block_header_size = Some(max_block_header_size)
1671+
}
1672+
1673+
pub fn max_block_header_size(&self) -> Option<u32> {
1674+
self.max_block_header_size.clone()
1675+
}
1676+
1677+
pub fn set_key_deposit(&mut self, key_deposit: &Coin) {
1678+
self.key_deposit = Some(key_deposit.clone())
1679+
}
1680+
1681+
pub fn key_deposit(&self) -> Option<Coin> {
1682+
self.key_deposit.clone()
1683+
}
1684+
1685+
pub fn set_pool_deposit(&mut self, pool_deposit: &Coin) {
1686+
self.pool_deposit = Some(pool_deposit.clone())
1687+
}
1688+
1689+
pub fn pool_deposit(&self) -> Option<Coin> {
1690+
self.pool_deposit.clone()
1691+
}
1692+
1693+
pub fn set_max_epoch(&mut self, max_epoch: Epoch) {
1694+
self.max_epoch = Some(max_epoch.clone())
1695+
}
1696+
1697+
pub fn max_epoch(&self) -> Option<Epoch> {
1698+
self.max_epoch.clone()
1699+
}
1700+
1701+
pub fn set_n_opt(&mut self, n_opt: u32) {
1702+
self.n_opt = Some(n_opt)
1703+
}
1704+
1705+
pub fn n_opt(&self) -> Option<u32> {
1706+
self.n_opt.clone()
1707+
}
1708+
1709+
pub fn set_pool_pledge_influence(&mut self, pool_pledge_influence: &Rational) {
1710+
self.pool_pledge_influence = Some(pool_pledge_influence.clone())
1711+
}
1712+
1713+
pub fn pool_pledge_influence(&self) -> Option<Rational> {
1714+
self.pool_pledge_influence.clone()
1715+
}
1716+
1717+
pub fn set_expansion_rate(&mut self, expansion_rate: &UnitInterval) {
1718+
self.expansion_rate = Some(expansion_rate.clone())
1719+
}
1720+
1721+
pub fn expansion_rate(&self) -> Option<UnitInterval> {
1722+
self.expansion_rate.clone()
1723+
}
1724+
1725+
pub fn set_treasury_growth_rate(&mut self, treasury_growth_rate: &UnitInterval) {
1726+
self.treasury_growth_rate = Some(treasury_growth_rate.clone())
1727+
}
1728+
1729+
pub fn treasury_growth_rate(&self) -> Option<UnitInterval> {
1730+
self.treasury_growth_rate.clone()
1731+
}
1732+
1733+
pub fn set_d(&mut self, d: &UnitInterval) {
1734+
self.d = Some(d.clone())
1735+
}
1736+
1737+
pub fn d(&self) -> Option<UnitInterval> {
1738+
self.d.clone()
1739+
}
1740+
1741+
pub fn set_extra_entropy(&mut self, extra_entropy: &Nonce) {
1742+
self.extra_entropy = Some(extra_entropy.clone())
1743+
}
1744+
1745+
pub fn extra_entropy(&self) -> Option<Nonce> {
1746+
self.extra_entropy.clone()
1747+
}
1748+
1749+
pub fn set_protocol_version(&mut self, protocol_version: &ProtocolVersions) {
1750+
self.protocol_version = Some(protocol_version.clone())
1751+
}
1752+
1753+
pub fn protocol_version(&self) -> Option<ProtocolVersions> {
1754+
self.protocol_version.clone()
1755+
}
1756+
1757+
pub fn set_min_utxo_value(&mut self, min_utxo_value: &Coin) {
1758+
self.min_utxo_value = Some(min_utxo_value.clone())
1759+
}
1760+
1761+
pub fn min_utxo_value(&self) -> Option<Coin> {
1762+
self.min_utxo_value.clone()
1763+
}
1764+
1765+
pub fn new() -> Self {
1766+
Self {
1767+
minfee_a: None,
1768+
minfee_b: None,
1769+
max_block_body_size: None,
1770+
max_tx_size: None,
1771+
max_block_header_size: None,
1772+
key_deposit: None,
1773+
pool_deposit: None,
1774+
max_epoch: None,
1775+
n_opt: None,
1776+
pool_pledge_influence: None,
1777+
expansion_rate: None,
1778+
treasury_growth_rate: None,
1779+
d: None,
1780+
extra_entropy: None,
1781+
protocol_version: None,
1782+
min_utxo_value: None,
1783+
}
1784+
}
14651785
}

‎rust/src/serialization.rs

+458
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ impl cbor_event::se::Serialize for TransactionBody {
218218
serializer.write_unsigned_integer(5)?;
219219
field.serialize(serializer)?;
220220
}
221+
if let Some(field) = &self.update {
222+
serializer.write_unsigned_integer(6)?;
223+
field.serialize(serializer)?;
224+
}
221225
if let Some(field) = &self.metadata_hash {
222226
serializer.write_unsigned_integer(7)?;
223227
field.serialize(serializer)?;
@@ -243,6 +247,7 @@ impl DeserializeEmbeddedGroup for TransactionBody {
243247
let mut ttl = None;
244248
let mut certs = None;
245249
let mut withdrawals = None;
250+
let mut update = None;
246251
let mut metadata_hash = None;
247252
let mut read = 0;
248253
while match len { cbor_event::Len::Len(n) => read < n as usize, cbor_event::Len::Indefinite => true, } {
@@ -296,6 +301,14 @@ impl DeserializeEmbeddedGroup for TransactionBody {
296301
Ok(Withdrawals::deserialize(raw)?)
297302
})().map_err(|e| e.annotate("withdrawals"))?);
298303
},
304+
6 => {
305+
if update.is_some() {
306+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(6)).into());
307+
}
308+
update = Some((|| -> Result<_, DeserializeError> {
309+
Ok(Update::deserialize(raw)?)
310+
})().map_err(|e| e.annotate("update"))?);
311+
},
299312
7 => {
300313
if metadata_hash.is_some() {
301314
return Err(DeserializeFailure::DuplicateKey(Key::Uint(7)).into());
@@ -343,6 +356,7 @@ impl DeserializeEmbeddedGroup for TransactionBody {
343356
ttl,
344357
certs,
345358
withdrawals,
359+
update,
346360
metadata_hash,
347361
})
348362
}
@@ -2144,4 +2158,448 @@ impl Deserialize for MultisigScript {
21442158
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
21452159
Ok(Self(MultisigScriptEnum::deserialize(raw)?))
21462160
}
2161+
}
2162+
2163+
impl cbor_event::se::Serialize for Update {
2164+
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2165+
serializer.write_array(cbor_event::Len::Len(2))?;
2166+
self.proposed_protocol_parameter_updates.serialize(serializer)?;
2167+
self.epoch.serialize(serializer)?;
2168+
Ok(serializer)
2169+
}
2170+
}
2171+
2172+
impl Deserialize for Update {
2173+
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
2174+
(|| -> Result<_, DeserializeError> {
2175+
let len = raw.array()?;
2176+
let ret = Self::deserialize_as_embedded_group(raw, len);
2177+
match len {
2178+
cbor_event::Len::Len(_) => /* TODO: check finite len somewhere */(),
2179+
cbor_event::Len::Indefinite => match raw.special()? {
2180+
CBORSpecial::Break => /* it's ok */(),
2181+
_ => return Err(DeserializeFailure::EndingBreakMissing.into()),
2182+
},
2183+
}
2184+
ret
2185+
})().map_err(|e| e.annotate("Update"))
2186+
}
2187+
}
2188+
2189+
impl DeserializeEmbeddedGroup for Update {
2190+
fn deserialize_as_embedded_group<R: BufRead + Seek>(raw: &mut Deserializer<R>, len: cbor_event::Len) -> Result<Self, DeserializeError> {
2191+
let proposed_protocol_parameter_updates = (|| -> Result<_, DeserializeError> {
2192+
Ok(ProposedProtocolParameterUpdates::deserialize(raw)?)
2193+
})().map_err(|e| e.annotate("proposed_protocol_parameter_updates"))?;
2194+
let epoch = (|| -> Result<_, DeserializeError> {
2195+
Ok(Epoch::deserialize(raw)?)
2196+
})().map_err(|e| e.annotate("epoch"))?;
2197+
Ok(Update {
2198+
proposed_protocol_parameter_updates,
2199+
epoch,
2200+
})
2201+
}
2202+
}
2203+
2204+
impl cbor_event::se::Serialize for GenesisHashes {
2205+
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2206+
serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
2207+
for element in &self.0 {
2208+
element.serialize(serializer)?;
2209+
}
2210+
Ok(serializer)
2211+
}
2212+
}
2213+
2214+
impl Deserialize for GenesisHashes {
2215+
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
2216+
let mut arr = Vec::new();
2217+
(|| -> Result<_, DeserializeError> {
2218+
let len = raw.array()?;
2219+
while match len { cbor_event::Len::Len(n) => arr.len() < n as usize, cbor_event::Len::Indefinite => true, } {
2220+
if raw.cbor_type()? == CBORType::Special {
2221+
assert_eq!(raw.special()?, CBORSpecial::Break);
2222+
break;
2223+
}
2224+
arr.push(GenesisHash::deserialize(raw)?);
2225+
}
2226+
Ok(())
2227+
})().map_err(|e| e.annotate("Genesishashes"))?;
2228+
Ok(Self(arr))
2229+
}
2230+
}
2231+
2232+
impl cbor_event::se::Serialize for ProposedProtocolParameterUpdates {
2233+
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2234+
serializer.write_map(cbor_event::Len::Len(self.0.len() as u64))?;
2235+
for (key, value) in &self.0 {
2236+
key.serialize(serializer)?;
2237+
value.serialize(serializer)?;
2238+
}
2239+
Ok(serializer)
2240+
}
2241+
}
2242+
2243+
impl Deserialize for ProposedProtocolParameterUpdates {
2244+
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
2245+
let mut table = std::collections::BTreeMap::new();
2246+
(|| -> Result<_, DeserializeError> {
2247+
let len = raw.map()?;
2248+
while match len { cbor_event::Len::Len(n) => table.len() < n as usize, cbor_event::Len::Indefinite => true, } {
2249+
if raw.cbor_type()? == CBORType::Special {
2250+
assert_eq!(raw.special()?, CBORSpecial::Break);
2251+
break;
2252+
}
2253+
let key = GenesisHash::deserialize(raw)?;
2254+
let value = ProtocolParamUpdate::deserialize(raw)?;
2255+
if table.insert(key.clone(), value).is_some() {
2256+
return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from("some complicated/unsupported type"))).into());
2257+
}
2258+
}
2259+
Ok(())
2260+
})().map_err(|e| e.annotate("ProposedProtocolParameterUpdates"))?;
2261+
Ok(Self(table))
2262+
}
2263+
}
2264+
2265+
impl cbor_event::se::Serialize for ProtocolVersion {
2266+
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2267+
serializer.write_array(cbor_event::Len::Len(2))?;
2268+
self.serialize_as_embedded_group(serializer)
2269+
}
2270+
}
2271+
2272+
impl SerializeEmbeddedGroup for ProtocolVersion {
2273+
fn serialize_as_embedded_group<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2274+
self.major.serialize(serializer)?;
2275+
self.minor.serialize(serializer)?;
2276+
Ok(serializer)
2277+
}
2278+
}
2279+
2280+
impl Deserialize for ProtocolVersion {
2281+
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
2282+
(|| -> Result<_, DeserializeError> {
2283+
let len = raw.array()?;
2284+
let ret = Self::deserialize_as_embedded_group(raw, len);
2285+
match len {
2286+
cbor_event::Len::Len(_) => /* TODO: check finite len somewhere */(),
2287+
cbor_event::Len::Indefinite => match raw.special()? {
2288+
CBORSpecial::Break => /* it's ok */(),
2289+
_ => return Err(DeserializeFailure::EndingBreakMissing.into()),
2290+
},
2291+
}
2292+
ret
2293+
})().map_err(|e| e.annotate("ProtocolVersion"))
2294+
}
2295+
}
2296+
2297+
impl DeserializeEmbeddedGroup for ProtocolVersion {
2298+
fn deserialize_as_embedded_group<R: BufRead + Seek>(raw: &mut Deserializer<R>, len: cbor_event::Len) -> Result<Self, DeserializeError> {
2299+
let major = (|| -> Result<_, DeserializeError> {
2300+
Ok(u32::deserialize(raw)?)
2301+
})().map_err(|e| e.annotate("major"))?;
2302+
let minor = (|| -> Result<_, DeserializeError> {
2303+
Ok(u32::deserialize(raw)?)
2304+
})().map_err(|e| e.annotate("minor"))?;
2305+
Ok(ProtocolVersion {
2306+
major,
2307+
minor,
2308+
})
2309+
}
2310+
}
2311+
2312+
impl cbor_event::se::Serialize for ProtocolVersions {
2313+
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2314+
serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
2315+
for element in &self.0 {
2316+
element.serialize_as_embedded_group(serializer)?;
2317+
}
2318+
Ok(serializer)
2319+
}
2320+
}
2321+
2322+
impl Deserialize for ProtocolVersions {
2323+
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
2324+
let mut arr = Vec::new();
2325+
(|| -> Result<_, DeserializeError> {
2326+
let len = raw.array()?;
2327+
while match len { cbor_event::Len::Len(n) => arr.len() < n as usize, cbor_event::Len::Indefinite => true, } {
2328+
if raw.cbor_type()? == CBORType::Special {
2329+
assert_eq!(raw.special()?, CBORSpecial::Break);
2330+
break;
2331+
}
2332+
arr.push(ProtocolVersion::deserialize_as_embedded_group(raw, len)?);
2333+
}
2334+
Ok(())
2335+
})().map_err(|e| e.annotate("ProtocolVersions"))?;
2336+
Ok(Self(arr))
2337+
}
2338+
}
2339+
2340+
impl cbor_event::se::Serialize for ProtocolParamUpdate {
2341+
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
2342+
serializer.write_map(cbor_event::Len::Len(match &self.minfee_a { Some(x) => 1, None => 0 } + match &self.minfee_b { Some(x) => 1, None => 0 } + match &self.max_block_body_size { Some(x) => 1, None => 0 } + match &self.max_tx_size { Some(x) => 1, None => 0 } + match &self.max_block_header_size { Some(x) => 1, None => 0 } + match &self.key_deposit { Some(x) => 1, None => 0 } + match &self.pool_deposit { Some(x) => 1, None => 0 } + match &self.max_epoch { Some(x) => 1, None => 0 } + match &self.n_opt { Some(x) => 1, None => 0 } + match &self.pool_pledge_influence { Some(x) => 1, None => 0 } + match &self.expansion_rate { Some(x) => 1, None => 0 } + match &self.treasury_growth_rate { Some(x) => 1, None => 0 } + match &self.d { Some(x) => 1, None => 0 } + match &self.extra_entropy { Some(x) => 1, None => 0 } + match &self.protocol_version { Some(x) => 1, None => 0 } + match &self.min_utxo_value { Some(x) => 1, None => 0 }))?;
2343+
if let Some(field) = &self.minfee_a {
2344+
serializer.write_unsigned_integer(0)?;
2345+
field.serialize(serializer)?;
2346+
}
2347+
if let Some(field) = &self.minfee_b {
2348+
serializer.write_unsigned_integer(1)?;
2349+
field.serialize(serializer)?;
2350+
}
2351+
if let Some(field) = &self.max_block_body_size {
2352+
serializer.write_unsigned_integer(2)?;
2353+
field.serialize(serializer)?;
2354+
}
2355+
if let Some(field) = &self.max_tx_size {
2356+
serializer.write_unsigned_integer(3)?;
2357+
field.serialize(serializer)?;
2358+
}
2359+
if let Some(field) = &self.max_block_header_size {
2360+
serializer.write_unsigned_integer(4)?;
2361+
field.serialize(serializer)?;
2362+
}
2363+
if let Some(field) = &self.key_deposit {
2364+
serializer.write_unsigned_integer(5)?;
2365+
field.serialize(serializer)?;
2366+
}
2367+
if let Some(field) = &self.pool_deposit {
2368+
serializer.write_unsigned_integer(6)?;
2369+
field.serialize(serializer)?;
2370+
}
2371+
if let Some(field) = &self.max_epoch {
2372+
serializer.write_unsigned_integer(7)?;
2373+
field.serialize(serializer)?;
2374+
}
2375+
if let Some(field) = &self.n_opt {
2376+
serializer.write_unsigned_integer(8)?;
2377+
field.serialize(serializer)?;
2378+
}
2379+
if let Some(field) = &self.pool_pledge_influence {
2380+
serializer.write_unsigned_integer(9)?;
2381+
field.serialize(serializer)?;
2382+
}
2383+
if let Some(field) = &self.expansion_rate {
2384+
serializer.write_unsigned_integer(10)?;
2385+
field.serialize(serializer)?;
2386+
}
2387+
if let Some(field) = &self.treasury_growth_rate {
2388+
serializer.write_unsigned_integer(11)?;
2389+
field.serialize(serializer)?;
2390+
}
2391+
if let Some(field) = &self.d {
2392+
serializer.write_unsigned_integer(12)?;
2393+
field.serialize(serializer)?;
2394+
}
2395+
if let Some(field) = &self.extra_entropy {
2396+
serializer.write_unsigned_integer(13)?;
2397+
field.serialize(serializer)?;
2398+
}
2399+
if let Some(field) = &self.protocol_version {
2400+
serializer.write_unsigned_integer(14)?;
2401+
field.serialize(serializer)?;
2402+
}
2403+
if let Some(field) = &self.min_utxo_value {
2404+
serializer.write_unsigned_integer(15)?;
2405+
field.serialize(serializer)?;
2406+
}
2407+
Ok(serializer)
2408+
}
2409+
}
2410+
2411+
impl Deserialize for ProtocolParamUpdate {
2412+
fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
2413+
(|| -> Result<_, DeserializeError> {
2414+
let len = raw.map()?;
2415+
Self::deserialize_as_embedded_group(raw, len)
2416+
})().map_err(|e| e.annotate("ProtocolParamUpdate"))
2417+
}
2418+
}
2419+
2420+
impl DeserializeEmbeddedGroup for ProtocolParamUpdate {
2421+
fn deserialize_as_embedded_group<R: BufRead + Seek>(raw: &mut Deserializer<R>, len: cbor_event::Len) -> Result<Self, DeserializeError> {
2422+
let mut minfee_a = None;
2423+
let mut minfee_b = None;
2424+
let mut max_block_body_size = None;
2425+
let mut max_tx_size = None;
2426+
let mut max_block_header_size = None;
2427+
let mut key_deposit = None;
2428+
let mut pool_deposit = None;
2429+
let mut max_epoch = None;
2430+
let mut n_opt = None;
2431+
let mut pool_pledge_influence = None;
2432+
let mut expansion_rate = None;
2433+
let mut treasury_growth_rate = None;
2434+
let mut d = None;
2435+
let mut extra_entropy = None;
2436+
let mut protocol_version = None;
2437+
let mut min_utxo_value = None;
2438+
let mut read = 0;
2439+
while match len { cbor_event::Len::Len(n) => read < n as usize, cbor_event::Len::Indefinite => true, } {
2440+
match raw.cbor_type()? {
2441+
CBORType::UnsignedInteger => match raw.unsigned_integer()? {
2442+
0 => {
2443+
if minfee_a.is_some() {
2444+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(0)).into());
2445+
}
2446+
minfee_a = Some((|| -> Result<_, DeserializeError> {
2447+
Ok(Coin::deserialize(raw)?)
2448+
})().map_err(|e| e.annotate("minfee_a"))?);
2449+
},
2450+
1 => {
2451+
if minfee_b.is_some() {
2452+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(1)).into());
2453+
}
2454+
minfee_b = Some((|| -> Result<_, DeserializeError> {
2455+
Ok(Coin::deserialize(raw)?)
2456+
})().map_err(|e| e.annotate("minfee_b"))?);
2457+
},
2458+
2 => {
2459+
if max_block_body_size.is_some() {
2460+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(2)).into());
2461+
}
2462+
max_block_body_size = Some((|| -> Result<_, DeserializeError> {
2463+
Ok(u32::deserialize(raw)?)
2464+
})().map_err(|e| e.annotate("max_block_body_size"))?);
2465+
},
2466+
3 => {
2467+
if max_tx_size.is_some() {
2468+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(3)).into());
2469+
}
2470+
max_tx_size = Some((|| -> Result<_, DeserializeError> {
2471+
Ok(u32::deserialize(raw)?)
2472+
})().map_err(|e| e.annotate("max_tx_size"))?);
2473+
},
2474+
4 => {
2475+
if max_block_header_size.is_some() {
2476+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(4)).into());
2477+
}
2478+
max_block_header_size = Some((|| -> Result<_, DeserializeError> {
2479+
Ok(u32::deserialize(raw)?)
2480+
})().map_err(|e| e.annotate("max_block_header_size"))?);
2481+
},
2482+
5 => {
2483+
if key_deposit.is_some() {
2484+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(5)).into());
2485+
}
2486+
key_deposit = Some((|| -> Result<_, DeserializeError> {
2487+
Ok(Coin::deserialize(raw)?)
2488+
})().map_err(|e| e.annotate("key_deposit"))?);
2489+
},
2490+
6 => {
2491+
if pool_deposit.is_some() {
2492+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(6)).into());
2493+
}
2494+
pool_deposit = Some((|| -> Result<_, DeserializeError> {
2495+
Ok(Coin::deserialize(raw)?)
2496+
})().map_err(|e| e.annotate("pool_deposit"))?);
2497+
},
2498+
7 => {
2499+
if max_epoch.is_some() {
2500+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(7)).into());
2501+
}
2502+
max_epoch = Some((|| -> Result<_, DeserializeError> {
2503+
Ok(Epoch::deserialize(raw)?)
2504+
})().map_err(|e| e.annotate("max_epoch"))?);
2505+
},
2506+
8 => {
2507+
if n_opt.is_some() {
2508+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(8)).into());
2509+
}
2510+
n_opt = Some((|| -> Result<_, DeserializeError> {
2511+
Ok(u32::deserialize(raw)?)
2512+
})().map_err(|e| e.annotate("n_opt"))?);
2513+
},
2514+
9 => {
2515+
if pool_pledge_influence.is_some() {
2516+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(9)).into());
2517+
}
2518+
pool_pledge_influence = Some((|| -> Result<_, DeserializeError> {
2519+
Ok(Rational::deserialize(raw)?)
2520+
})().map_err(|e| e.annotate("pool_pledge_influence"))?);
2521+
},
2522+
10 => {
2523+
if expansion_rate.is_some() {
2524+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(10)).into());
2525+
}
2526+
expansion_rate = Some((|| -> Result<_, DeserializeError> {
2527+
Ok(UnitInterval::deserialize(raw)?)
2528+
})().map_err(|e| e.annotate("expansion_rate"))?);
2529+
},
2530+
11 => {
2531+
if treasury_growth_rate.is_some() {
2532+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(11)).into());
2533+
}
2534+
treasury_growth_rate = Some((|| -> Result<_, DeserializeError> {
2535+
Ok(UnitInterval::deserialize(raw)?)
2536+
})().map_err(|e| e.annotate("treasury_growth_rate"))?);
2537+
},
2538+
12 => {
2539+
if d.is_some() {
2540+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(12)).into());
2541+
}
2542+
d = Some((|| -> Result<_, DeserializeError> {
2543+
Ok(UnitInterval::deserialize(raw)?)
2544+
})().map_err(|e| e.annotate("d"))?);
2545+
},
2546+
13 => {
2547+
if extra_entropy.is_some() {
2548+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(13)).into());
2549+
}
2550+
extra_entropy = Some((|| -> Result<_, DeserializeError> {
2551+
Ok(Nonce::deserialize(raw)?)
2552+
})().map_err(|e| e.annotate("extra_entropy"))?);
2553+
},
2554+
14 => {
2555+
if protocol_version.is_some() {
2556+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(14)).into());
2557+
}
2558+
protocol_version = Some((|| -> Result<_, DeserializeError> {
2559+
Ok(ProtocolVersions::deserialize(raw)?)
2560+
})().map_err(|e| e.annotate("protocol_version"))?);
2561+
},
2562+
15 => {
2563+
if min_utxo_value.is_some() {
2564+
return Err(DeserializeFailure::DuplicateKey(Key::Uint(15)).into());
2565+
}
2566+
min_utxo_value = Some((|| -> Result<_, DeserializeError> {
2567+
Ok(Coin::deserialize(raw)?)
2568+
})().map_err(|e| e.annotate("min_utxo_value"))?);
2569+
},
2570+
unknown_key => return Err(DeserializeFailure::UnknownKey(Key::Uint(unknown_key)).into()),
2571+
},
2572+
CBORType::Text => match raw.text()?.as_str() {
2573+
unknown_key => return Err(DeserializeFailure::UnknownKey(Key::Str(unknown_key.to_owned())).into()),
2574+
},
2575+
CBORType::Special => match len {
2576+
cbor_event::Len::Len(_) => return Err(DeserializeFailure::BreakInDefiniteLen.into()),
2577+
cbor_event::Len::Indefinite => match raw.special()? {
2578+
CBORSpecial::Break => break,
2579+
_ => return Err(DeserializeFailure::EndingBreakMissing.into()),
2580+
},
2581+
},
2582+
other_type => return Err(DeserializeFailure::UnexpectedKeyType(other_type).into()),
2583+
}
2584+
read += 1;
2585+
}
2586+
Ok(Self {
2587+
minfee_a,
2588+
minfee_b,
2589+
max_block_body_size,
2590+
max_tx_size,
2591+
max_block_header_size,
2592+
key_deposit,
2593+
pool_deposit,
2594+
max_epoch,
2595+
n_opt,
2596+
pool_pledge_influence,
2597+
expansion_rate,
2598+
treasury_growth_rate,
2599+
d,
2600+
extra_entropy,
2601+
protocol_version,
2602+
min_utxo_value,
2603+
})
2604+
}
21472605
}

‎rust/src/tx_builder.rs

+1
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ impl TransactionBuilder {
316316
ttl: ttl,
317317
certs: self.certs.clone(),
318318
withdrawals: self.withdrawals.clone(),
319+
update: None,
319320
metadata_hash: match &self.metadata {
320321
None => None,
321322
Some(x) => Some(utils::hash_metadata(x)),

0 commit comments

Comments
 (0)
Please sign in to comment.