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.
-
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.
-
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 RiskSending 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):
|
BCH | Bakkt supports the legacy format of BCH; however, Bakkt does NOT support the CashAddr format of BCH or wallets that begin with |
DOGE | Bakkt supports DOGE on the Dogecoin network |
LTC | All addresses in LTC wallets are in the new format which begins with an |
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.
-
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.
-
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.
-
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 LimitsBakkt 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 RuleBakkt 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.
-
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.
-
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.
-
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.
Field | Description |
---|---|
account | The unique account identification number for the investor's account (e.g., XYZ12345) |
created_at | The date/time in UTC of the transfer creation |
apexcryptotransferid | The UUID that Bakkt assigns to the transfer transaction |
client_transaction_id | The UUID that goes with all withdrawal requests; blank for deposits |
currency | The coin symbol for the transferring cryptocurrency coin |
quantity | The quantity of the sending or receiving coin |
type | The coin transfer type (e.g., WITHDRAWAL or DEPOSIT) |
feeestimateid | The ID for the estimated fees for the associated withdrawal; blank for deposits |
fee | The fee for the withdrawal in coin transferring from the investor's account adding to the quantity of transferring coin; only coin withdrawals incur fees |
totalquantity | The total amount of coin withdrawing or depositing to the investor's account |
usdrate | The coin price at the time of transfer to calculate the estimated fee in USD and compare to sending transactional limits |
receive_address | For 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) |
kytriskscore | The risk score for the transaction from 0-10 to develop the decision; contact the Bakkt Compliance team with additional questions |
kytdecision | The decision for allowing the transaction to complete (e.g., APPROVED or DENIED) |
block_chain_hash | The hash code for the send/receive transaction found on the blockchain |
modified_at | The last modification date/time for the transaction |
status | The current status of the transaction (e.g., PENDING, IN_PROGRESS, COMPLETE, REJECTED, FAILED, ACCEPTED, CANCELLED) |
selfHosted | This is a boolean field if true Travel Rule is not applicable |
recipientFamilyName | This travel rule eligible field requires the last name of the recipient |
recipientGivenName | This travel rule eligible field requires the first name of the recipient |
vaspName | Virtual 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
Updated 24 days ago