diff --git a/package.json b/package.json index e2cbe845634233b6c389514b009691f14ee6b286..739570e65e265d08348442c614b35e7ab99828d9 100644 --- a/package.json +++ b/package.json @@ -40,10 +40,13 @@ "@ionic/storage-angular": "^3.0.6", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", - "@polkadot/api": "^8.9.1", - "@polkadot/keyring": "^9.6.1", - "@polkadot/ui-keyring": "^2.6.1", - "@polkadot/ui-settings": "^2.6.1", + "@polkadot/api": "^9.2.4", + "@polkadot/util": "^10.1.6", + "@polkadot/util-crypto": "^10.1.6", + "@polkadot/keyring": "^10.1.6", + "@polkadot/networks": "^10.1.6", + "@polkadot/ui-keyring": "^2.9.7", + "@polkadot/ui-settings": "^2.9.7", "crypto-browserify": "^3.12.0", "jdenticon": "^3.1.1", "moment": "^2.29.3", @@ -67,8 +70,8 @@ "@angular/language-service": "^14.2.0", "@capacitor/cli": "4.1.0", "@ionic/angular-toolkit": "^6.1.0", - "@polkadot/typegen": "^8.9.1", - "@polkadot/types": "^8.9.1", + "@polkadot/typegen": "^9.2.4", + "@polkadot/types": "^9.2.4", "@types/jasmine": "~4.0.3", "@types/jasminewd2": "~2.0.10", "@types/node": "^12.20.55", diff --git a/src/app/network/currency.model.ts b/src/app/network/currency.model.ts index c735f7a9489a6c998b3117da1afa01345851f170..4f4f1d1c2bc300e5eff053348dfe8a4f7c42b651 100644 --- a/src/app/network/currency.model.ts +++ b/src/app/network/currency.model.ts @@ -3,4 +3,9 @@ export interface Currency { symbol: string; ss58Format: number; genesys: string; + fees: { + identity: number; + tx: number; + }, + decimals: number; } diff --git a/src/app/network/network.service.ts b/src/app/network/network.service.ts index 05b34be7cc49a8977c670187db5c64d52a19ac00..84acf88ea69216fc73d6534c45f463a67b7e8859 100644 --- a/src/app/network/network.service.ts +++ b/src/app/network/network.service.ts @@ -5,21 +5,30 @@ import {Peer, Peers} from "./peer.model"; import {StartableService} from "@app/shared/services/startable-service.class"; import {abbreviate} from "@app/shared/currencies"; import {Currency} from "@app/network/currency.model"; -import {cryptoWaitReady} from "@polkadot/util-crypto"; //import * as definitions from '@duniter/core-types/interfaces' const WELL_KNOWN_CURRENCIES = Object.freeze({ - 'Ğdev': <Currency>{ + 'Ğdev': <Partial<Currency>>{ name: 'Ğdev', symbol: 'ĞD', ss58Format: 42, - genesys: '0x096baa94878da1965c8a7929212f4e7a5f6a813cdcbbb401603b39e5e470b6e0' + genesys: '0x07c112ff6ab9d7d0d531ebe59f98b35318b2813b1655577380819d38d6182d99', + fees: { + identity: 300, // = 3 Gdev + tx: 1 // = 0.01 Gdev + }, + decimals: 2 }, - 'Ğ1': <Currency>{ + 'Ğ1': <Partial<Currency>>{ name: 'Ğ1', symbol: 'Ğ1', ss58Format: 42, - genesys: '0x___TODO___' + genesys: '0x___TODO___', + fees: { + identity: 300, // = 3G1 - FIXME + tx: 1 // = 0.01 G1 - FIXME + }, + decimals: 2 // FIXME remove for autodetection } }); @@ -36,7 +45,7 @@ export class NetworkService extends StartableService<ApiPromise> { return this._data; } - get currencySign(): string { + get currencySymbol(): string { return this.currency.symbol || ''; } @@ -73,23 +82,35 @@ export class NetworkService extends StartableService<ApiPromise> { //,...types }); - // get the chain information + // Get the chain information const chainInfo = await api.registry.getChainProperties(); - console.debug(`${this._logPrefix}Connecting to chain: `, chainInfo.toHuman()); + const chain = '' + (await api.rpc.system.chain()); + const genesys = api.genesisHash.toHex(); - // Read the genesys block hash - console.info(`${this._logPrefix}Blockchain genesis: ` + api.genesisHash.toHex()); + console.info(`${this._logPrefix}Connecting to chain {${chain}}: `, chainInfo.toHuman()); - // Retrieve the chain name - const chain = '' + (await api.rpc.system.chain()); + // Check is well known currency if (WELL_KNOWN_CURRENCIES[chain]) { - this.currency = WELL_KNOWN_CURRENCIES[chain]; + const wellKnownCurrency = WELL_KNOWN_CURRENCIES[chain]; + if (wellKnownCurrency.genesys && wellKnownCurrency.genesys !== genesys) { + console.warn(`${this._logPrefix}Invalid genesys for ${chain}! Expected ${wellKnownCurrency.genesys} but peer return ${genesys}`); + } + else { + this.currency = WELL_KNOWN_CURRENCIES[chain]; + } } - this.currency.symbol = this.currency.symbol || abbreviate(this.currency.name); + this.currency.name = this.currency.name || chain; + this.currency.symbol = this.currency.symbol || chainInfo.tokenSymbol.value?.[0].toHuman() || abbreviate(this.currency.name); + this.currency.decimals = this.currency.decimals || +(chainInfo.tokenDecimals.value?.[0].toHuman()) || 0; + + // Read the genesys block hash + console.debug(`${this._logPrefix}Blockchain symbol: ${this.currency.symbol}`); + console.debug(`${this._logPrefix}Blockchain decimals: ${this.currency.decimals}`); + console.debug(`${this._logPrefix}Blockchain genesis: ${genesys}`); // Retrieve the latest header const lastHeader = await api.rpc.chain.getHeader(); - console.info(`${this._logPrefix}${this.currency.name} - last block #${lastHeader.number} has hash ${lastHeader.hash}`); + console.info(`${this._logPrefix}Last block: #${lastHeader.number} - hash ${lastHeader.hash}`); return api; } diff --git a/src/app/shared/pages/base.page.ts b/src/app/shared/pages/base.page.ts index 7587ed02d60b157a0d2438eb7ab21c684652d790..3fd1a33429ad69cd434a704b9d2e50cdf39bb35e 100644 --- a/src/app/shared/pages/base.page.ts +++ b/src/app/shared/pages/base.page.ts @@ -90,34 +90,34 @@ export abstract class BasePage< protected abstract ngOnLoad(): Promise<S>; - protected setError(err) { + protected setError(err, opts = {emitEvent: true}) { let message = err?.message || err || 'ERROR.UNKNOWN_ERROR'; if (!message) { console.error(err); message = 'ERROR.UNKNOWN_ERROR'; } this.error = message; - this.markForCheck(); + if (opts.emitEvent !== false) this.markForCheck(); } - protected resetError() { + protected resetError(opts ={emitEvent: true}) { if (this.error) { this.error = null; - this.markForCheck(); + if (opts.emitEvent !== false) this.markForCheck(); } } - protected markAsLoading() { + protected markAsLoading(opts = {emitEvent: true}) { if (!this.loading) { this.loading = true; - this.markForCheck(); + if (opts.emitEvent !== false) this.markForCheck(); } } - protected markAsLoaded() { + protected markAsLoaded(opts = {emitEvent: true}) { if (this.loading) { this.loading = false; - this.markForCheck(); + if (opts.emitEvent !== false) this.markForCheck(); } } diff --git a/src/app/shared/pipes/amount.pipe.ts b/src/app/shared/pipes/amount.pipe.ts index fb39d71480f0e6e1df027f21de1cf6c61a34c522..f1ba3d74a98c622db2dc6616d68813d48a744b42 100644 --- a/src/app/shared/pipes/amount.pipe.ts +++ b/src/app/shared/pipes/amount.pipe.ts @@ -15,6 +15,6 @@ export class AmountFormatPipe extends NumberFormatPipe { transform(val: number, opts?: Intl.NumberFormatOptions & {fixedDecimals?: number}): string { if (isNil(val)) return ''; - return super.transform(val / 100, opts) + (' ' + this.networkService.currencySign); + return super.transform(val / 100, opts) + (' ' + this.networkService.currencySymbol); } } diff --git a/src/app/transfer/transfer-routing.module.ts b/src/app/transfer/transfer-routing.module.ts index 3bc695c1d5df6cc6c586e24ab25f95e57e09292b..2fa7c7106111737f65ea42da508b353e28dcd5aa 100644 --- a/src/app/transfer/transfer-routing.module.ts +++ b/src/app/transfer/transfer-routing.module.ts @@ -8,6 +8,16 @@ const routes: Routes = [ path: '', pathMatch: 'full', component: TransferPage + }, + { + path: 'from/:from', + pathMatch: 'full', + component: TransferPage + }, + { + path: 'to/:to', + pathMatch: 'full', + component: TransferPage } ]; diff --git a/src/app/transfer/transfer.page.html b/src/app/transfer/transfer.page.html index 93d5530ce5d77b9ff9e2b3d8afcacf8f9c69df0f..5adabc5b2bea7e6b1a6f26845c82d23a3a46f217 100644 --- a/src/app/transfer/transfer.page.html +++ b/src/app/transfer/transfer.page.html @@ -13,11 +13,12 @@ <ion-title size="large" translate>TRANSFER.TITLE</ion-title> </ion-toolbar> </ion-header> + <div id="container"> <ion-list> <!-- error --> - <ion-item *ngIf="error" lines="none" color="light"> + <ion-item *ngIf="error" lines="none" color="light" class="error"> <ion-icon slot="start" name="alert-circle" color="danger"></ion-icon> <ion-label color="danger">{{error|translate}}</ion-label> </ion-item> @@ -59,7 +60,10 @@ <span *ngIf="account|balance; let balance">({{balance|amountFormat}})</span> </ion-select-option> </ion-select> - <ion-badge *ngIf="issuer" slot="end">{{issuer|balance|amountFormat}}</ion-badge> + <ion-badge *ngIf="issuer|balance; let balance" slot="end" + [color]="amount+fee>balance ? 'danger' : 'success'"> + {{balance|amountFormat}} + </ion-badge> </ng-container> </ng-template> </ion-item> @@ -69,12 +73,14 @@ <ion-input type="number" [(ngModel)]="amount"> </ion-input> + <ion-label color="medium" slot="end" *ngIf="currency">{{currency.symbol}}</ion-label> </ion-item> <ion-item lines="none"> <ion-toggle [(ngModel)]="showComment"> </ion-toggle> <ion-label class="ion-text-start" color="medium" translate>TRANSFER.BTN_ADD_COMMENT</ion-label> + <ion-badge slot="end" *ngIf="amount && fee">{{'TRANSFER.FEE'|translate:{fee: fee, currency: currency.symbol} }}</ion-badge> </ion-item> <ion-item *ngIf="showComment"> @@ -82,14 +88,13 @@ </ion-textarea> </ion-item> - </ion-list> <div class="ion-text-center" *ngIf="!mobile"> - <ion-button (click)="cancel($event)" color="light"> + <ion-button (click)="cancel($event)" color="light" [disabled]="loading"> <ion-label translate>COMMON.BTN_CANCEL</ion-label> </ion-button> - <ion-button (click)="submit($event)"> + <ion-button (click)="submit($event)" [disabled]="loading||invalid"> <ion-icon slot="start" name="paper-plane"></ion-icon> <ion-label translate>TRANSFER.BTN_SEND</ion-label> </ion-button> @@ -118,10 +123,10 @@ </ion-content> <ion-footer *ngIf="mobile"> - <ion-button (click)="cancel($event)" color="light"> + <ion-button (click)="cancel($event)" color="light" [disabled]="loading"> <ion-label translate>COMMON.BTN_CANCEL</ion-label> </ion-button> - <ion-button (click)="submit($event)"> + <ion-button (click)="submit($event)" [disabled]="loading||invalid"> <ion-icon slot="start" name="paper-plane"></ion-icon> <ion-label translate>TRANSFER.BTN_SEND</ion-label> </ion-button> diff --git a/src/app/transfer/transfer.page.ts b/src/app/transfer/transfer.page.ts index 9dc265f6735582862fbf8a20b3c6f6b244ea61fc..36ea83e5afff9519dda63ef95a589e765069f615 100644 --- a/src/app/transfer/transfer.page.ts +++ b/src/app/transfer/transfer.page.ts @@ -12,9 +12,11 @@ import {BasePage} from "@app/shared/pages/base.page"; import {Account} from "@app/wallet/account.model"; import {ActionSheetOptions, IonModal, PopoverOptions} from "@ionic/angular"; import {BehaviorSubject, firstValueFrom, Observable} from "rxjs"; -import {isNotEmptyArray} from "@app/shared/functions"; +import {isNotEmptyArray, isNotNilOrBlank} from "@app/shared/functions"; import {filter} from "rxjs/operators"; import {WotLookupPage} from "@app/wot/wot-lookup.page"; +import {NetworkService} from "@app/network/network.service"; +import {Currency} from "@app/network/currency.model"; @Component({ selector: 'app-transfer', @@ -28,6 +30,7 @@ export class TransferPage extends BasePage<Observable<Account[]>> implements OnI issuer: Account = null; recipient: Account = {address: null, meta: null}; amount: number; + fee: number; protected actionSheetOptions: Partial<ActionSheetOptions> = { cssClass: 'select-account-action-sheet' @@ -44,10 +47,24 @@ export class TransferPage extends BasePage<Observable<Account[]>> implements OnI return (this.issuer.data.free || 0) + (this.issuer.data.reserved || 0); } + get currency(): Currency { + return this.networkService.currency; + } + + get valid(): boolean { + const valid = this.amount > 0 && isNotNilOrBlank(this.issuer?.address) && isNotNilOrBlank(this.recipient?.address); + console.log(valid); + return valid; + } + + get invalid(): boolean { + return !this.valid; + } constructor( injector: Injector, protected accountService: AccountService, + protected networkService: NetworkService, protected cd: ChangeDetectorRef ) { super(injector, {name: 'transfer', loadDueTime: 250}); @@ -76,11 +93,24 @@ export class TransferPage extends BasePage<Observable<Account[]>> implements OnI const accounts = await firstValueFrom(subject); + // Load issuer + const issuerAddress = this.activatedRoute.snapshot.paramMap.get('from'); + if (isNotNilOrBlank(issuerAddress)) { + this.issuer = (accounts||[]).find(a => a.address === issuerAddress); + } // Only one account: select it - if (accounts?.length === 1) { + else if (accounts?.length === 1) { this.issuer = accounts[0]; } + // Load receiver + const receiverAddress = this.activatedRoute.snapshot.paramMap.get('to'); + if (isNotNilOrBlank(receiverAddress)) { + this.recipient.address = receiverAddress; + } + + this.fee = (this.networkService.currency?.fees.tx || 0) / Math.pow(10, this.networkService.currency?.decimals || 0); + return subject; } @@ -95,26 +125,39 @@ export class TransferPage extends BasePage<Observable<Account[]>> implements OnI } cancel(event?: UIEvent) { - // + this.reset(); } async submit(event?: UIEvent) { // Check valid if (!this.recipient || !this.issuer) return; // Skip + this.markAsLoading(); this.resetError(); try { - const txHash = await this.accountService.transfer(this.issuer, this.recipient, this.amount); + await this.accountService.transfer(this.issuer, this.recipient, this.amount); await this.showToast({message: 'INFO.TRANSFER_SENT'}); + + this.reset(); } catch (err) { this.setError(err); + this.markAsLoaded(); } } - compareWith(a1: Account, a2: Account) { + protected compareWith(a1: Account, a2: Account) { return a1.address === a2.address; } + + protected reset() { + this.showComment = false; + this.issuer = null; + this.recipient = {address: null, meta: null}; + this.amount = null; + this.markAsLoaded(); + this.markForCheck(); + } } diff --git a/src/app/wallet/account.service.ts b/src/app/wallet/account.service.ts index 75115eac2154bda7b0d11056e54cebe0cbd1403f..2023a27a959b2ebfa98285f9a616a1130a90fe97 100644 --- a/src/app/wallet/account.service.ts +++ b/src/app/wallet/account.service.ts @@ -41,6 +41,7 @@ export interface LoadAccountDataOptions { reload?: boolean; withTx?: boolean; withBalance?: boolean; + emitEvent?: boolean; } @Injectable({providedIn: 'root'}) @@ -372,34 +373,49 @@ export class AccountService extends StartableService { return await this.loadData(account, opts); } - async transfer(from: Partial<Account>, to: Partial<Account>, amount: number) : Promise<string> { + async transfer(from: Partial<Account>, to: Partial<Account>, amount: number, fee?: number) : Promise<string> { if (!from || !to) throw new Error('Missing argument \'from\' or \'to\' !'); + const currency = this.network.currency; + + // Check currency + if (!currency) throw new Error('ERROR.CHECK_NETWORK_CONNECTION'); + + // Check amount if (isNilOrNaN(amount)) { throw new Error('ERROR.AMOUNT_REQUIRED'); } if (amount < 0) { throw new Error('ERROR.AMOUNT_NEGATIVE'); } - // Same issuer/recipient + + // Check fee + fee = fee || currency.fees.tx || 0; + if (fee < 0) { + throw new Error('ERROR.FEE_NEGATIVE'); + } + + // Check issuer != recipient if (from.address === to.address) { throw new Error('ERROR.SAME_TX_RECIPIENT'); } - // the address we use to use for signing, as injected - //const issuer = from.address ? await this.getByAddress(from.address) : await this.getByAddress(from.meta?.name); - + // Get issuer account const issuerAccount = await this.getByAddress(from.address); - // Not enough credit - if (amount > issuerAccount.data.free) { + + // Check enough credit + if ((amount + fee) > issuerAccount.data.free) { throw new Error('ERROR.NOT_ENOUGH_CREDIT'); } console.info(`[account-service] Sending ${amount} :\nfrom: ${from.address}\nto ${to.address}`) - const issuerPair = keyring.getPair(issuerAccount.address); - const convertedAmount = Math.floor(amount * 100); - // Unlock + // Compute total amount (with fee) and remove decimals + const powBase = Math.pow(10, currency.decimals || 0); + const totalAmount = Math.floor((amount + fee) * powBase); + + // Get pair, and unlock it + const issuerPair = keyring.getPair(issuerAccount.address); if (issuerPair.isLocked) { console.debug(`[account-service] Unlocking address ${from.address} ...`); const isAuth = await this.auth(); @@ -410,29 +426,23 @@ export class AccountService extends StartableService { try { // Sign and send a transfer from Alice to Bob const txHash = await this.api.tx.balances - .transfer(to.address, convertedAmount) + .transfer(to.address, totalAmount) .signAndSend(issuerPair, async ({status, events, findRecord}) => { if (status.isInBlock) { console.info(`${this._logPrefix}Completed at block hash #${status.hash.toHuman()}`); if (this._debug) console.debug(`${this._logPrefix}Block events:`, JSON.stringify(events)); - await sleep(200); - // Update issuer account - //issuerAccount.data.free -= amount; + let outdatedAccounts = [issuerAccount]; // Update receiver account if (await this.isAvailable(to.address)) { const toAccount = await this.getByAddress(to.address); - //toAccount.data.free += amount; - - await this.loadData(toAccount, {reload: true}); + outdatedAccounts.push(toAccount); } - await this.loadData(issuerAccount, {reload: true}); - - // Notify account changes - this.notifyChanged(); + await sleep(200); + await this.refreshData(outdatedAccounts, {reload: true}); } else { console.info(`Current status`, status.toHuman()); @@ -466,25 +476,57 @@ export class AccountService extends StartableService { ...opts }; - // Load balance (free + reserved) - if (opts.withBalance === true && (isNil(account.data?.free) || opts.reload === true)) { - const {data} = await this.api.query.system.account(account.address); - account.data = { - ...account.data, - ...JSON.parse(data.toString()) - }; - } + try { + const now = Date.now(); + let loaded = false; + + // Load balance (free + reserved) + if (opts.withBalance === true && (isNil(account.data?.free) || opts.reload === true)) { + console.debug(`${this._logPrefix} Loading ${account.address} data...`); + const {data} = await this.api.query.system.account(account.address); + account.data = { + ...account.data, + ...JSON.parse(data.toString()) + }; + loaded = true; + } - // Load TX - if (opts.withTx === true && (isNil(account.data?.txs) || opts.reload === true)) { - console.warn('[account-service] TODO - Implement load Tx'); - } + // Load TX + if (opts.withTx === true && (isNil(account.data?.txs) || opts.reload === true)) { + console.debug(`${this._logPrefix} Loading ${account.address} TX history...`); + console.warn('[account-service] TODO - Implement load TX history'); + // TODO + //somethingLoaded = true; + } - console.debug(`${this._logPrefix} Loaded ${account.address} data:`, account.data); + if (loaded) { + console.debug(`${this._logPrefix} Loading ${account.address} data [OK] in ${Date.now()-now}`, account.data); + } + + } + catch(err) { + console.error(`${this._logPrefix}Failed to load ${account.address} data:`, err); + throw new Error('ERROR.LOAD_WALLET_DATA_ERROR'); + } return account; } + private async refreshData(accounts: Account|Account[], opts?: LoadAccountDataOptions) { + const array = Array.isArray(accounts) ? accounts : [accounts]; + try { + const jobs = array.map(account => this.loadData(account, opts)); + await Promise.all(jobs); + + // Notify accounts changed + if (!opts || opts.emitEvent !== false) this.notifyChanged(); + } + catch(err) { + console.error(`${this._logPrefix}Failed to refresh data of:`, array.map(a => a.address)); + throw new Error('ERROR.UPDATE_WALLET_LIST_FAILED'); + } + } + private notifyChanged() { this._$accounts.next(this._$accounts.value.slice() /*create a copy*/); } diff --git a/src/app/wallet/wallet.page.html b/src/app/wallet/wallet.page.html index dfd6313aedd9f22ea266c76b176f41a4f970a723..1762ca4cb38c6947bfab17a1fa50e57e8b0052f5 100644 --- a/src/app/wallet/wallet.page.html +++ b/src/app/wallet/wallet.page.html @@ -25,6 +25,11 @@ <ion-content [fullscreen]="true"> <ion-header> <ion-toolbar class="ion-text-end" color="secondary"> + <ion-buttons slot="start"> + <ion-button *ngIf="loaded" (click)="qrCodeModal.present()"> + <ion-icon slot="icon-only" name="qr-code"></ion-icon> + </ion-button> + </ion-buttons> <ion-title size="large" *ngIf="loaded; else loadingText"> {{ balance | amountFormat }} </ion-title> @@ -50,6 +55,7 @@ [value]="data?.address" readonly> </ion-input> + <ion-button slot="end" (click)="copyAddress()" [disabled]="loading" fill="clear" [title]="'COMMON.COPY'|translate"> @@ -72,7 +78,8 @@ </ion-list> <div class="ion-text-center"> - <ion-button [routerLink]="'../../transfer'"> + <ion-button [routerLink]="['/transfer', 'from', data?.address]" + [disabled]="loading"> <ion-icon slot="start" name="paper-plane"></ion-icon> <ion-label translate>COMMON.BTN_SEND_MONEY</ion-label> </ion-button> @@ -94,3 +101,15 @@ </ion-content> </ng-template> </ion-modal> + + +<ion-modal + #qrCodeModal + [backdropDismiss]="true" +> + <ng-template> + <ion-content scrollY="false"> + QRCODE + </ion-content> + </ng-template> +</ion-modal> diff --git a/src/app/wallet/wallet.page.ts b/src/app/wallet/wallet.page.ts index 28a0746766eaf3f0da775f21bc05afcd8c5b1dc2..e6de42b2ba154651ab62131f59b39279a690a134 100644 --- a/src/app/wallet/wallet.page.ts +++ b/src/app/wallet/wallet.page.ts @@ -2,12 +2,10 @@ import {AfterViewChecked, ChangeDetectionStrategy, Component, Injector, OnInit, import {AccountService} from "./account.service"; import {Clipboard} from "@capacitor/clipboard"; import {BasePage} from "@app/shared/pages/base.page"; -import {Account, AccountData} from "@app/wallet/account.model"; -import {isEmptyArray, isNilOrBlank} from "@app/shared/functions"; -import {keyring} from "@polkadot/ui-keyring"; +import {Account} from "@app/wallet/account.model"; +import {isEmptyArray} from "@app/shared/functions"; import {NetworkService} from "@app/network/network.service"; import {BehaviorSubject} from "rxjs"; -import {AuthModal} from "@app/auth/auth.modal"; import {IonModal} from "@ionic/angular"; import {Router} from "@angular/router"; @@ -39,6 +37,8 @@ export class WalletPage extends BasePage<Account> implements OnInit, AfterViewCh @ViewChild('authModal') authModal: IonModal; + @ViewChild('qrCodeModal') qrCodeModal: IonModal; + constructor( injector: Injector, protected router: Router, @@ -70,7 +70,7 @@ export class WalletPage extends BasePage<Account> implements OnInit, AfterViewCh protected async ngOnLoad(): Promise<Account> { this.info('Loading page...'); - this.currency = this.networkService.currencySign; + this.currency = this.networkService.currencySymbol; const accounts = await this.accountService.getAll(); this.$account.next(accounts); @@ -104,12 +104,19 @@ export class WalletPage extends BasePage<Account> implements OnInit, AfterViewCh } async copyAddress() { + if (this.loading || !this.data?.address) return; // Skip + await Clipboard.write({ - string: this.data?.address + string: this.data.address }); await this.showToast({message: 'INFO.COPY_TO_CLIPBOARD_DONE'}); } + async showQrCode() { + if (this.qrCodeModal.isOpen) return; // Skip + this.qrCodeModal.present(); + } + async openAuthModal(): Promise<Account|null> { if (!this.authModal.isOpen) { await this.authModal.present(); diff --git a/src/app/wot/wot-details.page.html b/src/app/wot/wot-details.page.html index bab7bc50123e6c155b703f34b21e7263c844180d..153114a1465f32f29d75b4b8488fcde8273a78ae 100644 --- a/src/app/wot/wot-details.page.html +++ b/src/app/wot/wot-details.page.html @@ -2,68 +2,65 @@ <ion-toolbar color="primary"> <ion-buttons slot="start"> <ion-menu-button></ion-menu-button> + <ion-back-button></ion-back-button> </ion-buttons> - <ion-title translate>MENU.WOT</ion-title> + <ion-title size="large">{{data|accountName}}</ion-title> </ion-toolbar> </ion-header> <ion-content [fullscreen]="true"> + <ion-header collapse="condense" *ngIf="showToolbar"> + <ion-toolbar> + <ion-title size="large">{{data|accountName}}</ion-title> + </ion-toolbar> + </ion-header> <div id="container"> - <ion-searchbar [placeholder]="'WOT.SEARCH_HELP'|translate" - (change)="search()" - (click)="searchClick.emit($event)"> - </ion-searchbar> + <ion-header> + <ion-toolbar class="ion-text-end" color="secondary"> + <ion-avatar slot="start" *ngIf="data?.meta?.avatar"> + <ion-img [src]="data.meta.avatar"></ion-img> + </ion-avatar> + <ion-title size="large" *ngIf="loaded; else loadingText"> + {{ data|balance|amountFormat }} + </ion-title> + <ng-template #loadingText> + <ion-title translate>COMMON.LOADING</ion-title> + </ng-template> + </ion-toolbar> + </ion-header> <ion-list> + <ion-item> + <ion-icon slot="start" name="key"></ion-icon> + <ion-label color="medium" translate>COMMON.PUBKEY</ion-label> + <ion-input *ngIf="loaded; else skeleton60" + class="ion-text-end" + [value]="data?.address" + readonly> + </ion-input> - <ng-container *ngIf="loading"> - - <ng-template [ngTemplateOutlet]="itemSkeleton"></ng-template> - <ng-template [ngTemplateOutlet]="itemSkeleton"></ng-template> - <ng-template [ngTemplateOutlet]="itemSkeleton"></ng-template> - </ng-container> - - <ng-template #items> - <ion-item-sliding *ngFor="let item of data"> - <ion-item > - <ion-avatar slot="start" *ngIf="item.meta?.avatar; else iconPerson"> - <ion-img [src]="item.meta?.avatar"></ion-img> - </ion-avatar> - <ng-template #iconPerson> - <ion-icon slot="start" name="person"></ion-icon> - </ng-template> - <ion-label> - <h2>{{item.meta?.name}}</h2> - <p>{{item.address|addressFormat}}</p> - </ion-label> - <ion-button slot="end" *ngIf="!mobile" (click)="transfer(item)" [title]="'BTN_SEND_MONEY'|translate"> - <ion-icon slot="icon-only" name="paper-plane"></ion-icon> - </ion-button> - </ion-item> - <ion-item-options *ngIf="mobile"> - <ion-item-option (click)="transfer(item)" [title]="'BTN_SEND_MONEY'|translate"> - <ion-icon slot="icon-only" name="paper-plane"></ion-icon> - </ion-item-option> - </ion-item-options> - </ion-item-sliding> - </ng-template> + <ion-button slot="end" (click)="copyAddress()" + [disabled]="loading" + fill="clear" [title]="'COMMON.COPY'|translate"> + <ion-icon slot="icon-only" name="copy"></ion-icon> + </ion-button> + </ion-item> </ion-list> + <div class="ion-text-center"> + <ion-button [routerLink]="['/transfer', 'to', data?.address]" + [disabled]="loading"> + <ion-icon slot="start" name="paper-plane"></ion-icon> + <ion-label translate>COMMON.BTN_SEND_MONEY</ion-label> + </ion-button> + </div> + </div> </ion-content> - -<ng-template #itemSkeleton> - <ion-item> - <ion-icon slot="start" name="person"></ion-icon> - <ion-skeleton-text animated style="width: 60%"></ion-skeleton-text> - </ion-item> -</ng-template> - - -<ng-template #inputSkeleton> - <ion-skeleton-text animated style="width: 60%"></ion-skeleton-text> +<ng-template #skeleton60> + <ion-skeleton-text [animated]="true" style="width: 60%"></ion-skeleton-text> </ng-template> diff --git a/src/app/wot/wot-details.page.ts b/src/app/wot/wot-details.page.ts index 0774c6df9977621993ded00b8e74be2a2f31febf..9baf6caf84d0090592c4bb67a50c0c28c63903fb 100644 --- a/src/app/wot/wot-details.page.ts +++ b/src/app/wot/wot-details.page.ts @@ -1,9 +1,11 @@ -import {ChangeDetectionStrategy, Component, Injector, OnInit} from '@angular/core'; +import {ChangeDetectionStrategy, Component, Injector, Input, OnInit} from '@angular/core'; import {BasePage} from "@app/shared/pages/base.page"; import {Account} from "@app/wallet/account.model"; import {Router} from "@angular/router"; import {WotService} from "@app/wot/wot.service"; +import {AccountService} from "@app/wallet/account.service"; +import {Clipboard} from "@capacitor/clipboard"; @Component({ selector: 'app-wot-details', @@ -15,26 +17,48 @@ export class WotDetailsPage extends BasePage<Account> implements OnInit { address = this.activatedRoute.snapshot.paramMap.get('address'); + @Input() showToolbar = true; + constructor(injector: Injector, private router: Router, + private accountService: AccountService, private wotService: WotService ) { super(injector, {name: 'wot-details-page'}); } ngOnInit() { + super.ngOnInit(); } protected async ngOnLoad(): Promise<Account> { - await this.wotService.ready(); + await Promise.all([ + this.accountService.ready(), + this.wotService.ready() + ]); + + const ownedAddress = await this.accountService.isAvailable(this.address); + if (ownedAddress) { + return this.accountService.getByAddress(this.address); + } const data = await this.wotService.search({address: this.address}); return data[0]; } - transfer() { + + async copyAddress() { + if (this.loading || !this.data?.address) return; // Skip + + await Clipboard.write({ + string: this.data?.address + }); + await this.showToast({message: 'INFO.COPY_TO_CLIPBOARD_DONE'}); + } + + transfer(event?: UIEvent) { this.router.navigate(['transfer'], { queryParams: { address: this.data.address, diff --git a/src/app/wot/wot-lookup.page.html b/src/app/wot/wot-lookup.page.html index 7c51e13e18d4c7f4598e3437eadcfbbb3cff572f..3250d3b6f3d0dacb0c074c9b59c3e01699629de6 100644 --- a/src/app/wot/wot-lookup.page.html +++ b/src/app/wot/wot-lookup.page.html @@ -8,6 +8,11 @@ </ion-header> <ion-content [fullscreen]="true"> + <ion-header collapse="condense" *ngIf="showToolbar"> + <ion-toolbar> + <ion-title size="large" translate>MENU.WOT</ion-title> + </ion-toolbar> + </ion-header> <div id="container"> @@ -63,7 +68,6 @@ </ng-template> </ion-list> - </div> </ion-content> @@ -77,8 +81,3 @@ </ion-label> </ion-item> </ng-template> - - -<ng-template #inputSkeleton> - <ion-skeleton-text animated style="width: 60%"></ion-skeleton-text> -</ng-template> diff --git a/src/app/wot/wot-lookup.page.ts b/src/app/wot/wot-lookup.page.ts index b894a9152cb008b0010d59bec36da56b1061b74b..3e481c1257e46259630c508f959474713607158d 100644 --- a/src/app/wot/wot-lookup.page.ts +++ b/src/app/wot/wot-lookup.page.ts @@ -75,7 +75,9 @@ export class WotLookupPage extends BasePage<Account[]> implements OnInit { } else { // Open - this.router.navigate(['wot', '']) + this.router.navigate([item.address], { + relativeTo: this.activatedRoute + }) } } diff --git a/src/app/wot/wot-routing.module.ts b/src/app/wot/wot-routing.module.ts index e1973265bac166275635ffb9dbe7ec3242427c15..d8a8067c23bd0f187394ac86ae7d435b43fa424a 100644 --- a/src/app/wot/wot-routing.module.ts +++ b/src/app/wot/wot-routing.module.ts @@ -8,13 +8,14 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: WotLookupPage + component: WotLookupPage, }, { path: ':address', pathMatch: 'full', component: WotDetailsPage } + ]; @NgModule({ diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index a0429a1f07d770de7dfe9ae2e1d3fd129321bc09..0fac1639eb425260c77f64b3fdf2d1ee6e7e527b 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -678,6 +678,7 @@ "AMOUNT_HELP": "Montant", "COMMENT": "Commentaire", "COMMENT_HELP": "Commentaire", + "FEE": "+{{fee}} {{currency}} frais", "BTN_SEND": "Envoyer", "BTN_ADD_COMMENT": "Ajouter un commentaire", "REST": "Reste du compte", @@ -737,6 +738,7 @@ "NEED_LOGIN_FIRST": "Veuillez d'abord vous connecter.", "AMOUNT_REQUIRED": "Le montant est obligatoire.", "AMOUNT_NEGATIVE": "Montant négatif non autorisé.", + "FEE_NEGATIVE": "Frais négatif non autorisé.", "NOT_ENOUGH_CREDIT": "Crédit insuffisant.", "INVALID_NODE_SUMMARY": "Nœud injoignable ou adresse invalide.", "INVALID_USER_ID": "Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.", diff --git a/src/index.html b/src/index.html index d357cf7a8a32347e515d2f969a9fdadde0385d43..4a657e97410ccc15e37556b6069840a37e5abf97 100644 --- a/src/index.html +++ b/src/index.html @@ -17,6 +17,18 @@ <!-- add to homescreen for ios --> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> + + <style> + /*body {*/ + /* min-width: 800px;*/ + /* max-width: auto;*/ + /*}*/ + /*html {*/ + /* min-width: 800px;*/ + /* max-width: auto;*/ + /* min-height: 600px;*/ + /* }*/ + </style> </head> <body> diff --git a/src/manifest.json b/src/manifest.json index 0eb4d872ab1d9278eac30e34985d2cca8ab454a6..4ad549def78a65724a4b57429e25dea73cec6c50 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,28 +1,28 @@ { "short_name": "Cesium", "name": "Cesium", - "manifest_version": 1, + "manifest_version": 2, "version": "2.0.0-rc1", "default_locale": "fr", "description": "Cesium Wallet for Ğ1 libre currency", "icons": [ { - "src": "img/logo_32px.png", + "src": "assets/img/logo_32px.png", "sizes": "32x32", "type": "image/png" }, { - "src": "img/logo_96px.png", + "src": "assets/img/logo_96px.png", "sizes": "96x96", "type": "image/png" }, { - "src": "img/logo_144px.png", + "src": "assets/img/logo_144px.png", "sizes": "144x144", "type": "image/png" }, { - "src": "img/logo.svg", + "src": "assets/img/logo.svg", "sizes": "192x192", "type": "image/svg" } @@ -30,18 +30,23 @@ "background_color": "#1a237e", "theme_color": "black", "dir": "ltr", - "start_url": "/#/app/home", + "start_url": "/home", "display": "standalone", + "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", + "browser_action": { + "default_popup": "index.html", + "default_icon": "assets/icon/favicon.ico" + }, "protocol_handlers": [ { "protocol": "june", - "name": "Cesium", - "uriTemplate": "/#/app/home?uri=%s" + "name": "june", + "uriTemplate": "/home?uri=%s" }, { "protocol": "web+june", - "name": "Cesium", - "uriTemplate": "/#/app/home?uri=%s" + "name": "web-june", + "uriTemplate": "/home?uri=%s" } ] } diff --git a/src/theme/_cesium.scss b/src/theme/_cesium.scss index 247c9b186284ff15d3210ed755c697ea5efcd611..f2523fd1c75831bd970533ede7dcf80dea8b60e5 100644 --- a/src/theme/_cesium.scss +++ b/src/theme/_cesium.scss @@ -7,3 +7,16 @@ display: none; visibility: hidden; } + +/* -- error message -- */ +.item.error, +ion-item.error { + ion-label { + white-space: break-spaces !important; + } +} + +/* */ +ion-toolbar { + --ion-toolbar-background: var(--ion-color-base); +} diff --git a/yarn.lock b/yarn.lock index 13727d5ebc1d7d30f38acea0fc723adbe6251cb6..f1b82ad97b6f24fc396b559501fd5af2dbaf8a1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -340,7 +340,7 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.12.3", "@babel/core@^7.17.2", "@babel/core@^7.18.9": +"@babel/core@^7.12.3", "@babel/core@^7.17.2", "@babel/core@^7.18.13": version "7.18.13" resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz" integrity sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A== @@ -1255,7 +1255,7 @@ core-js-pure "^3.15.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.18.9", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9": +"@babel/runtime@7.18.9", "@babel/runtime@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz" integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== @@ -1303,6 +1303,13 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" +"@capacitor-community/sqlite@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@capacitor-community/sqlite/-/sqlite-4.0.1.tgz#4d8a01be12196ccfe2cd910d0d41cabd91b3ca0b" + integrity sha512-bKdIUfDm+fXyZm2WZWWceFZjv8Zn0bRUI2lhaCRKJNqFk3jTI7z4qGTB2zqsKcijVhYF18j21pzXqJc3Ybb9xA== + dependencies: + jeep-sqlite "^1.5.5" + "@capacitor/app@4.0.1": version "4.0.1" resolved "https://registry.npmjs.org/@capacitor/app/-/app-4.0.1.tgz#05c60541c427ef30f4762d8f786e70d0ed32fe01" @@ -1769,11 +1776,6 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== -"@noble/secp256k1@1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.0.tgz" - integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== - "@noble/secp256k1@1.6.3": version "1.6.3" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz" @@ -1913,70 +1915,70 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" -"@polkadot/api-augment@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-8.14.1.tgz" - integrity sha512-65GMlgVnZd08Ifh8uAj+p/+MlXxvsAfBcCHjQhOmbCE0dki+rzTPUR31LsWyDKtuw+nUBj0iZN4PelO+wU4r0g== +"@polkadot/api-augment@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-9.2.4.tgz#6d12e6e702828facd40606efbb494d80c1372db4" + integrity sha512-oL8JJS3RClbv+yVdVTjRHoU2d3az/YvD+Ex2UFnMtBCBk22kDnDEoJAstJJjnXW2RT7CsEmCj3ffP0pmJGvF4A== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/api-base" "8.14.1" - "@polkadot/rpc-augment" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-augment" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/util" "^10.1.1" - -"@polkadot/api-base@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/api-base/-/api-base-8.14.1.tgz" - integrity sha512-EXFhNXIfpirf18IsqcG2pGQW1/Xn+bfjqVYQMMJ4ZONtYH4baZZlXk7SoXCCHonN2x1ixs4DOcRx5oVxjabdIQ== + "@polkadot/api-base" "9.2.4" + "@polkadot/rpc-augment" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/types-augment" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/util" "^10.1.6" + +"@polkadot/api-base@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/api-base/-/api-base-9.2.4.tgz#6279da0fb2ce6a044fc03ce28112322908f20193" + integrity sha512-iTSsenaKAWTrkyDkbvBlhx/hzS/DlPPcw+u/Z2EQfnsh6R8qR7Od5JbFKM5Z81mlBX2R3FYm6r2Cxan0Bb+bDA== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/rpc-core" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/util" "^10.1.1" + "@polkadot/rpc-core" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/util" "^10.1.6" rxjs "^7.5.6" -"@polkadot/api-derive@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-8.14.1.tgz" - integrity sha512-eWG1MrQhHMUjt9gDHN9/9/ZMATu1MolqcalPFhNoGtdON3+I0J3ntjQ4y5X7+p2OGwQplpYRKqbK4k7tKzu8tA== +"@polkadot/api-derive@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-9.2.4.tgz#2abdf94d69cc4b2596125f630452237cb62c4988" + integrity sha512-16V+l8hNe+TMYbZf6Bq27ZT69HXZC1Fn/mq0IrzdAs4jW2mok5tDfHDL+rCGJeRTq1LXFUOfPZGTMR4bqH2VqA== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/api" "8.14.1" - "@polkadot/api-augment" "8.14.1" - "@polkadot/api-base" "8.14.1" - "@polkadot/rpc-core" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/util" "^10.1.1" - "@polkadot/util-crypto" "^10.1.1" + "@polkadot/api" "9.2.4" + "@polkadot/api-augment" "9.2.4" + "@polkadot/api-base" "9.2.4" + "@polkadot/rpc-core" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/util" "^10.1.6" + "@polkadot/util-crypto" "^10.1.6" rxjs "^7.5.6" -"@polkadot/api@8.14.1", "@polkadot/api@^8.9.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/api/-/api-8.14.1.tgz" - integrity sha512-jg26eIKFYqVfDBTAopHL3aDaNw9j6TdUkXuvYJOnynpecU4xwbTVKcOtSOjJ2eRX4MgMQ4zlyMHJx3iKw0uUTA== +"@polkadot/api@9.2.4", "@polkadot/api@^9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/api/-/api-9.2.4.tgz#501a271d61dd5e1a81d08e0183a4a4bc0a081693" + integrity sha512-mtTnTpix8lvjZnKgB3vnYE9frGPil2QbUd6uD2Vu/q2izRZuuPrMCAQjMf9o8CRJfeC4149jX3VZ5xq9gmYHrg== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/api-augment" "8.14.1" - "@polkadot/api-base" "8.14.1" - "@polkadot/api-derive" "8.14.1" - "@polkadot/keyring" "^10.1.1" - "@polkadot/rpc-augment" "8.14.1" - "@polkadot/rpc-core" "8.14.1" - "@polkadot/rpc-provider" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-augment" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/types-create" "8.14.1" - "@polkadot/types-known" "8.14.1" - "@polkadot/util" "^10.1.1" - "@polkadot/util-crypto" "^10.1.1" + "@polkadot/api-augment" "9.2.4" + "@polkadot/api-base" "9.2.4" + "@polkadot/api-derive" "9.2.4" + "@polkadot/keyring" "^10.1.6" + "@polkadot/rpc-augment" "9.2.4" + "@polkadot/rpc-core" "9.2.4" + "@polkadot/rpc-provider" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/types-augment" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/types-create" "9.2.4" + "@polkadot/types-known" "9.2.4" + "@polkadot/util" "^10.1.6" + "@polkadot/util-crypto" "^10.1.6" eventemitter3 "^4.0.7" rxjs "^7.5.6" -"@polkadot/keyring@^10.1.1", "@polkadot/keyring@^10.1.6": +"@polkadot/keyring@^10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/keyring/-/keyring-10.1.6.tgz" integrity sha512-l4kF8SRJwkAfQaPKu15/0cxnSu5kPBj/RM0oJpSxkiqZXMhflU7i1tGX2DNhXST+btyEe0AYDzLg2YSyxYOPQA== @@ -1985,16 +1987,7 @@ "@polkadot/util" "10.1.6" "@polkadot/util-crypto" "10.1.6" -"@polkadot/keyring@^9.6.1": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/keyring/-/keyring-9.7.2.tgz" - integrity sha512-qY5baU1qduwTE04Cyrqtf2pCpsIk7Z5vi45CD9U3cbkKXaJoNUqIpfKoL8Vh/yVJBwhclMdxV9E2rEJs8Iv4bg== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/util" "9.7.2" - "@polkadot/util-crypto" "9.7.2" - -"@polkadot/networks@10.1.6", "@polkadot/networks@^10.1.1", "@polkadot/networks@^10.1.6": +"@polkadot/networks@10.1.6", "@polkadot/networks@^10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/networks/-/networks-10.1.6.tgz" integrity sha512-NINGTVkvAnrBDXbIdcSJ7gCmtXUB6ybI4TLHY2Tf/57hak+hlyQUoHZdaTzpRYrxZ9xoUUS1K83Lr3wfwMblHA== @@ -2003,146 +1996,137 @@ "@polkadot/util" "10.1.6" "@substrate/ss58-registry" "^1.28.0" -"@polkadot/networks@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/networks/-/networks-9.7.2.tgz" - integrity sha512-oMAdF8Y9CLBI0EUZBcycHcvbQQdbkJHevPJ/lwnZXJTaueXuav/Xm2yiFj5J3V8meIjLocURlMawgsAVItXOBQ== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/util" "9.7.2" - "@substrate/ss58-registry" "^1.23.0" - -"@polkadot/rpc-augment@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-8.14.1.tgz" - integrity sha512-0dIsNVIMeCp0kV7+Obz0Odt6K32Ka2ygwhiV5jhhJthy8GJBPo94mKDed5gzln3Dgl2LEdJJt1h/pgCx4a2i4A== +"@polkadot/rpc-augment@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-9.2.4.tgz#372eec7f15aea8f0ba3cb80affb0f216e6971e26" + integrity sha512-Jhw0r1CDr1CgkXdq/9zVNzQe4Yipk+NZ+uBWgBxfk+5ceaVsPjcwDG4A+J7og6I3fiWpz7srY1MC2Q8tikn6BA== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/rpc-core" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/util" "^10.1.1" + "@polkadot/rpc-core" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/util" "^10.1.6" -"@polkadot/rpc-core@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-8.14.1.tgz" - integrity sha512-deQ8Ob59ao/1fZQdaVtFjYR/HCBdxSYvQGt7/alBu1Uig9Sahx9oKcMkU5rWY36XqGZYos4zLay98W2hDlf+6Q== +"@polkadot/rpc-core@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-9.2.4.tgz#83e5828b53e27c976636bafe4486979df420cd93" + integrity sha512-npGOFC3BIjIxb4+jK4hISlUjsY8ay6GsLD5qhxEeiypk3pDNeHuBN/LjN4Z5Cb9N6e2fDgcLP4HRZG+YTf8ccA== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/rpc-augment" "8.14.1" - "@polkadot/rpc-provider" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/util" "^10.1.1" + "@polkadot/rpc-augment" "9.2.4" + "@polkadot/rpc-provider" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/util" "^10.1.6" rxjs "^7.5.6" -"@polkadot/rpc-provider@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-8.14.1.tgz" - integrity sha512-pAUSHZiSWLhBSYf4LmLc8iCaeqTu7Ajn8AzyqxvZDHGnIrzV5M7eTjpNDP84qno6jWRHKQ/IILr62hausEmS5w== +"@polkadot/rpc-provider@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-9.2.4.tgz#c25db404642516ccd4d461325c2dcec08637fba9" + integrity sha512-qVlaDr/Oax764mps89tQpKFohOacFta5Gp72s81OBxFR1Nxq9qE5uaL5AaXzAxEtL+XVMFYKE508pp2IJW52dw== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/keyring" "^10.1.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-support" "8.14.1" - "@polkadot/util" "^10.1.1" - "@polkadot/util-crypto" "^10.1.1" - "@polkadot/x-fetch" "^10.1.1" - "@polkadot/x-global" "^10.1.1" - "@polkadot/x-ws" "^10.1.1" - "@substrate/connect" "0.7.9" + "@polkadot/keyring" "^10.1.6" + "@polkadot/types" "9.2.4" + "@polkadot/types-support" "9.2.4" + "@polkadot/util" "^10.1.6" + "@polkadot/util-crypto" "^10.1.6" + "@polkadot/x-fetch" "^10.1.6" + "@polkadot/x-global" "^10.1.6" + "@polkadot/x-ws" "^10.1.6" + "@substrate/connect" "0.7.11" eventemitter3 "^4.0.7" mock-socket "^9.1.5" nock "^13.2.9" -"@polkadot/typegen@^8.9.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/typegen/-/typegen-8.14.1.tgz" - integrity sha512-NfQj/tnL0N1ggBr3RhYEaPIPYtzUKPduhtqF/J2WRWoz4PT2qtzhYd+ljyIR+T7s9Ijnjm3+Gjf9xEq2vchRLg== +"@polkadot/typegen@^9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/typegen/-/typegen-9.2.4.tgz#766af32c3ab1a6ba4438ef3f5e02b9b56d85e3da" + integrity sha512-13dSv7ucLAaMWJTzYSErPfFfKCZPp8cMp5l8XcmUEk/zc5GuLCII+A4Fj+7FGYXjntUvf+DhV4hgzGMitjM0SQ== dependencies: - "@babel/core" "^7.18.9" + "@babel/core" "^7.18.13" "@babel/register" "^7.18.9" "@babel/runtime" "^7.18.9" - "@polkadot/api" "8.14.1" - "@polkadot/api-augment" "8.14.1" - "@polkadot/rpc-augment" "8.14.1" - "@polkadot/rpc-provider" "8.14.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-augment" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/types-create" "8.14.1" - "@polkadot/types-support" "8.14.1" - "@polkadot/util" "^10.1.1" - "@polkadot/util-crypto" "^10.1.1" - "@polkadot/x-ws" "^10.1.1" + "@polkadot/api" "9.2.4" + "@polkadot/api-augment" "9.2.4" + "@polkadot/rpc-augment" "9.2.4" + "@polkadot/rpc-provider" "9.2.4" + "@polkadot/types" "9.2.4" + "@polkadot/types-augment" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/types-create" "9.2.4" + "@polkadot/types-support" "9.2.4" + "@polkadot/util" "^10.1.6" + "@polkadot/util-crypto" "^10.1.6" + "@polkadot/x-ws" "^10.1.6" handlebars "^4.7.7" websocket "^1.0.34" yargs "^17.5.1" -"@polkadot/types-augment@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-8.14.1.tgz" - integrity sha512-Xa4TUFqyZT+IJ6pBSwDjWcF42u/E34OyC+gbs5Z2vWQ4EzSDkq4xNoUKjJlEEgTemsD9lhPOIc4jvqTCefwxEw== +"@polkadot/types-augment@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-9.2.4.tgz#dc9307012bf7adfa8329413e716dda351cd7e5f1" + integrity sha512-3Y8I7ZjCBWJwnooegEqBvsbYk9EOAfYhX1g+IxYFL/xTUO4mdNrgmaslHele2M7h//N+xW+iZ5R8IGRYOka1ew== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/types" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/util" "^10.1.1" + "@polkadot/types" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/util" "^10.1.6" -"@polkadot/types-codec@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-8.14.1.tgz" - integrity sha512-y6YDN4HwvEgSWlgrEV04QBBxDxES1cTuUQFzZJzOTuZCWpA371Mdj3M9wYxGXMnj0wa+rCQGECHPZZaNxBMiKg== +"@polkadot/types-codec@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-9.2.4.tgz#4ae6bd33fbc7cb41b3b8dc41d49325393fd4f22f" + integrity sha512-3Wy7KOk6qd0v6rUQ2Qq5bz6xAo2KCp1Sn1GYa7VPNcFZfZaBO3Axgg3w3++ckDqLt8bI99Y/wCuAKhzvnMs/WA== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/util" "^10.1.1" - "@polkadot/x-bigint" "^10.1.1" + "@polkadot/util" "^10.1.6" + "@polkadot/x-bigint" "^10.1.6" -"@polkadot/types-create@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/types-create/-/types-create-8.14.1.tgz" - integrity sha512-fb9yyblj5AYAPzeCIq0kYSfzDxRDi/0ud9gN2UzB3H7M/O4n2mPC1vD4UOLF+B7l9QzCrt4e+k+/riGp7GfvyA== +"@polkadot/types-create@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/types-create/-/types-create-9.2.4.tgz#be920f7ae3404e655afc2cd0b63a6ccebe2ea112" + integrity sha512-RU5r4GlhNFhd3QUzUj9gxfRNlH4LgvHEXTS/K5pprlKTmoJk9HcpzbnkydM8qb1kc3JJWpYgG3Ov82y6HWDjDg== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/types-codec" "8.14.1" - "@polkadot/util" "^10.1.1" + "@polkadot/types-codec" "9.2.4" + "@polkadot/util" "^10.1.6" -"@polkadot/types-known@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/types-known/-/types-known-8.14.1.tgz" - integrity sha512-GP7gRo9nmitykkrRnoLF61Qm19UFdTwMsOnJkdm7AOeWDmZGxutacgO6k1tBsHr38hsiCCGsB/JiseUgywvGIw== +"@polkadot/types-known@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/types-known/-/types-known-9.2.4.tgz#940e18aa18dea885051db5fabddd83a81580ba52" + integrity sha512-AEf0Qj/HjoCZTbIdNHXFQt+bbjaNpVdSV+yWIJNTtpRz6IcFNkddiW+4VRlesJh8M6zNy1S4BUcJlee3OqWJbg== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/networks" "^10.1.1" - "@polkadot/types" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/types-create" "8.14.1" - "@polkadot/util" "^10.1.1" + "@polkadot/networks" "^10.1.6" + "@polkadot/types" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/types-create" "9.2.4" + "@polkadot/util" "^10.1.6" -"@polkadot/types-support@8.14.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/types-support/-/types-support-8.14.1.tgz" - integrity sha512-XqR4qq6pCZyNBuFVod8nFSNUmLssrjoU9bOIn4Ua2cqNlI9xsuKaI1X5ySEn/oWOtKQ2L5hbCm9vkXrEtXBl1w== +"@polkadot/types-support@9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/types-support/-/types-support-9.2.4.tgz#5446791a876dedc629ff48fd0066ff306d2a2ec7" + integrity sha512-+Ci3dr6vieIybtfNERMeujzhr1P6i0napLm1bFb3QAiZ8sOaeF9i1y/LUsIHSFCb7D4joyJpaRK0WwLSV17WBA== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/util" "^10.1.1" + "@polkadot/util" "^10.1.6" -"@polkadot/types@8.14.1", "@polkadot/types@^8.9.1": - version "8.14.1" - resolved "https://registry.npmjs.org/@polkadot/types/-/types-8.14.1.tgz" - integrity sha512-Xza16ejKrSd4XhTOlbfISyxZ2sRmbMAZk5pX7VEMHVZHqV98o+bJ2f9Kk7F8YJijkHHGosCLDestP9R5nLoOoA== +"@polkadot/types@9.2.4", "@polkadot/types@^9.2.4": + version "9.2.4" + resolved "https://registry.npmjs.org/@polkadot/types/-/types-9.2.4.tgz#05818a2514f4d87c3339f6e000174ffccd6e0385" + integrity sha512-AnoTE2ORB0GfDz0JXwMqGiUieIxJSledxmiGTMF3Oj68WLWtg5yEMQZzYnbAELBLhscYdp1MHwYNBli72M3Q2Q== dependencies: "@babel/runtime" "^7.18.9" - "@polkadot/keyring" "^10.1.1" - "@polkadot/types-augment" "8.14.1" - "@polkadot/types-codec" "8.14.1" - "@polkadot/types-create" "8.14.1" - "@polkadot/util" "^10.1.1" - "@polkadot/util-crypto" "^10.1.1" + "@polkadot/keyring" "^10.1.6" + "@polkadot/types-augment" "9.2.4" + "@polkadot/types-codec" "9.2.4" + "@polkadot/types-create" "9.2.4" + "@polkadot/util" "^10.1.6" + "@polkadot/util-crypto" "^10.1.6" rxjs "^7.5.6" -"@polkadot/ui-keyring@^2.6.1": +"@polkadot/ui-keyring@^2.9.7": version "2.9.7" - resolved "https://registry.npmjs.org/@polkadot/ui-keyring/-/ui-keyring-2.9.7.tgz" + resolved "https://registry.npmjs.org/@polkadot/ui-keyring/-/ui-keyring-2.9.7.tgz#b79b056b4c26866b3e87569407bcc16b95894545" integrity sha512-0Y5Nh7YBEGfJQVRyEQAE3C05JBKRfLN+qVTBlCGe315xus8DyO3YS+w1HYHmHiXV34EfavnhftTla0/KWsND5g== dependencies: "@babel/runtime" "^7.18.9" @@ -2154,7 +2138,7 @@ rxjs "^7.5.6" store "^2.0.12" -"@polkadot/ui-settings@2.9.7", "@polkadot/ui-settings@^2.6.1": +"@polkadot/ui-settings@2.9.7", "@polkadot/ui-settings@^2.9.7": version "2.9.7" resolved "https://registry.npmjs.org/@polkadot/ui-settings/-/ui-settings-2.9.7.tgz" integrity sha512-MZJbexCei4LsUew9cY4XxxLjNM0M+VMPqByNXSiksneYyz3AoojR3EiLr1WlP1D/pqkvb8gIR61MYpcTRuc87Q== @@ -2165,7 +2149,7 @@ eventemitter3 "^4.0.7" store "^2.0.12" -"@polkadot/util-crypto@10.1.6", "@polkadot/util-crypto@^10.1.1", "@polkadot/util-crypto@^10.1.6": +"@polkadot/util-crypto@10.1.6", "@polkadot/util-crypto@^10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-10.1.6.tgz" integrity sha512-r3XWcCERomcGyB5PT7Qa1LYtCHfspVbehPGvraRlX5xhZBihpU4zMRWTSBNMPNaeIjUJmmSQHeG0ZnQVvnwzkg== @@ -2182,24 +2166,7 @@ ed2curve "^0.3.0" tweetnacl "^1.0.3" -"@polkadot/util-crypto@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-9.7.2.tgz" - integrity sha512-tfz6mJtPwoNteivKCmR+QklC4mr1/hGZRsDJLWKaFhanDinYZ3V2pJM1EbCI6WONLuuzlTxsDXjAffWzzRqlPA== - dependencies: - "@babel/runtime" "^7.18.6" - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.6.0" - "@polkadot/networks" "9.7.2" - "@polkadot/util" "9.7.2" - "@polkadot/wasm-crypto" "^6.2.2" - "@polkadot/x-bigint" "9.7.2" - "@polkadot/x-randomvalues" "9.7.2" - "@scure/base" "1.1.1" - ed2curve "^0.3.0" - tweetnacl "^1.0.3" - -"@polkadot/util@10.1.6", "@polkadot/util@^10.1.1", "@polkadot/util@^10.1.6": +"@polkadot/util@10.1.6", "@polkadot/util@^10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/util/-/util-10.1.6.tgz" integrity sha512-k+gCKmgwxp0smmLIR7SfiEYEToayWXjrC7pQ0PqAGxpBNOdVMSCzLMnOHf9AI5cjs/lx6ULr1fHn721wLVonkw== @@ -2212,20 +2179,6 @@ "@types/bn.js" "^5.1.0" bn.js "^5.2.1" -"@polkadot/util@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/util/-/util-9.7.2.tgz" - integrity sha512-ivTmA+KkPCq5i3O0Gk+dTds/hwdwlYCh89aKfeaG9ni3XHUbbuBgTqHneo648HqxwAwSAyiDiwE9EdXrzAdO4Q== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/x-bigint" "9.7.2" - "@polkadot/x-global" "9.7.2" - "@polkadot/x-textdecoder" "9.7.2" - "@polkadot/x-textencoder" "9.7.2" - "@types/bn.js" "^5.1.0" - bn.js "^5.2.1" - ip-regex "^4.3.0" - "@polkadot/wasm-bridge@6.3.1": version "6.3.1" resolved "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-6.3.1.tgz" @@ -2258,7 +2211,7 @@ "@babel/runtime" "^7.18.9" "@polkadot/wasm-util" "6.3.1" -"@polkadot/wasm-crypto@^6.2.2", "@polkadot/wasm-crypto@^6.3.1": +"@polkadot/wasm-crypto@^6.3.1": version "6.3.1" resolved "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-6.3.1.tgz" integrity sha512-OO8h0qeVkqp4xYZaRVl4iuWOEtq282pNBHDKb6SOJuI2g59eWGcKh4EQU9Me2VP6qzojIqptrkrVt7KQXC68gA== @@ -2277,7 +2230,7 @@ dependencies: "@babel/runtime" "^7.18.9" -"@polkadot/x-bigint@10.1.6", "@polkadot/x-bigint@^10.1.1": +"@polkadot/x-bigint@10.1.6", "@polkadot/x-bigint@^10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-10.1.6.tgz" integrity sha512-yeBZQ9+u49KqDBaeSw+ytshqzyaScKrDjAxpWCfOGxJaB+5Nv1W7fqi3OJ4S/HN5DYItr0a6UC14e1hiZUtZCg== @@ -2285,17 +2238,9 @@ "@babel/runtime" "^7.18.9" "@polkadot/x-global" "10.1.6" -"@polkadot/x-bigint@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-9.7.2.tgz" - integrity sha512-qi8/DTGypFSt5vvNOsYcEaqH72lymfyidGlsHlZ6e7nNASnEhk/NaOcINiTr1ds+fpu4dtKXWAIPZufujf2JeQ== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/x-global" "9.7.2" - -"@polkadot/x-fetch@^10.1.1": +"@polkadot/x-fetch@^10.1.6": version "10.1.6" - resolved "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-10.1.6.tgz" + resolved "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-10.1.6.tgz#f965d08207a224eda793f3ecfe377a9780aa7ae5" integrity sha512-LxsMtrQCgEC+ySRjS94voxY34OsL5qi4HBo6p8QWuXJB9pCuyGmnuFa8hJ0eMJ1Ne0SRo4gbasKWux6E5b00eg== dependencies: "@babel/runtime" "^7.18.9" @@ -2303,20 +2248,13 @@ "@types/node-fetch" "^2.6.2" node-fetch "^3.2.10" -"@polkadot/x-global@10.1.6", "@polkadot/x-global@^10.1.1": +"@polkadot/x-global@10.1.6", "@polkadot/x-global@^10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/x-global/-/x-global-10.1.6.tgz" integrity sha512-/nraYZg0hdSjbczhDBAsHlEqeZLs0u0xa8HJrfH2lq8+HOIYkQpJPHOqiQIvEe/VFRq7Xnbij+4uffV+otzB/w== dependencies: "@babel/runtime" "^7.18.9" -"@polkadot/x-global@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/x-global/-/x-global-9.7.2.tgz" - integrity sha512-3NN5JhjosaelaFWBJSlv9mb/gDAlt7RuZ8NKlOjB+LQHd9g6ZbnYi5wwjW+i/x/3E4IVbBx66uvWgNaw7IBrkg== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/x-randomvalues@10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-10.1.6.tgz" @@ -2325,14 +2263,6 @@ "@babel/runtime" "^7.18.9" "@polkadot/x-global" "10.1.6" -"@polkadot/x-randomvalues@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-9.7.2.tgz" - integrity sha512-819slnXNpoVtqdhjI19ao7w5m+Zwx11VfwCZkFQypVv3b/1UEoKG/baJA9dVI6yMvhnBN//i8mLgNy3IXWbVVw== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/x-global" "9.7.2" - "@polkadot/x-textdecoder@10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-10.1.6.tgz" @@ -2341,14 +2271,6 @@ "@babel/runtime" "^7.18.9" "@polkadot/x-global" "10.1.6" -"@polkadot/x-textdecoder@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-9.7.2.tgz" - integrity sha512-hhrMNZwJBmusdpqjDRpOHZoMB4hpyJt9Gu9Bi9is7/D/vq/hpxq8z7s6NxrbRyXJf1SIk6NMK0jf5XjRLdKdbw== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/x-global" "9.7.2" - "@polkadot/x-textencoder@10.1.6": version "10.1.6" resolved "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-10.1.6.tgz" @@ -2357,17 +2279,9 @@ "@babel/runtime" "^7.18.9" "@polkadot/x-global" "10.1.6" -"@polkadot/x-textencoder@9.7.2": - version "9.7.2" - resolved "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-9.7.2.tgz" - integrity sha512-GHbSdbMPixDAOnJ9cvL/x9sPNeHegPoDSqCAzY5H6/zHc/fNn0vUu0To9VpPgPhp/Jb9dbc0h8YqEyvOcOlphw== - dependencies: - "@babel/runtime" "^7.18.6" - "@polkadot/x-global" "9.7.2" - -"@polkadot/x-ws@^10.1.1": +"@polkadot/x-ws@^10.1.6": version "10.1.6" - resolved "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-10.1.6.tgz" + resolved "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-10.1.6.tgz#9ea6c3afce12059e617be43d3ead5e57db332115" integrity sha512-PNDM4/fPECz2rTsE3lS+KiF87QN7mrN79yp2CsTHUVYKDg511Hp85wvtGkVgUoA98JWYETpVO7kUR1wSRDf46A== dependencies: "@babel/runtime" "^7.18.9" @@ -2413,23 +2327,24 @@ resolved "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz" integrity sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg== -"@substrate/connect@0.7.9": - version "0.7.9" - resolved "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.9.tgz" - integrity sha512-E6bdBhzsfHNAKlmQSvbTW1jyb0WcIvgbrEBfJ4B6FZ3t1wpGjldL6GrYtegVtKr9/ySQ/pFNn0uVbugukpMDjQ== +"@substrate/connect@0.7.11": + version "0.7.11" + resolved "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.11.tgz#fa9d24991fe9edc7fb771fbdee21a9b7cf6d1322" + integrity sha512-/xiOlkmJfl2XPYQTmyWKEh2AXryEAPSMAxZXs6D/aqYDy0TKZDAp1dfQiHyPt1vMwOlnM4WJv9lPks3ZMwCP+w== dependencies: "@substrate/connect-extension-protocol" "^1.0.1" - "@substrate/smoldot-light" "0.6.25" + "@substrate/smoldot-light" "0.6.30" eventemitter3 "^4.0.7" -"@substrate/smoldot-light@0.6.25": - version "0.6.25" - resolved "https://registry.npmjs.org/@substrate/smoldot-light/-/smoldot-light-0.6.25.tgz" - integrity sha512-OQ9/bnJJy90xSRg5Vp9MIvrgbrVt/r/FwXYSmyLeBBNbJt6o1gSeshVo8icD+2VWwd/TJ2oHl5CVQWe89MyByA== +"@substrate/smoldot-light@0.6.30": + version "0.6.30" + resolved "https://registry.npmjs.org/@substrate/smoldot-light/-/smoldot-light-0.6.30.tgz#a49f4a77f3047bfc1fb9224725a6286e2b709bf1" + integrity sha512-U/F75XzxuNG+KGSujxsMAm8zUBpBON+l0oX19EnSWjvqD+smYjvcj1SeqQhFYxJjtoCQyZLedKBsZGyNbG3FbQ== dependencies: - websocket "^1.0.32" + pako "^2.0.4" + ws "^8.8.1" -"@substrate/ss58-registry@^1.23.0", "@substrate/ss58-registry@^1.28.0": +"@substrate/ss58-registry@^1.28.0": version "1.28.0" resolved "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.28.0.tgz" integrity sha512-XPSwSq4CThLyg+OnZ5/LHh3SPDQjRdGS3Ux5ClgWhRCQamlU86FCT1LBwQ/i+ximbdBfqKRRzVhm1ql3AJ9FKQ== @@ -2491,6 +2406,11 @@ resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz" integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== +"@types/emscripten@*": + version "1.39.6" + resolved "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.6.tgz#698b90fe60d44acf93c31064218fbea93fbfd85a" + integrity sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg== + "@types/eslint-scope@^3.7.3": version "3.7.3" resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" @@ -2655,6 +2575,14 @@ dependencies: "@types/node" "*" +"@types/sql.js@^1.4.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@types/sql.js/-/sql.js-1.4.3.tgz#190393fd9aff683b880b9fbe3b04b4f6a84c5fbd" + integrity sha512-3bz1LJIiJtKMEL8tYf7c9Nrb1lYcFeWQkE8vhWvobE29ZzizW79DtoTjqx1bR82DS2Ch2K30nOwNhuLclZ1vYg== + dependencies: + "@types/emscripten" "*" + "@types/node" "*" + "@types/websocket@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz" @@ -6017,11 +5945,6 @@ ionicons@^6.0.2: dependencies: "@stencil/core" "~2.16.0" -ip-regex@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - ip@^1.1.5: version "1.1.8" resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" @@ -6362,6 +6285,17 @@ jdenticon@^3.1.1: dependencies: canvas-renderer "~2.2.0" +jeep-sqlite@^1.5.5: + version "1.5.7" + resolved "https://registry.npmjs.org/jeep-sqlite/-/jeep-sqlite-1.5.7.tgz#c1f48e94673e9551a15ad83ea5c4f3c49bd75f4e" + integrity sha512-/lxBCs1uw3cvsdZizhxw8Kn/7SX3Xcxel7ifRiokyDekDqH9fpcdBh+W1lCq+u895bYL+l9XoqceT4zqUI5zvA== + dependencies: + "@stencil/core" "^2.17.4" + "@types/sql.js" "^1.4.3" + jszip "^3.7.1" + localforage "^1.10.0" + sql.js "^1.7.0" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" @@ -6504,6 +6438,16 @@ jszip@^3.1.3: readable-stream "~2.3.6" set-immediate-shim "~1.0.1" +jszip@^3.7.1: + version "3.10.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + karma-chrome-launcher@~3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz" @@ -6680,9 +6624,9 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -localforage@^1.9.0: +localforage@^1.10.0, localforage@^1.9.0: version "1.10.0" - resolved "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz" + resolved "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== dependencies: lie "3.1.1" @@ -7565,6 +7509,11 @@ pako@^1.0.3, pako@~1.0.2: resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +pako@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -8759,6 +8708,11 @@ set-immediate-shim@~1.0.1: resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" @@ -9006,6 +8960,11 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sql.js@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/sql.js/-/sql.js-1.7.0.tgz#cadfed9773b643fbba0fc1ed1847e3a647e1fcb9" + integrity sha512-qAfft3xkSgHqmmfNugWTp/59PsqIw8gbeao5TZmpmzQQsAJ49de3iDDKuxVixidYs6dkHNksY8m27v2dZNn2jw== + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" @@ -9805,7 +9764,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -websocket@^1.0.32, websocket@^1.0.34: +websocket@^1.0.34: version "1.0.34" resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== @@ -9892,7 +9851,7 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@^8.4.2: +ws@^8.4.2, ws@^8.8.1: version "8.8.1" resolved "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==