Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
c5983f3
feat(zcash): add Orchard shielded transaction protocol
BitHighlander Mar 23, 2026
4ce26e7
fix: include messages-zcash.proto in package build scripts
BitHighlander Mar 23, 2026
742f172
feat(zcash): add ZcashDisplayAddress protocol message (IDs 1308/1309)
BitHighlander Mar 25, 2026
edc3ae9
Merge pull request #24 from BitHighlander/feat/zcash-display-address
BitHighlander Mar 25, 2026
41be377
docs(zcash): clarify ZcashDisplayAddress verification scope
BitHighlander Mar 25, 2026
74e0648
Merge pull request #25 from BitHighlander/fix/zcash-display-address-docs
BitHighlander Mar 25, 2026
0e3dc97
feat(tron): add SignMessage (TIP-191), VerifyMessage, SignTypedHash (…
BitHighlander Apr 29, 2026
20e646a
feat(ton): add SignMessage Ed25519 message-signing primitive
BitHighlander Apr 29, 2026
c0ef415
feat(solana): add SignOffchainMessage with domain-separated envelope
BitHighlander Apr 29, 2026
8721512
feat(zcash): add seed_fingerprint binding to FVK / address / sign mes…
BitHighlander Apr 29, 2026
4337c45
Merge pull request #27 from BitHighlander/feat/zcash-seed-fingerprint
BitHighlander Apr 29, 2026
d3fb02a
merge: sync fork master with upstream keepkey/master
BitHighlander Apr 29, 2026
e0bf5a4
merge: fold feat/message-signing-parity into fork master
BitHighlander Apr 29, 2026
ef80b30
fix(zcash): correct seed_fingerprint formula in proto comments
BitHighlander Apr 29, 2026
2352346
Merge pull request #28 from BitHighlander/fix/zcash-seed-fingerprint-…
BitHighlander Apr 29, 2026
870b8ea
feat(zcash): drop host-supplied UA from ZcashDisplayAddress
BitHighlander Apr 30, 2026
8f80bcd
feat(ripple): add memo field to RippleSignTx for THORChain swap routing
BitHighlander May 15, 2026
8ef74da
feat(ripple): add memo field to RippleSignTx for THORChain swap routing
BitHighlander May 15, 2026
9c40855
merge: 7.14.1 device-protocol plus fork Zcash additions
BitHighlander May 16, 2026
f2b32d8
feat(hive): add Hive blockchain message definitions
BitHighlander May 16, 2026
1f19587
Merge commit 'f2b32d8a26aa311e19aebdde5659a10b23cf0765' into release/…
BitHighlander May 21, 2026
922b694
feat(zcash): add clear-signing protocol fields
BitHighlander May 20, 2026
c1dea44
feat(thorchain): add denom field to ThorchainMsgSend (field 11)
BitHighlander May 21, 2026
2b25cf7
feat(hive): add Hive blockchain protobuf definitions (#31)
BitHighlander May 24, 2026
5c2d45f
merge: combine Hive full support with alpha's Zcash/THORChain additions
BitHighlander May 24, 2026
8778b6e
feat(near): add NEAR Protocol proto definitions (MessageType 1610-1613)
BitHighlander May 21, 2026
98ca1e2
Merge pull request #32 from BitHighlander/feat/near-proto-alpha
BitHighlander Jun 5, 2026
2dc51d5
docs(hive): clarify HiveSignAccountCreate is an attestation, not a br…
BitHighlander Jun 29, 2026
f9e6081
feat: protocol additions for the firmware 7.x release
BitHighlander Jun 30, 2026
2ec999a
feat: LoadClearsignSigner (117) — runtime clearsign signer with alias…
BitHighlander Jul 2, 2026
33521a8
feat(clearsign): identity icon + persist fields on LoadClearsignSigner
BitHighlander Jul 7, 2026
9e46aeb
feat(hive): HiveSignMessage/HiveSignedMessage (1614/1615) — Keychain …
BitHighlander Jul 15, 2026
a793934
docs(hive): HiveSignMessage roles are posting/active/memo — owner' re…
BitHighlander Jul 15, 2026
f0b4549
feat(hive): HiveSignOperations/HiveSignedOperations (1616/1617) — par…
BitHighlander Jul 15, 2026
f7b4580
fix(clearsign): specify the icon RLE wire grammar — the packed-bitmap…
BitHighlander Jul 16, 2026
7182973
fix(clearsign): icon spec was unsafe — 0x80 literal undecodable, widt…
BitHighlander Jul 16, 2026
4eb7d5e
fix(clearsign): drop the obsolete packed-size rationale; correct the …
BitHighlander Jul 16, 2026
47e19d8
feat(solana): optional signed token-definition fields on SolanaTokenInfo
BitHighlander Jul 17, 2026
e31cddf
docs(clearsign): reserve persistence pending authenticated storage
BitHighlander Jul 25, 2026
6d0ae67
test(zcash): pin RC18 compact-signature contract
BitHighlander Jul 26, 2026
41c59ab
feat(solana): reusable instruction-schema fields on SolanaSignTx
BitHighlander Jul 27, 2026
844a9b9
feat(clearsign): attestor messages (1700-1703)
BitHighlander Jul 27, 2026
81c398d
docs(clearsign): attestor validates KKSOLSC1, not the abandoned KKSOLSW1
BitHighlander Jul 29, 2026
8856334
fix(clearsign): reserve additive schema wire fields
BitHighlander Jul 29, 2026
4cc8b71
fix(clearsign): reserve Solana transaction metadata tags
BitHighlander Jul 30, 2026
f2246ce
feat(zcash): add Ironwood signing metadata
BitHighlander Jul 30, 2026
2f766c2
Merge pull request #113 from keepkey/agent/zcash-ironwood-develop
BitHighlander Jul 30, 2026
cc858ef
feat(solana): add verified token recipient owner hints
BitHighlander Jul 31, 2026
5a8e270
Merge pull request #114 from BitHighlander/agent/x402-solana-metadata
BitHighlander Jul 31, 2026
dafb567
fix(ci): make protobuf JavaScript codegen portable
BitHighlander Jul 31, 2026
d8b94bd
Merge pull request #115 from keepkey/agent/fix-portable-protobuf-codegen
BitHighlander Jul 31, 2026
4b41d11
fix(build): generate bindings for git dependencies
BitHighlander Jul 31, 2026
b13391c
Merge pull request #116 from keepkey/agent/build-git-dependencies
BitHighlander Jul 31, 2026
be28549
feat(features): add supports_taproot capability bit
BitHighlander Aug 1, 2026
635571b
fix(ci): request reviews safely for fork PRs
BitHighlander Aug 2, 2026
d7ad3f2
Merge pull request #118 from BitHighlander/agent/copilot-review-fork-…
BitHighlander Aug 2, 2026
126e6a4
Merge remote-tracking branch 'upstream/up/release-protocol' into agen…
BitHighlander Aug 2, 2026
674777f
Merge pull request #117 from BitHighlander/agent/taproot-capability-s…
BitHighlander Aug 2, 2026
342174d
feat(reset): dice-entropy fields for on-device roll collection
BitHighlander Aug 4, 2026
cf308fd
Merge pull request #119 from BitHighlander/feat/dice-entropy
BitHighlander Aug 4, 2026
b22fd85
merge: sync fork master with upstream keepkey/master
BitHighlander Aug 5, 2026
e9067a0
ci: pin cimg/node:20.11 — the legacy circleci/node image ships node 17
BitHighlander Aug 5, 2026
fbb483f
fix(zcash): move file options into the preamble so pbjs can parse
BitHighlander Aug 5, 2026
8bf32ed
merge: land the 7.15 protocol work on fork master
BitHighlander Aug 20, 2026
2190c15
feat(solana): KKSOLSW1 transaction-bound account attestation on tags 5-7
BitHighlander Aug 21, 2026
8545cd5
Merge pull request #38 from BitHighlander/feat/kksolsw1-lut-accounts
BitHighlander Aug 21, 2026
be0e84d
feat(eip712): device-driven field streaming for structured typed data
BitHighlander Aug 21, 2026
a1a1dda
Merge pull request #39 from BitHighlander/feat/eip712-structured-stre…
BitHighlander Aug 21, 2026
0f050d6
Merge fork master into up/release-protocol for the 7.15 staging
BitHighlander Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ version: 2
defaults: &defaults
working_directory: ~/device-protocol
docker:
- image: circleci/node
- image: cimg/node:20.11

jobs:
build:
Expand Down
50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Protocol CI

on:
push:
branches: [master, up/release-protocol]
pull_request:
branches: [master, up/release-protocol]

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6

- name: Install protobuf compiler
run: sudo apt-get update && sudo apt-get install -y protobuf-compiler

- name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- name: Install JavaScript generator dependencies
run: npm ci

- name: Verify install generated JavaScript bindings
run: |
test -s lib/messages_pb.js
test -s lib/messages-solana_pb.js
test -s lib/messages-zcash_pb.js

- name: Compile protocol descriptors
run: |
protoc --proto_path=. --include_imports \
--descriptor_set_out=/tmp/keepkey-device-protocol.pb \
types.proto messages.proto messages-binance.proto \
messages-cosmos.proto messages-eos.proto messages-ethereum.proto \
messages-hive.proto messages-mayachain.proto messages-nano.proto \
messages-osmosis.proto messages-ripple.proto messages-solana.proto \
messages-tendermint.proto messages-thorchain.proto messages-ton.proto \
messages-tron.proto messages-zcash.proto

- name: Check RC18 Zcash wire contract
run: python3 tools/check_zcash_contract.py
6 changes: 5 additions & 1 deletion .github/workflows/copilot-review.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
name: Request Copilot Review

on:
pull_request:
# This workflow never checks out or executes pull-request code. Using the
# base-repository context is therefore safe and is required for cross-fork
# PRs, whose pull_request GITHUB_TOKEN is always downgraded to read-only.
pull_request_target:
types: [opened, reopened, ready_for_review, synchronize]

jobs:
request-copilot-review:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
permissions:
pull-requests: write
Expand Down
179 changes: 179 additions & 0 deletions lib/messages-ripple_pb.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
// package:
// file: messages-ripple.proto

import * as jspb from "google-protobuf";

export class RippleGetAddress extends jspb.Message {
clearAddressNList(): void;
getAddressNList(): Array<number>;
setAddressNList(value: Array<number>): void;
addAddressN(value: number, index?: number): number;

hasShowDisplay(): boolean;
clearShowDisplay(): void;
getShowDisplay(): boolean | undefined;
setShowDisplay(value: boolean): void;

serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RippleGetAddress.AsObject;
static toObject(includeInstance: boolean, msg: RippleGetAddress): RippleGetAddress.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RippleGetAddress, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RippleGetAddress;
static deserializeBinaryFromReader(message: RippleGetAddress, reader: jspb.BinaryReader): RippleGetAddress;
}

export namespace RippleGetAddress {
export type AsObject = {
addressNList: Array<number>,
showDisplay?: boolean,
}
}

export class RippleAddress extends jspb.Message {
hasAddress(): boolean;
clearAddress(): void;
getAddress(): string | undefined;
setAddress(value: string): void;

serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RippleAddress.AsObject;
static toObject(includeInstance: boolean, msg: RippleAddress): RippleAddress.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RippleAddress, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RippleAddress;
static deserializeBinaryFromReader(message: RippleAddress, reader: jspb.BinaryReader): RippleAddress;
}

export namespace RippleAddress {
export type AsObject = {
address?: string,
}
}

export class RippleSignTx extends jspb.Message {
clearAddressNList(): void;
getAddressNList(): Array<number>;
setAddressNList(value: Array<number>): void;
addAddressN(value: number, index?: number): number;

hasFee(): boolean;
clearFee(): void;
getFee(): number | undefined;
setFee(value: number): void;

hasFlags(): boolean;
clearFlags(): void;
getFlags(): number | undefined;
setFlags(value: number): void;

hasSequence(): boolean;
clearSequence(): void;
getSequence(): number | undefined;
setSequence(value: number): void;

hasLastLedgerSequence(): boolean;
clearLastLedgerSequence(): void;
getLastLedgerSequence(): number | undefined;
setLastLedgerSequence(value: number): void;

hasPayment(): boolean;
clearPayment(): void;
getPayment(): RipplePayment | undefined;
setPayment(value?: RipplePayment): void;

hasMemo(): boolean;
clearMemo(): void;
getMemo(): string | undefined;
setMemo(value: string): void;

serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RippleSignTx.AsObject;
static toObject(includeInstance: boolean, msg: RippleSignTx): RippleSignTx.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RippleSignTx, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RippleSignTx;
static deserializeBinaryFromReader(message: RippleSignTx, reader: jspb.BinaryReader): RippleSignTx;
}

export namespace RippleSignTx {
export type AsObject = {
addressNList: Array<number>,
fee?: number,
flags?: number,
sequence?: number,
lastLedgerSequence?: number,
payment?: RipplePayment.AsObject,
memo?: string,
}
}

export class RipplePayment extends jspb.Message {
hasAmount(): boolean;
clearAmount(): void;
getAmount(): number | undefined;
setAmount(value: number): void;

hasDestination(): boolean;
clearDestination(): void;
getDestination(): string | undefined;
setDestination(value: string): void;

hasDestinationTag(): boolean;
clearDestinationTag(): void;
getDestinationTag(): number | undefined;
setDestinationTag(value: number): void;

serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RipplePayment.AsObject;
static toObject(includeInstance: boolean, msg: RipplePayment): RipplePayment.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RipplePayment, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RipplePayment;
static deserializeBinaryFromReader(message: RipplePayment, reader: jspb.BinaryReader): RipplePayment;
}

export namespace RipplePayment {
export type AsObject = {
amount?: number,
destination?: string,
destinationTag?: number,
}
}

export class RippleSignedTx extends jspb.Message {
hasSignature(): boolean;
clearSignature(): void;
getSignature(): Uint8Array | string;
getSignature_asU8(): Uint8Array;
getSignature_asB64(): string;
setSignature(value: Uint8Array | string): void;

hasSerializedTx(): boolean;
clearSerializedTx(): void;
getSerializedTx(): Uint8Array | string;
getSerializedTx_asU8(): Uint8Array;
getSerializedTx_asB64(): string;
setSerializedTx(value: Uint8Array | string): void;

serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RippleSignedTx.AsObject;
static toObject(includeInstance: boolean, msg: RippleSignedTx): RippleSignedTx.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RippleSignedTx, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RippleSignedTx;
static deserializeBinaryFromReader(message: RippleSignedTx, reader: jspb.BinaryReader): RippleSignedTx;
}

export namespace RippleSignedTx {
export type AsObject = {
signature: Uint8Array | string,
serializedTx: Uint8Array | string,
}
}

Loading
Loading