Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 deps/device-protocol
79 changes: 68 additions & 11 deletions include/keepkey/firmware/tron.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* This file is part of the KeepKey project.
*
Expand Down Expand Up @@ -27,32 +27,89 @@
// TRON address length (Base58Check, typically 34 chars starting with 'T')
#define TRON_ADDRESS_MAX_LEN 64

// TRON address raw size (1 prefix + 20 hash)
#define TRON_ADDRESS_SIZE 21

// TRON max encoded address size
#define MAX_TRON_ADDR_SIZE 35

// TRON mainnet address prefix
#define TRON_MAINNET_PREFIX 0x41

// TRON decimals (1 TRX = 1,000,000 SUN)
#define TRON_DECIMALS 6

// TRON signature size (r + s + recovery_id)
#define TRON_SIGNATURE_SIZE 65

// TRC-20 transfer(address,uint256) function selector
#define TRC20_TRANSFER_SELECTOR 0xa9059cbb

/**
* Generate TRON address from secp256k1 public key
* @param public_key secp256k1 public key (33 bytes compressed)
* @param address Output buffer for Base58Check encoded address
* @param address_len Length of output buffer
* @return true on success, false on failure
*/
bool tron_getAddress(const uint8_t public_key[33], char *address,
size_t address_len);

/**
* Decode a Base58Check TRON address to raw 21-byte form
* @param address Base58Check encoded "T..." address
* @param raw_address Output buffer (21 bytes: 0x41 prefix + 20 hash)
* @return true on success, false if decode fails or prefix is wrong
*/
bool tron_decodeAddress(const char *address,
uint8_t raw_address[TRON_ADDRESS_SIZE]);

/**
* Validate a Base58Check TRON address
*/
bool tron_validateAddress(const char *address);

/**
* Format TRON amount (SUN) for display
* @param buf Output buffer
* @param len Length of output buffer
* @param amount Amount in SUN (1 TRX = 1,000,000 SUN)
*/
void tron_formatAmount(char *buf, size_t len, uint64_t amount);

/**
* Sign a TRON transaction
* @param node HD node containing private key
* @param msg TronSignTx request message
* @param resp TronSignedTx response message (will be filled with signature)
* Format a token amount with given decimals for display
* @param buf Output buffer
* @param buf_len Buffer size
* @param amount_be 32-byte big-endian amount
* @param decimals Token decimal places
* @param symbol Token symbol (e.g., "USDT")
*/
void tron_formatTokenAmount(char *buf, size_t buf_len,
const uint8_t amount_be[32],
uint8_t decimals, const char *symbol);

/**
* Decode TRC-20 transfer(address,uint256) ABI call data
* @param data ABI-encoded call data (>= 68 bytes)
* @param data_len Length of call data
* @param to_raw Output: 21-byte TRON address (0x41 + 20-byte EVM addr)
* @param amount_bytes Output: 32-byte big-endian amount
* @return true if data matches transfer(address,uint256) selector
*/
bool tron_decodeTRC20Transfer(const uint8_t *data, size_t data_len,
uint8_t to_raw[TRON_ADDRESS_SIZE],
uint8_t amount_bytes[32]);

/**
* Reconstruct Transaction.raw protobuf from structured fields
* @param msg TronSignTx with structured fields
* @param owner_raw 21-byte raw address of the signer
* @param out Output buffer for serialized protobuf
* @param out_len In: max capacity; Out: bytes written
* @param max_len Maximum buffer size
* @return true on success
*/
bool tron_serializeRawTransaction(const TronSignTx *msg,
const uint8_t *owner_raw,
uint8_t *out, size_t *out_len,
size_t max_len);

/**
* Sign a TRON transaction (supports both structured and legacy modes)
*/
bool tron_signTx(const HDNode *node, const TronSignTx *msg,
TronSignedTx *resp);
Expand Down
2 changes: 2 additions & 0 deletions include/keepkey/transport/messages-ton.options
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ TonSignTx.coin_name max_size:21
TonSignTx.raw_tx max_size:1024
TonSignTx.to_address max_size:50

TonAddress.address max_size:50
TonAddress.raw_address max_size:70
TonSignedTx.signature max_size:64
21 changes: 18 additions & 3 deletions include/keepkey/transport/messages-tron.options
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,27 @@ TronGetAddress.coin_name max_size:21

TronAddress.address max_size:35

TronTransferContract.to_address max_size:35

TronTriggerSmartContract.contract_address max_size:35
TronTriggerSmartContract.data max_size:512

TronSignTx.address_n max_count:8
TronSignTx.coin_name max_size:21
TronSignTx.raw_data max_size:2048
TronSignTx.ref_block_bytes max_size:4
TronSignTx.ref_block_hash max_size:32
TronSignTx.raw_data max_size:1024
TronSignTx.ref_block_bytes max_size:2
TronSignTx.ref_block_hash max_size:8
TronSignTx.contract_type max_size:64
TronSignTx.to_address max_size:35
TronSignTx.data max_size:256

TronSignTx.address_n max_count:8
TronSignTx.coin_name max_size:21
TronSignTx.raw_data max_size:1024
TronSignTx.ref_block_bytes max_size:2
TronSignTx.ref_block_hash max_size:8
TronSignTx.contract_type max_size:50
TronSignTx.to_address max_size:35
TronAddress.address max_size:35
TronSignedTx.signature max_size:65
TronSignedTx.serialized_tx max_size:1024
Loading
Loading