529ae4aa38
BtcDriver::sendNative only supported legacy P2PKH (BIP44) inputs: it derived a P2PKH address from the mnemonic, fetched UTXOs there, and signed with the legacy pre-segwit sighash. Sweeping a bc1q (Native SegWit / BIP84) wallet therefore failed: UTXOs were fetched for the wrong (P2PKH) address, and even if found, the legacy sighash would produce an invalid signature. - ChainDriver::sendNative gains an optional ?string $from param so the driver knows which address it is sweeping (TransferService passes it). - BtcDriver::fromType classifies the from address: P2PKH (1...) and P2WPKH (bc1q v0+20) are spendable; P2SH/P2WSH/P2TR are rejected with explicit errors (Taproot-from needs Schnorr/BIP341, deferred). - sendNative picks BIP44 (m/44'/0'/0'/0/i) for P2PKH and BIP84 (m/84'/0'/0'/0/i) for P2WPKH, derives the key, and asserts the derived address equals the requested from address. - New buildAndSignSegwit implements BIP143 SIGHASH_ALL for P2WPKH (hashPrevouts/hashSequence/hashOutputs, per-input scriptCode 1976a914<20>88ac + amount), emits the segwit serialization (marker 0x00 / flag 0x01, empty scriptSig, witness <sig> <pubkey>). - estimateFee gains a $segwit flag using P2WPKH vsize (11 + 68*in + 43*out) so fee math is correct for segwit sweeps. - Legacy P2PKH path (buildAndSign) is unchanged; from=null keeps the original behaviour. Verified locally: BIP84 index 0 of the standard test mnemonic derives the canonical bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu; BIP143 sighash cross-checks against an independent implementation; the produced witness signature verifies (EC) over that sighash; tx structure parses (marker/flag/empty scriptSig/2-item witness) and txid is well-formed. Co-authored-by: Cursor <cursoragent@cursor.com>
38 lines
1016 B
PHP
38 lines
1016 B
PHP
<?php
|
|
|
|
namespace App\Services\Chain;
|
|
|
|
interface ChainDriver
|
|
{
|
|
public function chainId(): string;
|
|
|
|
public function deriveAddress(string $mnemonic, int $index = 0): string;
|
|
|
|
/**
|
|
* @return string txid
|
|
*/
|
|
public function sendNative(string $mnemonic, int $index, string $to, string $amount, ?string $from = null): string;
|
|
|
|
/**
|
|
* @return string txid
|
|
*/
|
|
public function sendToken(string $mnemonic, int $index, string $to, string $amount, string $contract): string;
|
|
|
|
public function isValidAddress(string $address): bool;
|
|
|
|
/**
|
|
* True when the address has on-chain footprint (account created, txs, or funds).
|
|
*/
|
|
public function isActivated(string $address): bool;
|
|
|
|
/**
|
|
* Human-decimal native balance (e.g. TRX).
|
|
*/
|
|
public function getNativeBalance(string $address): string;
|
|
|
|
/**
|
|
* Human-decimal token balance (e.g. USDT, 6 decimals on Tron).
|
|
*/
|
|
public function getTokenBalance(string $address, string $contract): string;
|
|
}
|