diff --git a/backend/src/apis/DltConnectorClient.ts b/backend/src/apis/DltConnectorClient.ts index 593072eef..f01a55d6c 100644 --- a/backend/src/apis/DltConnectorClient.ts +++ b/backend/src/apis/DltConnectorClient.ts @@ -78,27 +78,34 @@ export class DltConnectorClient { * transmit transaction via dlt-connector to iota * and update dltTransactionId of transaction in db with iota message id */ - public async transmitTransaction(transaction?: DbTransaction | null): Promise { - if (transaction) { - const typeString = getTransactionTypeString(transaction.typeId) - const secondsSinceEpoch = Math.round(transaction.balanceDate.getTime() / 1000) - const amountString = transaction.amount.toString() - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data } = await this.client.rawRequest(sendTransaction, { - input: { - type: typeString, - amount: amountString, - createdAt: secondsSinceEpoch, + public async transmitTransaction( + transaction: DbTransaction, + senderCommunityUuid?: string, + recipientCommunityUuid?: string, + ): Promise { + const typeString = getTransactionTypeString(transaction.typeId) + const amountString = transaction.amount.toString() + try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { data } = await this.client.rawRequest(sendTransaction, { + input: { + senderUser: { + uuid: transaction.userGradidoID, + communityUuid: senderCommunityUuid, }, - }) - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access - return data.sendTransaction.dltTransactionIdHex - } catch (e) { - throw new LogError('Error send sending transaction to dlt-connector: ', e) - } - } else { - throw new LogError('parameter transaction not set...') + recipientUser: { + uuid: transaction.linkedUserGradidoID, + communityUuid: recipientCommunityUuid, + }, + amount: amountString, + type: typeString, + createdAt: transaction.balanceDate.toString(), + }, + }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access + return data.sendTransaction.dltTransactionIdHex + } catch (e) { + throw new LogError('Error send sending transaction to dlt-connector: ', e) } } } diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts index 871c31a89..d9a2da569 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts @@ -6,6 +6,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Connection } from '@dbTools/typeorm' +import { Community } from '@entity/Community' import { DltTransaction } from '@entity/DltTransaction' import { Transaction } from '@entity/Transaction' import { ApolloServerTestClient } from 'apollo-server-testing' @@ -14,6 +15,7 @@ import { Decimal } from 'decimal.js-light' // import { Response } from 'graphql-request/dist/types' import { GraphQLClient } from 'graphql-request' import { Response } from 'graphql-request/dist/types' +import { v4 as uuidv4 } from 'uuid' import { testEnvironment, cleanDB } from '@test/helpers' import { logger, i18n as localization } from '@test/testSetup' @@ -80,6 +82,16 @@ let testEnv: { } */ +async function createHomeCommunity(): Promise { + const homeCommunity = Community.create() + homeCommunity.foreign = false + homeCommunity.communityUuid = uuidv4() + homeCommunity.url = 'localhost' + homeCommunity.publicKey = Buffer.from('0x6e6a6c6d6feffe', 'hex') + await Community.save(homeCommunity) + return homeCommunity +} + async function createTxCREATION1(verified: boolean): Promise { let tx = Transaction.create() tx.amount = new Decimal(1000) @@ -358,6 +370,7 @@ describe('create and send Transactions to DltConnector', () => { txCREATION1 = await createTxCREATION1(false) txCREATION2 = await createTxCREATION2(false) txCREATION3 = await createTxCREATION3(false) + await createHomeCommunity() CONFIG.DLT_CONNECTOR = false await sendTransactionsToDltConnector() @@ -413,6 +426,7 @@ describe('create and send Transactions to DltConnector', () => { txCREATION1 = await createTxCREATION1(false) txCREATION2 = await createTxCREATION2(false) txCREATION3 = await createTxCREATION3(false) + await createHomeCommunity() CONFIG.DLT_CONNECTOR = true @@ -481,6 +495,7 @@ describe('create and send Transactions to DltConnector', () => { txCREATION1 = await createTxCREATION1(true) txCREATION2 = await createTxCREATION2(true) txCREATION3 = await createTxCREATION3(true) + await createHomeCommunity() txSEND1to2 = await createTxSend1ToReceive2(false) txRECEIVE2From1 = await createTxReceive2FromSend1(false) diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts index 98ea255c1..98e1ffbe3 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts @@ -1,4 +1,5 @@ import { IsNull } from '@dbTools/typeorm' +import { Community } from '@entity/Community' import { DltTransaction } from '@entity/DltTransaction' import { Transaction } from '@entity/Transaction' @@ -16,6 +17,13 @@ export async function sendTransactionsToDltConnector(): Promise { try { await createDltTransactions() const dltConnector = DltConnectorClient.getInstance() + // TODO: get actual communities from users + const homeCommunity = await Community.findOneOrFail({ where: { foreign: false } }) + const senderCommunityUuid = homeCommunity.communityUuid + if (!senderCommunityUuid) { + throw new Error('Cannot find community uuid of home community') + } + const recipientCommunityUuid = '' if (dltConnector) { logger.debug('with sending to DltConnector...') const dltTransactions = await DltTransaction.find({ @@ -23,9 +31,17 @@ export async function sendTransactionsToDltConnector(): Promise { relations: ['transaction'], order: { createdAt: 'ASC', id: 'ASC' }, }) + for (const dltTx of dltTransactions) { + if (!dltTx.transaction) { + continue + } try { - const messageId = await dltConnector.transmitTransaction(dltTx.transaction) + const messageId = await dltConnector.transmitTransaction( + dltTx.transaction, + senderCommunityUuid, + recipientCommunityUuid, + ) const dltMessageId = Buffer.from(messageId, 'hex') if (dltMessageId.length !== 32) { logger.error( diff --git a/dlt-connector/Dockerfile b/dlt-connector/Dockerfile index eadbba980..3bdaf0679 100644 --- a/dlt-connector/Dockerfile +++ b/dlt-connector/Dockerfile @@ -16,7 +16,7 @@ ENV BUILD_COMMIT="0000000" ## SET NODE_ENV ENV NODE_ENV="production" ## App relevant Envs -ENV PORT="6000" +ENV PORT="6010" # Labels LABEL org.label-schema.build-date="${BUILD_DATE}" diff --git a/dlt-connector/jest.config.js b/dlt-connector/jest.config.js index 9c7c4fc51..723aa840b 100644 --- a/dlt-connector/jest.config.js +++ b/dlt-connector/jest.config.js @@ -6,7 +6,7 @@ module.exports = { collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'], coverageThreshold: { global: { - lines: 70, + lines: 77, }, }, setupFiles: ['/test/testSetup.ts'], @@ -14,6 +14,7 @@ module.exports = { modulePathIgnorePatterns: ['/build/'], moduleNameMapper: { '@/(.*)': '/src/$1', + '@arg/(.*)': '/src/graphql/arg/$1', '@controller/(.*)': '/src/controller/$1', '@enum/(.*)': '/src/graphql/enum/$1', '@resolver/(.*)': '/src/graphql/resolver/$1', diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 1a14fb865..1e54cc44d 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -35,7 +35,7 @@ "reflect-metadata": "^0.1.13", "sodium-native": "^4.0.4", "tsconfig-paths": "^4.1.2", - "type-graphql": "^2.0.0-beta.2" + "type-graphql": "^2.0.0-beta.2" }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^3.2.1", @@ -61,9 +61,9 @@ "prettier": "^2.8.7", "ts-jest": "^27.0.5", "ts-node": "^10.9.1", - "typescript": "^4.9.4", + "typeorm": "^0.3.17", "typeorm-extension": "^3.0.1", - "typeorm": "^0.3.17" + "typescript": "^4.9.4" }, "engines": { "node": ">=14" diff --git a/dlt-connector/src/controller/GradidoTransaction.ts b/dlt-connector/src/controller/GradidoTransaction.ts new file mode 100644 index 000000000..671f3f57a --- /dev/null +++ b/dlt-connector/src/controller/GradidoTransaction.ts @@ -0,0 +1,10 @@ +import { GradidoTransaction } from '@/proto/3_3/GradidoTransaction' +import { TransactionBody } from '@/proto/3_3/TransactionBody' + +export const create = (body: TransactionBody): GradidoTransaction => { + const transaction = new GradidoTransaction({ + bodyBytes: Buffer.from(TransactionBody.encode(body).finish()), + }) + // TODO: add correct signature(s) + return transaction +} diff --git a/dlt-connector/src/controller/TransactionBase.ts b/dlt-connector/src/controller/TransactionBase.ts new file mode 100644 index 000000000..9833226a9 --- /dev/null +++ b/dlt-connector/src/controller/TransactionBase.ts @@ -0,0 +1,6 @@ +import { TransactionValidationLevel } from '@/graphql/enum/TransactionValidationLevel' + +export abstract class TransactionBase { + // validate if transaction is valid, maybe expensive because depending on level several transactions will be fetched from db + public abstract validate(level: TransactionValidationLevel): boolean +} diff --git a/dlt-connector/src/controller/TransactionBody.test.ts b/dlt-connector/src/controller/TransactionBody.test.ts new file mode 100644 index 000000000..eac613ab7 --- /dev/null +++ b/dlt-connector/src/controller/TransactionBody.test.ts @@ -0,0 +1,162 @@ +import 'reflect-metadata' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { create, determineCrossGroupType, determineOtherGroup } from './TransactionBody' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { CrossGroupType } from '@/graphql/enum/CrossGroupType' +import { TransactionType } from '@/graphql/enum/TransactionType' +import Decimal from 'decimal.js-light' + +describe('test controller/TransactionBody', () => { + describe('test create ', () => { + const senderUser = new UserIdentifier() + const recipientUser = new UserIdentifier() + it('test with contribution transaction', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = senderUser + transactionDraft.recipientUser = recipientUser + transactionDraft.type = TransactionType.CREATION + transactionDraft.amount = new Decimal(1000) + transactionDraft.createdAt = '2022-01-02T19:10:34.121' + transactionDraft.targetDate = '2021-12-01T10:05:00.191' + const body = create(transactionDraft) + + expect(body.creation).toBeDefined() + expect(body).toMatchObject({ + createdAt: { + seconds: 1641150634, + nanoSeconds: 121000000, + }, + versionNumber: '3.3', + type: CrossGroupType.LOCAL, + otherGroup: '', + creation: { + recipient: { + amount: '1000', + }, + targetDate: { + seconds: 1638353100, + }, + }, + }) + }) + it('test with local send transaction send part', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = senderUser + transactionDraft.recipientUser = recipientUser + transactionDraft.type = TransactionType.SEND + transactionDraft.amount = new Decimal(1000) + transactionDraft.createdAt = '2022-01-02T19:10:34.121' + const body = create(transactionDraft) + + expect(body.transfer).toBeDefined() + expect(body).toMatchObject({ + createdAt: { + seconds: 1641150634, + nanoSeconds: 121000000, + }, + versionNumber: '3.3', + type: CrossGroupType.LOCAL, + otherGroup: '', + transfer: { + sender: { + amount: '1000', + }, + }, + }) + }) + + it('test with local send transaction receive part', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = senderUser + transactionDraft.recipientUser = recipientUser + transactionDraft.type = TransactionType.RECEIVE + transactionDraft.amount = new Decimal(1000) + transactionDraft.createdAt = '2022-01-02T19:10:34.121' + const body = create(transactionDraft) + + expect(body.transfer).toBeDefined() + expect(body).toMatchObject({ + createdAt: { + seconds: 1641150634, + nanoSeconds: 121000000, + }, + versionNumber: '3.3', + type: CrossGroupType.LOCAL, + otherGroup: '', + transfer: { + sender: { + amount: '1000', + }, + }, + }) + }) + }) + describe('test determineCrossGroupType', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = new UserIdentifier() + transactionDraft.recipientUser = new UserIdentifier() + + it('local transaction', () => { + expect(determineCrossGroupType(transactionDraft)).toEqual(CrossGroupType.LOCAL) + }) + + it('test with with invalid input', () => { + transactionDraft.recipientUser.communityUuid = 'a72a4a4a-aa12-4f6c-b3d8-7cc65c67e24a' + expect(() => determineCrossGroupType(transactionDraft)).toThrow( + new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'cannot determine CrossGroupType', + ), + ) + }) + + it('inbound transaction (send to sender community)', () => { + transactionDraft.type = TransactionType.SEND + expect(determineCrossGroupType(transactionDraft)).toEqual(CrossGroupType.INBOUND) + }) + + it('outbound transaction (send to recipient community)', () => { + transactionDraft.type = TransactionType.RECEIVE + expect(determineCrossGroupType(transactionDraft)).toEqual(CrossGroupType.OUTBOUND) + }) + }) + + describe('test determineOtherGroup', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = new UserIdentifier() + transactionDraft.recipientUser = new UserIdentifier() + + it('for inbound transaction, other group is from recipient, missing community id for recipient', () => { + expect(() => determineOtherGroup(CrossGroupType.INBOUND, transactionDraft)).toThrowError( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing recipient user community id for cross group transaction', + ), + ) + }) + it('for inbound transaction, other group is from recipient', () => { + transactionDraft.recipientUser.communityUuid = 'b8e9f00a-5a56-4b23-8c44-6823ac9e0d2d' + expect(determineOtherGroup(CrossGroupType.INBOUND, transactionDraft)).toEqual( + 'b8e9f00a-5a56-4b23-8c44-6823ac9e0d2d', + ) + }) + + it('for outbound transaction, other group is from sender, missing community id for sender', () => { + expect(() => determineOtherGroup(CrossGroupType.OUTBOUND, transactionDraft)).toThrowError( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing sender user community id for cross group transaction', + ), + ) + }) + + it('for outbound transaction, other group is from sender', () => { + transactionDraft.senderUser.communityUuid = 'a72a4a4a-aa12-4f6c-b3d8-7cc65c67e24a' + expect(determineOtherGroup(CrossGroupType.OUTBOUND, transactionDraft)).toEqual( + 'a72a4a4a-aa12-4f6c-b3d8-7cc65c67e24a', + ) + }) + }) +}) diff --git a/dlt-connector/src/controller/TransactionBody.ts b/dlt-connector/src/controller/TransactionBody.ts new file mode 100644 index 000000000..ae5f37710 --- /dev/null +++ b/dlt-connector/src/controller/TransactionBody.ts @@ -0,0 +1,74 @@ +import { CrossGroupType } from '@/graphql/enum/CrossGroupType' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionType } from '@/graphql/enum/TransactionType' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' +import { GradidoCreation } from '@/proto/3_3/GradidoCreation' +import { GradidoTransfer } from '@/proto/3_3/GradidoTransfer' +import { TransactionBody } from '@/proto/3_3/TransactionBody' + +export const create = (transaction: TransactionDraft): TransactionBody => { + const body = new TransactionBody(transaction) + // TODO: load pubkeys for sender and recipient user from db + switch (transaction.type) { + case TransactionType.CREATION: + body.creation = new GradidoCreation(transaction) + body.data = 'gradidoCreation' + break + case TransactionType.SEND: + case TransactionType.RECEIVE: + body.transfer = new GradidoTransfer(transaction) + body.data = 'gradidoTransfer' + break + } + return body +} + +export const determineCrossGroupType = ({ + senderUser, + recipientUser, + type, +}: TransactionDraft): CrossGroupType => { + if ( + !recipientUser.communityUuid || + recipientUser.communityUuid === '' || + senderUser.communityUuid === recipientUser.communityUuid || + type === TransactionType.CREATION + ) { + return CrossGroupType.LOCAL + } else if (type === TransactionType.SEND) { + return CrossGroupType.INBOUND + } else if (type === TransactionType.RECEIVE) { + return CrossGroupType.OUTBOUND + } + throw new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'cannot determine CrossGroupType', + ) +} + +export const determineOtherGroup = ( + type: CrossGroupType, + { senderUser, recipientUser }: TransactionDraft, +): string => { + switch (type) { + case CrossGroupType.LOCAL: + return '' + case CrossGroupType.INBOUND: + if (!recipientUser.communityUuid) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing recipient user community id for cross group transaction', + ) + } + return recipientUser.communityUuid + case CrossGroupType.OUTBOUND: + if (!senderUser.communityUuid) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing sender user community id for cross group transaction', + ) + } + return senderUser.communityUuid + } +} diff --git a/dlt-connector/src/graphql/enum/AddressType.ts b/dlt-connector/src/graphql/enum/AddressType.ts new file mode 100644 index 000000000..26efd2825 --- /dev/null +++ b/dlt-connector/src/graphql/enum/AddressType.ts @@ -0,0 +1,9 @@ +export enum AddressType { + NONE = 0, // if no address was found + COMMUNITY_HUMAN = 1, // creation account for human + COMMUNITY_GMW = 2, // community public budget account + COMMUNITY_AUF = 3, // community compensation and environment founds account + COMMUNITY_PROJECT = 4, // no creations allowed + SUBACCOUNT = 5, // no creations allowed + CRYPTO_ACCOUNT = 6, // user control his keys, no creations +} diff --git a/dlt-connector/src/graphql/enum/CrossGroupType.ts b/dlt-connector/src/graphql/enum/CrossGroupType.ts new file mode 100644 index 000000000..13e968509 --- /dev/null +++ b/dlt-connector/src/graphql/enum/CrossGroupType.ts @@ -0,0 +1,7 @@ +export enum CrossGroupType { + LOCAL = 0, + INBOUND = 1, + OUTBOUND = 2, + // for cross group transaction which haven't a direction like group friend update + // CROSS = 3, +} diff --git a/dlt-connector/src/graphql/enum/TransactionValidationLevel.ts b/dlt-connector/src/graphql/enum/TransactionValidationLevel.ts new file mode 100644 index 000000000..9462dd8a8 --- /dev/null +++ b/dlt-connector/src/graphql/enum/TransactionValidationLevel.ts @@ -0,0 +1,15 @@ +import { registerEnumType } from 'type-graphql' + +export enum TransactionValidationLevel { + SINGLE = 1, // check only the transaction + SINGLE_PREVIOUS = 2, // check also with previous transaction + DATE_RANGE = 3, // check all transaction from within date range by creation automatic the same month + PAIRED = 4, // check paired transaction on another group by cross group transactions + CONNECTED_GROUP = 5, // check all transactions in the group which connected with this transaction address(es) + CONNECTED_BLOCKCHAIN = 6, // check all transactions which connected with this transaction +} + +registerEnumType(TransactionValidationLevel, { + name: 'TransactionValidationLevel', + description: 'Transaction Validation Levels', +}) diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts new file mode 100755 index 000000000..2021dd9e1 --- /dev/null +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -0,0 +1,39 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { Decimal } from 'decimal.js-light' +import { TransactionType } from '@enum/TransactionType' +import { InputType, Field } from 'type-graphql' +import { UserIdentifier } from './UserIdentifier' +import { isValidDateString } from '@validator/DateString' +import { IsPositiveDecimal } from '@validator/Decimal' +import { IsEnum, IsObject, ValidateNested } from 'class-validator' + +@InputType() +export class TransactionDraft { + @Field(() => UserIdentifier) + @IsObject() + @ValidateNested() + senderUser: UserIdentifier + + @Field(() => UserIdentifier) + @IsObject() + @ValidateNested() + recipientUser: UserIdentifier + + @Field(() => Decimal) + @IsPositiveDecimal() + amount: Decimal + + @Field(() => TransactionType) + @IsEnum(TransactionType) + type: TransactionType + + @Field(() => String) + @isValidDateString() + createdAt: string + + // only for creation transactions + @Field(() => String, { nullable: true }) + @isValidDateString() + targetDate?: string +} diff --git a/dlt-connector/src/graphql/input/UserIdentifier.ts b/dlt-connector/src/graphql/input/UserIdentifier.ts new file mode 100644 index 000000000..12f2e5889 --- /dev/null +++ b/dlt-connector/src/graphql/input/UserIdentifier.ts @@ -0,0 +1,19 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { IsPositive, IsUUID } from 'class-validator' +import { Field, Int, InputType } from 'type-graphql' + +@InputType() +export class UserIdentifier { + @Field(() => String) + @IsUUID('4') + uuid: string + + @Field(() => String, { nullable: true }) + @IsUUID('4') + communityUuid?: string + + @Field(() => Int, { defaultValue: 1, nullable: true }) + @IsPositive() + accountNr?: number +} diff --git a/dlt-connector/src/graphql/model/TransactionResult.ts b/dlt-connector/src/graphql/model/TransactionResult.ts index 1e7f4f054..938c8bcf6 100644 --- a/dlt-connector/src/graphql/model/TransactionResult.ts +++ b/dlt-connector/src/graphql/model/TransactionResult.ts @@ -3,11 +3,13 @@ import { TransactionError } from './TransactionError' @ObjectType() export class TransactionResult { - constructor(content?: TransactionError) { + constructor(content?: TransactionError | string) { this.succeed = true if (content instanceof TransactionError) { this.error = content this.succeed = false + } else if (typeof content === 'string') { + this.messageId = content } } @@ -15,6 +17,10 @@ export class TransactionResult { @Field(() => TransactionError, { nullable: true }) error?: TransactionError + // if no error happend, the message id of the iota transaction + @Field(() => String, { nullable: true }) + messageId?: string + @Field(() => Boolean) succeed: boolean } diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts index 0e54fa660..7c02a4306 100644 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts @@ -2,6 +2,9 @@ import 'reflect-metadata' import { ApolloServer } from '@apollo/server' import { createApolloTestServer } from '@test/ApolloServerMock' import assert from 'assert' +import { TransactionResult } from '../model/TransactionResult' + +let apolloTestServer: ApolloServer jest.mock('@/client/IotaClient', () => { return { @@ -11,8 +14,6 @@ jest.mock('@/client/IotaClient', () => { } }) -let apolloTestServer: ApolloServer - describe('Transaction Resolver Test', () => { beforeAll(async () => { apolloTestServer = await createApolloTestServer() @@ -31,30 +32,45 @@ describe('Transaction Resolver Test', () => { }) it('test mocked sendTransaction', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'SEND', amount: '10', - createdAt: 1688992436, + createdAt: '2012-04-17T17:12:00Z', }, }, }) assert(response.body.kind === 'single') expect(response.body.singleResult.errors).toBeUndefined() - expect(response.body.singleResult.data?.sendTransaction).toBe( + const transactionResult = response.body.singleResult.data?.sendTransaction as TransactionResult + expect(transactionResult.messageId).toBe( '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', ) }) it('test mocked sendTransaction invalid transactionType ', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'INVALID', amount: '10', - createdAt: 1688992436, + createdAt: '2012-04-17T17:12:00Z', }, }, }) @@ -71,12 +87,19 @@ describe('Transaction Resolver Test', () => { it('test mocked sendTransaction invalid amount ', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'SEND', amount: 'no number', - createdAt: 1688992436, + createdAt: '2012-04-17T17:12:00Z', }, }, }) @@ -93,12 +116,19 @@ describe('Transaction Resolver Test', () => { it('test mocked sendTransaction invalid created date ', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'SEND', amount: '10', - createdAt: '2023-03-02T10:12:00', + createdAt: 'not valid', }, }, }) @@ -106,10 +136,47 @@ describe('Transaction Resolver Test', () => { expect(response.body.singleResult).toMatchObject({ errors: [ { - message: - 'Variable "$input" got invalid value "2023-03-02T10:12:00" at "input.createdAt"; Float cannot represent non numeric value: "2023-03-02T10:12:00"', + message: 'Argument Validation Error', + extensions: { + code: 'BAD_USER_INPUT', + validationErrors: [ + { + value: 'not valid', + property: 'createdAt', + constraints: { + isValidDateString: 'createdAt must be a valid date string', + }, + }, + ], + }, }, ], }) }) + it('test mocked sendTransaction missing creationDate for contribution', async () => { + const response = await apolloTestServer.executeOperation({ + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', + variables: { + input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, + type: 'CREATION', + amount: '10', + createdAt: '2012-04-17T17:12:00Z', + }, + }, + }) + assert(response.body.kind === 'single') + expect(response.body.singleResult.data?.sendTransaction).toMatchObject({ + error: { + type: 'MISSING_PARAMETER', + message: 'missing targetDate for contribution', + }, + }) + }) }) diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index df50322fb..282eb11cd 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,9 +1,14 @@ import { Resolver, Query, Arg, Mutation } from 'type-graphql' -import { TransactionInput } from '@input/TransactionInput' -import { TransactionBody } from '@proto/TransactionBody' +import { TransactionDraft } from '@input/TransactionDraft' + +import { create as createTransactionBody } from '@controller/TransactionBody' +import { create as createGradidoTransaction } from '@controller/GradidoTransaction' import { sendMessage as iotaSendMessage } from '@/client/IotaClient' +import { GradidoTransaction } from '@/proto/3_3/GradidoTransaction' +import { TransactionResult } from '../model/TransactionResult' +import { TransactionError } from '../model/TransactionError' @Resolver() export class TransactionResolver { @@ -18,14 +23,23 @@ export class TransactionResolver { return '0.1' } - @Mutation(() => String) + @Mutation(() => TransactionResult) async sendTransaction( @Arg('data') - transaction: TransactionInput, - ): Promise { - const message = TransactionBody.fromObject(transaction) - const messageBuffer = TransactionBody.encode(message).finish() - const resultMessage = await iotaSendMessage(messageBuffer) - return resultMessage.messageId + transaction: TransactionDraft, + ): Promise { + try { + const body = createTransactionBody(transaction) + const message = createGradidoTransaction(body) + const messageBuffer = GradidoTransaction.encode(message).finish() + const resultMessage = await iotaSendMessage(messageBuffer) + return new TransactionResult(resultMessage.messageId) + } catch (error) { + if (error instanceof TransactionError) { + return new TransactionResult(error) + } else { + throw error + } + } } } diff --git a/dlt-connector/src/graphql/scalar/Decimal.ts b/dlt-connector/src/graphql/scalar/Decimal.ts index 5046488e5..b343f383a 100755 --- a/dlt-connector/src/graphql/scalar/Decimal.ts +++ b/dlt-connector/src/graphql/scalar/Decimal.ts @@ -2,7 +2,7 @@ import { Decimal } from 'decimal.js-light' import { GraphQLScalarType, Kind, ValueNode } from 'graphql' -export const DecimalScalar = new GraphQLScalarType({ +export const DecimalScalar = new GraphQLScalarType({ name: 'Decimal', description: 'The `Decimal` scalar type to represent currency values', diff --git a/dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts b/dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts new file mode 100644 index 000000000..7f0a58109 --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts @@ -0,0 +1,34 @@ +import { Field, Message } from '@apollo/protobufjs' +import { GradidoTransaction } from './GradidoTransaction' +import { TimestampSeconds } from './TimestampSeconds' + +/* + id will be set by Node server + running_hash will be also set by Node server, + calculated from previous transaction running_hash and this id, transaction and received +*/ + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoConfirmedTransaction extends Message { + @Field.d(1, 'uint64') + id: number + + @Field.d(2, 'GradidoTransaction') + transaction: GradidoTransaction + + @Field.d(3, 'TimestampSeconds') + confirmedAt: TimestampSeconds + + @Field.d(4, 'string') + versionNumber: string + + @Field.d(5, 'bytes') + runningHash: Buffer + + @Field.d(6, 'bytes') + messageId: Buffer + + @Field.d(7, 'string') + accountBalance: string +} diff --git a/dlt-connector/src/proto/3_3/GradidoCreation.test.ts b/dlt-connector/src/proto/3_3/GradidoCreation.test.ts new file mode 100644 index 000000000..8b3fd1b3f --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoCreation.test.ts @@ -0,0 +1,20 @@ +import 'reflect-metadata' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { GradidoCreation } from './GradidoCreation' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionErrorType } from '@enum/TransactionErrorType' + +describe('proto/3.3/GradidoCreation', () => { + it('test with missing targetDate', () => { + const transactionDraft = new TransactionDraft() + expect(() => { + // eslint-disable-next-line no-new + new GradidoCreation(transactionDraft) + }).toThrowError( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing targetDate for contribution', + ), + ) + }) +}) diff --git a/dlt-connector/src/proto/3_3/GradidoCreation.ts b/dlt-connector/src/proto/3_3/GradidoCreation.ts new file mode 100644 index 000000000..ba6e93652 --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoCreation.ts @@ -0,0 +1,32 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { TimestampSeconds } from './TimestampSeconds' +import { TransferAmount } from './TransferAmount' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' + +// need signature from group admin or +// percent of group users another than the receiver +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoCreation extends Message { + constructor(transaction: TransactionDraft) { + if (!transaction.targetDate) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing targetDate for contribution', + ) + } + super({ + recipient: new TransferAmount({ amount: transaction.amount.toString() }), + targetDate: new TimestampSeconds(new Date(transaction.targetDate)), + }) + } + + @Field.d(1, TransferAmount) + public recipient: TransferAmount + + @Field.d(3, 'TimestampSeconds') + public targetDate: TimestampSeconds +} diff --git a/dlt-connector/src/proto/3_3/GradidoDeferredTransfer.ts b/dlt-connector/src/proto/3_3/GradidoDeferredTransfer.ts new file mode 100644 index 000000000..7b27c064a --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoDeferredTransfer.ts @@ -0,0 +1,31 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { GradidoTransfer } from './GradidoTransfer' +import { TimestampSeconds } from './TimestampSeconds' + +// transaction type for chargeable transactions +// for transaction for people which haven't a account already +// consider using a seed number for key pair generation for recipient +// using seed as redeem key for claiming transaction, technically make a default Transfer transaction from recipient address +// seed must be long enough to prevent brute force, maybe base64 encoded +// to own account +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoDeferredTransfer extends Message { + // amount is amount with decay for time span between transaction was received and timeout + // useable amount can be calculated + // recipient address don't need to be registered in blockchain with register address + @Field.d(1, GradidoTransfer) + public transfer: GradidoTransfer + + // if timeout timestamp is reached if it wasn't used, it will be booked back minus decay + // technically on blockchain no additional transaction will be created because how should sign it? + // the decay for amount and the seconds until timeout is lost no matter what happened + // consider is as fee for this service + // rest decay could be transferred back as separate transaction + @Field.d(2, 'TimestampSeconds') + public timeout: TimestampSeconds + + // split for n recipient + // max gradido per recipient? or per transaction with cool down? +} diff --git a/dlt-connector/src/proto/3_3/GradidoTransaction.ts b/dlt-connector/src/proto/3_3/GradidoTransaction.ts new file mode 100644 index 000000000..ca1a59e30 --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoTransaction.ts @@ -0,0 +1,21 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { SignatureMap } from './SignatureMap' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoTransaction extends Message { + @Field.d(1, SignatureMap) + public sigMap: SignatureMap + + // inspired by Hedera + // bodyBytes are the payload for signature + // bodyBytes are serialized TransactionBody + @Field.d(2, 'bytes') + public bodyBytes: Buffer + + // if it is a cross group transaction the parent message + // id from outbound transaction or other by cross + @Field.d(3, 'bytes') + public parentMessageId: Buffer +} diff --git a/dlt-connector/src/proto/3_3/GradidoTransfer.ts b/dlt-connector/src/proto/3_3/GradidoTransfer.ts new file mode 100644 index 000000000..215ffc60f --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoTransfer.ts @@ -0,0 +1,23 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { TransferAmount } from './TransferAmount' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoTransfer extends Message { + constructor(transaction: TransactionDraft, coinOrigin?: string) { + super({ + sender: new TransferAmount({ + amount: transaction.amount.toString(), + communityId: coinOrigin, + }), + }) + } + + @Field.d(1, TransferAmount) + public sender: TransferAmount + + @Field.d(2, 'bytes') + public recipient: Buffer +} diff --git a/dlt-connector/src/proto/3_3/GroupFriendsUpdate.ts b/dlt-connector/src/proto/3_3/GroupFriendsUpdate.ts new file mode 100644 index 000000000..64e74a694 --- /dev/null +++ b/dlt-connector/src/proto/3_3/GroupFriendsUpdate.ts @@ -0,0 +1,15 @@ +import { Field, Message } from '@apollo/protobufjs' + +// connect group together +// only CrossGroupType CROSS (in TransactionBody) +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GroupFriendsUpdate extends Message { + // if set to true, colors of this both groups are trait as the same + // on creation user get coins still in there color + // on transfer into another group which a connection exist, + // coins will be automatic swapped into user group color coin + // (if fusion between src coin and dst coin is enabled) + @Field.d(1, 'bool') + public colorFusion: boolean +} diff --git a/dlt-connector/src/proto/3_3/RegisterAddress.ts b/dlt-connector/src/proto/3_3/RegisterAddress.ts new file mode 100644 index 000000000..85b8390df --- /dev/null +++ b/dlt-connector/src/proto/3_3/RegisterAddress.ts @@ -0,0 +1,19 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { AddressType } from '@enum/AddressType' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class RegisterAddress extends Message { + @Field.d(1, 'bytes') + public userPubkey: Buffer + + @Field.d(2, 'AddressType') + public addressType: AddressType + + @Field.d(3, 'bytes') + public nameHash: Buffer + + @Field.d(4, 'bytes') + public subaccountPubkey: Buffer +} diff --git a/dlt-connector/src/proto/3_3/SignatureMap.ts b/dlt-connector/src/proto/3_3/SignatureMap.ts new file mode 100644 index 000000000..e48b0232d --- /dev/null +++ b/dlt-connector/src/proto/3_3/SignatureMap.ts @@ -0,0 +1,10 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { SignaturePair } from './SignaturePair' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class SignatureMap extends Message { + @Field.d(1, SignaturePair, 'repeated') + public sigPair: SignaturePair +} diff --git a/dlt-connector/src/proto/3_3/SignaturePair.ts b/dlt-connector/src/proto/3_3/SignaturePair.ts new file mode 100644 index 000000000..07ed4cc55 --- /dev/null +++ b/dlt-connector/src/proto/3_3/SignaturePair.ts @@ -0,0 +1,11 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class SignaturePair extends Message { + @Field.d(1, 'bytes') + public pubKey: Buffer + + @Field.d(2, 'bytes') + public signature: Buffer +} diff --git a/dlt-connector/src/proto/3_3/Timestamp.test.ts b/dlt-connector/src/proto/3_3/Timestamp.test.ts new file mode 100644 index 000000000..39f6fd2c8 --- /dev/null +++ b/dlt-connector/src/proto/3_3/Timestamp.test.ts @@ -0,0 +1,16 @@ +import { Timestamp } from './Timestamp' + +describe('test timestamp constructor', () => { + it('with date input object', () => { + const now = new Date('2011-04-17T12:01:10.109') + const timestamp = new Timestamp(now) + expect(timestamp.seconds).toEqual(1303041670) + expect(timestamp.nanoSeconds).toEqual(109000000) + }) + + it('with milliseconds number input', () => { + const timestamp = new Timestamp(1303041670109) + expect(timestamp.seconds).toEqual(1303041670) + expect(timestamp.nanoSeconds).toEqual(109000000) + }) +}) diff --git a/dlt-connector/src/proto/3_3/Timestamp.ts b/dlt-connector/src/proto/3_3/Timestamp.ts new file mode 100644 index 000000000..ab060a9bc --- /dev/null +++ b/dlt-connector/src/proto/3_3/Timestamp.ts @@ -0,0 +1,27 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class Timestamp extends Message { + public constructor(input?: Date | number) { + let seconds = 0 + let nanoSeconds = 0 + if (input instanceof Date) { + seconds = Math.floor(input.getTime() / 1000) + nanoSeconds = (input.getTime() % 1000) * 1000000 // Convert milliseconds to nanoseconds + } else if (typeof input === 'number') { + // Calculate seconds and nanoseconds from milliseconds + seconds = Math.floor(input / 1000) + nanoSeconds = (input % 1000) * 1000000 + } + super({ seconds, nanoSeconds }) + } + + // Number of complete seconds since the start of the epoch + @Field.d(1, 'int64') + public seconds: number + + // Number of nanoseconds since the start of the last second + @Field.d(2, 'int32') + public nanoSeconds: number +} diff --git a/dlt-connector/src/proto/3_3/TimestampSeconds.test.ts b/dlt-connector/src/proto/3_3/TimestampSeconds.test.ts new file mode 100644 index 000000000..92dc79130 --- /dev/null +++ b/dlt-connector/src/proto/3_3/TimestampSeconds.test.ts @@ -0,0 +1,14 @@ +import { TimestampSeconds } from './TimestampSeconds' + +describe('test TimestampSeconds constructor', () => { + it('with date input object', () => { + const now = new Date('2011-04-17T12:01:10.109') + const timestamp = new TimestampSeconds(now) + expect(timestamp.seconds).toEqual(1303041670) + }) + + it('with milliseconds number input', () => { + const timestamp = new TimestampSeconds(1303041670109) + expect(timestamp.seconds).toEqual(1303041670) + }) +}) diff --git a/dlt-connector/src/proto/3_3/TimestampSeconds.ts b/dlt-connector/src/proto/3_3/TimestampSeconds.ts new file mode 100644 index 000000000..055094c6d --- /dev/null +++ b/dlt-connector/src/proto/3_3/TimestampSeconds.ts @@ -0,0 +1,20 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class TimestampSeconds extends Message { + public constructor(input?: Date | number) { + let seconds = 0 + // Calculate seconds from milliseconds + if (input instanceof Date) { + seconds = Math.floor(input.getTime() / 1000) + } else if (typeof input === 'number') { + seconds = Math.floor(input / 1000) + } + super({ seconds }) + } + + // Number of complete seconds since the start of the epoch + @Field.d(1, 'int64') + public seconds: number +} diff --git a/dlt-connector/src/proto/3_3/TransactionBody.ts b/dlt-connector/src/proto/3_3/TransactionBody.ts new file mode 100644 index 000000000..9e9179b3f --- /dev/null +++ b/dlt-connector/src/proto/3_3/TransactionBody.ts @@ -0,0 +1,66 @@ +import { Field, Message, OneOf } from '@apollo/protobufjs' + +import { CrossGroupType } from '@/graphql/enum/CrossGroupType' + +import { Timestamp } from './Timestamp' +import { GradidoTransfer } from './GradidoTransfer' +import { GradidoCreation } from './GradidoCreation' +import { GradidoDeferredTransfer } from './GradidoDeferredTransfer' +import { GroupFriendsUpdate } from './GroupFriendsUpdate' +import { RegisterAddress } from './RegisterAddress' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { determineCrossGroupType, determineOtherGroup } from '@/controller/TransactionBody' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class TransactionBody extends Message { + public constructor(transaction: TransactionDraft) { + const type = determineCrossGroupType(transaction) + super({ + memo: 'Not implemented yet', + createdAt: new Timestamp(new Date(transaction.createdAt)), + versionNumber: '3.3', + type, + otherGroup: determineOtherGroup(type, transaction), + }) + } + + @Field.d(1, 'string') + public memo: string + + @Field.d(2, Timestamp) + public createdAt: Timestamp + + @Field.d(3, 'string') + public versionNumber: string + + @Field.d(4, CrossGroupType) + public type: CrossGroupType + + @Field.d(5, 'string') + public otherGroup: string + + @OneOf.d( + 'gradidoTransfer', + 'gradidoCreation', + 'groupFriendsUpdate', + 'registerAddress', + 'gradidoDeferredTransfer', + ) + public data: string + + @Field.d(6, 'GradidoTransfer') + transfer?: GradidoTransfer + + @Field.d(7, 'GradidoCreation') + creation?: GradidoCreation + + @Field.d(8, 'GroupFriendsUpdate') + groupFriendsUpdate?: GroupFriendsUpdate + + @Field.d(9, 'RegisterAddress') + registerAddress?: RegisterAddress + + @Field.d(10, 'GradidoDeferredTransfer') + deferredTransfer?: GradidoDeferredTransfer +} diff --git a/dlt-connector/src/proto/3_3/TransferAmount.ts b/dlt-connector/src/proto/3_3/TransferAmount.ts new file mode 100644 index 000000000..f6adc47ff --- /dev/null +++ b/dlt-connector/src/proto/3_3/TransferAmount.ts @@ -0,0 +1,16 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class TransferAmount extends Message { + @Field.d(1, 'bytes') + public pubkey: Buffer + + @Field.d(2, 'string') + public amount: string + + // community which created this coin + // used for colored coins + @Field.d(3, 'string') + public communityId: string +} diff --git a/dlt-connector/src/proto/TransactionBody.test.ts b/dlt-connector/src/proto/TransactionBody.test.ts deleted file mode 100644 index 168d15b63..000000000 --- a/dlt-connector/src/proto/TransactionBody.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import 'reflect-metadata' -import { TransactionType } from '@enum/TransactionType' -import { TransactionInput } from '@input/TransactionInput' -import Decimal from 'decimal.js-light' -import { TransactionBody } from './TransactionBody' - -describe('proto/TransactionBodyTest', () => { - it('test compatible with graphql/input/TransactionInput', async () => { - // test data - const type = TransactionType.SEND - const amount = new Decimal('10') - const createdAt = 1688992436 - - // init both objects - // graphql input object - const transactionInput = new TransactionInput() - transactionInput.type = type - transactionInput.amount = amount - transactionInput.createdAt = createdAt - - // protobuf object - const transactionBody = new TransactionBody() - transactionBody.type = type - transactionBody.amount = amount.toString() - transactionBody.createdAt = createdAt - - // create protobuf object from graphql Input object - const message = TransactionBody.fromObject(transactionInput) - // serialize both protobuf objects - const messageBuffer = TransactionBody.encode(message).finish() - const messageBuffer2 = TransactionBody.encode(transactionBody).finish() - - // compare - expect(messageBuffer).toStrictEqual(messageBuffer2) - }) -}) diff --git a/dlt-connector/src/proto/TransactionBody.ts b/dlt-connector/src/proto/TransactionBody.ts deleted file mode 100644 index 8fda5b863..000000000 --- a/dlt-connector/src/proto/TransactionBody.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TransactionType } from '../graphql/enum/TransactionType' -import { Field, Message } from '@apollo/protobufjs' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class TransactionBody extends Message { - @Field.d(1, TransactionType) - type: TransactionType - - @Field.d(2, 'string') - amount: string - - @Field.d(3, 'uint64') - createdAt: number - - // @protoField.d(4, 'string') - // communitySum: Decimal -} diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index 48560973b..3abf9aead 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -51,6 +51,7 @@ "@arg/*": ["src/graphql/arg/*"], "@enum/*": ["src/graphql/enum/*"], "@input/*": ["src/graphql/input/*"], + "@model/*": ["src/graphql/model/*"], "@resolver/*": ["src/graphql/resolver/*"], "@scalar/*": ["src/graphql/scalar/*"], "@test/*": ["test/*"], diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 90a47a028..136e845f5 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -181,32 +181,32 @@ integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" - integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" + "@babel/generator" "^7.23.0" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.22.20" - "@babel/helpers" "^7.22.15" - "@babel/parser" "^7.22.16" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.20" - "@babel/types" "^7.22.19" - convert-source-map "^1.7.0" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.15", "@babel/generator@^7.7.2": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" - integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -227,13 +227,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -249,10 +249,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" - integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -284,7 +284,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20": +"@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== @@ -294,14 +294,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helpers@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" - integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": version "7.22.20" @@ -312,10 +312,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": - version "7.22.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" - integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -409,13 +409,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/runtime@^7.21.0": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" - integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": +"@babel/template@^7.22.15", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -424,29 +424,29 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20", "@babel/traverse@^7.7.2": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" - integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== +"@babel/traverse@^7.23.0", "@babel/traverse@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== dependencies: "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" + "@babel/generator" "^7.23.0" "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.22.5" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.19" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" - integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.19" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -477,9 +477,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" - integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz#7ccb5f58703fa61ffdcbf39e2c604a109e781162" + integrity sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -496,15 +496,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.49.0": - version "8.49.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" - integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== +"@eslint/js@8.50.0": + version "8.50.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" + integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== "@faker-js/faker@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.0.2.tgz#bab698c5d3da9c52744e966e0e3eedb6c8b05c37" - integrity sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A== + version "8.1.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.1.0.tgz#e14896f1c57af2495e341dc4c7bf04125c8aeafd" + integrity sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ== "@graphql-tools/merge@^8.4.1": version "8.4.2" @@ -1022,9 +1022,9 @@ "@types/node" "*" "@types/express-serve-static-core@^4.17.30", "@types/express-serve-static-core@^4.17.33": - version "4.17.36" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" - integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + version "4.17.37" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" + integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1032,9 +1032,9 @@ "@types/send" "*" "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -1042,9 +1042,9 @@ "@types/serve-static" "*" "@types/graceful-fs@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" + integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== dependencies: "@types/node" "*" @@ -1059,16 +1059,16 @@ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" + integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" + integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== dependencies: "@types/istanbul-lib-report" "*" @@ -1113,22 +1113,22 @@ "@types/node" "*" "@types/node-fetch@^2.6.1": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.5.tgz#972756a9a0fe354b2886bf3defe667ddb4f0d30a" - integrity sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg== + version "2.6.6" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" + integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== dependencies: "@types/node" "*" form-data "^4.0.0" "@types/node@*", "@types/node@^20.4.9": - version "20.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.2.tgz#a065925409f59657022e9063275cd0b9bd7e1b12" - integrity sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw== + version "20.7.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.7.0.tgz#c03de4572f114a940bc2ca909a33ddb2b925e470" + integrity sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg== "@types/node@^18.11.18": - version "18.17.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.17.tgz#53cc07ce582c9d7c5850702a3c2cb0af0d7b0ca1" - integrity sha512-cOxcXsQ2sxiwkykdJqvyFS+MLQPLvIdwh5l6gNg8qF6s+C7XSkEWOZjK+XhUZd+mYvHV/180g2cnCcIl4l06Pw== + version "18.18.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.0.tgz#bd19d5133a6e5e2d0152ec079ac27c120e7f1763" + integrity sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw== "@types/prettier@^2.1.5": version "2.7.3" @@ -1146,31 +1146,31 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/semver@^7.3.12", "@types/semver@^7.5.0": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" - integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.2" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" + integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-static@*": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" + integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sodium-native@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@types/sodium-native/-/sodium-native-2.3.5.tgz#5d2681e7b6b67bcbdc63cfb133e303ec9e942e43" - integrity sha512-a3DAIpW8+36XAY8aIR36JBQQsfOabxHuJwx11DL/PTvnbwEWPAXW66b8QbMi0r2vUnkOfREsketxdvjBmQxqDQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/sodium-native/-/sodium-native-2.3.6.tgz#2730191204978a1a96ec7de2f2653ef3e4f7927a" + integrity sha512-MMQ0aR90G9A8WiynSaNsUnzzlkw6akTqYz+OBEgSH/Y3+91X/bkkP3lOJROogLSQMoONM81IX49yVmakEWw6ZA== dependencies: "@types/node" "*" @@ -1185,19 +1185,19 @@ integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/validator@^13.7.10": - version "13.11.1" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.1.tgz#6560af76ed54490e68c42f717ab4e742ba7be74b" - integrity sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A== + version "13.11.2" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.2.tgz#a2502325a3c0bd29f36dbac3b763223edd801e17" + integrity sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ== "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + version "16.0.6" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.6.tgz#cc0c63684d68d23498cf0b5f32aa4c3fb437c638" + integrity sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A== dependencies: "@types/yargs-parser" "*" @@ -1717,14 +1717,14 @@ browser-process-hrtime@^1.0.0: integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + version "4.22.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.0.tgz#6adc8116589ccea8a99d0df79c5de2436199abdb" + integrity sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001539" + electron-to-chromium "^1.4.530" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" bs-logger@0.x: version "0.2.6" @@ -1806,10 +1806,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517: - version "1.0.30001538" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" - integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== +caniuse-lite@^1.0.30001539: + version "1.0.30001540" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001540.tgz#a316ca4f2ae673ab02ff0ec533334016d56ff658" + integrity sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw== chalk@^2.4.2: version "2.4.2" @@ -2026,11 +2026,16 @@ content-type@~1.0.4, content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -2333,10 +2338,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.477: - version "1.4.523" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz#f82f99243c827df05c26776d49712cb284972df6" - integrity sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg== +electron-to-chromium@^1.4.530: + version "1.4.531" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.531.tgz#22966d894c4680726c17cf2908ee82ff5d26ac25" + integrity sha512-H6gi5E41Rn3/mhKlPaT1aIMg/71hTAqn0gYEllSuw9igNWtvQwu185jiCZoZD29n7Zukgh7GVZ3zGf0XvkhqjQ== emittery@^0.8.1: version "0.8.1" @@ -2506,9 +2511,9 @@ eslint-import-resolver-node@^0.3.7: resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz#36f93e1eb65a635e688e16cae4bead54552e3bbd" - integrity sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg== + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== dependencies: debug "^4.3.4" enhanced-resolve "^5.12.0" @@ -2642,14 +2647,14 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.37.0: - version "8.49.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" - integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== + version "8.50.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" + integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.49.0" + "@eslint/js" "8.50.0" "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -3130,9 +3135,9 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" get-tsconfig@^4.5.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.0.tgz#06ce112a1463e93196aa90320c35df5039147e34" - integrity sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw== + version "4.7.2" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" + integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== dependencies: resolve-pkg-maps "^1.0.0" @@ -3163,12 +3168,12 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.3.3: - version "10.3.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" - integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" - jackspeak "^2.0.3" + jackspeak "^2.3.5" minimatch "^9.0.1" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" @@ -3202,9 +3207,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.22.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== dependencies: type-fest "^0.20.2" @@ -3747,10 +3752,10 @@ iterall@^1.3.0: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -jackspeak@^2.0.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.3.tgz#95e4cbcc03b3eb357bf6bcce14a903fb3d1151e1" - integrity sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg== +jackspeak@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.5.tgz#443f237f9eeeb0d7c6ec34835ef5289bb4acb068" + integrity sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -5543,9 +5548,9 @@ slash@^3.0.0: integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== smob@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.0.tgz#ac9751fe54b1fc1fc8286a628d4e7f824273b95a" - integrity sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.1.tgz#66270e7df6a7527664816c5b577a23f17ba6f5b5" + integrity sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ== sodium-native@^4.0.4: version "4.0.4" @@ -5594,9 +5599,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.14" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.14.tgz#d16b09577b7de461c8c3e69734c4b9b467ac791f" - integrity sha512-U0eS5wcpu/O2/QZk6PcAMOA8H3ZuvRe4mFHA3Q+LNl1SRDmfQ+mD3RoD6tItqnvqubJ32m/zV2Z/ikSmxccD1Q== + version "3.0.15" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" + integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== sprintf-js@~1.0.2: version "1.0.3" @@ -6212,10 +6217,10 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" diff --git a/docker-compose.yml b/docker-compose.yml index 4900a456a..4e29bc496 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -163,12 +163,12 @@ services: - internal-net - external-net ports: - - 6000:6000 + - 6010:6010 restart: always environment: # Envs used in Dockerfile # - DOCKER_WORKDIR="/app" - - PORT=6000 + - PORT=6010 - BUILD_DATE - BUILD_VERSION - BUILD_COMMIT