Escrow Container Management

In order to use a user’s assets for your application, you must first require the user to transfer their ownership temporarily to Upland. Upland, in turn, locks these assets in a vault-like account. In Upland terminology, this vault-like account, controlled by Upland, is called an escrow account.

The developer is responsible for specifying necessary assets the users have to transfer to the escrow account to use your application (for example, a drag car-racing application will need a user to place at least one block explore and one car in the escrow to participate).

Within the escrow account, each application is assigned an escrow container, which contains transferred assets necessary to use the application.

At junctions determined by your application logic, your application can request a resolution of its escrow container (for example, at the end of a drag car-racing application, the loser loses his block explore to the winner).

You can also query the content of your application’s escrow container, request to extend its validity, etc.

The available assets the developers can use so far are:

  1. Block Explorers

  2. Structured Ornaments

  3. Spirit Legits

  4. Upx

  5. 3D Assets

Branded assets such as FIFA, Stock Car, and others need permission to be used.

Escrow Containers Transactions Status

Expired - Transactions not accepted/rejected in time;

Rejected - Transaction which players rejected;

User_signature_requested - When the app sends the request to players';

Changing_ownership - When the transaction is being registered in the blockchain (It can take up to three minutes); - Player to Escrow or Escrow to player

In_escrow - Assets inside the container ready for resolution;

Refunded - Transactions in which assets were given back to players;

Removed - Transactions that were deleted from the container before players' acceptance or rejection;

API Definition

These endpoints require Basic Authentication. Click here to read more about how to generate valid credentials.

Create a new escrow container

The third-party application will be able to create a new container in the escrow to receive user assets.

The container times out after the lesser of the developer’s desired container time to live.

The webhook URL will be used by the escrow service to communicate with third-party apps about the transaction status in the container.

POST/containers
Authorization
Response
Body
id*number

Container Id

appId*number

Application Id

expirationDate*string (date-time)

Container expiration date

status*enum

Container status

createdlockedprocessingresolvedexpired
Request
const response = await fetch('/containers', {
    method: 'POST',
    headers: {
      "Authorization": "basic <token>"
    },
});
const data = await response.json();
Response
{
  "id": 25,
  "appId": 56,
  "expirationDate": "2022-09-30T09:15:46.993Z",
  "status": "created"
}

Query Escrow Container

Retrieve container information by id, including expiration time. The possible values for the container status are created, locked, processing, resolved, and expired.

GET/containers/{containerId}
Authorization
Path parameters
containerId*number
Response
Body
id*number

Container Id

appId*number

Application Id

expirationDate*string (date-time)

Container expiration date

status*enum

Container status

createdlockedprocessingresolvedexpired
upx*number

Amount of UPX with status in_escrow

spark*number

Amount of SPARK with status in_escrow

assets*array of AssetTransferRequestResponse (object)

List of transfer requests

Request
const response = await fetch('/containers/{containerId}', {
    method: 'GET',
    headers: {
      "Authorization": "basic <token>"
    },
});
const data = await response.json();
Response
{
  "id": 25,
  "appId": 56,
  "expirationDate": "2022-09-30T09:15:46.996Z",
  "status": "created",
  "upx": 10000,
  "spark": 5,
  "assets": [
    {
      "id": 25,
      "transactionId": "e5e0df15-16d8-4dd4-9ecf-669dee4a80e3",
      "amount": 25,
      "assetId": 2,
      "category": "blkexplorer",
      "ownerEosId": "df8447hf",
      "status": "initiated"
    }
  ]
}

Refresh Expiration time of Escrow Container

Refresh the container expiration for the same amount of time previously informed.

POST/containers/{containerId}/refresh-expiration-time
Authorization
Path parameters
containerId*number
Response
Request
const response = await fetch('/containers/{containerId}/refresh-expiration-time', {
    method: 'POST',
    headers: {
      "Authorization": "basic <token>"
    },
});
const data = await response.json();

Locks the escrow container (Optional)

This action will lock the container. After this action users can not join this container. This doesn't apply to all 3p apps. It's an optional call if a third party wants to make sure that no one else will enter the container.

POST/containers/{containerId}/lock
Authorization
Path parameters
containerId*number
Response
Request
const response = await fetch('/containers/{containerId}/lock', {
    method: 'POST',
    headers: {
      "Authorization": "basic <token>"
    },
});
const data = await response.json();

To use the resolve endpoint, all assets inside the container must have the status "in_scrow".

Execute operations over the escrow assets and resolve container

Send some operations in batch to be executed over the escrow assets and UPXs.

This call is the final resolution. At this moment Escrow Service will execute transactions and close the container. If there are assets remaining, they will return to the account source.

POST/containers/{containerId}/resolve
Authorization
Path parameters
containerId*number
Body
actionsarray of ResolveContainerActionDto (object)

Actions

Response
Body
transactionId*string

Transaction Id

Request
const response = await fetch('/containers/{containerId}/resolve', {
    method: 'POST',
    headers: {
      "Authorization": "basic <token>",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({}),
});
const data = await response.json();
Response
{
  "transactionId": "e5e0df15-16d8-4dd4-9ecf-669dee4a80e3"
}

Refund container assets

It sends back the assets inside the container to the original owners (no fees) and resolves the container.

POST/containers/{containerId}/refund
Authorization
Path parameters
containerId*number
Response
Body
transactionId*string

Transaction Id

Request
const response = await fetch('/containers/{containerId}/refund', {
    method: 'POST',
    headers: {
      "Authorization": "basic <token>"
    },
});
const data = await response.json();
Response
{
  "transactionId": "e5e0df15-16d8-4dd4-9ecf-669dee4a80e3"
}

Remove a transaction from container

Removes a transaction that has not been signed by the user from container.

DELETE/containers/{containerId}/transactions/{transactionId}
Authorization
Path parameters
containerId*number
transactionId*string
Response
Request
const response = await fetch('/containers/{containerId}/transactions/{transactionId}', {
    method: 'DELETE',
    headers: {
      "Authorization": "basic <token>"
    },
});
const data = await response.json();

You must provide a Code to your users generated across the endpoint /auth/opt/init. Then, when Upland User grants access to the developer App, a webhook will be sent with a valid access token. Click here to check the authentication session.

Put assets in escrow container

Send a list of user assets that will be added to the escrow container. This action must be approved by Upland User inside the Upland Application to be performed.

POST/user/join
Authorization
Body
containerId*number

Container Id

upxAmountnumber

Amount of UPX to include in escrow

sparkAmountnumber

Amount of SPARK to include in escrow (IMPORTANT: SPARK transactions are temporarily blocked)

assetsarray of AssetDto (object)

Assets

Response
Body
transactionId*string

Transaction Id

Request
const response = await fetch('/user/join', {
    method: 'POST',
    headers: {
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "containerId": 123
    }),
});
const data = await response.json();
Response
{
  "transactionId": "ac60eb8a-9c32-4f78-b407-1c0396a645e2"
}

Last updated