diff --git a/.gitleaks.toml b/.gitleaks.toml new file mode 100644 index 0000000..adb0e5a --- /dev/null +++ b/.gitleaks.toml @@ -0,0 +1,14 @@ +# Sulkta gitleaks allowlist for this repo (a fork of txpipe/pallas). +# These paths hold UPSTREAM Cardano public test fixtures — the mainnet Byron +# genesis, CBOR/native-script test vectors — whose high-entropy hex strings +# false-positive as "generic-api-key". They are public on-chain / test data +# present in every pallas clone. NOT secrets. +[extend] +useDefault = true + +[allowlist] +description = "Upstream Cardano public test fixtures (not secrets)" +paths = [ + '''test_data/''', + '''.*\.native$''', +] diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bd1f75..204d460 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,311 @@ ## [Unreleased] + + +## [v0.32.0] - 2024-12-29 +### Chore +- apply new lint warnings from latest clippy ([#561](https://github.com/txpipe/pallas/issues/561)) +- fix examples after latest refactors ([#560](https://github.com/txpipe/pallas/issues/560)) +- **deps:** update utxorpc-spec to v0.15 ([#568](https://github.com/txpipe/pallas/issues/568)) +- **math:** replace malachite lib with dashu ([#542](https://github.com/txpipe/pallas/issues/542)) +- **utxorpc:** update spec to v0.14 and update redeemer mapper ([#559](https://github.com/txpipe/pallas/issues/559)) + +### Feat +- **applying:** include main constants in pparams ([#565](https://github.com/txpipe/pallas/issues/565)) +- **configs:** allow clone for genesis file structs ([#528](https://github.com/txpipe/pallas/issues/528)) +- **network:** implement `GetFilteredDelegationsAndRewardAccounts` query ([#552](https://github.com/txpipe/pallas/issues/552)) +- **network:** implement get_utxo_whole query ([#564](https://github.com/txpipe/pallas/issues/564)) +- **network:** implement get stake pool parameters query ([#554](https://github.com/txpipe/pallas/issues/554)) +- **network:** implement GetUTxOByTxIn state query ([#550](https://github.com/txpipe/pallas/issues/550)) +- **traverse:** introduce small QoL improvements ([#567](https://github.com/txpipe/pallas/issues/567)) +- **traverse:** implement MultiEraValue.into_conway ([#545](https://github.com/txpipe/pallas/issues/545)) +- **txbuilder:** allow cloning of relevant structs ([#558](https://github.com/txpipe/pallas/issues/558)) +- **utxorpc:** add execution cost prices to parameter mapper ([#555](https://github.com/txpipe/pallas/issues/555)) + +### Fix +- **network:** adjust PoolDistr & ProtocolParam structs used for state queries ([#551](https://github.com/txpipe/pallas/issues/551)) +- **traverse:** don't mess with Byron update epoch ([#566](https://github.com/txpipe/pallas/issues/566)) +- **txbuilder:** support adding signatures to Conway transactions ([#553](https://github.com/txpipe/pallas/issues/553)) + + + +## [v0.31.0] - 2024-11-04 +### Build +- **deps:** update itertools requirement from 0.12.1 to 0.13.0 ([#459](https://github.com/txpipe/pallas/issues/459)) +- **deps:** update utxorpc-spec requirement from 0.3.0 to 0.4.4 ([#425](https://github.com/txpipe/pallas/issues/425)) +- **deps:** update base64 requirement from 0.21.2 to 0.22.0 ([#417](https://github.com/txpipe/pallas/issues/417)) +- **deps:** update rocksdb requirement from 0.21.0 to 0.22.0 ([#403](https://github.com/txpipe/pallas/issues/403)) +- **deps:** update itertools requirement from 0.10.5 to 0.12.1 ([#390](https://github.com/txpipe/pallas/issues/390)) +- **deps:** update minicbor requirement from 0.19 to 0.20 ([#337](https://github.com/txpipe/pallas/issues/337)) + +### Chore +- fix lint warnings ([#339](https://github.com/txpipe/pallas/issues/339)) +- remove rolldb from repo ([#537](https://github.com/txpipe/pallas/issues/537)) +- update root crate re-exports ([#536](https://github.com/txpipe/pallas/issues/536)) +- Improve network tracing messages ([#237](https://github.com/txpipe/pallas/issues/237)) +- Fix lint warnings for all targets ([#240](https://github.com/txpipe/pallas/issues/240)) +- Use gasket dep from crates.io ([#249](https://github.com/txpipe/pallas/issues/249)) +- upgrade gasket to v0.3.0 ([#255](https://github.com/txpipe/pallas/issues/255)) +- upgrade to gasket v0.4 ([#256](https://github.com/txpipe/pallas/issues/256)) +- undo upstream crate experiment ([#258](https://github.com/txpipe/pallas/issues/258)) +- fix lint warnings and outdated tests ([#475](https://github.com/txpipe/pallas/issues/475)) +- fix clippy warnings ([#262](https://github.com/txpipe/pallas/issues/262)) +- improve ImmutableDB error handling ([#426](https://github.com/txpipe/pallas/issues/426)) +- fix lint warnings ([#470](https://github.com/txpipe/pallas/issues/470)) +- split unstable features into independent flags ([#469](https://github.com/txpipe/pallas/issues/469)) +- fix pending code formatting ([#270](https://github.com/txpipe/pallas/issues/270)) +- apply lint recommendations ([#458](https://github.com/txpipe/pallas/issues/458)) +- fix lint warning ([#283](https://github.com/txpipe/pallas/issues/283)) +- move txbuilder to stable feature ([#451](https://github.com/txpipe/pallas/issues/451)) +- include configs in main crate ([#299](https://github.com/txpipe/pallas/issues/299)) +- fix new lint warnings ([#400](https://github.com/txpipe/pallas/issues/400)) +- update utxorpc-spec to 0.3.0 ([#399](https://github.com/txpipe/pallas/issues/399)) +- fix lint warnings across the board ([#374](https://github.com/txpipe/pallas/issues/374)) +- fix code formatting ([#363](https://github.com/txpipe/pallas/issues/363)) +- update mini-protocol pdf README link ([#301](https://github.com/txpipe/pallas/issues/301)) +- fix lint warnings ([#330](https://github.com/txpipe/pallas/issues/330)) +- use new method for github dark mode images ([#538](https://github.com/txpipe/pallas/issues/538)) +- **applying:** prepare pparams for folding logic ([#438](https://github.com/txpipe/pallas/issues/438)) +- **deps:** update NamedPipes related deps ([#336](https://github.com/txpipe/pallas/issues/336)) +- **deps:** use cryptoxide sha3 instead of depending on sha3 crate ([#452](https://github.com/txpipe/pallas/issues/452)) +- **interop:** bump u5c to v0.11.0 ([#519](https://github.com/txpipe/pallas/issues/519)) +- **interop:** bump u5c spec to v0.9 ([#503](https://github.com/txpipe/pallas/issues/503)) +- **interop:** update u5c spec to v0.8.0 ([#493](https://github.com/txpipe/pallas/issues/493)) +- **interop:** update u5c spec to v0.7.0 ([#489](https://github.com/txpipe/pallas/issues/489)) +- **interop:** update u5c specs to v0.6 ([#485](https://github.com/txpipe/pallas/issues/485)) +- **math:** initialize pallas-math crate ([#474](https://github.com/txpipe/pallas/issues/474)) +- **traverse:** make era enum serializable ([#467](https://github.com/txpipe/pallas/issues/467)) +- **traverse:** Improve API ergonomics ([#233](https://github.com/txpipe/pallas/issues/233)) +- **txbuilder:** export ExUnits to make them accessible from outside ([#497](https://github.com/txpipe/pallas/issues/497)) +- **txbuilder:** fix lint warnings ([#343](https://github.com/txpipe/pallas/issues/343)) +- **wallet:** fix lint warnings ([#344](https://github.com/txpipe/pallas/issues/344)) + +### Ci +- skip gmp dep until we can build on windows ([#476](https://github.com/txpipe/pallas/issues/476)) +- run Rust check on multiple OS ([#286](https://github.com/txpipe/pallas/issues/286)) + +### Doc +- **applying:** add ShelleyMA tests description ([#356](https://github.com/txpipe/pallas/issues/356)) + +### Docs +- update readme with latest crate structure ([#539](https://github.com/txpipe/pallas/issues/539)) +- define security policy ([#464](https://github.com/txpipe/pallas/issues/464)) +- Small crate readme tweaks +- **applying:** document Byron tx validations ([#311](https://github.com/txpipe/pallas/issues/311)) +- **network:** Add chain-sync client docs ([#252](https://github.com/txpipe/pallas/issues/252)) +- **network:** Document BlockFetch client ([#251](https://github.com/txpipe/pallas/issues/251)) + +### Feat +- generate genesis utxos from genesis file ([#59](https://github.com/txpipe/pallas/issues/59)) +- Add client/server use_channel variants ([#228](https://github.com/txpipe/pallas/issues/228)) +- improve access to genesis utxos ([#302](https://github.com/txpipe/pallas/issues/302)) +- Allow creation of secret key from bytes ([#224](https://github.com/txpipe/pallas/issues/224)) +- add support for Conway config and params traverse ([#521](https://github.com/txpipe/pallas/issues/521)) +- Move flat en/de from aiken to pallas ([#303](https://github.com/txpipe/pallas/issues/303)) +- Make the underlying TxBody type generic +- introduce UTxO RPC interop ([#260](https://github.com/txpipe/pallas/issues/260)) +- add handshake with query for n2c ([#266](https://github.com/txpipe/pallas/issues/266)) +- scaffold Byron phase-1 validations ([#300](https://github.com/txpipe/pallas/issues/300)) +- introduce RollDB ([#307](https://github.com/txpipe/pallas/issues/307)) +- introduce conway primitives ([#290](https://github.com/txpipe/pallas/issues/290)) +- introduce wallet crate for ed25519-bip32 key management ([#342](https://github.com/txpipe/pallas/issues/342)) +- implement GetCBOR local state query ([#413](https://github.com/txpipe/pallas/issues/413)) +- Add constants for known miniprotocols +- Introduce Upstream crate ([#230](https://github.com/txpipe/pallas/issues/230)) +- add Babbage phase-1 validations ([#405](https://github.com/txpipe/pallas/issues/405)) +- add a simple Crawler example ([#453](https://github.com/txpipe/pallas/issues/453)) +- introduce transaction builder crate ([#338](https://github.com/txpipe/pallas/issues/338)) +- add Conway 2024-03 CDDL conformity ([#424](https://github.com/txpipe/pallas/issues/424)) +- Migrate to asynchronous I/O ([#241](https://github.com/txpipe/pallas/issues/241)) +- add helper to create bootstrap addresses ([#269](https://github.com/txpipe/pallas/issues/269)) +- implement `GetCurrentPParams` local state query ([#322](https://github.com/txpipe/pallas/issues/322)) +- **addresses:** Derive Hash on Address ([#235](https://github.com/txpipe/pallas/issues/235)) +- **applying:** implement Alonzo phase-1 validations ([#380](https://github.com/txpipe/pallas/issues/380)) +- **applying:** implement ShelleyMA phase-1 validations ([#354](https://github.com/txpipe/pallas/issues/354)) +- **applying:** add support for preview / preprod networks ([#422](https://github.com/txpipe/pallas/issues/422)) +- **applying:** add remaining validations for Byron era ([#325](https://github.com/txpipe/pallas/issues/325)) +- **applying:** validate all inputs in UTxO set ([#324](https://github.com/txpipe/pallas/issues/324)) +- **applying:** add cert and native script validation for ShelleyMA ([#510](https://github.com/txpipe/pallas/issues/510)) +- **applying:** check non-empty set of inputs and outputs ([#312](https://github.com/txpipe/pallas/issues/312)) +- **codec:** add utility for untyped CBOR fragments ([#327](https://github.com/txpipe/pallas/issues/327)) +- **codec:** improve KeyValuePairs ergonomics ([#515](https://github.com/txpipe/pallas/issues/515)) +- **configs:** add serde for Alonzo genesis file ([#436](https://github.com/txpipe/pallas/issues/436)) +- **configs:** add Shelley config structs ([#359](https://github.com/txpipe/pallas/issues/359)) +- **crypto:** Add Key Evolving Signatures (KES) +- **crypto:** add extra types and conversions ([#517](https://github.com/txpipe/pallas/issues/517)) +- **crypto:** add Blake2b hasher for 20-bytes digests ([#416](https://github.com/txpipe/pallas/issues/416)) +- **hardano:** implement immutable db chunk parsing ([#328](https://github.com/txpipe/pallas/issues/328)) +- **hardano:** implement search for the immutabledb reader ([#372](https://github.com/txpipe/pallas/issues/372)) +- **hardano:** enable async for read_blocks_from_point iterator ([#379](https://github.com/txpipe/pallas/issues/379)) +- **hardano:** add fuzzy block search by slot in Immutable db ([#484](https://github.com/txpipe/pallas/issues/484)) +- **interop:** add block mapping to u5c ([#261](https://github.com/txpipe/pallas/issues/261)) +- **interop:** implement u5c pparams mapping ([#504](https://github.com/txpipe/pallas/issues/504)) +- **interop:** introduce field-mask context for u5c ([#502](https://github.com/txpipe/pallas/issues/502)) +- **interop:** map u5c Conway structs ([#511](https://github.com/txpipe/pallas/issues/511)) +- **interop:** re-export utxorpc spec to unify downstream versions ([#448](https://github.com/txpipe/pallas/issues/448)) +- **interop:** add ledger context for utxorpc mapping logic ([#450](https://github.com/txpipe/pallas/issues/450)) +- **math:** add support for some math functions ([#483](https://github.com/txpipe/pallas/issues/483)) +- **network:** add sanchonet compatibility ([#355](https://github.com/txpipe/pallas/issues/355)) +- **network:** implement GetUTxOByAddress local state query ([#341](https://github.com/txpipe/pallas/issues/341)) +- **network:** implement stake distribution local state query ([#340](https://github.com/txpipe/pallas/issues/340)) +- **network:** add cbor decoder for HardForkQuery ([#335](https://github.com/txpipe/pallas/issues/335)) +- **network:** implement windows named pipes connections ([#279](https://github.com/txpipe/pallas/issues/279)) +- **network:** implement LocalTxSubmission client ([#289](https://github.com/txpipe/pallas/issues/289)) +- **network:** add tx submission and tx monitor clients to network facades ([#442](https://github.com/txpipe/pallas/issues/442)) +- **network:** implement chain sync server side ([#277](https://github.com/txpipe/pallas/issues/277)) +- **network:** implement `GetChainBlockNo` local state query ([#441](https://github.com/txpipe/pallas/issues/441)) +- **network:** implement background keep-alive loop ([#427](https://github.com/txpipe/pallas/issues/427)) +- **network:** scaffold local state query server ([#280](https://github.com/txpipe/pallas/issues/280)) +- **network:** add server side of blockfetch miniprotocol ([#275](https://github.com/txpipe/pallas/issues/275)) +- **network:** update n2n handshake versions & add keepalive miniprotocol ([#362](https://github.com/txpipe/pallas/issues/362)) +- **network:** implement split read / write for NamedPipe bearer ([#371](https://github.com/txpipe/pallas/issues/371)) +- **network:** implement server side KeepAlive ([#376](https://github.com/txpipe/pallas/issues/376)) +- **network:** implement `GetGenesisConfig` local state query ([#407](https://github.com/txpipe/pallas/issues/407)) +- **network:** add an extra ergonomic method for n2c chainsync ([#439](https://github.com/txpipe/pallas/issues/439)) +- **network:** implement stake snapshot local state query ([#394](https://github.com/txpipe/pallas/issues/394)) +- **network:** add server-side facades ([#282](https://github.com/txpipe/pallas/issues/282)) +- **primitives:** derive Eq on relevant structs ([#446](https://github.com/txpipe/pallas/issues/446)) +- **rolldb:** allow crawl from intersect options ([#404](https://github.com/txpipe/pallas/issues/404)) +- **rolldb:** allow optionally overlap of WAL over immutable chain ([#419](https://github.com/txpipe/pallas/issues/419)) +- **rolldb:** add method to check if db is empty ([#352](https://github.com/txpipe/pallas/issues/352)) +- **traverse:** add network id to genesis values ([#272](https://github.com/txpipe/pallas/issues/272)) +- **traverse:** prioritize Conway for tx decoding heuristics ([#527](https://github.com/txpipe/pallas/issues/527)) +- **traverse:** improve protocol update access ([#360](https://github.com/txpipe/pallas/issues/360)) +- **traverse:** expose tx update field ([#313](https://github.com/txpipe/pallas/issues/313)) +- **traverse:** introduce MultiEraValue ([#516](https://github.com/txpipe/pallas/issues/516)) +- **traverse:** improve native asset access ([#259](https://github.com/txpipe/pallas/issues/259)) +- **traverse:** track original era for tx outputs ([#447](https://github.com/txpipe/pallas/issues/447)) +- **traverse:** Introduce time helpers ([#234](https://github.com/txpipe/pallas/issues/234)) +- **traverse:** Expose aux data scripts ([#232](https://github.com/txpipe/pallas/issues/232)) +- **traverse:** Decode Conway block headers properly ([#466](https://github.com/txpipe/pallas/issues/466)) +- **txbuilder:** compute ScriptDataHash including edge cases ([#525](https://github.com/txpipe/pallas/issues/525)) +- **txbuilder:** expose independent output builder ([#522](https://github.com/txpipe/pallas/issues/522)) +- **upstream:** Make output generic by adapter ([#236](https://github.com/txpipe/pallas/issues/236)) +- **wallet:** implement HD private keys & encrypted wrapper ([#358](https://github.com/txpipe/pallas/issues/358)) + +### Fix +- support multiple pools in stake snapshot query ([#396](https://github.com/txpipe/pallas/issues/396)) +- Make upstream worker easy to connect ([#246](https://github.com/txpipe/pallas/issues/246)) +- Handle bearer I/O errors ([#247](https://github.com/txpipe/pallas/issues/247)) +- back-merge v0.18.1 hotfix ([#254](https://github.com/txpipe/pallas/issues/254)) +- ignore duplicate consumed inputs ([#257](https://github.com/txpipe/pallas/issues/257)) +- fix builds on windows platform ([#263](https://github.com/txpipe/pallas/issues/263)) +- use u64 instead of i64 for unit interval and rational numerator ([#268](https://github.com/txpipe/pallas/issues/268)) +- allow extra bytes when decoding base address ([#420](https://github.com/txpipe/pallas/issues/420)) +- remove math from root crate ([#541](https://github.com/txpipe/pallas/issues/541)) +- contemplate legacy tx outputs in utxo by address query ([#386](https://github.com/txpipe/pallas/issues/386)) +- make rolldb an optional dependency ([#329](https://github.com/txpipe/pallas/issues/329)) +- exclude large data files blocking crate publish +- favor Babbage over Conway for tx decoding ([#389](https://github.com/txpipe/pallas/issues/389)) +- fix conditional code for windows builds ([#334](https://github.com/txpipe/pallas/issues/334)) +- relax CBOR decoding of Conway protocol params update ([#473](https://github.com/txpipe/pallas/issues/473)) +- return witness objects for conway era multieratx ([#346](https://github.com/txpipe/pallas/issues/346)) +- add txbuilder to unstable feature gate ([#349](https://github.com/txpipe/pallas/issues/349)) +- correct datum kind for set_datum_hash ([#350](https://github.com/txpipe/pallas/issues/350)) +- update pallas-applying to work with keepraw native scripts ([#370](https://github.com/txpipe/pallas/issues/370)) +- add missing READMEs for crate publish +- fix unable to build and sign txs ([#345](https://github.com/txpipe/pallas/issues/345)) +- add missing Cargo metadata required for publish +- **addresses:** relax length check during parsing ([#491](https://github.com/txpipe/pallas/issues/491)) +- **addresses:** check length before decoding ([#377](https://github.com/txpipe/pallas/issues/377)) +- **applying:** fix tx size calculation ([#443](https://github.com/txpipe/pallas/issues/443)) +- **applying:** contemplate fee rules for genesis UTxOs ([#332](https://github.com/txpipe/pallas/issues/332)) +- **applying:** define specific dependency versions +- **applying:** use correct cost model for Conway ([#508](https://github.com/txpipe/pallas/issues/508)) +- **applying:** add missing Conway pparams variant ([#507](https://github.com/txpipe/pallas/issues/507)) +- **codec:** Fix flat encoding and decoding of arbitrarily size integers ([#378](https://github.com/txpipe/pallas/issues/378)) +- **configs:** parse directly into rational numbers ([#437](https://github.com/txpipe/pallas/issues/437)) +- **crypto:** remove modules with non-published deps ([#540](https://github.com/txpipe/pallas/issues/540)) +- **hardano:** exclude last chunk file during immutable db read ([#454](https://github.com/txpipe/pallas/issues/454)) +- **hardano:** remove panics from immutable db parsing ([#351](https://github.com/txpipe/pallas/issues/351)) +- **interop:** use correct input order to match redeemers ([#487](https://github.com/txpipe/pallas/issues/487)) +- **interop:** map missing u5c redeemers ([#490](https://github.com/txpipe/pallas/issues/490)) +- **interop:** support Conway pparams mapping to u5c ([#509](https://github.com/txpipe/pallas/issues/509)) +- **interop:** skip conway certs in u5c ([#498](https://github.com/txpipe/pallas/issues/498)) +- **interop:** check for spend purpose when matching redeemers ([#486](https://github.com/txpipe/pallas/issues/486)) +- **math:** update once_cell::Lazy -> std::sync::LazyLock +- **math:** fix edge cases of ln and pow +- **network:** add missing feature gate flag to tokio dependency ([#333](https://github.com/txpipe/pallas/issues/333)) +- **network:** set so_linger socket option to match cardano-node ([#369](https://github.com/txpipe/pallas/issues/369)) +- **network:** relax connect args lifetime ([#367](https://github.com/txpipe/pallas/issues/367)) +- **network:** demux using one mpsc channel per miniprotocol ([#366](https://github.com/txpipe/pallas/issues/366)) +- **network:** add tcp_nodelay to bearer ([#365](https://github.com/txpipe/pallas/issues/365)) +- **network:** use correct client state transition for n2n txsub ([#348](https://github.com/txpipe/pallas/issues/348)) +- **network:** handle end of list in tx monitor response ([#305](https://github.com/txpipe/pallas/issues/305)) +- **network:** expose missing members in facades ([#468](https://github.com/txpipe/pallas/issues/468)) +- **network:** use initiatorOnlyDiffusionMode correctly after spec fix ([#384](https://github.com/txpipe/pallas/issues/384)) +- **network:** add missing rt feature for tokio +- **network:** skip unix listener on windows ([#287](https://github.com/txpipe/pallas/issues/287)) +- **network:** fix bad codec for tx monitoring messages ([#298](https://github.com/txpipe/pallas/issues/298)) +- **network:** make facade members public ([#285](https://github.com/txpipe/pallas/issues/285)) +- **primitives:** expose hidden struct fields in Conway ([#501](https://github.com/txpipe/pallas/issues/501)) +- **primitives:** skip nonempty invariant check ([#506](https://github.com/txpipe/pallas/issues/506)) +- **primitives:** handle conway extreme param updates ([#462](https://github.com/txpipe/pallas/issues/462)) +- **primitives:** contemplate Conway's CBOR `set` tag ([#421](https://github.com/txpipe/pallas/issues/421)) +- **primitives:** patch remaining Conway issues ([#505](https://github.com/txpipe/pallas/issues/505)) +- **rolldb:** fix find wal sequence semantics ([#310](https://github.com/txpipe/pallas/issues/310)) +- **traverse:** fix conway txs not returning reference inputs ([#388](https://github.com/txpipe/pallas/issues/388)) +- **traverse:** fix well-known genesis values for preprod / preview ([#284](https://github.com/txpipe/pallas/issues/284)) +- **traverse:** add missing tx field getters for Conway ([#392](https://github.com/txpipe/pallas/issues/392)) +- **traverse:** use Conway types in places they are meant to ([#499](https://github.com/txpipe/pallas/issues/499)) +- **txbuilder:** don't include empty redeemers in Conway txs ([#532](https://github.com/txpipe/pallas/issues/532)) +- **txbuilder:** sign transactions using Conway era ([#531](https://github.com/txpipe/pallas/issues/531)) +- **upstream:** Use sync read for chunk dequeue ([#239](https://github.com/txpipe/pallas/issues/239)) +- **utxorpc:** map missing struct values ([#387](https://github.com/txpipe/pallas/issues/387)) + +### Refactor +- support roundtrip encoding for script data hash components ([#526](https://github.com/txpipe/pallas/issues/526)) +- Re-organize and clean-up pallas-primitives ([#523](https://github.com/txpipe/pallas/issues/523)) +- Improve network module naming ([#245](https://github.com/txpipe/pallas/issues/245)) +- Merge multiplexer & miniprotocols into single crate ([#244](https://github.com/txpipe/pallas/issues/244)) +- **applying:** unify approach for protocol params access ([#432](https://github.com/txpipe/pallas/issues/432)) +- **interop:** use stateful mapper for u5 ([#460](https://github.com/txpipe/pallas/issues/460)) +- **interop:** use batching for utxorpc ledger interface ([#472](https://github.com/txpipe/pallas/issues/472)) +- **network:** split bearer into read/write ([#364](https://github.com/txpipe/pallas/issues/364)) +- **network:** simplify local state mini-protocol implementation ([#326](https://github.com/txpipe/pallas/issues/326)) +- **network:** don't treat rejected txs as submit protocol errors ([#306](https://github.com/txpipe/pallas/issues/306)) +- **traverse:** Unify mint and output asset artifacts ([#231](https://github.com/txpipe/pallas/issues/231)) + +### Release +- v0.21.0 ([#375](https://github.com/txpipe/pallas/issues/375)) + +### Test +- **hardano:** contemplate skip of last chunk in immutable read ([#457](https://github.com/txpipe/pallas/issues/457)) +- **hardano:** fix failing tests on CI context ([#429](https://github.com/txpipe/pallas/issues/429)) +- **hardano:** discover snapshots by inspecting test_data dir ([#428](https://github.com/txpipe/pallas/issues/428)) + +### BREAKING CHANGE + +the `validate` fn signature has changed to support these changes + +--------- + +The signature for Bearer.accept_tcp now returns the bearer, and the address that connected. + +This can, for example, be used to implement allow and deny lists for accepting or rejecting incoming connections. + +* Return the remote address from accept_unix + +* cargo fmt + +* Fix comment formatting + + + +## [v0.18.3] - 2024-10-23 +### Fix +- update n2n version table ([#530](https://github.com/txpipe/pallas/issues/530)) +- use u64 instead of i64 for unit interval and rational numerator ([#268](https://github.com/txpipe/pallas/issues/268)) +- **primitives:** Handle U8 and U16 in value serialization + + + +## [v0.30.2] - 2024-09-08 +### Feat +- **interop:** map u5c Conway structs ([#511](https://github.com/txpipe/pallas/issues/511)) + + ## [v0.30.1] - 2024-08-25 ### Fix @@ -962,11 +1267,11 @@ handshake, chainsync, localstate and blockfetch mini-protocols changed the API s - **miniprotocols:** Use pure functions for state machines ([#84](https://github.com/txpipe/pallas/issues/84)) - -## [pallas-miniprotocols@0.7.1] - 2022-03-16 - ## [pallas-codec@0.7.1] - 2022-03-16 + + +## [pallas-miniprotocols@0.7.1] - 2022-03-16 ### Fix - **miniprotocols:** Handle regression related to multi-msg payloads ([#76](https://github.com/txpipe/pallas/issues/76)) @@ -1251,7 +1556,11 @@ handshake, chainsync, localstate and blockfetch mini-protocols changed the API s - apply fmt to entire workspace -[Unreleased]: https://github.com/txpipe/pallas/compare/v0.30.1...HEAD +[Unreleased]: https://github.com/txpipe/pallas/compare/v0.32.0...HEAD +[v0.32.0]: https://github.com/txpipe/pallas/compare/v0.31.0...v0.32.0 +[v0.31.0]: https://github.com/txpipe/pallas/compare/v0.18.3...v0.31.0 +[v0.18.3]: https://github.com/txpipe/pallas/compare/v0.30.2...v0.18.3 +[v0.30.2]: https://github.com/txpipe/pallas/compare/v0.30.1...v0.30.2 [v0.30.1]: https://github.com/txpipe/pallas/compare/v0.30.0...v0.30.1 [v0.30.0]: https://github.com/txpipe/pallas/compare/v0.29.0...v0.30.0 [v0.29.0]: https://github.com/txpipe/pallas/compare/v0.28.0...v0.29.0 @@ -1306,9 +1615,9 @@ handshake, chainsync, localstate and blockfetch mini-protocols changed the API s [v0.9.0-alpha.0]: https://github.com/txpipe/pallas/compare/v0.8.0...v0.9.0-alpha.0 [v0.8.0]: https://github.com/txpipe/pallas/compare/v0.8.0-alpha.1...v0.8.0 [v0.8.0-alpha.1]: https://github.com/txpipe/pallas/compare/v0.8.0-alpha.0...v0.8.0-alpha.1 -[v0.8.0-alpha.0]: https://github.com/txpipe/pallas/compare/pallas-miniprotocols@0.7.1...v0.8.0-alpha.0 -[pallas-miniprotocols@0.7.1]: https://github.com/txpipe/pallas/compare/pallas-codec@0.7.1...pallas-miniprotocols@0.7.1 -[pallas-codec@0.7.1]: https://github.com/txpipe/pallas/compare/v0.7.0...pallas-codec@0.7.1 +[v0.8.0-alpha.0]: https://github.com/txpipe/pallas/compare/pallas-codec@0.7.1...v0.8.0-alpha.0 +[pallas-codec@0.7.1]: https://github.com/txpipe/pallas/compare/pallas-miniprotocols@0.7.1...pallas-codec@0.7.1 +[pallas-miniprotocols@0.7.1]: https://github.com/txpipe/pallas/compare/v0.7.0...pallas-miniprotocols@0.7.1 [v0.7.0]: https://github.com/txpipe/pallas/compare/v0.7.0-alpha.1...v0.7.0 [v0.7.0-alpha.1]: https://github.com/txpipe/pallas/compare/v0.7.0-alpha.0...v0.7.0-alpha.1 [v0.7.0-alpha.0]: https://github.com/txpipe/pallas/compare/pallas-primitives@0.6.4...v0.7.0-alpha.0 diff --git a/examples/n2c-miniprotocols/src/main.rs b/examples/n2c-miniprotocols/src/main.rs index 26dca49..2cc0647 100644 --- a/examples/n2c-miniprotocols/src/main.rs +++ b/examples/n2c-miniprotocols/src/main.rs @@ -8,7 +8,7 @@ use pallas::{ facades::NodeClient, miniprotocols::{ chainsync, - localstate::queries_v16::{self, Addr, Addrs, StakeAddr, TransactionInput}, + localstate::queries_v16::{self, Addr, Addrs, Pools, StakeAddr, TransactionInput}, Point, PRE_PRODUCTION_MAGIC, }, }, @@ -66,6 +66,19 @@ async fn do_localstate_query(client: &mut NodeClient) { .unwrap(); info!("result: {:?}", result); + let pool_id1 = "fdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b"; + let pool_id1 = Bytes::from_str(pool_id1).unwrap(); + let pool_id2 = "1e3105f23f2ac91b3fb4c35fa4fe301421028e356e114944e902005b"; + let pool_id2 = Bytes::from_str(pool_id2).unwrap(); + let mut pools: Pools = BTreeSet::new(); + pools.insert(pool_id1); + pools.insert(pool_id2); + + let result = queries_v16::get_stake_pool_params(client, era, pools.into()) + .await + .unwrap(); + info!("result: {:?}", result); + let result = queries_v16::get_block_epoch_number(client, era) .await .unwrap(); diff --git a/pallas-addresses/Cargo.toml b/pallas-addresses/Cargo.toml index e5b9b7d..dcfdf88 100644 --- a/pallas-addresses/Cargo.toml +++ b/pallas-addresses/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-addresses" description = "Ergonomic library to work with different Cardano addresses" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -12,8 +12,8 @@ authors = ["Santiago Carmuega "] [dependencies] hex = "0.4.3" -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } base58 = "0.2.0" bech32 = "0.9.1" thiserror = "1.0" diff --git a/pallas-applying/Cargo.toml b/pallas-applying/Cargo.toml index 2a6f90a..0ac0fe4 100644 --- a/pallas-applying/Cargo.toml +++ b/pallas-applying/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-applying" description = "Logic for validating and applying new blocks and txs to the chain state" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/MaicoLeberle/pallas" homepage = "https://github.com/MaicoLeberle/pallas" @@ -13,13 +13,14 @@ authors = ["Maico Leberle "] doctest = false [dependencies] -pallas-addresses = { version = "=0.31.0", path = "../pallas-addresses" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } -pallas-primitives = { version = "=0.31.0", path = "../pallas-primitives" } -pallas-traverse = { version = "=0.31.0", path = "../pallas-traverse" } +pallas-addresses = { version = "=0.32.1", path = "../pallas-addresses" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } +pallas-primitives = { version = "=0.32.1", path = "../pallas-primitives" } +pallas-traverse = { version = "=0.32.1", path = "../pallas-traverse" } rand = "0.8" hex = "0.4" +chrono = "0.4.39" [dev-dependencies] hex = "0.4" diff --git a/pallas-applying/src/utils/environment.rs b/pallas-applying/src/utils/environment.rs index 369a24f..498339b 100644 --- a/pallas-applying/src/utils/environment.rs +++ b/pallas-applying/src/utils/environment.rs @@ -21,6 +21,28 @@ pub enum MultiEraProtocolParameters { } impl MultiEraProtocolParameters { + pub fn system_start(&self) -> chrono::DateTime { + match self { + MultiEraProtocolParameters::Byron(ByronProtParams { start_time, .. }) => { + chrono::DateTime::from_timestamp(*start_time as i64, 0) + .expect("valid timestamp") + .fixed_offset() + } + MultiEraProtocolParameters::Shelley(ShelleyProtParams { system_start, .. }) => { + *system_start + } + MultiEraProtocolParameters::Alonzo(AlonzoProtParams { system_start, .. }) => { + *system_start + } + MultiEraProtocolParameters::Babbage(BabbageProtParams { system_start, .. }) => { + *system_start + } + MultiEraProtocolParameters::Conway(ConwayProtParams { system_start, .. }) => { + *system_start + } + } + } + pub fn protocol_version(&self) -> usize { match self { MultiEraProtocolParameters::Byron(ByronProtParams { @@ -45,11 +67,56 @@ impl MultiEraProtocolParameters { }) => *x as usize, } } + + const FIVE_DAYS_IN_SECONDS: u64 = 5 * 24 * 60 * 60; + + pub fn epoch_length(&self) -> u64 { + match self { + MultiEraProtocolParameters::Byron(ByronProtParams { slot_duration, .. }) => { + // TODO: research if Byron epoch length is actually hardcoded or if you can get + // it from genesis files somehow + Self::FIVE_DAYS_IN_SECONDS / (*slot_duration / 1000) + } + MultiEraProtocolParameters::Shelley(ShelleyProtParams { epoch_length, .. }) => { + *epoch_length + } + MultiEraProtocolParameters::Alonzo(AlonzoProtParams { epoch_length, .. }) => { + *epoch_length + } + MultiEraProtocolParameters::Babbage(BabbageProtParams { epoch_length, .. }) => { + *epoch_length + } + MultiEraProtocolParameters::Conway(ConwayProtParams { epoch_length, .. }) => { + *epoch_length + } + } + } + + pub fn slot_length(&self) -> u64 { + match self { + MultiEraProtocolParameters::Byron(ByronProtParams { slot_duration, .. }) => { + *slot_duration / 1000 + } + MultiEraProtocolParameters::Shelley(ShelleyProtParams { slot_length, .. }) => { + *slot_length + } + MultiEraProtocolParameters::Alonzo(AlonzoProtParams { slot_length, .. }) => { + *slot_length + } + MultiEraProtocolParameters::Babbage(BabbageProtParams { slot_length, .. }) => { + *slot_length + } + MultiEraProtocolParameters::Conway(ConwayProtParams { slot_length, .. }) => { + *slot_length + } + } + } } #[derive(Debug, Clone)] pub struct ByronProtParams { pub block_version: (u16, u16, u8), + pub start_time: u64, pub script_version: u16, pub slot_duration: u64, pub max_block_size: u64, @@ -69,6 +136,9 @@ pub struct ByronProtParams { #[derive(Debug, Clone)] pub struct ShelleyProtParams { + pub system_start: chrono::DateTime, + pub epoch_length: u64, + pub slot_length: u64, pub minfee_a: u32, pub minfee_b: u32, pub max_block_body_size: u32, @@ -90,6 +160,9 @@ pub struct ShelleyProtParams { #[derive(Debug, Clone)] pub struct AlonzoProtParams { + pub system_start: chrono::DateTime, + pub epoch_length: u64, + pub slot_length: u64, pub minfee_a: u32, pub minfee_b: u32, pub max_block_body_size: u32, @@ -118,6 +191,9 @@ pub struct AlonzoProtParams { #[derive(Debug, Clone)] pub struct BabbageProtParams { + pub system_start: chrono::DateTime, + pub epoch_length: u64, + pub slot_length: u64, pub minfee_a: u32, pub minfee_b: u32, pub max_block_body_size: u32, @@ -146,6 +222,9 @@ pub struct BabbageProtParams { #[derive(Debug, Clone)] pub struct ConwayProtParams { + pub system_start: chrono::DateTime, + pub epoch_length: u64, + pub slot_length: u64, pub minfee_a: u32, pub minfee_b: u32, pub max_block_body_size: u32, diff --git a/pallas-applying/tests/alonzo.rs b/pallas-applying/tests/alonzo.rs index 59ad109..f6bbf45 100644 --- a/pallas-applying/tests/alonzo.rs +++ b/pallas-applying/tests/alonzo.rs @@ -2558,6 +2558,9 @@ mod alonzo_tests { fn mk_params_epoch_334() -> AlonzoProtParams { AlonzoProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2017-09-23T21:44:51Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_a: 44, minfee_b: 155381, max_block_body_size: 65536, @@ -2633,6 +2636,9 @@ mod alonzo_tests { fn mk_params_epoch_300() -> AlonzoProtParams { AlonzoProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2017-09-23T21:44:51Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_a: 44, minfee_b: 155381, max_block_body_size: 81920, diff --git a/pallas-applying/tests/babbage.rs b/pallas-applying/tests/babbage.rs index 763642f..11ae64c 100644 --- a/pallas-applying/tests/babbage.rs +++ b/pallas-applying/tests/babbage.rs @@ -2369,6 +2369,9 @@ mod babbage_tests { fn mk_mainnet_params_epoch_365() -> BabbageProtParams { BabbageProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2017-09-23T21:44:51Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_a: 44, minfee_b: 155381, max_block_body_size: 90112, @@ -2445,6 +2448,9 @@ mod babbage_tests { fn mk_mainnet_params_epoch_380() -> BabbageProtParams { BabbageProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2022-10-25T00:00:00Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_a: 44, minfee_b: 155381, max_block_body_size: 90112, @@ -2697,6 +2703,9 @@ mod babbage_tests { fn mk_preview_params_epoch_30() -> BabbageProtParams { BabbageProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2022-10-25T00:00:00Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_a: 44, minfee_b: 155381, max_block_body_size: 90112, @@ -2787,6 +2796,9 @@ mod babbage_tests { fn mk_preprod_params_epoch_100() -> BabbageProtParams { BabbageProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2017-09-23T21:44:51Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_a: 44, minfee_b: 155381, max_block_body_size: 90112, diff --git a/pallas-applying/tests/byron.rs b/pallas-applying/tests/byron.rs index 63813b3..2e6b81b 100644 --- a/pallas-applying/tests/byron.rs +++ b/pallas-applying/tests/byron.rs @@ -24,6 +24,45 @@ use std::vec::Vec; mod byron_tests { use super::*; + macro_rules! hardcoded_environment_values { + ($($key:ident = $value:expr),*) => { + { + #[allow(unused_mut)] + let mut pparams = ByronProtParams { + block_version: (1, 0, 0), + start_time: 1506203091, + script_version: 0, + slot_duration: 20000, + max_block_size: 2000000, + max_header_size: 2000000, + max_tx_size: 4096, + max_proposal_size: 700, + mpc_thd: 20000000000000, + heavy_del_thd: 300000000000, + update_vote_thd: 1000000000000, + update_proposal_thd: 100000000000000, + update_implicit: 10000, + soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), + summand: 155381, + multiplier: 44, + unlock_stake_epoch: 18446744073709551615, + }; + + $( + pparams.$key = $value; + )* + + Environment { + prot_params: MultiEraProtocolParameters::Byron(pparams), + prot_magic: 764824073, + block_slot: 6341, + network_id: 1, + acnt: None, + } + } + } + } + #[test] // Transaction hash: // a9e4413a5fb61a7a43c7df006ffcaaf3f2ffc9541f54757023968c5a8f8294fd @@ -38,30 +77,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 6341, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -83,30 +99,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -136,30 +129,7 @@ mod byron_tests { }; mtxp.transaction = Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_byron(&mtxp); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Inputs set should not be empty"), @@ -192,30 +162,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Outputs set should not be empty"), @@ -233,30 +180,7 @@ mod byron_tests { let mtxp: MintedTxPayload = minted_tx_payload_from_cbor(&cbor_bytes); let metx: MultiEraTx = MultiEraTx::from_byron(&mtxp); let utxos: UTxOs = UTxOs::new(); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("All inputs must be within the UTxO set"), @@ -295,30 +219,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("All outputs must contain lovelace"), @@ -342,30 +243,8 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 1000, - multiplier: 1000, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + + let env: Environment = hardcoded_environment_values!(summand = 1000, multiplier = 1000); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Fees should not be below minimum"), @@ -389,30 +268,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 0, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(max_tx_size = 0); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Transaction size cannot exceed protocol limit"), @@ -444,30 +300,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("All inputs must have a witness signature"), @@ -508,30 +341,7 @@ mod byron_tests { 19999000000, )], ); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Byron(ByronProtParams { - block_version: (1, 0, 0), - script_version: 0, - slot_duration: 20000, - max_block_size: 2000000, - max_header_size: 2000000, - max_tx_size: 4096, - max_proposal_size: 700, - mpc_thd: 20000000000000, - heavy_del_thd: 300000000000, - update_vote_thd: 1000000000000, - update_proposal_thd: 100000000000000, - update_implicit: 10000, - soft_fork_rule: (900000000000000, 600000000000000, 50000000000000), - summand: 155381, - multiplier: 44, - unlock_stake_epoch: 18446744073709551615, - }), - prot_magic: 764824073, - block_slot: 3241381, - network_id: 1, - acnt: None, - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Witness signature should verify the transaction"), diff --git a/pallas-applying/tests/shelley_ma.rs b/pallas-applying/tests/shelley_ma.rs index 7f43017..123ccfc 100644 --- a/pallas-applying/tests/shelley_ma.rs +++ b/pallas-applying/tests/shelley_ma.rs @@ -29,6 +29,69 @@ use std::str::FromStr; mod shelley_ma_tests { use super::*; + macro_rules! hardcoded_environment_values { + ($($key:ident = $value:expr),*) => { + { + #[allow(unused_mut)] + let mut pparams = ShelleyProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2017-09-23T21:44:51Z").unwrap(), + epoch_length: 432000, + slot_length: 1, + minfee_b: 155381, + minfee_a: 44, + max_block_body_size: 65536, + max_transaction_size: 4096, + max_block_header_size: 1100, + key_deposit: 2000000, + pool_deposit: 500000000, + maximum_epoch: 18, + desired_number_of_stake_pools: 150, + pool_pledge_influence: RationalNumber { + // FIX: this is a made-up value. + numerator: 1, + denominator: 1, + }, + expansion_rate: RationalNumber { + // FIX: this is a made-up value. + numerator: 1, + denominator: 1, + }, + treasury_growth_rate: RationalNumber { + // FIX: this is a made-up value. + numerator: 1, + denominator: 1, + }, + decentralization_constant: RationalNumber { + numerator: 1, + denominator: 1, + }, + extra_entropy: Nonce { + variant: NonceVariant::NeutralNonce, + hash: None, + }, + protocol_version: (0, 2), + min_utxo_value: 1000000, + min_pool_cost: 340000000, + }; + + $( + pparams.$key = $value; + )* + + Environment { + prot_params: MultiEraProtocolParameters::Shelley(pparams), + prot_magic: 764824073, + block_slot: 5281340, + network_id: 1, + acnt: Some(AccountState { + treasury: 261_254_564_000_000, + reserves: 0, + }), + } + } + } + } + #[test] // Transaction hash: // 50eba65e73c8c5f7b09f4ea28cf15dce169f3d1c322ca3deff03725f51518bb2 @@ -44,54 +107,8 @@ mod shelley_ma_tests { None, )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -115,54 +132,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 17584925, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -171,8 +141,8 @@ mod shelley_ma_tests { } #[test] - // Same as successful_mainnet_shelley_tx_with_script, but changing "All" to "any" and - // deleting one key-witness pair + // Same as successful_mainnet_shelley_tx_with_script, but changing "All" to + // "any" and deleting one key-witness pair fn successful_mainnet_shelley_tx_with_changed_script() { let cbor_bytes: Vec = cbor_to_bytes(include_str!("../../test_data/shelley4.tx")); let mut mtx: MintedTx = minted_tx_from_cbor(&cbor_bytes); @@ -196,54 +166,8 @@ mod shelley_ma_tests { None, )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 17584925, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -267,54 +191,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5860488, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -338,54 +215,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 24381863, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -409,51 +239,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 16384, - max_block_header_size: 1100, - key_deposit: 2_000_000, - pool_deposit: 500_000_000, - maximum_epoch: 18, - desired_number_of_stake_pools: 500, - pool_pledge_influence: RationalNumber { - numerator: 3, - denominator: 10, - }, - expansion_rate: RationalNumber { - numerator: 3, - denominator: 1000, - }, - treasury_growth_rate: RationalNumber { - numerator: 2, - denominator: 10, - }, - decentralization_constant: RationalNumber { - numerator: 0, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (4, 0), - min_utxo_value: 1_000_000, - min_pool_cost: 340_000_000, - }), - prot_magic: 764824073, - block_slot: 26342415, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); let hash = Hash::from_str("FB2B631DB76384F64DD94B47F97FC8C2A206764C17A1DE7DA2F70E83").unwrap(); @@ -551,6 +337,9 @@ mod shelley_ma_tests { Environment { prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { + system_start: chrono::DateTime::parse_from_rfc3339("2017-09-23T21:44:51Z").unwrap(), + epoch_length: 432000, + slot_length: 1, minfee_b: 155381, minfee_a: 44, max_block_body_size: 65536, @@ -608,51 +397,9 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; + let mut env: Environment = hardcoded_environment_values!(max_transaction_size = 16384); + env.block_slot = 19282133; - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 16384, - max_block_header_size: 1100, - key_deposit: 2_000_000, - pool_deposit: 500_000_000, - maximum_epoch: 18, - desired_number_of_stake_pools: 500, - pool_pledge_influence: RationalNumber { - numerator: 3, - denominator: 10, - }, - expansion_rate: RationalNumber { - numerator: 3, - denominator: 1000, - }, - treasury_growth_rate: RationalNumber { - numerator: 2, - denominator: 10, - }, - decentralization_constant: RationalNumber { - numerator: 3, - denominator: 10, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (3, 0), - min_utxo_value: 1_000_000, - min_pool_cost: 340_000_000, - }), - prot_magic: 764824073, - block_slot: 19282133, - network_id: 1, - acnt: Some(acnt), - }; let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => (), @@ -685,54 +432,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Inputs set should not be empty"), @@ -751,54 +451,7 @@ mod shelley_ma_tests { let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); let utxos: UTxOs = UTxOs::new(); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("All inputs must be within the UTxO set"), @@ -833,54 +486,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("TTL must always be present in Shelley transactions"), @@ -906,54 +512,9 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; + let mut env: Environment = hardcoded_environment_values!(); + env.block_slot = 9999999; - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 9999999, - network_id: 1, - acnt: Some(acnt), - }; let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("TTL cannot be exceeded"), @@ -979,54 +540,8 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; + let env: Environment = hardcoded_environment_values!(max_transaction_size = 0); - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 0, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Tx size exceeds max limit"), @@ -1053,54 +568,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 10000000000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env = hardcoded_environment_values!(min_utxo_value = 10000000000000); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Output amount must be above min lovelace value"), @@ -1136,54 +604,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Preservation of value property doesn't hold"), @@ -1209,54 +630,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 70, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(minfee_b = 155381, minfee_a = 70); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Fee should not be below minimum"), @@ -1305,54 +679,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let utxos: UTxOs = mk_utxo_for_alonzo_compatible_tx( &mtx.transaction_body, &[( @@ -1389,54 +716,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5860488, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("Output with wrong network ID should be rejected"), @@ -1466,54 +746,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let utxos: UTxOs = mk_utxo_for_alonzo_compatible_tx( &mtx.transaction_body, &[( @@ -1556,54 +789,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let utxos: UTxOs = mk_utxo_for_alonzo_compatible_tx( &mtx.transaction_body, &[( @@ -1641,54 +827,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let utxos: UTxOs = mk_utxo_for_alonzo_compatible_tx( &mtx.transaction_body, &[( @@ -1728,54 +867,7 @@ mod shelley_ma_tests { Decode::decode(&mut Decoder::new(tx_buf.as_slice()), &mut ()).unwrap(); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Shelley); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 4096, - max_block_header_size: 1100, - key_deposit: 2000000, - pool_deposit: 500000000, - maximum_epoch: 18, - desired_number_of_stake_pools: 150, - pool_pledge_influence: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - expansion_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - treasury_growth_rate: RationalNumber { - // FIX: this is a made-up value. - numerator: 1, - denominator: 1, - }, - decentralization_constant: RationalNumber { - numerator: 1, - denominator: 1, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (0, 2), - min_utxo_value: 1000000, - min_pool_cost: 340000000, - }), - prot_magic: 764824073, - block_slot: 5281340, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(); let utxos: UTxOs = mk_utxo_for_alonzo_compatible_tx( &mtx.transaction_body, &[( @@ -1874,51 +966,7 @@ mod shelley_ma_tests { )], ); - let acnt = AccountState { - treasury: 261_254_564_000_000, - reserves: 0, - }; - - let env: Environment = Environment { - prot_params: MultiEraProtocolParameters::Shelley(ShelleyProtParams { - minfee_b: 155381, - minfee_a: 44, - max_block_body_size: 65536, - max_transaction_size: 16384, - max_block_header_size: 1100, - key_deposit: 2_000_000, - pool_deposit: 500_000_000, - maximum_epoch: 18, - desired_number_of_stake_pools: 500, - pool_pledge_influence: RationalNumber { - numerator: 3, - denominator: 10, - }, - expansion_rate: RationalNumber { - numerator: 3, - denominator: 1000, - }, - treasury_growth_rate: RationalNumber { - numerator: 2, - denominator: 10, - }, - decentralization_constant: RationalNumber { - numerator: 3, - denominator: 10, - }, - extra_entropy: Nonce { - variant: NonceVariant::NeutralNonce, - hash: None, - }, - protocol_version: (3, 0), - min_utxo_value: 1_000_000, - min_pool_cost: 340_000_000, - }), - prot_magic: 764824073, - block_slot: 19483200, - network_id: 1, - acnt: Some(acnt), - }; + let env: Environment = hardcoded_environment_values!(max_transaction_size = 16384); let mut cert_state: CertState = CertState::default(); match validate_txs(&[metx], &env, &utxos, &mut cert_state) { Ok(()) => panic!("MIR after the stability window"), diff --git a/pallas-codec/Cargo.toml b/pallas-codec/Cargo.toml index 25fed7e..48d3fa6 100644 --- a/pallas-codec/Cargo.toml +++ b/pallas-codec/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-codec" description = "Pallas common CBOR encoding interface and utilities" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" diff --git a/pallas-configs/Cargo.toml b/pallas-configs/Cargo.toml index 544809a..271a5a1 100644 --- a/pallas-configs/Cargo.toml +++ b/pallas-configs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-configs" description = "Config structs and utilities matching the Haskell implementation" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -12,10 +12,10 @@ authors = ["Santiago Carmuega "] [dependencies] hex = "0.4.3" -pallas-addresses = { version = "=0.31.0", path = "../pallas-addresses" } -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } -pallas-primitives = { version = "=0.31.0", path = "../pallas-primitives" } +pallas-addresses = { version = "=0.32.1", path = "../pallas-addresses" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } +pallas-primitives = { version = "=0.32.1", path = "../pallas-primitives" } serde = { version = "1.0.136", optional = true, features = ["derive"] } serde_json = { version = "1.0.79", optional = true } base64 = "0.22.0" diff --git a/pallas-crypto/Cargo.toml b/pallas-crypto/Cargo.toml index f13735c..dea7ee1 100644 --- a/pallas-crypto/Cargo.toml +++ b/pallas-crypto/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-crypto" description = "Cryptographic primitives for Cardano" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -15,7 +15,7 @@ hex = "0.4" cryptoxide = { version = "0.4.4" } thiserror = "1.0" rand_core = "0.6" -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } serde = "1.0.143" zeroize = "1.8.1" diff --git a/pallas-hardano/Cargo.toml b/pallas-hardano/Cargo.toml index 53839be..066f26c 100644 --- a/pallas-hardano/Cargo.toml +++ b/pallas-hardano/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-hardano" description = "Pallas interoperability with the Haskel Cardano node implementation" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -15,8 +15,8 @@ thiserror = "1.0.49" binary-layout = "3.2.0" tap = "1.0.1" tracing = "0.1.40" -pallas-traverse = { version = "=0.31.0", path = "../pallas-traverse" } -pallas-network = { version = "=0.31.0", path = "../pallas-network" } +pallas-traverse = { version = "=0.32.1", path = "../pallas-traverse" } +pallas-network = { version = "=0.32.1", path = "../pallas-network" } [dev-dependencies] tracing-subscriber = "0.3.17" diff --git a/pallas-math/Cargo.toml b/pallas-math/Cargo.toml index cb47611..dc6ab37 100644 --- a/pallas-math/Cargo.toml +++ b/pallas-math/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-math" description = "Mathematics functions for Cardano" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" diff --git a/pallas-network/Cargo.toml b/pallas-network/Cargo.toml index 3656c05..9921075 100644 --- a/pallas-network/Cargo.toml +++ b/pallas-network/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-network" description = "Ouroboros networking stack using async IO" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -14,8 +14,8 @@ authors = ["Santiago Carmuega ", "Pi Lanningham >(); @@ -135,6 +145,15 @@ impl VersionTable { Some(false), ), ), + ( + PROTOCOL_V14, + VersionData::new( + network_magic, + true, + Some(PEER_SHARING_DISABLED), + Some(false), + ), + ), ] .into_iter() .collect::>(); diff --git a/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs b/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs index 2cf30a9..0350faa 100644 --- a/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs +++ b/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs @@ -136,7 +136,7 @@ impl<'b> Decode<'b, ()> for BlockQuery { 4 => Ok(Self::GetProposedPParamsUpdates), 5 => Ok(Self::GetStakeDistribution), 6 => Ok(Self::GetUTxOByAddress(d.decode()?)), - // 7 => Ok(Self::GetUTxOWhole), + 7 => Ok(Self::GetUTxOWhole), // 8 => Ok(Self::DebugEpochState), 9 => Ok(Self::GetCBOR(d.decode()?)), 10 => Ok(Self::GetFilteredDelegationsAndRewardAccounts(d.decode()?)), @@ -339,6 +339,29 @@ impl minicbor::encode::Encode for RationalNumber { } } +impl<'b, C> minicbor::decode::Decode<'b, C> for PoolIds { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + d.tag()?; + + Ok(PoolIds { + hashes: d.decode_with(ctx)?, + }) + } +} + +impl minicbor::encode::Encode for PoolIds { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + e.tag(Tag::new(258))?; + e.encode_with(self.hashes.clone(), ctx)?; + + Ok(()) + } +} + impl<'b, C> minicbor::decode::Decode<'b, C> for TransactionOutput { fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { match d.datatype()? { diff --git a/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs b/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs index 72097ae..cce8af8 100644 --- a/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs +++ b/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs @@ -1,17 +1,21 @@ // TODO: this should move to pallas::ledger crate at some point use pallas_crypto::hash::Hash; -use std::collections::BTreeSet; +use std::collections::{BTreeMap, BTreeSet}; use std::hash::Hash as StdHash; // required for derive attrs to work use pallas_codec::minicbor::{self}; -use pallas_codec::utils::{AnyUInt, Bytes, KeyValuePairs, TagWrap}; +use pallas_codec::utils::{AnyUInt, Bytes, KeyValuePairs, Nullable, TagWrap}; use pallas_codec::{ minicbor::{Decode, Encode}, utils::AnyCbor, }; +pub mod primitives; + +pub use primitives::{PoolMetadata, Relay}; + use crate::miniprotocols::Point; use super::{Client, ClientError}; @@ -39,7 +43,7 @@ pub enum BlockQuery { GetRewardProvenance, GetUTxOByTxIn(TxIns), GetStakePools, - GetStakePoolParams(AnyCbor), + GetStakePoolParams(PoolIds), GetRewardInfoPools, GetPoolState(AnyCbor), GetStakeSnapshots(Pools), @@ -197,6 +201,19 @@ pub struct StakeDistribution { pub pools: KeyValuePairs, } +/// The use of `BTreeMap`s as per [Pools] definition ensures that the hashes are +/// in order (otherwise, the node will reject some queries). +#[derive(Debug, PartialEq, Clone)] +pub struct PoolIds { + pub hashes: Pools, +} + +impl From for PoolIds { + fn from(hashes: Pools) -> Self { + Self { hashes } + } +} + #[derive(Debug, Encode, Decode, PartialEq, Clone)] pub struct Pool { #[n(0)] @@ -206,6 +223,39 @@ pub struct Pool { pub hashes: Bytes, } +// Essentially the `PoolRegistration` component of `Certificate` at +// `pallas-primitives/src/alonzo/model.rs`, with types modified for the present +// context +#[derive(Debug, Encode, Decode, PartialEq, Clone)] +pub struct PoolParams { + #[n(0)] + pub operator: Bytes, + + #[n(1)] + pub vrf_keyhash: Bytes, + + #[n(2)] + pub pledge: Coin, + + #[n(3)] + pub cost: Coin, + + #[n(4)] + pub margin: UnitInterval, + + #[n(5)] + pub reward_account: Addr, + + #[n(6)] + pub pool_owners: PoolIds, + + #[n(7)] + pub relays: Vec, + + #[n(8)] + pub pool_metadata: Nullable, +} + /// Type used at [GenesisConfig], which is a fraction that is CBOR-encoded /// as an untagged array. #[derive(Debug, Encode, Decode, PartialEq, Clone)] @@ -263,6 +313,8 @@ pub struct UTxOByAddress { pub type UTxOByTxin = UTxOByAddress; +pub type UTxOWhole = UTxOByAddress; + // Bytes CDDL -> #6.121([ * #6.121([ *datum ]) ]) pub type Datum = (Era, TagWrap); @@ -504,6 +556,20 @@ pub async fn get_cbor( Ok(result) } +/// Get parameters for the given pools. +pub async fn get_stake_pool_params( + client: &mut Client, + era: u16, + pool_ids: PoolIds, +) -> Result, ClientError> { + let query = BlockQuery::GetStakePoolParams(pool_ids); + let query = LedgerQuery::BlockQuery(era, query); + let query = Request::LedgerQuery(query); + let result: (_,) = client.query(query).await?; + + Ok(result.0) +} + /// Get the genesis configuration for the given era. pub async fn get_genesis_config( client: &mut Client, @@ -544,3 +610,13 @@ pub async fn get_utxo_by_txin( Ok(result) } + +/// Get the /entire/ UTxO. +pub async fn get_utxo_whole(client: &mut Client, era: u16) -> Result { + let query = BlockQuery::GetUTxOWhole; + let query = LedgerQuery::BlockQuery(era, query); + let query = Request::LedgerQuery(query); + let result = client.query(query).await?; + + Ok(result) +} diff --git a/pallas-network/src/miniprotocols/localstate/queries_v16/primitives.rs b/pallas-network/src/miniprotocols/localstate/queries_v16/primitives.rs new file mode 100644 index 0000000..ea87768 --- /dev/null +++ b/pallas-network/src/miniprotocols/localstate/queries_v16/primitives.rs @@ -0,0 +1,91 @@ +// Material brought from `pallas-primitives` +// TODO: Refactor in order to avoid repetition. +pub use pallas_codec::utils::{Bytes, Nullable}; +pub use pallas_crypto::hash::Hash; + +use pallas_codec::minicbor::{self, Decode, Encode}; + +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] +pub struct PoolMetadata { + #[n(0)] + pub url: String, + + #[n(1)] + pub hash: PoolMetadataHash, +} + +pub type PoolMetadataHash = Hash<32>; + +pub type Port = u32; + +pub type IPv4 = Bytes; + +pub type IPv6 = Bytes; + +pub type DnsName = String; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum Relay { + SingleHostAddr(Nullable, Nullable, Nullable), + SingleHostName(Nullable, DnsName), + MultiHostName(DnsName), +} + +// Move to `codec.rs`? +impl<'b, C> minicbor::decode::Decode<'b, C> for Relay { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + d.array()?; + let variant = d.u16()?; + + match variant { + 0 => Ok(Relay::SingleHostAddr( + d.decode_with(ctx)?, + d.decode_with(ctx)?, + d.decode_with(ctx)?, + )), + 1 => Ok(Relay::SingleHostName( + d.decode_with(ctx)?, + d.decode_with(ctx)?, + )), + 2 => Ok(Relay::MultiHostName(d.decode_with(ctx)?)), + _ => Err(minicbor::decode::Error::message( + "invalid variant id for Relay", + )), + } + } +} + +impl minicbor::encode::Encode for Relay { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + match self { + Relay::SingleHostAddr(a, b, c) => { + e.array(4)?; + e.encode_with(0, ctx)?; + e.encode_with(a, ctx)?; + e.encode_with(b, ctx)?; + e.encode_with(c, ctx)?; + + Ok(()) + } + Relay::SingleHostName(a, b) => { + e.array(3)?; + e.encode_with(1, ctx)?; + e.encode_with(a, ctx)?; + e.encode_with(b, ctx)?; + + Ok(()) + } + Relay::MultiHostName(a) => { + e.array(2)?; + e.encode_with(2, ctx)?; + e.encode_with(a, ctx)?; + + Ok(()) + } + } + } +} diff --git a/pallas-network/tests/protocols.rs b/pallas-network/tests/protocols.rs index 9d35359..a7064c4 100644 --- a/pallas-network/tests/protocols.rs +++ b/pallas-network/tests/protocols.rs @@ -1,9 +1,9 @@ use hex::FromHex; -use pallas_codec::utils::{AnyCbor, AnyUInt, Bytes, KeyValuePairs, TagWrap}; +use pallas_codec::utils::{AnyCbor, AnyUInt, Bytes, KeyValuePairs, Nullable, TagWrap}; use pallas_crypto::hash::Hash; use pallas_network::miniprotocols::localstate::queries_v16::{ - self, Addr, Addrs, ChainBlockNumber, Fraction, GenesisConfig, RationalNumber, Snapshots, - StakeAddr, Stakes, SystemStart, UnitInterval, Value, + self, Addr, Addrs, ChainBlockNumber, Fraction, GenesisConfig, PoolMetadata, PoolParams, + RationalNumber, Relay, Snapshots, StakeAddr, Stakes, SystemStart, UnitInterval, Value, }; use pallas_network::{ facades::{NodeClient, PeerClient, PeerServer}, @@ -23,10 +23,11 @@ use pallas_network::{ multiplexer::{Bearer, Plexer}, }; use std::{ - collections::BTreeSet, + collections::{BTreeMap, BTreeSet}, fs, net::{Ipv4Addr, SocketAddrV4}, path::Path, + str::FromStr, time::Duration, }; @@ -644,6 +645,79 @@ pub async fn local_state_query_server_and_client_happy_path() { // server receives query from client + let query: Vec = match server.statequery().recv_while_acquired().await.unwrap() { + ClientQueryRequest::Query(q) => q.unwrap(), + x => panic!( + "(While expecting `GetUTxOWhole`) \ + Unexpected message from client: {x:?}" + ), + }; + + // CBOR got from preprod node. Mind the stripped `8203`. + let cbor_query = Vec::::from_hex("8200820082068107").unwrap(); + + assert_eq!(query, cbor_query); + assert_eq!(*server.statequery().state(), localstate::State::Querying); + + let tx_hex = "1610F289E36C9D83C464F85A0AADD59101DDDB0E89592A92809D95D68D79EED9"; + let txbytes: [u8; 32] = hex::decode(tx_hex).unwrap().try_into().unwrap(); + let transaction_id_1 = Hash::from(txbytes); + let index_1 = AnyUInt::MajorByte(2); + let lovelace = AnyUInt::U32(12_419_537); + let values_1 = localstate::queries_v16::TransactionOutput::Legacy( + localstate::queries_v16::LegacyTransactionOutput { + address: Bytes::from( + hex::decode("60C0359EBB7D0688D79064BD118C99C8B87B5853E3AF59245BB97E84D2") + .unwrap(), + ), + amount: Value::Coin(lovelace), + datum_hash: None, + }, + ); + + let tx_hex = "A7BED2F5FCD72BA4CEFDA7C2CC94D119279A17D71BFFC4D90DD4272B93E8A88F"; + let txbytes: [u8; 32] = hex::decode(tx_hex).unwrap().try_into().unwrap(); + let transaction_id_2 = Hash::from(txbytes); + let index_2 = AnyUInt::MajorByte(0); + let lovelace = AnyUInt::U32(1_792_960); + let hex_datum = "D8799FD8799F1AE06755BBFF1B00000193B36BC9F0FF"; + let datum = hex::decode(hex_datum).unwrap().into(); + let tag = TagWrap::<_, 24>::new(datum); + let inline_datum = Some((1_u16, tag)); + let values_2 = localstate::queries_v16::TransactionOutput::Current( + localstate::queries_v16::PostAlonsoTransactionOutput { + address: Bytes::from( + hex::decode("603F2728EC78EF8B0F356E91A5662FF3124ADD324A7B7F5AEED69362F4") + .unwrap(), + ), + amount: Value::Coin(lovelace), + inline_datum, + script_ref: None, + }, + ); + + let utxos = KeyValuePairs::from(vec![ + ( + localstate::queries_v16::UTxO { + transaction_id: transaction_id_1, + index: index_1, + }, + values_1, + ), + ( + localstate::queries_v16::UTxO { + transaction_id: transaction_id_2, + index: index_2, + }, + values_2, + ), + ]); + + let result = AnyCbor::from_encode(localstate::queries_v16::UTxOWhole { utxo: utxos }); + server.statequery().send_result(result).await.unwrap(); + + // server receives query from client + let query: queries_v16::Request = match server.statequery().recv_while_acquired().await.unwrap() { ClientQueryRequest::Query(q) => q.into_decode().unwrap(), @@ -1000,6 +1074,33 @@ pub async fn local_state_query_server_and_client_happy_path() { assert_eq!(result, queries_v16::UTxOByAddress { utxo }); + let request = AnyCbor::from_encode(localstate::queries_v16::Request::LedgerQuery( + localstate::queries_v16::LedgerQuery::BlockQuery( + 6, + localstate::queries_v16::BlockQuery::GetUTxOWhole, + ), + )); + client.statequery().send_query(request).await.unwrap(); + + let result: Vec = client + .statequery() + .recv_while_querying() + .await + .unwrap() + .unwrap(); + + let utxo = Vec::::from_hex( + "81A28258201610F289E36C9D83C464F85A0AADD59101DDDB0E89592A92809D95D6\ + 8D79EED90282581D60C0359EBB7D0688D79064BD118C99C8B87B5853E3AF59245B\ + B97E84D21A00BD81D1825820A7BED2F5FCD72BA4CEFDA7C2CC94D119279A17D71B\ + FFC4D90DD4272B93E8A88F00A300581D603F2728EC78EF8B0F356E91A5662FF312\ + 4ADD324A7B7F5AEED69362F4011A001B5BC0028201D81856D8799FD8799F1AE067\ + 55BBFF1B00000193B36BC9F0FF", + ) + .unwrap(); + + assert_eq!(result, utxo); + let request = AnyCbor::from_encode(queries_v16::Request::LedgerQuery( queries_v16::LedgerQuery::BlockQuery(5, queries_v16::BlockQuery::GetCurrentPParams), )); @@ -1175,6 +1276,181 @@ pub async fn local_state_query_server_and_client_happy_path() { tokio::try_join!(client, server).unwrap(); } +#[cfg(unix)] +#[tokio::test] +pub async fn local_state_query_server_and_client_happy_path2() { + let server = tokio::spawn({ + async move { + // server setup + let socket_path = Path::new("node2.socket"); + + if socket_path.exists() { + fs::remove_file(socket_path).unwrap(); + } + + let listener = UnixListener::bind(socket_path).unwrap(); + + let mut server = pallas_network::facades::NodeServer::accept(&listener, 0) + .await + .unwrap(); + + // wait for acquire request from client + + let maybe_acquire = server.statequery().recv_while_idle().await.unwrap(); + + assert!(maybe_acquire.is_some()); + assert_eq!(*server.statequery().state(), localstate::State::Acquiring); + + server.statequery().send_acquired().await.unwrap(); + + assert_eq!(*server.statequery().state(), localstate::State::Acquired); + + // server receives query from client + + let query: Vec = match server.statequery().recv_while_acquired().await.unwrap() { + ClientQueryRequest::Query(q) => q.unwrap(), + x => panic!( + "While expecting `GetStakePoolParams`) \ + Unexpected message from client: {x:?}" + ), + }; + + // CBOR got from preprod node. Mind the stripped `82038200`. + let cbor_query = Vec::::from_hex( + "820082068211d9010281581cfdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b", + ) + .unwrap(); + + assert_eq!(query, cbor_query); + + assert_eq!(*server.statequery().state(), localstate::State::Querying); + + let pool_id: Bytes = + Vec::::from_hex("fdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b") + .unwrap() + .into(); + let operator = pool_id.clone(); + let vrf_keyhash = Vec::::from_hex( + "2A6A3D82278A554E9C1777C427BF0397FAF5CD7734900752D698E57679CC523F", + ) + .unwrap() + .into(); + let reward_account = + Vec::::from_hex("E01AEF81CBAB75DB2DE0FE3885332EBE67C34EB1ADBF43BB2408BA3981") + .unwrap() + .into(); + let pool_metadata: Nullable = Some(PoolMetadata { + url: "https://csouza.me/jp-pp.json".to_string(), + hash: Hash::<32>::from_str( + "C9623111188D0BF90E8305E40AA91A040D8036C7813A4ECA44E06FA0A1A893A6", + ) + .unwrap(), + }) + .into(); + let pool_params = PoolParams { + operator, + vrf_keyhash, + pledge: AnyUInt::U64(5_000_000_000), + cost: AnyUInt::U32(340_000_000), + margin: localstate::queries_v16::RationalNumber { + numerator: 3, + denominator: 40, + }, + reward_account, + pool_owners: BTreeSet::from([Bytes::from( + Vec::::from_hex("1AEF81CBAB75DB2DE0FE3885332EBE67C34EB1ADBF43BB2408BA3981") + .unwrap(), + )]) + .into(), + relays: vec![Relay::SingleHostName( + Some(3001).into(), + "preprod.junglestakepool.com".to_string(), + )], + pool_metadata, + }; + // The map is inside a (singleton) array + let result = AnyCbor::from_encode([BTreeMap::from([(pool_id, pool_params)])]); + + server.statequery().send_result(result).await.unwrap(); + + assert_eq!(*server.statequery().state(), localstate::State::Acquired); + + match server.statequery().recv_while_acquired().await.unwrap() { + ClientQueryRequest::Release => (), + x => panic!("unexpected message from client: {x:?}"), + }; + + let next_request = server.statequery().recv_while_idle().await.unwrap(); + + assert!(next_request.is_none()); + assert_eq!(*server.statequery().state(), localstate::State::Done); + } + }); + + let client = tokio::spawn(async move { + tokio::time::sleep(Duration::from_secs(1)).await; + + // client setup + let socket_path = "node2.socket"; + + let mut client = NodeClient::connect(socket_path, 0).await.unwrap(); + + // client sends acquire + + client + .statequery() + .send_acquire(Some(Point::Origin)) + .await + .unwrap(); + + client.statequery().recv_while_acquiring().await.unwrap(); + + assert_eq!(*client.statequery().state(), localstate::State::Acquired); + + // client sends a BlockQuery + + let pool_id1 = "fdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b"; + let pool_id1: Bytes = Vec::::from_hex(pool_id1).unwrap().into(); + let mut pools = BTreeSet::::new(); + pools.insert(pool_id1); + + let request = AnyCbor::from_encode(localstate::queries_v16::LedgerQuery::BlockQuery( + 6, + localstate::queries_v16::BlockQuery::GetStakePoolParams(pools.into()), + )); + + client.statequery().send_query(request).await.unwrap(); + + let result: Vec = client + .statequery() + .recv_while_querying() + .await + .unwrap() + .unwrap(); + // CBOR got from preprod node. + let pool_params_cbor = Vec::::from_hex( + "81a1581cfdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b8958\ + 1cfdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b58202a6a3d\ + 82278a554e9c1777c427bf0397faf5cd7734900752d698e57679cc523f1b00000001\ + 2a05f2001a1443fd00d81e82031828581de01aef81cbab75db2de0fe3885332ebe67\ + c34eb1adbf43bb2408ba3981d9010281581c1aef81cbab75db2de0fe3885332ebe67\ + c34eb1adbf43bb2408ba3981818301190bb9781b70726570726f642e6a756e676c65\ + 7374616b65706f6f6c2e636f6d82781c68747470733a2f2f63736f757a612e6d652f\ + 6a702d70702e6a736f6e5820c9623111188d0bf90e8305e40aa91a040d8036c7813a\ + 4eca44e06fa0a1a893a6", + ) + .unwrap(); + + assert_eq!(result, pool_params_cbor); + + client.statequery().send_release().await.unwrap(); + + client.statequery().send_done().await.unwrap(); + }); + + tokio::try_join!(client, server).unwrap(); +} + #[tokio::test] #[ignore] pub async fn txsubmission_server_and_client_happy_path_n2n() { diff --git a/pallas-primitives/Cargo.toml b/pallas-primitives/Cargo.toml index 30dc0d3..56cb969 100644 --- a/pallas-primitives/Cargo.toml +++ b/pallas-primitives/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-primitives" description = "Ledger primitives and cbor codec for the different Cardano eras" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -16,8 +16,8 @@ authors = [ [dependencies] hex = "0.4.3" log = "0.4.14" -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } base58 = "0.2.0" bech32 = "0.9.0" serde = { version = "1.0.136", optional = true, features = ["derive"] } diff --git a/pallas-traverse/Cargo.toml b/pallas-traverse/Cargo.toml index 6a1fc0b..f0d440e 100644 --- a/pallas-traverse/Cargo.toml +++ b/pallas-traverse/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-traverse" description = "Utilities to traverse over multi-era block data" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -11,10 +11,10 @@ readme = "README.md" authors = ["Santiago Carmuega "] [dependencies] -pallas-primitives = { version = "=0.31.0", path = "../pallas-primitives" } -pallas-addresses = { version = "=0.31.0", path = "../pallas-addresses" } -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } +pallas-primitives = { version = "=0.32.1", path = "../pallas-primitives" } +pallas-addresses = { version = "=0.32.1", path = "../pallas-addresses" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } hex = "0.4.3" thiserror = "1.0.31" paste = "1.0.14" diff --git a/pallas-traverse/src/block.rs b/pallas-traverse/src/block.rs index 5c0ff71..c03ad14 100644 --- a/pallas-traverse/src/block.rs +++ b/pallas-traverse/src/block.rs @@ -183,9 +183,7 @@ impl<'b> MultiEraBlock<'b> { match self { MultiEraBlock::Byron(x) => { if let Some(up) = x.body.upd_payload.proposal.deref() { - // TODO: this might be horribly wrong, I'm assuming that the activation epoch - // for a Byron upgrade proposal is always current epoch + 1. - let epoch = x.header.consensus_data.0.epoch + 1; + let epoch = x.header.consensus_data.0.epoch; Some(MultiEraUpdate::Byron( epoch, Box::new(Cow::Owned(up.clone())), diff --git a/pallas-traverse/src/redeemers.rs b/pallas-traverse/src/redeemers.rs index 5601e77..0c56576 100644 --- a/pallas-traverse/src/redeemers.rs +++ b/pallas-traverse/src/redeemers.rs @@ -53,6 +53,18 @@ impl<'b> MultiEraRedeemer<'b> { } } + pub fn into_conway_deprecated(&self) -> Option { + match self { + Self::AlonzoCompatible(_) => None, + Self::Conway(x, y) => Some(conway::Redeemer { + tag: x.tag, + index: x.index, + data: y.data.clone(), + ex_units: y.ex_units, + }), + } + } + pub fn from_alonzo_compatible(redeemer: &'b alonzo::Redeemer) -> Self { Self::AlonzoCompatible(Box::new(Cow::Borrowed(redeemer))) } diff --git a/pallas-traverse/src/tx.rs b/pallas-traverse/src/tx.rs index 21b1db4..e0a3440 100644 --- a/pallas-traverse/src/tx.rs +++ b/pallas-traverse/src/tx.rs @@ -199,9 +199,9 @@ impl<'b> MultiEraTx<'b> { /// Return inputs as expected for processing /// - /// To process inputs we need a set (no duplicated) and lexicographical - /// order (hash#idx). This function will take the raw inputs and apply the - /// aforementioned cleanup changes. + /// To process inputs we need a set (no duplicates) and lexicographical + /// order (hash#idx). This function will take the raw inputs and apply a + /// sort following these requirements. pub fn inputs_sorted_set(&self) -> Vec { let mut raw = self.inputs(); raw.sort_by_key(|x| x.lexicographical_key()); diff --git a/pallas-traverse/src/update.rs b/pallas-traverse/src/update.rs index 0604d2a..e9d72f1 100644 --- a/pallas-traverse/src/update.rs +++ b/pallas-traverse/src/update.rs @@ -57,7 +57,7 @@ pub type DRepVotingThresholds = conway::DRepVotingThresholds; use crate::{Era, MultiEraUpdate}; impl<'b> MultiEraUpdate<'b> { - pub fn decode_for_era(era: Era, cbor: &'b [u8]) -> Result { + pub fn decode_for_era(era: Era, cbor: &[u8]) -> Result { match era { Era::Byron => { let (epoch, up) = minicbor::decode(cbor)?; diff --git a/pallas-txbuilder/Cargo.toml b/pallas-txbuilder/Cargo.toml index 3f7dfe6..2d32543 100644 --- a/pallas-txbuilder/Cargo.toml +++ b/pallas-txbuilder/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-txbuilder" description = "An ergonomic Cardano transaction builder" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -11,12 +11,12 @@ readme = "README.md" authors = ["Santiago Carmuega ", "Cainã Costa "] [dependencies] -pallas-codec = { path = "../pallas-codec", version = "=0.31.0" } -pallas-crypto = { path = "../pallas-crypto", version = "=0.31.0" } -pallas-primitives = { path = "../pallas-primitives", version = "=0.31.0" } -pallas-traverse = { path = "../pallas-traverse", version = "=0.31.0" } -pallas-addresses = { path = "../pallas-addresses", version = "=0.31.0" } -pallas-wallet = { path = "../pallas-wallet", version = "=0.31.0" } +pallas-codec = { path = "../pallas-codec", version = "=0.32.1" } +pallas-crypto = { path = "../pallas-crypto", version = "=0.32.1" } +pallas-primitives = { path = "../pallas-primitives", version = "=0.32.1" } +pallas-traverse = { path = "../pallas-traverse", version = "=0.32.1" } +pallas-addresses = { path = "../pallas-addresses", version = "=0.32.1" } +pallas-wallet = { path = "../pallas-wallet", version = "=0.32.1" } serde = { version = "1.0.188", features = ["derive"] } serde_json = "1.0.107" thiserror = "1.0.44" diff --git a/pallas-utxorpc/Cargo.toml b/pallas-utxorpc/Cargo.toml index 0b87199..ff0f5e1 100644 --- a/pallas-utxorpc/Cargo.toml +++ b/pallas-utxorpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-utxorpc" description = "Pallas interoperability with the UTxORPC spec" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -12,16 +12,16 @@ authors = ["Santiago Carmuega "] [dependencies] # utxorpc-spec = { path = "../../../utxorpc/spec/gen/rust" } -utxorpc-spec = { version = "0.14.0" } +utxorpc-spec = { version = "0.15.0" } -pallas-traverse = { version = "=0.31.0", path = "../pallas-traverse" } -pallas-primitives = { version = "=0.31.0", path = "../pallas-primitives" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec" } -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } +pallas-traverse = { version = "=0.32.1", path = "../pallas-traverse" } +pallas-primitives = { version = "=0.32.1", path = "../pallas-primitives" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } prost-types = "0.13.1" # TODO: remove this dep once we have multiera params in traverse -pallas-applying = { version = "=0.31.0", path = "../pallas-applying" } +pallas-applying = { version = "=0.32.1", path = "../pallas-applying" } [dev-dependencies] hex = "0.4.3" diff --git a/pallas-wallet/Cargo.toml b/pallas-wallet/Cargo.toml index 442c01c..28e0376 100644 --- a/pallas-wallet/Cargo.toml +++ b/pallas-wallet/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas-wallet" description = "Cardano wallet utilities such as key generation" -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -12,7 +12,7 @@ authors = ["Santiago Carmuega "] [dependencies] thiserror = "1.0.49" -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" } ed25519-bip32 = "0.4.1" bip39 = { version = "2.0.0", features = ["rand_core"] } cryptoxide = "0.4.4" diff --git a/pallas/Cargo.toml b/pallas/Cargo.toml index 9256369..5b8c92d 100644 --- a/pallas/Cargo.toml +++ b/pallas/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "pallas" description = "Rust-native building blocks for the Cardano blockchain ecosystem." -version = "0.31.0" +version = "0.32.1" edition = "2021" repository = "https://github.com/txpipe/pallas" homepage = "https://github.com/txpipe/pallas" @@ -11,18 +11,18 @@ readme = "../README.md" authors = ["Santiago Carmuega "] [dependencies] -pallas-network = { version = "=0.31.0", path = "../pallas-network/" } -pallas-primitives = { version = "=0.31.0", path = "../pallas-primitives/" } -pallas-traverse = { version = "=0.31.0", path = "../pallas-traverse/" } -pallas-addresses = { version = "=0.31.0", path = "../pallas-addresses/" } -pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto/" } -pallas-codec = { version = "=0.31.0", path = "../pallas-codec/" } -pallas-utxorpc = { version = "=0.31.0", path = "../pallas-utxorpc/" } -pallas-configs = { version = "=0.31.0", path = "../pallas-configs/" } -pallas-txbuilder = { version = "=0.31.0", path = "../pallas-txbuilder/" } -pallas-applying = { version = "=0.31.0", path = "../pallas-applying/", optional = true } -pallas-wallet = { version = "=0.31.0", path = "../pallas-wallet/", optional = true } -pallas-hardano = { version = "=0.31.0", path = "../pallas-hardano/", optional = true } +pallas-network = { version = "=0.32.1", path = "../pallas-network/" } +pallas-primitives = { version = "=0.32.1", path = "../pallas-primitives/" } +pallas-traverse = { version = "=0.32.1", path = "../pallas-traverse/" } +pallas-addresses = { version = "=0.32.1", path = "../pallas-addresses/" } +pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto/" } +pallas-codec = { version = "=0.32.1", path = "../pallas-codec/" } +pallas-utxorpc = { version = "=0.32.1", path = "../pallas-utxorpc/" } +pallas-configs = { version = "=0.32.1", path = "../pallas-configs/" } +pallas-txbuilder = { version = "=0.32.1", path = "../pallas-txbuilder/" } +pallas-applying = { version = "=0.32.1", path = "../pallas-applying/", optional = true } +pallas-wallet = { version = "=0.32.1", path = "../pallas-wallet/", optional = true } +pallas-hardano = { version = "=0.32.1", path = "../pallas-hardano/", optional = true } [features] hardano = ["pallas-hardano"]