• v3.0.0 2648b25939

    v3.0.0
    Some checks failed
    ci-orchestrator / provision running on cx23 in hel1
    Publish (NPM) / publish (release) Successful in 13s
    Publish (JSR) / publish (release) Successful in 23s
    Publish (crates.io) / publish (release) Failing after 37s
    Publish (Maven) / publish (release) Failing after 51s
    Stable

    hloth released this 2026-09-11 11:17:43 +02:00 | 6 commits to main since this release

    v3.0.0

    Full changelog

    JavaScript, TypeScript lib

    • Transaction.cardType and JourneySummary.cardType → productId, a raw byte. Byte [00] of a transaction and byte [07] of the journey summary hold the product that paid, not the first byte of the card type
    • cardTypeByte and cardTypeFromByte are removed: 06 is a product id belonging to no card type, and the two personal card types share a first byte
    • CardType.AvanzaPersonalUnlimited → CardType.AvanzaPersonal
    • CardType.AvanzaPersonalAbono added for the second personal Avanza card type, 0A98DA
    • isPersonalCardType(type) added
    • isTransfer(t) tests networkFlag, so it is false on every personal card record
    • archiveBlock(sequence) returns number | undefined, since a top up can carry 0x21

    Rust lib

    • Transaction::card_type and JourneySummary::card_type → product_id: u8, a raw byte. Byte [00] of a transaction and byte [07] of the journey summary hold the product that paid, not the first byte of the card type
    • CardType::byte, CardType::from_byte and Error::UnknownCardTypeByte are removed: 06 is a product id belonging to no card type, and the two personal card types share a first byte
    • CardType::AvanzaPersonalUnlimited → CardType::AvanzaPersonal
    • CardType::AvanzaPersonalAbono added for the second personal Avanza card type, 0A98DA, so CardType::ALL is now [Self; 4]
    • CardType::is_personal() added
    • Transaction::is_transfer() tests network_flag, so it is false on every personal card record

    Java, Kotlin lib

    • The Transaction and JourneySummary component cardType → int productId, so the accessor is productId() and the builder method TransactionBuilder.productId(int). Byte [00] of a transaction and byte [07] of the journey summary hold the product that paid, not the first byte of the card type
    • CardType.firstByte() and CardType.ofFirstByte(int) are removed: 0x06 is a product id belonging to no card type, and the two personal card types share a first byte
    • CardType.AVANZA_PERSONAL_UNLIMITED → CardType.AVANZA_PERSONAL
    • CardType.AVANZA_PERSONAL_ABONO added for the second personal Avanza card type, 0A98DA
    • CardType.isPersonal() added
    • Transaction.isTransfer() tests the network flag, so it is false on every personal card record