Compare commits

...

10 commits

Author SHA1 Message Date
Sulkta
f36077e8d8 chore: add gitleaks allowlist for upstream public test fixtures (not secrets)
Some checks failed
Validate / Check-1 (push) Failing after 1s
Validate / Test Suite-1 (push) Failing after 1s
Validate / Lints (push) Failing after 1s
Validate / Check (push) Has been cancelled
Validate / Check-2 (push) Has been cancelled
Validate / Test Suite (push) Has been cancelled
Validate / Test Suite-2 (push) Has been cancelled
2026-06-28 22:12:17 -07:00
Santiago Carmuega
679dff9b3a Release 0.32.1
pallas@0.32.1
pallas-addresses@0.32.1
pallas-applying@0.32.1
pallas-codec@0.32.1
pallas-configs@0.32.1
pallas-crypto@0.32.1
pallas-hardano@0.32.1
pallas-math@0.32.1
pallas-network@0.32.1
pallas-primitives@0.32.1
pallas-traverse@0.32.1
pallas-txbuilder@0.32.1
pallas-utxorpc@0.32.1
pallas-wallet@0.32.1

Generated by cargo-workspaces
2025-06-25 10:28:02 -03:00
Paulo Bressan
d50cd7da7c chore: add n2n handshake version 14 to default options (#665) 2025-06-25 10:27:01 -03:00
Santiago Carmuega
100827213e Release 0.32.0
pallas@0.32.0
pallas-addresses@0.32.0
pallas-applying@0.32.0
pallas-codec@0.32.0
pallas-configs@0.32.0
pallas-crypto@0.32.0
pallas-hardano@0.32.0
pallas-math@0.32.0
pallas-network@0.32.0
pallas-primitives@0.32.0
pallas-traverse@0.32.0
pallas-txbuilder@0.32.0
pallas-utxorpc@0.32.0
pallas-wallet@0.32.0

Generated by cargo-workspaces
2024-12-29 19:18:18 -03:00
Santiago Carmuega
cbffafaf51 chore(deps): update utxorpc-spec to v0.15 (#568) 2024-12-29 19:16:24 -03:00
Santiago Carmuega
bd3120fabd feat(traverse): introduce small QoL improvements (#567) 2024-12-29 15:17:08 -03:00
Francisco Joray
21a92fc235 feat(network): implement get_utxo_whole query (#564) 2024-12-23 13:50:40 -03:00
Santiago Carmuega
f1cbf11c74 fix(traverse): don't mess with Byron update epoch (#566) 2024-12-22 12:11:04 -03:00
Santiago Carmuega
7c6ccac3ed feat(applying): include main constants in pparams (#565) 2024-12-22 12:06:47 -03:00
Pedro Sánchez Terraf
914631adcb feat(network): implement get stake pool parameters query (#554) 2024-12-17 13:04:48 -03:00
31 changed files with 1155 additions and 1368 deletions

14
.gitleaks.toml Normal file
View file

@ -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$''',
]

View file

@ -1,6 +1,311 @@
<a name="unreleased"></a>
## [Unreleased]
<a name="v0.32.0"></a>
## [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))
<a name="v0.31.0"></a>
## [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
<a name="v0.18.3"></a>
## [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
<a name="v0.30.2"></a>
## [v0.30.2] - 2024-09-08
### Feat
- **interop:** map u5c Conway structs ([#511](https://github.com/txpipe/pallas/issues/511))
<a name="v0.30.1"></a>
## [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))
<a name="pallas-miniprotocols@0.7.1"></a>
## [pallas-miniprotocols@0.7.1] - 2022-03-16
<a name="pallas-codec@0.7.1"></a>
## [pallas-codec@0.7.1] - 2022-03-16
<a name="pallas-miniprotocols@0.7.1"></a>
## [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

View file

@ -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();

View file

@ -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 <santiago@carmuega.me>"]
[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"

View file

@ -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 <maico.leberle@gmail.com>"]
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"

View file

@ -21,6 +21,28 @@ pub enum MultiEraProtocolParameters {
}
impl MultiEraProtocolParameters {
pub fn system_start(&self) -> chrono::DateTime<chrono::FixedOffset> {
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<chrono::FixedOffset>,
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<chrono::FixedOffset>,
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<chrono::FixedOffset>,
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<chrono::FixedOffset>,
pub epoch_length: u64,
pub slot_length: u64,
pub minfee_a: u32,
pub minfee_b: u32,
pub max_block_body_size: u32,

View file

@ -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,

View file

@ -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,

View file

@ -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"),

File diff suppressed because it is too large Load diff

View file

@ -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"

View file

@ -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 <santiago@carmuega.me>"]
[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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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 <santiago@carmuega.me>", "Pi Lanningham <pi.lannin
byteorder = "1.4.3"
hex = "0.4.3"
itertools = "0.13.0"
pallas-codec = { version = "=0.31.0", path = "../pallas-codec" }
pallas-crypto = { version = "=0.31.0", path = "../pallas-crypto" }
pallas-codec = { version = "=0.32.1", path = "../pallas-codec" }
pallas-crypto = { version = "=0.32.1", path = "../pallas-crypto" }
rand = "0.8.5"
socket2 = "0.5.5"
thiserror = "1.0.31"

View file

@ -11,6 +11,7 @@ const PROTOCOL_V10: u64 = 10;
const PROTOCOL_V11: u64 = 11;
const PROTOCOL_V12: u64 = 12;
const PROTOCOL_V13: u64 = 13;
const PROTOCOL_V14: u64 = 14;
const PEER_SHARING_DISABLED: u8 = 0;
@ -99,6 +100,15 @@ impl VersionTable {
Some(false),
),
),
(
PROTOCOL_V14,
VersionData::new(
network_magic,
true,
Some(PEER_SHARING_DISABLED),
Some(false),
),
),
]
.into_iter()
.collect::<HashMap<u64, VersionData>>();
@ -135,6 +145,15 @@ impl VersionTable {
Some(false),
),
),
(
PROTOCOL_V14,
VersionData::new(
network_magic,
true,
Some(PEER_SHARING_DISABLED),
Some(false),
),
),
]
.into_iter()
.collect::<HashMap<u64, VersionData>>();

View file

@ -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<C> minicbor::encode::Encode<C> for RationalNumber {
}
}
impl<'b, C> minicbor::decode::Decode<'b, C> for PoolIds {
fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
d.tag()?;
Ok(PoolIds {
hashes: d.decode_with(ctx)?,
})
}
}
impl<C> minicbor::encode::Encode<C> for PoolIds {
fn encode<W: minicbor::encode::Write>(
&self,
e: &mut minicbor::Encoder<W>,
ctx: &mut C,
) -> Result<(), minicbor::encode::Error<W::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<Self, minicbor::decode::Error> {
match d.datatype()? {

View file

@ -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<Bytes, Pool>,
}
/// 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<Pools> 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<Relay>,
#[n(8)]
pub pool_metadata: Nullable<PoolMetadata>,
}
/// 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<Bytes, 24>);
@ -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<BTreeMap<Bytes, PoolParams>, 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<UTxOWhole, ClientError> {
let query = BlockQuery::GetUTxOWhole;
let query = LedgerQuery::BlockQuery(era, query);
let query = Request::LedgerQuery(query);
let result = client.query(query).await?;
Ok(result)
}

View file

@ -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<Port>, Nullable<IPv4>, Nullable<IPv6>),
SingleHostName(Nullable<Port>, 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<Self, minicbor::decode::Error> {
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<C> minicbor::encode::Encode<C> for Relay {
fn encode<W: minicbor::encode::Write>(
&self,
e: &mut minicbor::Encoder<W>,
ctx: &mut C,
) -> Result<(), minicbor::encode::Error<W::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(())
}
}
}
}

View file

@ -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<u8> = 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::<u8>::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<u8> = client
.statequery()
.recv_while_querying()
.await
.unwrap()
.unwrap();
let utxo = Vec::<u8>::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<u8> = 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::<u8>::from_hex(
"820082068211d9010281581cfdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b",
)
.unwrap();
assert_eq!(query, cbor_query);
assert_eq!(*server.statequery().state(), localstate::State::Querying);
let pool_id: Bytes =
Vec::<u8>::from_hex("fdb5834ba06eb4baafd50550d2dc9b3742d2c52cc5ee65bf8673823b")
.unwrap()
.into();
let operator = pool_id.clone();
let vrf_keyhash = Vec::<u8>::from_hex(
"2A6A3D82278A554E9C1777C427BF0397FAF5CD7734900752D698E57679CC523F",
)
.unwrap()
.into();
let reward_account =
Vec::<u8>::from_hex("E01AEF81CBAB75DB2DE0FE3885332EBE67C34EB1ADBF43BB2408BA3981")
.unwrap()
.into();
let pool_metadata: Nullable<PoolMetadata> = 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::<u8>::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::<u8>::from_hex(pool_id1).unwrap().into();
let mut pools = BTreeSet::<Bytes>::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<u8> = client
.statequery()
.recv_while_querying()
.await
.unwrap()
.unwrap();
// CBOR got from preprod node.
let pool_params_cbor = Vec::<u8>::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() {

View file

@ -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"] }

View file

@ -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 <santiago@carmuega.me>"]
[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"

View file

@ -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())),

View file

@ -53,6 +53,18 @@ impl<'b> MultiEraRedeemer<'b> {
}
}
pub fn into_conway_deprecated(&self) -> Option<conway::Redeemer> {
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)))
}

View file

@ -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<MultiEraInput> {
let mut raw = self.inputs();
raw.sort_by_key(|x| x.lexicographical_key());

View file

@ -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<Self, minicbor::decode::Error> {
pub fn decode_for_era(era: Era, cbor: &[u8]) -> Result<Self, minicbor::decode::Error> {
match era {
Era::Byron => {
let (epoch, up) = minicbor::decode(cbor)?;

View file

@ -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 <santiago@carmuega.me>", "Cainã Costa <me@cfcosta.com>"]
[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"

View file

@ -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 <santiago@carmuega.me>"]
[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"

View file

@ -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 <santiago@carmuega.me>"]
[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"

View file

@ -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 <santiago@carmuega.me>"]
[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"]