From 6ddfaca5af06ae67cb5c486d177941c9afb8c119 Mon Sep 17 00:00:00 2001 From: harisato Date: Thu, 12 Oct 2023 10:10:56 +0700 Subject: [PATCH 1/9] feat(be): add cache manager --- package.json | 4 +++- src/app.module.ts | 15 +++++++++------ src/keys/syskey.module.ts | 8 ++++++++ src/keys/syskey.service.ts | 10 ++++++++++ yarn.lock | 23 +++++++++++++++++++++++ 5 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 src/keys/syskey.module.ts create mode 100644 src/keys/syskey.service.ts diff --git a/package.json b/package.json index 7232bd87..8c4a80b8 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@google-analytics/data": "^4.0.0", "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", + "@nestjs/cache-manager": "^2.1.0", "@nestjs/common": "^9.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^9.0.0", @@ -37,6 +38,7 @@ "@nestjs/swagger": "^7.0.12", "axios": "^1.4.0", "bull": "^4.10.4", + "cache-manager": "^5.2.4", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "decompress": "^4.2.1", @@ -94,4 +96,4 @@ "coverageDirectory": "../coverage", "testEnvironment": "node" } -} \ No newline at end of file +} diff --git a/src/app.module.ts b/src/app.module.ts index 6dfeb898..cd23d0bd 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,22 +1,25 @@ +import { CacheModule } from '@nestjs/cache-manager'; import { Module, ValidationPipe } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; +import { APP_PIPE } from '@nestjs/core'; +import { JwtModule } from '@nestjs/jwt'; +import { ScheduleModule } from '@nestjs/schedule'; + import { ChapterModule } from './chapter/chapter.module'; -import { MangaModule } from './manga/manga.module'; import configuration from './config/configuration'; -import { JwtModule } from '@nestjs/jwt'; +import { CreatorModule } from './creator/creator.module'; import { FilesModule } from './files/files.module'; import { GraphqlModule } from './graphql/graphql.module'; -import { UserModule } from './user/user.module'; -import { ScheduleModule } from '@nestjs/schedule'; +import { MangaModule } from './manga/manga.module'; import { TasksModule } from './task/task.module'; -import { CreatorModule } from './creator/creator.module'; -import { APP_PIPE } from '@nestjs/core'; +import { UserModule } from './user/user.module'; import { QuestModule } from './quest/quest.module'; @Module({ imports: [ JwtModule, ScheduleModule.forRoot(), + CacheModule.register(), ChapterModule, MangaModule, CreatorModule, diff --git a/src/keys/syskey.module.ts b/src/keys/syskey.module.ts new file mode 100644 index 00000000..ee0b38ad --- /dev/null +++ b/src/keys/syskey.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; + +@Module({ + imports: [], + providers: [], + exports: [], +}) +export class SysKeyModule {} diff --git a/src/keys/syskey.service.ts b/src/keys/syskey.service.ts new file mode 100644 index 00000000..25bf4793 --- /dev/null +++ b/src/keys/syskey.service.ts @@ -0,0 +1,10 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class SysKeyService { + private readonly logger = new Logger(SysKeyService.name); + constructor(private configService: ConfigService) {} + + instantiate() {} +} diff --git a/yarn.lock b/yarn.lock index efa91bb7..202da94c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1356,6 +1356,11 @@ "@nestjs/bull-shared" "^10.0.1" tslib "2.6.0" +"@nestjs/cache-manager@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@nestjs/cache-manager/-/cache-manager-2.1.0.tgz#e4dadc4ba9c02c059db4dac5e0b5513466e2895a" + integrity sha512-9kep3a8Mq5cMuXN/anGhSYc0P48CRBXk5wyJJRBFxhNkCH8AIzZF4CASGVDIEMmm3OjVcEUHojjyJwCODS17Qw== + "@nestjs/common@^9.0.0": version "9.4.3" resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-9.4.3.tgz#f907c5315b4273f7675864a05c4dda7056632b87" @@ -2724,6 +2729,14 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cache-manager@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-5.2.4.tgz#01bebe2cc6bef993e3e959d59d3a25a3f2658df1" + integrity sha512-gkuCjug16NdGvKm/sydxGVx17uffrSWcEe2xraBtwRCgdYcFxwJAla4OYpASAZT2yhSoxgDiWL9XH6IAChcZJA== + dependencies: + lodash.clonedeep "^4.5.0" + lru-cache "^10.0.1" + call-bind@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -4617,6 +4630,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -4660,6 +4678,11 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +lru-cache@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" From 5525706d06b1341f2c82ab389d81444f930f0dcc Mon Sep 17 00:00:00 2001 From: harisato Date: Thu, 12 Oct 2023 10:15:08 +0700 Subject: [PATCH 2/9] feat(hasura): update campaign tbl --- hasura/metadata/query_collections.yaml | 22 ++++++++----------- .../down.sql | 4 ++++ .../up.sql | 2 ++ .../down.sql | 2 ++ .../up.sql | 1 + .../down.sql | 2 ++ .../up.sql | 1 + 7 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/down.sql create mode 100644 hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/up.sql create mode 100644 hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/down.sql create mode 100644 hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/up.sql create mode 100644 hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/down.sql create mode 100644 hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/up.sql diff --git a/hasura/metadata/query_collections.yaml b/hasura/metadata/query_collections.yaml index ef394755..7c6cfdf1 100644 --- a/hasura/metadata/query_collections.yaml +++ b/hasura/metadata/query_collections.yaml @@ -834,11 +834,10 @@ query campaign { campaign { created_at - end_date + updated_at id name - start_date - updated_at + status campaign_quests_aggregate(where: {status:{_eq:"Publish"}}) { aggregate { count @@ -854,8 +853,7 @@ updated_at id name - start_date - end_date + status campaign_quests { created_at updated_at @@ -880,25 +878,23 @@ } - name: Admin - Create Campaign query: | - mutation insert_campaign_one ($name: String = "", $start_date: timestamptz = "", $end_date: timestamptz = "") { - insert_campaign(objects: {name:$name,start_date:$start_date,end_date:$end_date}) { + mutation insert_campaign_one ($name: String = "", $status: String = "") { + insert_campaign(objects: {name:$name,status:$status}) { returning { id name - start_date - end_date + status } } } - name: Admin - Update campaign query: | - mutation update_campaign ($id: Int!, $name: String = "", $start_date: timestamptz = "", $end_date: timestamptz = "") { - update_campaign(where: {id:{_eq:$id}}, _set: {name:$name,start_date:$start_date,end_date:$end_date}) { + mutation update_campaign ($id: Int!, $name: String = "", $status: String = "") { + update_campaign(where: {id:{_eq:$id}}, _set: {name:$name,status:$status}) { returning { id name - start_date - end_date + status updated_at } affected_rows diff --git a/hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/down.sql b/hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/down.sql new file mode 100644 index 00000000..d13a11cd --- /dev/null +++ b/hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."campaign" add column "status" text +-- null; diff --git a/hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/up.sql b/hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/up.sql new file mode 100644 index 00000000..7fb4280e --- /dev/null +++ b/hasura/migrations/punkga-pg/1697080340034_alter_table_public_campaign_add_column_status/up.sql @@ -0,0 +1,2 @@ +alter table "public"."campaign" add column "status" text + null; diff --git a/hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/down.sql b/hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/down.sql new file mode 100644 index 00000000..8fa6e9ee --- /dev/null +++ b/hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/down.sql @@ -0,0 +1,2 @@ +alter table "public"."campaign" alter column "end_date" drop not null; +alter table "public"."campaign" add column "end_date" timestamptz; diff --git a/hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/up.sql b/hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/up.sql new file mode 100644 index 00000000..1486c6e5 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697080470139_alter_table_public_campaign_drop_column_end_date/up.sql @@ -0,0 +1 @@ +alter table "public"."campaign" drop column "end_date" cascade; diff --git a/hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/down.sql b/hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/down.sql new file mode 100644 index 00000000..fa08cf58 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/down.sql @@ -0,0 +1,2 @@ +alter table "public"."campaign" alter column "start_date" drop not null; +alter table "public"."campaign" add column "start_date" timestamptz; diff --git a/hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/up.sql b/hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/up.sql new file mode 100644 index 00000000..2c9aa8e5 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697080479988_alter_table_public_campaign_drop_column_start_date/up.sql @@ -0,0 +1 @@ +alter table "public"."campaign" drop column "start_date" cascade; From f23faa68db6682d00331a6bad8e8f13b222dcd16 Mon Sep 17 00:00:00 2001 From: harisato Date: Thu, 12 Oct 2023 10:53:44 +0700 Subject: [PATCH 3/9] feat(be): add kms --- .../punkga-pg/tables/public_system_key.yaml | 3 + .../databases/punkga-pg/tables/tables.yaml | 1 + .../down.sql | 1 + .../up.sql | 1 + package.json | 1 + src/keys/keys.graphql.ts | 35 + src/keys/kms.service.ts | 91 ++ src/keys/syskey.service.ts | 24 +- yarn.lock | 1081 ++++++++++++++++- 9 files changed, 1216 insertions(+), 22 deletions(-) create mode 100644 hasura/metadata/databases/punkga-pg/tables/public_system_key.yaml create mode 100644 hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/down.sql create mode 100644 hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/up.sql create mode 100644 src/keys/keys.graphql.ts create mode 100644 src/keys/kms.service.ts diff --git a/hasura/metadata/databases/punkga-pg/tables/public_system_key.yaml b/hasura/metadata/databases/punkga-pg/tables/public_system_key.yaml new file mode 100644 index 00000000..a3563cf0 --- /dev/null +++ b/hasura/metadata/databases/punkga-pg/tables/public_system_key.yaml @@ -0,0 +1,3 @@ +table: + name: system_key + schema: public diff --git a/hasura/metadata/databases/punkga-pg/tables/tables.yaml b/hasura/metadata/databases/punkga-pg/tables/tables.yaml index 4bab427c..aef95cf3 100644 --- a/hasura/metadata/databases/punkga-pg/tables/tables.yaml +++ b/hasura/metadata/databases/punkga-pg/tables/tables.yaml @@ -18,5 +18,6 @@ - "!include public_quests.yaml" - "!include public_social_activities.yaml" - "!include public_subscribers.yaml" +- "!include public_system_key.yaml" - "!include public_tag_languages.yaml" - "!include public_tags.yaml" diff --git a/hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/down.sql b/hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/down.sql new file mode 100644 index 00000000..5168fccc --- /dev/null +++ b/hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/down.sql @@ -0,0 +1 @@ +DROP TABLE "public"."system_key"; diff --git a/hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/up.sql b/hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/up.sql new file mode 100644 index 00000000..8c4e18e9 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697081234401_create_table_public_system_key/up.sql @@ -0,0 +1 @@ +CREATE TABLE "public"."system_key" ("id" serial NOT NULL, "encrypted_seed" text NOT NULL, PRIMARY KEY ("id") ); diff --git a/package.json b/package.json index 8c4a80b8..e4021d8f 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { + "@aura-nw/aura-kms": "^0.0.5", "@authorizerdev/authorizer-js": "^1.2.3", "@aws-sdk/client-s3": "^3.363.0", "@google-analytics/data": "^4.0.0", diff --git a/src/keys/keys.graphql.ts b/src/keys/keys.graphql.ts new file mode 100644 index 00000000..2e7b9138 --- /dev/null +++ b/src/keys/keys.graphql.ts @@ -0,0 +1,35 @@ +import { ConfigService } from '@nestjs/config'; +import { GraphqlService } from '../graphql/graphql.service'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class KeysGraphql { + constructor( + private configSvc: ConfigService, + private graphqlSvc: GraphqlService + ) {} + + async queryEncryptedSystemKey() { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + + const result = await this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `query system_key { + system_key { + encrypted_seed + } + } + `, + 'system_key', + {}, + headers + ); + + return result.data.system_key[0]; + } +} diff --git a/src/keys/kms.service.ts b/src/keys/kms.service.ts new file mode 100644 index 00000000..500832da --- /dev/null +++ b/src/keys/kms.service.ts @@ -0,0 +1,91 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { KMSService } from '@aura-nw/aura-kms'; +import { ConfigService } from '@nestjs/config'; +import { Secp256k1HdWallet } from '@cosmjs/amino'; +import { GasPrice } from '@cosmjs/stargate'; +import { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate'; +import { RequestService } from '../request/request.service'; + +@Injectable() +export class KMSBuilderService { + private readonly logger = new Logger(KMSBuilderService.name); + private SystemKey = null; + private KMS: KMSService = null; + + constructor( + private requestService: RequestService, + private configService: ConfigService + ) {} + + async loadKMS() { + if (this.KMS) return this.KMS; + const KMS_ACCESS_KEY_ID = this.configService.get( + 'kms.KMS_ACCESS_KEY_ID' + ); + const KMS_SECRET_ACCESS_KEY = this.configService.get( + 'kms.KMS_SECRET_ACCESS_KEY' + ); + const KMS_REGION = this.configService.get('kms.KMS_REGION'); + const KMS_API_VERSION = this.configService.get( + 'kms.KMS_API_VERSION' + ); + return new KMSService( + KMS_ACCESS_KEY_ID, + KMS_SECRET_ACCESS_KEY, + KMS_REGION, + KMS_API_VERSION + ); + } + + async getSeed(encryptedSeed: string) { + const buffer = Buffer.from(encryptedSeed, 'base64'); + const keyId = 'alias/' + this.configService.get('kms.alias'); + const decryptedData = await this.KMS.decrypt(keyId, buffer); + + const bufferSeed = Buffer.from(decryptedData.Plaintext, 'base64'); + const originalSeed = bufferSeed.toString('ascii'); + return originalSeed; + } + + async getClient(wallet: Secp256k1HdWallet) { + const rpcEndpoint = this.configService.get('rpc.endpoint'); + const gasPrice = GasPrice.fromString( + this.configService.get('aura.gasprice') + ); + return SigningCosmWasmClient.connectWithSigner(rpcEndpoint, wallet, { + gasPrice, + }); + } + + async transferToken(senderInfo: any, msgs: any, memo: string, token: string) { + // try { + const data = senderInfo.encrypt_key; + const deserializeData = { + type: 'secp256k1wallet-v1', + kdf: { + algorithm: 'argon2id', + params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, + }, + encryption: { algorithm: 'xchacha20poly1305-ietf' }, + data: data, + }; + // get secret key + if (!this.SystemKey) { + this.SystemKey = await this.getSystemKey(token); + } + const wallet = await Secp256k1HdWallet.deserialize( + JSON.stringify(deserializeData), + this.SystemKey + ); + const client = await this.getClient(wallet); + + const result = await client.signAndBroadcast( + senderInfo.wallet_address, + msgs, + 'auto' + // memo, + ); + + return result.transactionHash; + } +} diff --git a/src/keys/syskey.service.ts b/src/keys/syskey.service.ts index 25bf4793..3882c907 100644 --- a/src/keys/syskey.service.ts +++ b/src/keys/syskey.service.ts @@ -1,10 +1,28 @@ -import { Injectable, Logger } from '@nestjs/common'; +import { CACHE_MANAGER } from '@nestjs/cache-manager'; +import { Cache } from 'cache-manager'; +import { Inject, Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; +import { KeysGraphql } from './keys.graphql'; @Injectable() export class SysKeyService { private readonly logger = new Logger(SysKeyService.name); - constructor(private configService: ConfigService) {} + private seed = ''; - instantiate() {} + constructor( + private configService: ConfigService, + private keysGraphql: KeysGraphql, + @Inject(CACHE_MANAGER) + private cacheManager: Cache + ) {} + + async instantiate() { + // get seed from cache + let seed = await this.cacheManager.get('original-seed'); + + if (seed === null) { + // get from db + const encryptedSeed = this.keysGraphql.queryEncryptedSystemKey(); + } + } } diff --git a/yarn.lock b/yarn.lock index 202da94c..95021309 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,29 @@ ora "5.4.1" rxjs "7.8.1" +"@aura-nw/aura-kms@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@aura-nw/aura-kms/-/aura-kms-0.0.5.tgz#406639d2c024c8532ebc342e850703f555091860" + integrity sha512-3/VJV60kEiy2HpwbvhUyTDZrpxFV1Wm2AfpOTjuxxjvuTT+gg7+Wa7YSYNWuZEbgGRE2sVG9RhXiHN2Zrobpgg== + dependencies: + "@cosmjs/amino" "^0.28.9" + "@cosmjs/cosmwasm-stargate" "^0.29.5" + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.0" + "@cosmjs/json-rpc" "^0.30.1" + "@cosmjs/proto-signing" "^0.29.5" + "@cosmjs/stargate" "^0.29.5" + "@cosmjs/tendermint-rpc" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + "@types/ledgerhq__hw-transport" "^4.21.4" + asn1.js "^5.4.1" + asn1js "^3.0.5" + aws-sdk "^2.1410.0" + bignumber.js "^9.1.1" + cosmjs-types "^0.8.0" + cosmwasm "^1.1.1" + strip-hex-prefix "^1.0.0" + "@authorizerdev/authorizer-js@^1.2.3": version "1.2.4" resolved "https://registry.yarnpkg.com/@authorizerdev/authorizer-js/-/authorizer-js-1.2.4.tgz#8f53bb681e1ce76f5d49c6ea768dc767a12d9bb6" @@ -915,6 +938,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/runtime@^7.11.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" @@ -954,6 +984,400 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@confio/ics23@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" + integrity sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w== + dependencies: + "@noble/hashes" "^1.0.0" + protobufjs "^6.8.8" + +"@cosmjs/amino@0.28.13", "@cosmjs/amino@^0.28.3", "@cosmjs/amino@^0.28.9": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.13.tgz#b51417a23c1ff8ef8b85a6862eba8492c6c44f38" + integrity sha512-IHnH2zGwaY69qT4mVAavr/pfzx6YE+ud1NHJbvVePlbGiz68CXTi5LHR+K0lrKB5mQ7E+ZErWz2mw5U/x+V1wQ== + dependencies: + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" + +"@cosmjs/amino@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.5.tgz#053b4739a90b15b9e2b781ccd484faf64bd49aec" + integrity sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw== + dependencies: + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + +"@cosmjs/cli@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/cli/-/cli-0.28.13.tgz#501cab1454353b6e90c0d4928a15adc3a9ca8ddb" + integrity sha512-6mbtKmaamKYgaXblSyLCsyEUJTa0GpZLt+ODfwdEUpEdx/Ebwqt09yuCmk0kOQ/TqmruX8aN/ty1py3Opxa/FQ== + dependencies: + "@cosmjs/amino" "0.28.13" + "@cosmjs/cosmwasm-stargate" "0.28.13" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/faucet-client" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/proto-signing" "0.28.13" + "@cosmjs/stargate" "0.28.13" + "@cosmjs/tendermint-rpc" "0.28.13" + "@cosmjs/utils" "0.28.13" + axios "^0.21.2" + babylon "^6.18.0" + chalk "^4" + cosmjs-types "^0.4.0" + diff "^4" + recast "^0.20" + ts-node "^8" + typescript "~4.4" + yargs "^15.3.1" + +"@cosmjs/cosmwasm-stargate@0.28.13", "@cosmjs/cosmwasm-stargate@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.28.13.tgz#bea77bc999aaafdb677f446465f648cd000c5b4a" + integrity sha512-dVZNOiRd8btQreRUabncGhVXGCS2wToXqxi9l3KEHwCJQ2RWTshuqV+EZAdCaYHE5W6823s2Ol2W/ukA9AXJPw== + dependencies: + "@cosmjs/amino" "0.28.13" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/proto-signing" "0.28.13" + "@cosmjs/stargate" "0.28.13" + "@cosmjs/tendermint-rpc" "0.28.13" + "@cosmjs/utils" "0.28.13" + cosmjs-types "^0.4.0" + long "^4.0.0" + pako "^2.0.2" + +"@cosmjs/cosmwasm-stargate@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.29.5.tgz#3f257da682658833e0f4eb9e8ff758e4d927663a" + integrity sha512-TNdSvm2tEE3XMCuxHxquzls56t40hC8qnLeYJWHsY2ECZmRK3KrnpRReEr7N7bLtODToK7X/riYrV0JaYxjrYA== + dependencies: + "@cosmjs/amino" "^0.29.5" + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/proto-signing" "^0.29.5" + "@cosmjs/stargate" "^0.29.5" + "@cosmjs/tendermint-rpc" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" + long "^4.0.0" + pako "^2.0.2" + +"@cosmjs/crypto@0.28.13", "@cosmjs/crypto@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.13.tgz#541b6a36f616b2da5a568ead46d4e83841ceb412" + integrity sha512-ynKfM0q/tMBQMHJby6ad8lR3gkgBKaelQhIsCZTjClsnuC7oYT9y3ThSZCUWr7Pa9h0J8ahU2YV2oFWFVWJQzQ== + dependencies: + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.3" + libsodium-wrappers "^0.7.6" + +"@cosmjs/crypto@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.29.5.tgz#ab99fc382b93d8a8db075780cf07487a0f9519fd" + integrity sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ== + dependencies: + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers "^0.7.6" + +"@cosmjs/crypto@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.30.1.tgz#21e94d5ca8f8ded16eee1389d2639cb5c43c3eb5" + integrity sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ== + dependencies: + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers "^0.7.6" + +"@cosmjs/encoding@0.28.13", "@cosmjs/encoding@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b" + integrity sha512-jtXbAYtV77rLHxoIrjGFsvgGjeTKttuHRv6cvuy3toCZzY7JzTclKH5O2g36IIE4lXwD9xwuhGJ2aa6A3dhNkA== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/encoding@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.29.5.tgz#009a4b1c596cdfd326f30ccfa79f5e56daa264f2" + integrity sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/encoding@^0.30.0", "@cosmjs/encoding@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.30.1.tgz#b5c4e0ef7ceb1f2753688eb96400ed70f35c6058" + integrity sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/faucet-client@0.28.13", "@cosmjs/faucet-client@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/faucet-client/-/faucet-client-0.28.13.tgz#0de75edbb997c852a62003f07c619899b3403a68" + integrity sha512-M6f0Wbw3hvdfYbVpfGDXwjbRAcCgMRm5slWK6cU8BpotckLvBb0xoBvrhklG/ooz6ZTZfAc2e/EJ8GVhksdvpA== + dependencies: + axios "^0.21.2" + +"@cosmjs/json-rpc@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.28.13.tgz#ff3f0c4a2f363b1a2c6779f8624a897e217fe297" + integrity sha512-fInSvg7x9P6p+GWqet+TMhrMTM3OWWdLJOGS5w2ryubMjgpR1rLiAx77MdTNkArW+/6sUwku0sN4veM4ENQu6A== + dependencies: + "@cosmjs/stream" "0.28.13" + xstream "^11.14.0" + +"@cosmjs/json-rpc@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.29.5.tgz#5e483a9bd98a6270f935adf0dfd8a1e7eb777fe4" + integrity sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w== + dependencies: + "@cosmjs/stream" "^0.29.5" + xstream "^11.14.0" + +"@cosmjs/json-rpc@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" + integrity sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ== + dependencies: + "@cosmjs/stream" "^0.30.1" + xstream "^11.14.0" + +"@cosmjs/ledger-amino@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/ledger-amino/-/ledger-amino-0.28.13.tgz#b14cbcc72f600c7dd806def4c9e71fc35fce5eb0" + integrity sha512-KSwYjIFu/KXarvxxEyq3lpcJl5VvV0gAbY+tebeOvuCGHy9Px7CDOLOEHsR3ykJjYWh0hGrYwYmVk9zVHd474A== + dependencies: + "@cosmjs/amino" "0.28.13" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" + ledger-cosmos-js "^2.1.8" + semver "^7.3.2" + +"@cosmjs/math@0.28.13", "@cosmjs/math@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.13.tgz#50c05bc67007a04216f7f5e0c93f57270f8cc077" + integrity sha512-PDpL8W/kbyeWi0mQ2OruyqE8ZUAdxPs1xCbDX3WXJwy2oU+X2UTbkuweJHVpS9CIqmZulBoWQAmlf6t6zr1N/g== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/math@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.29.5.tgz#722c96e080d6c2b62215ce9f4c70da7625b241b6" + integrity sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/math@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" + integrity sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/proto-signing@0.28.13", "@cosmjs/proto-signing@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61" + integrity sha512-nSl/2ZLsUJYz3Ad0RY3ihZUgRHIow2OnYqKsESMu+3RA/jTi9bDYhiBu8mNMHI0xrEJry918B2CyI56pOUHdPQ== + dependencies: + "@cosmjs/amino" "0.28.13" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" + cosmjs-types "^0.4.0" + long "^4.0.0" + +"@cosmjs/proto-signing@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.5.tgz#af3b62a46c2c2f1d2327d678b13b7262db1fe87c" + integrity sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA== + dependencies: + "@cosmjs/amino" "^0.29.5" + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" + long "^4.0.0" + +"@cosmjs/socket@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.28.13.tgz#d8443ad6e91d080fc6b80a7e9cf297a56b1f6833" + integrity sha512-lavwGxQ5VdeltyhpFtwCRVfxeWjH5D5mmN7jgx9nuCf3XSFbTcOYxrk2pQ4usenu1Q1KZdL4Yl5RCNrJuHD9Ug== + dependencies: + "@cosmjs/stream" "0.28.13" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + +"@cosmjs/socket@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.29.5.tgz#a48df6b4c45dc6a6ef8e47232725dd4aa556ac2d" + integrity sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ== + dependencies: + "@cosmjs/stream" "^0.29.5" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + +"@cosmjs/socket@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.30.1.tgz#00b22f4b5e2ab01f4d82ccdb7b2e59536bfe5ce0" + integrity sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow== + dependencies: + "@cosmjs/stream" "^0.30.1" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + +"@cosmjs/stargate@0.28.13", "@cosmjs/stargate@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.28.13.tgz#a73d837a46ee8944e6eafe162f2ff6943c14350e" + integrity sha512-dVBMazDz8/eActHsRcZjDHHptOBMqvibj5CFgEtZBp22gP6ASzoAUXTlkSVk5FBf4sfuUHoff6st134/+PGMAg== + dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/proto-signing" "0.28.13" + "@cosmjs/stream" "0.28.13" + "@cosmjs/tendermint-rpc" "0.28.13" + "@cosmjs/utils" "0.28.13" + cosmjs-types "^0.4.0" + long "^4.0.0" + protobufjs "~6.11.3" + xstream "^11.14.0" + +"@cosmjs/stargate@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.29.5.tgz#d597af1c85a3c2af7b5bdbec34d5d40692cc09e4" + integrity sha512-hjEv8UUlJruLrYGJcUZXM/CziaINOKwfVm2BoSdUnNTMxGvY/jC1ABHKeZUYt9oXHxEJ1n9+pDqzbKc8pT0nBw== + dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/proto-signing" "^0.29.5" + "@cosmjs/stream" "^0.29.5" + "@cosmjs/tendermint-rpc" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" + long "^4.0.0" + protobufjs "~6.11.3" + xstream "^11.14.0" + +"@cosmjs/stream@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.28.13.tgz#1e79d1116fda1e63e5ecddbd9d803d403942b1fa" + integrity sha512-AnjtfwT8NwPPkd3lhZhjOlOzT0Kn9bgEu2IPOZjQ1nmG2bplsr6TJmnwn0dJxHT7UGtex17h6whKB5N4wU37Wg== + dependencies: + xstream "^11.14.0" + +"@cosmjs/stream@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.29.5.tgz#350981cac496d04939b92ee793b9b19f44bc1d4e" + integrity sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA== + dependencies: + xstream "^11.14.0" + +"@cosmjs/stream@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a" + integrity sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ== + dependencies: + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.13.tgz#0bf587ae66fa3f88319edbd258492d28e73f9f29" + integrity sha512-GB+ZmfuJIGQm0hsRtLYjeR3lOxF7Z6XyCBR0cX5AAYOZzSEBJjevPgUHD6tLn8zIhvzxaW3/VKnMB+WmlxdH4w== + dependencies: + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/json-rpc" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/socket" "0.28.13" + "@cosmjs/stream" "0.28.13" + "@cosmjs/utils" "0.28.13" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.29.5.tgz#f205c10464212bdf843f91bb2e4a093b618cb5c2" + integrity sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w== + dependencies: + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/json-rpc" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/socket" "^0.29.5" + "@cosmjs/stream" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.30.1.tgz#c16378892ba1ac63f72803fdf7567eab9d4f0aa0" + integrity sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ== + dependencies: + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/json-rpc" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/socket" "^0.30.1" + "@cosmjs/stream" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" + +"@cosmjs/utils@0.28.13", "@cosmjs/utils@^0.28.3": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.13.tgz#2fd2844ec832d7833811e2ae1691305d09791a08" + integrity sha512-dVeMBiyg+46x7XBZEfJK8yTihphbCFpjVYmLJVqmTsHfJwymQ65cpyW/C+V/LgWARGK8hWQ/aX9HM5Ao8QmMSg== + +"@cosmjs/utils@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.29.5.tgz#3fed1b3528ae8c5f1eb5d29b68755bebfd3294ee" + integrity sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ== + +"@cosmjs/utils@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" + integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -1301,6 +1725,35 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@ledgerhq/devices@^5.51.1": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7" + integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA== + dependencies: + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/logs" "^5.50.0" + rxjs "6" + semver "^7.3.5" + +"@ledgerhq/errors@^5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9" + integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow== + +"@ledgerhq/hw-transport@^5.25.0": + version "5.51.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578" + integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + events "^3.3.0" + +"@ledgerhq/logs@^5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" + integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== + "@lukeed/csprng@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" @@ -1452,6 +1905,11 @@ dependencies: tslib "2.5.3" +"@noble/hashes@^1", "@noble/hashes@^1.0.0": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2109,6 +2567,13 @@ dependencies: "@types/node" "*" +"@types/ledgerhq__hw-transport@^4.21.4": + version "4.21.5" + resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport/-/ledgerhq__hw-transport-4.21.5.tgz#32c11b0bbcaeb42ee5af1144b0dd6cfc26806236" + integrity sha512-P/Og33z6FcpxM51jSZTPds+4T78u4+QjgeNSUlCTDIas1MBbA1UNWiG+AsXBcmYAWg3TbTO0nK+cTCUKAVUxEQ== + dependencies: + "@types/node" "*" + "@types/lodash@^4.14.195": version "4.14.195" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" @@ -2464,6 +2929,32 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + async-hook-jl@^1.7.6: version "1.7.6" resolved "https://registry.yarnpkg.com/async-hook-jl/-/async-hook-jl-1.7.6.tgz#4fd25c2f864dbaf279c610d73bf97b1b28595e68" @@ -2476,6 +2967,34 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sdk@^2.1410.0: + version "2.1472.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1472.0.tgz#f9bbdea05b6c0b83e97779f91da01857354f10e9" + integrity sha512-U7kAHRbvTy753IXKV8Oom/AqlqnsbXG+Kw5gRbKi6VcsZ3hR/EpNMzdRXTWO5U415bnLWGo8WAqIz67PIaaKsw== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + util "^0.12.4" + uuid "8.0.0" + xml2js "0.5.0" + +axios@^0.21.2: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axios@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" @@ -2545,21 +3064,36 @@ babel-preset-jest@^29.5.0: babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bech32@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + bignumber.js@^9.0.0: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== +bignumber.js@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2582,6 +3116,16 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +bn.js@^4.0.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -2638,6 +3182,11 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" @@ -2695,6 +3244,15 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -2737,7 +3295,7 @@ cache-manager@^5.2.4: lodash.clonedeep "^4.5.0" lru-cache "^10.0.1" -call-bind@^1.0.0: +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -2750,7 +3308,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -2774,7 +3332,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4, chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2843,6 +3401,15 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -2992,6 +3559,47 @@ cors@2.8.5: object-assign "^4" vary "^1" +cosmjs-types@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.4.1.tgz#3b2a53ba60d33159dd075596ce8267cfa7027063" + integrity sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + +cosmjs-types@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.5.2.tgz#2d42b354946f330dfb5c90a87fdc2a36f97b965d" + integrity sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + +cosmjs-types@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.8.0.tgz#2ed78f3e990f770229726f95f3ef5bf9e2b6859b" + integrity sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + +cosmwasm@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cosmwasm/-/cosmwasm-1.1.1.tgz#02b22a269044c61714c85fa55e624b2f83f7c086" + integrity sha512-tjpjwnRIQ6VEcTVB0Pq8+F+Xp6jdnC3BcXmcDHCJHIc5Gg4Mm++AA+6fTfR0yuiPbEAk6wYkokfLtv12I0sPNQ== + dependencies: + "@cosmjs/amino" "^0.28.3" + "@cosmjs/cli" "^0.28.3" + "@cosmjs/cosmwasm-stargate" "^0.28.3" + "@cosmjs/crypto" "^0.28.3" + "@cosmjs/encoding" "^0.28.3" + "@cosmjs/faucet-client" "^0.28.3" + "@cosmjs/ledger-amino" "^0.28.3" + "@cosmjs/math" "^0.28.3" + "@cosmjs/proto-signing" "^0.28.3" + "@cosmjs/stargate" "^0.28.3" + "@cosmjs/utils" "^0.28.3" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -3051,6 +3659,11 @@ debuglog@^1.0.0: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" @@ -3126,6 +3739,24 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -3164,7 +3795,7 @@ diff-sequences@^29.4.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== -diff@^4.0.1: +diff@^4, diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -3227,6 +3858,19 @@ electron-to-chromium@^1.4.431: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz#25a23370f4ae8aaa8f77aaf00133aa4994f4148e" integrity sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg== +elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emitter-listener@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8" @@ -3375,7 +4019,7 @@ espree@^9.6.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3419,6 +4063,16 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +events@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -3635,11 +4289,23 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +follow-redirects@^1.14.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3712,12 +4378,12 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -3788,6 +4454,13 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -3830,6 +4503,13 @@ google-gax@^4.0.3: protobufjs "7.2.4" retry-request "^6.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.10, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -3858,16 +4538,30 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3875,11 +4569,37 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hexoid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -3916,7 +4636,12 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3955,7 +4680,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3980,6 +4705,14 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3997,6 +4730,11 @@ is-buffer@~1.1.6: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-core-module@^2.11.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -4019,6 +4757,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4026,6 +4771,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -4056,12 +4806,19 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-typed-array@^1.1.3: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -isarray@~1.0.0: +isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -4071,6 +4828,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -4477,6 +5239,11 @@ jest@^29.0.0: import-local "^3.0.2" jest-cli "^29.6.1" +jmespath@0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" + integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4588,6 +5355,16 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +ledger-cosmos-js@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/ledger-cosmos-js/-/ledger-cosmos-js-2.1.8.tgz#b409ecd1e77f630e6fb212a9f602fe5c6e8f054b" + integrity sha512-Gl7SWMq+3R9OTkF1hLlg5+1geGOmcHX9OdS+INDsGNxSiKRWlsWCvQipGoDnRIQ6CPo2i/Ze58Dw0Mt/l3UYyA== + dependencies: + "@babel/runtime" "^7.11.2" + "@ledgerhq/hw-transport" "^5.25.0" + bech32 "^1.1.4" + ripemd160 "^2.0.2" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -4606,6 +5383,18 @@ libphonenumber-js@^1.10.14: resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz#185264130c9375f17d0c487a288223294579929c" integrity sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw== +libsodium-wrappers@^0.7.6: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== + dependencies: + libsodium "^0.7.13" + +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -4804,6 +5593,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4953,6 +5752,11 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -5034,6 +5838,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -5209,6 +6018,25 @@ protobufjs@7.2.4, protobufjs@^7.0.0, protobufjs@^7.2.4: "@types/node" ">=13.7.0" long "^5.0.0" +protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -5222,6 +6050,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -5232,6 +6065,18 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== +pvtsutils@^1.3.2: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -5246,6 +6091,11 @@ qs@^6.11.0: dependencies: side-channel "^1.0.4" +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -5294,7 +6144,7 @@ readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -5310,6 +6160,21 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readonly-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" + integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== + +recast@^0.20: + version "0.20.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + redis-errors@^1.0.0, redis-errors@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" @@ -5327,6 +6192,11 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5337,6 +6207,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -5403,6 +6278,14 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +ripemd160@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -5410,6 +6293,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@6: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + rxjs@7.8.1, rxjs@^7.2.0: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -5417,7 +6307,7 @@ rxjs@7.8.1, rxjs@^7.2.0: dependencies: tslib "^2.1.0" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5427,11 +6317,21 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + +sax@>=0.6.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + seek-bzip@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" @@ -5449,7 +6349,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -5485,6 +6385,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -5539,7 +6444,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.12, source-map-support@^0.5.20: +source-map-support@^0.5.12, source-map-support@^0.5.17, source-map-support@^0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -5552,7 +6457,7 @@ source-map@0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -5654,6 +6559,13 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-json-comments@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5724,6 +6636,11 @@ swagger-ui-dist@5.1.0: resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz#b01b3be06bebb2566b2df586c1632d502ec792ad" integrity sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg== +symbol-observable@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" + integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== + tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" @@ -5842,6 +6759,17 @@ ts-node@^10.0.0, ts-node@^10.4.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-node@^8: + version "8.10.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + tsconfig-paths@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" @@ -5871,11 +6799,16 @@ tslib@2.6.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.5.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== -tslib@^1.11.1, tslib@^1.8.1: +tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.1, tslib@^2.4.0, tslib@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -5923,6 +6856,11 @@ typescript@^5.0.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== +typescript@~4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + uid@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/uid/-/uid-2.0.2.tgz#4b5782abf0f2feeefc00fa88006b2b3b7af3e3b9" @@ -5958,16 +6896,40 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" + integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== + uuid@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" @@ -6029,6 +6991,22 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -6036,6 +7014,15 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -6058,11 +7045,42 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@^7: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xml2js@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xstream@^11.14.0: + version "11.14.0" + resolved "https://registry.yarnpkg.com/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5" + integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw== + dependencies: + globalthis "^1.0.1" + symbol-observable "^2.0.3" + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -6078,11 +7096,36 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" From 06845a3b5b2528dc09e6dd8ae97232423ff5593c Mon Sep 17 00:00:00 2001 From: harisato Date: Thu, 12 Oct 2023 15:13:34 +0700 Subject: [PATCH 4/9] feat(be): init seed --- src/app.module.ts | 2 + src/keys/keys.graphql.ts | 36 +++++++++++- src/keys/kms.service.ts | 110 +++++++++++++++++-------------------- src/keys/syskey.module.ts | 8 ++- src/keys/syskey.service.ts | 34 +++++++----- src/keys/util.ts | 9 +++ 6 files changed, 121 insertions(+), 78 deletions(-) create mode 100644 src/keys/util.ts diff --git a/src/app.module.ts b/src/app.module.ts index cd23d0bd..80bd84c3 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -14,6 +14,7 @@ import { MangaModule } from './manga/manga.module'; import { TasksModule } from './task/task.module'; import { UserModule } from './user/user.module'; import { QuestModule } from './quest/quest.module'; +import { SysKeyModule } from './keys/syskey.module'; @Module({ imports: [ @@ -32,6 +33,7 @@ import { QuestModule } from './quest/quest.module'; GraphqlModule, UserModule, QuestModule, + SysKeyModule, ], controllers: [], providers: [ diff --git a/src/keys/keys.graphql.ts b/src/keys/keys.graphql.ts index 2e7b9138..c1551c51 100644 --- a/src/keys/keys.graphql.ts +++ b/src/keys/keys.graphql.ts @@ -1,15 +1,17 @@ +import { Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; + import { GraphqlService } from '../graphql/graphql.service'; -import { Injectable } from '@nestjs/common'; @Injectable() export class KeysGraphql { + private readonly logger = new Logger(KeysGraphql.name); constructor( private configSvc: ConfigService, private graphqlSvc: GraphqlService ) {} - async queryEncryptedSystemKey() { + async queryEncryptedSeed() { const headers = { 'x-hasura-admin-secret': this.configSvc.get( 'graphql.adminSecret' @@ -32,4 +34,34 @@ export class KeysGraphql { return result.data.system_key[0]; } + + async storeEncryptedSeed(encryptedSeed: string) { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + + const result = await this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `mutation insert_system_key($encrypted_seed: String!) { + insert_system_key(objects: {encrypted_seed: $encrypted_seed}) { + affected_rows + } + }`, + 'insert_system_key', + { + encrypted_seed: encryptedSeed, + }, + headers + ); + + this.logger.debug(result); + if (result.data?.insert_system_key?.affected_rows > 0) { + this.logger.debug(`Insert system key success`); + } else { + this.logger.debug(`Insert system key fail`); + } + } } diff --git a/src/keys/kms.service.ts b/src/keys/kms.service.ts index 500832da..4335ab63 100644 --- a/src/keys/kms.service.ts +++ b/src/keys/kms.service.ts @@ -4,7 +4,6 @@ import { ConfigService } from '@nestjs/config'; import { Secp256k1HdWallet } from '@cosmjs/amino'; import { GasPrice } from '@cosmjs/stargate'; import { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate'; -import { RequestService } from '../request/request.service'; @Injectable() export class KMSBuilderService { @@ -12,28 +11,12 @@ export class KMSBuilderService { private SystemKey = null; private KMS: KMSService = null; - constructor( - private requestService: RequestService, - private configService: ConfigService - ) {} - - async loadKMS() { - if (this.KMS) return this.KMS; - const KMS_ACCESS_KEY_ID = this.configService.get( - 'kms.KMS_ACCESS_KEY_ID' - ); - const KMS_SECRET_ACCESS_KEY = this.configService.get( - 'kms.KMS_SECRET_ACCESS_KEY' - ); - const KMS_REGION = this.configService.get('kms.KMS_REGION'); - const KMS_API_VERSION = this.configService.get( - 'kms.KMS_API_VERSION' - ); - return new KMSService( - KMS_ACCESS_KEY_ID, - KMS_SECRET_ACCESS_KEY, - KMS_REGION, - KMS_API_VERSION + constructor(private configService: ConfigService) { + this.KMS = new KMSService( + this.configService.get('kms.accessKeyId'), + this.configService.get('kms.secretAccessKey'), + this.configService.get('kms.region'), + this.configService.get('kms.apiVersion') ); } @@ -47,45 +30,52 @@ export class KMSBuilderService { return originalSeed; } - async getClient(wallet: Secp256k1HdWallet) { - const rpcEndpoint = this.configService.get('rpc.endpoint'); - const gasPrice = GasPrice.fromString( - this.configService.get('aura.gasprice') - ); - return SigningCosmWasmClient.connectWithSigner(rpcEndpoint, wallet, { - gasPrice, - }); + async encryptSeed(seed: string) { + const keyId = 'alias/' + this.configService.get('kms.alias'); + const encryptedData = await this.KMS.encrypt(keyId, seed); + + return Buffer.from(encryptedData.CiphertextBlob).toString('base64'); } - async transferToken(senderInfo: any, msgs: any, memo: string, token: string) { - // try { - const data = senderInfo.encrypt_key; - const deserializeData = { - type: 'secp256k1wallet-v1', - kdf: { - algorithm: 'argon2id', - params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, - }, - encryption: { algorithm: 'xchacha20poly1305-ietf' }, - data: data, - }; - // get secret key - if (!this.SystemKey) { - this.SystemKey = await this.getSystemKey(token); - } - const wallet = await Secp256k1HdWallet.deserialize( - JSON.stringify(deserializeData), - this.SystemKey - ); - const client = await this.getClient(wallet); + // async getClient(wallet: Secp256k1HdWallet) { + // const rpcEndpoint = this.configService.get('rpc.endpoint'); + // const gasPrice = GasPrice.fromString( + // this.configService.get('aura.gasprice') + // ); + // return SigningCosmWasmClient.connectWithSigner(rpcEndpoint, wallet, { + // gasPrice, + // }); + // } - const result = await client.signAndBroadcast( - senderInfo.wallet_address, - msgs, - 'auto' - // memo, - ); + // async transferToken(senderInfo: any, msgs: any, memo: string, token: string) { + // // try { + // const data = senderInfo.encrypt_key; + // const deserializeData = { + // type: 'secp256k1wallet-v1', + // kdf: { + // algorithm: 'argon2id', + // params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, + // }, + // encryption: { algorithm: 'xchacha20poly1305-ietf' }, + // data: data, + // }; + // // get secret key + // if (!this.SystemKey) { + // this.SystemKey = await this.getSystemKey(token); + // } + // const wallet = await Secp256k1HdWallet.deserialize( + // JSON.stringify(deserializeData), + // this.SystemKey + // ); + // const client = await this.getClient(wallet); - return result.transactionHash; - } + // const result = await client.signAndBroadcast( + // senderInfo.wallet_address, + // msgs, + // 'auto' + // // memo, + // ); + + // return result.transactionHash; + // } } diff --git a/src/keys/syskey.module.ts b/src/keys/syskey.module.ts index ee0b38ad..0459f385 100644 --- a/src/keys/syskey.module.ts +++ b/src/keys/syskey.module.ts @@ -1,8 +1,12 @@ import { Module } from '@nestjs/common'; +import { SysKeyService } from './syskey.service'; +import { KMSBuilderService } from './kms.service'; +import { KeysGraphql } from './keys.graphql'; +import { GraphqlModule } from '../graphql/graphql.module'; @Module({ - imports: [], - providers: [], + imports: [GraphqlModule], + providers: [SysKeyService, KMSBuilderService, KeysGraphql], exports: [], }) export class SysKeyModule {} diff --git a/src/keys/syskey.service.ts b/src/keys/syskey.service.ts index 3882c907..b8f0743b 100644 --- a/src/keys/syskey.service.ts +++ b/src/keys/syskey.service.ts @@ -1,28 +1,34 @@ -import { CACHE_MANAGER } from '@nestjs/cache-manager'; -import { Cache } from 'cache-manager'; -import { Inject, Injectable, Logger } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; +import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { KeysGraphql } from './keys.graphql'; +import { KMSBuilderService } from './kms.service'; +import { randomSeed } from './util'; @Injectable() -export class SysKeyService { +export class SysKeyService implements OnModuleInit { private readonly logger = new Logger(SysKeyService.name); private seed = ''; constructor( - private configService: ConfigService, private keysGraphql: KeysGraphql, - @Inject(CACHE_MANAGER) - private cacheManager: Cache + private kmsService: KMSBuilderService ) {} - async instantiate() { - // get seed from cache - let seed = await this.cacheManager.get('original-seed'); + async onModuleInit() { + // get from db + const result = await this.keysGraphql.queryEncryptedSeed(); - if (seed === null) { - // get from db - const encryptedSeed = this.keysGraphql.queryEncryptedSystemKey(); + if (result) { + const encryptedSeed = result.encrypted_seed; + this.seed = await this.kmsService.getSeed(encryptedSeed); + } else { + this.seed = randomSeed(); + // encrypt seed & store db + const encryptedSeed = await this.kmsService.encryptSeed(this.seed); + await this.keysGraphql.storeEncryptedSeed(encryptedSeed); } } + + print() { + this.logger.log(this.seed); + } } diff --git a/src/keys/util.ts b/src/keys/util.ts new file mode 100644 index 00000000..5e47862f --- /dev/null +++ b/src/keys/util.ts @@ -0,0 +1,9 @@ +import { randomFillSync } from 'crypto'; + +export const randomSeed = ( + length = 20, + characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$' +) => + Array.from(randomFillSync(new Uint32Array(length))) + .map((x) => characters[x % characters.length]) + .join(''); From d567f87a54cd5b60075f68776d10256d0c151ee9 Mon Sep 17 00:00:00 2001 From: harisato Date: Fri, 13 Oct 2023 10:58:51 +0700 Subject: [PATCH 5/9] feat(be): store user wallet --- package.json | 2 ++ src/keys/syskey.module.ts | 2 +- src/keys/syskey.service.ts | 4 +-- src/user/user.module.ts | 3 +- src/user/user.service.ts | 25 +++++++++++++-- yarn.lock | 65 +++++++++++++++++++++++++++++++++++++- 6 files changed, 94 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e4021d8f..392065d7 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@aura-nw/aura-kms": "^0.0.5", "@authorizerdev/authorizer-js": "^1.2.3", "@aws-sdk/client-s3": "^3.363.0", + "@cosmjs/amino": "^0.31.1", "@google-analytics/data": "^4.0.0", "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", @@ -38,6 +39,7 @@ "@nestjs/schedule": "^3.0.1", "@nestjs/swagger": "^7.0.12", "axios": "^1.4.0", + "bip39": "^3.1.0", "bull": "^4.10.4", "cache-manager": "^5.2.4", "class-transformer": "^0.5.1", diff --git a/src/keys/syskey.module.ts b/src/keys/syskey.module.ts index 0459f385..67944558 100644 --- a/src/keys/syskey.module.ts +++ b/src/keys/syskey.module.ts @@ -7,6 +7,6 @@ import { GraphqlModule } from '../graphql/graphql.module'; @Module({ imports: [GraphqlModule], providers: [SysKeyService, KMSBuilderService, KeysGraphql], - exports: [], + exports: [SysKeyService], }) export class SysKeyModule {} diff --git a/src/keys/syskey.service.ts b/src/keys/syskey.service.ts index b8f0743b..be1589bc 100644 --- a/src/keys/syskey.service.ts +++ b/src/keys/syskey.service.ts @@ -28,7 +28,7 @@ export class SysKeyService implements OnModuleInit { } } - print() { - this.logger.log(this.seed); + get originalSeed() { + return this.seed; } } diff --git a/src/user/user.module.ts b/src/user/user.module.ts index 05776469..9ef22e87 100644 --- a/src/user/user.module.ts +++ b/src/user/user.module.ts @@ -5,9 +5,10 @@ import { UserController } from './user.controller'; import { GraphqlModule } from '../graphql/graphql.module'; import { FilesModule } from '../files/files.module'; import { UserGraphql } from './user.graphql'; +import { SysKeyModule } from '../keys/syskey.module'; @Module({ - imports: [JwtModule, GraphqlModule, FilesModule], + imports: [JwtModule, GraphqlModule, FilesModule, SysKeyModule], providers: [UserService, UserGraphql], controllers: [UserController], }) diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 9495e01d..8fa8fd38 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -7,6 +7,9 @@ import { UpdateProfileRequestDto } from './dto/update-profile-request.dto'; import { IUpdateProfile } from './interfaces/update-profile.interface'; import { FilesService } from '../files/files.service'; import { UserGraphql } from './user.graphql'; +import * as bip39 from 'bip39'; +import { Secp256k1HdWallet } from '@cosmjs/amino'; +import { SysKeyService } from '../keys/syskey.service'; @Injectable() export class UserService { @@ -14,8 +17,26 @@ export class UserService { constructor( private configService: ConfigService, private filesService: FilesService, - private userGraphql: UserGraphql - ) {} + private userGraphql: UserGraphql, + private sysKeyService: SysKeyService + ) { + this.generateWallet(); + } + + async generateWallet() { + const mnemonic = bip39.generateMnemonic(); + const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: 'aura', + }); + + const account = await wallet.getAccounts(); + const serializedWallet = await wallet.serialize( + this.sysKeyService.originalSeed + ); + + // store db + console.log(serializedWallet); + } async updateProfile( data: UpdateProfileRequestDto, diff --git a/yarn.lock b/yarn.lock index 95021309..494644c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1012,6 +1012,16 @@ "@cosmjs/math" "^0.29.5" "@cosmjs/utils" "^0.29.5" +"@cosmjs/amino@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.1.tgz#e6b4adc3ebe19ddfd953c67ee04b1eae488238af" + integrity sha512-kkB9IAkNEUFtjp/uwHv95TgM8VGJ4VWfZwrTyLNqBDD1EpSX2dsNrmUe7k8OMPzKlZUFcKmD4iA0qGvIwzjbGA== + dependencies: + "@cosmjs/crypto" "^0.31.1" + "@cosmjs/encoding" "^0.31.1" + "@cosmjs/math" "^0.31.1" + "@cosmjs/utils" "^0.31.1" + "@cosmjs/cli@^0.28.3": version "0.28.13" resolved "https://registry.yarnpkg.com/@cosmjs/cli/-/cli-0.28.13.tgz#501cab1454353b6e90c0d4928a15adc3a9ca8ddb" @@ -1110,6 +1120,19 @@ elliptic "^6.5.4" libsodium-wrappers "^0.7.6" +"@cosmjs/crypto@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.1.tgz#ce4917df0f7b38f0909a32020907ccff04acefe6" + integrity sha512-4R/SqdzdVzd4E5dpyEh1IKm5GbTqwDogutyIyyb1bcOXiX/x3CrvPI9Tb4WSIMDLvlb5TVzu2YnUV51Q1+6mMA== + dependencies: + "@cosmjs/encoding" "^0.31.1" + "@cosmjs/math" "^0.31.1" + "@cosmjs/utils" "^0.31.1" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers-sumo "^0.7.11" + "@cosmjs/encoding@0.28.13", "@cosmjs/encoding@^0.28.3": version "0.28.13" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b" @@ -1137,6 +1160,15 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.1.tgz#0041b2650c443d883e22f27c7d3cd7b844c6d0ec" + integrity sha512-IuxP6ewwX6vg9sUJ8ocJD92pkerI4lyG8J5ynAM3NaX3q+n+uMoPRSQXNeL9bnlrv01FF1kIm8if/f5F7ZPtkA== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + "@cosmjs/faucet-client@0.28.13", "@cosmjs/faucet-client@^0.28.3": version "0.28.13" resolved "https://registry.yarnpkg.com/@cosmjs/faucet-client/-/faucet-client-0.28.13.tgz#0de75edbb997c852a62003f07c619899b3403a68" @@ -1202,6 +1234,13 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/math@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.1.tgz#74c02cf237c2996b77661b636b014168b18d95e6" + integrity sha512-kiuHV6m6DSB8/4UV1qpFhlc4ul8SgLXTGRlYkYiIIP4l0YNeJ+OpPYaOlEgx4Unk2mW3/O2FWYj7Jc93+BWXng== + dependencies: + bn.js "^5.2.0" + "@cosmjs/proto-signing@0.28.13", "@cosmjs/proto-signing@^0.28.3": version "0.28.13" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61" @@ -1378,6 +1417,11 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== +"@cosmjs/utils@^0.31.1": + version "0.31.1" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.1.tgz#e6055cd7d722fa72df9cbd0d39cd1f7a9ac80483" + integrity sha512-n4Se1wu4GnKwztQHNFfJvUeWcpvx3o8cWhSbNs9JQShEuB3nv3R5lqFBtDCgHZF/emFQAP+ZjF8bTfCs9UBGhA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -1905,7 +1949,7 @@ dependencies: tslib "2.5.3" -"@noble/hashes@^1", "@noble/hashes@^1.0.0": +"@noble/hashes@^1", "@noble/hashes@^1.0.0", "@noble/hashes@^1.2.0": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== @@ -3099,6 +3143,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bip39@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3" + integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A== + dependencies: + "@noble/hashes" "^1.2.0" + bl@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" @@ -5383,6 +5434,18 @@ libphonenumber-js@^1.10.14: resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz#185264130c9375f17d0c487a288223294579929c" integrity sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw== +libsodium-sumo@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.13.tgz#533b97d2be44b1277e59c1f9f60805978ac5542d" + integrity sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ== + +libsodium-wrappers-sumo@^0.7.11: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.13.tgz#a33aea845a0bb56db067548f04feba28c730ab8e" + integrity sha512-lz4YdplzDRh6AhnLGF2Dj2IUj94xRN6Bh8T0HLNwzYGwPehQJX6c7iYVrFUPZ3QqxE0bqC+K0IIqqZJYWumwSQ== + dependencies: + libsodium-sumo "^0.7.13" + libsodium-wrappers@^0.7.6: version "0.7.13" resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" From 9f4e5e6a3064aa12f353a32955a1b1ed380650e1 Mon Sep 17 00:00:00 2001 From: harisato Date: Fri, 13 Oct 2023 15:06:53 +0700 Subject: [PATCH 6/9] feat: trigger generate address when create user --- docker-compose-hasura.yml | 3 ++ .../tables/public_authorizer_users.yaml | 33 +++++++++++++++++ .../punkga-pg/tables/public_user_wallet.yaml | 3 ++ .../databases/punkga-pg/tables/tables.yaml | 1 + hasura/metadata/query_collections.yaml | 32 ++++++++-------- hasura/metadata/rest_endpoints.yaml | 12 +++--- .../down.sql | 1 + .../up.sql | 1 + .../down.sql | 4 ++ .../up.sql | 2 + .../down.sql | 21 +++++++++++ .../up.sql | 19 ++++++++++ src/user/dto/generate-wallet-request.dto.ts | 6 +++ src/user/user.controller.ts | 33 ++++++++++++----- src/user/user.graphql.ts | 31 +++++++++++++++- src/user/user.service.ts | 37 +++++++++++++------ 16 files changed, 194 insertions(+), 45 deletions(-) create mode 100644 hasura/metadata/databases/punkga-pg/tables/public_user_wallet.yaml create mode 100644 hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/down.sql create mode 100644 hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/up.sql create mode 100644 hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/down.sql create mode 100644 hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/up.sql create mode 100644 hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/down.sql create mode 100644 hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/up.sql create mode 100644 src/user/dto/generate-wallet-request.dto.ts diff --git a/docker-compose-hasura.yml b/docker-compose-hasura.yml index c27e0e7d..d5a12b7a 100644 --- a/docker-compose-hasura.yml +++ b/docker-compose-hasura.yml @@ -33,6 +33,9 @@ services: HASURA_GRAPHQL_UNAUTHORIZED_ROLE: 'anonymous' ACTION_API_DOMAIN: 'http://172.27.10.137:3000' # HASURA_GRAPHQL_ENABLED_APIS: graphql + + WEBHOOK_URL: http://172.27.10.137:3000 + WEBHOOK_SECRET: k4KWf6Mk4Hfx depends_on: data-connector-agent: condition: service_healthy diff --git a/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml b/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml index 2ac698d1..c6e3b731 100644 --- a/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml +++ b/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml @@ -1,6 +1,14 @@ table: name: authorizer_users schema: public +object_relationships: + - name: authorizer_users_user_wallet + using: + foreign_key_constraint_on: + column: user_id + table: + name: user_wallet + schema: public array_relationships: - name: authorizer_users_social_activities using: @@ -69,3 +77,28 @@ update_permissions: _eq: X-Hasura-User-Id set: id: x-hasura-User-Id +event_triggers: + - name: generate_user_wallet + definition: + enable_manual: false + insert: + columns: '*' + retry_conf: + interval_sec: 10 + num_retries: 0 + timeout_sec: 60 + webhook: '{{WEBHOOK_URL}}/user/generate-wallet' + headers: + - name: webhook-secret + value_from_env: WEBHOOK_SECRET + request_transform: + body: + action: transform + template: |- + { + "user_id": {{$body.event.data.new.id}} + } + method: POST + query_params: {} + template_engine: Kriti + version: 2 diff --git a/hasura/metadata/databases/punkga-pg/tables/public_user_wallet.yaml b/hasura/metadata/databases/punkga-pg/tables/public_user_wallet.yaml new file mode 100644 index 00000000..0a582e19 --- /dev/null +++ b/hasura/metadata/databases/punkga-pg/tables/public_user_wallet.yaml @@ -0,0 +1,3 @@ +table: + name: user_wallet + schema: public diff --git a/hasura/metadata/databases/punkga-pg/tables/tables.yaml b/hasura/metadata/databases/punkga-pg/tables/tables.yaml index aef95cf3..94b4b7e9 100644 --- a/hasura/metadata/databases/punkga-pg/tables/tables.yaml +++ b/hasura/metadata/databases/punkga-pg/tables/tables.yaml @@ -21,3 +21,4 @@ - "!include public_system_key.yaml" - "!include public_tag_languages.yaml" - "!include public_tags.yaml" +- "!include public_user_wallet.yaml" diff --git a/hasura/metadata/query_collections.yaml b/hasura/metadata/query_collections.yaml index 7c6cfdf1..7e94be81 100644 --- a/hasura/metadata/query_collections.yaml +++ b/hasura/metadata/query_collections.yaml @@ -829,22 +829,6 @@ user_id } } - - name: Admin - Query all campaign - query: | - query campaign { - campaign { - created_at - updated_at - id - name - status - campaign_quests_aggregate(where: {status:{_eq:"Publish"}}) { - aggregate { - count - } - } - } - } - name: Admin - Query campaign detail query: | query campaign_by_pk ($id: Int!) { @@ -962,3 +946,19 @@ updated_at } } + - name: Admin - Query all campaign + query: | + query campaign { + campaign { + created_at + updated_at + id + name + status + campaign_quests_aggregate(where: {status:{_eq:"Published"}}) { + aggregate { + count + } + } + } + } diff --git a/hasura/metadata/rest_endpoints.yaml b/hasura/metadata/rest_endpoints.yaml index 3aa5ed1f..05534dde 100644 --- a/hasura/metadata/rest_endpoints.yaml +++ b/hasura/metadata/rest_endpoints.yaml @@ -2,19 +2,19 @@ definition: query: collection_name: allowed-queries - query_name: Admin - Query all campaign + query_name: Admin - Create Campaign methods: - - GET - name: Admin - Query all campaign + - POST + name: Admin - Create Campaign url: admin/campaign - comment: "" definition: query: collection_name: allowed-queries - query_name: Admin - Create Campaign + query_name: Admin - Query all campaign methods: - - POST - name: Admin - Create Campaign + - GET + name: Admin - Query all campaign url: admin/campaign - comment: "" definition: diff --git a/hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/down.sql b/hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/down.sql new file mode 100644 index 00000000..287cc1a0 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/down.sql @@ -0,0 +1 @@ +DROP TABLE "public"."user_wallet"; diff --git a/hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/up.sql b/hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/up.sql new file mode 100644 index 00000000..a28fc509 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697181470204_create_table_public_user_wallet/up.sql @@ -0,0 +1 @@ +CREATE TABLE "public"."user_wallet" ("id" serial NOT NULL, "address" text NOT NULL, "data" text NOT NULL, "user_id" bpchar, "is_master_wallet" boolean NOT NULL DEFAULT false, PRIMARY KEY ("id") , FOREIGN KEY ("user_id") REFERENCES "public"."authorizer_users"("id") ON UPDATE restrict ON DELETE restrict, UNIQUE ("address"), UNIQUE ("user_id")); diff --git a/hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/down.sql b/hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/down.sql new file mode 100644 index 00000000..6b37f313 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."user_wallet" add column "created_at" timestamptz +-- null default now(); diff --git a/hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/up.sql b/hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/up.sql new file mode 100644 index 00000000..a3628cdf --- /dev/null +++ b/hasura/migrations/punkga-pg/1697181476394_alter_table_public_user_wallet_add_column_created_at/up.sql @@ -0,0 +1,2 @@ +alter table "public"."user_wallet" add column "created_at" timestamptz + null default now(); diff --git a/hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/down.sql b/hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/down.sql new file mode 100644 index 00000000..53f961dd --- /dev/null +++ b/hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/down.sql @@ -0,0 +1,21 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."user_wallet" add column "updated_at" timestamptz +-- null default now(); +-- +-- CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() +-- RETURNS TRIGGER AS $$ +-- DECLARE +-- _new record; +-- BEGIN +-- _new := NEW; +-- _new."updated_at" = NOW(); +-- RETURN _new; +-- END; +-- $$ LANGUAGE plpgsql; +-- CREATE TRIGGER "set_public_user_wallet_updated_at" +-- BEFORE UPDATE ON "public"."user_wallet" +-- FOR EACH ROW +-- EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); +-- COMMENT ON TRIGGER "set_public_user_wallet_updated_at" ON "public"."user_wallet" +-- IS 'trigger to set value of column "updated_at" to current timestamp on row update'; diff --git a/hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/up.sql b/hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/up.sql new file mode 100644 index 00000000..8d484697 --- /dev/null +++ b/hasura/migrations/punkga-pg/1697181480144_alter_table_public_user_wallet_add_column_updated_at/up.sql @@ -0,0 +1,19 @@ +alter table "public"."user_wallet" add column "updated_at" timestamptz + null default now(); + +CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() +RETURNS TRIGGER AS $$ +DECLARE + _new record; +BEGIN + _new := NEW; + _new."updated_at" = NOW(); + RETURN _new; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "set_public_user_wallet_updated_at" +BEFORE UPDATE ON "public"."user_wallet" +FOR EACH ROW +EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); +COMMENT ON TRIGGER "set_public_user_wallet_updated_at" ON "public"."user_wallet" +IS 'trigger to set value of column "updated_at" to current timestamp on row update'; diff --git a/src/user/dto/generate-wallet-request.dto.ts b/src/user/dto/generate-wallet-request.dto.ts new file mode 100644 index 00000000..dbfd2943 --- /dev/null +++ b/src/user/dto/generate-wallet-request.dto.ts @@ -0,0 +1,6 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; + +export class GenerateWalletRequestDto { + @ApiPropertyOptional({ example: '2c173942-a860-4a4c-ab71-9a29e2384d54' }) + user_id: string; +} diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index 074f5200..1c47d5df 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -1,29 +1,42 @@ import { - Query, + Body, Controller, Delete, - UseGuards, - UseInterceptors, + Headers, + Post, Put, - Body, + Query, UploadedFiles, + UseGuards, + UseInterceptors, } from '@nestjs/common'; +import { AnyFilesInterceptor } from '@nestjs/platform-express'; import { ApiBearerAuth, ApiConsumes, ApiTags } from '@nestjs/swagger'; -import { UserService } from './user.service'; + import { AuthGuard } from '../auth/auth.guard'; -import { AuthUserInterceptor } from '../interceptors/auth-user.interceptor'; -import { DeleteUserRequest } from './dto/delete-user-request.dto'; -import { Roles } from '../auth/roles.decorator'; import { Role } from '../auth/role.enum'; import { RolesGuard } from '../auth/role.guard'; +import { Roles } from '../auth/roles.decorator'; +import { AuthUserInterceptor } from '../interceptors/auth-user.interceptor'; +import { DeleteUserRequest } from './dto/delete-user-request.dto'; +import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; import { UpdateProfileRequestDto } from './dto/update-profile-request.dto'; -import { AnyFilesInterceptor } from '@nestjs/platform-express'; +import { UserService } from './user.service'; @Controller('user') @ApiTags('user') export class UserController { constructor(private readonly userSvc: UserService) {} + // @UseGuards(AuthGuard, RolesGuard) + // @ApiBearerAuth() + // @Roles(Role.Admin) + @Post('generate-wallet') + // @UseInterceptors(AuthUserInterceptor) + generateWallet(@Headers() headers, @Body() data: GenerateWalletRequestDto) { + return this.userSvc.generateWallet(headers, data); + } + @UseGuards(AuthGuard, RolesGuard) @ApiBearerAuth() @Roles(Role.Admin) @@ -41,7 +54,7 @@ export class UserController { @UseInterceptors(AuthUserInterceptor, AnyFilesInterceptor()) updateProfile( @Body() data: UpdateProfileRequestDto, - @UploadedFiles() files: Array, + @UploadedFiles() files: Array ) { return this.userSvc.updateProfile(data, files); } diff --git a/src/user/user.graphql.ts b/src/user/user.graphql.ts index a19d6414..f894f8ab 100644 --- a/src/user/user.graphql.ts +++ b/src/user/user.graphql.ts @@ -1,6 +1,7 @@ +import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; + import { GraphqlService } from '../graphql/graphql.service'; -import { Injectable } from '@nestjs/common'; @Injectable() export class UserGraphql { @@ -9,6 +10,34 @@ export class UserGraphql { private graphqlSvc: GraphqlService ) {} + insertUserWallet(variables: any) { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + + return this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `mutation insert_user_wallet($address: String = "", $data: String = "", $is_master_wallet: Boolean = false, $user_id: bpchar = "") { + insert_user_wallet(objects: {address: $address, data: $data, is_master_wallet: $is_master_wallet, user_id: $user_id}) { + returning { + id + address + data + is_master_wallet + user_id + } + affected_rows + } + }`, + 'insert_user_wallet', + variables, + headers + ); + } + updateUserProfile(token: string, variables: any) { return this.graphqlSvc.query( this.configSvc.get('graphql.endpoint'), diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 8fa8fd38..6396f764 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -1,15 +1,18 @@ -import { Injectable, Logger } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { DeleteUserRequest } from './dto/delete-user-request.dto'; +import * as bip39 from 'bip39'; + import { Authorizer } from '@authorizerdev/authorizer-js'; +import { Secp256k1HdWallet } from '@cosmjs/amino'; +import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +import { FilesService } from '../files/files.service'; +import { SysKeyService } from '../keys/syskey.service'; import { ContextProvider } from '../providers/contex.provider'; +import { DeleteUserRequest } from './dto/delete-user-request.dto'; +import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; import { UpdateProfileRequestDto } from './dto/update-profile-request.dto'; import { IUpdateProfile } from './interfaces/update-profile.interface'; -import { FilesService } from '../files/files.service'; import { UserGraphql } from './user.graphql'; -import * as bip39 from 'bip39'; -import { Secp256k1HdWallet } from '@cosmjs/amino'; -import { SysKeyService } from '../keys/syskey.service'; @Injectable() export class UserService { @@ -19,11 +22,13 @@ export class UserService { private filesService: FilesService, private userGraphql: UserGraphql, private sysKeyService: SysKeyService - ) { - this.generateWallet(); - } + ) {} - async generateWallet() { + async generateWallet(headers: any, data: GenerateWalletRequestDto) { + const webHookSecret = this.configService.get('webhook.secret'); + if (!webHookSecret || headers['webhook-secret'] !== webHookSecret) + throw new HttpException('Forbidden', HttpStatus.FORBIDDEN); + const { user_id: userId } = data; const mnemonic = bip39.generateMnemonic(); const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic, { prefix: 'aura', @@ -35,7 +40,15 @@ export class UserService { ); // store db - console.log(serializedWallet); + const result = await this.userGraphql.insertUserWallet({ + address: account[0].address, + data: JSON.parse(serializedWallet).data, + user_id: userId, + }); + + console.log(result); + + return result; } async updateProfile( From c95e9053deddab6b48a238adf3522e206bace272 Mon Sep 17 00:00:00 2001 From: harisato Date: Fri, 13 Oct 2023 16:17:15 +0700 Subject: [PATCH 7/9] refactor(be): new user wallet module --- .../tables/public_authorizer_users.yaml | 2 +- src/app.module.ts | 2 + .../dto/delete-user-request.dto.ts | 6 ++ .../dto/generate-wallet-request.dto.ts | 6 ++ .../dto/like-chapter-request.dto.ts | 6 ++ .../dto/update-profile-request.dto.ts | 16 ++++++ .../interfaces/update-profile.interface.ts | 9 +++ src/user-wallet/user-wallet.controller.ts | 16 ++++++ src/user-wallet/user-wallet.graphql.ts | 40 +++++++++++++ src/user-wallet/user-wallet.module.ts | 16 ++++++ src/user-wallet/user-wallet.service.ts | 57 +++++++++++++++++++ src/user/user.controller.ts | 12 ---- src/user/user.graphql.ts | 28 --------- src/user/user.module.ts | 3 +- src/user/user.service.ts | 37 +----------- 15 files changed, 178 insertions(+), 78 deletions(-) create mode 100644 src/user-wallet/dto/delete-user-request.dto.ts create mode 100644 src/user-wallet/dto/generate-wallet-request.dto.ts create mode 100644 src/user-wallet/dto/like-chapter-request.dto.ts create mode 100644 src/user-wallet/dto/update-profile-request.dto.ts create mode 100644 src/user-wallet/interfaces/update-profile.interface.ts create mode 100644 src/user-wallet/user-wallet.controller.ts create mode 100644 src/user-wallet/user-wallet.graphql.ts create mode 100644 src/user-wallet/user-wallet.module.ts create mode 100644 src/user-wallet/user-wallet.service.ts diff --git a/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml b/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml index c6e3b731..9420d3d3 100644 --- a/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml +++ b/hasura/metadata/databases/punkga-pg/tables/public_authorizer_users.yaml @@ -87,7 +87,7 @@ event_triggers: interval_sec: 10 num_retries: 0 timeout_sec: 60 - webhook: '{{WEBHOOK_URL}}/user/generate-wallet' + webhook: '{{WEBHOOK_URL}}/user-wallet/generate-wallet' headers: - name: webhook-secret value_from_env: WEBHOOK_SECRET diff --git a/src/app.module.ts b/src/app.module.ts index 80bd84c3..7903c467 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -15,6 +15,7 @@ import { TasksModule } from './task/task.module'; import { UserModule } from './user/user.module'; import { QuestModule } from './quest/quest.module'; import { SysKeyModule } from './keys/syskey.module'; +import { UserWalletModule } from './user-wallet/user-wallet.module'; @Module({ imports: [ @@ -34,6 +35,7 @@ import { SysKeyModule } from './keys/syskey.module'; UserModule, QuestModule, SysKeyModule, + UserWalletModule, ], controllers: [], providers: [ diff --git a/src/user-wallet/dto/delete-user-request.dto.ts b/src/user-wallet/dto/delete-user-request.dto.ts new file mode 100644 index 00000000..f45c5061 --- /dev/null +++ b/src/user-wallet/dto/delete-user-request.dto.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class DeleteUserRequest { + @ApiProperty() + email: string; +} diff --git a/src/user-wallet/dto/generate-wallet-request.dto.ts b/src/user-wallet/dto/generate-wallet-request.dto.ts new file mode 100644 index 00000000..dbfd2943 --- /dev/null +++ b/src/user-wallet/dto/generate-wallet-request.dto.ts @@ -0,0 +1,6 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; + +export class GenerateWalletRequestDto { + @ApiPropertyOptional({ example: '2c173942-a860-4a4c-ab71-9a29e2384d54' }) + user_id: string; +} diff --git a/src/user-wallet/dto/like-chapter-request.dto.ts b/src/user-wallet/dto/like-chapter-request.dto.ts new file mode 100644 index 00000000..dbbe97c6 --- /dev/null +++ b/src/user-wallet/dto/like-chapter-request.dto.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class LikeChapterParam { + @ApiProperty() + chapterId: number; +} diff --git a/src/user-wallet/dto/update-profile-request.dto.ts b/src/user-wallet/dto/update-profile-request.dto.ts new file mode 100644 index 00000000..224640d2 --- /dev/null +++ b/src/user-wallet/dto/update-profile-request.dto.ts @@ -0,0 +1,16 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { Gender } from '../../common/enum'; + +export class UpdateProfileRequestDto { + @ApiPropertyOptional({ example: '2020-07-05' }) + birthdate: string; + + @ApiPropertyOptional({ enum: Gender, enumName: 'Gender' }) + gender: Gender; + + @ApiPropertyOptional({ example: '' }) + bio: string; + + @ApiPropertyOptional({ type: 'string', format: 'binary' }) + picture: Express.Multer.File; +} diff --git a/src/user-wallet/interfaces/update-profile.interface.ts b/src/user-wallet/interfaces/update-profile.interface.ts new file mode 100644 index 00000000..95d8c1d8 --- /dev/null +++ b/src/user-wallet/interfaces/update-profile.interface.ts @@ -0,0 +1,9 @@ +export interface IUpdateProfile { + id: string; + _set: { + bio: string; + gender: string; + birthdate: string; + picture?: string; + }; +} diff --git a/src/user-wallet/user-wallet.controller.ts b/src/user-wallet/user-wallet.controller.ts new file mode 100644 index 00000000..0a40724c --- /dev/null +++ b/src/user-wallet/user-wallet.controller.ts @@ -0,0 +1,16 @@ +import { Body, Controller, Headers, Post } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; + +import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; +import { UserWalletService } from './user-wallet.service'; + +@Controller('user-wallet') +@ApiTags('user-wallet') +export class UserWalletController { + constructor(private readonly userWalletSvc: UserWalletService) {} + + @Post('generate-wallet') + generateWallet(@Headers() headers, @Body() data: GenerateWalletRequestDto) { + return this.userWalletSvc.generateWallet(headers, data); + } +} diff --git a/src/user-wallet/user-wallet.graphql.ts b/src/user-wallet/user-wallet.graphql.ts new file mode 100644 index 00000000..c2728eea --- /dev/null +++ b/src/user-wallet/user-wallet.graphql.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +import { GraphqlService } from '../graphql/graphql.service'; + +@Injectable() +export class UserWalletGraphql { + constructor( + private configSvc: ConfigService, + private graphqlSvc: GraphqlService + ) {} + + insertUserWallet(variables: any) { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + + return this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `mutation insert_user_wallet($address: String = "", $data: String = "", $is_master_wallet: Boolean = false, $user_id: bpchar = "") { + insert_user_wallet(objects: {address: $address, data: $data, is_master_wallet: $is_master_wallet, user_id: $user_id}) { + returning { + id + address + data + is_master_wallet + user_id + } + affected_rows + } + }`, + 'insert_user_wallet', + variables, + headers + ); + } +} diff --git a/src/user-wallet/user-wallet.module.ts b/src/user-wallet/user-wallet.module.ts new file mode 100644 index 00000000..20726cf8 --- /dev/null +++ b/src/user-wallet/user-wallet.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; + +import { FilesModule } from '../files/files.module'; +import { GraphqlModule } from '../graphql/graphql.module'; +import { SysKeyModule } from '../keys/syskey.module'; +import { UserWalletController } from './user-wallet.controller'; +import { UserWalletGraphql } from './user-wallet.graphql'; +import { UserWalletService } from './user-wallet.service'; + +@Module({ + imports: [JwtModule, GraphqlModule, FilesModule, SysKeyModule], + providers: [UserWalletService, UserWalletGraphql], + controllers: [UserWalletController], +}) +export class UserWalletModule {} diff --git a/src/user-wallet/user-wallet.service.ts b/src/user-wallet/user-wallet.service.ts new file mode 100644 index 00000000..cc0a9a1d --- /dev/null +++ b/src/user-wallet/user-wallet.service.ts @@ -0,0 +1,57 @@ +import * as bip39 from 'bip39'; + +import { Secp256k1HdWallet } from '@cosmjs/amino'; +import { + HttpException, + HttpStatus, + Injectable, + Logger, + OnModuleInit, +} from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +import { SysKeyService } from '../keys/syskey.service'; +import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; +import { UserWalletGraphql } from './user-wallet.graphql'; + +@Injectable() +export class UserWalletService implements OnModuleInit { + private readonly logger = new Logger(UserWalletService.name); + constructor( + private configService: ConfigService, + private userWalletGraphql: UserWalletGraphql, + private sysKeyService: SysKeyService + ) {} + + async onModuleInit() { + // init + } + + async generateWallet(headers: any, data: GenerateWalletRequestDto) { + const webHookSecret = this.configService.get('webhook.secret'); + if (!webHookSecret || headers['webhook-secret'] !== webHookSecret) + throw new HttpException('Forbidden', HttpStatus.FORBIDDEN); + + const { user_id: userId } = data; + const mnemonic = bip39.generateMnemonic(); + const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: 'aura', + }); + + const account = await wallet.getAccounts(); + const serializedWallet = await wallet.serialize( + this.sysKeyService.originalSeed + ); + + // store db + const result = await this.userWalletGraphql.insertUserWallet({ + address: account[0].address, + data: JSON.parse(serializedWallet).data, + user_id: userId, + }); + + console.log(result); + + return result; + } +} diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index 1c47d5df..12b20142 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -2,8 +2,6 @@ import { Body, Controller, Delete, - Headers, - Post, Put, Query, UploadedFiles, @@ -19,7 +17,6 @@ import { RolesGuard } from '../auth/role.guard'; import { Roles } from '../auth/roles.decorator'; import { AuthUserInterceptor } from '../interceptors/auth-user.interceptor'; import { DeleteUserRequest } from './dto/delete-user-request.dto'; -import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; import { UpdateProfileRequestDto } from './dto/update-profile-request.dto'; import { UserService } from './user.service'; @@ -28,15 +25,6 @@ import { UserService } from './user.service'; export class UserController { constructor(private readonly userSvc: UserService) {} - // @UseGuards(AuthGuard, RolesGuard) - // @ApiBearerAuth() - // @Roles(Role.Admin) - @Post('generate-wallet') - // @UseInterceptors(AuthUserInterceptor) - generateWallet(@Headers() headers, @Body() data: GenerateWalletRequestDto) { - return this.userSvc.generateWallet(headers, data); - } - @UseGuards(AuthGuard, RolesGuard) @ApiBearerAuth() @Roles(Role.Admin) diff --git a/src/user/user.graphql.ts b/src/user/user.graphql.ts index f894f8ab..859610f5 100644 --- a/src/user/user.graphql.ts +++ b/src/user/user.graphql.ts @@ -10,34 +10,6 @@ export class UserGraphql { private graphqlSvc: GraphqlService ) {} - insertUserWallet(variables: any) { - const headers = { - 'x-hasura-admin-secret': this.configSvc.get( - 'graphql.adminSecret' - ), - }; - - return this.graphqlSvc.query( - this.configSvc.get('graphql.endpoint'), - '', - `mutation insert_user_wallet($address: String = "", $data: String = "", $is_master_wallet: Boolean = false, $user_id: bpchar = "") { - insert_user_wallet(objects: {address: $address, data: $data, is_master_wallet: $is_master_wallet, user_id: $user_id}) { - returning { - id - address - data - is_master_wallet - user_id - } - affected_rows - } - }`, - 'insert_user_wallet', - variables, - headers - ); - } - updateUserProfile(token: string, variables: any) { return this.graphqlSvc.query( this.configSvc.get('graphql.endpoint'), diff --git a/src/user/user.module.ts b/src/user/user.module.ts index 9ef22e87..05776469 100644 --- a/src/user/user.module.ts +++ b/src/user/user.module.ts @@ -5,10 +5,9 @@ import { UserController } from './user.controller'; import { GraphqlModule } from '../graphql/graphql.module'; import { FilesModule } from '../files/files.module'; import { UserGraphql } from './user.graphql'; -import { SysKeyModule } from '../keys/syskey.module'; @Module({ - imports: [JwtModule, GraphqlModule, FilesModule, SysKeyModule], + imports: [JwtModule, GraphqlModule, FilesModule], providers: [UserService, UserGraphql], controllers: [UserController], }) diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 6396f764..5b76b281 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -1,15 +1,10 @@ -import * as bip39 from 'bip39'; - import { Authorizer } from '@authorizerdev/authorizer-js'; -import { Secp256k1HdWallet } from '@cosmjs/amino'; -import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { FilesService } from '../files/files.service'; -import { SysKeyService } from '../keys/syskey.service'; import { ContextProvider } from '../providers/contex.provider'; import { DeleteUserRequest } from './dto/delete-user-request.dto'; -import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; import { UpdateProfileRequestDto } from './dto/update-profile-request.dto'; import { IUpdateProfile } from './interfaces/update-profile.interface'; import { UserGraphql } from './user.graphql'; @@ -20,37 +15,9 @@ export class UserService { constructor( private configService: ConfigService, private filesService: FilesService, - private userGraphql: UserGraphql, - private sysKeyService: SysKeyService + private userGraphql: UserGraphql ) {} - async generateWallet(headers: any, data: GenerateWalletRequestDto) { - const webHookSecret = this.configService.get('webhook.secret'); - if (!webHookSecret || headers['webhook-secret'] !== webHookSecret) - throw new HttpException('Forbidden', HttpStatus.FORBIDDEN); - const { user_id: userId } = data; - const mnemonic = bip39.generateMnemonic(); - const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic, { - prefix: 'aura', - }); - - const account = await wallet.getAccounts(); - const serializedWallet = await wallet.serialize( - this.sysKeyService.originalSeed - ); - - // store db - const result = await this.userGraphql.insertUserWallet({ - address: account[0].address, - data: JSON.parse(serializedWallet).data, - user_id: userId, - }); - - console.log(result); - - return result; - } - async updateProfile( data: UpdateProfileRequestDto, files: Array From af4cd4d13c38256cfb5199787e5d5d0e0d628cda Mon Sep 17 00:00:00 2001 From: harisato Date: Mon, 16 Oct 2023 10:05:30 +0700 Subject: [PATCH 8/9] feat(be): init master wallet --- src/user-wallet/master-wallet.service.ts | 51 ++++++++++++++++++++ src/user-wallet/user-wallet.graphql.ts | 24 ++++++++++ src/user-wallet/user-wallet.service.ts | 60 +++++++++++++++++++----- 3 files changed, 124 insertions(+), 11 deletions(-) create mode 100644 src/user-wallet/master-wallet.service.ts diff --git a/src/user-wallet/master-wallet.service.ts b/src/user-wallet/master-wallet.service.ts new file mode 100644 index 00000000..8ed66808 --- /dev/null +++ b/src/user-wallet/master-wallet.service.ts @@ -0,0 +1,51 @@ +import { Secp256k1HdWallet } from '@cosmjs/amino'; +import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; + +import { SysKeyService } from '../keys/syskey.service'; +import { UserWalletGraphql } from './user-wallet.graphql'; +import { UserWalletService } from './user-wallet.service'; + +@Injectable() +export class MasterWalletService implements OnModuleInit { + private readonly logger = new Logger(MasterWalletService.name); + private masterWallet = null; + + constructor( + private userWalletGraphql: UserWalletGraphql, + private sysKeyService: SysKeyService, + private userWalletService: UserWalletService + ) {} + + // init master wallet + async onModuleInit() { + // get from db + const masterWalletData = await this.userWalletGraphql.getMasterWallet(); + if (masterWalletData) { + const serialization = JSON.stringify({ + type: 'secp256k1wallet-v1', + kdf: { + algorithm: 'argon2id', + params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, + }, + encryption: { algorithm: 'xchacha20poly1305-ietf' }, + data: masterWalletData, + }); + const wallet = await Secp256k1HdWallet.deserialize( + serialization, + this.sysKeyService.originalSeed + ); + this.masterWallet = wallet; + } else { + const { wallet, account, serializedWallet } = + await this.userWalletService.randomWallet(); + this.masterWallet = wallet; + // store db + const result = await this.userWalletGraphql.insertUserWallet({ + address: account[0].address, + data: JSON.parse(serializedWallet).data, + is_master_wallet: true, + }); + this.logger.debug(`Insert master wallet: ${result}`); + } + } +} diff --git a/src/user-wallet/user-wallet.graphql.ts b/src/user-wallet/user-wallet.graphql.ts index c2728eea..a023379e 100644 --- a/src/user-wallet/user-wallet.graphql.ts +++ b/src/user-wallet/user-wallet.graphql.ts @@ -37,4 +37,28 @@ export class UserWalletGraphql { headers ); } + + async getMasterWallet() { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + const result = await this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `query query_user_wallet { + user_wallet(where: {is_master_wallet: {_eq: true}}) { + address + data + } + } + `, + 'query_user_wallet', + {}, + headers + ); + + return result.data.user_wallet[0]; + } } diff --git a/src/user-wallet/user-wallet.service.ts b/src/user-wallet/user-wallet.service.ts index cc0a9a1d..51524477 100644 --- a/src/user-wallet/user-wallet.service.ts +++ b/src/user-wallet/user-wallet.service.ts @@ -17,14 +17,43 @@ import { UserWalletGraphql } from './user-wallet.graphql'; @Injectable() export class UserWalletService implements OnModuleInit { private readonly logger = new Logger(UserWalletService.name); + private masterWallet = null; constructor( private configService: ConfigService, private userWalletGraphql: UserWalletGraphql, private sysKeyService: SysKeyService ) {} + // init master wallet async onModuleInit() { - // init + // get from db + const masterWalletData = await this.userWalletGraphql.getMasterWallet(); + if (masterWalletData) { + const serialization = JSON.stringify({ + type: 'secp256k1wallet-v1', + kdf: { + algorithm: 'argon2id', + params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, + }, + encryption: { algorithm: 'xchacha20poly1305-ietf' }, + data: masterWalletData, + }); + const wallet = await Secp256k1HdWallet.deserialize( + serialization, + this.sysKeyService.originalSeed + ); + this.masterWallet = wallet; + } else { + const { wallet, account, serializedWallet } = await this.randomWallet(); + this.masterWallet = wallet; + // store db + const result = await this.userWalletGraphql.insertUserWallet({ + address: account[0].address, + data: JSON.parse(serializedWallet).data, + is_master_wallet: true, + }); + this.logger.debug(`Insert master wallet: ${result}`); + } } async generateWallet(headers: any, data: GenerateWalletRequestDto) { @@ -33,15 +62,8 @@ export class UserWalletService implements OnModuleInit { throw new HttpException('Forbidden', HttpStatus.FORBIDDEN); const { user_id: userId } = data; - const mnemonic = bip39.generateMnemonic(); - const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic, { - prefix: 'aura', - }); - const account = await wallet.getAccounts(); - const serializedWallet = await wallet.serialize( - this.sysKeyService.originalSeed - ); + const { account, serializedWallet } = await this.randomWallet(); // store db const result = await this.userWalletGraphql.insertUserWallet({ @@ -50,8 +72,24 @@ export class UserWalletService implements OnModuleInit { user_id: userId, }); - console.log(result); - return result; } + + async randomWallet() { + const mnemonic = bip39.generateMnemonic(); + const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: 'aura', + }); + + const account = await wallet.getAccounts(); + const serializedWallet = await wallet.serialize( + this.sysKeyService.originalSeed + ); + + return { + wallet, + serializedWallet, + account, + }; + } } From 7c7d77f498d9b97dbd29d435c191e39b555ee488 Mon Sep 17 00:00:00 2001 From: harisato Date: Mon, 16 Oct 2023 14:44:27 +0700 Subject: [PATCH 9/9] feat(be): generate wallet for existing user --- src/user-wallet/master-wallet.service.ts | 16 ++++-- src/user-wallet/user-wallet.graphql.ts | 59 +++++++++++++++---- src/user-wallet/user-wallet.module.ts | 3 +- src/user-wallet/user-wallet.service.ts | 72 ++++++++++-------------- 4 files changed, 89 insertions(+), 61 deletions(-) diff --git a/src/user-wallet/master-wallet.service.ts b/src/user-wallet/master-wallet.service.ts index 8ed66808..3be68325 100644 --- a/src/user-wallet/master-wallet.service.ts +++ b/src/user-wallet/master-wallet.service.ts @@ -28,7 +28,7 @@ export class MasterWalletService implements OnModuleInit { params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, }, encryption: { algorithm: 'xchacha20poly1305-ietf' }, - data: masterWalletData, + data: masterWalletData.data, }); const wallet = await Secp256k1HdWallet.deserialize( serialization, @@ -40,12 +40,16 @@ export class MasterWalletService implements OnModuleInit { await this.userWalletService.randomWallet(); this.masterWallet = wallet; // store db - const result = await this.userWalletGraphql.insertUserWallet({ - address: account[0].address, - data: JSON.parse(serializedWallet).data, - is_master_wallet: true, + const result = await this.userWalletGraphql.insertManyUserWallet({ + objects: [ + { + address: account[0].address, + data: JSON.parse(serializedWallet).data, + is_master_wallet: true, + }, + ], }); - this.logger.debug(`Insert master wallet: ${result}`); + this.logger.debug(`Insert master wallet: ${JSON.stringify(result)}`); } } } diff --git a/src/user-wallet/user-wallet.graphql.ts b/src/user-wallet/user-wallet.graphql.ts index a023379e..ccb635af 100644 --- a/src/user-wallet/user-wallet.graphql.ts +++ b/src/user-wallet/user-wallet.graphql.ts @@ -10,25 +10,18 @@ export class UserWalletGraphql { private graphqlSvc: GraphqlService ) {} - insertUserWallet(variables: any) { + async insertManyUserWallet(variables: any) { const headers = { 'x-hasura-admin-secret': this.configSvc.get( 'graphql.adminSecret' ), }; - return this.graphqlSvc.query( + const result = await this.graphqlSvc.query( this.configSvc.get('graphql.endpoint'), '', - `mutation insert_user_wallet($address: String = "", $data: String = "", $is_master_wallet: Boolean = false, $user_id: bpchar = "") { - insert_user_wallet(objects: {address: $address, data: $data, is_master_wallet: $is_master_wallet, user_id: $user_id}) { - returning { - id - address - data - is_master_wallet - user_id - } + `mutation insert_user_wallet($objects: [user_wallet_insert_input!] = {}) { + insert_user_wallet(objects: $objects) { affected_rows } }`, @@ -36,6 +29,50 @@ export class UserWalletGraphql { variables, headers ); + console.log(result); + return result; + } + + async queryEmptyUserWallet() { + const headers = { + 'x-hasura-admin-secret': this.configSvc.get( + 'graphql.adminSecret' + ), + }; + + const queryResult = await this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `query query_user_wallet { + user_wallet { + user_id + } + } + `, + 'query_user_wallet', + {}, + headers + ); + + const existUsersId = queryResult.data.user_wallet.map( + (info) => info.user_id + ); + + const result = await this.graphqlSvc.query( + this.configSvc.get('graphql.endpoint'), + '', + `query query_user_wallet($ids: [bpchar!] = "") { + authorizer_users(where: {id: {_nin: $ids}}) { + id + } + }`, + 'query_user_wallet', + { + ids: existUsersId, + }, + headers + ); + return result.data.authorizer_users; } async getMasterWallet() { diff --git a/src/user-wallet/user-wallet.module.ts b/src/user-wallet/user-wallet.module.ts index 20726cf8..2c9bab9a 100644 --- a/src/user-wallet/user-wallet.module.ts +++ b/src/user-wallet/user-wallet.module.ts @@ -7,10 +7,11 @@ import { SysKeyModule } from '../keys/syskey.module'; import { UserWalletController } from './user-wallet.controller'; import { UserWalletGraphql } from './user-wallet.graphql'; import { UserWalletService } from './user-wallet.service'; +import { MasterWalletService } from './master-wallet.service'; @Module({ imports: [JwtModule, GraphqlModule, FilesModule, SysKeyModule], - providers: [UserWalletService, UserWalletGraphql], + providers: [UserWalletService, UserWalletGraphql, MasterWalletService], controllers: [UserWalletController], }) export class UserWalletModule {} diff --git a/src/user-wallet/user-wallet.service.ts b/src/user-wallet/user-wallet.service.ts index 51524477..92f8b655 100644 --- a/src/user-wallet/user-wallet.service.ts +++ b/src/user-wallet/user-wallet.service.ts @@ -1,13 +1,7 @@ import * as bip39 from 'bip39'; import { Secp256k1HdWallet } from '@cosmjs/amino'; -import { - HttpException, - HttpStatus, - Injectable, - Logger, - OnModuleInit, -} from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { SysKeyService } from '../keys/syskey.service'; @@ -15,45 +9,33 @@ import { GenerateWalletRequestDto } from './dto/generate-wallet-request.dto'; import { UserWalletGraphql } from './user-wallet.graphql'; @Injectable() -export class UserWalletService implements OnModuleInit { +export class UserWalletService { private readonly logger = new Logger(UserWalletService.name); - private masterWallet = null; constructor( private configService: ConfigService, private userWalletGraphql: UserWalletGraphql, private sysKeyService: SysKeyService ) {} - // init master wallet - async onModuleInit() { - // get from db - const masterWalletData = await this.userWalletGraphql.getMasterWallet(); - if (masterWalletData) { - const serialization = JSON.stringify({ - type: 'secp256k1wallet-v1', - kdf: { - algorithm: 'argon2id', - params: { outputLength: 32, opsLimit: 24, memLimitKib: 12288 }, - }, - encryption: { algorithm: 'xchacha20poly1305-ietf' }, - data: masterWalletData, - }); - const wallet = await Secp256k1HdWallet.deserialize( - serialization, - this.sysKeyService.originalSeed - ); - this.masterWallet = wallet; - } else { - const { wallet, account, serializedWallet } = await this.randomWallet(); - this.masterWallet = wallet; - // store db - const result = await this.userWalletGraphql.insertUserWallet({ - address: account[0].address, - data: JSON.parse(serializedWallet).data, - is_master_wallet: true, - }); - this.logger.debug(`Insert master wallet: ${result}`); - } + async queryEmptyUserWallet() { + const users = await this.userWalletGraphql.queryEmptyUserWallet(); + const wallets = await Promise.all( + users.map(() => { + return this.randomWallet(); + }) + ); + + const objects = wallets.map((wallet, index) => ({ + address: wallet.account[0].address, + data: JSON.parse(wallet.serializedWallet).data, + user_id: users[index].id, + })); + + const result = await this.userWalletGraphql.insertManyUserWallet({ + objects, + }); + + console.log(result); } async generateWallet(headers: any, data: GenerateWalletRequestDto) { @@ -66,10 +48,14 @@ export class UserWalletService implements OnModuleInit { const { account, serializedWallet } = await this.randomWallet(); // store db - const result = await this.userWalletGraphql.insertUserWallet({ - address: account[0].address, - data: JSON.parse(serializedWallet).data, - user_id: userId, + const result = await this.userWalletGraphql.insertManyUserWallet({ + objects: [ + { + address: account[0].address, + data: JSON.parse(serializedWallet).data, + user_id: userId, + }, + ], }); return result;