Transfer, Deposit, and Withdrawal Process

Cryptocurrency transfer, deposit, and withdrawal process

Overview

In the cryptocurrency (i.e., crypto) trading market, users often refer to cryptocurrency (i.e., coin) transferring from one crypto wallet to another as transfers, deposits, and withdrawals (or as sending and receiving coin).


Core Concepts and Functionality

Clients can enable crypto coin transfers for investors by implementing two use cases using the Bakkt Transfers API endpoints.

  1. Clients can allow investors to deposit crypto coin into their Bakkt accounts and send crypto coin from external, third-party wallets using the Deposit process described below.

  2. Clients can allow investors to withdraw crypto coin from their accounts and send crypto coin to external, third-party wallets following the Withdrawal process described below.

🚧

Cryptocurrency Risk

Sending and receiving crypto coin occurs completely outside of Bakkt's control; therefore, cryptocurrency transfers come with risks to clients and their investors. For this reason, clients must make important disclosures to their investors to ensure they are aware of, and accept, the risks.

Cryptocurrency Transfer Requests and Sell Orders

Estimates do not initiate nor reserve cryptocurrency (coin) for transferring to another digital wallet. If an investor initiates a sell order and then tries to initiate a coin transfer, the transfer process reduces the investor's current position by any outstanding sell orders and pending transfers prior to determining the amount of coin the investor can transfer. If an investor initiates a transfer, the investor's position decreases immediately. Bakkt initiates the request and considers the coin sent the moment the investor places the initial transfer request.

Wallet Types

Use the Verify Wallet Address to verify the validity of an address for a given coin. Bakkt supports the following wallet types and specifications.

Wallet Type

Specifications

BTC

Bakkt supports the following three formats for v2 wallets (all wallets from 2019 are v2 by default):

  1. Legacy (P2pKH) addresses that begin with the number 1
  2. P2SH addresses that begin with the number 3
  3. Native SegWit addresses that begin with bc1

BCH

Bakkt supports the legacy format of BCH; however, Bakkt does NOT support the CashAddr format of BCH or wallets that begin with bitcoincash or q

DOGE

Bakkt supports DOGE on the Dogecoin network

LTC

All addresses in LTC wallets are in the new format which begins with an M; however, users can still send to previously formatted addresses

ETC

Bakkt supports transfers on the Ethereum Classic network.

ETH

Bakkt supports the Ethereum mainnet network.

SHIB

Bakkt supports transfers for SHIB on the Ethereum mainnet network.

USDC

Bakkt supports transfers for USDC on the Ethereum mainnet network.

Coin Transfer File

Bakkt provides daily Coin Transfer files to clients in order to view cryptocurrency (i.e., crypto) transfers occurring in investor accounts. See the Coin Transfer File Details for additional information.


Deposit Cryptocurrency Workflow

Clients may request cryptocurrency deposits from blockchain wallet addresses into Bakkt’s custody. The investor receives the wallet address and then requests the deposit directly via the blockchain or the investor’s external wallet provider—not via the Bakkt system. See the following process steps for depositing cryptocurrency.

  1. Clients request a blockchain “receive” address from the Bakkt system using the Retrieve Wallet Addresses endpoint. The investor must supply the account number and cryptocurrency type to acquire a blockchain-recognized receive address in which to send the cryptocurrency.

  2. From the external wallet provider’s system, the investor must request to move cryptocurrency on the blockchain to the investor's Bakkt wallet ID from the "receive" address previously returned in the Retrieve Wallet Addresses endpoint request.

  3. When Bakkt receives the cryptocurrency and applies it to the investor’s account, it posts the transaction details to an AWS SQS queue for you to consume.

Bakkt tries to maintain the same wallet addresses for the same investor accounts in order to provide investors with dedicated wallet addresses; however, the best practice is for clients to ask for a "receive" address each time (even if it is the same), so that Bakkt has a verified receive address for each deposit transaction.

📘

No Risk Limits

Bakkt does not have the ability to limit deposits into investor accounts, so there are no applicable risk limits for clients to set.


Withdraw Cryptocurrency Workflow

📘

Travel Rule

Bakkt adheres to FinCEN’s Travel Rule. For withdrawals equal to or exceeding $3,000, users are required to self-disclose information about the ownership of the destination wallet address. This includes if it is self-hosted, the recipient name, and the recipient VASP name. Transactions to self-hosted wallets are exempt from Travel Rule requirements.

Clients send requests to withdraw cryptocurrency from their investors' accounts to external wallets on the blockchain. See the following process to withdraw cryptocurrency from investor accounts.

  1. Begin by using the Retrieve Fee Estimates endpoint to get a fee estimate for the withdrawal. The fee estimate is valid for five minutes and determines the fee for processing and submitting the withdrawal to the blockchain.

  2. Execute the withdrawal using the Create a Withdrawal Request endpoint. Clients must use the previously retrieved fee estimate to initiate a cryptocurrency withdrawal from an investor's account to a wallet on the blockchain. The request must also contain the address of the wallet in which to deposit the cryptocurrency. If a withdrawal is equal to or exceeding $3,000:

    • Clients are required to inquire with the customer if the wallet is self-hosted; self hosted wallet transfers are exempt from the Travel rule.
    • If the wallet is not self-hosted, clients must collect:
      • The name of the wallet owner.
      • The name of the wallet’s custodian.
  3. After Bakkt processes the withdrawal, clients receive the transfer details via API or AWS SQS.

Cryptocurrency withdrawals are subject to a risk setting that limits the notional amount transferable to an external wallet at any given time. Each client has a default risk setting and can adjust it per account. For more information about risk settings, contact Bakkt Support at[email protected].

The withdrawal fee is fixed and independent of the cryptocurrency amount withdrawn. Clients can request a fee estimate for the entire cryptocurrency balance in an account using the Retrieve Fee Estimates endpoint. By subtracting the fee estimate from the total balance, clients can determine the maximum amount available for withdrawal. Bakkt allows for the estimate to slightly exceed the actual cryptocurrency amount specified in the Create a Withdrawal Request endpoint.


Coin Transfer File

In order to view cryptocurrency (i.e., crypto) transfers occurring in investor accounts, Bakkt provides daily Coin Transfer files to clients in their Amazon Web Service (AWS) Simple Storage Service (S3) buckets. Each Coin Transfer file contains a list of investor accounts with current status for all crypto coin transfers at the time the report runs. If a transfer is not in a terminal state (e.g., COMPLETE, CANCELLED, or REJECTED) by the time the report runs, a record in the Coin Transfer file provides details that include the latest status. Once the transfer reaches a terminal status, the record includes the final terminal state in the Coin Transfer file. Transfers may take over an hour to complete, so a transfer may report a non-terminal status on one day with the expectation that the transfer reaches the terminal status on the next day. Clients may use this file to reconcile their systems' coin transfers versus Bakkt coin transfers.

The position file name convention is as follows: Apex Correspondent Code_YYYYMMDD-HHMMSS_coin_transfers.csv (e.g., XYYZ_20221201-164503_coin_transfer.csv). The Coin Transfer file includes the following fields.

FieldDescription
accountThe unique account identification number for the investor's account (e.g., XYZ12345)
created_atThe date/time in UTC of the transfer creation
apexcryptotransferidThe UUID that Bakkt assigns to the transfer transaction
client_transaction_idThe UUID that goes with all withdrawal requests; blank for deposits
currencyThe coin symbol for the transferring cryptocurrency coin
quantityThe quantity of the sending or receiving coin
typeThe coin transfer type (e.g., WITHDRAWAL or DEPOSIT)
feeestimateidThe ID for the estimated fees for the associated withdrawal; blank for deposits
feeThe fee for the withdrawal in coin transferring from the investor's account adding to the quantity of transferring coin; only coin withdrawals incur fees
totalquantityThe total amount of coin withdrawing or depositing to the investor's account
usdrateThe coin price at the time of transfer to calculate the estimated fee in USD and compare to sending transactional limits
receive_addressFor a WITHDRAWAL, this is the wallet address the investor specifies for the destination of the coin that is withdrawing and transferring out of the account; for a DEPOSIT, this is the wallet address receiving the funds (i.e., the investor's receiving address at Bakkt)
kytriskscoreThe risk score for the transaction from 0-10 to develop the decision; contact the Bakkt Compliance team with additional questions
kytdecisionThe decision for allowing the transaction to complete (e.g., APPROVED or DENIED)
block_chain_hashThe hash code for the send/receive transaction found on the blockchain
modified_atThe last modification date/time for the transaction
statusThe current status of the transaction (e.g., PENDING, IN_PROGRESS, COMPLETE, REJECTED, FAILED, ACCEPTED, CANCELLED)
selfHostedThis is a boolean field if true Travel Rule is not applicable
recipientFamilyNameThis travel rule eligible field requires the last name of the recipient
recipientGivenNameThis travel rule eligible field requires the first name of the recipient
vaspNameVirtual Asset Service Provider, is a required field for a travel rule eligible transaction

Timing
Bakkt runs files at 4:40 PM CT. During this time, the Bakkt system goes down for maintenance. At 5:00 PM CT each day, Bakkt delivers the Coin Transfer file to the client's AWS S3 bucket. Clients should contact the Bakkt support team if they notice any discrepancies.

Example

account	created_at	apexcryptotransferid	client_transaction_id	currency	quantity	type	feeestimateid	fee	totalquantity	usdrate	receive_address	kytriskscore	kytdecision	block_chain_hash	modified_at	status
XYZ12345	2022-12-01 13:45:00.147647+00:00	9fc94dba-7ca5-486b-a05a-8d2a3b48a9bb		BTC	0.01154704	DEPOSIT		0	0	0	33zGH1dPu1FwxtHKx65Lx5Fx1zMyc1e89	8	APPROVED	4232ccbc692fbc44353432b90e154ed1861fdca52e4945dc207670c412413544	2022-12-01 14:54:00.017243+00:00	COMPLETE
XYZ12345	2022-12-01 14:45:00.447647+00:00	b99515b0-3f2c-431c-afaa-520290037702		BTC	0.18	WITHDRAWAL		0.00013451	0.18013451	16904.78					2022-12-01 14:45:44.896880+00:00	REJECTED
XYZ12946	2022-12-01 14:46:00.000000+00:00	93f22fad-ecc5-4257-97fd-1cf7e4c6c394		BTC	0.17	WITHDRAWAL		0.00013451	0.17013451	16904.06	1HRpjyWn7XF82zzha2UxkvJjxLgfdL2f	1	APPROVED	vfojdsrfgvd9fgvisdcs9dfs9dfdsacsa9asdcascsadfw99a9c9asdc9a9sc9a8	2022-12-01 17:44:34.174645+00:00	COMPLETE