BilateralTransferProtocol DEFINITIONS AUTOMATIC TAGS ::= BEGIN

IMPORTS UInt8, UInt32, UInt64, UInt128, UInt256 FROM GenericTypes ;

-- Zero or more protocolData entries, each with a unique -- protocolName, describe protocol-specific information about -- unpaid and conditionally paid requests and results -- sent over the BilateralTransferProtocol. -- The protocolName of each entry describes the protocol for -- interpreting the data. Peers need to establish beforehand -- which protocols each understand, and which names they -- use, which can be agreed ad-hoc, except that protocolName 'ilp' -- is reserved for the Interledger protocol. -- When multiple protocolData items are sent in a request, -- only the first one will be decisive in triggering the -- response, the rest of the protocolData items are considered -- side protocols that piggyback on the first one. -- The contentType byte can be used to allow debug tools to -- display the contents of the protocolData without understanding -- it.

ContentType ::= INTEGER { applicationOctetStream (0), textPlainUtf8 (1), applicationJson (2) } (0..255)

ProtocolData ::= SEQUENCE OF SEQUENCE { protocolName IA5String, contentType ContentType, data OCTET STRING }

-- Response and Error are the response types. -- When using these in a BTP packet, the requestId should match -- the requestId of the request they respond to.

Response ::= SEQUENCE { protocolData ProtocolData }

Error ::= SEQUENCE { -- Standardized error code code IA5String (SIZE (3)), -- Corresponding error code name IA5String, -- Time of emission triggeredAt GeneralizedTime, -- Additional data data OCTET STRING (SIZE (0..8192)), -- protocolData ProtocolData }

-- Prepare, Fulfill, Reject, and Message are the request types. -- Each request should have a unique requestId.

Prepare ::= SEQUENCE { transferId UInt128, amount UInt64, executionCondition UInt256, expiresAt GeneralizedTime, -- protocolData ProtocolData }

Fulfill ::= SEQUENCE { transferId UInt128, fulfillment UInt256, -- protocolData ProtocolData }

Reject ::= SEQUENCE { transferId UInt128, -- protocolData ProtocolData }

Message ::= SEQUENCE { protocolData ProtocolData }

Transfer ::= SEQUENCE { amount UInt64, -- protocolData ProtocolData }

CALL ::= CLASS { &typeId UInt8 UNIQUE, &Type } WITH SYNTAX {&typeId &Type}

CallSet CALL ::= { {1 Response} | {2 Error} | {3 Prepare} | {4 Fulfill} | {5 Reject} | {6 Message} | {7 Transfer} }

BilateralTransferProtocolPacket ::= SEQUENCE { -- One byte type ID type CALL.&typeId ({CallSet}), -- Used to associate requests and corresponding responses requestId UInt32, -- Length-prefixed main data data CALL.&Type ({CallSet}{@type}) }

END