Crypto Cold Storage
How do I transfer crypto in and out of cold storage?
Availability
To enable in the production environment, please contact the partner success team.
Overview
In order to support individual and business customers, as well as your bank, to store crypto in cold storage,
an account of type storage must be created. storage accounts can be created in BTC or USDC on various
chains, e.g., Ethereum, Stellar, Polygon and Solana, depending on the chain(s) you want to support. Any
balance stored in a storage account is held in trust with Cybrid's third party cold storage provider.
To allow a customer or your bank to store crypto in cold storage follow these steps on the Cybrid Platform:
- Create a bank or customer-level
tradingaccount for the crypto asset of your choosing, e.g.,BTC; - Create a bank or customer-level
storageaccount for the crypto asset of your choosing, e.g.,BTC; - Execute trade(s) to add balance to the
tradingaccount; and, - Transfer some or all of the balance in the
tradingaccount to thestorageaccount of the same asset and owner, e.g., customer or bank with aninter-accounttransfer.
1. Creating accounts
If you haven't already done so, create the required customer or bank-level fiat trading and storage
accounts. These are one-time operations.
See the guide for creating accounts at the bank-level and the guide for creating a trading account.
An example POST /api/accounts request body for creating a storage account is below:
{
"type": "storage",
"asset": "BTC",
"customer_guid": "<customer_guid>",
"name": "<insert account descriptive name>"
}When executed, the following response body will be returned:
{
"created_at": "<created_at timestamp>",
"updated_at": "<updated_at timestamp>",
"type": "storage",
"guid": "<created account GUID>",
"asset": "BTC",
"name": "<inserted account descriptive name>",
"customer_guid": "<customer_guid>",
"platform_balance": 0,
"platform_available": 0,
"state": "storing",
"labels": null
}The account will begin in "state":"storing", and automatically progress to "state":"created" which is the
terminal state for accounts.
2. Execute trade(s) to add balance to the trading account
trading accountFollow the guides for creating a quote and
executing a trade to add balance to your trading
account.
3. Transfer crypto balance to the storage account
storage accountFirst, an inter_account must be executed:
{
"product_type": "inter_account",
"asset": "BTC",
"customer_guid": "<customer_guid>",
"source_platform_account": "<trading account guid>",
"destination_platform_account": "<storage account guid>",
"deliver_amount": <insert deliver_amount>,
"network_fee": 1000,
"network_fee_asset": "BTC"
}When executed, the following response body will be returned:
{
"created_at": "<created_at timestamp>",
"updated_at": "<updated_at timestamp>",
"guid": "<created quote_guid>",
"product_type": "inter_account",
"customer_guid": "<customer_guid>",
"asset": "BTC",
"side": "deposit",
"receive_amount": <calculated receive_amount>,
"deliver_amount": <inserted deliver_amount>,
"fee": 0,
"issued_at": "<issued_at timestamp>",
"expires_at": "<expires_at timestamp>",
"network_fee": 1000,
"network_fee_asset": "BTC"
}For crypto inter_account transfers it is important to understand that any on-chain network or gas fees
that are required for the transfer to take place can be seen on the quote in the network_fee field. Network
fees on the Cybrid Platform are tracked as a liability to the partner in their gas account, and subtracted
from any partner trade revenue or invoiced at the beginning of each month.
Use the the above quote GUID in the POST /api/transfers request.
An example POST /api/transfers request body is below:
{
"transfer_type": "inter_account",
"quote_guid": "<insert quote_guid>",
"source_platform_account": "<trading account guid>",
"destination_platform_account": "<storage account guid>",
}When executed, the following response body will be returned:
{
"created_at": "<created_at timestamp>",
"updated_at": "<updated_at timestamp>",
"guid": "<created transfer_guid>",
"transfer_type": "inter_account",
"customer_guid": "<customer_guid>",
"quote_guid": "<inserted quote_guid>",
"external_bank_account_guid": null,
"asset": "BTC",
"side": "deposit",
"state": "storing",
"failure_code": null,
"amount": <inserted deliver_amount>,
"estimated_amount": <inserted deliver_amount>,
"fee": 0,
"source_account": {
"type": "trading",
"guid": "<trading account guid>",
"customer_guid": "<customer_guid>"
},
"source_participants": null,
"destination_account": {
"type": "storage",
"guid": "<storage account guid>",
"customer_guid": "<customer_guid>"
},
"destination_participants": null,
"labels": null
}Use the GET /api/transfers/{transfer_guid} endpoint to verify the "state" of the transfer.
Once the transfer has progressed to "state":"completed", use the GET /api/accounts/{account_guid}
endpoint to verify that the "platform_available" balance of the storage account has been credited to the
reflect the transfer amount.
4. Transfer crypto balance from the storage account
storage accountAt any time, crypto can be transferred out of the storage account back to the customer or bank's trading
account by first executing a quote with the source_platform_account set to the storage account guid and
the destination_platform_account set to the trading account guid.
Once a quote has been executed, an inter_account transfer can be generated from the quote.
Updated 18 days ago
