diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 46ce0b98..0a4b2145 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -54,6 +54,7 @@ "@web5/credentials": "0.4.1", "@web5/crypto": "0.2.4", "@web5/dids": "0.2.4", + "@types/node": "^7.0.5", "ajv": "8.12.0", "bignumber.js": "^9.1.2", "canonicalize": "2.0.0", @@ -87,9 +88,9 @@ "build:esm": "rimraf dist/esm dist/types && tsc", "build:cjs": "rimraf dist/cjs && tsc -p tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./dist/cjs/package.json", "build:browser": "rimraf dist/browser.mjs dist/browser.js && node build/bundles.js", - "test:node": "rimraf tests/compiled && pnpm compile-validators && tsc -p tests/tsconfig.json && c8 mocha", + "test:node": "rimraf tests/compiled && pnpm compile-validators && tsc -p tests/tsconfig.json && mocha", "test:browser": "pnpm compile-validators && karma start karma.conf.cjs", - "generate-test-vectors": "tsc -p tests/tsconfig.json && node tests/compiled/tests/generate-test-vectors.js", + "generate-test-vectors": "tsc -p tests/tsconfig.json && node tests/compiled/packages/protocol/tests/generate-test-vectors.js", "build": "pnpm clean && pnpm compile-validators && pnpm build:esm && pnpm build:cjs && pnpm build:browser", "lint": "eslint . --ext .ts --max-warnings 0", "lint:fix": "eslint . --ext .ts --fix", diff --git a/packages/protocol/src/dev-tools.ts b/packages/protocol/src/dev-tools.ts index eb7e089a..fea5125e 100644 --- a/packages/protocol/src/dev-tools.ts +++ b/packages/protocol/src/dev-tools.ts @@ -29,31 +29,6 @@ export type RfqOptions = { receiver?: PortableDid } - -/** - * Options passed to {@link DevTools.createCredential} - * @beta - */ -export type CreateCredentialOptions = Omit & { - /** the credential type (e.g. UniversityDegreeCredential) */ - type: string - /** data to include in the credential */ - data: Record -} - -/** - * Options passed to {@link DevTools.createJwt} - * @beta - */ -export type CreateJwtOptions = { - /** the thing to sign */ - payload: any, - /** the JWT's subject (e.g. Alice's DID) */ - subject: string - /** the JWT's issuer */ - issuer: PortableDid -} - /** * Utility functions for testing purposes * @beta @@ -214,10 +189,10 @@ export class DevTools { * creates an example RfqData. Useful for testing purposes */ static async createRfqData(opts?: RfqOptions): Promise { - let credential: any = '' + let vcJwt: string = '' if (opts?.sender) { - const signedCredential = VerifiableCredential.create({ + const vc = await VerifiableCredential.create({ type : 'YoloCredential', issuer : opts.sender.did, subject : opts.sender.did, @@ -225,7 +200,7 @@ export class DevTools { 'beep': 'boop' } }) - credential = signedCredential + vcJwt = await vc.sign({ did: opts.sender }) } return { @@ -246,7 +221,7 @@ export class DevTools { } }, payinAmount : '200.00', - claims : [credential] + claims : [vcJwt] } } } \ No newline at end of file diff --git a/packages/protocol/tests/generate-test-vectors.ts b/packages/protocol/tests/generate-test-vectors.ts index 71cb72bc..8e550714 100644 --- a/packages/protocol/tests/generate-test-vectors.ts +++ b/packages/protocol/tests/generate-test-vectors.ts @@ -1,10 +1,11 @@ -import { DevTools, Message, Offering, Quote, Rfq } from '../src/main.js' +import { DidKeyMethod } from '@web5/dids' +import { VerifiableCredential } from '@web5/credentials' +import { Close, DevTools, Message, Order, OrderStatus, Quote, Rfq } from '../src/main.js' +import fs from 'fs' /** * Use this util when you are modifying or adding a new test vector to `tbdex`. */ - - type TestVector = { description: string input: string @@ -13,11 +14,8 @@ type TestVector = { } const generateParseOfferingVector = async () => { - const did = await DevTools.createDid() - const offering = Offering.create({ - metadata : { from: did.did }, - data : DevTools.createOfferingData() - }) + const did = await DidKeyMethod.create() + const offering = DevTools.createOffering() await offering.sign(did) @@ -30,7 +28,7 @@ const generateParseOfferingVector = async () => { } const generateParseQuoteVector = async () => { - const did = await DevTools.createDid() + const did = await DidKeyMethod.create() const quote = Quote.create({ metadata: { exchangeId : Message.generateId('rfq'), @@ -50,10 +48,40 @@ const generateParseQuoteVector = async () => { } const generateParseRfqVector = async () => { - const did = await DevTools.createDid() + const did = await DidKeyMethod.create() + const vc = await VerifiableCredential.create({ + type : 'PuupuuCredential', + issuer : did.did, + subject : did.did, + data : { + 'beep': 'boop' + } + }) + + const vcJwt = await vc.sign({ did }) + const rfq = Rfq.create({ metadata : { from: did.did, to: 'did:ex:pfi' }, - data : await DevTools.createRfqData() + data : { + offeringId : 'abcd123', + payinMethod : { + kind : 'DEBIT_CARD', + paymentDetails : { + 'cardNumber' : '1234567890123456', + 'expiryDate' : '12/22', + 'cardHolderName' : 'Ephraim Bartholomew Winthrop', + 'cvv' : '123' + } + }, + payoutMethod: { + kind : 'BTC_ADDRESS', + paymentDetails : { + btcAddress: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa' + } + }, + payinAmount : '20000.00', + claims : [vcJwt] + } }) await rfq.sign(did) @@ -66,10 +94,62 @@ const generateParseRfqVector = async () => { } } +const generateParseOrderVector = async () => { + const did = await DidKeyMethod.create() + const order = Order.create({ + metadata: { from: did.did, to: 'did:ex:pfi', exchangeId: 'abcd123' } + }) + + await order.sign(did) + + return { + description : 'Order parses from string', + input : JSON.stringify(order), + output : order.toJSON(), + error : false, + } +} + +const generateParseCloseVector = async () => { + const did = await DidKeyMethod.create() + const close = Close.create({ + metadata : { from: did.did, to: 'did:ex:pfi', exchangeId: 'abcd123' }, + data : { + reason: 'The reason for closing the exchange' + } + }) + + await close.sign(did) + + return { + description : 'Close parses from string', + input : JSON.stringify(close), + output : close.toJSON(), + error : false, + } +} + +const generateParseOrderStatusVector = async () => { + const did = await DidKeyMethod.create() + const orderStatus = OrderStatus.create({ + metadata : { from: did.did, to: 'did:ex:pfi', exchangeId: 'abcd123' }, + data : { + orderStatus: 'wee' + } + }) + + await orderStatus.sign(did) + + return { + description : 'Order Status parses from string', + input : JSON.stringify(orderStatus), + output : orderStatus.toJSON(), + error : false, + } +} + /** - * Generates TestVector objects and prints em out. - * From there, you can prettify it and paste it into the corresponding test vector file by hand. - * If you think this is janky, soz bro :/ it's the level of (in)convenience that works for me right now. + * Generates TestVector objects and overwrites the corresponding test vector files in `tbdex`. */ const overWriteTestVectors = async () => { @@ -77,12 +157,20 @@ const overWriteTestVectors = async () => { const vectorFilePair: { filename: string, vector: TestVector }[] = [ { filename: 'parse-offering.json', vector: await generateParseOfferingVector() }, { filename: 'parse-quote.json', vector: await generateParseQuoteVector() }, - { filename: 'parse-rfq.json', vector: await generateParseRfqVector() } + { filename: 'parse-close.json', vector: await generateParseCloseVector() }, + { filename: 'parse-rfq.json', vector: await generateParseRfqVector() }, + { filename: 'parse-order.json', vector: await generateParseOrderVector() }, + { filename: 'parse-orderstatus.json', vector: await generateParseOrderStatusVector() }, ] for (const { filename, vector } of vectorFilePair) { - console.log(filename) - console.log(JSON.stringify(vector, null, 2)) + const fileLocation = `../../tbdex/hosted/test-vectors/protocol/vectors/${filename}` + console.log(`Overwriting ${fileLocation} with new test vector.`) + try { + fs.writeFileSync(fileLocation, JSON.stringify(vector, null, 2)) + } catch (err) { + console.error(`Error writing file ${fileLocation}:`, err) + } } } diff --git a/packages/protocol/tests/test-vectors.spec.ts b/packages/protocol/tests/test-vectors.spec.ts index 33a8e017..94808e09 100644 --- a/packages/protocol/tests/test-vectors.spec.ts +++ b/packages/protocol/tests/test-vectors.spec.ts @@ -39,4 +39,3 @@ describe('TbdexTestVectorsProtocol', () => { expect(rfq.toJSON()).to.deep.eq(ParseRfq.output) }) }) - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7473ddcd..627dd52d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -215,6 +215,9 @@ importers: '@noble/hashes': specifier: 1.3.2 version: 1.3.2 + '@types/node': + specifier: ^7.0.5 + version: 7.10.14 '@web5/common': specifier: 0.2.2 version: 0.2.2 @@ -1182,6 +1185,10 @@ packages: undici-types: 5.26.5 dev: true + /@types/node@7.10.14: + resolution: {integrity: sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA==} + dev: false + /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true diff --git a/tbdex b/tbdex index e3e304cc..c19cd468 160000 --- a/tbdex +++ b/tbdex @@ -1 +1 @@ -Subproject commit e3e304ccf62e26d01e85fdbcd72200cde3b94cff +Subproject commit c19cd4680209e0d817a1f9299787d3ac0dcdc25a