diff --git a/.github/workflows/astar_payout_run.yml b/.github/workflows/fellowship_bumper_run.yml similarity index 80% rename from .github/workflows/astar_payout_run.yml rename to .github/workflows/fellowship_bumper_run.yml index 0e71d7e..9fe280c 100644 --- a/.github/workflows/astar_payout_run.yml +++ b/.github/workflows/fellowship_bumper_run.yml @@ -1,13 +1,12 @@ name: Make astar payouts on: - pull_request: workflow_dispatch: schedule: - - cron: "0 0 * * MON" + - cron: "0 /8 * * *" env: - PAYOUTS_ACCOUNT_MNEMONIC: ${{ secrets.PAYOUTS_ACCOUNT_MNEMONIC }} + BUMP_ACCOUNT_MNEMONIC: ${{ secrets.BUMP_ACCOUNT_MNEMONIC }} jobs: build: @@ -21,7 +20,7 @@ jobs: run: yarn install - name: Run app - run: yarn start:astar + run: yarn start:fellowship telegram-notification: needs: [build] @@ -37,4 +36,4 @@ jobs: message: | 💸 Astar payout failed, see logs for details: - Github run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + Github run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} \ No newline at end of file diff --git a/.github/workflows/kilt_payout_run.yml b/.github/workflows/novasama-fellowship_bumper_run.yml similarity index 78% rename from .github/workflows/kilt_payout_run.yml rename to .github/workflows/novasama-fellowship_bumper_run.yml index b9a036d..e2dbeb2 100644 --- a/.github/workflows/kilt_payout_run.yml +++ b/.github/workflows/novasama-fellowship_bumper_run.yml @@ -1,13 +1,10 @@ name: Make kilt payouts on: - pull_request: workflow_dispatch: - schedule: - - cron: "0 0 * * MON" env: - PAYOUTS_ACCOUNT_MNEMONIC: ${{ secrets.PAYOUTS_ACCOUNT_MNEMONIC }} + BUMP_ACCOUNT_MNEMONIC: ${{ secrets.BUMP_ACCOUNT_MNEMONIC }} jobs: build: @@ -21,8 +18,8 @@ jobs: run: yarn install - name: Run app - run: yarn start:kilt - + run: yarn start:novasama + telegram-notification: needs: [build] runs-on: ubuntu-latest @@ -37,5 +34,4 @@ jobs: message: | 💸 Kilt payout failed, see logs for details: - Github run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - \ No newline at end of file + Github run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} \ No newline at end of file diff --git a/.github/workflows/relaychain_payout_run.yml b/.github/workflows/relaychain_payout_run.yml deleted file mode 100644 index 5873b05..0000000 --- a/.github/workflows/relaychain_payout_run.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Make relaychain payouts - -on: - pull_request: - workflow_dispatch: - schedule: - - cron: "0 */2 * * *" - -env: - PAYOUTS_ACCOUNT_MNEMONIC: ${{ secrets.PAYOUTS_ACCOUNT_MNEMONIC }} - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Install dependencies - run: yarn install - - - name: Run app - run: yarn start:relaychain - - telegram-notification: - needs: [build] - runs-on: ubuntu-latest - if: failure() - steps: - - name: Notify Telegram channel - uses: appleboy/telegram-action@master - with: - to: ${{ secrets.TELEGRAM_TO }} - token: ${{ secrets.TELEGRAM_TOKEN }} - format: markdown - message: | - 💸 Relaychain payout failed, see logs for details: - - Github run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/LICENSE b/LICENSE index 261eeb9..7809ed5 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2025 Novasama Technologies GmbH Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -198,4 +198,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index b7e2f9d..11ae280 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# Payout Rewards -This project is a TypeScript application that automates payouts for Substrate networks. +# Fellowship observer +This project is a TypeScript application that automates Fellowship members and Salary cycles bump on Polkadot Collective chain. ## Configuration The application requires a configuration file located at [src/config/conf.ts](src/config/conf.ts). This file contains the necessary configuration options for the application to run. @@ -7,7 +7,7 @@ The application requires a configuration file located at [src/config/conf.ts](sr ## Required Environment Variables The following environment variable is required for the application to function: -`PAYOUTS_ACCOUNT_MNEMONIC` - the mnemonic for the account that will be used to make payouts. +`BUMP_ACCOUNT_MNEMONIC` - the mnemonic for the account that will be used to make bumps. ## Running the Application The application is designed to be run on a schedule using GitHub Actions. @@ -19,11 +19,9 @@ yarn install Run the app: ```bash -yarn start:relaychain -yarn start:astar -yarn start:kilt +yarn start:fellowship ``` ## License -Validator Observer is available under the Apache 2.0 license. See the LICENSE file for more info. -© Novasama Technologies GmbH 2023 +Fellowship Observer is available under the Apache 2.0 license. See the LICENSE file for more info. +© Novasama Technologies GmbH 2025 \ No newline at end of file diff --git a/package.json b/package.json index 837c894..9985c58 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,13 @@ "description": "Automate payouts", "main": "App.ts", "scripts": { - "start:relaychain": "ts-node src/App.ts 'Relaychain'", - "start:astar": "ts-node src/App.ts 'Astar'", - "start:kilt": "ts-node src/App.ts 'Kilt'" + "start:fellowship": "ts-node src/App.ts 'Fellowship-Collectives'", + "start:novasama": "ts-node src/App.ts 'Novasama-Collectives'" }, "dependencies": { - "@polkadot/api": "^12.1.1", + "@polkadot/api": "^15.3.1", + "@polkadot/types": "15.3.1", "ts-node": "^10.9.1", "typescript": "^5.0.4" } -} +} \ No newline at end of file diff --git a/src/App.ts b/src/App.ts index 6f9361f..dde3ff6 100644 --- a/src/App.ts +++ b/src/App.ts @@ -1,9 +1,8 @@ import { SubstrateConnection } from './connection'; -import { RelaychainConfig, config } from './config/conf'; +import { config } from './config/conf'; import { Sender } from './utils'; -import { getPayoutHelper } from './payoutHelper/PayoutFabric'; -import { VoteHelper } from './voteHelper'; import { configManager } from './config/ConfigManager'; +import {getBumpHelper} from "./memberBumpHelper/BumpFabric"; interface Connections { [network: string]: SubstrateConnection; @@ -13,11 +12,11 @@ async function main(): Promise { const networkType = process.argv[2]; let connections: Connections = {} - if (!config.payoutAccount) { - throw new Error('Payout Account does not set, please provide PAYOUTS_ACCOUNT_MNEMONIC variable') + if (!config.bumpAccount) { + throw new Error('Payout Account does not set, please provide BUMP_ACCOUNT_MNEMONIC variable') } - const sender = new Sender(config.payoutAccount) + const sender = new Sender(config.bumpAccount) const filteredNetworks = configManager(networkType, config) @@ -25,18 +24,14 @@ async function main(): Promise { // Create connection const connection = new SubstrateConnection(network.endpoint); await connection.connect(); - connections[network.name] = connection + connections[network.name] = connection; console.log(`Connected to ${network.name} network`); - // Payout rewards - const payout = getPayoutHelper(network, connections[network.name]); - await payout.payoutRewards(network.validators, sender.generateKeyringPair(), false) + // Bump Fellowship members and salary + const memberBumpHelper = getBumpHelper(network, connections[network.name]); + await memberBumpHelper.bumpMembers(sender.generateKeyringPair()); + await memberBumpHelper.bumpSalaryCycle(sender.generateKeyringPair()); - // OpenGov voting - if (network instanceof RelaychainConfig) { - const voter = new VoteHelper(connections[network.name]); - await voter.checkVotes(network, sender.generateKeyringPair()) - } // Close connection await connection.disconnect(); @@ -46,4 +41,4 @@ async function main(): Promise { main().catch((err) => { console.error(err); process.exit(1); -}); +}); \ No newline at end of file diff --git a/src/config/ConfigManager.ts b/src/config/ConfigManager.ts index c056715..6ae8a47 100644 --- a/src/config/ConfigManager.ts +++ b/src/config/ConfigManager.ts @@ -1,4 +1,4 @@ -import { RelaychainConfig, AstarConfig, Config, KiltConfig } from './conf' +import {FellowshipConfig, NovasamaConfig, Config} from './conf' /** * Function to manage the configuration of the network. @@ -8,10 +8,9 @@ import { RelaychainConfig, AstarConfig, Config, KiltConfig } from './conf' * @throws {Error} - Throws an error if no networks are found for the given type. */ export function configManager(networkType: string, config: Config) { - const filteredNetworks = config.networks.filter(network => - (networkType === 'Relaychain' && network instanceof RelaychainConfig) || - (networkType === 'Astar' && network instanceof AstarConfig) || - (networkType === 'Kilt' && network instanceof KiltConfig) + const filteredNetworks = config.networks.filter(network => + (networkType === 'Fellowship-Collectives' && network instanceof FellowshipConfig) || + (networkType === 'Novasama-Collectives' && network instanceof NovasamaConfig) ); if (filteredNetworks.length === 0) { diff --git a/src/config/conf.ts b/src/config/conf.ts index 9e09a00..96b7467 100644 --- a/src/config/conf.ts +++ b/src/config/conf.ts @@ -16,85 +16,53 @@ export class BaseNetworkConfig { } /** - * Type for Validator configuration. + * Class for Polkadot Collectives network configuration. */ -export type Validator = { - address: string; - votersAccounts: string[]; - voteAmount: number; - voteEnabled: boolean; -}; - -/** - * Class for Relaychain network configuration. - */ -export class RelaychainConfig extends BaseNetworkConfig { - validators: Validator[]; +export class FellowshipConfig extends BaseNetworkConfig { /** * @param {string} name - The name of the network. * @param {string} endpoint - The endpoint of the network. - * @param {Validator[]} validators - The validators of the network. */ - constructor(name: string, endpoint: string, validators: Validator[]) { + constructor(name: string, endpoint: string) { super(name, endpoint); - this.validators = validators; } } /** * Class for Astar network configuration. */ -export class AstarConfig extends BaseNetworkConfig { - validators: Validator[]; +export class NovasamaConfig extends BaseNetworkConfig { /** * @param {string} name - The name of the network. * @param {string} endpoint - The endpoint of the network. - * @param {Validator[]} validators - The validators of the network. */ - constructor(name: string, endpoint: string, validators: Validator[]) { + constructor(name: string, endpoint: string) { super(name, endpoint); - this.validators = validators; } } -/** - * Class for Kilt network configuration. - */ -export class KiltConfig extends BaseNetworkConfig { - validators: Validator[]; - - /** - * @param {string} name - The name of the network. - * @param {string} endpoint - The endpoint of the network. - * @param {string[]} validators - The validators of the network. - */ - constructor(name: string, endpoint: string, validators: Validator[]) { - super(name, endpoint); - this.validators = validators; - } -} /** * Type for Network configuration. */ -export type NetworkConfig = RelaychainConfig | AstarConfig; +export type NetworkConfig = FellowshipConfig | NovasamaConfig; /** * Class for the main configuration. */ export class Config { networks: NetworkConfig[]; - payoutAccount: string | undefined; + bumpAccount: string | undefined; /** * @param {NetworkConfig[]} networks - The networks of the configuration. - * @param {string | undefined} payoutAccount - The payout account of the configuration. + * @param {string | undefined} bumpAccount - The bump account of the configuration. */ - constructor(networks: NetworkConfig[], payoutAccount: string | undefined) { + constructor(networks: NetworkConfig[], bumpAccount: string | undefined) { this.networks = networks; - this.payoutAccount = payoutAccount; + this.bumpAccount = bumpAccount; } } @@ -102,107 +70,12 @@ export class Config { * The main configuration object. */ export const config = new Config([ - new RelaychainConfig( - 'Kusama', - 'wss://rpc-kusama.novasama-tech.org', - [ - { - address: 'DhK6qU2U5kDWeJKvPRtmnWRs8ETUGZ9S9QmNmQFuzrNoKm4', - votersAccounts: ['Day71GSJAxUUiFic8bVaWoAczR3Ue3jNonBZthVHp2BKzyJ'], - voteAmount: 110_000_000_000_000, - voteEnabled: true - }, - { - address: 'EtETk1FbrDg7FoAfkREuXT7xHxCjbEf28sBvWf6zfB5wFyV', - votersAccounts: ['Day71GSJAxUUiFic8bVaWoAczR3Ue3jNonBZthVHp2BKzyJ'], - voteAmount: 10_000_000_000_000, - voteEnabled: true - }, - { - address: 'HYqFHkWAXTdYKYRU49VurZ5YnuT58gX7sVdL9weWi7XeczQ', - votersAccounts: ['Day71GSJAxUUiFic8bVaWoAczR3Ue3jNonBZthVHp2BKzyJ'], - voteAmount: 10_000_000_000_000, - voteEnabled: false - }, - { - address: 'HuehfUJoctKux1gmMaN2d62SMSZEA3cjKfX2zmJkJEaRxwo', - votersAccounts: ['Day71GSJAxUUiFic8bVaWoAczR3Ue3jNonBZthVHp2BKzyJ'], - voteAmount: 10_000_000_000_000, - voteEnabled: false - }, - { - address: 'Gb7iC1jnAJtSaNDoyvmr6aqbcthfhVMocCWiszbQynS6BDi', - votersAccounts: ['Day71GSJAxUUiFic8bVaWoAczR3Ue3jNonBZthVHp2BKzyJ'], - voteAmount: 10_000_000_000_000, - voteEnabled: false - }, - { - address: 'D991k2qmiWrVZzkehGP2QYSLdGH3s2gBvHZzpxQrzX4KSvn', - votersAccounts: ['Day71GSJAxUUiFic8bVaWoAczR3Ue3jNonBZthVHp2BKzyJ'], - voteAmount: 10_000_000_000_000, - voteEnabled: false - } - ] - ), - new RelaychainConfig( - 'Polkadot', - 'wss://rpc-polkadot.novasama-tech.org', - [ - { - address: '127zarPDhVzmCXVQ7Kfr1yyaa9wsMuJ74GJW9Q7ezHfQEgh6', - votersAccounts: ['15cfSaBcTxNr8rV59cbhdMNCRagFr3GE6B3zZRsCp4QHHKPu'], - voteAmount: 50_000_000_000_000, - voteEnabled: true - }, - { - address: '13JuwkvSqGUDo8zErgfC9ivGfKfcdDyceFkvh9NW4wz7NbuF', - votersAccounts: ['15cfSaBcTxNr8rV59cbhdMNCRagFr3GE6B3zZRsCp4QHHKPu'], - voteAmount: 1, - voteEnabled: false - }, - { - address: '15yWjJfhPwiBECjVezPTA42EFpcrxmRUjzPN6nf3azvZ5wDX', - votersAccounts: ['15cfSaBcTxNr8rV59cbhdMNCRagFr3GE6B3zZRsCp4QHHKPu'], - voteAmount: 1, - voteEnabled: false - }, - { - address: '151oCCvw1aZS8TZHzvAj6J3zJec7ZLEKRj6FVWhzVGbTXTG1', - votersAccounts: ['15cfSaBcTxNr8rV59cbhdMNCRagFr3GE6B3zZRsCp4QHHKPu'], - voteAmount: 1, - voteEnabled: false - }, - { - address: '15cfSaBcTxNr8rV59cbhdMNCRagFr3GE6B3zZRsCp4QHHKPu', - votersAccounts: ['15cfSaBcTxNr8rV59cbhdMNCRagFr3GE6B3zZRsCp4QHHKPu'], - voteAmount: 1, - voteEnabled: false - } - ] + new FellowshipConfig( + 'Polkadot Collectives', + 'wss://sys.ibp.network/collectives-polkadot' ), - new AstarConfig( - 'Astar', - 'wss://astar.api.onfinality.io/ws?apikey=8422f83b-f495-4e4b-b3f5-1d1c88a3f940', - [ - { - address: 'X4Hsp6EcxNPypWidz4xuVJhoafLdpShzy5ADpLAJZdqeKwz', - votersAccounts: [], - voteAmount: 0, - voteEnabled: false - } - ] - ), - new KiltConfig( - 'Kilt', - 'wss://kilt-rpc.dwellir.com', - [ - { - address: '4sPMk6DgLbaYHaDKWpwFJQVBv3GupqHJRFWngHeALUrv37x9', - votersAccounts: [], - voteAmount: 0, - voteEnabled: false - } - ] + new NovasamaConfig( + 'Novasama-Collectives', + 'wss://westend-collectives-a-parachain.novasama-tech.org' ) -], process.env.PAYOUTS_ACCOUNT_MNEMONIC); - +], process.env.BUMP_ACCOUNT_MNEMONIC); \ No newline at end of file diff --git a/src/memberBumpHelper/BumpFabric.ts b/src/memberBumpHelper/BumpFabric.ts new file mode 100644 index 0000000..82801d6 --- /dev/null +++ b/src/memberBumpHelper/BumpFabric.ts @@ -0,0 +1,22 @@ +import {BaseNetworkConfig, FellowshipConfig, NovasamaConfig} from "../config/conf"; +import {SubstrateConnection} from "../connection"; +import {BumpHelper} from "./BumpHelper"; +import {FellowshipBumper} from "./bumpers/FellowshipBumper"; + +/** + * Function to get the appropriate BumpHelper based on the network configuration. + * + * @param config - The network configuration. + * @param connection - The connection to the Substrate node. + * @returns A FellowshipHelper instance for the specified network. + * @throws {Error} If the network is not supported. + */ +export function getBumpHelper(config: BaseNetworkConfig, connection: SubstrateConnection): BumpHelper { + if (config instanceof FellowshipConfig) { + return new FellowshipBumper(connection); + } else if (config instanceof NovasamaConfig) { + return new FellowshipBumper(connection); + } else { + throw new Error(`Unsupported network: ${config.name}`); + } +} \ No newline at end of file diff --git a/src/payoutHelper/PayoutHelper.ts b/src/memberBumpHelper/BumpHelper.ts similarity index 70% rename from src/payoutHelper/PayoutHelper.ts rename to src/memberBumpHelper/BumpHelper.ts index f8d115e..2de6d7f 100644 --- a/src/payoutHelper/PayoutHelper.ts +++ b/src/memberBumpHelper/BumpHelper.ts @@ -1,15 +1,14 @@ import { ApiPromise } from '@polkadot/api'; import { SubstrateConnection } from '../connection'; -import { Validator } from '../config/conf'; /** - * Abstract class PayoutHelper that provides a structure for handling payouts. + * Abstract class BumpHelper that provides a structure for handling bumps. */ -export abstract class PayoutHelper { +export abstract class BumpHelper { protected api: ApiPromise; /** - * Constructor for the PayoutHelper class. + * Constructor for the BumpHelper class. * @param connection - The connection to the Substrate node. */ constructor(connection: SubstrateConnection) { @@ -17,13 +16,19 @@ export abstract class PayoutHelper { } /** - * Abstract method to payout rewards for the given validators. - * @param validators - The validators to payout rewards for. + * Abstract method to bump members. * @param sender - The sender of the transaction. - * @param depth - Whether to check the history for unclaimed rewards. - * @returns A promise that resolves when the rewards have been paid out. + * @returns A promise that resolves when members are bumped. */ - public abstract payoutRewards(validators: Validator[], sender, depth: boolean): Promise; + public abstract bumpMembers(sender): Promise; + + /** + * Abstract method to bump salary cycle. + * @param sender - The sender of the transaction. + * @returns A promise that resolves when salary cycle is bumped. + */ + public abstract bumpSalaryCycle(sender): Promise; + /** * Method to retry API calls in case of failure. @@ -47,4 +52,4 @@ export abstract class PayoutHelper { } throw new Error('All retries failed'); } -} +} \ No newline at end of file diff --git a/src/memberBumpHelper/bumpers/FellowshipBumper.ts b/src/memberBumpHelper/bumpers/FellowshipBumper.ts new file mode 100644 index 0000000..1f55f2f --- /dev/null +++ b/src/memberBumpHelper/bumpers/FellowshipBumper.ts @@ -0,0 +1,111 @@ +import {SubstrateConnection} from "../../connection"; +import {BumpHelper} from "../BumpHelper"; +import {sendTransaction} from "../../utils"; +import * as console from "node:console"; + +/** + * FellowshipBumper is a class that extends BumperHelper and provides methods bump Fellowship members + */ +export class FellowshipBumper extends BumpHelper { + + private params; + + constructor(api: SubstrateConnection) { + super(api); + } + /** + * Bump Fellowship members that may be bumped + * + * @param sender - The sender of the transaction. + * @returns A promise that resolves when members are bumped. + */ + async bumpMembers(sender): Promise { + let members = await this.api.query['fellowshipCore'].member.entries(); + let membersRanks = await this.api.query['fellowshipCollective'].members.entries(); + + const memberRanksMap = new Map(); + membersRanks.forEach(([{ args: [account] }, value]) => { + memberRanksMap.set(account.toString(), JSON.parse(value.toString()).rank); + }); + + const currentBlockNumber = await this.getBlockNumber(); + + let accountsToBump: string[] = []; + for (const [{args: [account]}, value] of members) { + let fellowInfo = JSON.parse(value.toString()); + let mayBeBumped = await this.mayBeBumped(memberRanksMap.get(account.toString()), fellowInfo, currentBlockNumber); + if (mayBeBumped) { + accountsToBump.push(account.toString()); + } + } + + if (accountsToBump.length > 0) { + await this.bumpAccounts(accountsToBump, sender); + } + } + + /** + * Bump Fellowship salary cycle + * + * @param sender - The sender of the transaction. + * @returns A promise that resolves when the salary cycle is bumped. + */ + async bumpSalaryCycle(sender): Promise { + let currentCycle = await this.api.query['fellowshipSalary'].status(); + const {cycleIndex, cycleStart} = JSON.parse(currentCycle.toString()); + const registrationPeriod = Number(await this.api.consts['fellowshipSalary'].registrationPeriod.toString()); + const payoutPeriod = Number(await this.api.consts['fellowshipSalary'].payoutPeriod.toString()); + + const currentBlockNumber = await this.getBlockNumber(); + + if (Number(cycleStart) + registrationPeriod + payoutPeriod < currentBlockNumber) { + console.log(`Bumping salary cycle ${cycleIndex}`); + const transaction = this.api.tx.fellowshipSalary.bump(); + await sendTransaction(transaction, sender, this.api); + } + } + + private async getBlockNumber(): Promise { + const { block } = await this.api.rpc.chain.getBlock(); + return block.header.number.toNumber(); + } + + private async mayBeBumped(rank, memberInfo, currentBlockNumber) { + if (!memberInfo.isActive) { + return false; + } + + const {rankMinPromotionPeriod, rankDemotionPeriod} = await this.getRankPromotionAndDemotionPeriod(rank); + + return rankDemotionPeriod > 0 && currentBlockNumber - memberInfo.lastProof > rankDemotionPeriod; + + + } + + private async getRankPromotionAndDemotionPeriod(rank: number) { + if (!this.params) { + await this.loadFellowshipParams(); + } + + const rankMinPromotionPeriod = this.params['minPromotionPeriod'][rank-1]; + const rankDemotionPeriod = this.params['demotionPeriod'][rank-1]; + return {rankMinPromotionPeriod, rankDemotionPeriod}; + } + + private async loadFellowshipParams() { + const params = await this.api.query['fellowshipCore'].params(); + const paramsJson = params.toJSON(); + this.params = paramsJson; + } + + private async bumpAccounts(accounts: string[], sender) { + console.log(`Bumping accounts ${accounts}`); + let transaction; + if (accounts.length > 1) { + transaction = this.api.tx.utility.batchAll(accounts.map(a => this.api.tx.fellowshipCore.bump(a))); + } else { + transaction = this.api.tx.fellowshipCore.bump(accounts[0]); + } + await sendTransaction(transaction, sender, this.api); + } +} \ No newline at end of file diff --git a/src/memberBumpHelper/bumpers/index.ts b/src/memberBumpHelper/bumpers/index.ts new file mode 100644 index 0000000..81b333e --- /dev/null +++ b/src/memberBumpHelper/bumpers/index.ts @@ -0,0 +1 @@ +export { FellowshipBumper } from './FellowshipBumper' \ No newline at end of file diff --git a/src/memberBumpHelper/index.ts b/src/memberBumpHelper/index.ts new file mode 100644 index 0000000..e63962b --- /dev/null +++ b/src/memberBumpHelper/index.ts @@ -0,0 +1 @@ +export { BumpHelper } from './BumpHelper' \ No newline at end of file diff --git a/src/payoutHelper/PayoutFabric.ts b/src/payoutHelper/PayoutFabric.ts deleted file mode 100644 index 9bf6b3a..0000000 --- a/src/payoutHelper/PayoutFabric.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BaseNetworkConfig, RelaychainConfig, AstarConfig, KiltConfig } from "../config/conf"; -import { SubstrateConnection } from "../connection"; -import { PayoutHelper } from "./PayoutHelper"; -import { AstarPayoutHelper, KiltPayoutHelper, RelychainPayoutHelper } from "./payouters"; - -/** - * Function to get the appropriate PayoutHelper based on the network configuration. - * @param config - The network configuration. - * @param connection - The connection to the Substrate node. - * @returns A PayoutHelper instance for the specified network. - * @throws {Error} If the network is not supported. - */ -export function getPayoutHelper(config: BaseNetworkConfig, connection: SubstrateConnection): PayoutHelper { - if (config instanceof RelaychainConfig) { - return new RelychainPayoutHelper(connection); - } else if (config instanceof AstarConfig) { - return new AstarPayoutHelper(connection); - } else if (config instanceof KiltConfig) { - return new KiltPayoutHelper(connection); - } else { - throw new Error(`Unsupported network: ${config.name}`); - } -} diff --git a/src/payoutHelper/index.ts b/src/payoutHelper/index.ts deleted file mode 100644 index 9931444..0000000 --- a/src/payoutHelper/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PayoutHelper } from './PayoutHelper' diff --git a/src/payoutHelper/payouters/AstarPayouter.ts b/src/payoutHelper/payouters/AstarPayouter.ts deleted file mode 100644 index 9a1fcd6..0000000 --- a/src/payoutHelper/payouters/AstarPayouter.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Validator } from "../../config/conf"; -import { sendTransaction } from "../../utils"; -import { PayoutHelper } from "../PayoutHelper"; - -/** - * AstarPayoutHelper is a class that extends PayoutHelper and provides methods to handle payouts on the Astar network. - */ -export class AstarPayoutHelper extends PayoutHelper { - - /** - * Converts an era number to a u32 type. - * @param era - The era number. - * @returns The era number as a u32 type. - */ - private eraIndex(era: number) { - return this.api.createType('u32', era); - } - - /** - * Creates an AstarPrimitivesDappStakingSmartContract type with the given validator address. - * @param dappAddress - The dapp address. - * @returns The AstarPrimitivesDappStakingSmartContract type. - */ - private astarRuntimeSmartContract(dappAddress: string) { - return this.api.createType('AstarPrimitivesDappStakingSmartContract', { 'Evm': dappAddress }); - } - - /** - * Payouts rewards to the given validators. - * @param validators - The validators to payout rewards to. - * @param sender - The sender of the transaction. - * @param depth - Whether to payout rewards for all eras or just the current era. - * @returns A promise that resolves when the rewards have been paid out. - */ - async payoutRewards(validators: Validator[], sender, depth: boolean = false): Promise { - for (const validator of validators) { - const dappAddress = await this.getDAPPAddress(validator.address) - if (dappAddress) { - const erasToPayout = await this.getErasToReward(dappAddress) - await this.processPayout(dappAddress, erasToPayout, sender) - } - } - } - - /** - * Gets the DAPP address for the given validator address. - * @param validatorAddress - The validator address. - * @returns A promise that resolves with the DAPP address or undefined if it doesn't exist. - */ - private async getDAPPAddress(validatorAddress: string): Promise { - const dappAccounts = await this.retryApiCall(() => - this.api.query.dappStaking.integratedDApps.entries() - ); - for (const [key, value] of dappAccounts) { - const onchainValidatorAddress = value.toJSON() as { owner?: string }; - if (onchainValidatorAddress.owner === validatorAddress) { - const serializedData = key.toHuman() as [{ Evm?: string }]; - if ('Evm' in serializedData[0]) { - return serializedData[0].Evm; - } - } - } - throw new Error('Unexpected data type'); - } - - /** - * Gets the eras to reward for the given dapp. - * @param dappAddress - The dapp address. - * @returns A promise that resolves with an array of eras to reward. - */ - private async getErasToReward(dappAddress: string): Promise> { - const rewardEras: Array = []; - const dappInfo = await this.api.query.dappStaking.integratedDApps({ Evm: dappAddress }); - const ourDappId = (dappInfo as any).unwrap().id.toNumber(); - - const rewardsByEra = await this.api.query.dappStaking.dAppTiers.entries(); - - rewardsByEra.forEach(([era, tierRewards]) => { - if ((tierRewards as any).isNone) return; - - const tierDapps = (tierRewards as any).unwrap().dapps; - const dapps: Array<{ dappId: number, tierId: number }> = []; - tierDapps.forEach((value, key) => { - dapps.push({ - dappId: key.toNumber(), - tierId: value.toNumber(), - }); - }); - - const ourUnclaimedTier = dapps.find(({ dappId }) => dappId === ourDappId); - if (ourUnclaimedTier) { - const eraHumanReadable = era.toHuman() as string; - rewardEras.push(eraHumanReadable[0]); - } - }); - - return rewardEras; - } - - /** - * Processes the payout for the given dapp address and reward eras. - * @param dappAddress - The dapp address. - * @param rewardEras - The reward eras. - * @param sender - The sender of the transaction. - * @param batch_size - The size of the batch of transactions to send. - * @returns A promise that resolves when the payout has been processed. - */ - private async processPayout(dappAddress: string, rewardEras: Array, sender: any, batch_size: number = 20) { - const transactions: any = []; - rewardEras = rewardEras.reverse(); - - for (let i = 0; i < rewardEras.length; i += batch_size) { - const batch = rewardEras.slice(i, i + batch_size).map(era => - this.api.tx.dappStaking.claimDappReward( - this.astarRuntimeSmartContract(dappAddress), - this.eraIndex(Number(era)) - ) - ) - transactions.push(this.api.tx.utility.batch(batch)); - } - - for (const transaction of transactions) { - await sendTransaction(transaction, sender, this.api); - } - } -} diff --git a/src/payoutHelper/payouters/KiltPayouter.ts b/src/payoutHelper/payouters/KiltPayouter.ts deleted file mode 100644 index 2e0496b..0000000 --- a/src/payoutHelper/payouters/KiltPayouter.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Validator } from "../../config/conf"; -import { sendTransaction } from "../../utils"; -import { PayoutHelper } from "../PayoutHelper"; -import { AnyJson } from '@polkadot/types/types'; - -/** - * KiltPayoutHelper is a class that extends PayoutHelper and provides methods to handle payouts on the Kilt network. - */ -export class KiltPayoutHelper extends PayoutHelper { - - /** - * Payouts rewards to the given validators. - * @param validators - The validators to payout rewards to. - * @param sender - The sender of the transaction. - * @param depth - Whether to payout rewards for all eras or just the current era. - * @returns A promise that resolves when the rewards have been paid out. - */ - async payoutRewards(validators: Validator[], sender, depth: boolean = false): Promise { - for (const validator of validators) { - if (await this.needIncrement(validator.address)) { - await this.incrementDelegatorRewards(validator.address, sender); - } - - if (await this.needClaim(validator.address)) { - await this.claimRewards(validator.address, sender); - } - } - } - - /** - * Increments the rewards for a given validator. - * @param validator - The validator to increment rewards for. - * @param sender - The sender of the transaction. - * @returns A promise that resolves when the rewards have been incremented. - */ - private async incrementDelegatorRewards(validator: string, sender: any): Promise { - const incrementDelegatorRewards = this.api.tx.parachainStaking.incrementDelegatorRewards(); - const proxyIncrementTransact = this.api.tx.proxy.proxy( - validator, - 'ParachainStaking', - incrementDelegatorRewards - ); - await sendTransaction(proxyIncrementTransact, sender, this.api); - } - - /** - * Checks if increment is needed for a given validator. - * @param validator - The validator to check. - * @returns A promise that resolves with a boolean indicating if increment is needed. - */ - private async needIncrement(validator: string): Promise { - console.log(`Checking if increment is needed for validator: ${validator}`); - - const delegatorState = await this.retryApiCall(() => - this.api.query.parachainStaking.delegatorState(validator) - ); - - const delegatorStateJson = delegatorState.toJSON(); - const owner = (delegatorStateJson as { [index: string]: AnyJson }).owner; - console.log(`Owner for validator ${validator}: ${owner}`); - - const blockRewarded = await this.retryApiCall(() => - this.api.query.parachainStaking.blocksRewarded(owner) - ); - console.log(`Blocks rewarded for owner ${owner}: ${blockRewarded}`); - - const blockAuthored = await this.retryApiCall(() => - this.api.query.parachainStaking.blocksAuthored(owner) - ); - console.log(`Blocks authored for owner ${owner}: ${blockAuthored}`); - - return (Number(blockAuthored) - Number(blockRewarded)) > 0; - } - - /** - * Checks if claim is needed for a given validator. - * @param validator - The validator to check. - * @returns A promise that resolves with a boolean indicating if claim is needed. - */ - private async needClaim(validator: string): Promise { - console.log(`Checking if claim is needed for validator: ${validator}`); - - const rewardsToClaim = await this.retryApiCall(() => - this.api.query.parachainStaking.rewards(validator) - ); - - return Number(rewardsToClaim) > 0; - } - - /** - * Claims the rewards for a given validator. - * @param validator - The validator to claim rewards for. - * @param sender - The sender of the transaction. - * @returns A promise that resolves when the rewards have been claimed. - */ - private async claimRewards(validator: string, sender: any): Promise { - const claimReward = this.api.tx.parachainStaking.claimRewards(); - const proxyclaimTransact = this.api.tx.proxy.proxy( - validator, - 'ParachainStaking', - claimReward, - ); - await sendTransaction(proxyclaimTransact, sender, this.api); - } -} diff --git a/src/payoutHelper/payouters/NewRelaychainPayoutLogic.ts b/src/payoutHelper/payouters/NewRelaychainPayoutLogic.ts deleted file mode 100644 index 6b60e5e..0000000 --- a/src/payoutHelper/payouters/NewRelaychainPayoutLogic.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { SubmittableExtrinsic } from "@polkadot/api/types"; -import { Validator } from "../../config/conf"; -import { sendTransaction } from "../../utils"; -import { PayoutHelper } from "../PayoutHelper"; - -/*** - * New logic to handle payouts if erasStakersOverview exists. - */ -export class NewRelaychainPayoutLogic extends PayoutHelper { - - /** - * New method to handle payouts if erasStakersOverview exists. - * @param validators - The validators to payout rewards for. - * @param sender - The sender of the transaction. - * @param depth - Whether to check the history for unclaimed rewards. - */ - async payoutRewards(validators: Validator[], sender, depth: boolean = false): Promise { - const currentEra = await this.getCurrentEraNumber(); - const eraToReward = currentEra - 1 - const historyDepth = this.getHistoryDepth(); - const startEra = Math.max(eraToReward - historyDepth, 0); - const transactions: Array> = []; - - await this.collectTransactionsForUnclaimedRewards(startEra, currentEra, validators, transactions); - await this.executeTransactionsInBatches(transactions, sender, 2); - } - - /** - * Collects transactions for unclaimed rewards for validators within a specified era range. - * @param startEra The starting era from which to collect unclaimed rewards. - * @param currentEra The current era up to which to check for unclaimed rewards. - * @param validators An array of validators for whom to check unclaimed rewards. - * @param transactions An array to which the payout transactions will be added. - */ - private async collectTransactionsForUnclaimedRewards(startEra: number, currentEra: number, validators: Validator[], transactions: Array>): Promise { - for (let era = startEra; era < currentEra; era++) { - for (const validator of validators) { - const eraStakersOverview = (await this.api.query.staking.erasStakersOverview(era, validator.address)).toJSON() || {}; - if (Object.keys(eraStakersOverview).length === 0) continue; - - const claimedPages = (await this.api.query.staking.claimedRewards(era, validator.address)).toJSON(); - // @ts-ignore - if (!claimedPages || claimedPages.length === 0) { - const transaction = this.api.tx.staking.payoutStakers(validator.address, era); - transactions.push(transaction); - } - } - } - } - - /** - * Executes transactions in batches of a specified size. - * @param transactions An array of transactions to be executed. - * @param sender The sender of the transactions. - * @param size The number of transactions to include in each batch. Defaults to 4. - */ - private async executeTransactionsInBatches(transactions: Array>, sender, size: number = 4): Promise { - for (let i = 0; i < transactions.length; i += size) { - const batchTransactions = transactions.slice(i, i + size); - const batchTransaction = this.api.tx.utility.forceBatch(batchTransactions); - await sendTransaction(batchTransaction, sender, this.api); - } - } - - /** - * Retrieves the current era number from the blockchain. - * @returns {Promise} The current era as a number. - */ - private async getCurrentEraNumber(): Promise { - const currentEra = await this.api.query.staking.currentEra(); - // @ts-ignore - return currentEra.unwrap().toNumber(); - } - - /** - * Fetches the history depth value from the blockchain constants. - * @returns {number} The history depth as a number. - */ - private getHistoryDepth(): number { - return Number(this.api.consts.staking.historyDepth.toString()); - } -} diff --git a/src/payoutHelper/payouters/RelaychainPayouter.ts b/src/payoutHelper/payouters/RelaychainPayouter.ts deleted file mode 100644 index 800c34c..0000000 --- a/src/payoutHelper/payouters/RelaychainPayouter.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Validator } from "../../config/conf"; -import { sendTransaction } from "../../utils"; -import { PayoutHelper } from "../PayoutHelper"; -import { NewRelaychainPayoutLogic } from "./NewRelaychainPayoutLogic"; -import { SubstrateConnection } from "../../connection"; - -/** - * RelychainPayoutHelper is a class that extends PayoutHelper and provides methods to handle payouts on the Relychain network. - */ -export class RelychainPayoutHelper extends PayoutHelper { - private newPayoutLogic: NewRelaychainPayoutLogic; - - constructor(api: SubstrateConnection) { - super(api); - this.newPayoutLogic = new NewRelaychainPayoutLogic(api); - } - /** - * Payout rewards for the given validators. - * @param validators - The validators to payout rewards for. - * @param sender - The sender of the transaction. - * @param depth - Whether to check the history for unclaimed rewards. - * @returns A promise that resolves when the rewards have been paid out. - */ - async payoutRewards(validators: Validator[], sender, depth: boolean = false): Promise { - if (this.api.query.staking.erasStakersOverview) { - await this.newPayoutLogic.payoutRewards(validators, sender, depth); - } else { - for (const validator of validators) { - const unclaimedPayouts = await this.checkPayouts(validator.address, depth); - for (const payout of unclaimedPayouts) { - await this.payout(validator.address, payout, sender); - } - } - } - } - - /** - * Payout the rewards for a given validator and era. - * @param validatorAddress - The address of the validator. - * @param era - The era to payout rewards for. - * @param sender - The sender of the transaction. - * @returns A promise that resolves when the rewards have been paid out. - */ - private async payout(validatorAddress: string, era: number, sender): Promise { - const transaction = this.api.tx.staking.payoutStakers(validatorAddress, era); - await sendTransaction(transaction, sender, this.api); - } - - /** - * Check for unclaimed payouts for a given validator. - * @param validatorAddress - The address of the validator. - * @param depth - Whether to check the history for unclaimed rewards. - * @returns A promise that resolves with an array of unclaimed payout eras. - */ - private async checkPayouts(validatorAddress: string, depth): Promise { - - // @ts-ignore - const currentEra = (await this.api.query.staking.activeEra()).unwrapOr(null); - const lastReward = await this.getLastReward(validatorAddress, depth); - const numOfPotentialUnclaimedPayouts = currentEra.index - lastReward - 1; - const unclaimedPayouts: number[] = []; - - for (let i = 1; i <= numOfPotentialUnclaimedPayouts; i++) { - const idx = lastReward + i; - const exposure = (await this.api.query.staking.erasStakers(idx, validatorAddress)).toJSON(); - if (Number(exposure!['total']) > 0) { - unclaimedPayouts.push(idx); - } - } - return unclaimedPayouts; - } - - /** - * Get the last reward era for a given validator. - * @param validatorAddress - The address of the validator. - * @param isHistoryCheckForced - Whether to force a check of the history for unclaimed rewards. - * @returns A promise that resolves with the era of the last reward. - */ - private async getLastReward(validatorAddress: string, isHistoryCheckForced = false): Promise { - const ledger = (await this.api.derive.staking.account(validatorAddress)).stakingLedger; - let lastReward: number; - const rewards = ledger.claimedRewards || ledger.legacyClaimedRewards; // Workaround for the Kusama upgrade - // TODO: Remove the workaround and check the logic for reward payout - - if (isHistoryCheckForced || rewards.length == 0) { - // @ts-ignore - lastReward = this.api.consts.staking.historyDepth.toNumber(); - } else { - lastReward = rewards.pop().toNumber(); - } - return lastReward; - } -} diff --git a/src/payoutHelper/payouters/index.ts b/src/payoutHelper/payouters/index.ts deleted file mode 100644 index 0ef4311..0000000 --- a/src/payoutHelper/payouters/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { AstarPayoutHelper } from './AstarPayouter' -export { RelychainPayoutHelper } from './RelaychainPayouter' -export { KiltPayoutHelper } from './KiltPayouter' diff --git a/src/utils/Sender.ts b/src/utils/Sender.ts index 66198c1..a5ecd0a 100644 --- a/src/utils/Sender.ts +++ b/src/utils/Sender.ts @@ -9,8 +9,8 @@ export class Sender { generateKeyringPair(): any { const keyring = new Keyring(); - const pair = keyring.createFromUri(this.mnemonic, undefined, 'sr25519'); + const pair = keyring.createFromUri(this.mnemonic, {}, 'sr25519'); return pair; } -} +} \ No newline at end of file diff --git a/src/voteHelper/VoteHelper.ts b/src/voteHelper/VoteHelper.ts deleted file mode 100644 index 46790e4..0000000 --- a/src/voteHelper/VoteHelper.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { ApiPromise } from '@polkadot/api'; -import { SubstrateConnection } from '../connection/SubstrateConnection'; -import { RelaychainConfig, Validator } from '../config/conf'; -import { sendTransaction } from '../utils'; -import { Referendum } from './referendum'; -import { AbstainVote, StandardVote, TrackVotes, Vote } from './votes'; - -export class VoteHelper { - private api: ApiPromise; - - constructor(connection: SubstrateConnection) { - this.api = connection.getApi(); - } - - async checkVotes(network: RelaychainConfig, sender): Promise { - const ongoingReferena = await this.getOngoingReferenda(); - - for (const validator of network.validators) { - if (!validator.voteEnabled) continue; - - const potentialVotes = await this.getPotentialVotes(validator, ongoingReferena); - const newVotes = await this.decideHowToVote(validator.address, potentialVotes); - - for (const vote of newVotes) { - await this.voteForReferenda(vote, sender, validator.address, validator.voteAmount); - } - } - } - - async getOngoingReferenda(): Promise { - const referendums = await this.api.query.referenda.referendumInfoFor.entries(); - const castedReferendums = referendums.map(([key, value]) => new Referendum(key, value)); - return castedReferendums.filter(referendum => referendum.data.ongoing); - } - - async getAccountVotes(accountAddress: string): Promise { - const referendaTracks = this.api.consts.referenda.tracks; - const trackArray = (referendaTracks as any).map(([key, value]) => new TrackVotes(key, value)); - const accountVotes: Vote[] = []; - - for (const track of trackArray) { - const votesInTrack = await this.api.query.convictionVoting.votingFor(accountAddress, track.trackNumber); - - if ((votesInTrack as any).isDelegating) continue; - - (votesInTrack as any).asCasting.votes.map((voteData) => { - const vote = Vote.createVote(voteData); - accountVotes.push(vote); - }); - } - - return accountVotes; - } - - async getPotentialVotes(validator: Validator, referendums: Referendum[]): Promise { - const uniqueVotes = new Set(); - const newVoteForReferenda: Vote[] = []; - const abstainVotes: Vote[] = []; - const referendaNumbers = new Set(referendums.map(referendum => referendum.number)); - - for (const account of validator.votersAccounts) { - const voterVotes = await this.getAccountVotes(account); - const relevantVotes = voterVotes.filter(vote => referendaNumbers.has(vote.referendaNumber)); - - for (const vote of relevantVotes) { - if (!uniqueVotes.has(vote.referendaNumber)) { - uniqueVotes.add(vote.referendaNumber); - newVoteForReferenda.push(vote); - } - } - } - - for (const referenda of referendums) { - if (!uniqueVotes.has(referenda.number)) { - // Create an abstain vote for the referenda - const abstainVote = new AbstainVote({ - referendaNumber: referenda.number, - data: { - SplitAbstain: { - aye: "0", - nay: "0", - abstain: validator.voteAmount, - }, - } - }); - abstainVotes.push(abstainVote); - } - } - - // Combine the new votes and abstain votes - const combinedVotes = [...newVoteForReferenda, ...abstainVotes]; - - return combinedVotes; - } - - async decideHowToVote(validator: string, potentialVotes: Vote[]): Promise { - const validatorVotes = await this.getAccountVotes(validator); - return potentialVotes.filter(potentialVote => { - const validatorVote = validatorVotes.find(v => v.referendaNumber == potentialVote.referendaNumber); - return this.shouldChangeVote(validatorVote, potentialVote); - }); - } - - shouldChangeVote(validatorVote: Vote | undefined, potentialVote: Vote): boolean { - if (validatorVote == undefined) return true; - if (validatorVote instanceof AbstainVote && potentialVote instanceof AbstainVote) return false; - if (validatorVote instanceof StandardVote && potentialVote instanceof StandardVote) return validatorVote.direction != potentialVote.direction; - return true; - } - - async voteForReferenda(vote: Vote, sender, validator: string, balance: number): Promise { - const constructedVote = vote.createPayload(this.api, balance); - const voteTransaction = this.api.tx.convictionVoting.vote(vote.referendaNumber, constructedVote); - const proxyTransaction = this.api.tx.proxy.proxy(validator, 'Governance', voteTransaction); - await sendTransaction(proxyTransaction, sender, this.api); - } -} diff --git a/src/voteHelper/index.ts b/src/voteHelper/index.ts deleted file mode 100644 index b408d65..0000000 --- a/src/voteHelper/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { VoteHelper } from "./VoteHelper"; diff --git a/src/voteHelper/referendum/Referendum.ts b/src/voteHelper/referendum/Referendum.ts deleted file mode 100644 index 50c2b35..0000000 --- a/src/voteHelper/referendum/Referendum.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class Referendum { - number: number; - data: any; - - constructor(referendaNumber, referendaData) { - this.number = Number(referendaNumber.toHuman()[0].replace(/,/g, '')); - this.data = { ...referendaData.toJSON() }; - } -} diff --git a/src/voteHelper/referendum/index.ts b/src/voteHelper/referendum/index.ts deleted file mode 100644 index a409568..0000000 --- a/src/voteHelper/referendum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Referendum' \ No newline at end of file diff --git a/src/voteHelper/votes/AbstainVote.ts b/src/voteHelper/votes/AbstainVote.ts deleted file mode 100644 index 9af5b16..0000000 --- a/src/voteHelper/votes/AbstainVote.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ApiPromise } from '@polkadot/api'; -import { Vote } from './Vote'; - -export class AbstainVote extends Vote { - direction: boolean; - abstain: boolean; - - constructor(voteData) { - super(voteData); - this.abstain = false; - this.direction = false; - this.decideDirection(); - } - - private decideDirection(): void { - const { aye, nay, abstain } = this.data?.SplitAbstain; - this.direction = parseInt(aye) > Math.max(parseInt(nay), parseInt(abstain)); - this.abstain = parseInt(abstain) > Math.max(parseInt(aye), parseInt(nay)); - } - - public createPayload(api: ApiPromise, balance: any) { - return api.createType('PalletConvictionVotingVoteAccountVote', { - 'SplitAbstain': { - 'aye': 0, - 'nay': 0, - 'abstain': balance - } - }); - } -} diff --git a/src/voteHelper/votes/SplitVote.ts b/src/voteHelper/votes/SplitVote.ts deleted file mode 100644 index 25dd45c..0000000 --- a/src/voteHelper/votes/SplitVote.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ApiPromise } from '@polkadot/api'; -import { Vote } from './Vote'; - -export class SplitVote extends Vote { - direction: boolean; - - constructor(voteData) { - super(voteData); - this.direction = this.decideAyeNay(); - } - - private decideAyeNay() { - const aye = parseInt(this.data?.Split?.aye.replace(/,/g, '')); - const nay = parseInt(this.data?.Split?.nay.replace(/,/g, '')); - return aye >= nay; - } - - public createPayload(api: ApiPromise, balance: any) { - return api.createType('PalletConvictionVotingVoteAccountVote', { - 'Standard': { - 'vote': { - 'aye': this.direction, - 'conviction': 'Locked1x', - }, - 'balance': balance - } - }); - - } -} diff --git a/src/voteHelper/votes/StandardVote.ts b/src/voteHelper/votes/StandardVote.ts deleted file mode 100644 index 3159b30..0000000 --- a/src/voteHelper/votes/StandardVote.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ApiPromise } from '@polkadot/api'; -import { Vote } from './Vote'; - -export class StandardVote extends Vote { - direction: boolean; - - constructor(voteData) { - super(voteData); - this.direction = this.decideDirection(); - } - - private decideDirection(): boolean { - const vote = this.data?.Standard?.vote?.vote; - if (vote === "Aye") { - return true; - } else if (vote === "Nay") { - return false; - } else { - throw new Error(`Unexpected vote value: ${vote}`); - } - } - - public createPayload(api: ApiPromise, balance: any) { - return api.createType('PalletConvictionVotingVoteAccountVote', { - 'Standard': { - 'vote': { - 'aye': this.direction, - 'conviction': 'Locked1x', - }, - 'balance': balance - } - }); - - } -} diff --git a/src/voteHelper/votes/TrackVotes.ts b/src/voteHelper/votes/TrackVotes.ts deleted file mode 100644 index 289ee12..0000000 --- a/src/voteHelper/votes/TrackVotes.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class TrackVotes { - trackNumber: number; - data: any; - - constructor(trackNumber, trackVotes) { - this.trackNumber = Number(trackNumber.toHuman()); - this.data = trackVotes; - } -} diff --git a/src/voteHelper/votes/Vote.ts b/src/voteHelper/votes/Vote.ts deleted file mode 100644 index d19209a..0000000 --- a/src/voteHelper/votes/Vote.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ApiPromise } from '@polkadot/api'; -import { Codec } from '@polkadot/types-codec/types'; -import { AbstainVote, StandardVote, SplitVote } from './'; - -export abstract class Vote { - referendaNumber: number; - data: any; - direction?: boolean; - - constructor(voteData) { - if (voteData.referendaNumber) { - this.referendaNumber = voteData.referendaNumber; - this.data = voteData.data; - return; - } - this.buildData({ ...voteData.toHuman() }); - this.referendaNumber = Number(voteData.toHuman()[0].replace(/,/g, '')); - } - - abstract createPayload(api: ApiPromise, balance: any): Codec; - - private buildData(data: any) { - const key = Object.keys(data[1])[0]; - const vote = data[1][key]; - this.data = { - [key]: vote - }; - } - - static createVote(voteData) { - const voteType = voteData[1]; - if (voteType.isStandard) { - return new StandardVote(voteData); - } else if (voteType.isSplitAbstain) { - return new AbstainVote(voteData); - } else if (voteType.isSplit) { - return new SplitVote(voteData); - } else { - throw new Error(`Unexpected vote type: ${voteData}`) - } - } -} diff --git a/src/voteHelper/votes/index.ts b/src/voteHelper/votes/index.ts deleted file mode 100644 index b95bb7a..0000000 --- a/src/voteHelper/votes/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './AbstainVote' -export * from './SplitVote' -export * from './StandardVote' -export * from './TrackVotes' -export * from './Vote' \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 3f464cc..480c915 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,426 +44,470 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@polkadot-api/json-rpc-provider-proxy@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.0.1.tgz#bb5c943642cdf0ec7bc48c0a2647558b9fcd7bdb" - integrity sha512-gmVDUP8LpCH0BXewbzqXF2sdHddq1H1q+XrAW2of+KZj4woQkIGBRGTJHeBEVHe30EB+UejR1N2dT4PO/RvDdg== +"@polkadot-api/json-rpc-provider-proxy@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.1.0.tgz#6e191f28e7d0fbbe8b540fc51d12a0adaeba297e" + integrity sha512-8GSFE5+EF73MCuLQm8tjrbCqlgclcHBSRaswvXziJ0ZW7iw3UEMsKkkKvELayWyBuOPa2T5i1nj6gFOeIsqvrg== -"@polkadot-api/json-rpc-provider@0.0.1": +"@polkadot-api/json-rpc-provider@0.0.1", "@polkadot-api/json-rpc-provider@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1.tgz#333645d40ccd9bccfd1f32503f17e4e63e76e297" integrity sha512-/SMC/l7foRjpykLTUTacIH05H3mr9ip8b5xxfwXlVezXrNVLp3Cv0GX6uItkKd+ZjzVPf3PFrDF2B2/HLSNESA== -"@polkadot-api/metadata-builders@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/metadata-builders/-/metadata-builders-0.0.1.tgz#a76b48febef9ea72be8273d889e2677101045a05" - integrity sha512-GCI78BHDzXAF/L2pZD6Aod/yl82adqQ7ftNmKg51ixRL02JpWUA+SpUKTJE5MY1p8kiJJIo09P2um24SiJHxNA== +"@polkadot-api/metadata-builders@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@polkadot-api/metadata-builders/-/metadata-builders-0.3.2.tgz#007f158c9e0546cf79ba440befc0c753ab1a6629" + integrity sha512-TKpfoT6vTb+513KDzMBTfCb/ORdgRnsS3TDFpOhAhZ08ikvK+hjHMt5plPiAX/OWkm1Wc9I3+K6W0hX5Ab7MVg== dependencies: - "@polkadot-api/substrate-bindings" "0.0.1" - "@polkadot-api/utils" "0.0.1" + "@polkadot-api/substrate-bindings" "0.6.0" + "@polkadot-api/utils" "0.1.0" -"@polkadot-api/observable-client@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@polkadot-api/observable-client/-/observable-client-0.1.0.tgz#472045ea06a2bc4bccdc2db5c063eadcbf6f5351" - integrity sha512-GBCGDRztKorTLna/unjl/9SWZcRmvV58o9jwU2Y038VuPXZcr01jcw/1O3x+yeAuwyGzbucI/mLTDa1QoEml3A== +"@polkadot-api/observable-client@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@polkadot-api/observable-client/-/observable-client-0.3.2.tgz#fd91efee350595a6e0ecfd3f294cc80de86c0cf7" + integrity sha512-HGgqWgEutVyOBXoGOPp4+IAq6CNdK/3MfQJmhCJb8YaJiaK4W6aRGrdQuQSTPHfERHCARt9BrOmEvTXAT257Ug== dependencies: - "@polkadot-api/metadata-builders" "0.0.1" - "@polkadot-api/substrate-bindings" "0.0.1" - "@polkadot-api/substrate-client" "0.0.1" - "@polkadot-api/utils" "0.0.1" + "@polkadot-api/metadata-builders" "0.3.2" + "@polkadot-api/substrate-bindings" "0.6.0" + "@polkadot-api/utils" "0.1.0" -"@polkadot-api/substrate-bindings@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-bindings/-/substrate-bindings-0.0.1.tgz#c4b7f4d6c3672d2c15cbc6c02964f014b73cbb0b" - integrity sha512-bAe7a5bOPnuFVmpv7y4BBMRpNTnMmE0jtTqRUw/+D8ZlEHNVEJQGr4wu3QQCl7k1GnSV1wfv3mzIbYjErEBocg== +"@polkadot-api/substrate-bindings@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-bindings/-/substrate-bindings-0.6.0.tgz#889b0c3ba19dc95282286506bf6e370a43ce119a" + integrity sha512-lGuhE74NA1/PqdN7fKFdE5C1gNYX357j1tWzdlPXI0kQ7h3kN0zfxNOpPUN7dIrPcOFZ6C0tRRVrBylXkI6xPw== dependencies: "@noble/hashes" "^1.3.1" - "@polkadot-api/utils" "0.0.1" + "@polkadot-api/utils" "0.1.0" "@scure/base" "^1.1.1" scale-ts "^1.6.0" -"@polkadot-api/substrate-client@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-client/-/substrate-client-0.0.1.tgz#0e8010a0abe2fb47d6fa7ab94e45e1d0de083314" - integrity sha512-9Bg9SGc3AwE+wXONQoW8GC00N3v6lCZLW74HQzqB6ROdcm5VAHM4CB/xRzWSUF9CXL78ugiwtHx3wBcpx4H4Wg== +"@polkadot-api/substrate-client@^0.1.2": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@polkadot-api/substrate-client/-/substrate-client-0.1.4.tgz#7a808e5cb85ecb9fa2b3a43945090a6c807430ce" + integrity sha512-MljrPobN0ZWTpn++da9vOvt+Ex+NlqTlr/XT7zi9sqPtDJiQcYl+d29hFAgpaeTqbeQKZwz3WDE9xcEfLE8c5A== + dependencies: + "@polkadot-api/json-rpc-provider" "0.0.1" + "@polkadot-api/utils" "0.1.0" -"@polkadot-api/utils@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@polkadot-api/utils/-/utils-0.0.1.tgz#908b22becac705149d7cc946532143d0fb003bfc" - integrity sha512-3j+pRmlF9SgiYDabSdZsBSsN5XHbpXOAce1lWj56IEEaFZVjsiCaxDOA7C9nCcgfVXuvnbxqqEGQvnY+QfBAUw== - -"@polkadot/api-augment@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-12.1.1.tgz#438687c5092ea9401e2ce6aa59d42ac8c4208319" - integrity sha512-x2cI4mt4y2DZ8b8BoxchlkkpdmvhmOqCLr7IHPcQGaHsA/oLYSgZk8YSvUFb6+W3WjnIZiNMzv/+UB9jQuGQ2Q== - dependencies: - "@polkadot/api-base" "12.1.1" - "@polkadot/rpc-augment" "12.1.1" - "@polkadot/types" "12.1.1" - "@polkadot/types-augment" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/api-base@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-12.1.1.tgz#a90d0e87fe4cb2cf331b4bc783d24bd247ebdcd7" - integrity sha512-/zLnekv5uFnjzYWhjUf6m0WOJorA0Qm/CWg7z6V+INnacDmVD+WIgYW+XLka90KXpW92sN5ycZEdcQGKBxSJOg== - dependencies: - "@polkadot/rpc-core" "12.1.1" - "@polkadot/types" "12.1.1" - "@polkadot/util" "^12.6.2" +"@polkadot-api/utils@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@polkadot-api/utils/-/utils-0.1.0.tgz#d36937cdc465c2ea302f3278cf53157340ab33a0" + integrity sha512-MXzWZeuGxKizPx2Xf/47wx9sr/uxKw39bVJUptTJdsaQn/TGq+z310mHzf1RCGvC1diHM8f593KrnDgc9oNbJA== + +"@polkadot/api-augment@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-15.5.1.tgz#2afbad2e7222aa9d8f7720c00da30d79af19e7a4" + integrity sha512-ZDSiaBcy8OT8FWI5WWnVqdi4jWBcUpiAdSO3FdZarAN9Hp2sbaUSM5zt8NkLsFtnsQxgZXGzVCbxNojBj7XAlg== + dependencies: + "@polkadot/api-base" "15.5.1" + "@polkadot/rpc-augment" "15.5.1" + "@polkadot/types" "15.5.1" + "@polkadot/types-augment" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/api-base@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-15.5.1.tgz#76d7d5eb4523dd15269b665c12970652030254e8" + integrity sha512-sTcTICj4UEmM9PnIjBFQvHQrZNnRfGA2IipHo6HjzmZ9JpX+9+zjqcq4xZP+4pfP7upKYCzgWN0Si/6BEpNGFw== + dependencies: + "@polkadot/rpc-core" "15.5.1" + "@polkadot/types" "15.5.1" + "@polkadot/util" "^13.3.1" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/api-derive@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-12.1.1.tgz#fd7eca04d8887ad954ab0832a4aac8d3fe5f859e" - integrity sha512-VMwHcQY8gU/fhwgRICs9/EwTZVMSWW9Gf1ktwsWQmNM1RnrR6oN4/hvzsQor4Be/mC93w2f8bX/71QVmOgL5NA== - dependencies: - "@polkadot/api" "12.1.1" - "@polkadot/api-augment" "12.1.1" - "@polkadot/api-base" "12.1.1" - "@polkadot/rpc-core" "12.1.1" - "@polkadot/types" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" + tslib "^2.8.1" + +"@polkadot/api-derive@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-15.5.1.tgz#1dd7bf8477a6a3d25f04d3078406e58b9e6d0f35" + integrity sha512-8NO/h/ieYy7c7NubvuK/zpxcwJBoqbB6x4o6LfXTkvsv+ePq7WcPw3W0+c6Qo+QZd+OgtrvfT9OzobfxfzKk6g== + dependencies: + "@polkadot/api" "15.5.1" + "@polkadot/api-augment" "15.5.1" + "@polkadot/api-base" "15.5.1" + "@polkadot/rpc-core" "15.5.1" + "@polkadot/types" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/util" "^13.3.1" + "@polkadot/util-crypto" "^13.3.1" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/api@12.1.1", "@polkadot/api@^12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-12.1.1.tgz#615e3c3e07e1674c9b2254419f778f8c01ecd6cc" - integrity sha512-XvX1gRUsnHDkEARBS1TAFCXncp6YABf/NCtOBt8FohokSzvB6Kxrcb6zurMbUm2piOdjgW5xsG3TCDRw6vACLA== - dependencies: - "@polkadot/api-augment" "12.1.1" - "@polkadot/api-base" "12.1.1" - "@polkadot/api-derive" "12.1.1" - "@polkadot/keyring" "^12.6.2" - "@polkadot/rpc-augment" "12.1.1" - "@polkadot/rpc-core" "12.1.1" - "@polkadot/rpc-provider" "12.1.1" - "@polkadot/types" "12.1.1" - "@polkadot/types-augment" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/types-create" "12.1.1" - "@polkadot/types-known" "12.1.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" + tslib "^2.8.1" + +"@polkadot/api@15.5.1", "@polkadot/api@^15.3.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-15.5.1.tgz#5bff1ba9906ebcdd04883a24731d622d2fa9e364" + integrity sha512-vEKXcy8iq2f7UZ7pLiX0z2bXiMEJ6Qp/s2MZNWTixBPPWKKqdq7d98CIIPWmqDpQPhidsWMkzV4r3/GaNLccfQ== + dependencies: + "@polkadot/api-augment" "15.5.1" + "@polkadot/api-base" "15.5.1" + "@polkadot/api-derive" "15.5.1" + "@polkadot/keyring" "^13.3.1" + "@polkadot/rpc-augment" "15.5.1" + "@polkadot/rpc-core" "15.5.1" + "@polkadot/rpc-provider" "15.5.1" + "@polkadot/types" "15.5.1" + "@polkadot/types-augment" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/types-create" "15.5.1" + "@polkadot/types-known" "15.5.1" + "@polkadot/util" "^13.3.1" + "@polkadot/util-crypto" "^13.3.1" eventemitter3 "^5.0.1" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/keyring@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-12.6.2.tgz#6067e6294fee23728b008ac116e7e9db05cecb9b" - integrity sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw== - dependencies: - "@polkadot/util" "12.6.2" - "@polkadot/util-crypto" "12.6.2" - tslib "^2.6.2" - -"@polkadot/networks@12.6.2", "@polkadot/networks@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-12.6.2.tgz#791779fee1d86cc5b6cd371858eea9b7c3f8720d" - integrity sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w== - dependencies: - "@polkadot/util" "12.6.2" - "@substrate/ss58-registry" "^1.44.0" - tslib "^2.6.2" - -"@polkadot/rpc-augment@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-12.1.1.tgz#4e28602b6e5a822a41b7fc5151cea32d68dbb28f" - integrity sha512-oDPn070l94pppXbuVk75BVsYgupdV8ndmslnUKWpPlfOeAU5SaBu4jMkj3eAi3VH0ersUpmlp1UuYN612//h8w== - dependencies: - "@polkadot/rpc-core" "12.1.1" - "@polkadot/types" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/rpc-core@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-12.1.1.tgz#8267da3589c28ea1def0eb02ed23573ca9dfc841" - integrity sha512-NB4BZo9RdAZPBfZ11NoujB8+SDkDgvlrSiiv9FPMhfvTJo0Sr5FAq0Wd2aSC4D/6qbt5e89CHOW+0gBEm9d6dw== - dependencies: - "@polkadot/rpc-augment" "12.1.1" - "@polkadot/rpc-provider" "12.1.1" - "@polkadot/types" "12.1.1" - "@polkadot/util" "^12.6.2" + tslib "^2.8.1" + +"@polkadot/keyring@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-13.3.1.tgz#ad02047ffa3a73f4ba268ae504e520a6856ac55d" + integrity sha512-PT3uG9MqciPyoEz/f23RRMSlht77fo1hZaA1Vbcs1Rz7h7qFC0+7jFI9Ak30EJh9V0I2YugfzqAe3NjjyDxlvw== + dependencies: + "@polkadot/util" "13.3.1" + "@polkadot/util-crypto" "13.3.1" + tslib "^2.8.0" + +"@polkadot/networks@13.3.1", "@polkadot/networks@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-13.3.1.tgz#2ef94e2b74a44da22e4c56ca952b1db7b041f330" + integrity sha512-g/0OmCMUrbbW4RQ/xajTYd2SMJvFKY4kmMvpxtNN57hWQpY7c5oDXSz57jGH2uwvcBWeDfaNokcS+9hJL1RBcA== + dependencies: + "@polkadot/util" "13.3.1" + "@substrate/ss58-registry" "^1.51.0" + tslib "^2.8.0" + +"@polkadot/rpc-augment@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-15.5.1.tgz#75dd3d8e102194826fe891f6677878ea05adaf17" + integrity sha512-BuaObrUNH3aXavAoQA4diy8VXUgUpABzsYYIUtlivioA4UHJkFYzCnEYNcQj41Dp3bZE78LC80sYyqFc0ZFJfQ== + dependencies: + "@polkadot/rpc-core" "15.5.1" + "@polkadot/types" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/rpc-core@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-15.5.1.tgz#e85cfc8fb25b4a8d258be01ab95a4c6d1f0b03eb" + integrity sha512-rtT7RFQMfRm9bLYgaK34EoTSqSqPzGcD5aKITGv4ZcGi7oRRrKuIq813II1UK7IH5GN7njLWzoeq+LC3JVxW3g== + dependencies: + "@polkadot/rpc-augment" "15.5.1" + "@polkadot/rpc-provider" "15.5.1" + "@polkadot/types" "15.5.1" + "@polkadot/util" "^13.3.1" rxjs "^7.8.1" - tslib "^2.6.2" - -"@polkadot/rpc-provider@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-12.1.1.tgz#26ec3a419f67fb8fb70ce0b9d4d066ec2b853c7c" - integrity sha512-nDr0Qb5sIzTTx6qmgr9ibNcQs/VDoPzZ+49kcltf0A6BdSytGy532Yhf2A158aD41324V9YPAzxVRLxZyJzhkw== - dependencies: - "@polkadot/keyring" "^12.6.2" - "@polkadot/types" "12.1.1" - "@polkadot/types-support" "12.1.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" - "@polkadot/x-fetch" "^12.6.2" - "@polkadot/x-global" "^12.6.2" - "@polkadot/x-ws" "^12.6.2" + tslib "^2.8.1" + +"@polkadot/rpc-provider@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-15.5.1.tgz#47b8559c9df3d67988a0434c42ce7c590744f708" + integrity sha512-hDKup24P+L4BtRgu1L4IZRpZlqPOyeK8ryIaiuPABd6ZseQUQ8Oz2OMf3uL2Q43Xc72+q2PP5ylJuxH+wlErDw== + dependencies: + "@polkadot/keyring" "^13.3.1" + "@polkadot/types" "15.5.1" + "@polkadot/types-support" "15.5.1" + "@polkadot/util" "^13.3.1" + "@polkadot/util-crypto" "^13.3.1" + "@polkadot/x-fetch" "^13.3.1" + "@polkadot/x-global" "^13.3.1" + "@polkadot/x-ws" "^13.3.1" eventemitter3 "^5.0.1" mock-socket "^9.3.1" - nock "^13.5.0" - tslib "^2.6.2" + nock "^13.5.5" + tslib "^2.8.1" optionalDependencies: - "@substrate/connect" "0.8.10" - -"@polkadot/types-augment@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-12.1.1.tgz#df98ce510d0ea74e4c1309887de5da99266c566f" - integrity sha512-HdzjaXapcmNAdT6TWJOuv124PTKbAf5+5JldQ7oPZFaCEhaOTazZYiZ27nqLaj0l4rG7wWzFMiGqjbHwAvtmlg== - dependencies: - "@polkadot/types" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-codec@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-12.1.1.tgz#364242c1bbb72b872fe5b8f00a27d0b1d163aa98" - integrity sha512-Ob3nFptHT4dDvGc/3l4dBXmvsI3wDWS2oCOxACA+hYWufnlTIQ4M4sHI4kSBQvDoEmaFt8P2Be4SmtyT0VSd1w== - dependencies: - "@polkadot/util" "^12.6.2" - "@polkadot/x-bigint" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-create@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-12.1.1.tgz#9a0d63366a0e54fdc43e73ece714c6f4f19f0698" - integrity sha512-K/I4vCnmI7IbtQeURiRMONDqesIVcZp16KEduBcbJm/RWDj0D3mr71066Yr8OhrhteLvULJpViy7EK4ynPvmSw== - dependencies: - "@polkadot/types-codec" "12.1.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-known@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-12.1.1.tgz#12165cf89c44f54e8a92ca7b5271621e8d8a2af1" - integrity sha512-4YxY7tB+BVX6k3ubrToYKyh2Jb4QvoLvzwNSGSjyj0RGwiQCu8anFGIzYdaUJ2iQlhLFb6P4AZWykVvhrXGmqg== - dependencies: - "@polkadot/networks" "^12.6.2" - "@polkadot/types" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/types-create" "12.1.1" - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types-support@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-12.1.1.tgz#635a1cc60f15d662eb3731257fe4648f6391f69f" - integrity sha512-mLXrbj0maKFWqV1+4QRzaNnZyV/rAQW0XSrIzfIZn//zSRSIUaXaVAZ62uzgdmzXXFH2qD3hpNlmvmjcEMm2Qg== - dependencies: - "@polkadot/util" "^12.6.2" - tslib "^2.6.2" - -"@polkadot/types@12.1.1": - version "12.1.1" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-12.1.1.tgz#5eb94544deeda2952d77274ea33f7f986e38395b" - integrity sha512-+b8v7ORjL20r6VvdWL/fPTHmDXtfAfqkQQxBB6exxOhqrnJfnhAYQjJomKcyj1VMTQiyyR9FBAc7vVvTEFX2ew== - dependencies: - "@polkadot/keyring" "^12.6.2" - "@polkadot/types-augment" "12.1.1" - "@polkadot/types-codec" "12.1.1" - "@polkadot/types-create" "12.1.1" - "@polkadot/util" "^12.6.2" - "@polkadot/util-crypto" "^12.6.2" + "@substrate/connect" "0.8.11" + +"@polkadot/types-augment@15.3.1": + version "15.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-15.3.1.tgz#503289c7b7f27e6649637fb1d034e2c03321e496" + integrity sha512-p3CCbEDh9o33OX9Olgt6bSJeabYptGHnn7aevUYl7xQ1OenAqn7wTJ61ClXt/ZtE2ikP7HUGMtbh5FjlJI+YSA== + dependencies: + "@polkadot/types" "15.3.1" + "@polkadot/types-codec" "15.3.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-augment@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-15.5.1.tgz#be6ef65c8ad936dd48c41e45647b773d24240b68" + integrity sha512-sWO/4Loe7oJldmO/dbJeiTkO7sdEj6TZ6UnHcxpxCC97cPUrqHxcatsyoxrMn1RyLJ/tIlkQEgT25d/LwKbU7Q== + dependencies: + "@polkadot/types" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-codec@15.3.1": + version "15.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-15.3.1.tgz#a9283da99048dea0d317614892c8bf0a1a188873" + integrity sha512-nqLFAZoHnwKFNj8ZRBF2X8O+yZR9y0r6tgOgyj3LPF8r0JvakVwmZ2C1AIAFr6YO6LeFfZh4kkkqRGgReGEIMA== + dependencies: + "@polkadot/util" "^13.3.1" + "@polkadot/x-bigint" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-codec@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-15.5.1.tgz#9bc9d792c9a8521d224aa01c7f7040d51a9d3c53" + integrity sha512-aBI3x9Uv/g6TkVToQwIEuXn9NsRT6oMrlQt9WYN4bWElHayeiKpdEQa3sdSpA48g+X5q4CoWDI7etaj8cV9obw== + dependencies: + "@polkadot/util" "^13.3.1" + "@polkadot/x-bigint" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-create@15.3.1": + version "15.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-15.3.1.tgz#c135fd2d325620f36bc2406491ac731a137529ef" + integrity sha512-+bI6hisydb/9jTpFfgYDNF1QE6Ic7VJubbFovnml4uzWpN0sKrh4TFpYP9aja+qRug7gseHzzwAMXZn4GZ0kCw== + dependencies: + "@polkadot/types-codec" "15.3.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-create@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-15.5.1.tgz#0ad99c692604bda8fffe426152636c458daa63d6" + integrity sha512-qb8lDmWIZeOiw2INIKGFDM6dtMn08kU5WaIfjpIPDBAM+htqhhGNirxIvSwKIY15YuAUqapk4EXelZLnDxHJ8g== + dependencies: + "@polkadot/types-codec" "15.5.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-known@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-15.5.1.tgz#bfc68dff9901afe4439304fe3cb48b1b17b32553" + integrity sha512-4FXoN22h9pgEfWf+p23+77PzQGfZPC4oMjLYKB5tJ6z1Wn/QkoaNlidBf/swTaYRTE5KnXU4BHdEyR1N+336sw== + dependencies: + "@polkadot/networks" "^13.3.1" + "@polkadot/types" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/types-create" "15.5.1" + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types-support@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-15.5.1.tgz#1c43945e65155407af6a6ba33483d3ffcef6b0cf" + integrity sha512-EGju43gZszvWQVgmwUQitimdLRL06TJ26ate9HNsTdz2EOhPp9yuYolLwk6qIwBitpF0qup0H6FgiohhIBrc7g== + dependencies: + "@polkadot/util" "^13.3.1" + tslib "^2.8.1" + +"@polkadot/types@15.3.1": + version "15.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-15.3.1.tgz#f23e57014f03909609a4a7380ebd021da18c0ba4" + integrity sha512-vdrTDmoGPy9uJcUYA0gvcflg//VQV4dZ7yDZZ9D5eBQ76OHyGJhnB+AfZX0vy/1ARxGkMQj8MxcUvVjkOOCmnA== + dependencies: + "@polkadot/keyring" "^13.3.1" + "@polkadot/types-augment" "15.3.1" + "@polkadot/types-codec" "15.3.1" + "@polkadot/types-create" "15.3.1" + "@polkadot/util" "^13.3.1" + "@polkadot/util-crypto" "^13.3.1" rxjs "^7.8.1" - tslib "^2.6.2" + tslib "^2.8.1" + +"@polkadot/types@15.5.1": + version "15.5.1" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-15.5.1.tgz#817d09887eb12c7e0b2f98dbeccc25357fb6e510" + integrity sha512-1kpF4xaYvokuXaNt37PESXCIrYWlrNQWQwfopQz1RPVHGKcLioMZ8cc49nYSPjpvRriDSVmE/zhy16uBWANHOw== + dependencies: + "@polkadot/keyring" "^13.3.1" + "@polkadot/types-augment" "15.5.1" + "@polkadot/types-codec" "15.5.1" + "@polkadot/types-create" "15.5.1" + "@polkadot/util" "^13.3.1" + "@polkadot/util-crypto" "^13.3.1" + rxjs "^7.8.1" + tslib "^2.8.1" -"@polkadot/util-crypto@12.6.2", "@polkadot/util-crypto@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz#d2d51010e8e8ca88951b7d864add797dad18bbfc" - integrity sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg== +"@polkadot/util-crypto@13.3.1", "@polkadot/util-crypto@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-13.3.1.tgz#b7a705aa2760ecd48e66c0f49bef11cd3cb322af" + integrity sha512-FU6yf3IY++DKlf0eqO9/obe2y1zuZ5rbqRs75fyOME/5VXio1fA3GIpW7aFphyneFRd78G8QLh8kn0oIwBGMNg== dependencies: "@noble/curves" "^1.3.0" "@noble/hashes" "^1.3.3" - "@polkadot/networks" "12.6.2" - "@polkadot/util" "12.6.2" - "@polkadot/wasm-crypto" "^7.3.2" - "@polkadot/wasm-util" "^7.3.2" - "@polkadot/x-bigint" "12.6.2" - "@polkadot/x-randomvalues" "12.6.2" - "@scure/base" "^1.1.5" - tslib "^2.6.2" - -"@polkadot/util@12.6.2", "@polkadot/util@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-12.6.2.tgz#9396eff491221e1f0fd28feac55fc16ecd61a8dc" - integrity sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw== - dependencies: - "@polkadot/x-bigint" "12.6.2" - "@polkadot/x-global" "12.6.2" - "@polkadot/x-textdecoder" "12.6.2" - "@polkadot/x-textencoder" "12.6.2" - "@types/bn.js" "^5.1.5" + "@polkadot/networks" "13.3.1" + "@polkadot/util" "13.3.1" + "@polkadot/wasm-crypto" "^7.4.1" + "@polkadot/wasm-util" "^7.4.1" + "@polkadot/x-bigint" "13.3.1" + "@polkadot/x-randomvalues" "13.3.1" + "@scure/base" "^1.1.7" + tslib "^2.8.0" + +"@polkadot/util@13.3.1", "@polkadot/util@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-13.3.1.tgz#654b84fd553e7d977007885c23aae98e4ff18114" + integrity sha512-5crLP/rUZOJzuo/W8t73J8PxpibJ5vrxY57rR6V+mIpCZd1ORiw0wxeHcV5F9Adpn7yJyuGBwxPbueNR5Rr1Zw== + dependencies: + "@polkadot/x-bigint" "13.3.1" + "@polkadot/x-global" "13.3.1" + "@polkadot/x-textdecoder" "13.3.1" + "@polkadot/x-textencoder" "13.3.1" + "@types/bn.js" "^5.1.6" bn.js "^5.2.1" - tslib "^2.6.2" - -"@polkadot/wasm-bridge@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz#e1b01906b19e06cbca3d94f10f5666f2ae0baadc" - integrity sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g== - dependencies: - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-crypto-asmjs@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz#c6d41bc4b48b5359d57a24ca3066d239f2d70a34" - integrity sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q== - dependencies: - tslib "^2.6.2" - -"@polkadot/wasm-crypto-init@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz#7e1fe79ba978fb0a4a0f74a92d976299d38bc4b8" - integrity sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g== - dependencies: - "@polkadot/wasm-bridge" "7.3.2" - "@polkadot/wasm-crypto-asmjs" "7.3.2" - "@polkadot/wasm-crypto-wasm" "7.3.2" - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-crypto-wasm@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz#44e08ed5cf6499ce4a3aa7247071a5d01f6a74f4" - integrity sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw== - dependencies: - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-crypto@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz#61bbcd9e591500705c8c591e6aff7654bdc8afc9" - integrity sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw== - dependencies: - "@polkadot/wasm-bridge" "7.3.2" - "@polkadot/wasm-crypto-asmjs" "7.3.2" - "@polkadot/wasm-crypto-init" "7.3.2" - "@polkadot/wasm-crypto-wasm" "7.3.2" - "@polkadot/wasm-util" "7.3.2" - tslib "^2.6.2" - -"@polkadot/wasm-util@7.3.2", "@polkadot/wasm-util@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz#4fe6370d2b029679b41a5c02cd7ebf42f9b28de1" - integrity sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg== - dependencies: - tslib "^2.6.2" - -"@polkadot/x-bigint@12.6.2", "@polkadot/x-bigint@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz#59b7a615f205ae65e1ac67194aefde94d3344580" - integrity sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q== - dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" - -"@polkadot/x-fetch@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz#b1bca028db90263bafbad2636c18d838d842d439" - integrity sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw== - dependencies: - "@polkadot/x-global" "12.6.2" + tslib "^2.8.0" + +"@polkadot/wasm-bridge@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-bridge/-/wasm-bridge-7.4.1.tgz#dd59ebb7c425657aad64b1430e8455d14d935059" + integrity sha512-tdkJaV453tezBxhF39r4oeG0A39sPKGDJmN81LYLf+Fihb7astzwju+u75BRmDrHZjZIv00un3razJEWCxze6g== + dependencies: + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-crypto-asmjs@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.4.1.tgz#5d36f3f498077f826f2bbe742070574606e673e9" + integrity sha512-pwU8QXhUW7IberyHJIQr37IhbB6DPkCG5FhozCiNTq4vFBsFPjm9q8aZh7oX1QHQaiAZa2m2/VjIVE+FHGbvHQ== + dependencies: + tslib "^2.7.0" + +"@polkadot/wasm-crypto-init@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.4.1.tgz#88bc61c9473a7c39d9fafb27cd631215b053b836" + integrity sha512-AVka33+f7MvXEEIGq5U0dhaA2SaXMXnxVCQyhJTaCnJ5bRDj0Xlm3ijwDEQUiaDql7EikbkkRtmlvs95eSUWYQ== + dependencies: + "@polkadot/wasm-bridge" "7.4.1" + "@polkadot/wasm-crypto-asmjs" "7.4.1" + "@polkadot/wasm-crypto-wasm" "7.4.1" + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-crypto-wasm@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.4.1.tgz#73d08f59aaf51ed70563c0099e7852fdeda03649" + integrity sha512-PE1OAoupFR0ZOV2O8tr7D1FEUAwaggzxtfs3Aa5gr+yxlSOaWUKeqsOYe1KdrcjmZVV3iINEAXxgrbzCmiuONg== + dependencies: + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-crypto@^7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-7.4.1.tgz#6d5f94d28bf92ef234b94d55b0d1f4299cbbb7b7" + integrity sha512-kHN/kF7hYxm1y0WeFLWeWir6oTzvcFmR4N8fJJokR+ajYbdmrafPN+6iLgQVbhZnDdxyv9jWDuRRsDnBx8tPMQ== + dependencies: + "@polkadot/wasm-bridge" "7.4.1" + "@polkadot/wasm-crypto-asmjs" "7.4.1" + "@polkadot/wasm-crypto-init" "7.4.1" + "@polkadot/wasm-crypto-wasm" "7.4.1" + "@polkadot/wasm-util" "7.4.1" + tslib "^2.7.0" + +"@polkadot/wasm-util@7.4.1", "@polkadot/wasm-util@^7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-util/-/wasm-util-7.4.1.tgz#e8cea38a3b752efdef55080bb1da795ac71c5136" + integrity sha512-RAcxNFf3zzpkr+LX/ItAsvj+QyM56TomJ0xjUMo4wKkHjwsxkz4dWJtx5knIgQz/OthqSDMR59VNEycQeNuXzA== + dependencies: + tslib "^2.7.0" + +"@polkadot/x-bigint@13.3.1", "@polkadot/x-bigint@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-13.3.1.tgz#2a24633e002fbdde6ca4f2ac9d33b927db583245" + integrity sha512-ewc708a7LUdrT92v9DsSAIbcJQBn3aR9/LavF/iyMOq5lZJyPXDSjAnskfMs818R3RLCrKVKfs+aKkxt2eqo8g== + dependencies: + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + +"@polkadot/x-fetch@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-13.3.1.tgz#27ee462567193d0832d132a5d6a84229fe740e88" + integrity sha512-J+HM42j0KGqdC/eo7vmsdLPz74MR7+0My4km6TG9HGjKqqztwygtenpopPod2SbRnL4nHiEG0wZzpVOW6HN2gw== + dependencies: + "@polkadot/x-global" "13.3.1" node-fetch "^3.3.2" - tslib "^2.6.2" + tslib "^2.8.0" -"@polkadot/x-global@12.6.2", "@polkadot/x-global@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-12.6.2.tgz#31d4de1c3d4c44e4be3219555a6d91091decc4ec" - integrity sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g== +"@polkadot/x-global@13.3.1", "@polkadot/x-global@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-13.3.1.tgz#2537b834ecb239a7fb92004491ddff102f3ebee9" + integrity sha512-861TeIw49a3JvkwlUWrddfG+JaUqtFZDsemYxxZIjjcRJLrKOsoKNqHbiHi2OPrwlX8PwAA/wc5I9Q4XRQ7KEg== dependencies: - tslib "^2.6.2" + tslib "^2.8.0" -"@polkadot/x-randomvalues@12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz#13fe3619368b8bf5cb73781554859b5ff9d900a2" - integrity sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg== +"@polkadot/x-randomvalues@13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-13.3.1.tgz#63b1251f3fb6643daf31917bc2e14277e6145101" + integrity sha512-GIb0au3vIX2U/DRH0PRckM+1I4EIbU8PLX1roGJgN1MAYKWiylJTKPVoBMafMM87o8qauOevJ46uYB/qlfbiWg== dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" -"@polkadot/x-textdecoder@12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz#b86da0f8e8178f1ca31a7158257e92aea90b10e4" - integrity sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w== +"@polkadot/x-textdecoder@13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-13.3.1.tgz#eb50c2c52d0de9257ebd4623c4098e929e7aa3a6" + integrity sha512-g2R9O1p0ZsNDhZ3uEBZh6fQaVLlo3yFr0YNqt15v7e9lBI4APvTJ202EINlo2jB5lz/R438/BdjEA3AL+0zUtQ== dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" -"@polkadot/x-textencoder@12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz#81d23bd904a2c36137a395c865c5fefa21abfb44" - integrity sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw== +"@polkadot/x-textencoder@13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-13.3.1.tgz#203a208b03a1336446777c0cc76bf35cf8e685d5" + integrity sha512-DnHLUdoKDYxekfxopuUuPB+j5Mu7Jemejcduu5gz3/89GP/sYPAu0CAVbq9B+hK1yGjBBj31eA4wkAV1oktYmg== dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" -"@polkadot/x-ws@^12.6.2": - version "12.6.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-12.6.2.tgz#b99094d8e53a03be1de903d13ba59adaaabc767a" - integrity sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw== +"@polkadot/x-ws@^13.3.1": + version "13.3.1" + resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-13.3.1.tgz#05b0664991e24ffd62f5af91c9280dcb544c0613" + integrity sha512-ytqkC7FwVs4BlzNFAmPMFp+xD1KIdMMP/mvCSOrnxjlsyM5DVGop4x4c2ZgDUBmrFqmIiVkWDfMIZeOxui2OLQ== dependencies: - "@polkadot/x-global" "12.6.2" - tslib "^2.6.2" - ws "^8.15.1" + "@polkadot/x-global" "13.3.1" + tslib "^2.8.0" + ws "^8.18.0" "@scure/base@^1.1.1": version "1.1.6" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== -"@scure/base@^1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" - integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== +"@scure/base@^1.1.7": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9" + integrity sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ== "@substrate/connect-extension-protocol@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.0.0.tgz#badaa6e6b5f7c7d56987d778f4944ddb83cd9ea7" integrity sha512-nKu8pDrE3LNCEgJjZe1iGXzaD6OSIDD4Xzz/yo4KO9mQ6LBvf49BVrt4qxBFGL6++NneLiWUZGoh+VSd4PyVIg== -"@substrate/connect-known-chains@^1.1.4": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@substrate/connect-known-chains/-/connect-known-chains-1.1.5.tgz#4aed3c402458bfb31ddfc54eeb5cb4a4c74ca88e" - integrity sha512-GCdDMs5q9xDYyP/KEwrlWMdqv8OIPjuVMZvNowvUrvEFo5d+x+VqfRPzyl/RbV+snRQVWTTacRydE7GqyjCYPQ== +"@substrate/connect-known-chains@^1.1.5": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@substrate/connect-known-chains/-/connect-known-chains-1.9.1.tgz#32a0be80e4054f8b9681b37c8b44c01d82deeb3f" + integrity sha512-dWNf5x3hjrY4s+WEovPKL0jH58pyIaIiAM918aAdnp/VKkAMqOfhKzRWL7BqJDKCm95bL4fqnOfaXZ3SQpVoYw== -"@substrate/connect@0.8.10": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.8.10.tgz#810b6589f848828aa840c731a1f36b84fe0e5956" - integrity sha512-DIyQ13DDlXqVFnLV+S6/JDgiGowVRRrh18kahieJxhgvzcWicw5eLc6jpfQ0moVVLBYkO7rctB5Wreldwpva8w== +"@substrate/connect@0.8.11": + version "0.8.11" + resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.8.11.tgz#983ec69a05231636e217b573b8130a6b942af69f" + integrity sha512-ofLs1PAO9AtDdPbdyTYj217Pe+lBfTLltdHDs3ds8no0BseoLeAGxpz1mHfi7zB4IxI3YyAiLjH6U8cw4pj4Nw== dependencies: "@substrate/connect-extension-protocol" "^2.0.0" - "@substrate/connect-known-chains" "^1.1.4" - "@substrate/light-client-extension-helpers" "^0.0.6" - smoldot "2.0.22" + "@substrate/connect-known-chains" "^1.1.5" + "@substrate/light-client-extension-helpers" "^1.0.0" + smoldot "2.0.26" -"@substrate/light-client-extension-helpers@^0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-0.0.6.tgz#bec1c7997241226db50b44ad85a992b4348d21c3" - integrity sha512-girltEuxQ1BvkJWmc8JJlk4ZxnlGXc/wkLcNguhY+UoDEMBK0LsdtfzQKIfrIehi4QdeSBlFEFBoI4RqPmsZzA== +"@substrate/light-client-extension-helpers@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-1.0.0.tgz#7b60368c57e06e5cf798c6557422d12e6d81f1ff" + integrity sha512-TdKlni1mBBZptOaeVrKnusMg/UBpWUORNDv5fdCaJklP4RJiFOzBCrzC+CyVI5kQzsXBisZ+2pXm+rIjS38kHg== dependencies: - "@polkadot-api/json-rpc-provider" "0.0.1" - "@polkadot-api/json-rpc-provider-proxy" "0.0.1" - "@polkadot-api/observable-client" "0.1.0" - "@polkadot-api/substrate-client" "0.0.1" + "@polkadot-api/json-rpc-provider" "^0.0.1" + "@polkadot-api/json-rpc-provider-proxy" "^0.1.0" + "@polkadot-api/observable-client" "^0.3.0" + "@polkadot-api/substrate-client" "^0.1.2" "@substrate/connect-extension-protocol" "^2.0.0" - "@substrate/connect-known-chains" "^1.1.4" + "@substrate/connect-known-chains" "^1.1.5" rxjs "^7.8.1" -"@substrate/ss58-registry@^1.44.0": - version "1.44.0" - resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.44.0.tgz#54f214e2a44f450b7bbc9252891c1879a54e0606" - integrity sha512-7lQ/7mMCzVNSEfDS4BCqnRnKCFKpcOaPrxMeGTXHX1YQzM/m2BBHjbK2C3dJvjv7GYxMiaTq/HdWQj1xS6ss+A== +"@substrate/ss58-registry@^1.51.0": + version "1.51.0" + resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.51.0.tgz#39e0341eb4069c2d3e684b93f0d8cb0bec572383" + integrity sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ== "@tsconfig/node10@^1.0.7": version "1.0.9" @@ -485,10 +529,10 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@types/bn.js@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" - integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== +"@types/bn.js@^5.1.6": + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== dependencies: "@types/node" "*" @@ -581,10 +625,10 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nock@^13.5.0: - version "13.5.4" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.4.tgz#8918f0addc70a63736170fef7106a9721e0dc479" - integrity sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw== +nock@^13.5.5: + version "13.5.6" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.6.tgz#5e693ec2300bbf603b61dae6df0225673e6c4997" + integrity sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ== dependencies: debug "^4.1.0" json-stringify-safe "^5.0.1" @@ -621,10 +665,10 @@ scale-ts@^1.6.0: resolved "https://registry.yarnpkg.com/scale-ts/-/scale-ts-1.6.0.tgz#e9641093c5a9e50f964ddb1607139034e3e932e9" integrity sha512-Ja5VCjNZR8TGKhUumy9clVVxcDpM+YFjAnkMuwQy68Hixio3VRRvWdE3g8T/yC+HXA0ZDQl2TGyUmtmbcVl40Q== -smoldot@2.0.22: - version "2.0.22" - resolved "https://registry.yarnpkg.com/smoldot/-/smoldot-2.0.22.tgz#1e924d2011a31c57416e79a2b97a460f462a31c7" - integrity sha512-B50vRgTY6v3baYH6uCgL15tfaag5tcS2o/P5q1OiXcKGv1axZDfz2dzzMuIkVpyMR2ug11F6EAtQlmYBQd292g== +smoldot@2.0.26: + version "2.0.26" + resolved "https://registry.yarnpkg.com/smoldot/-/smoldot-2.0.26.tgz#0e64c7fcd26240fbe4c8d6b6e4b9a9aca77e00f6" + integrity sha512-F+qYmH4z2s2FK+CxGj8moYcd1ekSIKH8ywkdqlOz88Dat35iB1DIYL11aILN46YSGMzQW/lbJNS307zBSDN5Ig== dependencies: ws "^8.8.1" @@ -647,11 +691,16 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^2.1.0, tslib@^2.6.2: +tslib@^2.1.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.7.0, tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + typescript@^5.0.4: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" @@ -672,7 +721,12 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== -ws@^8.15.1, ws@^8.8.1: +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@^8.8.1: version "8.15.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==