<?php

namespace App\Domain\Blockchain\Contracts;

use App\Domain\Blockchain\Data\AddressCursor;
use App\Domain\Blockchain\Data\AddressRequest;
use App\Domain\Blockchain\Data\ChainTransaction;
use App\Domain\Blockchain\Data\DepositAddress;
use App\Domain\Blockchain\Data\FeeQuote;
use App\Domain\Blockchain\Data\FeeRequest;
use App\Domain\Blockchain\Data\ProviderTransfer;
use App\Domain\Blockchain\Data\TransactionPage;
use App\Domain\Blockchain\Data\TransferRequest;
use App\Domain\Blockchain\Data\VerifiedProviderEvent;

interface BlockchainGateway
{
    public function createDepositAddress(AddressRequest $request): DepositAddress;
    public function validateAddress(string $network, string $address): bool;
    public function listAddressTransactions(AddressCursor $cursor): TransactionPage;
    public function getTransaction(string $network, string $txHash): ChainTransaction;
    public function estimateNetworkFee(FeeRequest $request): FeeQuote;
    public function createTransfer(TransferRequest $request): ProviderTransfer;
    public function getTransfer(string $providerTransferId): ProviderTransfer;
    public function verifyWebhook(string $rawBody, array $headers): VerifiedProviderEvent;
}
