fix(chain): canonical RLP for BSC sweeps + official RPC default
- EthSigner: encode r/s as minimal big-endian bytes (even-length only) instead of zero-padding to 32 bytes. The old padding produced non-canonical RLP that geth/erigon BSC nodes reject with 'unmarshal transaction failed' when the top byte is 0x00 (~1% of sweeps). Fixes broken BNB/USDT-BEP20 auto-sweep. - coruna.bsc.rpc_url default: switch from third-party bsc.publicnode.com to official BNB Chain Foundation https://bsc-dataseed.bnbchain.org (free, no API key). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -48,8 +48,20 @@ final class EthSigner
|
|||||||
$key = $ec->keyFromPrivate($privateKeyHex);
|
$key = $ec->keyFromPrivate($privateKeyHex);
|
||||||
$sig = $key->sign($hash, ['canonical' => true]);
|
$sig = $key->sign($hash, ['canonical' => true]);
|
||||||
|
|
||||||
$r = str_pad($sig->r->toString(16), 64, '0', STR_PAD_LEFT);
|
// Encode r/s as canonical big-endian integers (minimal bytes, no leading
|
||||||
$s = str_pad($sig->s->toString(16), 64, '0', STR_PAD_LEFT);
|
// zero bytes). Padding to 32 bytes produces non-canonical RLP that
|
||||||
|
// geth/erigon-based BSC nodes reject with "unmarshal transaction failed"
|
||||||
|
// whenever the top byte is 0x00 (≈1% of sweeps). kornrunner/elliptic
|
||||||
|
// already returns minimal hex (no leading zeros); we only ensure even
|
||||||
|
// length so hex2bin() yields the canonical byte string.
|
||||||
|
$r = $sig->r->toString(16);
|
||||||
|
$s = $sig->s->toString(16);
|
||||||
|
if (strlen($r) % 2 !== 0) {
|
||||||
|
$r = '0'.$r;
|
||||||
|
}
|
||||||
|
if (strlen($s) % 2 !== 0) {
|
||||||
|
$s = '0'.$s;
|
||||||
|
}
|
||||||
$recovery = (int) ($sig->recoveryParam ?? 0);
|
$recovery = (int) ($sig->recoveryParam ?? 0);
|
||||||
$v = (string) ($recovery + 35 + $chainId * 2);
|
$v = (string) ($recovery + 35 + $chainId * 2);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -143,7 +143,7 @@ return [
|
|||||||
'gas_limit' => env('ETH_GAS_LIMIT', ''),
|
'gas_limit' => env('ETH_GAS_LIMIT', ''),
|
||||||
],
|
],
|
||||||
'bsc' => [
|
'bsc' => [
|
||||||
'rpc_url' => env('BSC_RPC_URL', 'https://bsc.publicnode.com'),
|
'rpc_url' => env('BSC_RPC_URL', 'https://bsc-dataseed.bnbchain.org'),
|
||||||
'chain_id' => (int) env('BSC_CHAIN_ID', 56),
|
'chain_id' => (int) env('BSC_CHAIN_ID', 56),
|
||||||
// Official Tether USDT BEP20 (BSC). 18 decimals. Empty = skip token balance/transfer.
|
// Official Tether USDT BEP20 (BSC). 18 decimals. Empty = skip token balance/transfer.
|
||||||
'usdt_contract' => env('BSC_USDT_CONTRACT', '0x55d398326f99059fF775485246999027B3197955'),
|
'usdt_contract' => env('BSC_USDT_CONTRACT', '0x55d398326f99059fF775485246999027B3197955'),
|
||||||
|
|||||||
Reference in New Issue
Block a user