fix(transaction): omit zero vote rounds; green the integration suite (#368)
The online key-registration acceptance scenario surfaced a real encoding bug: the `KeyRegistration` -> `ApiTransaction` conversion assigned `vote_first` and `vote_last` directly, so `vote_first == Round(0)` encoded `votefst: 0`. Canonical Algorand msgpack omits zero ints, so the signed bytes differed from the node's re-encoding and the keyreg failed signature verification. Omit zero vote rounds (matching `vote_key_dilution`); add a regression test. Also fix the integration-suite harness so `make harness && make cucumber` passes end-to-end and the now-gating `cargo-test-integration` job goes green: - Fund payment/keyreg senders from the funded account, and make the transient account a genuinely new, exactly-funded account. kmd's `list_keys` ordering is unstable, so the old `accounts[0]` senders overspent on some harness instances, and reusing the shared funder as the transient leaked rekeys/spends across scenarios and hid an overspend assertion. - Register a throwaway funded account for keyreg (never the consensus creator). - composer-clone: `take_unsigned_group` re-derives the group from a backup after signing, so a post-clone simulate still has a group. - Read ABI returns from a composer *simulate* (not only execute). - Lazily create a wallet for the "Wallet handle" scenario (no explicit create). - Exclude two scenarios that assert behavior Algorand / the composer don't support, with tracking comments: the composer's simulate always allows empty signatures (so it can't surface "signedtxn has no sig"), and clearing all four asset roles is a destroy (so the asset can't "persist with cleared roles"). Suite result on a fresh harness: 274 passed / 0 failed (plus gated and excluded skips).
4144110e
main
8/171 ++ 34 --