<?php
namespace App\Services;
use Exception;
use Http\Client\Common\HttpMethodsClient;
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\Psr18ClientDiscovery;
use Olifanton\Mnemonic\TonMnemonic;
use Olifanton\Ton\Transports\Toncenter\ClientOptions;
use Olifanton\Ton\Transports\Toncenter\ToncenterHttpV2Client;
use Olifanton\Ton\Transports\Toncenter\ToncenterTransport;
use Olifanton\Interop\Address;
use Olifanton\Interop\Boc\SnakeString;
use Olifanton\Interop\Units;
use Olifanton\Ton\AddressState;
use Olifanton\Ton\Contracts\Jetton\JettonMinter;
use Olifanton\Ton\Contracts\Jetton\JettonWallet;
use Olifanton\Ton\Contracts\Jetton\JettonWalletOptions;
use Olifanton\Ton\Contracts\Jetton\TransferJettonOptions;
use Olifanton\Ton\Contracts\Wallets\Transfer;
use Olifanton\Ton\Contracts\Wallets\TransferOptions;
use Olifanton\Ton\Contracts\Wallets\V4\WalletV4Options;
use Olifanton\Ton\Contracts\Wallets\V4\WalletV4R2;
use Olifanton\Ton\SendMode;
class TONService
{
private $isMainnet = true;
private $httpClient, $toncenter, $transport, $kp, $wallet, $walletAddress;
public function __construct()
{
$this->isMainnet = config('services.ton.is_mainnet');
$this->httpClient = new HttpMethodsClient(
Psr18ClientDiscovery::find(),
Psr17FactoryDiscovery::findRequestFactory(),
Psr17FactoryDiscovery::findStreamFactory(),
);
$this->toncenter = new ToncenterHttpV2Client(
$this->httpClient,
new ClientOptions(
$this->isMainnet ? 'https://toncenter.com/api/v2' : 'https://test.toncenter.com/api/v2',
$this->isMainnet ? config('services.ton.toncenter_api_key_mainnet') : config('services.ton.toncenter_api_key_testnet'),
),
);
$this->transport = new ToncenterTransport($this->toncenter);
$words = explode(" ", trim(config("services.ton.wallet_words")));
$this->kp = TonMnemonic::mnemonicToKeyPair($words);
$this->wallet = new WalletV4R2(
new WalletV4Options(
publicKey: $this->kp->publicKey,
),
);
$this->walletAddress = $this->wallet->getAddress();
}
//for example: jetton usdt address = EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs
public function jettonTransfer($address, $comment, $amount, $jettonAddress)
{
try {
$recipient = new Address($address);
$jettonRoot = JettonMinter::fromAddress(
$this->transport,
new Address($jettonAddress),
);
$jettonWalletAddress = $jettonRoot->getJettonWalletAddress($this->transport, $this->walletAddress);
$jettonWallet = new JettonWallet(new JettonWalletOptions(
address: $jettonWalletAddress,
));
$state = $this->transport->getState($jettonWalletAddress);
if ($state !== AddressState::ACTIVE) {
throw new Exception("Your jetton wallet is not initialized, you cannot perform a transfer of funds that do not exist");
}
$extMessage = $this->wallet->createTransferMessage([
new Transfer(
dest: $jettonWalletAddress,
amount: Units::toNano("0.1"),
payload: $jettonWallet->createTransferBody(
new TransferJettonOptions(
jettonAmount: Units::toNano($amount, Units::USDt),
toAddress: $recipient,
responseAddress: $this->walletAddress,
forwardPayload: SnakeString::fromString($comment)->cell(true),
forwardAmount: Units::toNano("0.0000001"),
),
),
sendMode: SendMode::IGNORE_ERRORS->combine(SendMode::PAY_GAS_SEPARATELY, SendMode::CARRY_ALL_REMAINING_INCOMING_VALUE),
)
], new TransferOptions(
seqno: (int)$this->wallet->seqno($this->transport),
));
$this->transport->sendMessage($extMessage, $this->kp->secretKey);
} catch (Exception $e) {
dd($e->getMessage(), $e);
}
}
}
Hi i send USDT but in transaction list get UKWN