From 3588833773c027d1c5fe5b88d150c54c306b37e3 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Fri, 27 Sep 2024 18:11:51 +0300 Subject: [PATCH 1/6] feat(vara-ui): mobile modal (#1645) --- utils/vara-ui/package-lock.json | 4 +-- utils/vara-ui/package.json | 2 +- .../src/components/modal/modal.module.scss | 16 +++++++++++- .../src/components/modal/modal.stories.ts | 26 ++++++++++++++++--- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/utils/vara-ui/package-lock.json b/utils/vara-ui/package-lock.json index 86ee2a312e..eca466eb89 100644 --- a/utils/vara-ui/package-lock.json +++ b/utils/vara-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gear-js/vara-ui", - "version": "0.0.10", + "version": "0.0.11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@gear-js/vara-ui", - "version": "0.0.10", + "version": "0.0.11", "license": "GPL-3.0", "devDependencies": { "@storybook/addon-essentials": "7.2.1", diff --git a/utils/vara-ui/package.json b/utils/vara-ui/package.json index 2cda3971a5..31d3d7b175 100644 --- a/utils/vara-ui/package.json +++ b/utils/vara-ui/package.json @@ -1,6 +1,6 @@ { "name": "@gear-js/vara-ui", - "version": "0.0.10", + "version": "0.0.11", "type": "module", "description": "React UI components used across Vara applications", "author": "Gear Technologies", diff --git a/utils/vara-ui/src/components/modal/modal.module.scss b/utils/vara-ui/src/components/modal/modal.module.scss index 6c66e248a9..326aabff3d 100644 --- a/utils/vara-ui/src/components/modal/modal.module.scss +++ b/utils/vara-ui/src/components/modal/modal.module.scss @@ -47,6 +47,12 @@ background-color: rgba(0, 0, 0, 0.2); backdrop-filter: blur(10px); z-index: 10; + + @media screen and (max-width: 768px) { + padding: 0; + + align-items: flex-end; + } } .modal { @@ -60,9 +66,17 @@ border-radius: 4px; filter: drop-shadow(0px 4px 4px #00000011); + @media screen and (max-width: 768px) { + max-width: unset; + } + > * { - /* every standalone item for body scrollbar padding */ + /* applying x-padding to every child, to preserve body scrollbar padding */ padding: 0 32px; + + @media screen and (max-width: 768px) { + padding: 0 16px; + } } } diff --git a/utils/vara-ui/src/components/modal/modal.stories.ts b/utils/vara-ui/src/components/modal/modal.stories.ts index 783b5dbed6..5b8aabc53a 100644 --- a/utils/vara-ui/src/components/modal/modal.stories.ts +++ b/utils/vara-ui/src/components/modal/modal.stories.ts @@ -4,6 +4,9 @@ import { Modal } from './modal'; type Type = typeof Modal; type Story = StoryObj; +const LONG_TEXT = + 'Text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text'; + const meta: Meta = { title: 'Modal', component: Modal, @@ -20,11 +23,28 @@ const Default: Story = { const Scroll: Story = { args: { heading: 'Heading', - children: - 'Text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text', + children: LONG_TEXT, footer: 'Footer', }, }; +const Mobile: Story = { + args: { + heading: 'Mobile Modal', + children: 'Some modal text', + close: () => {}, + }, + parameters: { viewport: { defaultViewport: 'mobile1' } }, +}; + +const MobileScroll: Story = { + args: { + heading: 'Mobile Modal', + children: LONG_TEXT, + close: () => {}, + }, + parameters: { viewport: { defaultViewport: 'mobile1' } }, +}; + export default meta; -export { Default, Scroll }; +export { Default, Scroll, Mobile, MobileScroll }; From ce5e44904f9969a98aae086983e4e76321b3fc2a Mon Sep 17 00:00:00 2001 From: sergey filyanin Date: Wed, 2 Oct 2024 15:34:46 +0200 Subject: [PATCH 2/6] Create CI-CD-Wallet-Connect-Package.yml --- .../CI-CD-Wallet-Connect-Package.yml | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 .github/workflows/CI-CD-Wallet-Connect-Package.yml diff --git a/.github/workflows/CI-CD-Wallet-Connect-Package.yml b/.github/workflows/CI-CD-Wallet-Connect-Package.yml new file mode 100644 index 0000000000..c2e64f2eab --- /dev/null +++ b/.github/workflows/CI-CD-Wallet-Connect-Package.yml @@ -0,0 +1,98 @@ +name: 'CI-CD @gear-js/wallet-connect' + +on: + pull_request: + branches: [main] + paths: + - utils/wallet-connect/** + push: + branches: [main] + paths: + - utils/wallet-connect/** + workflow_dispatch: + +jobs: + wallet-connect-test: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Cancel previous workflow runs + uses: styfle/cancel-workflow-action@0.4.0 + with: + access_token: ${{ github.token }} + + - uses: actions/checkout@v2 + + - name: Install NodeJS 18.x + uses: actions/setup-node@v2.1.5 + with: + node-version: 18.x + + - name: 'gear-js-wallet: Install dependencies' + working-directory: utils/wallet-connect + run: yarn install + + - name: 'gear-js-wallet: Build pkg' + working-directory: utils/wallet-connect + run: yarn build + + - name: 'gear-js-wallet: Run tests' + working-directory: utils/wallet-connect + run: yarn test + + wallet-connect-build: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Cancel previous workflow runs + uses: styfle/cancel-workflow-action@0.4.0 + with: + access_token: ${{ github.token }} + + - uses: actions/checkout@v2 + + - name: Install NodeJS 18.x + uses: actions/setup-node@v2.1.5 + with: + node-version: 18.x + + - name: 'vara-ui: Install dependencies' + working-directory: utils/wallet-connect + run: npm install + + - name: 'vara-ui: Build pkg' + working-directory: utils/wallet-connect + run: npm run build + + publish-to-npm: + if: github.event_name == 'push' + runs-on: ubuntu-latest + steps: + - name: 'Checkout' + uses: actions/checkout@v2 + + - name: Use node 18.x + uses: actions/setup-node@v2.1.5 + with: + node-version: 18.x + + - name: '@gear-js/wallet-connect: Check pkg version' + uses: EndBug/version-check@v1 + id: check_gear + with: + file-name: utils/wallet-connect/package.json + file-url: https://unpkg.com/@gear-js/ui@latest/package.json + static-checking: localIsNew + + - name: '@gear-js/wallet-connect: Publish' + if: steps.check_gear.outputs.changed == 'true' + working-directory: utils/wallet-connect + run: | + export token=$(printenv $(printenv GITHUB_ACTOR)) + npm install + npm run build + npm config set //registry.npmjs.org/:_authToken=$token --no-workspaces + npm publish + env: + osipov-mit: ${{ secrets.OSIPOV_NPM_TOKEN }} + nikitayutanov: ${{ secrets.YUTANOV_NPM_TOKEN }} From 34c0ed1308788e2254b57d19fc857a833334a52b Mon Sep 17 00:00:00 2001 From: Zewasik <89100777+Zewasik@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:04:45 +0300 Subject: [PATCH 3/6] feat(squid) add id generation for every message from user (#1639) Co-authored-by: sergey filyanin --- .github/workflows/CI-CD-Squid-Explorer.yml | 8 +-- idea/explorer/src/services/event.ts | 6 ++- idea/explorer/src/services/message.ts | 5 ++ idea/explorer/src/types/requests/event.ts | 1 + idea/explorer/src/types/requests/message.ts | 1 + idea/indexer-db/src/entities/event.entity.ts | 3 ++ .../entities/message-from-program.entity.ts | 3 ++ .../squid/db/migrations/1725631344412-Data.js | 13 +++++ idea/squid/package.json | 2 + idea/squid/src/config.ts | 6 +++ idea/squid/src/event.route.ts | 17 +++++-- idea/squid/src/main.ts | 34 ++++++++++--- idea/squid/src/temp-state.ts | 49 ++++++++++++++++++- idea/squid/src/util.ts | 26 ++++++++-- idea/squid/tsconfig.json | 5 +- yarn.lock | 13 ++++- 16 files changed, 168 insertions(+), 24 deletions(-) create mode 100644 idea/squid/db/migrations/1725631344412-Data.js diff --git a/.github/workflows/CI-CD-Squid-Explorer.yml b/.github/workflows/CI-CD-Squid-Explorer.yml index e26ba8fd2b..b31f865f64 100644 --- a/.github/workflows/CI-CD-Squid-Explorer.yml +++ b/.github/workflows/CI-CD-Squid-Explorer.yml @@ -54,7 +54,7 @@ jobs: with: file: idea/explorer/Dockerfile push: true - tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-explorer:${{ env.tag }} + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-explorer-latest:${{ env.tag }} build-squid-image: runs-on: ubuntu-latest @@ -87,7 +87,7 @@ jobs: with: file: idea/squid/Dockerfile push: true - tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-squid:${{ env.tag }} + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-squid-latest:${{ env.tag }} deploy-to-k8s: needs: @@ -108,10 +108,10 @@ jobs: run: | if [ "${{ github.ref }}" == "refs/heads/idea-release" ]; then echo "namespace=prod-idea" >> $GITHUB_ENV - echo "deployments=explorer squid-testnet squid-mainnet" >> $GITHUB_ENV + echo "deployments=explorer-latest squid-testnet-latest squid-mainnet-latest" >> $GITHUB_ENV else echo "namespace=dev-1" >> $GITHUB_ENV - echo "deployments=explorer squid-testnet" >> $GITHUB_ENV + echo "deployments=explorer-latest squid-testnet-latest" >> $GITHUB_ENV fi - name: Deploy to k8s diff --git a/idea/explorer/src/services/event.ts b/idea/explorer/src/services/event.ts index eb1e397a11..2430a5310e 100644 --- a/idea/explorer/src/services/event.ts +++ b/idea/explorer/src/services/event.ts @@ -24,13 +24,17 @@ export class EventService { } @Pagination() - async getEvents({ source, service, name, limit, offset }: ParamGetEvents): Promise> { + async getEvents({ source, parentId, service, name, limit, offset }: ParamGetEvents): Promise> { const builder = this._repo.createQueryBuilder('event'); if (source) { builder.andWhere('event.source = :source', { source }); } + if (parentId) { + builder.andWhere('event.parent_id = :parentId', { parentId }); + } + if (service) { builder.andWhere('event.service ILIKE :service', { service: `%${service.toLowerCase()}%` }); } diff --git a/idea/explorer/src/services/message.ts b/idea/explorer/src/services/message.ts index 326aea7a58..e61167d2f5 100644 --- a/idea/explorer/src/services/message.ts +++ b/idea/explorer/src/services/message.ts @@ -89,6 +89,7 @@ export class MessageService { async getMsgsFrom({ source, destination, + parentId, isInMailbox, limit, offset, @@ -105,6 +106,10 @@ export class MessageService { qb.andWhere('msg.destination = :destination', { destination }); } + if (parentId) { + qb.andWhere('msg.parent_id = :parentId', { parentId }); + } + if (isInMailbox) { qb.andWhere('msg.readReson = NULL').andWhere('msg.expiration != NULL'); } diff --git a/idea/explorer/src/types/requests/event.ts b/idea/explorer/src/types/requests/event.ts index acb2a658b4..bdcd4326cc 100644 --- a/idea/explorer/src/types/requests/event.ts +++ b/idea/explorer/src/types/requests/event.ts @@ -8,4 +8,5 @@ export interface ParamGetEvents extends ParamPagination, ParamGenesis { service?: string; name?: string; source?: string; + parentId?: string; } diff --git a/idea/explorer/src/types/requests/message.ts b/idea/explorer/src/types/requests/message.ts index 083ce4dd30..584851df85 100644 --- a/idea/explorer/src/types/requests/message.ts +++ b/idea/explorer/src/types/requests/message.ts @@ -23,6 +23,7 @@ export class ParamGetMsgsToProgram extends ParamPagination { export class ParamGetMsgsFromProgram extends ParamPagination { readonly destination?: string; readonly source?: string; + readonly parentId?: string; readonly isInMailbox?: boolean; readonly service?: string; readonly fn?: string; diff --git a/idea/indexer-db/src/entities/event.entity.ts b/idea/indexer-db/src/entities/event.entity.ts index e6f4f335ed..f34570b6eb 100644 --- a/idea/indexer-db/src/entities/event.entity.ts +++ b/idea/indexer-db/src/entities/event.entity.ts @@ -20,6 +20,9 @@ export class Event extends BaseEntity { @Column({ nullable: true }) public payload: string; + @Column({ nullable: true, name: 'parent_id' }) + public parentId: string; + @Column({ nullable: true }) public service?: string; diff --git a/idea/indexer-db/src/entities/message-from-program.entity.ts b/idea/indexer-db/src/entities/message-from-program.entity.ts index 7e895aaec7..ab11ac2b63 100644 --- a/idea/indexer-db/src/entities/message-from-program.entity.ts +++ b/idea/indexer-db/src/entities/message-from-program.entity.ts @@ -24,6 +24,9 @@ export class MessageFromProgram extends BaseEntity { @Column({ nullable: true }) public payload: string; + @Column({ nullable: true, name: 'parent_id' }) + public parentId: string; + @Column({ default: '0' }) public value: string; diff --git a/idea/squid/db/migrations/1725631344412-Data.js b/idea/squid/db/migrations/1725631344412-Data.js new file mode 100644 index 0000000000..dc51aa8f63 --- /dev/null +++ b/idea/squid/db/migrations/1725631344412-Data.js @@ -0,0 +1,13 @@ +module.exports = class Data1725704609634 { + name = 'Data1725704609634' + + async up(db) { + await db.query(`ALTER TABLE "message_from_program" ADD "parent_id" character varying`) + await db.query(`ALTER TABLE "event" ADD "parent_id" character varying`) + } + + async down(db) { + await db.query(`ALTER TABLE "message_from_program" DROP COLUMN "parent_id"`) + await db.query(`ALTER TABLE "event" DROP COLUMN "parent_id"`) + } +} diff --git a/idea/squid/package.json b/idea/squid/package.json index 8032ecdfd8..f29f264972 100644 --- a/idea/squid/package.json +++ b/idea/squid/package.json @@ -23,6 +23,7 @@ "dotenv": "16.4.5", "indexer-db": "workspace:^", "pg": "8.11.5", + "redis": "^4.7.0", "sails-js": "^0.1.9", "typeorm": "0.3.20" }, @@ -31,6 +32,7 @@ "@subsquid/substrate-typegen": "8.1.0", "@subsquid/typeorm-codegen": "2.0.0", "@types/node": "20.12.7", + "@types/redis": "^4.0.11", "ts-node-dev": "^2.0.0", "typescript": "5.4.5" } diff --git a/idea/squid/src/config.ts b/idea/squid/src/config.ts index 3d0aba7a5f..4003c67497 100644 --- a/idea/squid/src/config.ts +++ b/idea/squid/src/config.ts @@ -10,4 +10,10 @@ export const config = { fromBlock: parseInt(process.env.FROM_BLOCK || '0'), toBlock: parseInt(process.env.TO_BLOCK) || undefined, }, + redis: { + host: process.env.REDIS_HOST || '127.0.0.1', + port: parseInt(process.env.REDIS_PORT) || 6379, + user: process.env.REDIS_USER || '', + password: process.env.REDIS_PASSWORD || '', + }, }; diff --git a/idea/squid/src/event.route.ts b/idea/squid/src/event.route.ts index 3e15065afb..ce6cd876d0 100644 --- a/idea/squid/src/event.route.ts +++ b/idea/squid/src/event.route.ts @@ -31,7 +31,10 @@ export interface IHandleEventProps { block: Block; } -const callHandlers: Array<{ pattern: (obj: any) => boolean; handler: (args: IHandleCallProps) => void }> = [ +const callHandlers: Array<{ + pattern: (obj: any) => boolean; + handler: (args: IHandleCallProps) => void; +}> = [ { pattern: isUploadProgram, handler: handleUploadProgram }, { pattern: isSendMessageCall, handler: handleSendMessageCall }, { pattern: isVoucherCall, handler: handleVoucherCall }, @@ -72,8 +75,11 @@ export async function handleUserMessageSent({ event, common, tempState }: IHandl value: event.args.message.value, replyToMessageId: event.args.message.details?.to || null, expiration: event.args.expirtaion || null, - exitCode: event.args.message.details?.code?.__kind === 'Success' ? 0 : 1, + exitCode: !event.args.message.details?.code ? null : event.args.message.details.code.__kind === 'Success' ? 0 : 1, }); + + msg.parentId = msg.replyToMessageId ? msg.replyToMessageId : await tempState.getMessageId(msg.id); + if (event.args.message.destination === ZERO_ADDRESS) { tempState.addEvent(msg); } else { @@ -140,7 +146,12 @@ export async function handleCodeChanged({ event, common, tempState }: IHandleEve } export async function handleMessagesDispatched({ event, tempState }: IHandleEventProps) { - await Promise.all(event.args.statuses.map((s) => tempState.setDispatchedStatus(s[0], s[1].__kind))); + await Promise.all( + event.args.statuses.map((s) => { + tempState.removeParentMsgId(s[0]); + return tempState.setDispatchedStatus(s[0], s[1].__kind); + }), + ); } const reasons = { diff --git a/idea/squid/src/main.ts b/idea/squid/src/main.ts index 58c7bc72d6..0fd4b0d03b 100644 --- a/idea/squid/src/main.ts +++ b/idea/squid/src/main.ts @@ -19,10 +19,13 @@ import { handleUserMessageSent, IHandleEventProps, } from './event.route'; +import { createClient, RedisClientType } from 'redis'; +import { config } from './config'; +import { GearApi } from '@gear-js/api'; let tempState: TempState; -const callHandlers: Array<{ pattern: (obj: any) => boolean; handler: (args: IHandleEventProps) => Promise }> = [ +const eventHandlers: Array<{ pattern: (obj: any) => boolean; handler: (args: IHandleEventProps) => Promise }> = [ { pattern: isMessageQueued, handler: handleMessageQueued }, { pattern: isUserMessageSent, handler: handleUserMessageSent }, { pattern: isProgramChanged, handler: handleProgramChanged }, @@ -42,7 +45,7 @@ const handler = async (ctx: ProcessorContext) => { }; for (const event of block.events) { - const { handler } = callHandlers.find(({ pattern }) => pattern(event)); + const { handler } = eventHandlers.find(({ pattern }) => pattern(event)); if (!handler) { continue; @@ -55,12 +58,27 @@ const handler = async (ctx: ProcessorContext) => { await tempState.save(); }; -const main = async () => { - tempState = new TempState(); +interface RedisClient extends RedisClientType {} + +const main = async (api: GearApi) => { + const redisClient: RedisClient = createClient({ + username: config.redis.user, + password: config.redis.password, + socket: { + host: config.redis.host, + port: config.redis.port, + }, + }); + await redisClient.connect(); + + tempState = new TempState(redisClient, api.genesisHash.toHex()); + api.disconnect(); processor.run(new TypeormDatabase({ supportHotBlocks: true }), handler); }; -main().catch((e) => { - console.error(e); - process.exit(1); -}); +GearApi.create({ providerAddress: config.squid.rpc }) + .then(main) + .catch((e) => { + console.error(e); + process.exit(1); + }); diff --git a/idea/squid/src/temp-state.ts b/idea/squid/src/temp-state.ts index ff013f3297..a0539e9a3a 100644 --- a/idea/squid/src/temp-state.ts +++ b/idea/squid/src/temp-state.ts @@ -17,6 +17,8 @@ import { } from './model'; import { Block, ProcessorContext } from './processor'; import { MessageStatus } from './common'; +import { RedisClientType } from '@redis/client'; +import { findChildMessageId } from './util'; const gearProgramModule = xxhashAsHex('GearProgram', 128); const programStorageMethod = xxhashAsHex('ProgramStorage', 128); @@ -49,22 +51,28 @@ export class TempState { private messagesFromProgram: Map; private messagesToProgram: Map; private events: Map; + private cachedMessages: { [key: string]: number }; + private genesisHash: string; private _ctx: ProcessorContext; private _metadata: Metadata; private _registry: TypeRegistry; private _specVersion: number; private _programStorageTy: string; + private _redis: RedisClientType; - constructor() { + constructor(redisClient: RedisClientType, genesisHash: string) { + this._redis = redisClient; + this.genesisHash = genesisHash; this.programs = new Map(); this.codes = new Map(); this.messagesFromProgram = new Map(); this.messagesToProgram = new Map(); this.events = new Map(); this.newPrograms = new Set(); + this.cachedMessages = {}; } - newState(ctx: ProcessorContext) { + async newState(ctx: ProcessorContext) { this._ctx = ctx; this.programs.clear(); this.codes.clear(); @@ -72,6 +80,14 @@ export class TempState { this.messagesToProgram.clear(); this.events.clear(); this.newPrograms.clear(); + + this._redis.on('error', (error) => this._ctx.log.error(error)); + + const temp = Object.entries(await this._redis.hGetAll(this.genesisHash)); + this.cachedMessages = {}; + temp.forEach(([key, value]) => { + this.cachedMessages[key] = Number(value); + }); } addProgram(program: Program) { @@ -89,6 +105,8 @@ export class TempState { msg.service = service; msg.fn = name; + this.saveParentMsgId(msg.id); + this.messagesToProgram.set(msg.id, msg); } @@ -114,6 +132,7 @@ export class TempState { blockHash: msg.blockHash, blockNumber: msg.blockNumber, id: msg.id, + parentId: msg.parentId, source: msg.source, payload: msg.payload, service, @@ -296,11 +315,37 @@ export class TempState { 'Data saved', ); } + + await this._redis.del(this.genesisHash); + if (Object.keys(this.cachedMessages).length > 0) { + await this._redis.hSet(this.genesisHash, this.cachedMessages); + } } catch (error) { this._ctx.log.error({ error: error.message, stack: error.stack }, 'Failed to save data'); throw error; } } + + saveParentMsgId(parentId: string, nonce: number = 0) { + this.cachedMessages[parentId] = nonce; + return parentId; + } + + removeParentMsgId(parentId: string) { + delete this.cachedMessages[parentId]; + } + + async getMessageId(childId: string) { + const finder = Object.entries(this.cachedMessages).map(([parentId, nonce]) => { + return findChildMessageId(parentId, childId, Number(nonce)); + }); + + return Promise.any(finder) + .then(({ parentId, nonce }) => { + return this.saveParentMsgId(parentId, nonce); + }) + .catch(() => null); + } } const getAllNeccesaryTypes = (metadata: Metadata, tyindex: SiLookupTypeId | number): Record => { diff --git a/idea/squid/src/util.ts b/idea/squid/src/util.ts index 9a5855e163..f80fbeb5ad 100644 --- a/idea/squid/src/util.ts +++ b/idea/squid/src/util.ts @@ -1,14 +1,15 @@ import { CUploadCode, CUploadProgram, CVoucherCall, isUploadCode, isUploadProgram } from './types/calls'; -import { getGrReply } from '@gear-js/api'; -import { u8aToHex } from '@polkadot/util'; +import { getGrReply, CreateType } from '@gear-js/api'; +import { u8aToHex, u8aToU8a, u8aConcat, stringToU8a } from '@polkadot/util'; +import { blake2AsHex } from '@polkadot/util-crypto'; export async function getMetahash(call: CUploadCode | CUploadProgram | CVoucherCall): Promise { const code = isUploadCode(call) || isUploadProgram(call) ? call.args.code : call.args.call.__kind === 'UploadCode' - ? call.args.call.code - : null; + ? call.args.call.code + : null; if (code) { let metahash: Uint8Array; @@ -24,3 +25,20 @@ export async function getMetahash(call: CUploadCode | CUploadProgram | CVoucherC return null; } + +const prefix = stringToU8a('outgoing'); +const nonces = Array.from({ length: 512 }, (_v, i) => CreateType.create('u32', i).toU8a()); + +export async function findChildMessageId(parentId: string, idToFind: string, startNonce: number = 0) { + const msgId = u8aToU8a(parentId); + + for (let i = startNonce; i < nonces.length; i++) { + const childId = blake2AsHex(u8aConcat(prefix, msgId, nonces[i])); + + if (childId === idToFind) { + return { parentId, nonce: i }; + } + } + + throw Error('Child id not found'); +} diff --git a/idea/squid/tsconfig.json b/idea/squid/tsconfig.json index 03553c22ba..bc31f23382 100644 --- a/idea/squid/tsconfig.json +++ b/idea/squid/tsconfig.json @@ -5,7 +5,10 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, - "strict": false + "strict": false, + "paths": { + "@/*": ["./src/*"] + } }, "include": ["src"] } diff --git a/yarn.lock b/yarn.lock index e596c5315f..36c5536e71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6597,6 +6597,15 @@ __metadata: languageName: node linkType: hard +"@types/redis@npm:^4.0.11": + version: 4.0.11 + resolution: "@types/redis@npm:4.0.11" + dependencies: + redis: "*" + checksum: 4b2d252368a7dc78738a98a8bcc817f92ca097511a901427628566f24f53998a2b1b524a85dea6a19307d4a95b55bd7d5a6ad7cc944ae8f39e54ca2f28ddf893 + languageName: node + linkType: hard + "@types/resolve@npm:1.17.1": version: 1.17.1 resolution: "@types/resolve@npm:1.17.1" @@ -12188,9 +12197,11 @@ __metadata: "@subsquid/typeorm-migration": 1.3.0 "@subsquid/typeorm-store": 1.5.1 "@types/node": 20.12.7 + "@types/redis": ^4.0.11 dotenv: 16.4.5 indexer-db: "workspace:^" pg: 8.11.5 + redis: ^4.7.0 sails-js: ^0.1.9 ts-node-dev: ^2.0.0 typeorm: 0.3.20 @@ -16615,7 +16626,7 @@ __metadata: languageName: node linkType: hard -"redis@npm:^4.6.15, redis@npm:^4.6.8": +"redis@npm:*, redis@npm:^4.6.15, redis@npm:^4.6.8, redis@npm:^4.7.0": version: 4.7.0 resolution: "redis@npm:4.7.0" dependencies: From 578371e2beb28173076e9297bea910c3c0e0d248 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 3 Oct 2024 14:35:32 +0300 Subject: [PATCH 4/6] feat(wallet-connect): init package (#1648) Co-authored-by: sergey filyanin --- .../CI-CD-Wallet-Connect-Package.yml | 41 +- idea/frontend/package.json | 3 +- .../src/features/wallet/assets/enkrypt.svg | 9 - .../src/features/wallet/assets/polkadot.svg | 11 - .../src/features/wallet/assets/subwallet.svg | 87 -- .../src/features/wallet/assets/talisman.svg | 11 - idea/frontend/src/features/wallet/consts.ts | 17 - idea/frontend/src/features/wallet/index.ts | 3 - idea/frontend/src/features/wallet/types.ts | 5 - .../account-button/account-button.module.scss | 5 - .../ui/account-button/account-button.tsx | 25 - .../wallet/ui/account-button/index.ts | 3 - .../accounts-modal/accounts-modal.module.scss | 114 -- .../ui/accounts-modal/accounts-modal.tsx | 133 -- .../wallet/ui/accounts-modal/index.ts | 3 - .../src/features/wallet/ui/wallet/index.ts | 3 - .../wallet/ui/wallet/wallet.module.scss | 14 - .../src/features/wallet/ui/wallet/wallet.tsx | 39 - .../shared/assets/images/actions/copyKey.svg | 1 - .../shared/assets/images/actions/logout.svg | 3 - .../src/widgets/header/ui/topSide/TopSide.tsx | 10 +- package.json | 6 +- utils/wallet-connect/.env.example | 1 + utils/wallet-connect/.eslintrc.cjs | 19 + utils/wallet-connect/.gitignore | 24 + utils/wallet-connect/README.md | 86 ++ utils/wallet-connect/index.html | 11 + utils/wallet-connect/package.json | 66 + utils/wallet-connect/src/assets/copy.svg | 8 + utils/wallet-connect/src/assets/edit-icon.svg | 10 + utils/wallet-connect/src/assets/enkrypt.svg | 10 + utils/wallet-connect/src/assets/exit.svg | 3 + utils/wallet-connect/src/assets/nova.svg | 16 + utils/wallet-connect/src/assets/polkadot.svg | 12 + utils/wallet-connect/src/assets/subwallet.svg | 88 ++ utils/wallet-connect/src/assets/talisman.svg | 12 + utils/wallet-connect/src/assets/vara.svg | 11 + .../account-button/account-button.module.scss | 4 + .../account-button/account-button.tsx | 51 + .../src/components/account-button/index.ts | 3 + .../components/balance/balance.module.scss | 32 + .../src/components/balance/balance.tsx | 33 + .../src/components/balance/index.ts | 3 + utils/wallet-connect/src/components/index.ts | 4 + .../src/components/ui-config.ts | 23 + .../src/components/wallet-button/index.ts | 3 + .../wallet-button/wallet-button.module.scss | 16 + .../wallet-button/wallet-button.tsx | 69 + .../src/components/wallet-modal/index.ts | 3 + .../wallet-modal/wallet-modal.module.scss | 85 ++ .../components/wallet-modal/wallet-modal.tsx | 146 ++ .../src/components/wallet}/index.ts | 0 .../src/components/wallet/wallet.module.scss | 5 + .../src/components/wallet/wallet.tsx | 46 + utils/wallet-connect/src/consts.ts | 27 + .../wallet-connect/src/hooks.ts | 10 +- utils/wallet-connect/src/index.ts | 4 + utils/wallet-connect/src/preview/index.scss | 22 + utils/wallet-connect/src/preview/index.tsx | 48 + utils/wallet-connect/src/types.ts | 13 + utils/wallet-connect/src/utils.ts | 33 + utils/wallet-connect/src/vite-env.d.ts | 2 + utils/wallet-connect/tsconfig.json | 25 + utils/wallet-connect/tsconfig.node.json | 10 + utils/wallet-connect/vite.config.ts | 34 + yarn.lock | 1213 ++++++++++++++++- 66 files changed, 2319 insertions(+), 571 deletions(-) delete mode 100644 idea/frontend/src/features/wallet/assets/enkrypt.svg delete mode 100644 idea/frontend/src/features/wallet/assets/polkadot.svg delete mode 100644 idea/frontend/src/features/wallet/assets/subwallet.svg delete mode 100644 idea/frontend/src/features/wallet/assets/talisman.svg delete mode 100644 idea/frontend/src/features/wallet/consts.ts delete mode 100644 idea/frontend/src/features/wallet/index.ts delete mode 100644 idea/frontend/src/features/wallet/types.ts delete mode 100644 idea/frontend/src/features/wallet/ui/account-button/account-button.module.scss delete mode 100644 idea/frontend/src/features/wallet/ui/account-button/account-button.tsx delete mode 100644 idea/frontend/src/features/wallet/ui/account-button/index.ts delete mode 100644 idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.module.scss delete mode 100644 idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.tsx delete mode 100644 idea/frontend/src/features/wallet/ui/accounts-modal/index.ts delete mode 100644 idea/frontend/src/features/wallet/ui/wallet/index.ts delete mode 100644 idea/frontend/src/features/wallet/ui/wallet/wallet.module.scss delete mode 100644 idea/frontend/src/features/wallet/ui/wallet/wallet.tsx delete mode 100644 idea/frontend/src/shared/assets/images/actions/copyKey.svg delete mode 100644 idea/frontend/src/shared/assets/images/actions/logout.svg create mode 100644 utils/wallet-connect/.env.example create mode 100644 utils/wallet-connect/.eslintrc.cjs create mode 100644 utils/wallet-connect/.gitignore create mode 100644 utils/wallet-connect/README.md create mode 100644 utils/wallet-connect/index.html create mode 100644 utils/wallet-connect/package.json create mode 100644 utils/wallet-connect/src/assets/copy.svg create mode 100644 utils/wallet-connect/src/assets/edit-icon.svg create mode 100644 utils/wallet-connect/src/assets/enkrypt.svg create mode 100644 utils/wallet-connect/src/assets/exit.svg create mode 100644 utils/wallet-connect/src/assets/nova.svg create mode 100644 utils/wallet-connect/src/assets/polkadot.svg create mode 100644 utils/wallet-connect/src/assets/subwallet.svg create mode 100644 utils/wallet-connect/src/assets/talisman.svg create mode 100644 utils/wallet-connect/src/assets/vara.svg create mode 100644 utils/wallet-connect/src/components/account-button/account-button.module.scss create mode 100644 utils/wallet-connect/src/components/account-button/account-button.tsx create mode 100644 utils/wallet-connect/src/components/account-button/index.ts create mode 100644 utils/wallet-connect/src/components/balance/balance.module.scss create mode 100644 utils/wallet-connect/src/components/balance/balance.tsx create mode 100644 utils/wallet-connect/src/components/balance/index.ts create mode 100644 utils/wallet-connect/src/components/index.ts create mode 100644 utils/wallet-connect/src/components/ui-config.ts create mode 100644 utils/wallet-connect/src/components/wallet-button/index.ts create mode 100644 utils/wallet-connect/src/components/wallet-button/wallet-button.module.scss create mode 100644 utils/wallet-connect/src/components/wallet-button/wallet-button.tsx create mode 100644 utils/wallet-connect/src/components/wallet-modal/index.ts create mode 100644 utils/wallet-connect/src/components/wallet-modal/wallet-modal.module.scss create mode 100644 utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx rename {idea/frontend/src/features/wallet/ui => utils/wallet-connect/src/components/wallet}/index.ts (100%) create mode 100644 utils/wallet-connect/src/components/wallet/wallet.module.scss create mode 100644 utils/wallet-connect/src/components/wallet/wallet.tsx create mode 100644 utils/wallet-connect/src/consts.ts rename idea/frontend/src/features/wallet/hooks/index.ts => utils/wallet-connect/src/hooks.ts (62%) create mode 100644 utils/wallet-connect/src/index.ts create mode 100644 utils/wallet-connect/src/preview/index.scss create mode 100644 utils/wallet-connect/src/preview/index.tsx create mode 100644 utils/wallet-connect/src/types.ts create mode 100644 utils/wallet-connect/src/utils.ts create mode 100644 utils/wallet-connect/src/vite-env.d.ts create mode 100644 utils/wallet-connect/tsconfig.json create mode 100644 utils/wallet-connect/tsconfig.node.json create mode 100644 utils/wallet-connect/vite.config.ts diff --git a/.github/workflows/CI-CD-Wallet-Connect-Package.yml b/.github/workflows/CI-CD-Wallet-Connect-Package.yml index c2e64f2eab..b5f357d0a0 100644 --- a/.github/workflows/CI-CD-Wallet-Connect-Package.yml +++ b/.github/workflows/CI-CD-Wallet-Connect-Package.yml @@ -12,34 +12,6 @@ on: workflow_dispatch: jobs: - wallet-connect-test: - if: github.event_name == 'pull_request' - runs-on: ubuntu-latest - steps: - - name: Cancel previous workflow runs - uses: styfle/cancel-workflow-action@0.4.0 - with: - access_token: ${{ github.token }} - - - uses: actions/checkout@v2 - - - name: Install NodeJS 18.x - uses: actions/setup-node@v2.1.5 - with: - node-version: 18.x - - - name: 'gear-js-wallet: Install dependencies' - working-directory: utils/wallet-connect - run: yarn install - - - name: 'gear-js-wallet: Build pkg' - working-directory: utils/wallet-connect - run: yarn build - - - name: 'gear-js-wallet: Run tests' - working-directory: utils/wallet-connect - run: yarn test - wallet-connect-build: if: github.event_name == 'pull_request' runs-on: ubuntu-latest @@ -56,13 +28,13 @@ jobs: with: node-version: 18.x - - name: 'vara-ui: Install dependencies' + - name: 'wallet-connect: Install dependencies' working-directory: utils/wallet-connect - run: npm install + run: yarn install - - name: 'vara-ui: Build pkg' + - name: 'vwallet-connect: Build pkg' working-directory: utils/wallet-connect - run: npm run build + run: yarn run build publish-to-npm: if: github.event_name == 'push' @@ -81,15 +53,14 @@ jobs: id: check_gear with: file-name: utils/wallet-connect/package.json - file-url: https://unpkg.com/@gear-js/ui@latest/package.json + file-url: https://unpkg.com/@gear-js/wallet-connect@latest/package.json static-checking: localIsNew - name: '@gear-js/wallet-connect: Publish' - if: steps.check_gear.outputs.changed == 'true' working-directory: utils/wallet-connect run: | export token=$(printenv $(printenv GITHUB_ACTOR)) - npm install + yarn install npm run build npm config set //registry.npmjs.org/:_authToken=$token --no-workspaces npm publish diff --git a/idea/frontend/package.json b/idea/frontend/package.json index 23f7fea42e..62c5a167dd 100644 --- a/idea/frontend/package.json +++ b/idea/frontend/package.json @@ -12,6 +12,7 @@ "@gear-js/api": "0.38.1", "@gear-js/react-hooks": "workspace:^", "@gear-js/ui": "workspace:^", + "@gear-js/wallet-connect": "workspace:^", "@hcaptcha/react-hcaptcha": "1.8.1", "@hookform/resolvers": "3.3.2", "@polkadot/api": "11.0.2", @@ -66,7 +67,7 @@ "typescript": "5.5.3", "vite": "4.4.11", "vite-plugin-checker": "0.6.2", - "vite-plugin-node-polyfills": "0.15.0", + "vite-plugin-node-polyfills": "0.22.0", "vite-plugin-svgr": "4.1.0" } } diff --git a/idea/frontend/src/features/wallet/assets/enkrypt.svg b/idea/frontend/src/features/wallet/assets/enkrypt.svg deleted file mode 100644 index 065816410d..0000000000 --- a/idea/frontend/src/features/wallet/assets/enkrypt.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/idea/frontend/src/features/wallet/assets/polkadot.svg b/idea/frontend/src/features/wallet/assets/polkadot.svg deleted file mode 100644 index 657d2c8144..0000000000 --- a/idea/frontend/src/features/wallet/assets/polkadot.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/idea/frontend/src/features/wallet/assets/subwallet.svg b/idea/frontend/src/features/wallet/assets/subwallet.svg deleted file mode 100644 index 688cffca0f..0000000000 --- a/idea/frontend/src/features/wallet/assets/subwallet.svg +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/idea/frontend/src/features/wallet/assets/talisman.svg b/idea/frontend/src/features/wallet/assets/talisman.svg deleted file mode 100644 index 5924ba2b2a..0000000000 --- a/idea/frontend/src/features/wallet/assets/talisman.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/idea/frontend/src/features/wallet/consts.ts b/idea/frontend/src/features/wallet/consts.ts deleted file mode 100644 index ab279d78de..0000000000 --- a/idea/frontend/src/features/wallet/consts.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Entries } from '@/shared/types'; - -import PolkadotSVG from './assets/polkadot.svg?react'; -import SubwalletSVG from './assets/subwallet.svg?react'; -import TalismanSVG from './assets/talisman.svg?react'; -import EnkryptSVG from './assets/enkrypt.svg?react'; - -const WALLET = { - 'polkadot-js': { name: 'Polkadot JS', SVG: PolkadotSVG }, - 'subwallet-js': { name: 'SubWallet', SVG: SubwalletSVG }, - talisman: { name: 'Talisman', SVG: TalismanSVG }, - enkrypt: { name: 'Enkrypt', SVG: EnkryptSVG }, -}; - -const WALLETS = Object.entries(WALLET) as Entries; - -export { WALLET, WALLETS }; diff --git a/idea/frontend/src/features/wallet/index.ts b/idea/frontend/src/features/wallet/index.ts deleted file mode 100644 index e3bcb1cbd9..0000000000 --- a/idea/frontend/src/features/wallet/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Wallet } from './ui'; - -export { Wallet }; diff --git a/idea/frontend/src/features/wallet/types.ts b/idea/frontend/src/features/wallet/types.ts deleted file mode 100644 index 61e7c46d76..0000000000 --- a/idea/frontend/src/features/wallet/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { WALLET } from './consts'; - -type WalletId = keyof typeof WALLET; - -export type { WalletId }; diff --git a/idea/frontend/src/features/wallet/ui/account-button/account-button.module.scss b/idea/frontend/src/features/wallet/ui/account-button/account-button.module.scss deleted file mode 100644 index 3f8dc7c30f..0000000000 --- a/idea/frontend/src/features/wallet/ui/account-button/account-button.module.scss +++ /dev/null @@ -1,5 +0,0 @@ -.accountBtn { - white-space: nowrap; - text-overflow: ellipsis; - text-transform: uppercase; -} diff --git a/idea/frontend/src/features/wallet/ui/account-button/account-button.tsx b/idea/frontend/src/features/wallet/ui/account-button/account-button.tsx deleted file mode 100644 index bf17b5d1f5..0000000000 --- a/idea/frontend/src/features/wallet/ui/account-button/account-button.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import Identicon from '@polkadot/react-identicon'; -import clsx from 'clsx'; -import { buttonStyles } from '@gear-js/ui'; - -import styles from './account-button.module.scss'; - -type Props = { - name?: string; - address: string; - className?: string; - onClick: () => void; -}; - -const AccountButton = ({ name, address, className, onClick }: Props) => { - const accountBtnClasses = clsx(buttonStyles.button, styles.accountBtn, className); - - return ( - - ); -}; - -export { AccountButton }; diff --git a/idea/frontend/src/features/wallet/ui/account-button/index.ts b/idea/frontend/src/features/wallet/ui/account-button/index.ts deleted file mode 100644 index ae1232b095..0000000000 --- a/idea/frontend/src/features/wallet/ui/account-button/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { AccountButton } from './account-button'; - -export { AccountButton }; diff --git a/idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.module.scss b/idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.module.scss deleted file mode 100644 index 35461e3dd7..0000000000 --- a/idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.module.scss +++ /dev/null @@ -1,114 +0,0 @@ -@use '@gear-js/ui/breakpoints' as *; -@use '@gear-js/ui/variables' as ui; -@use '@gear-js/ui/headings' as *; -@use '@/shared/assets/styles/variables' as *; -@use '@/shared/assets/styles/mixins' as *; - -.simplebar { - @include customSimplebar; - max-height: 50vh; - margin-right: -16px; - - :global(.simplebar-content) { - margin-right: 16px; - } -} - -.footer { - display: flex; - - button:nth-child(2) { - margin-left: auto; - } -} - -.list { - @include childrenMargin(16px); - - .accountButton { - width: 100%; - font-weight: 500; - text-transform: uppercase; - padding: 16px 40px; - - &.active { - background: $successColor; - } - } - - .accountName { - font-size: $fontSizeMedium; - padding: 0 5px; - } - - .accountIcon { - @include md { - display: none !important; - } - } -} - -.accountItem { - @include childrenMargin(10px, right); - - display: flex; - align-items: center; - - .accountButton { - flex: 1 1; - - &.active { - cursor: default; - background-color: $successColor; - - &:hover { - background-color: $successColor; - } - } - } -} - -.button { - display: flex; - justify-content: space-between; - background-color: ui.$buttonColorLight; - letter-spacing: 0.08em; - - span { - display: flex; - align-items: center; - } - - &:hover { - background-color: ui.$buttonColorLightHover; - } - - &:not(.enabled) { - pointer-events: none; - - .status { - opacity: 0.6; - } - } - - .status { - text-align: right; - - &Text { - font-size: 12px; - line-height: 14px; - } - - &Accounts { - font-size: 10px; - line-height: 10px; - color: $successColor; - } - } - - .connectIcon { - width: 12px; - height: 12px; - margin-left: 7px; - } -} diff --git a/idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.tsx b/idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.tsx deleted file mode 100644 index 0fcf8ef477..0000000000 --- a/idea/frontend/src/features/wallet/ui/accounts-modal/accounts-modal.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { useAccount, useAlert } from '@gear-js/react-hooks'; -import { Button, Modal, buttonStyles } from '@gear-js/ui'; -import cx from 'clsx'; - -import { copyToClipboard } from '@/shared/helpers'; -import LogoutSVG from '@/shared/assets/images/actions/logout.svg?react'; -import CopyKeySVG from '@/shared/assets/images/actions/copyKey.svg?react'; - -import { AccountButton } from '../account-button'; -import { useWallet } from '../../hooks'; -import { WALLETS } from '../../consts'; -import styles from './accounts-modal.module.scss'; - -type Props = { - close: () => void; -}; - -const AccountsModal = ({ close }: Props) => { - const { wallets, isAnyWallet, account, login, logout } = useAccount(); - const alert = useAlert(); - - const { wallet, walletId, setWalletId, resetWalletId } = useWallet(); - - const handleLogoutClick = () => { - logout(); - close(); - }; - - const renderWallets = () => - WALLETS.map(([id, { SVG, name }]) => { - const { status, accounts, connect } = wallets?.[id] || {}; - const isEnabled = Boolean(status); - const isConnected = status === 'connected'; - - const accountsCount = accounts?.length; - const accountsStatus = `${accountsCount} ${accountsCount === 1 ? 'account' : 'accounts'}`; - - const buttonClassName = cx( - buttonStyles.button, - buttonStyles.large, - buttonStyles.block, - styles.button, - isEnabled && styles.enabled, - ); - - return ( -
  • - -
  • - ); - }); - - const walletAccounts = wallets && walletId ? wallets[walletId]?.accounts : undefined; - - const renderAccoounts = () => - walletAccounts?.map((_account) => { - const { address, meta } = _account; - const isActive = address === account?.address; - - const handleClick = () => { - if (isActive) return; - - login(_account); - close(); - }; - - const accountBtnClasses = cx( - buttonStyles.large, - styles.accountButton, - isActive ? styles.active : buttonStyles.light, - ); - - return ( -
  • - -
  • - ); - }); - - const renderFooter = () => - (wallet || account) && ( -
    - {wallet &&
    - ); - - return ( - - {isAnyWallet ? ( - <> - {!wallet &&
      {renderWallets()}
    } - - {!!wallet && - (walletAccounts?.length ? ( -
      {renderAccoounts()}
    - ) : ( -

    No accounts found. Please open your extension and create a new account or import existing.

    - ))} - - ) : ( -

    - Wallet extensions were not found or disconnected. Please check how to install a supported wallet and create an - account{' '} - - here - - . -

    - )} -
    - ); -}; - -export { AccountsModal }; diff --git a/idea/frontend/src/features/wallet/ui/accounts-modal/index.ts b/idea/frontend/src/features/wallet/ui/accounts-modal/index.ts deleted file mode 100644 index b514cf7463..0000000000 --- a/idea/frontend/src/features/wallet/ui/accounts-modal/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { AccountsModal } from './accounts-modal'; - -export { AccountsModal }; diff --git a/idea/frontend/src/features/wallet/ui/wallet/index.ts b/idea/frontend/src/features/wallet/ui/wallet/index.ts deleted file mode 100644 index c7f5f4752f..0000000000 --- a/idea/frontend/src/features/wallet/ui/wallet/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Wallet } from './wallet'; - -export { Wallet }; diff --git a/idea/frontend/src/features/wallet/ui/wallet/wallet.module.scss b/idea/frontend/src/features/wallet/ui/wallet/wallet.module.scss deleted file mode 100644 index 19636cd7fa..0000000000 --- a/idea/frontend/src/features/wallet/ui/wallet/wallet.module.scss +++ /dev/null @@ -1,14 +0,0 @@ -@use '@/shared/assets/styles/variables' as *; - -.accountBtn { - background-color: $bgColorSecondary; - - &:hover { - background-color: $bgColorTertiary; - } - - & > div { - // hacky, but need to override Identicon's 'cursor: copy' - cursor: inherit !important; - } -} diff --git a/idea/frontend/src/features/wallet/ui/wallet/wallet.tsx b/idea/frontend/src/features/wallet/ui/wallet/wallet.tsx deleted file mode 100644 index 46f2db2fe1..0000000000 --- a/idea/frontend/src/features/wallet/ui/wallet/wallet.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useAccount } from '@gear-js/react-hooks'; -import { Button, buttonStyles } from '@gear-js/ui'; -import cx from 'clsx'; - -import { useModalState } from '@/hooks'; -import { OnboardingTooltip } from '@/shared/ui/onboardingTooltip'; -import SubstrateSVG from '@/shared/assets/images/logos/substrate.svg?react'; - -import { AccountsModal } from '../accounts-modal'; -import { AccountButton } from '../account-button'; -import styles from './wallet.module.scss'; - -const Wallet = () => { - const { account, isAccountReady } = useAccount(); - const [isModalOpen, openModal, closeModal] = useModalState(); - - if (!isAccountReady) return null; - - return ( - <> - {account ? ( - - ) : ( - - + ); +} + +type ModalProps = Omit, 'size' | 'block'> & { + color: 'primary' | 'light'; +}; + +VaraAccountButton.Modal = (props: ModalProps) => ; + +GearAccountButton.Modal = (props: ModalProps) => ; + +export { VaraAccountButton, GearAccountButton }; diff --git a/utils/wallet-connect/src/components/account-button/index.ts b/utils/wallet-connect/src/components/account-button/index.ts new file mode 100644 index 0000000000..7f984112f4 --- /dev/null +++ b/utils/wallet-connect/src/components/account-button/index.ts @@ -0,0 +1,3 @@ +import { VaraAccountButton, GearAccountButton } from './account-button'; + +export { VaraAccountButton, GearAccountButton }; diff --git a/utils/wallet-connect/src/components/balance/balance.module.scss b/utils/wallet-connect/src/components/balance/balance.module.scss new file mode 100644 index 0000000000..9faa4fef0a --- /dev/null +++ b/utils/wallet-connect/src/components/balance/balance.module.scss @@ -0,0 +1,32 @@ +.balance { + display: flex; + align-items: center; + gap: 10px; +} + +.text { + display: flex; + align-items: flex-end; + gap: 4px; + + &.gear { + color: #fff; + } + + &.vara { + color: #000; + } +} + +.value { + font-size: 20px; + font-weight: 700; + line-height: 22px; + letter-spacing: -0.02em; +} + +.unit { + font-size: 10px; + font-weight: 400; + line-height: 14px; +} diff --git a/utils/wallet-connect/src/components/balance/balance.tsx b/utils/wallet-connect/src/components/balance/balance.tsx new file mode 100644 index 0000000000..2775b79aba --- /dev/null +++ b/utils/wallet-connect/src/components/balance/balance.tsx @@ -0,0 +1,33 @@ +import { useAccount, useApi, useBalanceFormat, useDeriveBalancesAll } from '@gear-js/react-hooks'; +import cx from 'clsx'; + +import { ReactComponent as VaraSVG } from '../../assets/vara.svg'; +import styles from './balance.module.scss'; + +type Props = { + variant: 'gear' | 'vara'; +}; + +function Balance({ variant }: Props) { + const { isApiReady } = useApi(); + const { account } = useAccount(); + const { getFormattedBalance } = useBalanceFormat(); + + const { data: balances } = useDeriveBalancesAll({ address: account?.decodedAddress, watch: true }); + const balance = isApiReady && balances ? getFormattedBalance(balances.freeBalance) : undefined; + + if (!balance) return null; + + return ( +
    + + +

    + {balance.value} + {balance.unit} +

    +
    + ); +} + +export { Balance }; diff --git a/utils/wallet-connect/src/components/balance/index.ts b/utils/wallet-connect/src/components/balance/index.ts new file mode 100644 index 0000000000..d35c5d0857 --- /dev/null +++ b/utils/wallet-connect/src/components/balance/index.ts @@ -0,0 +1,3 @@ +import { Balance } from './balance'; + +export { Balance }; diff --git a/utils/wallet-connect/src/components/index.ts b/utils/wallet-connect/src/components/index.ts new file mode 100644 index 0000000000..2580d7123c --- /dev/null +++ b/utils/wallet-connect/src/components/index.ts @@ -0,0 +1,4 @@ +import { Wallet } from './wallet'; +import { WalletModal } from './wallet-modal'; + +export { Wallet, WalletModal }; diff --git a/utils/wallet-connect/src/components/ui-config.ts b/utils/wallet-connect/src/components/ui-config.ts new file mode 100644 index 0000000000..15b44ade40 --- /dev/null +++ b/utils/wallet-connect/src/components/ui-config.ts @@ -0,0 +1,23 @@ +import * as Gear from '@gear-js/ui'; +import * as Vara from '@gear-js/vara-ui'; + +import { GearAccountButton, VaraAccountButton } from './account-button'; +import { GearWalletButton, VaraWalletButton } from './wallet-button'; + +const UI_CONFIG = { + gear: { + Button: Gear.Button, + AccountButton: GearAccountButton, + WalletButton: GearWalletButton, + Modal: Gear.Modal, + }, + + vara: { + Button: Vara.Button, + AccountButton: VaraAccountButton, + WalletButton: VaraWalletButton, + Modal: Vara.Modal, + }, +} as const; + +export { UI_CONFIG }; diff --git a/utils/wallet-connect/src/components/wallet-button/index.ts b/utils/wallet-connect/src/components/wallet-button/index.ts new file mode 100644 index 0000000000..e16e193195 --- /dev/null +++ b/utils/wallet-connect/src/components/wallet-button/index.ts @@ -0,0 +1,3 @@ +import { VaraWalletButton, GearWalletButton } from './wallet-button'; + +export { VaraWalletButton, GearWalletButton }; diff --git a/utils/wallet-connect/src/components/wallet-button/wallet-button.module.scss b/utils/wallet-connect/src/components/wallet-button/wallet-button.module.scss new file mode 100644 index 0000000000..5c14052144 --- /dev/null +++ b/utils/wallet-connect/src/components/wallet-button/wallet-button.module.scss @@ -0,0 +1,16 @@ +.button { + /* overriding @gear-js/ui and @gear-js/vara-ui */ + justify-content: space-between !important; +} + +.wallet { + display: flex; + align-items: center; +} + +.icon { + margin-right: 8px; + background-color: #fff; + border-radius: 50%; + border: 1px solid #ebeeee; +} diff --git a/utils/wallet-connect/src/components/wallet-button/wallet-button.tsx b/utils/wallet-connect/src/components/wallet-button/wallet-button.tsx new file mode 100644 index 0000000000..6ab87e09a2 --- /dev/null +++ b/utils/wallet-connect/src/components/wallet-button/wallet-button.tsx @@ -0,0 +1,69 @@ +import * as Vara from '@gear-js/vara-ui'; +import * as Gear from '@gear-js/ui'; +import cx from 'clsx'; +import { FunctionComponent, ReactNode, SVGProps } from 'react'; + +import styles from './wallet-button.module.scss'; + +type Props = { + children: ReactNode; + disabled: boolean; + onClick: () => void; +}; + +type WalletProps = { + SVG: FunctionComponent & { title?: string | undefined }>; + name: string; +}; + +function Wallet({ SVG, name }: WalletProps) { + return ( + + + {name} + + ); +} + +function VaraWalletButton({ children, SVG, name, ...props }: Props & WalletProps) { + return ( + + + {children} + + ); +} + +function GearWalletButton({ children, SVG, name, ...props }: Props & WalletProps) { + return ( + + ); +} + +VaraWalletButton.Change = ({ SVG, name, children, ...props }: Omit & WalletProps) => ( + + + {children} + +); + +GearWalletButton.Change = ({ SVG, name, children, ...props }: Omit & WalletProps) => ( + +); + +export { VaraWalletButton, GearWalletButton }; diff --git a/utils/wallet-connect/src/components/wallet-modal/index.ts b/utils/wallet-connect/src/components/wallet-modal/index.ts new file mode 100644 index 0000000000..34eab94792 --- /dev/null +++ b/utils/wallet-connect/src/components/wallet-modal/index.ts @@ -0,0 +1,3 @@ +import { WalletModal } from './wallet-modal'; + +export { WalletModal }; diff --git a/utils/wallet-connect/src/components/wallet-modal/wallet-modal.module.scss b/utils/wallet-connect/src/components/wallet-modal/wallet-modal.module.scss new file mode 100644 index 0000000000..4f404faee6 --- /dev/null +++ b/utils/wallet-connect/src/components/wallet-modal/wallet-modal.module.scss @@ -0,0 +1,85 @@ +.list { + display: flex; + flex-direction: column; + gap: 16px; + + .account { + display: flex; + align-items: center; + gap: 10px; + } +} + +.status { + display: flex; + flex-direction: column; + + font-size: 12px; + line-height: 1; + text-align: right; + + .statusText { + font-weight: 600; + + &.gear { + color: #fff; + } + + &.vara { + color: #a2a2a2; + } + } + + .statusAccounts { + font-weight: 800; + + &.gear { + color: #2bd071; + } + + &.vara { + color: #02f8bf; + } + } +} + +.footer { + display: flex; + justify-content: space-between; +} + +.copyButton, +.logoutButton { + &.gear svg path { + fill: #fff; + } +} + +.editIcon { + &.gear { + margin-left: 10px; + + path { + fill: #fff; + } + } +} + +.text { + &.gear { + color: #fff; + } + + &.vara { + color: #000; + } + + a { + text-decoration: underline; + transition: opacity 0.25s; + + &:hover { + opacity: 0.5; + } + } +} diff --git a/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx b/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx new file mode 100644 index 0000000000..1fe006731a --- /dev/null +++ b/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx @@ -0,0 +1,146 @@ +import { useAccount, useAlert } from '@gear-js/react-hooks'; +import cx from 'clsx'; + +import { copyToClipboard } from '../../utils'; +import { ReactComponent as CopySVG } from '../../assets/copy.svg'; +import { ReactComponent as EditSVG } from '../../assets/edit-icon.svg'; +import { ReactComponent as ExitSVG } from '../../assets/exit.svg'; +import { IS_MOBILE_DEVICE, WALLETS } from '../../consts'; +import { useWallet } from '../../hooks'; +import { UI_CONFIG } from '../ui-config'; +import styles from './wallet-modal.module.scss'; + +type Props = { + variant?: 'gear' | 'vara'; + close: () => void; +}; + +function WalletModal({ variant = 'vara', close }: Props) { + const alert = useAlert(); + const { wallets, isAnyWallet, account, login, logout } = useAccount(); + const { wallet, walletAccounts, setWalletId, resetWalletId } = useWallet(); + + const variantCn = styles[variant]; + const { WalletButton, AccountButton, Button, Modal } = UI_CONFIG[variant]; + + const getWallets = () => + WALLETS.map(([id, { SVG, name }]) => { + const { status, accounts, connect } = wallets?.[id] || {}; + const isEnabled = Boolean(status); + const isConnected = status === 'connected'; + + const accountsCount = accounts?.length || 0; + const accountsStatus = `${accountsCount} ${accountsCount === 1 ? 'account' : 'accounts'}`; + + return ( +
  • + (isConnected ? setWalletId(id) : connect?.())} + disabled={!isEnabled}> + + {isConnected ? 'Enabled' : 'Disabled'} + + {isConnected && {accountsStatus}} + + +
  • + ); + }); + + const getAccounts = () => + walletAccounts?.map((_account) => { + const { address, meta } = _account; + + const isActive = address === account?.address; + const color = isActive ? 'primary' : 'light'; + + const handleClick = () => { + if (isActive) return; + + login(_account); + close(); + }; + + const handleCopyClick = () => { + copyToClipboard({ value: address, alert }); + close(); + }; + + return ( +
  • + + +
  • + ); + }); + + const handleLogoutButtonClick = () => { + logout(); + resetWalletId(); + close(); + }; + + const render = () => { + if (!isAnyWallet) + return IS_MOBILE_DEVICE ? ( +

    + To use this application on mobile devices, open this page inside compatible wallets like Nova or SubWallet. +

    + ) : ( +

    + A compatible wallet was not found or is disabled. Install it following the{' '} + + instructions + + . +

    + ); + + if (!walletAccounts) return
      {getWallets()}
    ; + if (walletAccounts.length) return
      {getAccounts()}
    ; + + return ( +

    + No accounts found. Please open your extension and create a new account or import existing. +

    + ); + }; + + const renderFooter = () => { + if (!wallet) return null; + + return ( +
    + + + + + {account && ( +
    + ); + }; + + return ( + + {render()} + + ); +} + +export { WalletModal }; diff --git a/idea/frontend/src/features/wallet/ui/index.ts b/utils/wallet-connect/src/components/wallet/index.ts similarity index 100% rename from idea/frontend/src/features/wallet/ui/index.ts rename to utils/wallet-connect/src/components/wallet/index.ts diff --git a/utils/wallet-connect/src/components/wallet/wallet.module.scss b/utils/wallet-connect/src/components/wallet/wallet.module.scss new file mode 100644 index 0000000000..65d34a7ea3 --- /dev/null +++ b/utils/wallet-connect/src/components/wallet/wallet.module.scss @@ -0,0 +1,5 @@ +.wallet { + display: flex; + align-items: center; + gap: 20px; +} diff --git a/utils/wallet-connect/src/components/wallet/wallet.tsx b/utils/wallet-connect/src/components/wallet/wallet.tsx new file mode 100644 index 0000000000..88a20d69db --- /dev/null +++ b/utils/wallet-connect/src/components/wallet/wallet.tsx @@ -0,0 +1,46 @@ +import { useAccount } from '@gear-js/react-hooks'; +import { useState } from 'react'; + +import { Balance } from '../balance'; +import { WalletModal } from '../wallet-modal'; +import { UI_CONFIG } from '../ui-config'; +import styles from './wallet.module.scss'; + +type Props = { + variant?: 'gear' | 'vara'; + displayBalance?: boolean; + + // temp solution to support responsiveness in dApps MenuHandler, until it's supported here + accountButtonClassName?: string; +}; + +function Wallet({ variant = 'vara', displayBalance = true, accountButtonClassName }: Props) { + const { account, isAccountReady } = useAccount(); + + const [isModalOpen, setIsModalOpen] = useState(false); + const openModal = () => setIsModalOpen(true); + const closeModal = () => setIsModalOpen(false); + + if (!isAccountReady) return null; + const { Button, AccountButton } = UI_CONFIG[variant]; + + return ( + <> +
    + {displayBalance && } + + {account ? ( +
    + +
    + ) : ( +
    + + {isModalOpen && } + + ); +} + +export { Wallet }; diff --git a/utils/wallet-connect/src/consts.ts b/utils/wallet-connect/src/consts.ts new file mode 100644 index 0000000000..6497785afe --- /dev/null +++ b/utils/wallet-connect/src/consts.ts @@ -0,0 +1,27 @@ +import { ReactComponent as EnkryptSVG } from './assets/enkrypt.svg'; +import { ReactComponent as PolkadotSVG } from './assets/polkadot.svg'; +import { ReactComponent as SubWalletSVG } from './assets/subwallet.svg'; +import { ReactComponent as TalismanSVG } from './assets/talisman.svg'; +import { ReactComponent as NovaSVG } from './assets/nova.svg'; +import { Wallets } from './types'; + +const IS_MOBILE_DEVICE = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + +type InjectedWindow = Window & { walletExtension?: { isNovaWallet: boolean } }; +const isNovaWallet = Boolean((window as unknown as InjectedWindow).walletExtension?.isNovaWallet); + +const WALLET = isNovaWallet + ? { + 'polkadot-js': { name: 'Nova Wallet', SVG: NovaSVG }, + 'subwallet-js': { name: 'SubWallet', SVG: SubWalletSVG }, + } + : { + 'polkadot-js': { name: 'Polkadot JS', SVG: PolkadotSVG }, + 'subwallet-js': { name: 'SubWallet', SVG: SubWalletSVG }, + talisman: { name: 'Talisman', SVG: TalismanSVG }, + enkrypt: { name: 'Enkrypt', SVG: EnkryptSVG }, + }; + +const WALLETS = Object.entries(WALLET) as Wallets; + +export { IS_MOBILE_DEVICE, WALLET, WALLETS, isNovaWallet }; diff --git a/idea/frontend/src/features/wallet/hooks/index.ts b/utils/wallet-connect/src/hooks.ts similarity index 62% rename from idea/frontend/src/features/wallet/hooks/index.ts rename to utils/wallet-connect/src/hooks.ts index 9d46578232..473d0442ae 100644 --- a/idea/frontend/src/features/wallet/hooks/index.ts +++ b/utils/wallet-connect/src/hooks.ts @@ -1,15 +1,17 @@ import { useAccount } from '@gear-js/react-hooks'; import { useEffect, useState } from 'react'; -import { WALLET } from '../consts'; -import { WalletId } from '../types'; +import { WALLET } from './consts'; +import { WalletId } from './types'; function useWallet() { - const { account } = useAccount(); + const { wallets, account } = useAccount(); const defaultWalletId = account?.meta.source as WalletId | undefined; const [walletId, setWalletId] = useState(defaultWalletId); + const wallet = walletId ? WALLET[walletId] : undefined; + const walletAccounts = wallets && walletId ? wallets[walletId].accounts : undefined; useEffect(() => { setWalletId(defaultWalletId); @@ -17,7 +19,7 @@ function useWallet() { const resetWalletId = () => setWalletId(undefined); - return { wallet, walletId, setWalletId, resetWalletId }; + return { wallet, walletId, walletAccounts, setWalletId, resetWalletId }; } export { useWallet }; diff --git a/utils/wallet-connect/src/index.ts b/utils/wallet-connect/src/index.ts new file mode 100644 index 0000000000..ba0be0ca5c --- /dev/null +++ b/utils/wallet-connect/src/index.ts @@ -0,0 +1,4 @@ +import { Wallet, WalletModal } from './components'; +import { useWallet } from './hooks'; + +export { Wallet, WalletModal, useWallet }; diff --git a/utils/wallet-connect/src/preview/index.scss b/utils/wallet-connect/src/preview/index.scss new file mode 100644 index 0000000000..5eec11fdaa --- /dev/null +++ b/utils/wallet-connect/src/preview/index.scss @@ -0,0 +1,22 @@ +main { + min-height: 100vh; + + display: flex; + gap: 32px; + flex-direction: column; + align-items: center; + justify-content: center; + + background-color: #aaa; + + h1 { + color: rgba(255, 255, 255, 0.9); + } + + > div { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + } +} diff --git a/utils/wallet-connect/src/preview/index.tsx b/utils/wallet-connect/src/preview/index.tsx new file mode 100644 index 0000000000..f0ffadcb40 --- /dev/null +++ b/utils/wallet-connect/src/preview/index.tsx @@ -0,0 +1,48 @@ +import { ApiProvider, AccountProvider, useApi } from '@gear-js/react-hooks'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import { Wallet } from '../components'; + +import '@gear-js/vara-ui/dist/style.css'; +import './index.scss'; + +// eslint-disable-next-line react-refresh/only-export-components +function App() { + const { isApiReady } = useApi(); + + if (!isApiReady) return null; + + return ( +
    +
    +

    Vara

    + +
    + +
    +

    Gear

    + +
    +
    + ); +} + +const apiArgs = { endpoint: import.meta.env.VITE_NODE_ADDRESS }; +const queryClient = new QueryClient(); + +const container = document.getElementById('root'); +const root = createRoot(container as HTMLElement); + +root.render( + + + + + + + + + , +); diff --git a/utils/wallet-connect/src/types.ts b/utils/wallet-connect/src/types.ts new file mode 100644 index 0000000000..c1c674bb4c --- /dev/null +++ b/utils/wallet-connect/src/types.ts @@ -0,0 +1,13 @@ +import { FunctionComponent, SVGProps } from 'react'; +import { WALLET } from './consts'; + +export type WalletValue = { + name: string; + SVG: FunctionComponent & { title?: string | undefined }>; +}; + +type WalletId = keyof typeof WALLET; + +type Wallets = [WalletId, WalletValue][]; + +export type { WalletId, Wallets }; diff --git a/utils/wallet-connect/src/utils.ts b/utils/wallet-connect/src/utils.ts new file mode 100644 index 0000000000..978edf06b4 --- /dev/null +++ b/utils/wallet-connect/src/utils.ts @@ -0,0 +1,33 @@ +import { AlertContainerFactory } from '@gear-js/react-hooks'; + +const copyToClipboard = async ({ alert, value }: { alert: AlertContainerFactory; value: string }) => { + const onSuccess = () => alert.success('Copied'); + const onError = () => alert.error('Copy error'); + + function unsecuredCopyToClipboard(text: string) { + const textArea = document.createElement('textarea'); + textArea.value = text; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + onSuccess(); + } catch (err) { + console.error('Unable to copy to clipboard', err); + onError(); + } + document.body.removeChild(textArea); + } + + if (window.isSecureContext && navigator.clipboard) { + navigator.clipboard + .writeText(value) + .then(() => onSuccess()) + .catch(() => onError()); + } else { + unsecuredCopyToClipboard(value); + } +}; + +export { copyToClipboard }; diff --git a/utils/wallet-connect/src/vite-env.d.ts b/utils/wallet-connect/src/vite-env.d.ts new file mode 100644 index 0000000000..b1f45c7866 --- /dev/null +++ b/utils/wallet-connect/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/utils/wallet-connect/tsconfig.json b/utils/wallet-connect/tsconfig.json new file mode 100644 index 0000000000..a7fc6fbf23 --- /dev/null +++ b/utils/wallet-connect/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/utils/wallet-connect/tsconfig.node.json b/utils/wallet-connect/tsconfig.node.json new file mode 100644 index 0000000000..42872c59f5 --- /dev/null +++ b/utils/wallet-connect/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/utils/wallet-connect/vite.config.ts b/utils/wallet-connect/vite.config.ts new file mode 100644 index 0000000000..e97125ad17 --- /dev/null +++ b/utils/wallet-connect/vite.config.ts @@ -0,0 +1,34 @@ +import react from '@vitejs/plugin-react'; +import { resolve } from 'path'; +import { defineConfig } from 'vite'; +import svgr from 'vite-plugin-svgr'; +import dts from 'vite-plugin-dts'; +import { nodePolyfills } from 'vite-plugin-node-polyfills'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + svgr(), + nodePolyfills(), + + dts({ + exclude: ['src/preview'], + }), + ], + + build: { + lib: { + entry: resolve(__dirname, 'src/components/index.ts'), + formats: ['es'], + }, + + rollupOptions: { + external: ['react', '@gear-js/react-hooks', '@gear-js/ui', '@gear-js/vara-ui'], + output: { + globals: { react: 'React' }, + intro: 'import "./style.css";', + }, + }, + }, +}); diff --git a/yarn.lock b/yarn.lock index 36c5536e71..d29defdf21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -247,7 +247,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.21.3, @babel/core@npm:^7.22.20, @babel/core@npm:^7.23.9": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.21.3, @babel/core@npm:^7.22.20, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.5": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -543,6 +543,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.3": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + bin: + parser: ./bin/babel-parser.js + checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.0" @@ -1528,7 +1539,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.22.5": +"@babel/plugin-transform-react-jsx-self@npm:^7.22.5, @babel/plugin-transform-react-jsx-self@npm:^7.24.5": version: 7.24.7 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.7" dependencies: @@ -1539,7 +1550,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.22.5": +"@babel/plugin-transform-react-jsx-source@npm:^7.22.5, @babel/plugin-transform-react-jsx-source@npm:^7.24.1": version: 7.24.7 resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.7" dependencies: @@ -2135,6 +2146,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": ^7.24.8 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2353,7 +2375,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.3.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -2371,6 +2393,13 @@ __metadata: languageName: node linkType: hard +"@eslint-community/regexpp@npm:^4.5.0": + version: 4.11.1 + resolution: "@eslint-community/regexpp@npm:4.11.1" + checksum: 6986685529d30e33c2640973c3d8e7ddd31bef3cc8cb10ad54ddc1dea12680779a2c23a45562aa1462c488137a3570e672d122fac7da22d82294382d915cec70 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^0.4.3": version: 0.4.3 resolution: "@eslint/eslintrc@npm:0.4.3" @@ -2527,6 +2556,7 @@ __metadata: "@gear-js/api": 0.38.1 "@gear-js/react-hooks": "workspace:^" "@gear-js/ui": "workspace:^" + "@gear-js/wallet-connect": "workspace:^" "@hcaptcha/react-hcaptcha": 1.8.1 "@hookform/resolvers": 3.3.2 "@polkadot/api": 11.0.2 @@ -2577,7 +2607,7 @@ __metadata: typescript: 5.5.3 vite: 4.4.11 vite-plugin-checker: 0.6.2 - vite-plugin-node-polyfills: 0.15.0 + vite-plugin-node-polyfills: 0.22.0 vite-plugin-svgr: 4.1.0 yup: 1.3.2 zod: 3.22.4 @@ -2649,7 +2679,7 @@ __metadata: languageName: unknown linkType: soft -"@gear-js/react-hooks@workspace:^, @gear-js/react-hooks@workspace:utils/gear-hooks": +"@gear-js/react-hooks@0.13.0, @gear-js/react-hooks@workspace:^, @gear-js/react-hooks@workspace:utils/gear-hooks": version: 0.0.0-use.local resolution: "@gear-js/react-hooks@workspace:utils/gear-hooks" dependencies: @@ -2717,7 +2747,7 @@ __metadata: languageName: unknown linkType: soft -"@gear-js/ui@workspace:^, @gear-js/ui@workspace:utils/gear-ui": +"@gear-js/ui@0.5.28, @gear-js/ui@workspace:^, @gear-js/ui@workspace:utils/gear-ui": version: 0.0.0-use.local resolution: "@gear-js/ui@workspace:utils/gear-ui" dependencies: @@ -2754,6 +2784,16 @@ __metadata: languageName: unknown linkType: soft +"@gear-js/vara-ui@npm:0.0.11": + version: 0.0.11 + resolution: "@gear-js/vara-ui@npm:0.0.11" + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + checksum: 4ce2565e611c6a6246f98bc11ffeaa2f5a65921b51047dec3a26a42f00b1241f504fd6892190a0c33f2322d1d63b0627b473ca1a43206148d98fcf26189b4f8b + languageName: node + linkType: hard + "@gear-js/voucher-indexer@workspace:idea/voucher-indexer": version: 0.0.0-use.local resolution: "@gear-js/voucher-indexer@workspace:idea/voucher-indexer" @@ -2781,6 +2821,42 @@ __metadata: languageName: unknown linkType: soft +"@gear-js/wallet-connect@workspace:^, @gear-js/wallet-connect@workspace:utils/wallet-connect": + version: 0.0.0-use.local + resolution: "@gear-js/wallet-connect@workspace:utils/wallet-connect" + dependencies: + "@gear-js/react-hooks": 0.13.0 + "@gear-js/ui": 0.5.28 + "@gear-js/vara-ui": 0.0.11 + "@polkadot/react-identicon": 3.10.1 + "@tanstack/react-query": 5.56.2 + "@types/react": 18.3.2 + "@types/react-dom": 18.3.0 + "@typescript-eslint/eslint-plugin": 6.0.0 + "@typescript-eslint/parser": 6.0.0 + "@vitejs/plugin-react": 4.3.0 + clsx: 2.1.1 + eslint: 8.57.0 + eslint-plugin-react-hooks: 4.6.2 + eslint-plugin-react-refresh: 0.4.7 + sass: 1.77.2 + typescript: 5.0.2 + vite: 4.4.5 + vite-plugin-dts: 3.5.1 + vite-plugin-node-polyfills: 0.22.0 + vite-plugin-svgr: 3.2.0 + peerDependencies: + "@gear-js/react-hooks": ^0.13.0 + "@gear-js/ui": ^0.5.28 + "@gear-js/vara-ui": ^0.0.11 + peerDependenciesMeta: + "@gear-js/ui": + optional: true + "@gear-js/vara-ui": + optional: true + languageName: unknown + linkType: soft + "@gear-js/web-tests@workspace:idea/tests": version: 0.0.0-use.local resolution: "@gear-js/web-tests@workspace:idea/tests" @@ -3421,6 +3497,59 @@ __metadata: languageName: node linkType: hard +"@microsoft/api-extractor-model@npm:7.29.8": + version: 7.29.8 + resolution: "@microsoft/api-extractor-model@npm:7.29.8" + dependencies: + "@microsoft/tsdoc": ~0.15.0 + "@microsoft/tsdoc-config": ~0.17.0 + "@rushstack/node-core-library": 5.9.0 + checksum: 95a6b5df089d8bf44555f4565a6f0eda9323917266b2f4730b606aeb2c7f36df7c2cbcae9ca48a9198af7a33442cda8ce2c791e0f4c7c92f3bdaee6c3190b1f5 + languageName: node + linkType: hard + +"@microsoft/api-extractor@npm:^7.36.3": + version: 7.47.9 + resolution: "@microsoft/api-extractor@npm:7.47.9" + dependencies: + "@microsoft/api-extractor-model": 7.29.8 + "@microsoft/tsdoc": ~0.15.0 + "@microsoft/tsdoc-config": ~0.17.0 + "@rushstack/node-core-library": 5.9.0 + "@rushstack/rig-package": 0.5.3 + "@rushstack/terminal": 0.14.2 + "@rushstack/ts-command-line": 4.22.8 + lodash: ~4.17.15 + minimatch: ~3.0.3 + resolve: ~1.22.1 + semver: ~7.5.4 + source-map: ~0.6.1 + typescript: 5.4.2 + bin: + api-extractor: bin/api-extractor + checksum: 5e96654b388359bd9a1fb85ea7698921ca0f9dfa9c57e48fc9d28625107fea54863d57c82f4080686f190ae0d6fcd8b7fa7c070e7b8acb359b5cd62137e2bb23 + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:~0.17.0": + version: 0.17.0 + resolution: "@microsoft/tsdoc-config@npm:0.17.0" + dependencies: + "@microsoft/tsdoc": 0.15.0 + ajv: ~8.12.0 + jju: ~1.4.0 + resolve: ~1.22.2 + checksum: dd2de8247d0fc29608da83edf4ab73a21370f6ce10d089853303e91b135fdb1436ccec3bd1024f235dd3180dfe5dae7342989eadd03af55cf06f0e974e5fc213 + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.15.0, @microsoft/tsdoc@npm:~0.15.0": + version: 0.15.0 + resolution: "@microsoft/tsdoc@npm:0.15.0" + checksum: 3f693cff07b220b68563e3f86e9f94a9c8d0791a7446f76149c7d62ae5ed5cb4578bb48b9b5f9baa3dd9a9f77be81903c74654a41e0ca4ecf78936654952a8d4 + languageName: node + linkType: hard + "@noble/curves@npm:^1.3.0": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" @@ -3745,6 +3874,20 @@ __metadata: languageName: node linkType: hard +"@polkadot/keyring@npm:^13.1.1": + version: 13.1.1 + resolution: "@polkadot/keyring@npm:13.1.1" + dependencies: + "@polkadot/util": 13.1.1 + "@polkadot/util-crypto": 13.1.1 + tslib: ^2.7.0 + peerDependencies: + "@polkadot/util": 13.1.1 + "@polkadot/util-crypto": 13.1.1 + checksum: 415077740d4971e4697f20e28705f7ee9c819f8f1f05f2ab3c52342cb23240028bb0dfce683f7e1ed46a66c1c290d2a688edbb29d594bbf0b57eb9a842e5f809 + languageName: node + linkType: hard + "@polkadot/networks@npm:12.6.2, @polkadot/networks@npm:^12.5.1, @polkadot/networks@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/networks@npm:12.6.2" @@ -3767,6 +3910,42 @@ __metadata: languageName: node linkType: hard +"@polkadot/networks@npm:13.1.1, @polkadot/networks@npm:^13.1.1": + version: 13.1.1 + resolution: "@polkadot/networks@npm:13.1.1" + dependencies: + "@polkadot/util": 13.1.1 + "@substrate/ss58-registry": ^1.50.0 + tslib: ^2.7.0 + checksum: 82c11848e900259dc4c7a9b4829b566003bfb1db815316047042704d73820fb4658e1acdeb71a87de3bcbf531f89180de2f51ca8ef83659126073ef16efadb16 + languageName: node + linkType: hard + +"@polkadot/react-identicon@npm:3.10.1": + version: 3.10.1 + resolution: "@polkadot/react-identicon@npm:3.10.1" + dependencies: + "@polkadot/keyring": ^13.1.1 + "@polkadot/ui-settings": 3.10.1 + "@polkadot/ui-shared": 3.10.1 + "@polkadot/util": ^13.1.1 + "@polkadot/util-crypto": ^13.1.1 + ethereum-blockies-base64: ^1.0.2 + jdenticon: 3.2.0 + react-copy-to-clipboard: ^5.1.0 + styled-components: ^6.1.1 + tslib: ^2.6.2 + peerDependencies: + "@polkadot/keyring": "*" + "@polkadot/util": "*" + "@polkadot/util-crypto": "*" + react: "*" + react-dom: "*" + react-is: "*" + checksum: bdac505dd915f8da81a01f037fd67ebc08e919c3f9d0fea383b4724f6e35239483987f4896d96b73db8b886d38ced1e2246b271d53c73cb813d881075ff3e82a + languageName: node + linkType: hard + "@polkadot/react-identicon@npm:3.6.3": version: 3.6.3 resolution: "@polkadot/react-identicon@npm:3.6.3" @@ -4042,6 +4221,22 @@ __metadata: languageName: node linkType: hard +"@polkadot/ui-settings@npm:3.10.1": + version: 3.10.1 + resolution: "@polkadot/ui-settings@npm:3.10.1" + dependencies: + "@polkadot/networks": ^13.1.1 + "@polkadot/util": ^13.1.1 + eventemitter3: ^5.0.1 + store: ^2.0.12 + tslib: ^2.6.2 + peerDependencies: + "@polkadot/networks": "*" + "@polkadot/util": "*" + checksum: badf72675bcfc5ae52c77340461bace2d0f1852bbbae25e6521127193a02199db0912f77ce34f8f04d8f92143a07a8230ac63e12441756a1b7c4e3b78e955ca2 + languageName: node + linkType: hard + "@polkadot/ui-settings@npm:3.6.3": version: 3.6.3 resolution: "@polkadot/ui-settings@npm:3.6.3" @@ -4058,6 +4253,19 @@ __metadata: languageName: node linkType: hard +"@polkadot/ui-shared@npm:3.10.1": + version: 3.10.1 + resolution: "@polkadot/ui-shared@npm:3.10.1" + dependencies: + colord: ^2.9.3 + tslib: ^2.6.2 + peerDependencies: + "@polkadot/util": "*" + "@polkadot/util-crypto": "*" + checksum: b6717be072fe2291daa8b6c9987af316f23ddb24b9393a76b5dfd66e1f456cbd4ff7f6dbc149672b1ce8c3a28efbd57a6de2d6a0ec4348b751de782c9ff4fac7 + languageName: node + linkType: hard + "@polkadot/ui-shared@npm:3.6.3": version: 3.6.3 resolution: "@polkadot/ui-shared@npm:3.6.3" @@ -4111,6 +4319,26 @@ __metadata: languageName: node linkType: hard +"@polkadot/util-crypto@npm:13.1.1, @polkadot/util-crypto@npm:^13.1.1": + version: 13.1.1 + resolution: "@polkadot/util-crypto@npm:13.1.1" + dependencies: + "@noble/curves": ^1.3.0 + "@noble/hashes": ^1.3.3 + "@polkadot/networks": 13.1.1 + "@polkadot/util": 13.1.1 + "@polkadot/wasm-crypto": ^7.3.2 + "@polkadot/wasm-util": ^7.3.2 + "@polkadot/x-bigint": 13.1.1 + "@polkadot/x-randomvalues": 13.1.1 + "@scure/base": ^1.1.7 + tslib: ^2.7.0 + peerDependencies: + "@polkadot/util": 13.1.1 + checksum: 54a99d68ffe3cc2c455f4a919e5b64e801f0a029b22823d8fb387a97ca70dafaf125449a9f0d713abce96f7e3cb997f1920c6a669f42f3c162792fb48f18e7b8 + languageName: node + linkType: hard + "@polkadot/util@npm:12.6.2, @polkadot/util@npm:^12.5.1, @polkadot/util@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/util@npm:12.6.2" @@ -4141,6 +4369,21 @@ __metadata: languageName: node linkType: hard +"@polkadot/util@npm:13.1.1, @polkadot/util@npm:^13.1.1": + version: 13.1.1 + resolution: "@polkadot/util@npm:13.1.1" + dependencies: + "@polkadot/x-bigint": 13.1.1 + "@polkadot/x-global": 13.1.1 + "@polkadot/x-textdecoder": 13.1.1 + "@polkadot/x-textencoder": 13.1.1 + "@types/bn.js": ^5.1.5 + bn.js: ^5.2.1 + tslib: ^2.7.0 + checksum: 88c2095454539f9583b1cef96b7265c9890bd7c345823f572ea345f0ee7d9f8b088144a34b84d43a298f3e41fc5f2932e7ec95e137aa09891f28509d0a3d5733 + languageName: node + linkType: hard + "@polkadot/wasm-bridge@npm:7.3.2": version: 7.3.2 resolution: "@polkadot/wasm-bridge@npm:7.3.2" @@ -4241,6 +4484,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-bigint@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-bigint@npm:13.1.1" + dependencies: + "@polkadot/x-global": 13.1.1 + tslib: ^2.7.0 + checksum: 1c2ca55a7e49306a1c5ae5110c5dd13ad7c14e8a6f0ec36226571ab8c4ad468351f97c36ddea2ad88bd540c786dc27941db6ee92dfede42e75e053982e439559 + languageName: node + linkType: hard + "@polkadot/x-fetch@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/x-fetch@npm:12.6.2" @@ -4281,6 +4534,15 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-global@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-global@npm:13.1.1" + dependencies: + tslib: ^2.7.0 + checksum: 0cea1b38cb19b07ec1d50d2913f3187e1ecd7a72e58c49017cad93d1f944d0236842e224b5f4ebe5d1f99ca31483643c33500e385553ed774128e0f00edecee8 + languageName: node + linkType: hard + "@polkadot/x-randomvalues@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-randomvalues@npm:12.6.2" @@ -4307,6 +4569,19 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-randomvalues@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-randomvalues@npm:13.1.1" + dependencies: + "@polkadot/x-global": 13.1.1 + tslib: ^2.7.0 + peerDependencies: + "@polkadot/util": 13.1.1 + "@polkadot/wasm-util": "*" + checksum: 30d8d0c4063d5f85d6f4e55c14822dc0304bb115c46a040f8a74a89fecbe20cfc8f8ef826ab816eedc0b80986ecec20d6d76de2095fa7caf203c761a6c2f1a45 + languageName: node + linkType: hard + "@polkadot/x-textdecoder@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-textdecoder@npm:12.6.2" @@ -4327,6 +4602,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textdecoder@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-textdecoder@npm:13.1.1" + dependencies: + "@polkadot/x-global": 13.1.1 + tslib: ^2.7.0 + checksum: 03007249aee07501e8747a2e19448cb435ee5ca7c4e7dc1de667e811ee813e960311f26f1c1ca989391fb5d28600f68b72eded96ee643d0673b4d8e84cfb2ca0 + languageName: node + linkType: hard + "@polkadot/x-textencoder@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-textencoder@npm:12.6.2" @@ -4347,6 +4632,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textencoder@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-textencoder@npm:13.1.1" + dependencies: + "@polkadot/x-global": 13.1.1 + tslib: ^2.7.0 + checksum: 9a72e477a3db29c273f245317cfc72e2752322a3317bc5aa6818e3c620e17551f5bd0685290ed7b67ccc8d3bf94118d806f6c64cff958983e6d8f45278769f29 + languageName: node + linkType: hard + "@polkadot/x-ws@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/x-ws@npm:12.6.2" @@ -4623,7 +4918,7 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-inject@npm:^5.0.3": +"@rollup/plugin-inject@npm:^5.0.5": version: 5.0.5 resolution: "@rollup/plugin-inject@npm:5.0.5" dependencies: @@ -4730,6 +5025,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.0.2": + version: 5.1.2 + resolution: "@rollup/pluginutils@npm:5.1.2" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^2.0.2 + picomatch: ^2.3.1 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 16c8c154fef9a32c513b52bd79c92ac427edccd05a8dc3994f10c296063940c57bf809d05903b473d9d408aa5977d75b98c701f481dd1856d5ffc37187ac0060 + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.0.2": version: 4.0.2 resolution: "@rollup/rollup-android-arm-eabi@npm:4.0.2" @@ -4814,6 +5125,64 @@ __metadata: languageName: node linkType: hard +"@rushstack/node-core-library@npm:5.9.0": + version: 5.9.0 + resolution: "@rushstack/node-core-library@npm:5.9.0" + dependencies: + ajv: ~8.13.0 + ajv-draft-04: ~1.0.0 + ajv-formats: ~3.0.1 + fs-extra: ~7.0.1 + import-lazy: ~4.0.0 + jju: ~1.4.0 + resolve: ~1.22.1 + semver: ~7.5.4 + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: beb558f118a796260f7df38b48b6669a94bbdb9711715785e0c5a426bd3a38c14721c03fc05e7a33883ec25a331ef0fb9e36438bb451ace021a7248a4f1fc74b + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.5.3": + version: 0.5.3 + resolution: "@rushstack/rig-package@npm:0.5.3" + dependencies: + resolve: ~1.22.1 + strip-json-comments: ~3.1.1 + checksum: bf3eadfc434bff273893efd22b319fe159d0e3b95729cb32ce3ad9f4ab4b6fabe3c4dd7f03ee0ddc7b480f0d989e908349eae6d6dce3500f896728a085af7aab + languageName: node + linkType: hard + +"@rushstack/terminal@npm:0.14.2": + version: 0.14.2 + resolution: "@rushstack/terminal@npm:0.14.2" + dependencies: + "@rushstack/node-core-library": 5.9.0 + supports-color: ~8.1.1 + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 90d38e6979737dcd97fdfdcebcc378194eed32a994341846235769273b6446b702e53e51e18fc8a373e8ed989c5622216aa6804198b8c7ae0e65cd6b103b90a1 + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:4.22.8": + version: 4.22.8 + resolution: "@rushstack/ts-command-line@npm:4.22.8" + dependencies: + "@rushstack/terminal": 0.14.2 + "@types/argparse": 1.0.38 + argparse: ~1.0.9 + string-argv: ~0.3.1 + checksum: b0108e4b567c364a7c62b30dc3e4d17130b6f8ba16a0457c56b8c898ba84316e72726a4e043ca5183da7bf5d0189aed585ab3ac8bce5991b8e80ac94d333cd6c + languageName: node + linkType: hard + "@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.5": version: 1.1.7 resolution: "@scure/base@npm:1.1.7" @@ -4821,6 +5190,13 @@ __metadata: languageName: node linkType: hard +"@scure/base@npm:^1.1.7": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 120820a37dfe9dfe4cab2b7b7460552d08e67dee8057ed5354eb68d8e3440890ae983ce3bee957d2b45684950b454a2b6d71d5ee77c1fd3fddc022e2a510337f + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.24.1": version: 0.24.51 resolution: "@sinclair/typebox@npm:0.24.51" @@ -5644,6 +6020,13 @@ __metadata: languageName: node linkType: hard +"@substrate/ss58-registry@npm:^1.50.0": + version: 1.50.0 + resolution: "@substrate/ss58-registry@npm:1.50.0" + checksum: d19d933fadf9bfbebd1c4a62c750620de34bd920ca6beb3ad8d66147c6d672e0773b57fce8394ec52a36c60d0564a92b7961ed1eac8508bca0248e23f62b8460 + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" @@ -5662,6 +6045,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-add-jsx-attribute@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ecdf432de38a6789e419758425e766651c14c78e6c537158796dfdbbb930f69fb36f11b5ad046c6fbb70d4c6ad567d6ffc45e3afa3fc5f3330234c34299e96a7 + languageName: node + linkType: hard + "@svgr/babel-plugin-remove-jsx-attribute@npm:*, @svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" @@ -5671,6 +6063,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-remove-jsx-attribute@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 808ba216eea6904b2c0b664957b1ad4d3e0d9e36635ad2fca7fb2667031730cbbe067421ac0d50209f7c83dc3b6c2eff8f377780268cd1606c85603bc47b18d7 + languageName: node + linkType: hard + "@svgr/babel-plugin-remove-jsx-empty-expression@npm:*, @svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" @@ -5680,6 +6081,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-remove-jsx-empty-expression@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: da0cae989cc99b5437c877412da6251eef57edfff8514b879c1245b6519edfda101ebc4ba2be3cce3aa9a6014050ea4413e004084d839afd8ac8ffc587a921bf + languageName: node + linkType: hard + "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" @@ -5698,6 +6108,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e624918b545e414a1d0fbace6fc6f8c1c27dac4bf6e5fd4cbc9d8fbc9353fdf4bf6c4fe8b84fb938dfb5c0076cd2ed90b91ac60c0a7011f6e8b0cb71eabe60b3 + languageName: node + linkType: hard + "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" @@ -5716,6 +6135,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-svg-dynamic-title@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3ffc97cc61573ae4fb2e013ec0572b2273f55e8e125bb6c7fc69ae9fb433a675dc879f85166979cf21e1d0f1a5e168dabf116dcc468f132e83928b66cd791e1a + languageName: node + linkType: hard + "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" @@ -5734,6 +6162,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-svg-em-dimensions@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0f98ee5269983038ec8098fd1906f600199a9c7a48caca9ced1644f988cdb06acc434ec239554d8987bc2098a772c5b472f1cbb6a46dc8f39aa353aea818c963 + languageName: node + linkType: hard + "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": version: 8.1.0 resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" @@ -5752,6 +6189,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-transform-react-native-svg@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 20067965349a9ed5ec339d63a2983a613135ae4dac416bd754683e41fdc91671f62d1950955f4ae57ec03525d13d7b0db467d4c2eb31ec22eafbe240fc840836 + languageName: node + linkType: hard + "@svgr/babel-plugin-transform-svg-component@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" @@ -5770,6 +6216,15 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-plugin-transform-svg-component@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-plugin-transform-svg-component@npm:7.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: cf5be9c6b24a4a9c0afefe67214370af1cd562d9a06082a89486ec25298a223766cdf57591c92750764068a0d27377c3ce3a9609d18eaae59f64c94e60f2b25c + languageName: node + linkType: hard + "@svgr/babel-preset@npm:8.1.0": version: 8.1.0 resolution: "@svgr/babel-preset@npm:8.1.0" @@ -5806,6 +6261,24 @@ __metadata: languageName: node linkType: hard +"@svgr/babel-preset@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/babel-preset@npm:7.0.0" + dependencies: + "@svgr/babel-plugin-add-jsx-attribute": ^7.0.0 + "@svgr/babel-plugin-remove-jsx-attribute": ^7.0.0 + "@svgr/babel-plugin-remove-jsx-empty-expression": ^7.0.0 + "@svgr/babel-plugin-replace-jsx-attribute-value": ^7.0.0 + "@svgr/babel-plugin-svg-dynamic-title": ^7.0.0 + "@svgr/babel-plugin-svg-em-dimensions": ^7.0.0 + "@svgr/babel-plugin-transform-react-native-svg": ^7.0.0 + "@svgr/babel-plugin-transform-svg-component": ^7.0.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8c3ff1df1627b2db03e4755281b02e7f440323c9c9f71e3c8ebdab0e1966e24ca16686224da72a92e34b722e693bfa408aca5c62d42b02382e0c528bd3860be6 + languageName: node + linkType: hard + "@svgr/core@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/core@npm:6.5.1" @@ -5819,6 +6292,18 @@ __metadata: languageName: node linkType: hard +"@svgr/core@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/core@npm:7.0.0" + dependencies: + "@babel/core": ^7.21.3 + "@svgr/babel-preset": ^7.0.0 + camelcase: ^6.2.0 + cosmiconfig: ^8.1.3 + checksum: 34fa14557baf560c78a6d7ac79401d35feb081d54ab55ee1b43d1649a89b322b4ecc7dba3daca0063af1f639c499cea1c46e34e5b066655ae7dc3553c1a64672 + languageName: node + linkType: hard + "@svgr/core@npm:^8.1.0": version: 8.1.0 resolution: "@svgr/core@npm:8.1.0" @@ -5852,6 +6337,16 @@ __metadata: languageName: node linkType: hard +"@svgr/hast-util-to-babel-ast@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/hast-util-to-babel-ast@npm:7.0.0" + dependencies: + "@babel/types": ^7.21.3 + entities: ^4.4.0 + checksum: c2168c36c8d25e876da879815728310cf204579c97a73908ce33b063cccfb9a18b6e53f53c6daf81506a96761d84b6261bf64faf26f16453f27e73cb322a9256 + languageName: node + linkType: hard + "@svgr/plugin-jsx@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/plugin-jsx@npm:6.5.1" @@ -5866,6 +6361,18 @@ __metadata: languageName: node linkType: hard +"@svgr/plugin-jsx@npm:^7.0.0": + version: 7.0.0 + resolution: "@svgr/plugin-jsx@npm:7.0.0" + dependencies: + "@babel/core": ^7.21.3 + "@svgr/babel-preset": ^7.0.0 + "@svgr/hast-util-to-babel-ast": ^7.0.0 + svg-parser: ^2.0.4 + checksum: 009421b8e3f32bf13ebec4d47c7997106cd806c6922349871f2d9a77cd3304f55d30630dd8948ff77a9ead2ee1869ac39ad65cf95ab95b2192ef21d5704bd367 + languageName: node + linkType: hard + "@svgr/plugin-jsx@npm:^8.1.0": version: 8.1.0 resolution: "@svgr/plugin-jsx@npm:8.1.0" @@ -5935,6 +6442,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:5.56.2": + version: 5.56.2 + resolution: "@tanstack/query-core@npm:5.56.2" + checksum: e78430464de89fd2543155449391415983c7cdcd1ff2bb86da019414204b6800e2405e341db88000b36a101d3619ee7e94e90da1fa5497b2e021c5765924a64c + languageName: node + linkType: hard + "@tanstack/react-query@npm:5.29.0": version: 5.29.0 resolution: "@tanstack/react-query@npm:5.29.0" @@ -5946,6 +6460,17 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-query@npm:5.56.2": + version: 5.56.2 + resolution: "@tanstack/react-query@npm:5.56.2" + dependencies: + "@tanstack/query-core": 5.56.2 + peerDependencies: + react: ^18 || ^19 + checksum: 7819a3a316c95df41844bd6e3435511594c3762320c21ee1ef2205ede18a87faae4556ff84d52b36ba17c99540b9554e72a5acf0c225481bdaf107ea79ace815 + languageName: node + linkType: hard + "@testing-library/dom@npm:^8.5.0": version: 8.20.1 resolution: "@testing-library/dom@npm:8.20.1" @@ -6063,6 +6588,13 @@ __metadata: languageName: node linkType: hard +"@types/argparse@npm:1.0.38": + version: 1.0.38 + resolution: "@types/argparse@npm:1.0.38" + checksum: 26ed7e3f1e3595efdb883a852f5205f971b798e4c28b7e30a32c5298eee596e8b45834ce831f014d250b9730819ab05acff5b31229666d3af4ba465b4697d0eb + languageName: node + linkType: hard + "@types/aria-query@npm:^5.0.1": version: 5.0.4 resolution: "@types/aria-query@npm:5.0.4" @@ -6070,7 +6602,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.2": +"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.2, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -6345,7 +6877,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -6597,6 +7129,16 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:18.3.2": + version: 18.3.2 + resolution: "@types/react@npm:18.3.2" + dependencies: + "@types/prop-types": "*" + csstype: ^3.0.2 + checksum: d0b8b9d0ede6cd28dbbe34106d914b5e3652d9d7aa9d0f32fe6171506b6fc7c826d9d6571642976a5422bd29c5022fd893a710ed59a1177a0c1df8e02cf17ffe + languageName: node + linkType: hard + "@types/redis@npm:^4.0.11": version: 4.0.11 resolution: "@types/redis@npm:4.0.11" @@ -6817,6 +7359,33 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.0.0" + dependencies: + "@eslint-community/regexpp": ^4.5.0 + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/type-utils": 6.0.0 + "@typescript-eslint/utils": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 + debug: ^4.3.4 + grapheme-splitter: ^1.0.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + natural-compare-lite: ^1.4.0 + semver: ^7.5.0 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 863f30b8ceb24d104fc8a41774e4f597a35525533aa99721198293b51628a2d986dcc6413893f27eb9db5a49c2fd2cc91d3aece8ed23d590f3eb4e9939c3d6ad + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/eslint-plugin@npm:6.7.5" @@ -6892,6 +7461,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/parser@npm:6.0.0" + dependencies: + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/typescript-estree": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: a22f0c8f67eb244134f9d79d78faf1b6e2c0965495d78eef94a5680868f3d0fd9446a3ce5dc1e36dde02587da5d962944f3d83679c712d0b819ac99cdb9f7143 + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/parser@npm:6.7.5" @@ -6930,6 +7517,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/scope-manager@npm:6.0.0" + dependencies: + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 + checksum: 450015be6454f953d0ea0da020ab47597e96a7a15c1002eed16c57430783bd7b045513d57a126606fb35e8971f1ce65fbefd845e3b5496bf75284cbe1681d0b9 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/scope-manager@npm:6.7.5" @@ -6957,6 +7554,23 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/type-utils@npm:6.0.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.0.0 + "@typescript-eslint/utils": 6.0.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 53f46237891cfa738f6a4bc766a4dbb8d745b1cb9cbe2d2b40f2a4abcf0327d4aa92d9ce5361e87cd26d82e0159f358e28b0c67759eb053c4fd752654dc9dcb1 + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/type-utils@npm:6.7.5" @@ -6988,6 +7602,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/types@npm:6.0.0" + checksum: a2e232b66b0b057152f4a94d7e0be75f32e389c9c1ec9ed9901ed5aab6e5df08c07bde9865710e315d835e4400ec2232f9c3c525b6edf8a85675ebfbfb69d3a5 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/types@npm:6.7.5" @@ -7031,6 +7652,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.0.0" + dependencies: + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.5.0 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: 6214ff9cc3c4fd7fe03f846e96a498ecf85916083bb60d419bc5a12142cff912670032b1de5ea52ab353ca7eeb4e1cc8fa475a22958b010043c88e274df49859 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/typescript-estree@npm:6.7.5" @@ -7067,6 +7706,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/utils@npm:6.0.0" + dependencies: + "@eslint-community/eslint-utils": ^4.3.0 + "@types/json-schema": ^7.0.11 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/typescript-estree": 6.0.0 + eslint-scope: ^5.1.1 + semver: ^7.5.0 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 94b9b616282f6fa1ae50ba371a482a3c8c50268ef8039b4e86d29c445e95025c819358a5cc9955c4668482d97ef026e7a49e7f4b3a4685347136ef5bbd297e4d + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/utils@npm:6.7.5" @@ -7104,6 +7761,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.0.0" + dependencies: + "@typescript-eslint/types": 6.0.0 + eslint-visitor-keys: ^3.4.1 + checksum: b0d9848a4490174db1d25b5f336548bb11dde4e0ce664c3dc341bed89fb3a3ada091aeb7f5d2d371433815332d93339c6cb77f7a24469c329c3d055b15237bfa + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:6.7.5": version: 6.7.5 resolution: "@typescript-eslint/visitor-keys@npm:6.7.5" @@ -7136,6 +7803,101 @@ __metadata: languageName: node linkType: hard +"@vitejs/plugin-react@npm:4.3.0": + version: 4.3.0 + resolution: "@vitejs/plugin-react@npm:4.3.0" + dependencies: + "@babel/core": ^7.24.5 + "@babel/plugin-transform-react-jsx-self": ^7.24.5 + "@babel/plugin-transform-react-jsx-source": ^7.24.1 + "@types/babel__core": ^7.20.5 + react-refresh: ^0.14.2 + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + checksum: e4642c081e74e701fc07f03f505b44eb428d7105461b8026e7364ecd30dcf7785126bf272767a3bc36899b6abe85479af444612ef6d09509d9bc7d6025cac925 + languageName: node + linkType: hard + +"@volar/language-core@npm:1.11.1, @volar/language-core@npm:~1.11.1": + version: 1.11.1 + resolution: "@volar/language-core@npm:1.11.1" + dependencies: + "@volar/source-map": 1.11.1 + checksum: 7f98fbeb96ff1093dbaa47e790575a98d1fd2103d9bb1598ec7b0ae787fc6af2ffcea12fdea0f0a4e057f38f6ee3a60bd54f2af3985159319021771f79df9451 + languageName: node + linkType: hard + +"@volar/source-map@npm:1.11.1, @volar/source-map@npm:~1.11.1": + version: 1.11.1 + resolution: "@volar/source-map@npm:1.11.1" + dependencies: + muggle-string: ^0.3.1 + checksum: 1ec1034432ee51a0afe187ba9158292dd607a90d01120ee8a36cf27f5d464da5282c8fe7b0de82f52f45474a840c63eba666254c5c21ca5466dc02d0c95cd147 + languageName: node + linkType: hard + +"@volar/typescript@npm:~1.11.1": + version: 1.11.1 + resolution: "@volar/typescript@npm:1.11.1" + dependencies: + "@volar/language-core": 1.11.1 + path-browserify: ^1.0.1 + checksum: 0db2fc32db133e493f05dbafd248560a6d4e5b071a0d80422c67b1875bd36980c113915d876a83e855d55c2880b2e7b9f04f803ce3504a4d6fafcc0b801c621b + languageName: node + linkType: hard + +"@vue/compiler-core@npm:3.5.10": + version: 3.5.10 + resolution: "@vue/compiler-core@npm:3.5.10" + dependencies: + "@babel/parser": ^7.25.3 + "@vue/shared": 3.5.10 + entities: ^4.5.0 + estree-walker: ^2.0.2 + source-map-js: ^1.2.0 + checksum: 7c13ccff151818d757c5985e286f596ff2daf0a6b03ecc9f67035cdcd91b463563da8a4e6190db3367d73fcaa07804060beb4f51ed532ad5f1f602b47d29783f + languageName: node + linkType: hard + +"@vue/compiler-dom@npm:^3.3.0": + version: 3.5.10 + resolution: "@vue/compiler-dom@npm:3.5.10" + dependencies: + "@vue/compiler-core": 3.5.10 + "@vue/shared": 3.5.10 + checksum: 63354721022c948573303556c031365be6e2957bbc222d643be500129a1799e00a37ac3dc2b4b653c78e8c64a165367e13ca6e187f6cf7a69ce9c6fc73fd762d + languageName: node + linkType: hard + +"@vue/language-core@npm:1.8.27, @vue/language-core@npm:^1.8.8": + version: 1.8.27 + resolution: "@vue/language-core@npm:1.8.27" + dependencies: + "@volar/language-core": ~1.11.1 + "@volar/source-map": ~1.11.1 + "@vue/compiler-dom": ^3.3.0 + "@vue/shared": ^3.3.0 + computeds: ^0.0.1 + minimatch: ^9.0.3 + muggle-string: ^0.3.1 + path-browserify: ^1.0.1 + vue-template-compiler: ^2.7.14 + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 8660c05319be8dc5daacc2cd929171434215d29f3ad5bfbe0038d1967db05b8bf640286b25f338845cc1e3890b4aaa239ac9e8cb832cc8a50a5bbdff31b2edd1 + languageName: node + linkType: hard + +"@vue/shared@npm:3.5.10, @vue/shared@npm:^3.3.0": + version: 3.5.10 + resolution: "@vue/shared@npm:3.5.10" + checksum: 87d2fa140f80c1a4fc657b9b37b1db41ef89e8037c76b04c8ad0115fecc56d10e9694247d07b6a2f669d6af92c2377f722ac0380c9c9675410091d7b7839e701 + languageName: node + linkType: hard + "abab@npm:^2.0.6": version: 2.0.6 resolution: "abab@npm:2.0.6" @@ -7234,6 +7996,32 @@ __metadata: languageName: node linkType: hard +"ajv-draft-04@npm:~1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 3f11fa0e7f7359bef6608657f02ab78e9cc62b1fb7bdd860db0d00351b3863a1189c1a23b72466d2d82726cab4eb20725c76f5e7c134a89865e2bfd0e6828137 + languageName: node + linkType: hard + +"ajv-formats@npm:~3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: f4e1fe232d67fcafc02eafe373a7a9962351e0439dd0736647ca75c93c3da23b430b6502c255ab4315410ae330d4f3013ac9fe226c40b2524ca93a58e786d086 + languageName: node + linkType: hard + "ajv@npm:^6.10.0, ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -7246,7 +8034,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.1": +"ajv@npm:^8.0.0, ajv@npm:^8.0.1": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -7258,6 +8046,30 @@ __metadata: languageName: node linkType: hard +"ajv@npm:~8.12.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + +"ajv@npm:~8.13.0": + version: 8.13.0 + resolution: "ajv@npm:8.13.0" + dependencies: + fast-deep-equal: ^3.1.3 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.4.1 + checksum: 6de82d0b2073e645ca3300561356ddda0234f39b35d2125a8700b650509b296f41c00ab69f53178bbe25ad688bd6ac3747ab44101f2f4bd245952e8fd6ccc3c1 + languageName: node + linkType: hard + "amqplib@npm:0.10.3": version: 0.10.3 resolution: "amqplib@npm:0.10.3" @@ -7523,7 +8335,7 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.7": +"argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" dependencies: @@ -8288,16 +9100,6 @@ __metadata: languageName: node linkType: hard -"buffer-polyfill@npm:buffer@^6.0.3, buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - "buffer-writer@npm:2.0.0": version: 2.0.0 resolution: "buffer-writer@npm:2.0.0" @@ -8322,6 +9124,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + "bufferutil@npm:^4.0.1": version: 4.0.8 resolution: "bufferutil@npm:4.0.8" @@ -8678,6 +9490,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 + languageName: node + linkType: hard + "cluster-key-slot@npm:1.1.2, cluster-key-slot@npm:^1.1.0": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" @@ -8840,6 +9659,13 @@ __metadata: languageName: node linkType: hard +"computeds@npm:^0.0.1": + version: 0.0.1 + resolution: "computeds@npm:0.0.1" + checksum: 9d81c5850b7c48072253e15e369f72da22288e9d6a9be32adc2729ba076dddec51078e84e00dae9c567cdb2c6e1dd5981f985561b519976a29f1ecc9869779f2 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -9411,6 +10237,13 @@ __metadata: languageName: node linkType: hard +"de-indent@npm:^1.0.2": + version: 1.0.2 + resolution: "de-indent@npm:1.0.2" + checksum: 8deacc0f4a397a4414a0fc4d0034d2b7782e7cb4eaf34943ea47754e08eccf309a0e71fa6f56cc48de429ede999a42d6b4bca761bf91683be0095422dbf24611 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -10004,7 +10837,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.4.0": +"entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 @@ -10504,6 +11337,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-hooks@npm:4.6.2": + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 395c433610f59577cfcf3f2e42bcb130436c8a0b3777ac64f441d88c5275f4fcfc89094cedab270f2822daf29af1079151a7a6579a8e9ea8cee66540ba0384c4 + languageName: node + linkType: hard + "eslint-plugin-react-refresh@npm:0.4.3": version: 0.4.3 resolution: "eslint-plugin-react-refresh@npm:0.4.3" @@ -10513,6 +11355,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-refresh@npm:0.4.7": + version: 0.4.7 + resolution: "eslint-plugin-react-refresh@npm:0.4.7" + peerDependencies: + eslint: ">=7" + checksum: b2fe14d4ed158b6380ffd9831a5ebed4c79828ea806536d5db0aa8370f8a3878b198d77fc7da18bfd862cd9eb19ed4472cc9977f727f81679f80dcb48f8a3861 + languageName: node + linkType: hard + "eslint-plugin-react@npm:7.33.2": version: 7.33.2 resolution: "eslint-plugin-react@npm:7.33.2" @@ -11375,6 +12226,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:~7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: ^4.1.2 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -11885,6 +12747,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 + languageName: node + linkType: hard + "hexoid@npm:^1.0.0": version: 1.0.0 resolution: "hexoid@npm:1.0.0" @@ -12146,6 +13017,13 @@ __metadata: languageName: node linkType: hard +"import-lazy@npm:~4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + languageName: node + linkType: hard + "import-local@npm:^3.0.2": version: 3.2.0 resolution: "import-local@npm:3.2.0" @@ -13478,6 +14356,13 @@ __metadata: languageName: node linkType: hard +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -13648,6 +14533,18 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.6 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -13698,6 +14595,13 @@ __metadata: languageName: node linkType: hard +"kolorist@npm:^1.8.0": + version: 1.8.0 + resolution: "kolorist@npm:1.8.0" + checksum: b056de671acc8a17f1e78d6d46c47dae3e06481eabc9fed213dd9079a7454fd3a7ea1226ec718df81c9208877f7475d038ac27a400958fec278d975839e33643 + languageName: node + linkType: hard + "kuler@npm:^2.0.0": version: 2.0.0 resolution: "kuler@npm:2.0.0" @@ -13961,7 +14865,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.x, lodash@npm:^4.17.15, lodash@npm:^4.17.21": +"lodash@npm:4.x, lodash@npm:^4.17.15, lodash@npm:^4.17.21, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -14386,7 +15290,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -14395,6 +15299,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:~3.0.3": + version: 3.0.8 + resolution: "minimatch@npm:3.0.8" + dependencies: + brace-expansion: ^1.1.7 + checksum: 850cca179cad715133132693e6963b0db64ab0988c4d211415b087fc23a3e46321e2c5376a01bf5623d8782aba8bdf43c571e2e902e51fdce7175c7215c29f8b + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -14532,6 +15445,13 @@ __metadata: languageName: node linkType: hard +"muggle-string@npm:^0.3.1": + version: 0.3.1 + resolution: "muggle-string@npm:0.3.1" + checksum: f2357f906e0160b7df0179c77838cf859f3ca23cb74eca7c043b9fc9e1e416d91497c80fbe2f3c9aeb003c14ad15857fc4e94f1631e8a6695b07e4135626d305 + languageName: node + linkType: hard + "mz@npm:^2.4.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -15484,6 +16404,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -15959,6 +16886,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.26": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: ^3.3.7 + picocolors: ^1.1.0 + source-map-js: ^1.2.1 + checksum: f78440a9d8f97431dd2ab1ab8e1de64f12f3eff38a3d8d4a33919b96c381046a314658d2de213a5fa5eb296b656de76a3ec269fdea27f16d5ab465b916a0f52c + languageName: node + linkType: hard + "postcss@npm:^8.4.27": version: 8.4.40 resolution: "postcss@npm:8.4.40" @@ -16498,7 +17436,7 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.14.0": +"react-refresh@npm:^0.14.0, react-refresh@npm:^0.14.2": version: 0.14.2 resolution: "react-refresh@npm:0.14.2" checksum: d80db4bd40a36dab79010dc8aa317a5b931f960c0d83c4f3b81f0552cbcf7f29e115b84bb7908ec6a1eb67720fff7023084eff73ece8a7ddc694882478464382 @@ -16830,7 +17768,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.0.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4": +"resolve@npm:^1.0.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1, resolve@npm:~1.22.2": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -16856,7 +17794,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.0.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.4#~builtin": +"resolve@patch:resolve@^1.0.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@~1.22.1#~builtin, resolve@patch:resolve@~1.22.2#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -17112,6 +18050,20 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^3.25.2": + version: 3.29.5 + resolution: "rollup@npm:3.29.5" + dependencies: + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 6f8304e58ac8170a715e61e46c4aa674b2ae2587ed2a712dab58f72e5e54803ae40b485fbe6b3e6a694f4c8f7a59ab936ccf9f6b686c7cfd1f1970fa9ecadf1a + languageName: node + linkType: hard + "rollup@npm:^3.27.1": version: 3.29.4 resolution: "rollup@npm:3.29.4" @@ -17254,6 +18206,19 @@ __metadata: languageName: node linkType: hard +"sass@npm:1.77.2": + version: 1.77.2 + resolution: "sass@npm:1.77.2" + dependencies: + chokidar: ">=3.0.0 <4.0.0" + immutable: ^4.0.0 + source-map-js: ">=0.6.2 <2.0.0" + bin: + sass: sass.js + checksum: fd75b1f255a30ecd4ee79fa020830d7bf426dd15de2f47cf9610130707dc2a029da3677ca0a6c89e8d4626b0a2816456bb7fb706cb518cfbf2e7c0038ef7a4b8 + languageName: node + linkType: hard + "sax@npm:>=0.6.0": version: 1.4.1 resolution: "sax@npm:1.4.1" @@ -17331,6 +18296,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:~7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -17603,6 +18579,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -17749,7 +18732,7 @@ __metadata: languageName: node linkType: hard -"string-argv@npm:0.3.2": +"string-argv@npm:0.3.2, string-argv@npm:~0.3.1": version: 0.3.2 resolution: "string-argv@npm:0.3.2" checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f @@ -17936,7 +18919,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -17970,6 +18953,26 @@ __metadata: languageName: node linkType: hard +"styled-components@npm:^6.1.1": + version: 6.1.13 + resolution: "styled-components@npm:6.1.13" + dependencies: + "@emotion/is-prop-valid": 1.2.2 + "@emotion/unitless": 0.8.1 + "@types/stylis": 4.2.5 + css-to-react-native: 3.2.0 + csstype: 3.1.3 + postcss: 8.4.38 + shallowequal: 1.1.0 + stylis: 4.3.2 + tslib: 2.6.2 + peerDependencies: + react: ">= 16.8.0" + react-dom: ">= 16.8.0" + checksum: cb836c5d4cc8d183f4b70a4a1b1aa13551c57389e9c8fe3286619eef9fc81466fee09c39a1c8b5aa03deb0e466e4d5ee04921f7d9f3b7afe4744e539e6047550 + languageName: node + linkType: hard + "stylehacks@npm:^5.1.1": version: 5.1.1 resolution: "stylehacks@npm:5.1.1" @@ -18062,7 +19065,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1, supports-color@npm:~8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -18688,6 +19691,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.7.0": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -19110,6 +20120,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.4.2": + version: 5.4.2 + resolution: "typescript@npm:5.4.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 96d80fde25a09bcb04d399082fb27a808a9e17c2111e43849d2aafbd642d835e4f4ef0de09b0ba795ec2a700be6c4c2c3f62bf4660c05404c948727b5bbfb32a + languageName: node + linkType: hard + "typescript@npm:5.4.5": version: 5.4.5 resolution: "typescript@npm:5.4.5" @@ -19180,6 +20200,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@5.4.2#~builtin": + version: 5.4.2 + resolution: "typescript@patch:typescript@npm%3A5.4.2#~builtin::version=5.4.2&hash=d73830" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: c1b669146bca5529873aae60870e243fa8140c85f57ca32c42f898f586d73ce4a6b4f6bb02ae312729e214d7f5859a0c70da3e527a116fdf5ad00c9fc733ecc6 + languageName: node + linkType: hard + "typescript@patch:typescript@5.4.5#~builtin": version: 5.4.5 resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=d73830" @@ -19308,6 +20338,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff + languageName: node + linkType: hard + "universalify@npm:^0.2.0": version: 0.2.0 resolution: "universalify@npm:0.2.0" @@ -19365,7 +20402,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -19563,17 +20600,48 @@ __metadata: languageName: node linkType: hard -"vite-plugin-node-polyfills@npm:0.15.0": - version: 0.15.0 - resolution: "vite-plugin-node-polyfills@npm:0.15.0" +"vite-plugin-dts@npm:3.5.1": + version: 3.5.1 + resolution: "vite-plugin-dts@npm:3.5.1" dependencies: - "@rollup/plugin-inject": ^5.0.3 - buffer-polyfill: "npm:buffer@^6.0.3" + "@microsoft/api-extractor": ^7.36.3 + "@rollup/pluginutils": ^5.0.2 + "@vue/language-core": ^1.8.8 + debug: ^4.3.4 + kolorist: ^1.8.0 + vue-tsc: ^1.8.8 + peerDependencies: + typescript: "*" + vite: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: 8a47a78336fe5074592fbbd8855dbd113707a9f15d2cfa3f9a17d760b0b49b5f5560d728f0acb4e8fae034d781af914279064b61778fa611f88ff2dee8296aa1 + languageName: node + linkType: hard + +"vite-plugin-node-polyfills@npm:0.22.0": + version: 0.22.0 + resolution: "vite-plugin-node-polyfills@npm:0.22.0" + dependencies: + "@rollup/plugin-inject": ^5.0.5 node-stdlib-browser: ^1.2.0 - process: ^0.11.10 peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 - checksum: 414abec8cf42270b814d7ace894dfab932042ac183224f8a1c1f74d36225427d463845efbfcffed2845d672ff30451d2d3eea750e252518bedf956854f42de69 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: c08d3df0d5cc3102280483d3f7b216f92a18e0708fcb9f67f78f01ab865474254756bacee17caa90b3f46afe5834cb9d8de0dd0e58c1bbbdae1b949edc1e6b57 + languageName: node + linkType: hard + +"vite-plugin-svgr@npm:3.2.0": + version: 3.2.0 + resolution: "vite-plugin-svgr@npm:3.2.0" + dependencies: + "@rollup/pluginutils": ^5.0.2 + "@svgr/core": ^7.0.0 + "@svgr/plugin-jsx": ^7.0.0 + peerDependencies: + vite: ^2.6.0 || 3 || 4 + checksum: 19887e1db910ecdd6c12645e430d9e1d9ad40fe6945d3f7de68fc235fba0277586deffa47db1a6be2fa511207b01893a3c5bad9d1bd558ca28971feca13ecd9a languageName: node linkType: hard @@ -19630,6 +20698,46 @@ __metadata: languageName: node linkType: hard +"vite@npm:4.4.5": + version: 4.4.5 + resolution: "vite@npm:4.4.5" + dependencies: + esbuild: ^0.18.10 + fsevents: ~2.3.2 + postcss: ^8.4.26 + rollup: ^3.25.2 + peerDependencies: + "@types/node": ">= 14" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 825d8c13511b764710ca503e603746e20a7cb963194033dc606c46b1650a0d8986b577ba92507b54143cbf467032e9868ea04913a86a8fcb88b69c5b8551938b + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -19697,6 +20805,31 @@ __metadata: languageName: node linkType: hard +"vue-template-compiler@npm:^2.7.14": + version: 2.7.16 + resolution: "vue-template-compiler@npm:2.7.16" + dependencies: + de-indent: ^1.0.2 + he: ^1.2.0 + checksum: a0d52ecbb99bad37f370341b5c594c5caa1f72b15b3f225148ef378fc06aa25c93185ef061f7e6e5e443c9067e70d8f158742716112acf84088932ebcc49ad10 + languageName: node + linkType: hard + +"vue-tsc@npm:^1.8.8": + version: 1.8.27 + resolution: "vue-tsc@npm:1.8.27" + dependencies: + "@volar/typescript": ~1.11.1 + "@vue/language-core": 1.8.27 + semver: ^7.5.4 + peerDependencies: + typescript: "*" + bin: + vue-tsc: bin/vue-tsc.js + checksum: 98c2986df01000a3245b5f08b9db35d0ead4f46fb12f4fe771257b4aa61aa4c26dda359aaa0e6c484a6240563d5188aaa6ed312dd37cc2315922d5e079260001 + languageName: node + linkType: hard + "w3c-xmlserializer@npm:^4.0.0": version: 4.0.0 resolution: "w3c-xmlserializer@npm:4.0.0" From 0bcdb0cfb8f28c388f3a8747b93e8ed7c9216f88 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 3 Oct 2024 16:48:40 +0300 Subject: [PATCH 5/6] fix(wallet-connect): theme variant prop name (#1650) --- .../src/widgets/header/ui/topSide/TopSide.tsx | 2 +- utils/wallet-connect/README.md | 14 +++++------ utils/wallet-connect/package.json | 2 +- .../src/components/balance/balance.tsx | 6 ++--- .../components/wallet-modal/wallet-modal.tsx | 24 +++++++++---------- .../src/components/wallet/wallet.tsx | 10 ++++---- utils/wallet-connect/src/preview/index.tsx | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/idea/frontend/src/widgets/header/ui/topSide/TopSide.tsx b/idea/frontend/src/widgets/header/ui/topSide/TopSide.tsx index 5b4af72b9c..32c1bcbb6c 100644 --- a/idea/frontend/src/widgets/header/ui/topSide/TopSide.tsx +++ b/idea/frontend/src/widgets/header/ui/topSide/TopSide.tsx @@ -38,7 +38,7 @@ const TopSide = () => { - + diff --git a/utils/wallet-connect/README.md b/utils/wallet-connect/README.md index 7cb7c88949..4b92c30ea2 100644 --- a/utils/wallet-connect/README.md +++ b/utils/wallet-connect/README.md @@ -40,7 +40,7 @@ function Header() { @@ -52,22 +52,22 @@ export { Header }; ## Vara UI Theme -Wallet is available in two theme variations - `vara` and `gear`. - -Be aware that in order for `vara` variation to work as expected, `@gear-js/vara-ui` should be installed with configured global styles: +Be aware that in order for `vara` theme to work as expected, `@gear-js/vara-ui` package should be installed with configured global styles: ```jsx import { Wallet } from '@gear-js/wallet-connect'; import '@gear-js/vara-ui/dist/style.css'; function VaraWallet() { - return ; + return ; } export { VaraWallet }; ``` -In order for `gear` variation to work as expected, `@gear-js/ui` should be installed with configured global `index.scss`: +## Gear UI Theme + +In order for `gear` theme to work as expected, `@gear-js/ui` package should be installed with configured global `index.scss`: ```scss @use '@gear-js/ui/resets'; @@ -79,7 +79,7 @@ import { Wallet } from '@gear-js/wallet-connect'; import './index.scss'; function GearWallet() { - return ; + return ; } export { GearWallet }; diff --git a/utils/wallet-connect/package.json b/utils/wallet-connect/package.json index 58fc5f756e..087de57420 100644 --- a/utils/wallet-connect/package.json +++ b/utils/wallet-connect/package.json @@ -1,6 +1,6 @@ { "name": "@gear-js/wallet-connect", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "description": "React library to connect Substrate based wallets to Gear dApps", "author": "Gear Technologies", diff --git a/utils/wallet-connect/src/components/balance/balance.tsx b/utils/wallet-connect/src/components/balance/balance.tsx index 2775b79aba..49d25e5ca2 100644 --- a/utils/wallet-connect/src/components/balance/balance.tsx +++ b/utils/wallet-connect/src/components/balance/balance.tsx @@ -5,10 +5,10 @@ import { ReactComponent as VaraSVG } from '../../assets/vara.svg'; import styles from './balance.module.scss'; type Props = { - variant: 'gear' | 'vara'; + theme: 'gear' | 'vara'; }; -function Balance({ variant }: Props) { +function Balance({ theme }: Props) { const { isApiReady } = useApi(); const { account } = useAccount(); const { getFormattedBalance } = useBalanceFormat(); @@ -22,7 +22,7 @@ function Balance({ variant }: Props) {
    -

    +

    {balance.value} {balance.unit}

    diff --git a/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx b/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx index 1fe006731a..25351b3118 100644 --- a/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx +++ b/utils/wallet-connect/src/components/wallet-modal/wallet-modal.tsx @@ -11,17 +11,17 @@ import { UI_CONFIG } from '../ui-config'; import styles from './wallet-modal.module.scss'; type Props = { - variant?: 'gear' | 'vara'; + theme?: 'gear' | 'vara'; close: () => void; }; -function WalletModal({ variant = 'vara', close }: Props) { +function WalletModal({ theme = 'vara', close }: Props) { const alert = useAlert(); const { wallets, isAnyWallet, account, login, logout } = useAccount(); const { wallet, walletAccounts, setWalletId, resetWalletId } = useWallet(); - const variantCn = styles[variant]; - const { WalletButton, AccountButton, Button, Modal } = UI_CONFIG[variant]; + const themeClassName = styles[theme]; + const { WalletButton, AccountButton, Button, Modal } = UI_CONFIG[theme]; const getWallets = () => WALLETS.map(([id, { SVG, name }]) => { @@ -40,9 +40,9 @@ function WalletModal({ variant = 'vara', close }: Props) { onClick={() => (isConnected ? setWalletId(id) : connect?.())} disabled={!isEnabled}> - {isConnected ? 'Enabled' : 'Disabled'} + {isConnected ? 'Enabled' : 'Disabled'} - {isConnected && {accountsStatus}} + {isConnected && {accountsStatus}} @@ -76,7 +76,7 @@ function WalletModal({ variant = 'vara', close }: Props) { icon={CopySVG} color="transparent" onClick={handleCopyClick} - className={cx(styles.copyButton, variantCn)} + className={cx(styles.copyButton, themeClassName)} /> ); @@ -91,11 +91,11 @@ function WalletModal({ variant = 'vara', close }: Props) { const render = () => { if (!isAnyWallet) return IS_MOBILE_DEVICE ? ( -

    +

    To use this application on mobile devices, open this page inside compatible wallets like Nova or SubWallet.

    ) : ( -

    +

    A compatible wallet was not found or is disabled. Install it following the{' '} instructions @@ -108,7 +108,7 @@ function WalletModal({ variant = 'vara', close }: Props) { if (walletAccounts.length) return

    ; return ( -

    +

    No accounts found. Please open your extension and create a new account or import existing.

    ); @@ -120,7 +120,7 @@ function WalletModal({ variant = 'vara', close }: Props) { return (
    - + {account && ( @@ -129,7 +129,7 @@ function WalletModal({ variant = 'vara', close }: Props) { text="Logout" color="transparent" onClick={handleLogoutButtonClick} - className={cx(styles.logoutButton, variantCn)} + className={cx(styles.logoutButton, themeClassName)} /> )}
    diff --git a/utils/wallet-connect/src/components/wallet/wallet.tsx b/utils/wallet-connect/src/components/wallet/wallet.tsx index 88a20d69db..25204ccd98 100644 --- a/utils/wallet-connect/src/components/wallet/wallet.tsx +++ b/utils/wallet-connect/src/components/wallet/wallet.tsx @@ -7,14 +7,14 @@ import { UI_CONFIG } from '../ui-config'; import styles from './wallet.module.scss'; type Props = { - variant?: 'gear' | 'vara'; + theme?: 'gear' | 'vara'; displayBalance?: boolean; // temp solution to support responsiveness in dApps MenuHandler, until it's supported here accountButtonClassName?: string; }; -function Wallet({ variant = 'vara', displayBalance = true, accountButtonClassName }: Props) { +function Wallet({ theme = 'vara', displayBalance = true, accountButtonClassName }: Props) { const { account, isAccountReady } = useAccount(); const [isModalOpen, setIsModalOpen] = useState(false); @@ -22,12 +22,12 @@ function Wallet({ variant = 'vara', displayBalance = true, accountButtonClassNam const closeModal = () => setIsModalOpen(false); if (!isAccountReady) return null; - const { Button, AccountButton } = UI_CONFIG[variant]; + const { Button, AccountButton } = UI_CONFIG[theme]; return ( <>
    - {displayBalance && } + {displayBalance && } {account ? (
    @@ -38,7 +38,7 @@ function Wallet({ variant = 'vara', displayBalance = true, accountButtonClassNam )}
    - {isModalOpen && } + {isModalOpen && } ); } diff --git a/utils/wallet-connect/src/preview/index.tsx b/utils/wallet-connect/src/preview/index.tsx index f0ffadcb40..55d65ed4fa 100644 --- a/utils/wallet-connect/src/preview/index.tsx +++ b/utils/wallet-connect/src/preview/index.tsx @@ -23,7 +23,7 @@ function App() {

    Gear

    - +
    ); From 43e61fe1df2729f2ec2fea588b1c57197a7278b2 Mon Sep 17 00:00:00 2001 From: sergey filyanin Date: Fri, 4 Oct 2024 10:32:13 +0200 Subject: [PATCH 6/6] Update Dockerfile --- idea/frontend/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/idea/frontend/Dockerfile b/idea/frontend/Dockerfile index 4d76b98b57..acb9c63823 100644 --- a/idea/frontend/Dockerfile +++ b/idea/frontend/Dockerfile @@ -11,6 +11,7 @@ COPY .yarn .yarn COPY ./idea/frontend ./idea/frontend COPY ./utils/gear-hooks ./utils/gear-hooks COPY ./utils/gear-ui ./utils/gear-ui +COPY ./utils/wallet-connect ./utils/wallet-connect RUN yarn install --mode=skip-build