Crypto-to-Crypto Transactions
Learn how to send crypto tokens directly to one or more destination wallets using the Skyline Digital API
Crypto-to-crypto (C2C) transactions send crypto tokens directly from your wallet to one or more destination wallets. Unlike crypto-to-fiat transactions that convert to fiat currency, C2C transactions keep the value in crypto throughout the process. This transaction type supports multi-payment capability, allowing you to pay up to 30 different receivers in a single transaction.
Prerequisites
Before starting this tutorial, complete the Wallet Management tutorial. You need wallets set up for both the sender (your organisation's wallet) and the receivers (destination wallets).
Multi-payment capability
A single C2C transaction can include up to 30 individual payments, each directed to a different receiver and wallet with a different amount. This is useful when you need to distribute tokens to multiple parties in one operation -- for example, paying several vendors or distributing funds across team wallets.
Each payment in the array is processed as part of the same transaction, sharing the same source token and wallet. The total amount across all payments is drawn from your wallet in a single blockchain operation.
Step 1: Create a draft transaction
To start a C2C transaction, send a request to POST /transactions with the transaction type set to CRYPTO. The request includes transaction-level details and a payments array.
Transaction-level fields
| Field | Description |
|---|---|
| type | Must be set to CRYPTO for crypto-to-crypto transactions. |
| token | The crypto token you are sending, such as USDT, USDC, or DAI. |
| walletAddress | The blockchain address of the wallet you are sending from. |
| network | The identifier of the blockchain network. Optional if the wallet is already associated with a specific network. |
Payment-level fields
Each payment within a C2C transaction uses the CRYPTO payment type. You specify the destination wallet either by referencing an existing wallet on the platform or by providing the wallet details inline.
| Field | Type | Description |
|---|---|---|
| type | PaymentType | Must be set to CRYPTO. |
| receiver | Object | The receiver details for this payment. |
| amount | String | The amount of tokens to send. |
| reason | String | A description of the payment reason. Required for all CRYPTO payments. |
| tokenIsoCode | String | The token identifier for the destination, specifying which token the receiver will get. |
| wallet | String | The identifier of an existing wallet registered on the platform. Use this when paying a receiver whose wallet is already set up. |
| walletAddress | String | The blockchain address of the destination wallet. Use this instead of wallet when specifying details inline. |
| walletType | String | The type of the destination wallet -- either EOA or SAFE. Required when using walletAddress. |
| network | String | The identifier of the blockchain network for the destination wallet. Required when using walletAddress. |
| instructions | String | Optional additional instructions for the payment. |
You can reference an existing wallet by its identifier using the wallet field, or provide the destination details inline using walletAddress, walletType, and network. When using inline details, all three fields are required.
Steps 2 through 5: Validate, check allowance, submit, and accept
The remaining steps follow the same flow as a crypto-to-fiat transaction. For full details on each step, refer to the Crypto-to-Fiat tutorial.
Step 2: Validate. Send a request to POST /transactions/:id/validate to check that the transaction details are correct and the network is compatible with the selected token and wallets.
Step 3: Check allowance. Send a request to POST /transactions/:id/check-allowance to verify that your wallet has approved sufficient token spending for the platform's smart contract.
Step 4: Submit. Send a request to POST /transactions/:id/submit to move the transaction from DRAFT to WAITING_ACCEPTANCE status.
Step 5: Accept. Send a request to POST /transactions/:id/accept to finalise the transaction. Your organisation must have APPROVED status and the member must be AUTHORIZED.
Monitoring status
After accepting, track the transaction by sending a request to GET /transactions/:id. The transaction progresses through PROCESSING, RELEASED, and COMPLETED as the tokens are transferred to the destination wallets. See the Crypto-to-Fiat tutorial for a full description of each status.
Key differences from crypto-to-fiat
The table below highlights the main differences between C2C and C2F transactions.
| Aspect | Crypto-to-Fiat (C2F) | Crypto-to-Crypto (C2C) |
|---|---|---|
| Transaction type | FIAT | CRYPTO |
| Payment type | FIAT | CRYPTO |
| Destination | Bank account | Wallet (existing or inline) |
| Destination identifier | bankAccount + currencyIsoCode | wallet or walletAddress + walletType + network |
| Token field | tokenIsoCode not used in payments | tokenIsoCode specifies the destination token |
| Banking fees option | bankingFeesOption available | Not applicable |
| Multi-payment | Up to 30 payments | Up to 30 payments |
What's next
To learn about converting fiat currency into crypto via bank deposit, continue to the On-Ramp tutorial.