Supported cryptocurrencies
Any coin listed as accepted by the CoinPayments merchant account and returned by theGetRates API call is available as a deposit method. The application filters the full rate list to coins_accept — coins that CoinPayments will accept for the merchant’s account. Common examples include BTC, ETH, LTC, DOGE, and USDT.
For fiat-denominated wallets (e.g. USD), the deposit amount is converted to BTC using the rate_btc field from GetRates, and the user selects which coin to pay with. For crypto-denominated wallets, the deposit coin matches the wallet currency directly.
Prerequisites
- A CoinPayments merchant account
- A Public Key and Private Key from your CoinPayments account API settings
- An IPN Secret configured in your CoinPayments account
Configuration
Retrieve your API keys
In your CoinPayments account, go to Account → API Keys. Generate or copy your Public Key and Private Key.
Set an IPN Secret
In CoinPayments, go to Account → Account Settings → Merchant Settings and set an IPN Secret. This secret is used to verify that IPN requests originate from CoinPayments.
Enter credentials in the admin panel
In Doss, navigate to Payment Methods → CoinPayments. Enter the Public Key (
public_key), Private Key (private_key), and IPN Secret for the target currency. These are stored in currency_payment_methods.method_data as JSON.Configure the IPN URL
Set your IPN URL in CoinPayments to:This route is already registered in the application and excluded from CSRF verification.
Activate CoinPayments for deposit
Enable the CoinPayments method for the deposit transaction type on each currency. The
activated_for field must include deposit.The IPN URL
https://your-domain.com/coinpayment/check must be publicly accessible. CoinPayments cannot reach a local or firewalled server. Use a tunnel (e.g. ngrok) for local testing.How crypto deposits work
- Initiate deposit — The user selects an amount and CoinPayments as the payment method.
- Coin selection — For fiat wallets, the user is shown a list of accepted coins.
CoinPaymentRepository::GetRatesis called with the storedprivate_keyandpublic_keyto fetch current rates and filter tocoins_accept. - Create transaction —
CoinPaymentRepository::CreateTransactionis called with:amountandcurrency1/currency2(the deposit currency)buyer_emailandbuyer_namefrom the authenticated useritem_name:"Deposit via coinpayment"custom: a UUID that links the CoinPayments transaction to the internal deposit recordipn_url:https://your-domain.com/coinpayment/checkcancel_urlandsuccess_url
- Record pending deposit — A
Depositrecord (statusPending) and aTransactionrecord (statusPending) are created. ACoinpaymentLogTrxrow is also written, storing thetxn_id,payment_address,coin, expectedamount, expiry time, and the JSONpayloadlinking to the internal deposit and transaction IDs. - User pays — The user sends the crypto amount to the
payment_addressshown on screen (with optional QR code). - IPN confirmation — When the payment reaches the required number of confirmations, CoinPayments POSTs to
/coinpayment/checkwithipn_type: "api",status: 100, andstatus_text: "Complete". The handler (DepositController@coinpaymentCheckStatus) matches thetxn_idandcustomUUID to the pendingCoinpaymentLogTrx, updates the deposit and transaction toSuccess, and credits the wallet.
IPN route
routes/web.php outside the auth middleware group and is excluded from CSRF verification in VerifyCsrfToken.php.
Transaction status values
| Status code | Meaning |
|---|---|
0 | Waiting for payment |
1 | Coin received, waiting for confirms |
100 | Payment complete |
-1 | Cancelled / timed out |
status == 100 with status_text == "Complete" triggers the deposit to be marked as Success and the wallet balance to be credited.
Limitations
- Crypto-to-crypto deposits require the wallet currency to be in the CoinPayments
coins_acceptlist. If the currency code is not listed, the deposit is rejected with"Currency code is not listed." - If the CoinPayments API returns an error during
GetRates(e.g. invalid credentials), the user sees"It seems the credential provided is wrong. You may contact with the system administrator." - Deposit transactions expire according to the
time_expiresvalue returned by CoinPayments. Payments received after expiry are not credited automatically.