Ask us anything. We're here to help.

Retail Digital Asset Deposits


FAQ

Can our platform accept retail deposits?

Yes! Platforms can now create digital asset addresses for retail end users for all UTXO, Tag, and Ethereum based tokens. 

How can I start creating retail deposit addresses?

This feature is not enabled by default. If your organization is interested in using this feature, please get in touch with a Zero Hash representative.

For further details on the retail deposit address creation see API section below.

How do you support Ethereum based token retail deposits?

Zero Hash has implemented forwarding smart contracts to accept retail deposits. This means your retail customer has a single dedicated address to deposit all Ethereum based tokens to it. This wallet address has to first go through a smart contract wallet that is managed by Zero Hash.

Are there any deposit address creation fees?

Most deposit addresses can be created for free. For UTXO and Tag based assets, there are no deposit address creation fees.

Ethereum and ERC-20 addresses require an initial variable on-chain fee to create a retail customer deposit contract. Only one network fee per customer is required to create a dedicated address to deposit all their ERC-20 related tokens.

If you are operating a platform, it is recommended to hold a sufficient Ether balance in your account to allow for network fees in creating deposit addresses for your customers. Insufficient balances can result in delays in creation and cause network fees to become outstanding which will be deducted from the platform operator's account upon the next deposit.

Why is Zero Hash using forwarding smart contracts ?

Forwarding smart contracts are used by Zero Hash to increase our Ethereum scaling capabilities and to reduce a platforms expected operational cost. Platform deposits are stored in their single corporate wallet. For Ethereum based asset this requires two movements.

Using forwarding smart contracts means that a platform will incur an initial address creation gas fee per customer, but no further gas fees to transfer the deposits into the their corporate wallet over the customer's lifetime.

Lets use an USDT deposit for example:

For new deposit address creation approach (non forwarding contract), the steps below are needed:

  1. Platform generates addresses for each user (Free)
  2. Customer deposits USDT to their address in step 1.
  3. Platform sends Ether to that user address for the fee in step 4 (Gas fee charged)
  4. Platform sends USDT to omnibus corporate wallet/cold wallet (Second gas fee charged)

Forwarding Smart Contract (FCS) approach:

  1. Platform deploys FSCs for each customer on demand, once per customer for all tokens (Gas fee charged)
  2. Customer deposits USDT to the FCS in step 1
  3. Platform triggers FCS to transfer USDT to omnibus corporate wallet/cold wallet

The non forwarding contract approach will incur a gas fee for step 4 on every Ethereum based token deposit, and a gas fee for step 3 every time the Ether balance is too low.

The forwarding smart contract approach will incur the gas fee for step 1 on every customer address created. The contract address should only be created on demand by platforms.

Why is my deposit address the same for all ETH and ERC-20 asset?

Retail customers will be provided with one forwarding smart contract address to support all their ETH and ERC-20 deposits. All ETH and ERC-20 assets go the same address. 

What happens if I send a different ERC-20 asset to my ETH address?

If you send an ERC-20 asset to your forwarding smart contract it will be credited as normal. The forwarding smart contract will detect what asset which was sent. NOTE: Only ETH and ERC-20 assets are supported to forwarding contract addresses. Sending any UTXO or tag based assets may result in loss of funds.

 

 

API Flow

Overview

For an end user looking to deposit assets with a platform, first the platform will need to create the address using `POST /deposits/digital_asset_addresses`. Doing this will return an address that the platform can relay to the end user. At this time, the end user will be able to send assets to this address from the third-party platform. Once the transaction has been confirmed on the network, Zero Hash will represent the transaction in an account for the user associated with the receiving address. The platform can use `GET /deposits` to see the transaction activity and `GET /accounts` to see the balance in the account for the prescribed asset.

Example

Use Case:

  • Zero Hash integrated platform, "Platform A" with participant code PLAT01, onboards a new customer, "Customer B" with participant code CUST01
  • Customer B wishes to deposit UNI (Uniswap ERC-20) being held in decentralized wallet to Platform A
  • To start, the Platform will need to create a unique wallet address for Customer B using `POST /deposits/digital_asset_addresses`

Sample Request Body:

{
"participant_code": "CUST01",
"asset": "UNI"
}

 

Sample Response:

{
"message": {
"created_at": 1647050013,
"address": "0x7f41A26C0CB9D5a1e57BE9cF10F8354b77CD8ab3",
"participant_code": "CUST01",
"asset": "UNI"
}
  • Customer B can direct a deposit to the generated address returned in the API call.
  • Customer B may now return to Platform B, where the platform where surface recent deposit activity. This can be done using `GET /deposits` and setting the optional query parameter of `include_customer_deposits=true`.

 

If this is the first time Customer B has owned this asset, Zero Hash will create an account for asset upon receipt of the deposit. 

Sample Response:

{
  "message": [
    {
      "settle_timestamp": 1647032013,
      "account_id": "80289ce5-072b-4739-929d-dcc5ccc542f3",
      "movement_id": "21bdbb11-712f-4cb7-a178-4f277c80cde0",
      "participant_code": "CUST01",
      "account_group": "PLAT01",
      "account_label": "general",
      "asset": "UNI",
      "amount": "20.0000", // the value of the received deposit 
      "reference_id": "0x6e764b804c3ff6abbafaf44ffa405f49db5ae9e7e757b5dcceab823d975dc069",
      "source": "0xd600Dc1AD6B244fA9be85D4911461373693799CA",
      "run_id": "12613"
    }
  ],
  "page": 1,
  "total_pages": 1
}
  • This indicates that the transfer to the newly created digital asset address for Customer B was received successfully and recognized to Customer B's account.
  • Customer B can then see their total account balance. This is retrieved using `GET /accounts` and the platform can also set the following query parameters to easily filter the results:
    • `account_owner=CUST01`
    • `account_group=PLAT01`
    • `account_label=general`
    • `asset=UNI`

Sample Response:

{
"message": [
{
"asset": "UNI",
"account_owner": "CUST01",
"account_type": "available",
"account_group": "PLAT01",
"account_label": "general",
"balance": "45.00", // the updated account balance since the deposit
"account_id": "80289ce5-072b-4739-929d-dcc5ccc542f3",
"last_update": 1647032013

}
],
"page": 1,
"total_pages": 1
}

 

*Please note that we currently do not support receipt of NFTs.