7cf87a764f
动钱代码,按"联网建/广播 + 离线签"气隙流程,离线签名独立验签防篡改: - wallet: DecodeTronAddress/TronAddressBodyHex(base58check 解码校验)、AddressFromMnemonic(离线校验用)。 - tron/sign: TxID(sha256 raw_data)、SignRawData(secp256k1 → R||S||recid 65B)、RecoverAddressBody。 - tron/abi: ABIEncodeTransferParams(transfer(address,uint256) 参数)、keccak 地址体。 - tron/tx(联网): BuildTransfer(triggersmartcontract 建未签名)、TRC20Balance、Broadcast。 - cmd/sweep: plan/build/sign/broadcast 四段;sign 对每笔独立验:①重算 txid 防篡改 ②收款人+额 ABI 内嵌 ③USDT 合约内嵌 ④派生地址==owner,任一不符拒签;助记词只经 PAY_SWEEP_MNEMONIC(离线机,不入 arg)。 - 测试:签名可恢复到正确地址、ABI 编码、地址解码 roundtrip 全绿。 - 联网上链部分标注需 Phase E 真链验证;README 补 sweep 用法 + 验签说明 + gas 提醒。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
1.1 KiB
Go
40 lines
1.1 KiB
Go
package wallet
|
|
|
|
import "testing"
|
|
|
|
func TestDecodeTronAddressRoundtrip(t *testing.T) {
|
|
// Golden addresses from the test mnemonic (see derive_test.go).
|
|
for _, addr := range goldenAddrs {
|
|
payload, err := DecodeTronAddress(addr)
|
|
if err != nil {
|
|
t.Fatalf("decode %s: %v", addr, err)
|
|
}
|
|
if len(payload) != 21 || payload[0] != 0x41 {
|
|
t.Fatalf("bad payload for %s: %x", addr, payload)
|
|
}
|
|
// Re-encode the payload and expect the same address back.
|
|
if got := base58CheckEncode(payload); got != addr {
|
|
t.Fatalf("roundtrip: %s -> %s", addr, got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDecodeTronAddressRejectsBad(t *testing.T) {
|
|
if _, err := DecodeTronAddress("TUEZSdKsoDHQMeZwihtdoBiN46zxhGWYdX"); err == nil {
|
|
t.Fatal("expected checksum failure on tampered address")
|
|
}
|
|
if _, err := DecodeTronAddress("not-an-address"); err == nil {
|
|
t.Fatal("expected failure on garbage")
|
|
}
|
|
}
|
|
|
|
func TestTronAddressBodyHex(t *testing.T) {
|
|
body, err := TronAddressBodyHex(goldenAddrs[0])
|
|
if err != nil {
|
|
t.Fatalf("body hex: %v", err)
|
|
}
|
|
if len(body) != 40 { // 20 bytes -> 40 hex chars
|
|
t.Fatalf("body hex len %d, want 40 (%s)", len(body), body)
|
|
}
|
|
}
|