title | description | ms.date | ms.topic | ms.reviewer |
---|---|---|---|---|
Azure Blockchain Workbench configuration metadata reference |
Azure Blockchain Workbench Preview application configuration metadata overview. |
02/18/2022 |
article |
brendal |
[!INCLUDE Retirement note]
Azure Blockchain Workbench applications are multi-party workflows defined by configuration metadata and smart contract code. Configuration metadata defines the high-level workflows and interaction model of the blockchain application. Smart contracts define the business logic of the blockchain application. Workbench uses configuration and smart contract code to generate blockchain application user experiences.
Configuration metadata specifies the following information for each blockchain application:
- Name and description of the blockchain application
- Unique roles for users who can act or participate within the blockchain application
- One or more workflows. Each workflow acts as a state machine to control the flow of the business logic. Workflows can be independent or interact with one another.
Each defined workflow specifies the following:
- Name and description of the workflow
- States of the workflow. Each state is a stage in the business logic's control flow.
- Actions to transition to the next state
- User roles permitted to initiate each action
- Smart contracts that represent business logic in code files
A blockchain application contains configuration metadata, workflows, and user roles who can act or participate within the application.
Field | Description | Required |
---|---|---|
ApplicationName | Unique application name. The corresponding smart contract must use the same ApplicationName for the applicable contract class. | Yes |
DisplayName | Friendly display name of the application. | Yes |
Description | Description of the application. | No |
ApplicationRoles | Collection of ApplicationRoles. User roles who can act or participate within the application. | Yes |
Workflows | Collection of Workflows. Each workflow acts as a state machine to control the flow of the business logic. | Yes |
For an example, see configuration file example.
An application's business logic may be modeled as a state machine where taking an action causes the flow of the business logic to move from one state to another. A workflow is a collection of such states and actions. Each workflow consists of one or more smart contracts, which represent the business logic in code files. An executable contract is an instance of a workflow.
Field | Description | Required | Max length |
---|---|---|---|
Name | Unique workflow name. The corresponding smart contract must use the same Name for the applicable contract class. | Yes | 50 |
DisplayName | Friendly display name of the workflow. | Yes | 255 |
Description | Description of the workflow. | No | 255 |
Initiators | Collection of ApplicationRoles. Roles that are assigned to users who are authorized to create contracts in the workflow. | Yes | |
StartState | Name of the initial state of the workflow. | Yes | |
Properties | Collection of identifiers. Represents data that can be read off-chain or visualized in a user experience tool. | Yes | |
Constructor | Defines input parameters for creating an instance of the workflow. | Yes | |
Functions | A collection of functions that can be executed in the workflow. | Yes | |
States | A collection of workflow states. | Yes |
For an example, see configuration file example.
Supported data types.
Type | Description |
---|---|
address | Blockchain address type, such as contracts or users. |
array | Single level array of type integer, bool, money, or time. Arrays can be static or dynamic. Use ElementType to specify the datatype of the elements within the array. See example configuration. |
bool | Boolean data type. |
contract | Address of type contract. |
enum | Enumerated set of named values. When using the enum type, you also specify a list of EnumValues. Each value is limited to 255 characters. Valid value characters include upper and lower case letters (A-Z, a-z) and numbers (0-9). See example configuration and use in Solidity. |
int | Integer data type. |
money | Money data type. |
state | Workflow state. |
string | String data type. 4000 character maximum. See example configuration. |
user | Address of type user. |
time | Time data type. |
[ Application Role Name ] |
Any name specified in application role. Limits users to be of that role type. |
{
"Name": "Quotes",
"Description": "Market quotes",
"DisplayName": "Quotes",
"Type": {
"Name": "array",
"ElementType": {
"Name": "int"
}
}
}
If you define a property as type array in configuration, you need to include an explicit get function to return the public property of the array type in Solidity. For example:
function GetQuotes() public constant returns (int[]) {
return Quotes;
}
{
"Name": "description",
"Description": "Descriptive text",
"DisplayName": "Description",
"Type": {
"Name": "string"
}
}
{
"Name": "PropertyType",
"DisplayName": "Property Type",
"Description": "The type of the property",
"Type": {
"Name": "enum",
"EnumValues": ["House", "Townhouse", "Condo", "Land"]
}
}
Once an enum is defined in configuration, you can use enumeration types in Solidity. For example, you can define an enum called PropertyTypeEnum.
enum PropertyTypeEnum {House, Townhouse, Condo, Land} PropertyTypeEnum public PropertyType;
The list of strings needs to match between the configuration and smart contract to be valid and consistent declarations in Blockchain Workbench.
Assignment example:
PropertyType = PropertyTypeEnum.Townhouse;
Function parameter example:
function AssetTransfer(string description, uint256 price, PropertyTypeEnum propertyType) public
{
InstanceOwner = msg.sender;
AskingPrice = price;
Description = description;
PropertyType = propertyType;
State = StateType.Active;
ContractCreated();
}
Defines input parameters for an instance of a workflow.
Field | Description | Required |
---|---|---|
Parameters | Collection of identifiers required to initiate a smart contract. | Yes |
{
"Parameters": [
{
"Name": "description",
"Description": "The description of this asset",
"DisplayName": "Description",
"Type": {
"Name": "string"
}
},
{
"Name": "price",
"Description": "The price of this asset",
"DisplayName": "Price",
"Type": {
"Name": "money"
}
}
]
}
Defines functions that can be executed on the workflow.
Field | Description | Required | Max length |
---|---|---|---|
Name | The unique name of the function. The corresponding smart contract must use the same Name for the applicable function. | Yes | 50 |
DisplayName | Friendly display name of the function. | Yes | 255 |
Description | Description of the function | No | 255 |
Parameters | Collection of identifiers corresponding to the parameters of the function. | Yes |
"Functions": [
{
"Name": "Modify",
"DisplayName": "Modify",
"Description": "Modify the description/price attributes of this asset transfer instance",
"Parameters": [
{
"Name": "description",
"Description": "The new description of the asset",
"DisplayName": "Description",
"Type": {
"Name": "string"
}
},
{
"Name": "price",
"Description": "The new price of the asset",
"DisplayName": "Price",
"Type": {
"Name": "money"
}
}
]
},
{
"Name": "Terminate",
"DisplayName": "Terminate",
"Description": "Used to cancel this particular instance of asset transfer",
"Parameters": []
}
]
A collection of unique states within a workflow. Each state captures a step in the business logic's control flow.
Field | Description | Required | Max length |
---|---|---|---|
Name | Unique name of the state. The corresponding smart contract must use the same Name for the applicable state. | Yes | 50 |
DisplayName | Friendly display name of the state. | Yes | 255 |
Description | Description of the state. | No | 255 |
PercentComplete | An integer value displayed in the Blockchain Workbench user interface to show the progress within the business logic control flow. | Yes | |
Style | Visual hint indicating whether the state represents a success or failure state. There are two valid values: Success or Failure . |
Yes | |
Transitions | Collection of available transitions from the current state to the next set of states. | No |
"States": [
{
"Name": "Active",
"DisplayName": "Active",
"Description": "The initial state of the asset transfer workflow",
"PercentComplete": 20,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancels this instance of asset transfer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate Offer"
},
{
"AllowedRoles": [ "Buyer" ],
"AllowedInstanceRoles": [],
"Description": "Make an offer for this asset",
"Function": "MakeOffer",
"NextStates": [ "OfferPlaced" ],
"DisplayName": "Make Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Modify attributes of this asset transfer instance",
"Function": "Modify",
"NextStates": [ "Active" ],
"DisplayName": "Modify"
}
]
},
{
"Name": "Accepted",
"DisplayName": "Accepted",
"Description": "Asset transfer process is complete",
"PercentComplete": 100,
"Style": "Success",
"Transitions": []
},
{
"Name": "Terminated",
"DisplayName": "Terminated",
"Description": "Asset transfer has been canceled",
"PercentComplete": 100,
"Style": "Failure",
"Transitions": []
}
]
Available actions to the next state. One or more user roles may perform an action at each state, where an action may transition a state to another state in the workflow.
Field | Description | Required |
---|---|---|
AllowedRoles | List of applications roles allowed to initiate the transition. All users of the specified role may be able to perform the action. | No |
AllowedInstanceRoles | List of user roles participating or specified in the smart contract allowed to initiate the transition. Instance roles are defined in Properties within workflows. AllowedInstanceRoles represent a user participating in an instance of a smart contract. AllowedInstanceRoles give you the ability to restrict taking an action to a user role in a contract instance. For example, you may only want to allow the user who created the contract (InstanceOwner) to be able to terminate rather than all users in role type (Owner) if you specified the role in AllowedRoles. | No |
DisplayName | Friendly display name of the transition. | Yes |
Description | Description of the transition. | No |
Function | The name of the function to initiate the transition. | Yes |
NextStates | A collection of potential next states after a successful transition. | Yes |
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancels this instance of asset transfer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate Offer"
},
{
"AllowedRoles": [ "Buyer" ],
"AllowedInstanceRoles": [],
"Description": "Make an offer for this asset",
"Function": "MakeOffer",
"NextStates": [ "OfferPlaced" ],
"DisplayName": "Make Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Modify attributes of this asset transfer instance",
"Function": "Modify",
"NextStates": [ "Active" ],
"DisplayName": "Modify"
}
]
Application roles define a set of roles that can be assigned to users who want to act or participate within the application. Application roles can be used to restrict actions and participation within the blockchain application and corresponding workflows.
Field | Description | Required | Max length |
---|---|---|---|
Name | The unique name of the application role. The corresponding smart contract must use the same Name for the applicable role. Base type names are reserved. You cannot name an application role with the same name as Type | Yes | 50 |
Description | Description of the application role. | No | 255 |
"ApplicationRoles": [
{
"Name": "Appraiser",
"Description": "User that signs off on the asset price"
},
{
"Name": "Buyer",
"Description": "User that places an offer on an asset"
}
]
Identifiers represent a collection of information used to describe workflow properties, constructor, and function parameters.
Field | Description | Required | Max length |
---|---|---|---|
Name | The unique name of the property or parameter. The corresponding smart contract must use the same Name for the applicable property or parameter. | Yes | 50 |
DisplayName | Friendly display name for the property or parameter. | Yes | 255 |
Description | Description of the property or parameter. | No | 255 |
Type | Property data type. | Yes |
"Properties": [
{
"Name": "State",
"DisplayName": "State",
"Description": "Holds the state of the contract",
"Type": {
"Name": "state"
}
},
{
"Name": "Description",
"DisplayName": "Description",
"Description": "Describes the asset being sold",
"Type": {
"Name": "string"
}
}
]
Asset transfer is a smart contract scenario for buying and selling high value assets, which require an inspector and appraiser. Sellers can list their assets by instantiating an asset transfer smart contract. Buyers can make offers by taking an action on the smart contract, and other parties can take actions to inspect or appraise the asset. Once the asset is marked both inspected and appraised, the buyer and seller will confirm the sale again before the contract is set to complete. At each point in the process, all participants have visibility into the state of the contract as it is updated.
For more information including the code files, see asset transfer sample for Azure Blockchain Workbench
The following configuration file is for the asset transfer sample:
{
"ApplicationName": "AssetTransfer",
"DisplayName": "Asset Transfer",
"Description": "Allows transfer of assets between a buyer and a seller, with appraisal/inspection functionality",
"ApplicationRoles": [
{
"Name": "Appraiser",
"Description": "User that signs off on the asset price"
},
{
"Name": "Buyer",
"Description": "User that places an offer on an asset"
},
{
"Name": "Inspector",
"Description": "User that inspects the asset and signs off on inspection"
},
{
"Name": "Owner",
"Description": "User that signs off on the asset price"
}
],
"Workflows": [
{
"Name": "AssetTransfer",
"DisplayName": "Asset Transfer",
"Description": "Handles the business logic for the asset transfer scenario",
"Initiators": [ "Owner" ],
"StartState": "Active",
"Properties": [
{
"Name": "State",
"DisplayName": "State",
"Description": "Holds the state of the contract",
"Type": {
"Name": "state"
}
},
{
"Name": "Description",
"DisplayName": "Description",
"Description": "Describes the asset being sold",
"Type": {
"Name": "string"
}
},
{
"Name": "AskingPrice",
"DisplayName": "Asking Price",
"Description": "The asking price for the asset",
"Type": {
"Name": "money"
}
},
{
"Name": "OfferPrice",
"DisplayName": "Offer Price",
"Description": "The price being offered for the asset",
"Type": {
"Name": "money"
}
},
{
"Name": "InstanceAppraiser",
"DisplayName": "Instance Appraiser",
"Description": "The user that appraises the asset",
"Type": {
"Name": "Appraiser"
}
},
{
"Name": "InstanceBuyer",
"DisplayName": "Instance Buyer",
"Description": "The user that places an offer for this asset",
"Type": {
"Name": "Buyer"
}
},
{
"Name": "InstanceInspector",
"DisplayName": "Instance Inspector",
"Description": "The user that inspects this asset",
"Type": {
"Name": "Inspector"
}
},
{
"Name": "InstanceOwner",
"DisplayName": "Instance Owner",
"Description": "The seller of this particular asset",
"Type": {
"Name": "Owner"
}
}
],
"Constructor": {
"Parameters": [
{
"Name": "description",
"Description": "The description of this asset",
"DisplayName": "Description",
"Type": {
"Name": "string"
}
},
{
"Name": "price",
"Description": "The price of this asset",
"DisplayName": "Price",
"Type": {
"Name": "money"
}
}
]
},
"Functions": [
{
"Name": "Modify",
"DisplayName": "Modify",
"Description": "Modify the description/price attributes of this asset transfer instance",
"Parameters": [
{
"Name": "description",
"Description": "The new description of the asset",
"DisplayName": "Description",
"Type": {
"Name": "string"
}
},
{
"Name": "price",
"Description": "The new price of the asset",
"DisplayName": "Price",
"Type": {
"Name": "money"
}
}
]
},
{
"Name": "Terminate",
"DisplayName": "Terminate",
"Description": "Used to cancel this particular instance of asset transfer",
"Parameters": []
},
{
"Name": "MakeOffer",
"DisplayName": "Make Offer",
"Description": "Place an offer for this asset",
"Parameters": [
{
"Name": "inspector",
"Description": "Specify a user to inspect this asset",
"DisplayName": "Inspector",
"Type": {
"Name": "Inspector"
}
},
{
"Name": "appraiser",
"Description": "Specify a user to appraise this asset",
"DisplayName": "Appraiser",
"Type": {
"Name": "Appraiser"
}
},
{
"Name": "offerPrice",
"Description": "Specify your offer price for this asset",
"DisplayName": "Offer Price",
"Type": {
"Name": "money"
}
}
]
},
{
"Name": "Reject",
"DisplayName": "Reject",
"Description": "Reject the user's offer",
"Parameters": []
},
{
"Name": "AcceptOffer",
"DisplayName": "Accept Offer",
"Description": "Accept the user's offer",
"Parameters": []
},
{
"Name": "RescindOffer",
"DisplayName": "Rescind Offer",
"Description": "Rescind your placed offer",
"Parameters": []
},
{
"Name": "ModifyOffer",
"DisplayName": "Modify Offer",
"Description": "Modify the price of your placed offer",
"Parameters": [
{
"Name": "offerPrice",
"DisplayName": "Price",
"Type": {
"Name": "money"
}
}
]
},
{
"Name": "Accept",
"DisplayName": "Accept",
"Description": "Accept the inspection/appraisal results",
"Parameters": []
},
{
"Name": "MarkInspected",
"DisplayName": "Mark Inspected",
"Description": "Mark the asset as inspected",
"Parameters": []
},
{
"Name": "MarkAppraised",
"DisplayName": "Mark Appraised",
"Description": "Mark the asset as appraised",
"Parameters": []
}
],
"States": [
{
"Name": "Active",
"DisplayName": "Active",
"Description": "The initial state of the asset transfer workflow",
"PercentComplete": 20,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancels this instance of asset transfer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate Offer"
},
{
"AllowedRoles": [ "Buyer" ],
"AllowedInstanceRoles": [],
"Description": "Make an offer for this asset",
"Function": "MakeOffer",
"NextStates": [ "OfferPlaced" ],
"DisplayName": "Make Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Modify attributes of this asset transfer instance",
"Function": "Modify",
"NextStates": [ "Active" ],
"DisplayName": "Modify"
}
]
},
{
"Name": "OfferPlaced",
"DisplayName": "Offer Placed",
"Description": "Offer has been placed for the asset",
"PercentComplete": 30,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Accept the proposed offer for the asset",
"Function": "AcceptOffer",
"NextStates": [ "PendingInspection" ],
"DisplayName": "Accept Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Reject the proposed offer for the asset",
"Function": "Reject",
"NextStates": [ "Active" ],
"DisplayName": "Reject"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancel this instance of asset transfer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Rescind the offer you previously placed for this asset",
"Function": "RescindOffer",
"NextStates": [ "Active" ],
"DisplayName": "Rescind Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Modify the price that you specified for your offer",
"Function": "ModifyOffer",
"NextStates": [ "OfferPlaced" ],
"DisplayName": "Modify Offer"
}
]
},
{
"Name": "PendingInspection",
"DisplayName": "Pending Inspection",
"Description": "Asset is pending inspection",
"PercentComplete": 40,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Reject the offer",
"Function": "Reject",
"NextStates": [ "Active" ],
"DisplayName": "Reject"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancel the offer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Rescind the offer you placed for this asset",
"Function": "RescindOffer",
"NextStates": [ "Active" ],
"DisplayName": "Rescind Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceInspector" ],
"Description": "Mark this asset as inspected",
"Function": "MarkInspected",
"NextStates": [ "Inspected" ],
"DisplayName": "Mark Inspected"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceAppraiser" ],
"Description": "Mark this asset as appraised",
"Function": "MarkAppraised",
"NextStates": [ "Appraised" ],
"DisplayName": "Mark Appraised"
}
]
},
{
"Name": "Inspected",
"DisplayName": "Inspected",
"PercentComplete": 45,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Reject the offer",
"Function": "Reject",
"NextStates": [ "Active" ],
"DisplayName": "Reject"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancel the offer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Rescind the offer you placed for this asset",
"Function": "RescindOffer",
"NextStates": [ "Active" ],
"DisplayName": "Rescind Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceAppraiser" ],
"Description": "Mark this asset as appraised",
"Function": "MarkAppraised",
"NextStates": [ "NotionalAcceptance" ],
"DisplayName": "Mark Appraised"
}
]
},
{
"Name": "Appraised",
"DisplayName": "Appraised",
"Description": "Asset has been appraised, now awaiting inspection",
"PercentComplete": 45,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Reject the offer",
"Function": "Reject",
"NextStates": [ "Active" ],
"DisplayName": "Reject"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancel the offer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Rescind the offer you placed for this asset",
"Function": "RescindOffer",
"NextStates": [ "Active" ],
"DisplayName": "Rescind Offer"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceInspector" ],
"Description": "Mark the asset as inspected",
"Function": "MarkInspected",
"NextStates": [ "NotionalAcceptance" ],
"DisplayName": "Mark Inspected"
}
]
},
{
"Name": "NotionalAcceptance",
"DisplayName": "Notional Acceptance",
"Description": "Asset has been inspected and appraised, awaiting final sign-off from buyer and seller",
"PercentComplete": 50,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Sign-off on inspection and appraisal",
"Function": "Accept",
"NextStates": [ "SellerAccepted" ],
"DisplayName": "SellerAccept"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Reject the proposed offer for the asset",
"Function": "Reject",
"NextStates": [ "Active" ],
"DisplayName": "Reject"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancel this instance of asset transfer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Sign-off on inspection and appraisal",
"Function": "Accept",
"NextStates": [ "BuyerAccepted" ],
"DisplayName": "BuyerAccept"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Rescind the offer you placed for this asset",
"Function": "RescindOffer",
"NextStates": [ "Active" ],
"DisplayName": "Rescind Offer"
}
]
},
{
"Name": "BuyerAccepted",
"DisplayName": "Buyer Accepted",
"Description": "Buyer has signed-off on inspection and appraisal",
"PercentComplete": 75,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Sign-off on inspection and appraisal",
"Function": "Accept",
"NextStates": [ "SellerAccepted" ],
"DisplayName": "Accept"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Reject the proposed offer for the asset",
"Function": "Reject",
"NextStates": [ "Active" ],
"DisplayName": "Reject"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceOwner" ],
"Description": "Cancel this instance of asset transfer",
"Function": "Terminate",
"NextStates": [ "Terminated" ],
"DisplayName": "Terminate"
}
]
},
{
"Name": "SellerAccepted",
"DisplayName": "Seller Accepted",
"Description": "Seller has signed-off on inspection and appraisal",
"PercentComplete": 75,
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Sign-off on inspection and appraisal",
"Function": "Accept",
"NextStates": [ "Accepted" ],
"DisplayName": "Accept"
},
{
"AllowedRoles": [],
"AllowedInstanceRoles": [ "InstanceBuyer" ],
"Description": "Rescind the offer you placed for this asset",
"Function": "RescindOffer",
"NextStates": [ "Active" ],
"DisplayName": "Rescind Offer"
}
]
},
{
"Name": "Accepted",
"DisplayName": "Accepted",
"Description": "Asset transfer process is complete",
"PercentComplete": 100,
"Style": "Success",
"Transitions": []
},
{
"Name": "Terminated",
"DisplayName": "Terminated",
"Description": "Asset transfer has been canceled",
"PercentComplete": 100,
"Style": "Failure",
"Transitions": []
}
]
}
]
}
[!div class="nextstepaction"] Azure Blockchain Workbench REST API reference