# Each db table will have these columns: - created datetime - updated datetime - threadid - parentid - id - signature # GET /offerings tbDEX offering response to Alice ```javascript { id : 'tbdex:offering:123', description : 'BTC -> KES offramp by YC', // GET /rates rate.buy, conver USD-KES from rate.buy to BTC-KES (maths) quoteUnitsPerBaseUnit : '0.00000024', baseCurrency : { currencyCode : 'KES', minSubunits : '1', // GET /channels use channel.min maxSubunits : '100000000' // GET /channels use channel.max }, quoteCurrency: { currencyCode : 'BTC', minSubunits : '1000', maxSubunits : '10000' }, credentialRequirements: 'ey...', // JWS of... PD with proof object? payinMethods: [{ kind : 'BTC_CUSTODIAL_BALANCE', }], // this implies YC PFI would store the associated channelId and networkId per each payment method // and do a lookup when it receives an RFQ payoutMethods: [{ // i.e. 'BANKACCOUNT_DIAMONDBANK' // flattened CHANNELNAME_NETWORKNAME that is a valid combination kind : 'MOMO_MPESA', // TODO: add this to tbdex offering type? description : 'Get mobile money payout via MPESA telco', // GET /channels channel.feeUSD convert to cents feeSubunits : '10', requiredPaymentDetails : { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Mobile Money withdrawal via MPESA required info", "type": "object", "additionalProperties": false, "properties": { "recipientName": { "description": "Recipient Full Name", "type": "string" }, "recipientAccountNumber": { "description": "Recipient Phone Number", "type": "string" }, "senderName": { "description": "Sender Full Name", "type": "string" } } } }], createdTime: '2023-06-27T12:34:56Z' // TODO: do we want to add updatedTime field in tbDEX offering type? } ``` ^ converted to db tables: ## Offerings - id - credentialRequirements - baseCurrencyCode - baseCurrencyMinSubunits - baseCurrencyMaxSubunits - quoteCurrencyCode - quoteCurrencyMinSubunits - quoteCurrencyMaxSubunits ## PayoutMethods - kind - channelId - networkId - fee - offeringId (FK from `Offerings.id`) # POST /rfqs tbDEX rfq request from Alice ```javascript { ...metadata, id : 'tbdex:rfq:456', type : 'rfq', body : { offeringId : 'tbdex:offering:123', quoteAmountSubunits : '1000', credentials : { ... }, payinMethod : { kind: 'BTC_BALANCE' }, payoutMethod: { kind : 'MOMO_MPESA', paymentDetails : { 'accountName': 'James Falola', 'accountNumber': '1111111111', } } } } ``` alternatively, use hash and sign over the hash, have pii in a separate object (don't sign over the actual pii object) - provides a way for us to return GET /threads with valid signature that can be verified when we regurgitate it back to us ```javascript { ...metadata, id : 'tbdex:rfq:456', type : 'rfq', body : { offeringId : 'tbdex:offering:123', quoteAmountSubunits : '1000', credentialHash : '...', payinMethod : { kind: 'BTC_BALANCE' }, payoutMethod: { kind : 'MOMO_MPESA', // todo: change to hash value? paymentDetailsHash : '...' }, actualPii: { credentials: { ... }, // needed if VC ends up including PII payoutMethodPaymentDetails: { 'accountName': 'James Falola', 'accountNumber': '1111111111', } } } } ``` ^ converted to db table ## RFQs *: think about DSL considerations, DSL3+4 fields - offeringId - quoteAmountSubunits - credentials* - piiHash - payinMethodJsonBlob - payoutMethodJsonBlob* or like this: - offeringId - quoteAmountSubunits - credentialHash - payinMethodJsonBlob - payoutMethodJsonBlob - actualPiiCredential* - actualPiiPayoutMethodpaymentDetails* # GET /thread/:threadId/quote tbDEX quote response to Alice ```javascript { ...metadata, id : 'tbdex:quote:543', type : 'quote', body : { expiryTime : "2023-08-05T02:15:06.462Z", base : { currencyCode : 'KES', amountSubunits : '33333' }, quote: { currencyCode : 'BTC', amountSubunits : '1000', feeSubunits : '100' } } } ``` ^ converted to db table ## Quote - paymentId (from YC POST /payments response body.id) - expirationTime (from YC POST /payments response body.expiresAt) - rfqId (isn't this already exposed in parentId?) - baseCurrencyCode - baseAmountSubunits - baseFeeSubunits - quoteCurrencyCode - quoteAmountSubunits - quoteFeeSubunits # POST /thread/:threadId/order tbDEX order request from Alice ```javascript { ...metadata, id: 'tbdex:order:678', type: 'order', body: { quote_id: 'tbdex:quote:456' } } ``` ^ converted to db table ## Order - quoteId (isn't this already exposed in parentId?) - status (initially null, updated after we call POST /payments/:paymentId/accept, and also webhooks) ## OrderStatus (may not need this?) - orderId (FK from Order.id) - status (initially null, updated after we call POST /payments/:paymentId/accept, and also webhooks) # GET /thread/:threadId/orderstatus tbDEX order status ```javascript { ...metadata, id: 'tbdex:orderstatus:566', type: 'orderstatus', body: { order_id: 'tbdex:order:643', status: 'pending' } } ```