From edb12b91eccd5b770adff7699126b72abb83e8f2 Mon Sep 17 00:00:00 2001 From: Thom Ivy <38070512+thomivy@users.noreply.github.com> Date: Thu, 16 May 2024 08:47:47 -0500 Subject: [PATCH] Overhaul of Addresses page and implementation of a conversion tool. (#39) --- README.md | 2 +- components.json | 4 +- components/EvmToSubstrateConverter.tsx | 106 ++++++++++++++++ components/ui/card.tsx | 86 +++++++++++++ package.json | 10 +- pages/developers/_meta.json | 2 +- pages/developers/addresses.mdx | 158 ++++++++++++++++------- pages/resources.mdx | 2 - yarn.lock | 166 ++++++++++++++++++++++++- 9 files changed, 483 insertions(+), 53 deletions(-) create mode 100644 components/EvmToSubstrateConverter.tsx create mode 100644 components/ui/card.tsx diff --git a/README.md b/README.md index 4a8ce877..c6295eb5 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ navigation. 4. **Open the code and start customizing!** - Your site is now running at `http://localhost:3000/docs`. + Your site is now running at `http://localhost:3000/`. Edit to see your site update in real-time on save. diff --git a/components.json b/components.json index b940cb39..97e004f4 100644 --- a/components.json +++ b/components.json @@ -11,7 +11,7 @@ "prefix": "" }, "aliases": { - "components": "@/components", - "utils": "@/lib/utils" + "components": "./components", + "utils": "./lib/utils" } } diff --git a/components/EvmToSubstrateConverter.tsx b/components/EvmToSubstrateConverter.tsx new file mode 100644 index 00000000..e47a14a8 --- /dev/null +++ b/components/EvmToSubstrateConverter.tsx @@ -0,0 +1,106 @@ +import React, { useState } from "react"; +import { + blake2AsU8a, + encodeAddress, + decodeAddress, +} from "@polkadot/util-crypto"; +import { hexToU8a, stringToU8a, u8aConcat, u8aToHex } from "@polkadot/util"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "./ui/card"; +import { Button } from "./ui/button"; +import { BlockCopyButton } from "./ui/block-copy-button"; +import Link from "next/link"; + +const AddressConverter = () => { + const [evmAddress, setEvmAddress] = useState(""); + const [substrateAddress, setSubstrateAddress] = useState(""); + const [substrateAddressToConvert, setSubstrateAddressToConvert] = + useState(""); + const [evmAddressResult, setEvmAddressResult] = useState(""); + + const convertEvmToSubstrate = () => { + if (!evmAddress) { + setSubstrateAddress("Please enter an EVM address."); + return; + } + const addr = hexToU8a(evmAddress); + const data = stringToU8a("evm:"); + const res = blake2AsU8a(u8aConcat(data, addr)); + const output = encodeAddress(res, 42); + setSubstrateAddress(output); + }; + + return ( +
+ + + EVM-to-Substrate Address Converter + + Enter an EVM Address to convert to the SS58 Substrate format. To + convert an SS58 address to a public key, you can use{" "} + + SS58.org + + + + +
+
+ + setEvmAddress(e.target.value)} + placeholder="Enter EVM address" + /> +
+
+ +
+ {substrateAddress || "Waiting..."} +
+
+
+ +
+
+
+ + + +
+
+ ); +}; + +export default AddressConverter; diff --git a/components/ui/card.tsx b/components/ui/card.tsx new file mode 100644 index 00000000..18784628 --- /dev/null +++ b/components/ui/card.tsx @@ -0,0 +1,86 @@ +import * as React from "react"; + +import { cn } from "../../lib/utils"; + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardTitle.displayName = "CardTitle"; + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +CardFooter.displayName = "CardFooter"; + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +}; diff --git a/package.json b/package.json index 8f9b4a91..32db5061 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "docs", - "version": "1.0.0", + "name": "tangle-docs", + "version": "2.0.0", "private": true, - "description": "Webb docs", + "description": "Tangle Network Documentation", "scripts": { "dev": "next", "start": "next start", @@ -14,13 +14,15 @@ "format": "prettier --write \"{components,pages}/**/*.{mdx,ts,js,jsx,tsx,json}\" ", "format:check": "prettier --check \"{components,pages}/**/*.{mdx,ts,js,jsx,tsx,json}\" " }, - "author": "Webb Team", + "author": "Tangle Foundation", "license": "MPL-2.0", "dependencies": { "@headlessui/react": "^1.7.7", "@heroicons/react": "1.0.6", "@mdx-js/react": "^2.2.1", "@next/third-parties": "^14.2.3", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tooltip": "^1.0.7", "@react-aria/ssr": "3.4.0", diff --git a/pages/developers/_meta.json b/pages/developers/_meta.json index 5427fee5..dfe4f6a2 100644 --- a/pages/developers/_meta.json +++ b/pages/developers/_meta.json @@ -19,7 +19,7 @@ "integrate": "Endpoints and Other Resources", "deploy-using-hardhat": "Deploy on Tangle with Hardhat", "json-rpc-endpoints": "RPC Methods", - "addresses": "EVM and Address Conversion", + "addresses": "Account Addresses", "transaction-fees": "Calculating Transaction Fees", "-- contribute": { "type": "separator", diff --git a/pages/developers/addresses.mdx b/pages/developers/addresses.mdx index 06055150..4a545e1b 100644 --- a/pages/developers/addresses.mdx +++ b/pages/developers/addresses.mdx @@ -1,57 +1,129 @@ ---- -title: "Tangle Network Addresses" ---- +import EvmToSubstrateConverter from '../../components/EvmToSubstrateConverter' +import { Callout } from 'nextra/components' -## EVM-Substrate Address Conversion +# Account Addresses on Tangle -Converting between Substrate and EVM addresses can initially be a bit complicated, but once you understand the basic idea behind it, it becomes easy. Let's define the different scenarios we will be using: +If you're interacting with a Frontier-enabled Substrate chain like Tangle Network, you might encounter different address formats, such as SS58, Ethereum-style (H160), and Substrate-style (H256) addresses. -1. Alice only has an account on Tangle EVM using the Metamask wallet. -2. Bob has an account on Tangle using the Polkadot.js wallet, and another account on Tangle EVM using the Metamask wallet. -3. Charlie only has an account on Tangle using the Polkadot.js wallet. +To help you navigate between these formats, we've provided a handy conversion tool below. Simply enter your Ethereum address (H160), and the tool will generate the corresponding Substrate address (SS58) used on the Tangle Network chain. -Let's assign the following values: + + Please note that the conversion from an EVM address to a Substrate address using the provided tool is a one-way operation, and you cannot derive the original EVM address from a Substrate address. -- Alice's account: `0xa5fAA47a324754354CB0A305941C8cCc6b5de296` -- Bob's accounts: `5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty` and `0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990` -- Charlie's account: `5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y` +## Address Formats in Frontier-enabled Substrate Chains -## Convert Substrate Address to EVM +Frontier is a powerful toolset that allows Substrate-based blockchains to offer Ethereum Virtual Machine (EVM) compatibility. This means that developers can deploy and execute Solidity smart contracts on Substrate chains with minimal changes. When working with Frontier, it's essential to understand the different address formats and their relationships. In a Frontier-enabled Substrate chain, there are three primary address formats: -```tsx -function substrateToEvm(input: string): string { - // Decode the address to the 32 bytes. - const accountId = decodeAddress(input); - // Truncate it and take first 20 bytes - const res = accountId.subarray(0, 20); - // convert these bytes to hex. - const output = u8aToHex(res); - // The result is our EVM address. - return output; +1. **SS58 addresses**: SS58 is a simple account format designed for Substrate-based chains. It is heavily based on Bitcoin's Base-58-check format with a few alterations. The SS58 address is a base-58 encoded value that identifies a specific account on the Substrate chain. It consists of an address type, the encoded address, and a checksum. In the case of the Tangle Network, the chain ID and custom prefix used is `5845`, which yields the prefix `tg` when applied in conversion. + +2. **Ethereum-style addresses (H160)**: These addresses are 40 hex characters long (plus the "0x" prefix) and follow the Ethereum address format. They are derived from the private key used to sign transactions on the EVM side of the chain. + +3. **Substrate-style addresses (H256)**: These addresses are 256 bits long and are used natively by Substrate. They represent the raw, unencoded form of an account's public key or a hash value in Substrate. + +To bind an Ethereum H160 address with a Substrate H256 address, a truncated hash scheme is used. The first 160 bits (20 bytes) of the H256 address are taken and used as the corresponding H160 address. + +## Interacting with Frontier-enabled Substrate Chains + +When a user interacts with the EVM on a Frontier chain, they use their Ethereum-style address (H160). Behind the scenes, Frontier maps this H160 address to a corresponding Substrate-style address (H256) in the Substrate Balance pallet's storage. This mapping allows the user to hold and manage balances on the Substrate side. + +However, it's important to note that the user only has direct control over their H160 address and its associated private key. They cannot directly perform transactions or interact with Substrate-specific features using the mapped H256 address. To fully utilize the Substrate side of the chain, the user needs to have a separate SS58 address with its own private key. + +As a user, it's essential to understand the different address formats and their purposes when interacting with a Frontier-enabled Substrate chain. You'll need to manage your Ethereum-style address (H160) for EVM interactions and your SS58 address for Substrate-specific features. + +For developers building on a Frontier-enabled Substrate chain, it's crucial to be aware of these address formats and their relationships. You may need to provide clear instructions and tools to help users manage their addresses, perform cross-address transfers, and interact with both the EVM and Substrate components seamlessly. + +While the dual-address system may introduce some complexities, it also opens up a world of possibilities for interoperability and leveraging the strengths of both Ethereum and Substrate ecosystems. + +## Developer Resource + +### Cross-EVM/Substrate Token Transfers + +Handling cross-system token transfers between Substrate and EVM can be complex. Address mappings play a crucial role in facilitating these transfers. + +#### Scenarios + +1. **Alice** only has an account on Tangle EVM using the Metamask wallet. +2. **Bob** has an account on Tangle using the Polkadot.js wallet, and another account on Tangle EVM using the Metamask wallet. +3. **Charlie** only has an account on Tangle using the Polkadot.js wallet. + +Assigned values: + +- **Alice's account:** `0xa5fAA47a324754354CB0A305941C8cCc6b5de296` +- **Bob's accounts:** `5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty` and `0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990` +- **Charlie's account:** `5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y` + +### Address Mapping Explanation + +Address mappings between Substrate and EVM are one-way transformations that facilitate token transfers between the two systems. + +- **Substrate to EVM:** When a Substrate address is converted to an EVM address, the resulting EVM address can be used to receive tokens on the EVM side. The conversion involves extracting and hashing a part of the Substrate address, providing a unique EVM address corresponding to the original Substrate address. +- **EVM to Substrate:** Once tokens are sent to the EVM address, the recipient can interact with the Substrate network by calling the `evm.withdraw` function. This allows the recipient to withdraw tokens from the EVM environment back to the Substrate environment. + +Key Points: + +- The conversion is a one-way mapping from Substrate to EVM. +- The resulting EVM address is a hash of part of the Substrate address. +- Tokens can be received on the EVM side using the EVM address. +- The `evm.withdraw` function facilitates the transfer of tokens back to the Substrate side. + +### Convert Substrate Address to EVM + +To convert a Substrate address to an EVM address, the following script can be used: + +```typescript +import { decodeAddress } from "https://esm.sh/@polkadot/util-crypto"; +import { u8aToHex } from "https://esm.sh/@polkadot/util"; + +const input = Deno.args[0]; +if (!input) { + console.error("usage: deno run substrateToEvm.ts "); + Deno.exit(1); } +const accountId = decodeAddress(input); +const res = accountId.subarray(0, 20); +const output = u8aToHex(res); +console.log({ input, output }); +// run using: +// $ deno run substrateToEvm.ts ``` -## Convert EVM Address to Substrate +The script takes a Substrate address as input, decodes it, and then extracts the first 20 bytes of the account ID. These 20 bytes are then converted into a hexadecimal string, resulting in an EVM-compatible address. + +#### Convert EVM Address to Substrate + +Here is an example using the Deno Runtime and @polkadot/util to convert an address from EVM to Substrate: ```tsx -function evmToSubstrate(input: string): string { - // Convert EVM address to bytes - const addr = hexToU8a(input); - // Add a "evm:" prefix - const data = stringToU8a("evm:"); - // concat the address and the prefix and hash them together - // using blake2 - const res = blake2AsU8a(u8aConcat(data, addr)); - // encode the output and using 42 address prefix (substrate default) - const output = encodeAddress(res, 42); - // The result is our Substrate address. - return output; +import { + blake2AsU8a, + encodeAddress, +} from "https://esm.sh/@polkadot/util-crypto"; +import { + hexToU8a, + stringToU8a, + u8aConcat, +} from "https://esm.sh/@polkadot/util"; + +const input = Deno.args[0]; +if (!input) { + console.error("usage: deno run evmToSubstrate.ts "); + Deno.exit(1); } +const addr = hexToU8a(input); +const data = stringToU8a("evm:"); +const res = blake2AsU8a(u8aConcat(data, addr)); +const output = encodeAddress(res, 42); +console.log({ input, output }); +// run using: +// $ deno run evmToSubstrate.ts ``` -### Case 1: Sending from Substrate to EVM +**Note** +The conversion from an EVM address to a Substrate address is a one-way operation. Due to the hashing process, it is not possible to reverse the process and obtain the original EVM address from the resulting Substrate address. + +#### Case 1: Sending from Substrate to EVM -Bob wants to send 100 TNT to Alice, but he does not have the 100 TNT on his EVM account in Metamask. Therefore, he decided to use his Tangle account in the polkadot.js wallet. +Bob wants to send 100 TNT to Alice, but he does not have the 100 TNT on his EVM account in Metamask. Therefore, he uses his Tangle account in the Polkadot.js wallet. 1. Alice's address is `0xa5fAA47a324754354CB0A305941C8cCc6b5de296`. 2. Bob converts Alice's address to a substrate address using the `evmToSubstrate` function: @@ -64,7 +136,7 @@ evmToSubstrate("0xa5fAA47a324754354CB0A305941C8cCc6b5de296"); 3. Bob sends the 100 TNT to `5C9ysBsWKpw3D8MFaEauFgdtMPqboS64YNYHyu1rCynLyKMZ`. 4. Alice receives the 100 TNT in her Metamask wallet. -### Case 2: Sending from EVM to Substrate +#### Case 2: Sending from EVM to Substrate Alice wants to send 50 TNT to Charlie. However, Charlie only has a Substrate account that he controls in his Polkadot.js wallet. @@ -76,8 +148,10 @@ substrateToEvm("5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y"); // => 0x90b5ab205c6974c9ea841be688864633dc9ca8a3 ``` -3. Alice uses her Metamask and sends 50 TNT to `0x90b5ab205c6974c9ea841be688864633dc9ca8a3`. +3. Alice uses her Metamask and sends 50 TNT to + `0x90b5ab205c6974c9ea841be688864633dc9ca8a3`. 4. Charlie's balance on Substrate remains the same! - > The main reason here is that Charlie needs to withdraw the balance from his EVM account. -5. Charlie goes to Polkadot.js (maybe we can make it in our dApp?) and calls `evm.withdraw("0x90b5ab205c6974c9ea841be688864633dc9ca8a3", 50 TNT)`. + > Because: Charlie needs to withdraw the balance from his EVM account. +5. Charlie goes to Polkadot.js and calls: + `evm.withdraw("0x90b5ab205c6974c9ea841be688864633dc9ca8a3", 50 TNT)`. 6. Charlie sees that he has now received 50 TNT in his account. diff --git a/pages/resources.mdx b/pages/resources.mdx index c140adb2..71da08fe 100644 --- a/pages/resources.mdx +++ b/pages/resources.mdx @@ -3,6 +3,4 @@ import WalletTable from "../components/WalletTable" # Resources and Tools -## Network Basics - diff --git a/yarn.lock b/yarn.lock index 034e8ab8..2126a115 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1567,6 +1567,18 @@ dependencies: third-party-capital "1.0.20" +"@noble/curves@^1.3.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.3": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1593,6 +1605,136 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@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/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== + 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" + 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": + 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-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== + dependencies: + tslib "^2.6.2" + +"@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== + dependencies: + "@polkadot/x-global" "12.6.2" + tslib "^2.6.2" + +"@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== + dependencies: + "@polkadot/x-global" "12.6.2" + tslib "^2.6.2" + +"@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== + dependencies: + "@polkadot/x-global" "12.6.2" + tslib "^2.6.2" + "@popperjs/core@^2.11.8": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" @@ -1810,6 +1952,11 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.8.0.tgz#c5545e6a5d2bd5c26b4021c357177a28698c950e" integrity sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ== +"@scure/base@^1.1.5": + 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== + "@sentry-internal/feedback@7.108.0": version "7.108.0" resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.108.0.tgz#7033352abd304f1383ec47640e056a0dfd5132b7" @@ -1966,6 +2113,11 @@ resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.2.1.tgz#df4bdfd20e0492681716eaca51c086a018b2bdb9" integrity sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ== +"@substrate/ss58-registry@^1.44.0": + version "1.47.0" + resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.47.0.tgz#99b11fd3c16657f5eae483b3df7c545ca756d1fc" + integrity sha512-6kuIJedRcisUJS2pgksEH2jZf3hfSIVzqtFzs/AyjTW3ETbMg5q1Bb7VWa0WYaT6dTrEXp/6UoXM5B9pSIUmcw== + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -2129,6 +2281,13 @@ dependencies: "@types/estree" "*" +"@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== + dependencies: + "@types/node" "*" + "@types/d3-scale-chromatic@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" @@ -2741,6 +2900,11 @@ bluebird@^2.3.5, bluebird@^2.6.2, bluebird@^2.8.1, bluebird@^2.8.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" integrity sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ== +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -8941,7 +9105,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==