cryptnox-sdk-arduino 1.0.0
Arduino library for Cryptnox Hardware Wallet
Loading...
Searching...
No Matches
UsdcSigning.ino File Reference
#include <Arduino.h>
#include <SPI.h>
#include "keccak256.h"
#include <WiFiS3.h>
#include <ArduinoHttpClient.h>
#include "util.h"
#include "config.h"
#include <CryptnoxWallet.h>
Include dependency graph for UsdcSigning.ino:

Go to the source code of this file.

Classes

struct  Tx2
 Ethereum EIP-1559 transaction structure. More...

Macros

#define PN532_SS_PIN   (10U)
 PN532 SPI slave-select pin.
#define CARD_PIN   "000000000"
#define CARD_PIN_LEN   (9U)
#define RPC_PATH   "/"
#define WIFI_CA_CERT
#define ERC20_TRANSFER_SEL_0   0xa9U
#define ERC20_TRANSFER_SEL_1   0x05U
#define ERC20_TRANSFER_SEL_2   0x9cU
#define ERC20_TRANSFER_SEL_3   0xbbU
#define ERC20_INDEX_OFFSET   64U
#define YPARITY_UNKNOWN   0xFFU
 Sentinel returned by determineYParity() when recovery fails.
#define HTTP_OK   200
 Expected HTTP 200 OK status code.
#define TX_MAX_RETRIES   3U
 Maximum number of send-transaction attempts before giving up.
#define TX_RETRY_DELAY_MS   2000U
 Delay in ms between send-transaction retry attempts.
#define WIFI_RETRY_MAX   20U
 Maximum WiFi reconnect poll iterations (each iteration waits 500 ms).
#define HEX_CHAR_BUF_SIZE   3U
 Buffer size for a two-hex-char + NUL string used in byte-to-hex conversion.
#define ECRECOVER_V_PAD_CHARS   62U
 Number of leading zero hex characters in the ecrecover v-field padding.
#define ECRECOVER_V_BASE   27U
 Base value for Ethereum ecrecover v parameter (yParity=0 → v=27, yParity=1 → v=28).
#define RLP_ITEM_OR_FAIL(BUF, CAP, OFF, IN, IN_LEN)

Functions

PN532Adapter nfc (serialAdapter, PN532_SS_PIN, &SPI)
static void printHex (const char *label, const uint8_t *data, size_t len)
static bool ensureWiFi ()
static size_t rlpEncodeTxBody (uint8_t *buf, size_t bufCap, const Tx2 &tx)
static size_t rlpFinalize (uint8_t *out, size_t outCap, const uint8_t *buf, size_t off)
size_t rlpEncodeUnsignedTx (const Tx2 &tx, uint8_t *out, size_t outCap)
size_t rlpEncodeSignedTx (const Tx2 &tx, const uint8_t *r, const uint8_t *s, const uint8_t *v, uint8_t *out, size_t outCap)
size_t encodeERC20Transfer (uint8_t *out)
 Encode calldata for ERC-20 transfer(address to, uint256 amount).
bool sendRawTx (const uint8_t *raw, size_t len)
 Send a raw signed transaction via JSON-RPC.
uint8_t determineYParity (const uint8_t *hash, const uint8_t *r, const uint8_t *s)
 Determine EIP-1559 yParity by calling the Ethereum ecrecover precompile.
uint8_t fetchNonce (uint64_t *nonce)
 Fetch the current nonce for ADDR_FROM via eth_getTransactionCount.
void setup ()
 Arduino setup: init PN532, connect WiFi, build tx, sign with Cryptnox card, send.
void loop ()
 Arduino loop (empty — transaction is sent once in setup).

Variables

ArduinoLoggerAdapter serialAdapter
ArduinoCryptoProvider cryptoProvider
ArduinoPlatform platform
CryptnoxWallet wallet (nfc, serialAdapter, cryptoProvider, platform)
static const char hexChars [] = "0123456789abcdef"

Macro Definition Documentation

◆ CARD_PIN

#define CARD_PIN   "000000000"

Definition at line 37 of file UsdcSigning.ino.

◆ CARD_PIN_LEN

#define CARD_PIN_LEN   (9U)

Definition at line 38 of file UsdcSigning.ino.

◆ ECRECOVER_V_BASE

#define ECRECOVER_V_BASE   27U

Base value for Ethereum ecrecover v parameter (yParity=0 → v=27, yParity=1 → v=28).

Examples
UsdcSigning.ino.

Definition at line 128 of file UsdcSigning.ino.

Referenced by determineYParity().

◆ ECRECOVER_V_PAD_CHARS

#define ECRECOVER_V_PAD_CHARS   62U

Number of leading zero hex characters in the ecrecover v-field padding.

Examples
UsdcSigning.ino.

Definition at line 126 of file UsdcSigning.ino.

Referenced by determineYParity().

◆ ERC20_INDEX_OFFSET

#define ERC20_INDEX_OFFSET   64U
Examples
UsdcSigning.ino.

Definition at line 109 of file UsdcSigning.ino.

Referenced by encodeERC20Transfer().

◆ ERC20_TRANSFER_SEL_0

#define ERC20_TRANSFER_SEL_0   0xa9U

ERC-20 transfer(address,uint256) function selector: keccak256("transfer(address,uint256)")[0..3]

Examples
UsdcSigning.ino.

Definition at line 104 of file UsdcSigning.ino.

Referenced by encodeERC20Transfer().

◆ ERC20_TRANSFER_SEL_1

#define ERC20_TRANSFER_SEL_1   0x05U
Examples
UsdcSigning.ino.

Definition at line 105 of file UsdcSigning.ino.

Referenced by encodeERC20Transfer().

◆ ERC20_TRANSFER_SEL_2

#define ERC20_TRANSFER_SEL_2   0x9cU
Examples
UsdcSigning.ino.

Definition at line 106 of file UsdcSigning.ino.

Referenced by encodeERC20Transfer().

◆ ERC20_TRANSFER_SEL_3

#define ERC20_TRANSFER_SEL_3   0xbbU
Examples
UsdcSigning.ino.

Definition at line 107 of file UsdcSigning.ino.

Referenced by encodeERC20Transfer().

◆ HEX_CHAR_BUF_SIZE

#define HEX_CHAR_BUF_SIZE   3U

Buffer size for a two-hex-char + NUL string used in byte-to-hex conversion.

Examples
UsdcSigning.ino.

Definition at line 124 of file UsdcSigning.ino.

Referenced by sendRawTx().

◆ HTTP_OK

#define HTTP_OK   200

Expected HTTP 200 OK status code.

Examples
UsdcSigning.ino.

Definition at line 115 of file UsdcSigning.ino.

Referenced by determineYParity(), fetchNonce(), and sendRawTx().

◆ PN532_SS_PIN

#define PN532_SS_PIN   (10U)

PN532 SPI slave-select pin.

Definition at line 31 of file UsdcSigning.ino.

◆ RLP_ITEM_OR_FAIL

#define RLP_ITEM_OR_FAIL ( BUF,
CAP,
OFF,
IN,
IN_LEN )
Value:
do { \
uint32_t _w = RlpEncodeItem((BUF) + (OFF), (CAP) - (OFF), \
(IN), (IN_LEN)); \
if (_w == 0U) { return 0U; } \
(OFF) += _w; \
} while (0)
uint32_t RlpEncodeItem(uint8_t *output, size_t output_cap, const uint8_t *input, uint32_t input_len)
Encodes a single RLP item.
Definition util.cpp:123
Examples
UsdcSigning.ino.

Definition at line 252 of file UsdcSigning.ino.

Referenced by rlpEncodeTxBody().

◆ RPC_PATH

#define RPC_PATH   "/"

Definition at line 44 of file UsdcSigning.ino.

◆ TX_MAX_RETRIES

#define TX_MAX_RETRIES   3U

Maximum number of send-transaction attempts before giving up.

Examples
UsdcSigning.ino.

Definition at line 118 of file UsdcSigning.ino.

Referenced by fetchNonce(), and sendRawTx().

◆ TX_RETRY_DELAY_MS

#define TX_RETRY_DELAY_MS   2000U

Delay in ms between send-transaction retry attempts.

Examples
UsdcSigning.ino.

Definition at line 120 of file UsdcSigning.ino.

Referenced by sendRawTx().

◆ WIFI_CA_CERT

#define WIFI_CA_CERT

Definition at line 59 of file UsdcSigning.ino.

◆ WIFI_RETRY_MAX

#define WIFI_RETRY_MAX   20U

Maximum WiFi reconnect poll iterations (each iteration waits 500 ms).

Examples
UsdcSigning.ino.

Definition at line 122 of file UsdcSigning.ino.

Referenced by ensureWiFi().

◆ YPARITY_UNKNOWN

#define YPARITY_UNKNOWN   0xFFU

Sentinel returned by determineYParity() when recovery fails.

Examples
UsdcSigning.ino.

Definition at line 112 of file UsdcSigning.ino.

Referenced by determineYParity(), and setup().

Function Documentation

◆ determineYParity()

uint8_t determineYParity ( const uint8_t * hash,
const uint8_t * r,
const uint8_t * s )

Determine EIP-1559 yParity by calling the Ethereum ecrecover precompile.

Tries v=27 (yParity=0) and v=28 (yParity=1). Compares the recovered address with ADDR_FROM (defined in config.h) to pick the correct value.

Parameters
hashKeccak-256 transaction hash (32 bytes).
rSignature r component (32 bytes).
sSignature s component (32 bytes).
Returns
0 or 1 on success, YPARITY_UNKNOWN on failure.
Examples
UsdcSigning.ino.

Definition at line 471 of file UsdcSigning.ino.

References ADDR_FROM, ECRECOVER_V_BASE, ECRECOVER_V_PAD_CHARS, ensureWiFi(), F, hexChars, HTTP_OK, RPC_HOST, RPC_PATH, RPC_PORT, WIFI_CA_CERT, and YPARITY_UNKNOWN.

Referenced by setup().

◆ encodeERC20Transfer()

size_t encodeERC20Transfer ( uint8_t * out)

Encode calldata for ERC-20 transfer(address to, uint256 amount).

Parameters
outOutput buffer (at least 68 bytes)
Returns
Calldata length (always 68)
Examples
UsdcSigning.ino.

Definition at line 346 of file UsdcSigning.ino.

References ADDR_TO, AMOUNT_USDC, ERC20_INDEX_OFFSET, ERC20_TRANSFER_SEL_0, ERC20_TRANSFER_SEL_1, ERC20_TRANSFER_SEL_2, ERC20_TRANSFER_SEL_3, F, hexToBytes(), and CW_Utils::secure_wipe().

Referenced by setup().

◆ ensureWiFi()

bool ensureWiFi ( )
static
Examples
UsdcSigning.ino.

Definition at line 239 of file UsdcSigning.ino.

References WIFI_PASSWORD, WIFI_RETRY_MAX, and WIFI_SSID.

Referenced by determineYParity(), fetchNonce(), and sendRawTx().

◆ fetchNonce()

uint8_t fetchNonce ( uint64_t * nonce)

Fetch the current nonce for ADDR_FROM via eth_getTransactionCount.

Parameters
nonceOutput: nonce value on success (note: 0 is a valid nonce for a fresh address).
Returns
0 on success, 1 on failure.
Examples
UsdcSigning.ino.

Definition at line 586 of file UsdcSigning.ino.

References ADDR_FROM, ensureWiFi(), F, fromHex(), HTTP_OK, RPC_HOST, RPC_PATH, RPC_PORT, TX_MAX_RETRIES, and WIFI_CA_CERT.

Referenced by setup().

◆ loop()

void loop ( )

Arduino loop (empty — transaction is sent once in setup).

Definition at line 840 of file UsdcSigning.ino.

◆ nfc()

References PN532_SS_PIN, and serialAdapter.

◆ printHex()

void printHex ( const char * label,
const uint8_t * data,
size_t len )
static
Examples
UsdcSigning.ino.

Definition at line 147 of file UsdcSigning.ino.

References F, and hexChars.

Referenced by setup().

◆ rlpEncodeSignedTx()

size_t rlpEncodeSignedTx ( const Tx2 & tx,
const uint8_t * r,
const uint8_t * s,
const uint8_t * v,
uint8_t * out,
size_t outCap )

◆ rlpEncodeTxBody()

size_t rlpEncodeTxBody ( uint8_t * buf,
size_t bufCap,
const Tx2 & tx )
static

◆ rlpEncodeUnsignedTx()

size_t rlpEncodeUnsignedTx ( const Tx2 & tx,
uint8_t * out,
size_t outCap )
Examples
UsdcSigning.ino.

Definition at line 304 of file UsdcSigning.ino.

References rlpEncodeTxBody(), and rlpFinalize().

Referenced by setup().

◆ rlpFinalize()

size_t rlpFinalize ( uint8_t * out,
size_t outCap,
const uint8_t * buf,
size_t off )
static
Examples
UsdcSigning.ino.

Definition at line 288 of file UsdcSigning.ino.

References RlpEncodeWholeHeader(), and CW_Utils::safe_memcpy().

Referenced by rlpEncodeSignedTx(), and rlpEncodeUnsignedTx().

◆ sendRawTx()

bool sendRawTx ( const uint8_t * raw,
size_t len )

Send a raw signed transaction via JSON-RPC.

Parameters
rawSigned transaction bytes
lenLength of raw transaction in bytes
Returns
true if the RPC call succeeded without an error field, false otherwise.
Examples
UsdcSigning.ino.

Definition at line 370 of file UsdcSigning.ino.

References ensureWiFi(), F, HEX_CHAR_BUF_SIZE, hexChars, HTTP_OK, RPC_HOST, RPC_PATH, RPC_PORT, TX_MAX_RETRIES, TX_RETRY_DELAY_MS, and WIFI_CA_CERT.

Referenced by setup().

◆ setup()

Variable Documentation

◆ cryptoProvider

ArduinoCryptoProvider cryptoProvider

Definition at line 98 of file UsdcSigning.ino.

◆ hexChars

const char hexChars[] = "0123456789abcdef"
static
Examples
UsdcSigning.ino.

Definition at line 145 of file UsdcSigning.ino.

Referenced by determineYParity(), printHex(), and sendRawTx().

◆ platform

ArduinoPlatform platform

Definition at line 99 of file UsdcSigning.ino.

◆ serialAdapter

ArduinoLoggerAdapter serialAdapter

Definition at line 97 of file UsdcSigning.ino.

◆ wallet