|
|
@@ -22,6 +22,7 @@ class OrderbookTransferController
|
|
|
private TokenTransferService $tokenTransferService;
|
|
|
private TokenModel $tokenModel;
|
|
|
private CprModel $cprModel;
|
|
|
+ private OrderbookModel $orderbookModel;
|
|
|
|
|
|
public function __construct()
|
|
|
{
|
|
|
@@ -31,6 +32,7 @@ class OrderbookTransferController
|
|
|
$this->tokenTransferService = new TokenTransferService();
|
|
|
$this->tokenModel = new TokenModel();
|
|
|
$this->cprModel = new CprModel();
|
|
|
+ $this->orderbookModel = new OrderbookModel();
|
|
|
}
|
|
|
|
|
|
public function __invoke(ServerRequestInterface $request)
|
|
|
@@ -97,8 +99,14 @@ class OrderbookTransferController
|
|
|
return ResponseLib::sendFail('Token não está vinculado a uma CPR', ['token_id' => $tokenId], 'E_CPR_NOT_FOUND')->withStatus(409);
|
|
|
}
|
|
|
|
|
|
- if ((int)$orderbook['company_id'] !== $companyId) {
|
|
|
- return ResponseLib::sendFail('Orderbook não pertence à empresa autenticada', [], 'E_FORBIDDEN')->withStatus(403);
|
|
|
+ try {
|
|
|
+ $wallet = $this->walletModel->getPrimaryWalletByCompanyId($companyId);
|
|
|
+ } catch (\Throwable $e) {
|
|
|
+ return ResponseLib::sendFail('Falha ao consultar carteira da empresa: ' . $e->getMessage(), [], 'E_DATABASE')->withStatus(500);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$wallet || empty($wallet['wallet_address'])) {
|
|
|
+ return ResponseLib::sendFail('Carteira da empresa não encontrada', [], 'E_WALLET_NOT_FOUND')->withStatus(404);
|
|
|
}
|
|
|
|
|
|
if ((int)$orderbook['status_id'] === OrderbookModel::STATUS_COMPLETED) {
|
|
|
@@ -109,24 +117,31 @@ class OrderbookTransferController
|
|
|
], 'S_TOKEN_ALREADY_TRANSFERRED');
|
|
|
}
|
|
|
|
|
|
+ $serverAddress = $this->resolveServerAddress();
|
|
|
+
|
|
|
try {
|
|
|
- $wallet = $this->walletModel->getPrimaryWalletByCompanyId($companyId);
|
|
|
+ $transferResult = $this->tokenTransferService->transferFrom($serverAddress, (string)$wallet['wallet_address'], $tokenExternalId);
|
|
|
} catch (\Throwable $e) {
|
|
|
- return ResponseLib::sendFail('Falha ao consultar carteira da empresa: ' . $e->getMessage(), [], 'E_DATABASE')->withStatus(500);
|
|
|
+ return ResponseLib::sendFail('Falha ao transferir token: ' . $e->getMessage(), [], 'E_TRANSFER')->withStatus(500);
|
|
|
}
|
|
|
|
|
|
- if (!$wallet || empty($wallet['wallet_address'])) {
|
|
|
- return ResponseLib::sendFail('Carteira da empresa não encontrada', [], 'E_WALLET_NOT_FOUND')->withStatus(404);
|
|
|
+ $txHash = $transferResult['tx_hash'] ?? null;
|
|
|
+ if (!$txHash) {
|
|
|
+ return ResponseLib::sendFail('Transferência não retornou hash válido', [], 'E_TRANSFER_HASH')->withStatus(502);
|
|
|
}
|
|
|
|
|
|
- $serverAddress = $this->resolveServerAddress();
|
|
|
+ try {
|
|
|
+ $this->orderbookModel->updateWalletId((int)$orderbook['orderbook_id'], (int)$wallet['wallet_id']);
|
|
|
+ } catch (\Throwable $e) {
|
|
|
+ return ResponseLib::sendFail('Falha ao registrar comprador no orderbook: ' . $e->getMessage(), [], 'E_ORDERBOOK_UPDATE')->withStatus(500);
|
|
|
+ }
|
|
|
|
|
|
try {
|
|
|
- $transferResult = $this->tokenTransferService->transferFrom($serverAddress, (string)$wallet['wallet_address'], $tokenExternalId);
|
|
|
$this->orderbookTransferModel->markCompleted((int)$orderbook['orderbook_id']);
|
|
|
+ $this->tokenModel->updateWalletId($tokenId, (int)$wallet['wallet_id']);
|
|
|
$this->cprModel->updateCompanyId($cprId, $companyId);
|
|
|
} catch (\Throwable $e) {
|
|
|
- return ResponseLib::sendFail('Falha ao transferir token: ' . $e->getMessage(), [], 'E_TRANSFER')->withStatus(500);
|
|
|
+ return ResponseLib::sendFail('Falha ao atualizar registros após transferência: ' . $e->getMessage(), [], 'E_TRANSFER_PERSIST')->withStatus(500);
|
|
|
}
|
|
|
|
|
|
return ResponseLib::sendOk([
|
|
|
@@ -135,6 +150,7 @@ class OrderbookTransferController
|
|
|
'destination_address' => (string)$wallet['wallet_address'],
|
|
|
'transfer_output' => $transferResult['output'] ?? '',
|
|
|
'transfer_error' => $transferResult['error'] ?? '',
|
|
|
+ 'transaction_hash' => $txHash,
|
|
|
], 'S_TOKEN_TRANSFERRED');
|
|
|
}
|
|
|
|