diff --git a/packages/apps-config/package.json b/packages/apps-config/package.json index 30db700d67..510f8088c9 100644 --- a/packages/apps-config/package.json +++ b/packages/apps-config/package.json @@ -13,7 +13,7 @@ "@darwinia/types": "^1.1.0-alpha.21", "@docknetwork/node-types": "^0.4.6", "@edgeware/node-types": "^3.5.1-erup-4", - "@equilab/definitions": "1.1.1", + "@equilab/definitions": "1.2.2", "@interlay/polkabtc-types": "^0.7.3", "@kiltprotocol/type-definitions": "^0.1.6", "@laminar/type-definitions": "^0.3.1", diff --git a/packages/apps-config/src/api/spec/equilibrium.ts b/packages/apps-config/src/api/spec/equilibrium.ts index ac5e7ea3ae..ff470d9ff3 100644 --- a/packages/apps-config/src/api/spec/equilibrium.ts +++ b/packages/apps-config/src/api/spec/equilibrium.ts @@ -1,12 +1,12 @@ // Copyright 2017-2021 @polkadot/apps-config authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { ApiInterfaceRx, AugmentedQuery } from '@polkadot/api/types'; +import type { ApiInterfaceRx, AugmentedQuery, RxResult } from '@polkadot/api/types'; import type { AccountData, AccountId, AccountIndex, Address, Balance } from '@polkadot/types/interfaces'; import type { Codec, OverrideBundleDefinition } from '@polkadot/types/types'; import type { Observable } from '@polkadot/x-rxjs'; -import eq from '@equilab/definitions'; +import { equilibrium } from '@equilab/definitions'; import BN from 'bn.js'; import { Enum } from '@polkadot/types'; @@ -31,17 +31,20 @@ interface Currency extends Enum { type CommonBalanceMap = ApiInterfaceRx['query']['balances']['account']; -type EqBalanceDoubleMap = AugmentedQuery< +type EqBalanceDoubleMap = AugmentedQuery< 'rxjs', -(key1: AccountIndex | AccountId | Address | string, key2: Currency | string) => Observable, +(key1: AccountIndex | AccountId | Address | string, key2: T | string) => Observable, [AccountId, Currency] > -const transformBalanceStorage = ( - query: EqBalanceDoubleMap, - arg: Currency | string, - transform: (data: SB) => AccountData +const transformBalanceStorage = ( + query: EqBalanceDoubleMap, + currency: string, + transform: (data: SB) => AccountData, + currencyToAsset: (arg: string) => T ): CommonBalanceMap => { + const arg = currencyToAsset(currency); + // HACK as we cannot properly transform queryMulti result, define AccountData getters on standard Enum if (!(Enum as { hacked?: boolean }).hacked) { (Enum as { hacked?: boolean }).hacked = true; @@ -78,51 +81,55 @@ const signedBalancePredicate = (raw: Codec): raw is SignedBalance => Object.prototype.hasOwnProperty.call(raw, key) ); +export const createCustomAccount = (currency: string, currencyToAsset: (curr: string) => A, accountDataType = 'AccountData'): +(instanceId: string, api: ApiInterfaceRx) => RxResult<(arg: string | Uint8Array | AccountId) => Observable> => (instanceId: string, api: ApiInterfaceRx) => { + const registry = api.registry; + + const transform = (balance: SB): AccountData => { + let free = registry.createType('Balance'); + const reserved = registry.createType('Balance'); + const miscFrozen = registry.createType('Balance'); + const feeFrozen = registry.createType('Balance'); + + if (signedBalancePredicate(balance)) { + if (balance.isPositive) { + free = registry.createType('Balance', balance.asPositive); + } else if (balance.isNegative) { + free = registry.createType('Balance', balance.asNegative.mul(new BN(-1))); + } + } + + return registry.createType(accountDataType as 'AccountData', { feeFrozen, free, miscFrozen, reserved }); + }; + + return transformBalanceStorage( + api.query.eqBalances.account as unknown as EqBalanceDoubleMap, + currency, + transform, + currencyToAsset + ); +}; + const definitions: OverrideBundleDefinition = { derives: { - ...eq.equilibrium.instances.balances.reduce( + ...equilibrium.instances.balances.reduce( (all, cur) => ({ ...all, [cur]: { - customAccount: (instanceId: string, api: ApiInterfaceRx) => { - const registry = api.registry; - - const transform = (balance: SB): AccountData => { - let free = registry.createType('Balance'); - const reserved = registry.createType('Balance'); - const miscFrozen = registry.createType('Balance'); - const feeFrozen = registry.createType('Balance'); - - if (signedBalancePredicate(balance)) { - if (balance.isPositive) { - free = registry.createType('Balance', balance.asPositive); - } else if (balance.isNegative) { - free = registry.createType('Balance', balance.asNegative.mul(new BN(-1))); - } - } - - return registry.createType('AccountData', { feeFrozen, free, miscFrozen, reserved }); - }; - - return transformBalanceStorage( - api.query.eqBalances.account as unknown as EqBalanceDoubleMap, - cur, - transform - ); - } + customAccount: createCustomAccount(cur, (currency: string) => currency) } }), {} ) }, - instances: eq.equilibrium.instances, + instances: equilibrium.instances, types: [ { // on all versions minmax: [0, undefined], - types: eq.equilibrium.types + types: equilibrium.types } ] }; diff --git a/packages/apps-config/src/api/spec/genshiro.ts b/packages/apps-config/src/api/spec/genshiro.ts new file mode 100644 index 0000000000..14bad46952 --- /dev/null +++ b/packages/apps-config/src/api/spec/genshiro.ts @@ -0,0 +1,44 @@ +// Copyright 2017-2021 @polkadot/apps-config authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { OverrideBundleDefinition } from '@polkadot/types/types'; + +import { genshiro } from '@equilab/definitions'; + +import { createCustomAccount } from './equilibrium'; + +export const u64FromCurrency = (currency: string): number => { + const buf = Buffer.from(currency.toLowerCase()); + const size = buf.length; + + return buf.reduce( + (val, digit, i) => val + Math.pow(256, size - 1 - i) * digit, + 0 + ); +}; + +const definitions: OverrideBundleDefinition = { + derives: { + ...genshiro.instances.balances.reduce( + (all, cur) => ({ + ...all, + [cur]: { + customAccount: createCustomAccount(cur, (currency: string) => ({ 0: u64FromCurrency(currency) }), 'CompatAccountData') + } + }), + {} + ) + }, + + instances: genshiro.instances, + + types: [ + { + // on all versions + minmax: [0, undefined], + types: genshiro.types + } + ] +}; + +export default definitions; diff --git a/packages/apps-config/src/api/spec/index.ts b/packages/apps-config/src/api/spec/index.ts index 9bc66233b4..36de72dffa 100644 --- a/packages/apps-config/src/api/spec/index.ts +++ b/packages/apps-config/src/api/spec/index.ts @@ -35,6 +35,7 @@ import galital from './galital'; import galitalParachain from './galital-parachain'; import galois from './galois'; import gamepower from './gamepower'; +import genshiro from './genshiro'; import hanonycash from './hanonycash'; import hydrate from './hydrate'; import idavoll from './idavoll'; @@ -99,6 +100,7 @@ const spec: Record = { 'Darwinia Crab PC2': darwiniaParachain, 'Darwinia PC2': darwiniaParachain, Equilibrium: equilibrium, + Genshiro: genshiro, Pangolin: pangolin, VLN: vln, 'VLN-PC': vlnrococo, diff --git a/packages/apps-config/src/endpoints/testingRelayRococo.ts b/packages/apps-config/src/endpoints/testingRelayRococo.ts index ae55cbb647..138fa59421 100644 --- a/packages/apps-config/src/endpoints/testingRelayRococo.ts +++ b/packages/apps-config/src/endpoints/testingRelayRococo.ts @@ -170,15 +170,6 @@ export function createRococo (t: TFunction): EndpointOption { Encointer: 'wss://rococo.encointer.org' } }, - { - info: 'rococoEquilibrium', - isDisabled: true, // Rococo reset - paraId: 42, - text: t('rpc.rococo.equilibrium', 'Equilibrium', { ns: 'apps-config' }), - providers: { - Equilibrium: 'wss://rococo.equilibrium.io' - } - }, { info: 'rococoGalital', isDisabled: true, // Rococo reset @@ -188,6 +179,14 @@ export function createRococo (t: TFunction): EndpointOption { StarkleyTech: 'wss://galital-rpc.starkleytech.com' } }, + { + info: 'rococoGenshiro', + paraId: 2021, + text: t('rpc.rococo.genshiro', 'Genshiro', { ns: 'apps-config' }), + providers: { + Equilibrium: 'wss://gens-rococo.equilibrium.io' + } + }, { info: 'rococoHalongbay', paraId: 2018, diff --git a/packages/apps-config/src/ui/colors.ts b/packages/apps-config/src/ui/colors.ts index d6947fe421..0bacdded6a 100644 --- a/packages/apps-config/src/ui/colors.ts +++ b/packages/apps-config/src/ui/colors.ts @@ -22,8 +22,10 @@ const chainClover = 'linear-gradient(to right, #52ad75, #7cc773)'; const chainChainx = '#F6C94A'; const chainDarwinia = 'linear-gradient(-45deg, #FE3876 0%, #7C30DD 71%, #3A30DD 100%)'; const chainDotMog = '#020609'; +const chainEquilibrium = '#1792ff'; const chainGalital = '#00063F'; const chainGamePower = '#5d21a5'; +const chainGenshiro = '#e8662d'; const chainHanonycash = '#0099CC'; const chainHydrate = '#000000'; const chainIntegritee = '#15bcff'; @@ -98,11 +100,9 @@ const nodeDotMog = '#020609'; const nodeEdgeware = '#0a95df'; const nodeEncointerNotee = '#cc0000'; const nodeEncointerTeeproxy = '#0000cc'; -const nodeEquilibrium = '#1792ff'; const nodeGalital = '#00063F;'; const nodeGamePower = '#5d21a5'; const nodeGeek = '#4f46e5'; -const nodeGenshiro = '#e8662d'; const nodeIpse = '#08a1e8'; const nodeJupiter = '#7143ff'; const nodeKonomi = '#007aff'; @@ -149,7 +149,7 @@ export { emptyColor }; // Alphabetical overrides based on the actual matched chain name // NOTE: This is as retrieved via the system.chain RPC -export const chainColors = Object.entries({ +export const chainColors: Record = Object.entries({ 'acala mandala pc1': chainRoccoAcala, 'acala mandala pc2': chainRoccoAcala, 'Apron PC1': chainApron, @@ -170,11 +170,12 @@ export const chainColors = Object.entries({ 'DOTMog.com NET': chainDotMog, 'Encointer Canary': nodeEncointerNotee, 'Encointer PC1': nodeEncointerNotee, - Equilibrium: nodeEquilibrium, - EquilibriumTestnet: nodeGenshiro, + Equilibrium: chainEquilibrium, + EquilibriumTestnet: chainGenshiro, Galital: chainGalital, Galois: chainGalois, 'GamePower Network': chainGamePower, + 'Genshiro Rococo Testnet': chainGenshiro, 'Halongbay PC1': chainPolkaFoundry, hanonycash: chainHanonycash, 'HydraDX Hydrate': chainHydrate, diff --git a/packages/apps-config/src/ui/logos/index.ts b/packages/apps-config/src/ui/logos/index.ts index 4b4fe057a9..9841e134b2 100644 --- a/packages/apps-config/src/ui/logos/index.ts +++ b/packages/apps-config/src/ui/logos/index.ts @@ -140,11 +140,12 @@ export const chainLogos = Object.entries({ 'Encointer Canary': nodeEncointerNotee, 'Encointer PC1': nodeEncointerNotee, Equilibrium: chainEquilibrium, - EquilibriumTestnet: chainGenshiro, + EquilibriumTestnet: chainEquilibrium, Galital: nodeGalital, Galois: nodeMath, 'GamePower Network': nodeGamePower, GEEK: nodeGeek, + 'Genshiro Rococo Testnet': chainEquilibrium, 'HydraDX Hydrate': chainHydrate, 'HydraDX Snakenet': chainSnakenet, 'HydraDX Snakenet Gen2': chainSnakenet, @@ -460,6 +461,7 @@ export const namedLogos: Record = { rococoEave: nodeEave, rococoEncointer: nodeEncointerNotee, rococoGalital: nodeGalital, + rococoGenshiro: chainGenshiro, rococoHydrate: chainHydrate, rococoIdavoll: nodeIdavoll, rococoIntegritee: nodeIntegritee, diff --git a/yarn.lock b/yarn.lock index 324c49dcae..e3aef12a05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1595,10 +1595,10 @@ __metadata: languageName: node linkType: hard -"@equilab/definitions@npm:1.1.1": - version: 1.1.1 - resolution: "@equilab/definitions@npm:1.1.1" - checksum: f18fc7df822e0421fb0d2f127e2be9004e059f45769610e9df1115291951b153320a00bb28919a3b2c4dd682f6564f47040068f2128171afbfc47d979295de04 +"@equilab/definitions@npm:1.2.2": + version: 1.2.2 + resolution: "@equilab/definitions@npm:1.2.2" + checksum: 7ec5fa94337f2a36679ea47509c42968e8ff11b6920b58c7dfec85abd189dca8da44bc28021ccca192486e54710f2a9fda731f025058da6256218873b34054b0 languageName: node linkType: hard @@ -2535,7 +2535,7 @@ __metadata: "@darwinia/types": ^1.1.0-alpha.21 "@docknetwork/node-types": ^0.4.6 "@edgeware/node-types": ^3.5.1-erup-4 - "@equilab/definitions": 1.1.1 + "@equilab/definitions": 1.2.2 "@interlay/polkabtc-types": ^0.7.3 "@kiltprotocol/type-definitions": ^0.1.6 "@laminar/type-definitions": ^0.3.1