diff --git a/package.json b/package.json index 284811f..f1db763 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,13 @@ "@rainbow-me/rainbowkit": "^1.3.3", "@types/styled-components": "^5.1.34", "lucide-react": "^0.314.0", + "nextra": "^2.13.4", + "nextra-theme-docs": "^2.13.4", + "sharp": "^0.33.4", "next": "^14.2.3", "next-compose-plugins": "^2.2.1", - "nextra": "^2.13.2", - "nextra-theme-docs": "^2.13.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "sharp": "^0.33.2", "styled-components": "^6.1.11", "tailwind-merge": "^2.2.1", "viem": "^1.21.4", diff --git a/pages/_meta.json b/pages/_meta.json index e82e6d9..d8098c8 100644 --- a/pages/_meta.json +++ b/pages/_meta.json @@ -4,8 +4,11 @@ "title": "General" }, "index": "Introduction", - "overview": "Overview", - "submit-feedback": "Submit Feedback", + "general-overview": "Overview", + "general-staking": "Staking", + "general-governance": "Governance", + "general-submit-feedback": "Submit Feedback", + "general-brand-kit": "Brand Kit", "-- For Users": { "title": "For Users", "type": "separator" @@ -13,26 +16,23 @@ "user-quickstart": "Quickstart", "user-guides": "User Guides", "user-FAQ": "FAQ", - "ecosystem-apps": "Ecosystem Apps", - "-- For Devs": { + "user-ecosystem-apps": "Ecosystem Apps", + "-- For Developers": { "type": "separator", - "title": "For Devs" + "title": "For Developers" }, - "getting-started": "Getting Started", - "quickstart": "Quickstart", - "tools-and-resources": "Tools & Resources", - "-- Infrastructure Operators": { - "type": "separator", - "title": "Infrastructure" - }, - "node-operators": "Node Operators", - "oracles": "Oracles", - "-- Advanced": { - "type": "separator", - "title": "Advanced" - }, - "token-standards": "Token Standards", - "interoperability": "EVM <> Wasm Interoperability", + "dev-intro": "Introduction", + "dev-chains": "Chains", + "dev-token-standards": "Token Standards", + "dev-gas": "Gas", + "dev-smart-contracts": "Smart Contracts", + "dev-frontend-dapps": "Frontend dApps", + "dev-ecosystem-providers": "Ecosystem & Providers", + "dev-tutorials": "Tutorials", + "dev-node": "Nodes", + "dev-validators": "Validators", + "dev-advanced-concepts": "Advanced Concepts", + "dev-resources": "Resources", "landing": { "title": "Back to Sei ↗", "type": "page", diff --git a/pages/dev-advanced-concepts/_meta.json b/pages/dev-advanced-concepts/_meta.json new file mode 100644 index 0000000..c167fc3 --- /dev/null +++ b/pages/dev-advanced-concepts/_meta.json @@ -0,0 +1,12 @@ +{ + "fee-grants": "Fee Grants", + "account-structure": "Account Structure", + "hardware-wallets": "Hardware Wallets", + "querying-historical-state": "Querying Historical State", + "oracles": "Oracles", + "execute-multiple": "Execute Multiple Transactions", + "hd-path-coin-types": "HD Path & Coin Types", + "proposals": "Proposals", + "evm-rpc-endpoints": "EVM RPC Endpoints", + "interoperability": "Interoperability" +} diff --git a/pages/dev-advanced-concepts/account-structure.mdx b/pages/dev-advanced-concepts/account-structure.mdx new file mode 100644 index 0000000..c0e43ef --- /dev/null +++ b/pages/dev-advanced-concepts/account-structure.mdx @@ -0,0 +1,27 @@ +# Account Structure + +Both EVM derived (0x) and Sei bech32 derived addresses on Sei are derived from the same public key. Accounts are automatically linked once a transaction is broadcasted and the chain has their public key. This ensures that balances and transactions are reflected consistently across both address formats. + +### How It Works + +**Auto-linking**: + +- When an account broadcasts a transaction, the public key is recorded on-chain. This allows for the automatic linking of EVM and Sei addresses. Balances will be reflected in both address formats once linked. + +**Manual Association**: + +- If the chain does not yet have the public key, users can manually associate their accounts using the `sei_associate` function. This is a gasless function that requires at least 1 wei in their account to execute. More details can be found in the [EVM RPC Endpoints documentation](https://v2.docs.sei.io/evm-rpc-endpoints#sei_associate). + +### Key Points + +- **Different Accounts Before Linking**: Until these accounts are linked, the chain treats the Sei address and EVM address as different accounts with different balances. This means that certain dApps may not be able to access your full balance until the accounts are linked. +- **Public Key Requirement**: The linking won’t happen until the chain has the public key. Using `sei_associate`, users can provide their public key to the chain without any gas fees, as long as they have at least 1 wei in their account. + +### Example + +1. **Broadcast a Transaction**: When you make any transaction from your EVM account, the public key is recorded, and the accounts get linked automatically. +2. **Manual Association Using `sei_associate`**: If the accounts are not linked automatically, you can manually associate them with the following command as long as the account you are trying to associate has at least 1 wei in it: + +``` +seid tx evm associate-address [optional priv key hex] --rpc= --from= [flags] +``` diff --git a/pages/evm-rpc-endpoints.mdx b/pages/dev-advanced-concepts/evm-rpc-endpoints.mdx similarity index 100% rename from pages/evm-rpc-endpoints.mdx rename to pages/dev-advanced-concepts/evm-rpc-endpoints.mdx diff --git a/pages/dev-advanced-concepts/execute-multiple.mdx b/pages/dev-advanced-concepts/execute-multiple.mdx new file mode 100644 index 0000000..99a67b5 --- /dev/null +++ b/pages/dev-advanced-concepts/execute-multiple.mdx @@ -0,0 +1,161 @@ +On the Sei blockchain, you can execute multiple messages in a single transaction, which allows for more complex operations to be performed atomically. This section explains how the transaction structure works and how to add multiple messages, even of different types, in one transaction using both CosmJS and seid. + +## **Transaction Structure** + +A transaction on the Sei blockchain consists of the following main components: + +• **Body**: Contains the list of messages to be executed, memo, timeout height, and extension options. + +• **Auth Info**: Includes signer information and fee details. + +• **Signatures**: Holds the signatures of the signers authorizing the transaction. + +Here’s a general structure of a transaction: + +```tsx +{ + "body": { + "messages": [ + // List of messages + ], + "memo": "", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [], + "fee": { + "amount": [ + { + "denom": "usei", + "amount": "100000" + } + ], + "gas_limit": "200000", + "payer": "", + "granter": "" + } + }, + "signatures": [] +} +``` + +## **Adding Multiple Messages** + +You can add multiple messages of different types in the messages array. Here’s how you can do this using CosmJS and seid. + +### **Using CosmJS** + +```tsx +const { DirectSecp256k1HdWallet } = require("@cosmjs/proto-signing"); +const { SigningStargateClient, assertIsBroadcastTxSuccess, coins } = require("@cosmjs/stargate"); + +async function sendTransaction() { + const rpcEndpoint = "https://rpc-endpoint"; + const mnemonic = "your mnemonic"; + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: "sei" }); + const [account] = await wallet.getAccounts(); + + const client = await SigningStargateClient.connectWithSigner(rpcEndpoint, wallet); + + const msgSend = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: account.address, + toAddress: "sei1destinationaddress", + amount: coins(1000, "usei"), + }, + }; + + const msgDelegate = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: { + delegatorAddress: account.address, + validatorAddress: "sei1validatoraddress", + amount: coins(500, "usei"), + }, + }; + + const fee = { + amount: coins(2000, "usei"), + gas: "200000", + }; + + const memo = "Transaction with multiple messages"; + + const result = await client.signAndBroadcast(account.address, [msgSend, msgDelegate], fee, memo); + assertIsBroadcastTxSuccess(result); + console.log(result); +} + +sendTransaction().catch(console.error); +``` + +## Using seid + +To create and broadcast a transaction with multiple messages using seid, follow these steps: + +1. **Define the Unsigned Transaction**: + +Create an unsigned-tx.json file with multiple messages: + +```tsx +{ + "body": { + "messages": [ + { + "@type": "/cosmos.bank.v1beta1.MsgSend", + "from_address": "sei1sourceaddress", + "to_address": "sei1destinationaddress", + "amount": [ + { + "denom": "usei", + "amount": "1000" + } + ] + }, + { + "@type": "/cosmos.staking.v1beta1.MsgDelegate", + "delegator_address": "sei1sourceaddress", + "validator_address": "sei1validatoraddress", + "amount": { + "denom": "usei", + "amount": "500" + } + } + ], + "memo": "Transaction with multiple messages", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [], + "fee": { + "amount": [ + { + "denom": "usei", + "amount": "2000" + } + ], + "gas_limit": "200000", + "payer": "", + "granter": "" + } + }, + "signatures": [] +} +``` + +2. **Sign the Transaction**: + +```tsx +seid tx sign unsigned-tx.json --from --output-document=signed-tx.json --node +``` + +3. **Broadcast the Signed Transaction**: + +```tsx +seid tx broadcast signed-tx.json --node +``` diff --git a/pages/dev-advanced-concepts/fee-grants.mdx b/pages/dev-advanced-concepts/fee-grants.mdx new file mode 100644 index 0000000..187ff92 --- /dev/null +++ b/pages/dev-advanced-concepts/fee-grants.mdx @@ -0,0 +1,101 @@ +# Fee Grants + +Fee grants allow an account to pay for the transaction fees of another account, which is especially useful for onboarding new users who might not have enough tokens to cover transaction fees. This feature is supported in the Cosmos SDK. + +- **How They Work**: Fee grants can be set up so that one account (the granter) can pay for the transaction fees of another account (the grantee). The granter specifies conditions under which the fees will be paid. +- **Documentation**: Detailed documentation on fee grants can be found in the [Cosmos SDK Fee Grants Documentation](https://docs.cosmos.network/v0.46/modules/feegrant/). + +### Granting + +seid + +`seid tx feegrant grant [granter_key_or_address] [grantee]` + +cosmjs + +```jsx +const { SigningStargateClient, GasPrice } = require("@cosmjs/stargate"); +const { DirectSecp256k1HdWallet } = require("@cosmjs/proto-signing"); + +async function grantFeeGrant(rpcEndpoint, granterMnemonic, granteeAddress) { + const granterWallet = await DirectSecp256k1HdWallet.fromMnemonic(granterMnemonic, { prefix: "sei" }); + const [granterAccount] = await granterWallet.getAccounts(); + + const client = await SigningStargateClient.connectWithSigner(rpcEndpoint, granterWallet, { + gasPrice: GasPrice.fromString("0.025usei"), + }); + + const msg = { + typeUrl: "/cosmos.feegrant.v1beta1.MsgGrantAllowance", + value: { + granter: granterAccount.address, + grantee: granteeAddress, + allowance: { + typeUrl: "/cosmos.feegrant.v1beta1.BasicAllowance", + value: { + spendLimit: [{ denom: "usei", amount: "1000000" }], + expiration: null, + }, + }, + }, + }; + + const fee = { + amount: [{ denom: "usei", amount: "5000" }], + gas: "200000", + }; + + const result = await client.signAndBroadcast(granterAccount.address, [msg], fee); + console.log(result); +} + +const rpcEndpoint = "https://rpc-endpoint"; +const granterMnemonic = "your-granter-mnemonic"; +const granteeAddress = "sei1granteeaddress"; + +grantFeeGrant(rpcEndpoint, granterMnemonic, granteeAddress); +``` + +### Revoking + +seid + +`seid tx feegrant revoke [granter] [grantee] [flags]` + +cosmjs + +```jsx +const { SigningStargateClient, GasPrice } = require("@cosmjs/stargate"); +const { DirectSecp256k1HdWallet } = require("@cosmjs/proto-signing"); + +async function revokeFeeGrant(rpcEndpoint, granterMnemonic, granteeAddress) { + const granterWallet = await DirectSecp256k1HdWallet.fromMnemonic(granterMnemonic, { prefix: "sei" }); + const [granterAccount] = await granterWallet.getAccounts(); + + const client = await SigningStargateClient.connectWithSigner(rpcEndpoint, granterWallet, { + gasPrice: GasPrice.fromString("0.025usei"), + }); + + const msg = { + typeUrl: "/cosmos.feegrant.v1beta1.MsgRevokeAllowance", + value: { + granter: granterAccount.address, + grantee: granteeAddress, + }, + }; + + const fee = { + amount: [{ denom: "usei", amount: "5000" }], + gas: "200000", + }; + + const result = await client.signAndBroadcast(granterAccount.address, [msg], fee); + console.log(result); +} + +const rpcEndpoint = "https://rpc-endpoint"; +const granterMnemonic = "your-granter-mnemonic"; +const granteeAddress = "sei1granteeaddress"; + +revokeFeeGrant(rpcEndpoint, granterMnemonic, granteeAddress); +``` diff --git a/pages/dev-advanced-concepts/hardware-wallets.mdx b/pages/dev-advanced-concepts/hardware-wallets.mdx new file mode 100644 index 0000000..ff773fb --- /dev/null +++ b/pages/dev-advanced-concepts/hardware-wallets.mdx @@ -0,0 +1,31 @@ +# Hardware Wallets + +Signing transactions manually or using hardware wallets like Ledger ensures secure transaction approval. In order to sign Sei transactions you must have the Cosmos app installed on your wallet and interact with a Cosmos RPC endpoint. + +## **Using MetaMask with Ledger** + +To connect your Ledger device through MetaMask and sign transactions: + +1. **Install MetaMask**: Ensure MetaMask is installed on your browser. + +2. **Connect Ledger**: Open MetaMask, go to the account options, and select “Connect Hardware Wallet”. + +3. **Follow Instructions**: Follow the on-screen instructions to connect your Ledger device and select the account you want to use. + +4. **Sign Transactions**: Once connected, you can sign transactions directly through MetaMask using your Ledger device. + +## **Using Compass with Ledger** + +To use Compass for secure transaction signing with a Ledger device: + +1. **Add Hardware Wallet**: When adding a new account in Compass, select the option to add a hardware wallet. + +2. **Connect Ledger**: Follow the instructions to connect your Ledger device and select the account you wish to add. + +3. **Sign Transactions**: Use the connected Ledger device to securely sign transactions through the Compass interface. + +**Installing the Cosmos App on Ledger** + +Before you can use your Ledger device to sign transactions, ensure you have the Cosmos app installed. You can download it from the Ledger app store: + +• [Ledger App Store - Cosmos App](https://www.ledger.com/apps/cosmos) diff --git a/pages/dev-advanced-concepts/hd-path-coin-types.mdx b/pages/dev-advanced-concepts/hd-path-coin-types.mdx new file mode 100644 index 0000000..c6d5230 --- /dev/null +++ b/pages/dev-advanced-concepts/hd-path-coin-types.mdx @@ -0,0 +1,25 @@ +# **HD Paths and Coin Types** + +When deriving a private key from a mnemonic phrase, the hierarchical deterministic (HD) path involves multiple parameters, including the coin type. The coin type determines the blockchain ecosystem for which the key is derived, making it crucial when dealing with different wallets and blockchains. + +## **Coin Type Parameter** + +The second parameter in the HD path specifies the coin type, which is defined by the BIP-44 standard. This parameter identifies the blockchain ecosystem associated with the derived keys. + +• **Ethereum (Coin Type 60)**: Wallets like MetaMask use coin type 60. The HD path for Ethereum typically looks like this: m/44'/60'/0'/0/0. + +• **Cosmos (Coin Type 118)**: Wallets for Cosmos-based chains, such as Compass, use coin type 118. The HD path for Cosmos typically looks like this: m/44'/118'/0'/0/0. + +## **Implications** + +Due to the different coin types, a mnemonic phrase used to derive keys for Ethereum (coin type 60) cannot be directly used in a Cosmos wallet (coin type 118) to access the same accounts. This is because the HD path determines a different set of keys for each coin type, meaning the derived addresses will differ. + +## **Private Key Export** + +Users can export their private key from MetaMask (derived using coin type 60) and import it into any Cosmos wallet. This works because the private key, once derived, can be used across different blockchain ecosystems, provided the receiving wallet supports the import function. This allows users to manage their assets across various blockchains using the same underlying cryptographic key. + +**Example HD Paths** + +• **Traditional Cosmos Path**: m/44'/118'/0'/0/0 + +• **Traditional EVM Path**: m/44'/60'/0'/0/0 diff --git a/pages/dev-advanced-concepts/interoperability/_meta.json b/pages/dev-advanced-concepts/interoperability/_meta.json new file mode 100644 index 0000000..c054462 --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/_meta.json @@ -0,0 +1,4 @@ +{ + "introduction": "Introduction", + "precompiles": "EVM Precompiles" +} diff --git a/pages/interoperability/overview.mdx b/pages/dev-advanced-concepts/interoperability/introduction.mdx similarity index 78% rename from pages/interoperability/overview.mdx rename to pages/dev-advanced-concepts/interoperability/introduction.mdx index 98607ff..451b5ba 100644 --- a/pages/interoperability/overview.mdx +++ b/pages/dev-advanced-concepts/interoperability/introduction.mdx @@ -1,5 +1,6 @@ -import { ImageWithCaption } from "../../components"; -import interoperability from "../../public/assets/interoperability.png"; +import {ImageWithCaption} from "../../../components/ImageWithCaption"; + +import interoperability from '../../../public/assets/interoperability.png'; # EVM version Shanghai @@ -22,8 +23,16 @@ Sei precompiles are smart contracts embedded directly within the Sei blockchain. The following is a list of precompiled contracts available on Sei: +- [Addr](./precompiles/addr.mdx) +- [Bank](./precompiles/bank.mdx) - [CosmWasm](./precompiles/cosmwasm.mdx) - [Staking](./precompiles/staking.mdx) +- [Distribution](./precompiles/distribution.mdx) +- [IBC](./precompiles/ibc.mdx) +- [JSON](./precompiles/json.mdx) +- [Oracle](./precompiles/oracle.mdx) +- [Pointer](./precompiles/pointer.mdx) +- [PointerView](./precompiles/pointerview.mdx) - [Governance](./precompiles/governance.mdx) For instructions on utilizing these precompiles, refer to the [Example Usage](./precompiles/example-usage.mdx) section. @@ -34,4 +43,4 @@ Pointer Contracts are a unique feature introduced on Sei, designed to enhance in These contracts facilitate the creation of links between tokens across both EVM and CosmWasm. This enables tokens to move smoothly and be used seamlessly in both environments. -Learn more about Pointer Contracts and how to deploy them [here](./pointer-contracts.mdx). +Learn more about Pointer Contracts and how to deploy them [here](../../dev-tutorials/pointer-contracts.mdx ). diff --git a/pages/dev-advanced-concepts/interoperability/precompiles/_meta.json b/pages/dev-advanced-concepts/interoperability/precompiles/_meta.json new file mode 100644 index 0000000..65b8958 --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/precompiles/_meta.json @@ -0,0 +1,14 @@ +{ + "example-usage": "Example Usage", + "addr": "Addresses", + "bank": "Bank", + "staking": "Staking", + "distribution": "Distribution", + "cosmwasm": "CosmWasm", + "ibc": "IBC", + "json": "JSON", + "oracle": "Oracle", + "pointer": "Pointer", + "pointerview": "PointerView", + "governance": "Governance" +} diff --git a/pages/interoperability/precompiles/addr.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/addr.mdx similarity index 94% rename from pages/interoperability/precompiles/addr.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/addr.mdx index 1cbdd37..6e1d476 100644 --- a/pages/interoperability/precompiles/addr.mdx +++ b/pages/dev-advanced-concepts/interoperability/precompiles/addr.mdx @@ -34,5 +34,5 @@ Association takes place when the wallet first signs and broadcasts any transacti View the Addr precompile source code and the contract ABI - [here](https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/addr). + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/addr). diff --git a/pages/interoperability/precompiles/bank.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/bank.mdx similarity index 88% rename from pages/interoperability/precompiles/bank.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/bank.mdx index a180ff0..70d5293 100644 --- a/pages/interoperability/precompiles/bank.mdx +++ b/pages/dev-advanced-concepts/interoperability/precompiles/bank.mdx @@ -48,6 +48,15 @@ This precompile enables EVM clients to interact with the bank module. string memory denom ) external view returns (uint256 amount); ``` +- `all_balances`: Queries all balances of the given acount. +```solidity + /// Queries the balance of the given account for all balances. + /// @param acc The Sei address of the account to query. + /// @return balances for all coins/denoms. + function all_balances( + address acc + ) external view returns (Coin[] memory response); + ``` - `name`: Queries the name of the given denom. ```solidity @@ -91,5 +100,5 @@ This precompile enables EVM clients to interact with the bank module. View the Bank precompile source code and the contract ABI - [here](https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/bank). + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/bank). diff --git a/pages/interoperability/precompiles/cosmwasm.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/cosmwasm.mdx similarity index 77% rename from pages/interoperability/precompiles/cosmwasm.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/cosmwasm.mdx index 04825ec..9ceb041 100644 --- a/pages/interoperability/precompiles/cosmwasm.mdx +++ b/pages/dev-advanced-concepts/interoperability/precompiles/cosmwasm.mdx @@ -47,6 +47,24 @@ This precompile serves as an interface to the CosmWasm module, enabling EVM base ) payable external returns (bytes memory response); ``` +- `execute_batch`: Sends a messages to a CosmWasm contract for execution + +**Payable**: Any Sei amounts required for contract execution must be sent to the contract directly. Use the `coins` field for other params. + + ```solidity + struct ExecuteMsg { + string contractAddress; + bytes msg; + bytes coins; + } + /// Executes collection of messages on a CosmWasm contract. + /// @param executeMsgs The Sei address of the contract to execute. + /// @return The execution responses collection from the CosmWasm contract. + function execute_batch( + ExecuteMsg[] memory executeMsgs + ) payable external returns (bytes[] memory responses); + ``` + ### Queries - `query`: Queries a CosmWasm contract state ```solidity @@ -62,5 +80,5 @@ This precompile serves as an interface to the CosmWasm module, enabling EVM base View the CosmWasm precompile source code and the contract ABI - [here](https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/wasmd). + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/wasmd). diff --git a/pages/interoperability/precompiles/distribution.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/distribution.mdx similarity index 92% rename from pages/interoperability/precompiles/distribution.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/distribution.mdx index 0345313..fc5b199 100644 --- a/pages/interoperability/precompiles/distribution.mdx +++ b/pages/dev-advanced-concepts/interoperability/precompiles/distribution.mdx @@ -31,5 +31,5 @@ This precompile enables EVM clients to withdraw distributions and staking reward View the distribution precompile source code and the contract ABI - [here](https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/distribution). + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/distribution). diff --git a/pages/interoperability/precompiles/example-usage.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/example-usage.mdx similarity index 70% rename from pages/interoperability/precompiles/example-usage.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/example-usage.mdx index 1c49a48..3a1bae6 100644 --- a/pages/interoperability/precompiles/example-usage.mdx +++ b/pages/dev-advanced-concepts/interoperability/precompiles/example-usage.mdx @@ -10,71 +10,15 @@ To install `ethers`, run the following command in your project directory termina ```bash copy npm install ethers +npm install @sei-js/evm ``` -Next, you'll need to use one of the precompiles listed above. In this example, we're going to be using the Wasm precompile: +Next, you'll need to use one of the precompiles in `EVM Precompiles` section. In this example, we're going to be using the [CosmWasm precompile](./cosmwasm.mdx): ```typescript copy -// Wasm precompile address -const WASM_PRECOMPILE_ADDRESS = "0x0000000000000000000000000000000000001002"; - -// The precompiled contract ABI (fragments we care about) +// Import Wasm precompile address and ABI // View the entire ABI here: https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/wasmd -const WASM_PRECOMPILE_ABI = [ - { - inputs: [ - { - internalType: "string", - name: "contractAddress", - type: "string", - }, - { - internalType: "bytes", - name: "msg", - type: "bytes", - }, - { - internalType: "bytes", - name: "coins", - type: "bytes", - }, - ], - name: "execute", - outputs: [ - { - internalType: "bytes", - name: "response", - type: "bytes", - }, - ], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "contractAddress", - type: "string", - }, - { - internalType: "bytes", - name: "req", - type: "bytes", - }, - ], - name: "query", - outputs: [ - { - internalType: "bytes", - name: "response", - type: "bytes", - }, - ], - stateMutability: "view", - type: "function", - }, -]; +import { WASM_PRECOMPILE_ABI, WASM_PRECOMPILE_ADDRESS } from "@sei-js/evm"; ``` ## Using the contract @@ -101,11 +45,11 @@ const contract = new ethers.Contract( Learn how to import the Sei EVM Devnet chain [here](/setting-up-a-wallet). -#### Querying & Executing a CosmWasm Contraact +#### Querying & Executing a CosmWasm Contract Once you have the contract, you can query and execute messages to any CosmWasm smart contract. -```typescript +```typescript copy // Counter CosmWasm contract (used for testing on arctic-1) // Replace with your contract as needed const COUNTER_CONTRACT_ADDRESS = @@ -136,7 +80,7 @@ console.log(executeResponse); ### Executing a payable function In this example, we execute the 'donate' method on our contract. This is similar to the `increment` method, but also receives funds from the user and stores it in the contract. -```typescript +```typescript copy // Execute a message to donate to the contract. const executeMsg = { donate: {} } diff --git a/pages/interoperability/precompiles/governance.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/governance.mdx similarity index 94% rename from pages/interoperability/precompiles/governance.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/governance.mdx index e321bfe..6ba228d 100644 --- a/pages/interoperability/precompiles/governance.mdx +++ b/pages/dev-advanced-concepts/interoperability/precompiles/governance.mdx @@ -34,5 +34,5 @@ This precompile enables participation in Sei's governance process through the EV View the Governance precompile source code and the contract ABI - [here](https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/gov). + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/gov). diff --git a/pages/dev-advanced-concepts/interoperability/precompiles/ibc.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/ibc.mdx new file mode 100644 index 0000000..f33399b --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/precompiles/ibc.mdx @@ -0,0 +1,67 @@ +import { Callout } from "nextra/components"; + +# IBC Precompile + +**Address**: `0x0000000000000000000000000000000000001009` + +This precompile enables funds transfer over IBC protocol. + +## Functions + +### Transactions +- `transfer`: Send funds to another chain using IBC protocol. + + ```solidity + /// Send funds to another chain using IBC protocol. + /// @param toAddress The recipient's address on the other chain + /// @param port IBC port in source chain (e.g. 'transfer') + /// @param channel IBC channel in source chain (e.g. 'channel-0') + /// @param denom The denomination of the tokens to send + /// @param amount The amount of tokens to send + /// @param revisionNumber The revision number of the source chain + /// @param revisionHeight The revision height of the source chain + /// @param timeoutTimestamp The timeout timestamp of the source chain + /// @param memo The memo to include in the transaction, if no memo is needed, pass an empty string + /// @return Whether the transfer was successfully executed. + function transfer( + string toAddress, + string memory port, + string memory channel, + string memory denom, + uint256 amount, + uint64 revisionNumber, + uint64 revisionHeight, + uint64 timeoutTimestamp, + string memo + ) external returns (bool success); + ``` +- `transferWithDefaultTimeout`: Send funds to another chain using IBC protocol. Calculates the timeout +height/timestamp based on the current block timestamp. + + ```solidity + /// Send funds to another chain using IBC protocol. Calculates the timeout height/timestamp + /// based on the current block timestamp. + /// @param toAddress The recipient's address on the other chain + /// @param port IBC port in source chain (e.g. 'transfer') + /// @param channel IBC channel in source chain (e.g. 'channel-0') + /// @param denom The denomination of the tokens to send + /// @param amount The amount of tokens to send + /// @param memo The memo to include in the transaction, if no memo is needed, pass an empty string + /// @return Whether the transfer was successfully executed. + function transferWithDefaultTimeout( + string toAddress, + string memory port, + string memory channel, + string memory denom, + uint256 amount, + uint64 revisionNumber, + uint64 revisionHeight, + uint64 timeoutTimestamp, + string memo + ) external returns (bool success); + ``` + + + View the IBC precompile source code and the contract ABI + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/ibc). + diff --git a/pages/dev-advanced-concepts/interoperability/precompiles/json.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/json.mdx new file mode 100644 index 0000000..887b4ae --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/precompiles/json.mdx @@ -0,0 +1,49 @@ +import { Callout } from "nextra/components"; + +# JSON Precompile + +**Address**: `0x0000000000000000000000000000000000001003` + +This precompile enables EVM clients to query JSON data. + + +## Functions + +### Queries +- `extractAsBytes`: Extracts data as bytes from the input using the specified key. + ```solidity + /// Extracts data as bytes from the input using the specified key. + /// @param input The input data. + /// @param key The key to extract. + /// @return The extracted data as bytes. + function extractAsBytes( + bytes memory input, + string memory key) external view returns (bytes memory response); + ``` + +- `extractAsBytesList`: Extracts data as a list of bytes from the input using the specified key. + ```solidity + /// Extracts data as a list of bytes from the input using the specified key. + /// @param input The input data. + /// @param key The key to extract. + /// @return The extracted data as bytes collection. + function extractAsBytesList( + bytes memory input, + string memory key) external view returns (bytes[] memory response); + ``` + +- `extractAsUint256`: Extracts data as a uint256 from the input using the specified key. + ```solidity + /// Extracts data as a list of bytes from the input using the specified key. + /// @param input The input data. + /// @param key The key to extract. + /// @return The extracted uint256. + function extractAsUint256( + bytes memory input, + string memory key) external view returns (uint256 response); + ``` + + + View the JSON precompile source code and the contract ABI + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/json). + diff --git a/pages/dev-advanced-concepts/interoperability/precompiles/oracle.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/oracle.mdx new file mode 100644 index 0000000..67025bc --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/precompiles/oracle.mdx @@ -0,0 +1,50 @@ +import { Callout } from "nextra/components"; + +# Orcale Precompile + +**Address**: `0x0000000000000000000000000000000000001008` + +This precompile enables EVM clients to query the Oracle module. + +## Functions + +### Queries +- `getExchangeRates`: Gets the corresponding Sei Address from the given EVM Address + ```solidity + /// Retrieves the exchange rates for all denominations. + /// @return An array of denomination and exchange rate pairs. + function getExchangeRates() external view returns (DenomOracleExchangeRatePair[] memory); + + // Structs + struct OracleExchangeRate { + string exchangeRate; + string lastUpdate; + int64 lastUpdateTimestamp; + } + + struct DenomOracleExchangeRatePair { + string denom; + OracleExchangeRate oracleExchangeRateVal; + } + ``` + +- `getOracleTwaps`: Retrieves Oracle Time-Weighted Average Prices (TWAPs) for the specified lookback period. + ```solidity + /// Retrieves Oracle Time-Weighted Average Prices (TWAPs) for the specified lookback period. + /// @param lookback_seconds The lookback period in seconds. + /// @return An array of denomination and TWAP pairs. + function getOracleTwaps( + uint64 lookback_seconds) external view returns (OracleTwap[] memory); + + // Structs + struct OracleTwap { + string denom; + string twap; + int64 lookbackSeconds; + } + ``` + + + View the Oracle precompile source code and the contract ABI + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/oracle). + diff --git a/pages/dev-advanced-concepts/interoperability/precompiles/pointer.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/pointer.mdx new file mode 100644 index 0000000..fe6c2fe --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/precompiles/pointer.mdx @@ -0,0 +1,44 @@ +import { Callout } from "nextra/components"; + +# Pointer Precompile + +**Address**: `0x000000000000000000000000000000000000100b` + +This precompile enables EVM clients to add pointers to the CosmWasm contracts. + +## Functions + +### Transactions +- `addNativePointer`: Adds a native pointer for the contract. + ```solidity + /// Adds a native pointer for the contract. + /// @param token The native token to add. + /// @return An Ethereum address of the pointer. + function addNativePointer( + string memory token + ) external returns (address ret); + ``` + +- `addCW20Pointer`: Adds a CW20 pointer for the contract. + ```solidity + /// Adds a CW20 pointer for the contract. + /// @param cwAddr The CW20 contract address to add. + /// @return An Ethereum address of the pointer. + function addCW20Pointer( + string memory cwAddr + ) external returns (address ret); + ``` + +- `addCW20Pointer`: Adds a CW721 pointer for the contract. + ```solidity + /// Adds a CW721 pointer for the contract. + /// @param cwAddr The CW721 contract address to add. + /// @return An Ethereum address of the pointer. + function addCW721Pointer( + string memory cwAddr + ) external returns (address ret); + ``` + + View the Pointer precompile source code and the contract ABI + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/pointer). + diff --git a/pages/dev-advanced-concepts/interoperability/precompiles/pointerview.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/pointerview.mdx new file mode 100644 index 0000000..c8e5085 --- /dev/null +++ b/pages/dev-advanced-concepts/interoperability/precompiles/pointerview.mdx @@ -0,0 +1,44 @@ +import { Callout } from "nextra/components"; + +# Pointer Precompile + +**Address**: `0x000000000000000000000000000000000000100A` + +This precompile enables EVM clients to query pointers to the CosmWasm contracts. + +## Functions + +### Queries +- `getNativePointer`: Retrieves the pointer address, version, and existence status for the specified native token. + ```solidity + /// Retrieves the pointer address, version, and existence status for the specified native token. + /// @param token The native token to query. + /// @return the address, version, and existence status. + function getNativePointer( + string memory token + ) view external returns (address addr, uint16 version, bool exists); + ``` + +- `getCW20Pointer`: Retrieves the pointer address, version, and existence status for the specified CW20 contract address. + ```solidity + /// Retrieves the pointer address, version, and existence status for the specified CW20 contract address. + /// @param cwAddr The CW20 contract address to query. + /// @return the address, version, and existence status. + function getCW20Pointer( + string memory cwAddr + ) view external returns (address addr, uint16 version, bool exists); + ``` + +- `getCW721Pointer`: Retrieves the pointer address, version, and existence status for the specified CW721 contract address. + ```solidity + /// Retrieves the pointer address, version, and existence status for the specified CW721 contract address. + /// @param cwAddr The CW721 contract address to query. + /// @return the address, version, and existence status. + function getCW721Pointer( + string memory cwAddr + ) view external returns (address addr, uint16 version, bool exists); + ``` + + View the PointerView precompile source code and the contract ABI + [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/pointerview). + diff --git a/pages/interoperability/precompiles/staking.mdx b/pages/dev-advanced-concepts/interoperability/precompiles/staking.mdx similarity index 100% rename from pages/interoperability/precompiles/staking.mdx rename to pages/dev-advanced-concepts/interoperability/precompiles/staking.mdx diff --git a/pages/oracles/introduction.mdx b/pages/dev-advanced-concepts/oracles.mdx similarity index 100% rename from pages/oracles/introduction.mdx rename to pages/dev-advanced-concepts/oracles.mdx diff --git a/pages/dev-advanced-concepts/proposals.mdx b/pages/dev-advanced-concepts/proposals.mdx new file mode 100644 index 0000000..ff34155 --- /dev/null +++ b/pages/dev-advanced-concepts/proposals.mdx @@ -0,0 +1,105 @@ +# Creating a New Proposal +Anybody can create a governance proposal which will start in the deposit period, and will be promoted to voting period once the minimum deposit amount is met. Anyone can deposit to a proposal in deposit period. + +## Submit Proposal +To submit a new proposal, you can send a transaction with the proposal details and a specified deposit amount. This deposit amount doesn't have to be greater than the MinDeposit (minimum to enter voting) amount, but until the overall deposit amount is met, the proposal will remain in deposit period. + +A submit-proposal transaction must include a nonzero positive deposit amount + +Example +```bash +seid tx gov submit-proposal param-change proposal.json --from {proposer_key} +``` + +Note that we allow for expedited proposals via the --is-expedited flag. This halves the time of the proposal but requires twice the amount of deposit. + +## Query Proposal +You can also view existing proposal details and the state of the proposal (deposit period, voting period, etc) by querying for a specific proposal id. + +Example +```bash +seid query gov proposal {proposal_id} +``` + +You can also query for the proposer for a specified proposal to view the address that initially submitted the proposal + +Example +```bash +seid query gov proposer {proposal_id} +``` + +## Deposit for Proposal +If a created proposal is in a pending deposit period, you can add to the deposits in order to contribute for the proposal to enter the voting period. The deposit amount is denominated in amount to deposit and the deposit token such as 10000sei. + +If a proposal fails to meet MinDeposit before the deposit period ends, ALL deposits are burned + +Example +```bash +seid tx gov deposit {proposal_id} {deposit_amount} --from {your_key} +``` + +## Query deposits +A user can query the deposit made by a specific address on a specific proposal. This can be used to see your current deposit amount or to see the amount another account deposited. + +Example +```bash +seid query gov deposit {proposal_id} {depositor_addr} +``` + +You can also query all deposits made for a proposal with a separate query command. + +Example +```bash +seid query gov deposits {proposal_id} +``` + +## Voting on proposals +This allows an address to vote on a specified proposal. There are four voting options when voting on a proposal + +- yes +- no +- abstain +- no_with_veto + +Example +```bash +seid tx gov vote {proposal_id} {vote_option} --from {voter_key} --chain-id {chain_id} +``` + +## Weighted Vote +The weighted vote transaction allows a voter to partially allocate voting power to various voting options. This is especially useful in cases where the vote is voting on the behalf of multiple stakeholders with different voting decisions. + +When performing a weighted vote, the transaction is executed with voting weights instead of a single option. The voting weights are expressed as a comma separated string of vote options mapping to voting weights. The voting weights must add up to 1 for the transaction to be valid. + +### Defining Weights +```bash +voting_weights=yes=0.3,no=0.2,no_with_veto=0.15,abstain=0.35 +``` + +### Example +```bash +seid tx gov weighted-vote {proposal_id} {voting_weights} --from {voter_key} --chain-id {chain_id} +``` + +## Query Proposal Details +This will return the information about a single proposal specified by proposal_id. + +Example +```bash +seid query gov proposal {proposal_id} --chain-id {chain_id} +``` + +## Query Proposal Tally +This will return the current vote tally for the proposal_id provided. + +```bash +seid query gov tally {proposal_id} --chain-id {chain_id} +``` + +## Query Individual Vote +This will query the vote information for a specific voter address and proposal id. + +Example +```bash +seid query gov vote {proposal_id} {voter_addr} --chain-id {chain_id} +``` diff --git a/pages/dev-advanced-concepts/querying-historical-state.mdx b/pages/dev-advanced-concepts/querying-historical-state.mdx new file mode 100644 index 0000000..6cfa23e --- /dev/null +++ b/pages/dev-advanced-concepts/querying-historical-state.mdx @@ -0,0 +1,41 @@ +# Querying Historical State + +When working with blockchain applications, querying historical state data is crucial for various tasks such as indexing, analytics, and historical analysis. On the Sei blockchain, understanding the concepts of pruning, archive nodes, and how to query historical data can significantly enhance your development process. + +## **Pruning** + +Pruning is the process of removing old blockchain data that is no longer needed to save disk space and improve performance. Pruned nodes only retain a limited set of recent blockchain data, making them faster and less storage-intensive. + +• **Purpose**: Pruning helps reduce the storage requirements of blockchain nodes, making them more efficient and manageable. + +• **Limitation**: Pruned nodes do not retain the full history of the blockchain, so they cannot be used to query historical data beyond the pruning window. + +## **Archive Nodes** + +Archive nodes, on the other hand, store the entire history of the blockchain from the genesis block to the latest block. This makes them essential for querying historical state data. + +• **Purpose**: Archive nodes retain the full blockchain history, allowing developers to query any past state by block height. + +• **Use Cases**: Archive nodes are crucial for tasks that require access to historical data, such as catching up indexers, conducting historical analysis, and verifying past transactions. + +## **Querying by Block Height** + +To query historical state data, you can use archive nodes and specify the block height at which you want to retrieve the state. + +• **Example**: To query the state at a specific block height, you can use the following approach: + +Querying by block height with seid + +`seid query bank balances [address] --height ` + +• This command allows you to specify the block height and retrieve the state as it was at that particular point in time. + +## **Using Indexers for Historical Data** + +While archive nodes provide the raw historical data, indexers are essential for efficiently querying and analyzing this data. Indexers organize and optimize the data, making it easier to access and analyze. + +## **Indexer Providers**: + +There are several indexer providers that you can use to query historical data on the Sei blockchain. Refer to the [Indexer Providers](https://www.notion.so/Advanced-concepts-cfcc51a81ede49d186bb9aa36fc73d83?pvs=21) section for more information on available services. + +**ADD SECTION ON EVENTS** diff --git a/pages/dev-chains.mdx b/pages/dev-chains.mdx new file mode 100644 index 0000000..9e96f2f --- /dev/null +++ b/pages/dev-chains.mdx @@ -0,0 +1,28 @@ +## Chains + +Sei operates three distinct chains, each serving different purposes: mainnet, testnet, and devnet. Below is an overview of each chain, including their purposes and chain IDs. + +- #### **Mainnet** + +The `pacific-1` chain is the mainnet of the Sei blockchain. It is the live, production environment where actual transactions and smart contract deployments occur. This chain is used for all real-world applications and activities involving Sei tokens. + +- **Purpose**: Production environment for live applications. +- **Chain ID**: `pacific-1` + +- #### **Testnet** + +The `atlantic-2` chain is the testnet of the Sei blockchain. It is used for testing and development purposes. Developers can deploy and test their dApps and smart contracts in a controlled environment that simulates the mainnet conditions. This chain is crucial for ensuring that applications work as expected before going live. + +- **Purpose**: Testing and development environment. +- **Chain ID**: `atlantic-2` + +- #### **Devnet** + +The `arctic-1` chain is the devnet of the Sei blockchain. It serves as a development network for early-stage testing and experimentation. This chain is typically used by developers to test new features, perform integration testing, and develop prototypes in an isolated environment. + +- **Purpose**: Early-stage development and experimentation. +- **Chain ID**: `arctic-1` + +- #### **Local Chains** + +Please read the [Nodes Introduction](/dev-node/intro) section for more information on how to set up and run a local chain. diff --git a/pages/dev-ecosystem-providers/_meta.json b/pages/dev-ecosystem-providers/_meta.json new file mode 100644 index 0000000..05044ac --- /dev/null +++ b/pages/dev-ecosystem-providers/_meta.json @@ -0,0 +1,12 @@ +{ + "wallets": "Wallets", + "explorers": "Block Explorers", + "rpc-providers": "RPC Providers", + "indexers": "Indexers", + "centralized-exchanges": "Centralized Exchanges", + "faucets": "Faucets", + "oracles": "Oracles", + "bridges": "Bridges", + "nfts": "NFTs", + "ecosystem-map": "Ecosystem Map" +} diff --git a/pages/dev-ecosystem-providers/bridges.mdx b/pages/dev-ecosystem-providers/bridges.mdx new file mode 100644 index 0000000..6697a2d --- /dev/null +++ b/pages/dev-ecosystem-providers/bridges.mdx @@ -0,0 +1,12 @@ +# Bridges + +Bridges facilitate cross-chain transfers and interoperability between different blockchains. Key bridges for Sei are: + +- **Squid**: Enables one-click cross-chain swaps across various EVM blockchains. + - [Squid](https://blockworks.co/news/squid-one-click-cross-chain-swaps-cosmos) +- **Wormhole**: A popular bridge for transferring assets across multiple blockchains. + - [Wormhole](https://wormholenetwork.com/) +- **Axelar**: Provides secure cross-chain communication for Web3. + - [Axelar](https://axelar.network/) +- **Stargate (coming soon)**: Facilitates seamless cross-chain transactions. + - [Stargate](https://stargate.finance/) diff --git a/pages/dev-ecosystem-providers/centralized-exchanges.mdx b/pages/dev-ecosystem-providers/centralized-exchanges.mdx new file mode 100644 index 0000000..f5311f5 --- /dev/null +++ b/pages/dev-ecosystem-providers/centralized-exchanges.mdx @@ -0,0 +1,8 @@ +# Centralized Exchanges + +Centralized exchanges enable users to trade Sei tokens with ease. Some major exchanges supporting Sei are: + +- **Coinbase**: [Coinbase](https://www.coinbase.com/) +- **Binance**: [Binance](https://www.binance.com/) +- **KuCoin**: [KuCoin](https://www.kucoin.com/) +- And more diff --git a/pages/dev-ecosystem-providers/ecosystem-map.mdx b/pages/dev-ecosystem-providers/ecosystem-map.mdx new file mode 100644 index 0000000..7388496 --- /dev/null +++ b/pages/dev-ecosystem-providers/ecosystem-map.mdx @@ -0,0 +1,5 @@ +# Ecosystem Map + +For a comprehensive view of the Sei ecosystem and its various providers, refer to the ecosystem map. + +- [Ecosystem Map](https://www.sei.io/ecosystem) diff --git a/pages/dev-ecosystem-providers/explorers.mdx b/pages/dev-ecosystem-providers/explorers.mdx new file mode 100644 index 0000000..f2d21a3 --- /dev/null +++ b/pages/dev-ecosystem-providers/explorers.mdx @@ -0,0 +1,9 @@ +# Explorers + +Blockchain explorers allow users to view transactions, blocks, and other network activities. Here are the main explorers for Sei: + +- **SeiTrace**: A comprehensive explorer for tracking transactions and activities on the Sei blockchain. +- [SeiTrace](https://seitrace.com/) +- **SeiScan**: Provides detailed views of the Sei mainnet and testnets. +- [Pacific-1 (Mainnet)](https://www.seiscan.app/pacific-1) +- [Atlantic-2 (Testnet)](https://www.seiscan.app/atlantic-2) diff --git a/pages/dev-ecosystem-providers/faucets.mdx b/pages/dev-ecosystem-providers/faucets.mdx new file mode 100644 index 0000000..98ac422 --- /dev/null +++ b/pages/dev-ecosystem-providers/faucets.mdx @@ -0,0 +1,8 @@ +# Faucets + +Faucets provide free tokens to developers for testing purposes. Sei offers faucets for its testnets: + +- **Sei App Faucet**: Available for the Atlantic-2 and Arctic-1 testnets. + - [Atlantic-2 Faucet](https://atlantic-2.app.sei.io/faucet) + - [Arctic-1 Faucet](https://arctic-1.app.sei.io/faucet) +- Compass wallet: This wallet has integrated a faucet directly into the wallet for a very easy user experience. diff --git a/pages/dev-ecosystem-providers/indexers.mdx b/pages/dev-ecosystem-providers/indexers.mdx new file mode 100644 index 0000000..d6ca6ef --- /dev/null +++ b/pages/dev-ecosystem-providers/indexers.mdx @@ -0,0 +1,9 @@ +# Indexers + +Indexers collect and organize blockchain data, making it easier to query and analyze. Key indexers for Sei include: + +- **Flipside**: Provides detailed blockchain analytics and insights. + - [Flipside](https://flipsidecrypto.xyz/) + +- **The Graph (EVM only)**: Allows for querying blockchain data using GraphQL. + - [The Graph](https://thegraph.com/) diff --git a/pages/dev-ecosystem-providers/nfts.mdx b/pages/dev-ecosystem-providers/nfts.mdx new file mode 100644 index 0000000..cc91711 --- /dev/null +++ b/pages/dev-ecosystem-providers/nfts.mdx @@ -0,0 +1,6 @@ +# NFT’s + +Lighthouse and Webump help with minting and managing of NFTs. + +- **Lighthouse/Webump** + - [Link](https://webump.xyz/) diff --git a/pages/dev-ecosystem-providers/oracles.mdx b/pages/dev-ecosystem-providers/oracles.mdx new file mode 100644 index 0000000..63b3b37 --- /dev/null +++ b/pages/dev-ecosystem-providers/oracles.mdx @@ -0,0 +1,6 @@ +# Oracles + +Oracles provide external data to smart contracts, enabling more dynamic and responsive applications. Notable oracles for Sei include: + +- **Pyth** + - [Pyth Documentation](https://docs.pyth.network/home) diff --git a/pages/dev-ecosystem-providers/rpc-providers.mdx b/pages/dev-ecosystem-providers/rpc-providers.mdx new file mode 100644 index 0000000..31e9a9f --- /dev/null +++ b/pages/dev-ecosystem-providers/rpc-providers.mdx @@ -0,0 +1,9 @@ +# RPC Providers + +RPC providers offer endpoints for developers to interact with the Sei blockchain. Some notable providers include: + +- **Rhino**: Provides robust RPC services for seamless blockchain interactions. + - [Rhino](https://rhinostake.com/#) + +- **Quicknode**: A a trusted infrastructure partner for the Sei network, providing developers with powerful APIs and dedicated support to streamline their blockchain applications. + - [Quicknode](https://www.quicknode.com/) diff --git a/pages/dev-ecosystem-providers/wallets.mdx b/pages/dev-ecosystem-providers/wallets.mdx new file mode 100644 index 0000000..a5203c6 --- /dev/null +++ b/pages/dev-ecosystem-providers/wallets.mdx @@ -0,0 +1,9 @@ +# Wallets + +Wallets are essential for managing assets and interacting with the Sei blockchain. Here are some recommended wallets: + +- **Compass**: A Sei native wallet designed for seamless interaction with the Sei blockchain with both Cosmos and EVM support. + - [Compass Wallet](https://compasswallet.io/) + +- **MetaMask**: A widely-used EVM-compatible wallet that supports custom chain configurations for Sei. + - [MetaMask](https://metamask.io/) diff --git a/pages/dev-frontend-dapps.mdx b/pages/dev-frontend-dapps.mdx new file mode 100644 index 0000000..6d1e2a2 --- /dev/null +++ b/pages/dev-frontend-dapps.mdx @@ -0,0 +1,84 @@ +# Frontend Development + +Developing the frontend of a dApp on Sei involves connecting to wallets, interacting with the blockchain via RPC endpoints, and signing and broadcasting transactions. dApps should choose either EVM or Cosmos for their connection, but can use interoperability features such as precompiles and pointer contracts to support both environments. + +### Wallet Connection + +Connecting to wallets is a crucial step in developing dApps. Here are some recommended libraries for wallet connection, each with its specific advantages: + +### EVM and EVM RPC dApps: + +- **Wagmi**: A React-based library for Ethereum dApps that simplifies wallet connection and interaction. Provides hooks for interacting with Ethereum wallets and contracts for use with modern frontend libraries and frameworks. + - [Wagmi Documentation](https://wagmi.sh/docs) +- **Viem**: A lightweight and flexible library for Ethereum development. + - [Viem Documentation](https://viem.sh/docs) +- **Ethers.js**: A complete and compact library for interacting with the Ethereum blockchain and its ecosystem. Known for its simplicity and extensive functionality. + - [Ethers.js Documentation](https://docs.ethers.io/v5/) + +### CosmWasm/Cosmos RPC dApps + +- **CosmosKit**: A React-based library for Cosmos ecosystem dApps, facilitating wallet connection and interaction. Supports all Sei native wallets as well as cross-chain wallets like Keplr and Leap. + - [CosmosKit Documentation](https://github.com/cosmology-tech/cosmos-kit) +- **CosmJS**: A JavaScript library for interacting with Cosmos blockchains, providing tools to handle wallet connections, transactions, and more. Offers comprehensive tools for Cosmos SDK based blockchains. + - [CosmJS Documentation](https://cosmos.github.io/cosmjs/) + +### RPC Endpoints + +dApps need to connect to an RPC provider in order to broadcast transactions or to query the chain. There are many free providers on testnet and devnet, and a few rate limited providers on mainnet. See the RPC providers section for more info and links + +### @sei-js Helper Libraries + +The `@sei-js` package provides various helper libraries to facilitate interaction with the Sei blockchain. Use `@sei-js/cosmjs` and `@sei-js/proto` for Cosmos side interactions, and `@sei-js/evm` for EVM side interactions. + +- **/cosmjs**: Provides helpful wrappers around CosmJS, CosmosKit, and more; specifically tailored for the Cosmos side of Sei. + - [@sei-js/cosmjs](https://www.npmjs.com/package/@sei-js/cosmjs) +- **/evm:** A library designed to simplify EVM interaction from Typescript/Javascript, this library includes precompile contracts and helpers for interaction with Wagmi/Viem and Ethers.js. + - [@sei-js/evm](https://www.npmjs.com/package/@sei-js/evm) +- **/proto**: A TypeScript typed library for Cosmos and CosmWasm dApps that provides query clients and typed message and response structures to help avoid runtime errors. + - [@sei-js/proto](https://www.npmjs.com/package/@sei-js/proto) + +### Polyfills Warning + +When developing frontend applications for the blockchain, it's important to be aware that some libraries may require polyfills, especially when used in browser environments. For instance, the `Buffer` class and other Node.js-specific features are not natively available in browsers and need to be polyfilled. + +If you are using Vite or another rollup based frontend library you can add the following to the entry point of your app. + +```tsx +import { Buffer } from 'buffer'; + +// Polyfill self for browser and global for Node.js +const globalObject = typeof self !== 'undefined' ? self : global; + +Object.assign(globalObject, { + process: process, + Buffer: Buffer +}); +``` + +If you are using a Webpack based bundling tool you can use the following plugin in you Webpack config. + +``` +yarn add -D node-polyfill-webpack-plugin +``` + +```tsx +import NodePolyfillPlugin from 'node-polyfill-webpack-plugin'; + +... // the rest of your webpack config +plugins: [ + ... + new NodePolyfillPlugin(), + ... +], +... +``` + +Using proto files (@sei-js/proto) + +### Tips for New Developers + +1. **Understanding Gas Fees**: Gas fees are crucial for executing transactions on the blockchain. Ensure you understand how they work and how to optimize your contracts to minimize gas usage. +2. **Security Practices**: Always follow best security practices. Regularly audit your code and stay updated with the latest security vulnerabilities and patches. +3. **Testing**: Thoroughly test your dApps in different environments to ensure they work correctly. Use testnets and faucets to test transactions without spending real tokens. +4. **Documentation**: Make use of the extensive documentation available for each library and tool. Good documentation can significantly speed up your development process. +5. **Community and Support**: Join developer communities, forums, and chat groups. Engaging with other developers can provide valuable insights and help you solve problems more efficiently. diff --git a/pages/dev-gas.mdx b/pages/dev-gas.mdx new file mode 100644 index 0000000..5abbf25 --- /dev/null +++ b/pages/dev-gas.mdx @@ -0,0 +1,67 @@ +# Gas on Sei + +Gas refers to the unit of measurement representing the work done to execute a transaction on the blockchain. The amount of gas used varies based on the complexity of the transaction. + +When submitting a TX to be broadcast, users specify the gas price and the gas limit (sometimes shortened to ‘gas’). + +The gas price refers to the amount of sei the user pays per gas used. In a proof-of-stake chain like Sei, increasing the gas price provides a greater incentive for validators to execute your transaction, ensuring shorter time to finality when the chain is congested. + +The gas limit is the maximum amount of gas the user wants the transaction to use. If the gas limit is set too low, the node attempting to run the transaction will run out of gas and fail to complete the transaction. + +The gas limit is multiplied by the gas price to create the ‘fee’. In the event that the validator successfully executes your transaction, the fee is paid in full to the validator (regardless of how much gas was actually used). + +Sei has minimum gas prices per chain, which can be found in the official [chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json). + +## Maximum Gas + +The maximum gas limit for a transaction ensures that complex transactions do not consume excessive resources. You can find the maximum gas limits for each chain in the [Sei chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json). + +## Minimum Gas Prices + +Sei enforces minimum gas prices to prevent spam transactions. These prices are set per chain and are detailed in the [chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json). + +## Optimizing Gas Prices for Smart Contracts + +Optimizing gas prices involves efficient smart contract coding practices: +- Minimize storage operations. +- Use fixed-size data structures where possible. +- Avoid unnecessary computations. + +## Sending Gas in Transactions + +### Using `seid` + +```sh +seid tx bank send --gas --gas-prices --fees +``` + +### Using CosmJS +```js +const fee = { + amount: [{ denom: "usei", amount: "5000" }], + gas: "200000", +}; +const result = await client.signAndBroadcast(address, [msg], fee, memo); +``` + +### Using EVM (wagmi) +```js +import { sendTransaction } from 'wagmi/actions' + +sendTransaction({ + request: { + to: '0xRecipientAddress', + value: '1000000000000000000', // 1 ETH + gasPrice: '20000000000', // 20 Gwei + gasLimit: '21000', + }, +}) +``` + +## Minimum Gas Price Per Chain + + • Pacific-1 (Mainnet): 0.025usei + • Atlantic-2 (Testnet): 0.01usei + • Arctic-1 (Devnet): 0.005usei + +For more details, refer to the chain registry. diff --git a/pages/dev-intro.mdx b/pages/dev-intro.mdx new file mode 100644 index 0000000..c5efbb8 --- /dev/null +++ b/pages/dev-intro.mdx @@ -0,0 +1,35 @@ +# Sei is built for developers + +Sei is a high-performance, low-fee, designated proof-of-stake blockchain designed for developers. It supports optimistic parallel execution of both EVM and CosmWasm, opening up new design possibilities. With unique optimizations like twin turbo consensus and SeiDB, Sei ensures consistent 400ms block times and a transaction throughput that’s orders of magnitude higher than Ethereum. This means faster, more cost-effective operations. Plus, Sei’s seamless interoperability between EVM and CosmWasm gives developers native access to the entire Cosmos ecosystem, including IBC tokens, multi-sig accounts, fee grants, and more. + + +## Features + +Sei incorporates a range of features that enhance its functionality and appeal to developers: + +- **SeiDB**: A highly efficient and scalable database designed to support the high throughput of the Sei blockchain, ensuring rapid state updates. +- **Twin Turbo Consensus**: A consensus mechanism that accelerates transaction processing and finality, ensuring rapid and secure operations. +- **Parallel Execution**: The ability to process multiple transactions and smart contracts concurrently, significantly boosting performance. +- **EVM and Cosmos Interoperability**: Native support for interactions between the EVM side and the Cosmos side within the same chain, making it easier to integrate functionalities from both ecosystems. + +## EVM/CosmWasm Interoperability + +Sei provides precompile contracts that facilitate many common Cosmos calls via the EVM, including: + +- **IBC**: For inter-chain communication including robust token bridging across all cosmos chains. +- **Wasm**: For interactions with CosmWasm smart contracts including CW20 and CW721 standards +- **Bank Module**: For managing native token transfers (usei, Token Factory, IBC denoms). +- **Staking**: For delegating and managing delegations for both validators and delegators. +- **Governance**: For stakers and validators to participate in [governance](/general-governance) processes. +- **Oracles**: Access to native price feeder and the [broad provider ecosystem](/dev-ecosystem-providers/oracles). +- **And More** + +### Cross-Chain Token Functionality + +Sei supports full interoperability of Sei native and CosmWasm tokens with the EVM and EVM RPC via pointer contacts, enabling EVM dApps access to many new tokens including: + +- **Fungible**: ERC20 to CW20 tokens +- **NFTs**: CW721 and ERC721 tokens +- **IBC**: Tokens bridged via IBC to Sei +- **TokenFactory**: Native tokens on Sei +- **CW2981 and ERC2981 tokens**: NFTs with royalties diff --git a/pages/dev-node/_meta.json b/pages/dev-node/_meta.json new file mode 100644 index 0000000..bf2785d --- /dev/null +++ b/pages/dev-node/_meta.json @@ -0,0 +1,9 @@ +{ + "intro": "Introduction", + "quickstart": "Quickstart", + "node-operators": "Node Operators", + "node-configuration": "Node Configuration", + "configure-general-settings": "Configure General Settings", + "join-a-network": "Join a Network", + "running-seid": "Running Seid" +} diff --git a/pages/dev-node/configure-general-settings.mdx b/pages/dev-node/configure-general-settings.mdx new file mode 100644 index 0000000..242fd9c --- /dev/null +++ b/pages/dev-node/configure-general-settings.mdx @@ -0,0 +1,45 @@ +# Configure General Settings +The following information describes the most important node configuration settings found in the ~/.sei/config/ directory. It is recommended that you update these settings with your own information. + +Structure of ~/.sei/config + +```bash +~/.sei/config +│-- app.toml # seid configuration file +│-- client.toml # configurations for the cli wallet (ex seid) +│-- config.toml # Tendermint configuration file +│-- genesis.json # gensesis transactions +│-- node_key.json # private key used for node authentication in the p2p protocol (its corresponding public key is the nodeid) +└-- priv_validator_key.json # key used by the validator on the node to sign blocks +``` + +## Genesis File +To get the Genesis file for a certain network, please see Tools and Resources + +Initialize and configure the moniker +A Moniker is the custom username of your node, it should be human-readable. It's set at the time of node setup and can be used to provide more descriptive or friendly names to identify nodes, as opposed to using IP addresses or public key hashes which can be hard to remember or recognize. + +Set your custom moniker +export MONIKER="YOUR_MONIKER" +Initialize the node +```bash +seid init $MONIKER --chain-id -o +``` + +Different types of peers in ~/.sei/config/config.toml + +```bash +# Comma-separated list of peers to be added to the peer store +# on startup. Either BootstrapPeers or PersistentPeers are +# needed for peer discovery +bootstrap-peers = "" + +# Comma-separated list of nodes to keep persistent connections to +persistent-peers = "" + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional-peer-ids = "" +``` + +## Set up external-address in config.toml +If your public-facing address is different from the internal address that you're using you need to configure external-address it in config.toml. This addition will prevent continuous reconnections. The default p2p-port is 26656(See node-configuration). diff --git a/pages/dev-node/intro.mdx b/pages/dev-node/intro.mdx new file mode 100644 index 0000000..a01ad83 --- /dev/null +++ b/pages/dev-node/intro.mdx @@ -0,0 +1,154 @@ +# Local Sei Node +In this guide, we'll walk you through how to set up the Sei blockchain locally on your machine. + +## Prerequisites +To begin, ensure you are in the sei-chain repository on your local machine. + +```bash +git clone https://github.com/sei-protocol/sei-chain +cd sei-chain +``` + +## Running a Local Single-node Testnet +To run Sei locally, run the following command + +```bash +./scripts/initialize_local_chain.sh +``` + +Once you run the initialization script, the seid process will be running 1 node locally. It will also seed 50 accounts. To verify the status of the local blockchain, open a new tab and run + +```bash +seid status | jq +``` + +If the chain is running properly, you should see output similar to the following: + +```bash +{ +"NodeInfo": { +"protocol_version": { +"p2p": "8", +"block": "11", +"app": "0" +}, +"id": "36126cf4875862c3388f04dcc636fc1557791dd7", +"listen_addr": "tcp://0.0.0.0:26656", +"network": "sei-chain", +"version": "0.34.19", +"channels": "40202122233038606100", +"moniker": "demo", +"other": { +"tx_index": "on", +"rpc_address": "tcp://127.0.0.1:26657" +} +}, +"SyncInfo": { +"latest_block_hash": "0A708E540CC04445B3C5585ED2757FADCAD18FB8E2A403655B3DC90D0F588D49", +"latest_app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", +"latest_block_height": "1", +"latest_block_time": "2022-09-04T17:59:07.314228Z", +"earliest_block_hash": "0A708E540CC04445B3C5585ED2757FADCAD18FB8E2A403655B3DC90D0F588D49", +"earliest_app_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855", +"earliest_block_height": "1", +"earliest_block_time": "2022-09-04T17:59:07.314228Z", +"catching_up": false +}, +"ValidatorInfo": { +"Address": "13A8F763B396AF5B835A10748C4EFEDB0F99AC28", +"PubKey": { +"type": "tendermint/PubKeyEd25519", +"value": "7ztvoNO/8wxIkqTcsDQ3CLgCyF5yOz6WBqf0yGrmeuE=" +}, +"VotingPower": "70000000000000" +} +} +``` + +To deploy multiple nodes, you can use a docker container to start a sei chain cluster. + +## Install Docker & Docker Compose +- For MacOS: +The easiest and recommended way to get Docker and Docker Compose is to install Docker Desktop here: + +https://docs.docker.com/desktop/install/mac-install/ + +- For Ubuntu: +Follow the below link to install docker on ubuntu + +https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository + +Follow the below link to install standalone docker compose + +https://docs.docker.com/compose/install/other/ + +## Deploy Sei Chain Validators on Docker +Detailed instructions and commands can be found in the Makefile of the sei-chain repo. + +- Start a 4 Node Validator Cluster +This will start a 4 node sei chain cluster, each validator node will be running in its own docker container, and each node will also run the oracle price feeder daemon + +#### If this is the first time or you want to rebuild the binary: +```bash +make docker-cluster-start +``` + +#### If you have run docker-cluster-start and build/seid exist, +#### you can skip the build process to quick start by: +```bash +make docker-cluster-start-skipbuild +``` +All the logs and genesis files will be generated under the temporary build/generated folder. To access the service log: + +### Monitor logs after cluster is started for node0 +```bash +tail -f build/generated/seid-0.log +``` + +SSH into a single validator node +### List all containers +docker ps -a +### SSH into a running container +docker exec -it [container_name] /bin/bash +Deploy a State Sync Node +Requirement: Follow the above steps to start a 4 node docker cluster before starting any state sync node. + +### Be sure to start up a 4-node cluster before you start a state sync node +```bash +make docker-cluster-start +``` + +## Wait for at least a few minutes till the latest block height exceed 500 (this can be changed via app.toml) +```bash +seid status |jq +``` + +# Start up a state sync node +```bash +make run-rpc-nodesh +``` + +## Local Docker for Debugging and Testing +One of the fanciest thing of using docker is fast iteration. Here we support: + +Being able to make changes locally and start up the chain to see the immediate impact +Being able to make changes to local dependency repo (Cosmo SDK/Tendermint) and start the chain with the latest changes without bumping or release any binary version In order to make local debugging work, you can follow these steps: + +#### Clone your dependency repo and put them under the same path as sei-chain +```bash +cd sei-chain +cd ../ +git clone https://github.com/sei-protocol/sei-tendermint.git +git clone https://github.com/sei-protocol/sei-cosmos.git +``` + +#### Modify go.mod file to point to local repo, must use the exact same path as below: +cd sei-chain +```bash +go mod edit -replace github.com/cosmos/cosmos-sdk=../sei-cosmos +go mod edit -replace github.com/tendermint/tendermint=../sei-tendermint +``` + +## Start the docker cluster +make docker-cluster-start +#### You are good to go now! Make changes as you wish to any of the dependency repo and run docker to test it out. diff --git a/pages/dev-node/join-a-network.mdx b/pages/dev-node/join-a-network.mdx new file mode 100644 index 0000000..43d1c6b --- /dev/null +++ b/pages/dev-node/join-a-network.mdx @@ -0,0 +1,72 @@ +## Join a Network +Follow this guide to join an existing network through statesync To quickly stand up a fresh full node and join in the network, it's recommended to sync through state sync. If you want to run a local instance of Sei, see Running a Local Node + +## Install Seid Binary +To stand up a sei node, the first step is to download and install seid on your machine. If you have not done so, follow the steps in Install Seid. + +### State Sync +State sync allows a new node to join a network by fetching a snapshot of the application state at a recent height instead of fetching and replaying all historical blocks. This can reduce the time needed to sync with the network from days to minutes. + +### Clean Up +If you are not starting a node from fresh, then you need to do some backups and clean ups. + +Assuming your sei home directory is `/root/.sei`, backup `priv_validator_state.json` +```bash +cp /root/.sei/data/priv_validator_state.json /root/priv_validator_state.json +``` +backup `priv_validator_key.json` +```bash +cp /root/.sei/config/priv_validator_key.json /root/priv_validator_key.json +``` +backup `genesis.json` +```bash +cp /root/.sei/config/genesis.json /root/genesis.json +rm -rf /root/.sei/data/* +rm -rf /root/.sei/wasm +rm -rf /root/.sei/config/priv_validator_key.json +rm -rf /root/.sei/config/genesis.json +Note: This step is not needed for fresh nodes. +``` +### Update Configurations +Set up rpc servers for primary and secondary endpoints. You can use one of the RPC endpoints from the [RPC providers](../dev-ecosystem-providers/rpc-providers.mdx ) page. +Set up trust height and trust hash. Each snapshot is created at a certain block height, and best practice here is to set the trust height to be earlier than the latest snapshot block height to avoid backward verifications. + +#### Example: set trust height and hash to be the block height 10,000 earlier +```bash +PRIMARY_ENDPOINT=https://sei-testnet-rpc.polkachu.com:443 +TRUST_HEIGHT_DELTA=10000 + +LATEST_HEIGHT=$(curl -s "$PRIMARY_ENDPOINT"/block | jq -r ".block.header.height") +if [[ "$LATEST_HEIGHT" -gt "$TRUST_HEIGHT_DELTA" ]]; then +SYNC_BLOCK_HEIGHT=$(($LATEST_HEIGHT - $TRUST_HEIGHT_DELTA)) +else +SYNC_BLOCK_HEIGHT=$LATEST_HEIGHT +fi + +# Get trust hash +SYNC_BLOCK_HASH=$(curl -s "$PRIMARY_ENDPOINT/block?height=$SYNC_BLOCK_HEIGHT" | jq -r ".block_id.hash") + +# Override configs +sed -i.bak -e "s|^trust-height *=.*|trust-height = $SYNC_BLOCK_HEIGHT|" ~/.sei/config/config.toml +sed -i.bak -e "s|^trust-hash *=.*|trust-hash = \"$SYNC_BLOCK_HASH\"|" ~/.sei/config/config.toml +Set up persistent peers. If you need additional bootstrap-peer or persistent-peer (used for known good peers) in ~/.sei/config/config.toml.See Configure General Settings for more info about each peer field. +# Example: Get the peers from polkachu rpc server +PRIMARY_ENDPOINT=https://sei-testnet-rpc.polkachu.com:443 +SELF=$(cat /root/.sei/config/node_key.json |jq -r .id) + +curl "$PRIMARY_ENDPOINT"/net_info |jq -r '.peers[] | .url' |sed -e 's#mconn://##'|grep -v "$SELF" > PEERS + +PERSISTENT_PEERS=$(paste -s -d ',' PEERS) +sed -i.bak -e "s|^persistent-peers *=.*|persistent-peers = \"$PERSISTENT_PEERS\"|" ~/.sei/config/config.toml +Enable state sync and disable db sync. Note, you can only enable either state sync or db sync at a time. +# Enable state sync +sed -i.bak -e "s|^enable *=.*|enable = true|" ~/.sei/config/config.toml +sed -i.bak -e "s|^db-sync-enable *=.*|db-sync-enable = false|" ~/.sei/config/config.toml +Restore Backups +Once you finished the above steps, if you previously have done the clean up step, we need to restore the previously backed up files. + +# Restore previously backed up files +cp /root/priv_validator_state.json /root/.sei/data/priv_validator_state.json +cp /root/priv_validator_key.json /root/.sei/config/priv_validator_key.json +cp /root/genesis.json /root/.sei/config/genesis.json +``` \ No newline at end of file diff --git a/pages/dev-node/node-configuration.mdx b/pages/dev-node/node-configuration.mdx new file mode 100644 index 0000000..ac8d074 --- /dev/null +++ b/pages/dev-node/node-configuration.mdx @@ -0,0 +1,42 @@ +## Node types + +There are a few node types that can be run on Sei network which serve a variety of purposes. These include: + +- rpc / full nodes: these nodes are generally used for querying data or interacting with the chain. They maintain some state but not since genesis. The default settings will run rpc / full nodes. +- archive nodes: maintain full state of the blockchain from genesis. Generally requires large disks. To enable this type of node, set min-retain-blocks=0 and pruning="nothing" in your app.toml +- state sync nodes: provide snapshot data for other nodes to use to bootstrap onto the chain. To enable this type of node, set enable=true under the [statesync] section in config.toml +- validator nodes: provide security to the chain by proposing and signing blocks. To enable this type of node, set mode=validator in config.toml. Note that because Sei is proof-of-stake, you must have enough delegation to join the active set +Commonly Used Ports + +Seid uses the following TCP ports. Toggle their settings to match your environment. + +- `26656`: The default port for the P2P protocol. This port is used to communicate with other nodes and must be open to join a network. +- `1317`: The default port for interacting with the Seid API server for HTTP RESTful requests. This allows applications and services to interact with the seid instance through RPC. +- `26660`: The default port for interacting with the Prometheus database, which can be used to monitor the environment. In the default configuration, this port is not open. +- `26657`: The default port for the RPC protocol. Because this port is used for querying and sending transactions, it must be open for serving queries from seid. +These ports are all customizable in $HOME/.sei/config/config.toml and $HOME/.sei/config/app/toml discussed in the later sections along with other fields. + +### Systemd File Template +```bash +[Unit] +Description=Sei Node +After=network.target + +[Service] +User= +Type=simple +ExecStart=/seid start --chain-id +Restart=always +# wait 30 seconds before restarting the service after it has failed. +RestartSec=30 +# wait up to 30 seconds for the service to stop gracefully when it is being stopped. +TimeoutStopSec=30 +# send the SIGINT signal (equivalent to pressing Ctrl-C) to the service process when it is being stopped +# giving it a chance to shut down gracefully. +KillSignal=SIGINT +LimitNOFILE=65535 + +[Install] +WantedBy=multi-user.target + +``` \ No newline at end of file diff --git a/pages/node-operators.mdx b/pages/dev-node/node-operators.mdx similarity index 97% rename from pages/node-operators.mdx rename to pages/dev-node/node-operators.mdx index c36f0f1..d716920 100644 --- a/pages/node-operators.mdx +++ b/pages/dev-node/node-operators.mdx @@ -1,5 +1,5 @@ import { Callout } from "nextra/components"; -import VersionTable from '../components/VersionFetcher/VersionTable'; +import VersionTable from '../../components/VersionFetcher/VersionTable'; # Sei Node Setup Guide @@ -56,7 +56,7 @@ apt install nano make build-essential gcc git jq chrony tar curl lz4 wget -y #### Install `seid` -1. Define the variables for your network and (optional) a moniker or name to assign your node: +1. Define the variables for your network and (optional) a moniker or name to assign your node: *Replace these with real values, found in the [reference table](/node-operators#build-version-and-genesis-table) above* ```bash @@ -193,4 +193,4 @@ The standard service ports can be manually configured in `$HOME/.sei/config/conf The standard websocket rides on the same connection as the RPC server. Example: [non-TLS] `wss://localhost:26657/websocket`. - \ No newline at end of file + diff --git a/pages/dev-node/quickstart.mdx b/pages/dev-node/quickstart.mdx new file mode 100644 index 0000000..cd7c583 --- /dev/null +++ b/pages/dev-node/quickstart.mdx @@ -0,0 +1,34 @@ +Running a Sei RPC node +A full Sei node is a fundamental building block of the Sei Blockchain. It consists of a local copy of the blockchain, including its history and state. Running a full node is essential for participating in network operations like validating transactions, joining consensus, and broadcasting events to other network participants. + +System Configuration +CPU Cores RAM Disk +16 cores 64GB 1TB NVMe +Quick start +There is a setup script that runs a lot of the basic setup to easily get you started running an RPC node. If you are an advanced user, please see Node Configurations. + +You can use this startup script: + +python3 scripts/run-node.py + + ..:=++****++=:. + .:+*##############*+:. + .=*#####+:....:+#######+. + .-*#####=. .... .+###*:. ... + ..+#####=.. .=####=. .... .-*#=. + .+#####+. .=########+:...:=*####=. + =########*#######################- + .#################=:...=###########. + ... ..-*######+.. .:*########: + ..=-. -###- -####. :+######: + :#####+: .=########: .+####: + .########+:.:=#############=-######. + =################################- + .+#####*-.. ..-########+.. ..-*#=. + ..+##*-. ..... .-*###-. ...... .. + .--. .:*###*:. ... .+###*-. + .:+#######*-:..::*#####=. + .-+###############*+:. + ..-+********+-.. + +Welcome to the Sei node installer! diff --git a/pages/dev-node/running-seid.mdx b/pages/dev-node/running-seid.mdx new file mode 100644 index 0000000..12eeb41 --- /dev/null +++ b/pages/dev-node/running-seid.mdx @@ -0,0 +1,175 @@ +## Running Seid +How to start and run seid on a full node + +### Prerequisites +This section assumes that you have set up a full node, configured all settings and joined a network. + +### Run Seid +You may run seid with +```bash +seid start +``` +If you want to see all the flags, you can use +```bash +seid start --help +``` +Run the full node application with Tendermint in or out of process. By +default, the application will run with Tendermint in process. + +Pruning options can be provided via the `--pruning` flag or alternatively with `--pruning-keep-recent`, +`--pruning-keep-every`, and `--pruning-interval` together. + +For `--pruning` the options are as follows: + +- default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +- nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +- everything: all saved states will be deleted, storing only the current and previous state; pruning at 10 block intervals +- custom: allow pruning options to be manually specified through `--pruning-keep-recent`, `--pruning-keep-every`, and `--pruning-interval` + +Node halting configurations exist in the form of two flags: `--halt-height` and `--halt-time`. During +the ABCI Commit phase, the node will check if the current block height is greater than or equal to +the halt-height or if the current block time is greater than or equal to the halt-time. If so, the +node will attempt to gracefully shutdown and the block will not be committed. In addition, the node +will not be able to commit subsequent blocks. + +For profiling and benchmarking purposes, CPU profiling can be enabled via the `--cpu-profile` flag +which accepts a path for the resulting pprof file. + +The node may be started in a 'query only' mode where only the gRPC and JSON HTTP +API services are enabled via the `--grpc-only` flag. In this mode, Tendermint is +bypassed and can be used when legacy queries are needed after an on-chain upgrade +is performed. Note, when enabled, gRPC will also be automatically enabled. +```bash +Usage: +seid start [flags] + +Flags: +--abci string specify abci transport (socket | grpc) (default "socket") +--address string Listen address (default "tcp://0.0.0.0:26658") +--archival-arweave-index-db-full-path string Full local path to the levelDB used for indexing arweave data +--archival-arweave-node-url string Arweave Node URL that stores archived data +--archival-db-type string Archival DB type. Valid options: arweave +--archival-version int Application data before this version is stored in archival DB +--chain-id string Chain ID +--compaction-interval uint Time interval in between forced levelDB compaction. 0 means no forced compaction. +--consensus.create-empty-blocks set this to false to only produce blocks when there are txs or when the AppHash changes (default true) +--consensus.create-empty-blocks-interval string the possible interval between empty blocks (default "0s") +--consensus.double-sign-check-height int how many blocks to look back to check existence of the node's consensus votes before joining consensus +--consensus.gossip-tx-key-only set this to false to gossip entire data rather than just the key (default true) +--cpu-profile string Enable CPU profiling and write to the provided file +--db-backend string database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb (default "goleveldb") +--db-dir string database directory (default "data") +--genesis-hash bytesHex optional SHA-256 hash of the genesis file +--grpc-only Start the node in gRPC query only mode (no Tendermint process is started) +--grpc-web.address string The gRPC-Web server address to listen on (default "0.0.0.0:9091") +--grpc-web.enable Define if the gRPC-Web server should be enabled. (Note: gRPC must also be enabled.) (default true) +--grpc.address string the gRPC server address to listen on (default "0.0.0.0:9090") +--grpc.enable Define if the gRPC server should be enabled (default true) +--halt-height uint Block height at which to gracefully halt the chain and shutdown the node +--halt-time uint Minimum block time (in Unix seconds) at which to gracefully halt the chain and shutdown the node +-h, --help help for start +--iavl-disable-fastnode Enable fast node for IAVL tree (default true) +--inter-block-cache Enable inter-block caching (default true) +--inv-check-period uint Assert registered invariants every N blocks +--load-latest Whether to load latest version from store immediately after app creation (default true) +--min-retain-blocks uint Minimum block height offset during ABCI commit to prune Tendermint blocks +--minimum-gas-prices string Minimum gas prices to accept for transactions; Any fee in a tx must meet this minimum (e.g. 0.01photino;0.0001stake) +--mode string node mode (full | validator | seed) (default "full") +--moniker string node name (default "Brandons-MacBook-Pro.local") +--p2p.laddr string node listen address. (0.0.0.0:0 means any interface, any port) (default "tcp://0.0.0.0:26656") +--p2p.persistent-peers string comma-delimited ID@host:port persistent peers +--p2p.pex enable/disable Peer-Exchange (default true) +--p2p.private-peer-ids string comma-delimited private peer IDs +--p2p.unconditional_peer_ids string comma-delimited IDs of unconditional peers +--p2p.upnp enable/disable UPNP port forwarding +--priv-validator-laddr string socket address to listen on for connections from external priv-validator process +--profile Enable Profiling in the application +--proxy-app string proxy app address, or one of: 'kvstore', 'persistent_kvstore', 'e2e' or 'noop' for local testing. (default "tcp://127.0.0.1:26658") +--pruning string Pruning strategy (default|nothing|everything|custom) (default "default") +--pruning-interval uint Height interval at which pruned heights are removed from disk (ignored if pruning is not 'custom') +--pruning-keep-every uint Offset heights to keep on disk after 'keep-every' (ignored if pruning is not 'custom') +--pruning-keep-recent uint Number of recent heights to keep on disk (ignored if pruning is not 'custom') +--rpc.laddr string RPC listen address. Port required (default "tcp://127.0.0.1:26657") +--rpc.pprof-laddr string pprof listen address (https://golang.org/pkg/net/http/pprof) +--rpc.unsafe enabled unsafe rpc methods +--state-sync.snapshot-interval uint State sync snapshot interval +--state-sync.snapshot-keep-recent uint32 State sync snapshot to keep (default 2) +--trace-store string Enable KVStore tracing to an output file +--tracing Enable Tracing for the app +--transport string Transport protocol: socket, grpc (default "socket") +--unsafe-skip-upgrades ints Skip a set of upgrade heights to continue the old binary +--with-tendermint Run abci app embedded in-process with tendermint (default true) +--x-crisis-skip-assert-invariants Skip x/crisis invariants check on startup + +Global Flags: +--home string directory for config and data (default "/Users/brandon/.sei") +--log_format string The logging format (json|plain) +--log_level string The logging level (trace|debug|info|warn|error|fatal|panic) +--trace print out full stack trace on errors +``` +### Systemd +Seid should be running at all times, it's recommended you register Seid as a systemd service so that it will be automatically restarted if your system reboots + +Create a definition file in `/etc/systemd/system/seid.service` +```bash +[Unit] +Description=Sei Node +After=network.target + +[Service] +User= +Type=simple +ExecStart=/seid start --chain-id +Restart=always + +# wait 30 seconds before restarting the service after it has failed. +RestartSec=30 + +# wait up to 30 seconds for the service to stop gracefully when it is being stopped. +TimeoutStopSec=30 + +# send the SIGINT signal (equivalent to pressing Ctrl-C) to the service process when it is being stopped +# giving it a chance to shut down gracefully. +KillSignal=SIGINT + +LimitNOFILE=65535 + +[Install] +WantedBy=multi-user.target +``` +Modify the file with the proper path and network. + +- `` - Enter the path to the Seid executable. `` is likely `/home//go/bin/seid` or `/usr/go/bin`. Confirm this with where is seid. +- `` Enter the user (likely your username or root, unless you created a user specifically for Seid). +- `` the Chain that this seid binary runs on + +Make sure you made the correct edits to `/etc/security/limits.conf`. +Run systemctl daemon-reload followed by systemctl enable seid. This will register seid as a system service and run the program upon startup. + +### Controlling the service +Use `systemctl` to start, stop and restart the service. +```bash + # Check health + systemctl status seid + # Start + systemctl start seid + # Stop + systemctl stop seid + # Restart + systemctl restart seid +``` +Use `journalctl -t` to access entire logs, entire logs in reverse, and the latest and continuous log. +```bash + # Entire log reversed + journalctl -t seid -r + # Entire log + journalctl -t seid + # Latest and continuous + journalctl -t seid -f + # Since 30 minutes ago + journalctl -t seid --since -30m +``` +### (Optional) Cosmovisor + +You may also want to use Cosmovisor such that it's easier to manage upgrades, it's a wrapper around the default seid +binary, to install it follow [Cosmosvisor Quick Start](https://docs.cosmos.network/v0.45/run-node/cosmovisor.html) \ No newline at end of file diff --git a/pages/dev-resources/_meta.json b/pages/dev-resources/_meta.json new file mode 100644 index 0000000..3437af5 --- /dev/null +++ b/pages/dev-resources/_meta.json @@ -0,0 +1,5 @@ +{ + "tools-and-resources": "Tools and Resources", + "resources": "Resources", + "differences-with-ethereum": "Differences from Ethereum" +} diff --git a/pages/differences-with-ethereum.mdx b/pages/dev-resources/differences-with-ethereum.mdx similarity index 100% rename from pages/differences-with-ethereum.mdx rename to pages/dev-resources/differences-with-ethereum.mdx diff --git a/pages/dev-resources/resources.mdx b/pages/dev-resources/resources.mdx new file mode 100644 index 0000000..a9a6fb6 --- /dev/null +++ b/pages/dev-resources/resources.mdx @@ -0,0 +1,40 @@ +# Resources + +In this section, we'll provide a comprehensive overview of the key tools and technologies used in the Sei blockchain ecosystem. Whether you are new to web3 development or an experienced developer looking to expand your skills, these resources will help you get started and deepen your understanding. Developers on Sei have the unique advantage of choosing between CosmWasm and EVM for their smart contract development, with the ability to seamlessly interact between the two environments. + +### Cosmos SDK + +The Cosmos SDK is a modular framework for building custom blockchains within the Cosmos ecosystem. It provides a set of tools and libraries that simplify the creation and management of interoperable blockchains. + +- **Tendermint**: Tendermint is the consensus engine that powers the Cosmos SDK. It ensures fast and secure consensus through a Byzantine Fault Tolerant (BFT) protocol. + - [Tendermint Documentation](https://docs.tendermint.com/) +- **Module Structure**: The Cosmos SDK uses a modular architecture, allowing developers to create and integrate various modules to build feature-rich blockchains. + - [Module Structure Documentation](https://docs.cosmos.network/v0.46/building-modules/intro.html) +- **Transaction Structure**: Understanding the structure of transactions is crucial for developing applications on the Cosmos SDK. Transactions are the primary means of interacting with the blockchain. + - [Transaction Structure Documentation](https://docs.cosmos.network/main/learn/advanced/transactions) +- **IBC (Inter-Blockchain Communication)**: IBC is a protocol that enables communication and asset transfers between different blockchains within the Cosmos ecosystem. + - [IBC Overview](https://docs.cosmos.network/v0.45/ibc/overview.html) +- **Event structure**: ADD THIS + +### EVM (Ethereum Virtual Machine) + +The EVM is the runtime environment for smart contracts on Ethereum and EVM-compatible blockchains like Sei. It allows developers to write and deploy smart contracts using Solidity. + +- **Solidity**: Solidity is the most widely used programming language for writing smart contracts on the EVM. It is a statically-typed language that is influenced by JavaScript, Python, and C++. + - [Solidity Documentation](https://docs.soliditylang.org/en/v0.8.25/) +- **Hardhat**: Hardhat is a development environment for compiling, deploying, testing, and debugging Ethereum software. It is highly extensible and integrates well with other tools. + - [Hardhat Documentation](https://hardhat.org/hardhat-runner/docs/getting-started) +- **Foundry**: Foundry is a toolkit for Ethereum application development, providing a comprehensive suite of tools for testing and deploying smart contracts. + - [Foundry Documentation](https://github.com/foundry-rs/foundry) + +### CosmWasm + +CosmWasm is a smart contract platform built for the Cosmos ecosystem, enabling developers to write smart contracts in WebAssembly (Wasm). Developers on Sei can choose CosmWasm for its safety and performance benefits, and seamlessly interact with EVM smart contracts. + +- **Rust**: Rust is the primary programming language used for writing CosmWasm smart contracts. It is known for its safety, performance, and concurrency. + - [Rust Documentation](https://doc.rust-lang.org/beta/) + +@sei-js + +- Link to typedocs +- Explain what it is diff --git a/pages/tools-and-resources.mdx b/pages/dev-resources/tools-and-resources.mdx similarity index 100% rename from pages/tools-and-resources.mdx rename to pages/dev-resources/tools-and-resources.mdx diff --git a/pages/dev-smart-contracts.mdx b/pages/dev-smart-contracts.mdx new file mode 100644 index 0000000..e13005f --- /dev/null +++ b/pages/dev-smart-contracts.mdx @@ -0,0 +1,96 @@ +# Smart contracts + +Smart contracts are self-executing contracts with their own state. On Sei, developers have the flexibility to use both EVM (Ethereum Virtual Machine) and CosmWasm for smart contract development, allowing for a broad range of decentralized applications (dApps) and interoperability between different blockchain ecosystems. + +## **Optimistic Parallelization on Sei** + +Optimistic parallelization is a technique used by Sei to enhance the throughput and efficiency of both EVM and CosmWasm smart contract executions. This approach significantly increases the number of transactions that can be handled per second without compromising the developer experience by requiring them to define dependencies in smart contracts, making Sei backwards compatible with Ethereum. + +## Choosing Between EVM and CosmWasm for Smart Contract Development + +When developing smart contracts on Sei, developers have the option to choose between using the EVM and CosmWasm. Each approach has its own benefits and trade-offs, and the best choice depends on the specific requirements and context of the project. Here, we will compare EVM and CosmWasm to help you make an informed decision. + +### EVM Smart Contracts + +**Overview**: +EVM is a decentralized computation engine that allows the execution of smart contracts on Ethereum and EVM-compatible blockchains. EVM contracts are typically written in Solidity, a language designed for Ethereum. + +**Benefits**: + +- **Compatibility**: EVM is by far the most widely supported and allows for the use of existing Ethereum tools, libraries, and wallets (such as MetaMask). This makes it seamless to port existing Ethereum dApps to the Sei blockchain. +- **Developer Ecosystem**: The large Ethereum developer community means extensive resources, tutorials, and libraries are available. + +**Considerations**: + +- **Language**: Solidity, while powerful, has a steeper learning curve compared to some other languages. +- **Resource Consumption**: EVM contracts can be gas-intensive, making optimization important. + +**Use Cases**: + +- Projects requiring compatibility with existing Ethereum infrastructure. +- Developers with a background in Ethereum development. +- Applications benefiting from Ethereum’s mature tooling and ecosystem. + +**Example Tools**: + +- **MetaMask**: Popular Ethereum wallet. + - [MetaMask](https://metamask.io/) +- **Hardhat**: Development environment for Ethereum. + - [Hardhat Documentation](https://hardhat.org/hardhat-runner/docs/getting-started) +- **Foundry**: Fast and portable toolkit for Ethereum development. + - [Foundry Documentation](https://github.com/foundry-rs/foundry) +- **Wagmi**: React hooks library for Ethereum dApps. + - [Wagmi Documentation](https://wagmi.sh/) +- **Viem**: A lightweight and flexible library for Ethereum development. + - [Viem Documentation](https://viem.sh/) + +### CosmWasm Smart Contracts + +**Overview**: +CosmWasm is a smart contract platform built for the Cosmos ecosystem, enabling contracts to be written in WebAssembly (Wasm) languages, with Rust being the most commonly used. + +**Benefits**: + +- **Language Flexibility**: Supports multiple programming languages that compile to Wasm, though Rust is preferred for its performance and safety features. +- **Modularity**: CosmWasm’s architecture encourages modular contract design, making it easier to upgrade and maintain. +- **Integration with Cosmos**: Seamlessly integrates with other Cosmos chains, leveraging the extensive Cosmos ecosystem and its IBC (Inter-Blockchain Communication) protocol. + +**Considerations**: + +- **Learning Curve**: Developers need to be familiar with Rust or other Wasm-supported languages. +- **Ecosystem**: While growing, the CosmWasm ecosystem is smaller compared to Ethereum’s. + +**Use Cases**: + +- Projects requiring high performance and security. +- Applications benefiting from Cosmos features and interoperability. +- Developers with a background in Rust or other Wasm-supported languages. + +**Example Tools**: + +- **CosmWasm**: Platform for building smart contracts on Cosmos. + - [CosmWasm Documentation](https://docs.cosmwasm.com/) +- **CosmosKit**: Library for connecting to Cosmos wallets. + - [CosmosKit Documentation](https://github.com/cosmology-tech/cosmos-kit) +- @sei-js: Typescript library for interacting with Sei. + - [@sei-js Documentation](https://github.com/sei-protocol/sei-js) +- **CosmJS**: JavaScript library for interacting with Cosmos blockchains. + - [CosmJS Documentation](https://cosmos.github.io/cosmjs/) + +## Interoperability + +Interoperability is a key feature of the Sei blockchain, allowing EVM and CosmWasm contracts to interact seamlessly. + +- EVM Precompile Contracts: Precompiles are smart contracts pre-bundled into the chain. Sei has many precompiles to enable EVM dApps and contracts to access native Cosmos functions, such as staking and executing CosmWasm contracts. The official precompiles can be found in [@sei-js/evm](https://github.com/sei-protocol/sei-js/tree/main/packages/evm/src/precompiles) +- **Pointer Contracts**: These contracts act as intermediaries, enabling calls between EVM and CosmWasm contracts. This allows developers to leverage the strengths of both environments and create more versatile dApps. + - [Pointer Contracts Documentation](https://v2.docs.sei.io/interoperability/pointer-contracts) + +## Best Practices + +Security is paramount in smart contract development. Here are some best practices to ensure your contracts are secure: + +- **Code Audits**: Regularly audit your code to identify and fix vulnerabilities. +- **Use Established Libraries**: Leverage well-tested libraries and frameworks to reduce the risk of introducing bugs. +- **Write Quality Code**: Adhere to best practices for smart contract development, such as proper error handling, using safe math libraries, and avoiding unnecessary complexity. +- **Testing**: Thoroughly test your contracts, including unit tests, integration tests, and security tests, to ensure they function as expected under various scenarios. +- **Optimization:** Using packages like rust-optimizer for CosmWasm contracts are critical to ensure gas fees remain low while using your smart contract. diff --git a/pages/dev-token-standards.mdx b/pages/dev-token-standards.mdx new file mode 100644 index 0000000..2e48484 --- /dev/null +++ b/pages/dev-token-standards.mdx @@ -0,0 +1,51 @@ +# Token Standards + +In this section, we will delve into the various token standards supported on the Sei blockchain. Understanding these standards is crucial for developers as they form the foundation of many decentralized applications. Sei offers support for native TokenFactory tokens, ERC standards, CW standards, IBC and facilitates interoperability between these token types. + +### Sei Token + +The Sei token is the native token of the Sei blockchain, serving multiple roles within the ecosystem. + +- **Base Denom**: `usei` (cosmos) and `wei` (evm) +- **Decimals**: `6` (cosmos) and `18` (evm) +- **Fee Token**: Used to pay transaction fees on the Sei network. +- **Governance Token**: Used to participate in governance decisions affecting the network. + +### **Decimals Overview**: + +On the Cosmos side, the Sei token has 6 decimals, while on the EVM side, it follows the standard 18 decimals. + +### TokenFactory + +TokenFactory allows for the creation of tokens that are natively integrated into the bank module of the Cosmos SDK. This integration means balances are available through native bank queries, unlike CW20 or ERC20 tokens which require querying the smart contract directly. + +- **Why is it Recommended?**: It provides a more efficient way to manage tokens, leveraging the native capabilities of the Cosmos SDK for improved performance and ease of use. +- **How to Create via `seid` CLI**: Tokens can be created using the `seid` command-line interface. + +### Inter-Blockchain Communication (IBC) + +IBC is a protocol that enables communication and asset transfers between different cosmos chains, enhancing interoperability and enabling cross-chain applications and liquidity. + +- **Channel Info List**: Channels are used to establish communication paths between blockchains. Each channel has a unique identifier and specific configurations. + - [IBC Channel Info Registry](https://github.com/sei-protocol/chain-registry/blob/main/ibc_info.json) +- **Contributing to the IBC Registry**: IBC relayers can add new channels by making pull requests to the IBC registry. + +### Fungible Tokens + +Fungible tokens are digital assets that are interchangeable with one another and are not unique. Sei supports both ERC20 and CW20 fungible token standards. + +- **ERC20**: The ERC20 standard defines a common set of rules for fungible tokens on EVM-based blockchains. These tokens can be transferred, approved, and queried using standard functions. +- **CW20**: The CW20 standard is the Cosmos equivalent of ERC20, providing similar functionalities for tokens on Cosmos-based blockchains. +- **Interoperability and Pointer Contracts**: Pointer contracts enable interoperability between ERC20 and CW20 tokens, allowing for seamless interaction between the two standards. + - [Pointer Contracts Documentation](https://v2.docs.sei.io/interoperability/pointer-contracts) +- **Pointer Contract Registry**: A registry that keeps track of pointer contracts to facilitate interoperability. + +### NFTs + +Non-fungible tokens (NFTs) represent unique digital assets. Sei supports both ERC721 and CW721 standards as well as their counterparts with royalties (2981). + +- **ERC721**: The ERC721 standard defines the structure for non-fungible tokens on EVM-based blockchains. Each token is unique and cannot be exchanged on a one-to-one basis like fungible tokens. +- **CW721**: The CW721 standard is the Cosmos equivalent of ERC721, providing similar functionalities for NFTs on Cosmos-based blockchains. +- **Interoperability**: Similar to fungible tokens, NFTs can interact across different standards using pointer contracts. +- **Pointer Contract Registry**: A registry for tracking pointer contracts specific to NFTs. +- **CW2981 & ERC2981 (Royalties)**: These standards define royalty mechanisms for NFTs, ensuring creators receive a percentage of sales. diff --git a/pages/dev-tutorials/_meta.json b/pages/dev-tutorials/_meta.json new file mode 100644 index 0000000..31a9767 --- /dev/null +++ b/pages/dev-tutorials/_meta.json @@ -0,0 +1,13 @@ +{ + "installing-seid": "Installing seid CLI", + "building-a-frontend": "Building a frontend", + "cosmwasm-general": "CosmWasm (General)", + "evm-general": "EVM (General)", + "evm-cli-tutorial": "EVM (CLI)", + "tokenfactory-tutorial": "Token Factory", + "nft-contract-tutorial": "NFT Contracts", + "pointer-contracts": "Pointer Contracts", + "multi-sig-accounts": "Multi-Sig Accounts", + "ibc-protocol": "IBC Protocol", + "ibc-relayer": "IBC Relayer" +} diff --git a/pages/quickstart/building-a-frontend.mdx b/pages/dev-tutorials/building-a-frontend.mdx similarity index 78% rename from pages/quickstart/building-a-frontend.mdx rename to pages/dev-tutorials/building-a-frontend.mdx index eba14d2..9c9aa23 100644 --- a/pages/quickstart/building-a-frontend.mdx +++ b/pages/dev-tutorials/building-a-frontend.mdx @@ -1,5 +1,4 @@ import { Callout, Tabs } from "nextra/components"; -import { HelpCallout } from "../../components"; # Building a Frontend @@ -11,7 +10,11 @@ Select one of the tabs below to get started! -In this section, we'll use [ethers.js](https://docs.ethers.org/v6/) to build a React app that interacts with a smart contract using the Sei [CosmWasm precompile](../precompiles/cosmwasm.mdx). +In this section, we'll explore Sei's unique interoperability features by building an EVM compatible DApp that interacts with a CosmWasm smart contract. +We will use [ethers.js](https://docs.ethers.org/v6/) to build a React app that interacts with a CosmWasm smart contract using the Sei [CosmWasm precompile](../precompiles/cosmwasm.mdx). + +## Prerequisites +- Complete the tutorial in [cosmwasm-general](./cosmwasm-general.mdx) to deploy a CosmWasm counter contract on our devnet (arctic-1). ## Requirements @@ -19,6 +22,7 @@ Before starting, ensure you have: - Node.js & NPM installed - One of the Sei wallets listed [here](/setting-up-a-wallet) +- The wallet should be funded with sufficient Sei on our devnet (arctic-1). Refer to the section on [faucets](../dev-ecosystem-providers/faucets.mdx) for instructions on how to get Devnet tokens. ## Creating a React Project @@ -44,72 +48,29 @@ npm install ethers ``` ## Defining Contract Addresses and ABI +In this tutorial, we will be using the **Wasm Precompile** to interact with our CosmWasm contract from the EVM. +Precompiles (short for Precompiled contracts) are EVM compatible contracts that are built into the chain. The Wasm Precompile is a unique smart contract on Sei that enables EVM clients to query and execute CosmWasm contracts. +Refer to the docs on [interoperability](./interoperability.mdx) for more details about precompiles. + +First, import the address and ABI of the CosmWasm precompile from `@sei-js/evm`. + + + `@sei-js` contains NPM libraries for writing applications that interact with + Sei. Learn more [here](https://github.com/sei-protocol/sei-js/tree/main). + -First, define the address and ABI of the CosmWasm precompile, and the address of the contract you'll be interacting with: +`@sei-js/evm` is an npm package that contains useful constants and helpers for interacting with the EVM on Sei. + +To install sei-js: +```bash copy +npm install @sei-js/evm +``` + +At the top of `App.tsx` you can then import `WASM_PRECOMPILE_ADDRESS`, `WASM_PRECOMPILE_ABI`. These constants allow us to interact with the Wasm Precompile. ```tsx copy -// Wasm precompile address -const WASM_PRECOMPILE_ADDRESS = "0x0000000000000000000000000000000000001002"; -// Counter CosmWasm contract (used for testing on arctic-1) -const COUNTER_CONTRACT_ADDRESS = - "sei14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sh9m79m"; -// The precompiled contract ABI (fragments we care about) -// View the entire ABI here: https://github.com/sei-protocol/sei-chain/tree/evm/precompiles/wasmd -const WASM_PRECOMPILE_ABI = [ - { - inputs: [ - { - internalType: "string", - name: "contractAddress", - type: "string", - }, - { - internalType: "bytes", - name: "msg", - type: "bytes", - }, - { - internalType: "bytes", - name: "coins", - type: "bytes", - }, - ], - name: "execute", - outputs: [ - { - internalType: "bytes", - name: "response", - type: "bytes", - }, - ], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "contractAddress", - type: "string", - }, - { - internalType: "bytes", - name: "req", - type: "bytes", - }, - ], - name: "query", - outputs: [ - { - internalType: "bytes", - name: "response", - type: "bytes", - }, - ], - stateMutability: "view", - type: "function", - }, -]; +import { WASM_PRECOMPILE_ADDRESS, WASM_PRECOMPILE_ABI, WasmPrecompileContract } from '@sei-js/evm'; +import { ethers } from 'ethers'; ``` These values will be used in the app to query and execute a contract. @@ -119,15 +80,19 @@ These values will be used in the app to query and execute a contract. Replace your main `App` component with the following: ```tsx copy filename="App.tsx" +import { WASM_PRECOMPILE_ADDRESS, SeiChainInfo, getWasmPrecompileEthersV6Contract } from '@sei-js/evm'; import { useEffect, useState } from "react"; import { BrowserProvider, Contract, toUtf8Bytes, toUtf8String } from "ethers"; import "./App.css"; - + function App() { const [count, setCount] = useState(); const [contract, setContract] = useState(); const [isIncrementing, setIsIncrementing] = useState(false); - + + // TODO: Replace this with your CosmWasm contract address here + const COUNTER_CONTRACT_ADDRESS = "sei14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sh9m79m"; + const fetchCount = async () => { if (!contract) { return; @@ -141,37 +106,35 @@ function App() { const { count } = JSON.parse(toUtf8String(queryResponse)); setCount(count); }; - + useEffect(() => { fetchCount(); }, [contract]); - + const connectWallet = async () => { if (window.ethereum) { const provider = new BrowserProvider(window.ethereum); const { chainId } = await provider.getNetwork(); - if (chainId !== BigInt(713715)) { - alert("MetaMask is not connected to Sei EVM devnet"); + const devnetChainId = SeiChainInfo.devnet.chainId + if (chainId !== BigInt(devnetChainId)) { + alert("Wallet is not connected to Sei EVM devnet"); return; } - + const signer = await provider.getSigner(); - const contract = new Contract( - WASM_PRECOMPILE_ADDRESS, - WASM_PRECOMPILE_ABI, - signer - ); + const contract = getWasmPrecompileEthersV6Contract(WASM_PRECOMPILE_ADDRESS, signer) + setContract(contract); } else { - alert("MetaMask is not installed"); + alert("No EVM compatible wallet installed"); } }; - + const incrementCount = async () => { if (!contract) { return; } - + setIsIncrementing(true); // Execute message to increment the count on the contract const executeMsg = { increment: {} }; @@ -186,7 +149,7 @@ function App() { setIsIncrementing(false); await fetchCount(); }; - + return ( <>
@@ -204,7 +167,7 @@ function App() { ); } - + export default App; ``` @@ -220,14 +183,14 @@ export default App; A single `useEffect` hook to fetch the current count whenever the contract state changes, indicating that the contract instance is ready for interaction. -**Connecting to MetaMask** +**Connecting to EVM Wallet** A function named `connectWallet` that: -- Checks for the MetaMask extension. -- Establishes a connection to the Ethereum network via MetaMask, using ethers.js BrowserProvider. +- Checks for any EVM compatible wallet extension. +- Establishes a connection to the Ethereum network via the connected wallet, using ethers.js BrowserProvider. - Verifies the correct network (Sei EVM devnet) by comparing chainId. -- Creates an ethers.js Contract instance with the signer from MetaMask, setting it in the contract state for later use. +- Creates an ethers.js Contract instance with the signer from the wallet, setting it in the contract state for later use. **Fetching Contract Data** @@ -244,6 +207,10 @@ A function named `incrementCount` that: - Waits for the transaction to be confirmed. - Refetches the count to update the UI with the new value. + +To see your app in action, run `npm run dev` to spin up a local version of the application. Once you connect your wallet, you should see a counter, as well as a button you can use to increment the counter on the contract. + +Congrats on deploying your first interoperable dApp on Sei! In this section, we'll use the [@sei-js](https://github.com/sei-protocol/sei-js/) library to build a React app that interacts with a CosmWasm contract. @@ -423,7 +390,7 @@ function Home() { export default Home; ``` -We deployed a counter contract on the `arctic-1` testnet. Contract address: `sei18g4g35mhy5s88nshpa6flvpj9ex6u88l6mhjmzjchnrfa7xr00js0gswru`. Learn more about this contract [here](https://github.com/CosmWasm/cw-template). +We deployed a counter contract on the `arctic-1` testnet. Contract address: `sei14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sh9m79m`. Learn more about this contract [here](https://github.com/CosmWasm/cw-template). ### Detailed outline of `Home.tsx` @@ -469,5 +436,3 @@ Run `npm run dev` and navigate to http://localhost:5173/ to view your applicatio ## Conclusion 🎉 Congratulations on creating a website for querying and executing a smart contract on Sei! Explore more possibilities with your frontend at our [@sei-js repo](https://github.com/sei-protocol/sei-js/tree/main). - - diff --git a/pages/dev-tutorials/cosmwasm-general.mdx b/pages/dev-tutorials/cosmwasm-general.mdx new file mode 100644 index 0000000..4bef755 --- /dev/null +++ b/pages/dev-tutorials/cosmwasm-general.mdx @@ -0,0 +1,300 @@ +# CosmWasm (general) +## Overview +CosmWasm is a smart contract platform focusing on security, performance, and interoperability It is the only smart contracting platform for public blockchains with heavy adoption outside of the EVM world. + +Key features of CosmWasm are: + +**Secure** + +CosmWasm architecture prevents almost all the known risk vectors of Ethereum. + +**Powerful** + +CosmWasm runs the Web Assembly, Wasm virtual machine guarantees high performance. + +**Interoprable** + +CosmWasm was built for multi-chain, cross-chain world, deeply integrated with IBC (Inter-blockchain communication). + +## Smart contract language + +CosmWasm smart contracts are written in [Rust](https://www.rust-lang.org/) programming language. Here’s a good reference if you would like to make a [deep dive](https://doc.rust-lang.org/book/). + +### Rust + +Why Rust? + +**Performance.** Rust is blazingly fast and memory-efficient: with no runtime or garbage collector, it can power performance-critical services, run on embedded devices, and easily integrate with other languages. + +**Reliability.** Rust’s rich type system and ownership model guarantee memory-safety and thread-safety — enabling you to eliminate many classes of bugs at compile-time. + +**Productivity.** Rust has great documentation, a friendly compiler with useful error messages, and top-notch tooling — an integrated package manager and build tool, smart multi-editor support with auto-completion and type inspections, an auto-formatter, and more. + +#### Example CosmWasm smart contract + +```rust +// cosmwasm_std is a standard library for smart contracts. +// It provides essential utilities for communication with the outside world +// and a couple of helper functions and types. +// Every smart contract uses this dependency. +use cosmwasm_std::{ + entry_point, to_binary, Binary, Deps, DepsMut, Empty, Env, MessageInfo, + Response, StdResult, +}; +// serde is a serialization/deserilization library +use serde::{Deserialize, Serialize}; + +// Query response data structure +#[derive(Serialize, Deserialize)] +struct QueryResp { + message: String, +} + +// Typical Rust application starts with the fn main() function called by +// the operating system. Smart contracts are not significantly different. +// When the message is sent to the contract, a function called "entry point" +// is called. Unlike native applications, which have only a single main entry +// point, smart contracts have a couple corresponding to different message types: +// instantiate, execute, query, sudo, migrate and more +#[entry_point] +// instantiate is called once per smart contract lifetime - you can think about +// it as a constructor or initializer of a contract. +pub fn instantiate( + // DepsMut is a utility type for communicating with the outer world - + // it allows querying and updating the contract state, + // querying other contracts state, and gives access to an Api object with + // a couple of helper functions for dealing with CW addresses. + _deps: DepsMut, + // Env is an object representing the blockchains state when executing + // the message - the chain height and id, current timestamp, and the called + // contract address. + _env: Env, + // MessageInfo contains metainformation about the message which triggered + // an execution - an address that sends the message, and chain native + // tokens sent with the message. + _info: MessageInfo, + // Empty is the message triggering execution itself, it is Empty type + // that represents {} JSON, but the type of this argument can be anything + // that is deserializable. + _msg: Empty, +) -> StdResult { + Ok(Response::new()) +} + +// Another entry point +#[entry_point] +pub fn query( + // Deps object is readonly as opposed to DevMut above. + // That is because the query can never alter the smart contract's internal + // state. It can only read the state. It comes with some consequences - + // for example, it is impossible to implement caching for future queries + // (as it would require some data cache to write to). + _deps: Deps, + _env: Env, + _msg: Empty + ) -> StdResult { + let resp = QueryResp { + message: "Hello World".to_owned(), + }; + + to_binary(&resp) +} +``` + +## Deploying a smart contract on Sei + +Let’s create a simple smart contract project from template. + +Assuming you have a recent version of Rust and Cargo installed (via [rustup](https://rustup.rs/)), then the following should get you a new repo to start a contract: + +Install [cargo-generate](https://github.com/ashleygwilliams/cargo-generate) and cargo-run-script.  + +```bash +cargo install cargo-generate --features vendored-openssl +cargo install cargo-run-script +``` + +Now, let’s use it to create your new contract project. Go to the folder in which you want to place it and run: + +```bash +cargo generate --git https://github.com/CosmWasm/cw-template.git --name counter +``` + +Choose `false` when asked `Would you like to generate the minimal template?` . + +This should create a `counter` contract project with source code generated inside folder with the same name. + +Once inside the project open `Cargo.toml` and remove features we won’t need. + +```bash +cosmwasm-std = { version = "2.0.1", features = [ + "cosmwasm_1_3", + # Enable this if you only deploy to chains that have CosmWasm 1.4 or higher + # "cosmwasm_1_4", +] } +``` + +modify this line to + +```bash +cosmwasm-std = "2.0.0" +``` + +Before proceeding further let’s test the contract to make sure code is intact. Run + +```bash +cargo test +``` + +You should see output similar to + +```bash + Finished test [unoptimized + debuginfo] target(s) in 0.09s + Running unittests src/lib.rs (target/debug/deps/c3-777d376b6d32a663) + +running 4 tests +test contract::tests::proper_initialization ... ok +test contract::tests::increment ... ok +test contract::tests::reset ... ok +test integration_tests::tests::count::count ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/bin/schema.rs (target/debug/deps/schema-283e665754e86143) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Doc-tests c3 + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +``` + +Now, important steps involved in the contract deployment are building and optimization. Optimization is important to make sure contract will take least amount of space on blockchain possible and will require less gas. [Optimizer](https://github.com/CosmWasm/optimizer) project has been created specifically for that purpose. + +Our generated project contains already an alias command that we could run to invoke building and optimization: + +```toml +# Catgo.toml + +[package.metadata.scripts] +optimize = """docker run --rm -v "$(pwd)":/code \ + --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/optimizer:0.15.0 +""" +``` + +So we just run: + +```bash +$ cargo run-script optimize +``` + +After command runs successfully, we could fund our wasm artifact in `artifact` directory. + +We could also verify it by running a `cosmwasm-check` command: + +```bash +$ cosmwasm-check artifacts/counter.wasm + +Available capabilities: {"stargate", "cosmwasm_1_1", "cosmwasm_1_3", "cosmwasm_2_0", "cosmwasm_1_4", "iterator", "cosmwasm_1_2", "staking"} + +artifacts/counter.wasm: pass + +All contracts (1) passed checks! + +``` + +Now we are ready to deploy our contract. + +Let’s deploy our contract to Sei test network `atlantic-2` . Should you choose another Sei network, it can be found in our registry [here](https://github.com/sei-protocol/chain-registry/blob/main/chains.json). + +```bash +$ seid tx wasm store artifacts/counter.wasm --from $SEI_WALLET_ADDRESS --node https://rpc-testnet.sei-apis.com --chain-id atlantic-2 -b block --fees=200000usei --gas=2000000 +``` + +Note the code in events: + +```bash +- events: + - attributes: + - key: action + value: /cosmwasm.wasm.v1.MsgStoreCode + - key: module + value: wasm + - key: sender + value: + type: message + - attributes: + - key: code_id + value: "8363" <--- Code ID + type: store_code + log: "" + msg_index: 0 + +``` + +Now lets, instantiate the contract: + +```bash +$ seid tx wasm instantiate 8363 '{"count":1}' -y --no-admin --label counter --from $SEI_WALLET_ADDRESS --node https://rpc-testnet.sei-apis.com --chain-id atlantic-2 -b block --fees=40000usei --gas=2000000 +``` + +Note the contract address in the output. + +Query the contract: + +```bash +$ seid q wasm contract-state smart $CONTRACT_ADDRESS '{"get_count": {}}' --node https://rpc-testnet.sei-apis.com +``` + +Response should look like: + +```bash +data: + count: 1 +``` + +Now lets call `increment` function: + +```bash +$ seid tx wasm execute $CONTRACT_ADDRESS '{"increment": {}}' --from $SEI_WALLET_ADDRESS --node https://rpc-testnet.sei-apis.com --chain-id atlantic-2 -b block --fees=4000usei +``` + +If successful, we can now re-query contract state and see counter incremented: + +```bash +data: + count: 2 +``` + +## Calling contract from JS client + +To call the contract from frontend in EVM environment you could use `ethers` and `@sei-js` library: + +```tsx +import {WASM_PRECOMPILE_ABI, WASM_PRECOMPILE_ADDRESS} from "@sei-js/evm"; + +const signer = await getEthSigner(); + +if (!signer) { + console.log('No signer found'); + return; +} +const contract = new ethers.Contract(WASM_PRECOMPILE_ADDRESS, WASM_PRECOMPILE_ABI, signer); + +const counterContractAddress = CONTRACT_ADDRESS; + +const queryJSON = {get_count: {}} +try { + const response = await contract.query(counterContractAddress, toUtf8Bytes(JSON.stringify(queryJSON))); + console.log(toUtf8String(response)); +} catch (e) { + console.log(e); +} +``` diff --git a/pages/quickstart/evm-cli-tutorial.mdx b/pages/dev-tutorials/evm-cli-tutorial.mdx similarity index 100% rename from pages/quickstart/evm-cli-tutorial.mdx rename to pages/dev-tutorials/evm-cli-tutorial.mdx diff --git a/pages/dev-tutorials/evm-general.mdx b/pages/dev-tutorials/evm-general.mdx new file mode 100644 index 0000000..8c5481c --- /dev/null +++ b/pages/dev-tutorials/evm-general.mdx @@ -0,0 +1,343 @@ +# EVM (general) +## Overview +The Ethereum Virtual Machine (EVM) is the runtime environment for smart contracts, enabling compatibility with Ethereum-based dApps. Sei is an EVM compatible blockchain. Sei's parallelized EVM ensures high performance and efficiency. + +Here are some key points about the EVM: + +1. **Turing Completeness**: The EVM is Turing complete, meaning it can execute any computable function. This allows developers to write complex smart contracts. +2. **Gas**: Transactions and contract executions on the EVM compatible network consume gas. Gas is a measure of computational work, and users pay for it in usei on Sei networks . Gas ensures that malicious or inefficient code doesn’t overload the network. +3. **Bytecode Execution**: Smart contracts are compiled into bytecode (low-level machine-readable instructions) and deployed to the EVM compatible network. The EVM executes this bytecode. + +## Smart contract languages + +The two most popular languages for developing smart contracts on the EVM are **Solidity** and **Vyper**. + +### Solidity + +- Object-oriented, high-level language for implementing smart contracts. +- Curly-bracket language that has been most profoundly influenced by C++. +- Statically typed (the type of a variable is known at compile time). +- Supports: + - Inheritance (you can extend other contracts). + - Libraries (you can create reusable code that you can call from different contracts – like static functions in a static class in other object oriented programming languages). + - Complex user-defined types. + + +#### Example solidity contract + +```solidity +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >= 0.7.0; + +contract Coin { + // The keyword "public" makes variables + // accessible from other contracts + address public minter; + mapping (address => uint) public balances; + + // Events allow clients to react to specific + // contract changes you declare + event Sent(address from, address to, uint amount); + + // Constructor code is only run when the contract + // is created + constructor() { + minter = msg.sender; + } + + // Sends an amount of newly created coins to an address + // Can only be called by the contract creator + function mint(address receiver, uint amount) public { + require(msg.sender == minter); + require(amount < 1e60); + balances[receiver] += amount; + } + + // Sends an amount of existing coins + // from any caller to an address + function send(address receiver, uint amount) public { + require(amount <= balances[msg.sender], "Insufficient balance."); + balances[msg.sender] -= amount; + balances[receiver] += amount; + emit Sent(msg.sender, receiver, amount); + } +} +``` + +### Vyper + +- Pythonic programming language +- Strong typing +- Small and understandable compiler code +- Efficient bytecode generation +- Deliberately has less features than Solidity with the aim of making contracts more secure and easier to audit. Vyper does not support: + - Modifiers + - Inheritance + - Inline assembly + - Function overloading + - Operator overloading + - Recursive calling + - Infinite-length loops + - Binary fixed points + +#### Example Vyper contract + + ```python + # Open Auction + + # Auction params + # Beneficiary receives money from the highest bidder + beneficiary: public(address) + auctionStart: public(uint256) + auctionEnd: public(uint256) + + # Current state of auction + highestBidder: public(address) + highestBid: public(uint256) + + # Set to true at the end, disallows any change + ended: public(bool) + + # Keep track of refunded bids so we can follow the withdraw pattern + pendingReturns: public(HashMap[address, uint256]) + + # Create a simple auction with `_bidding_time` + # seconds bidding time on behalf of the + # beneficiary address `_beneficiary`. + @external + def __init__(_beneficiary: address, _bidding_time: uint256): + self.beneficiary = _beneficiary + self.auctionStart = block.timestamp + self.auctionEnd = self.auctionStart + _bidding_time + + # Bid on the auction with the value sent + # together with this transaction. + # The value will only be refunded if the + # auction is not won. + @external + @payable + def bid(): + # Check if bidding period is over. + assert block.timestamp < self.auctionEnd + # Check if bid is high enough + assert msg.value > self.highestBid + # Track the refund for the previous high bidder + self.pendingReturns[self.highestBidder] += self.highestBid + # Track new high bid + self.highestBidder = msg.sender + self.highestBid = msg.value + + # Withdraw a previously refunded bid. The withdraw pattern is + # used here to avoid a security issue. If refunds were directly + # sent as part of bid(), a malicious bidding contract could block + # those refunds and thus block new higher bids from coming in. + @external + def withdraw(): + pending_amount: uint256 = self.pendingReturns[msg.sender] + self.pendingReturns[msg.sender] = 0 + send(msg.sender, pending_amount) + + # End the auction and send the highest bid + # to the beneficiary. + @external + def endAuction(): + # It is a good guideline to structure functions that interact + # with other contracts (i.e. they call functions or send ether) + # into three phases: + # 1. checking conditions + # 2. performing actions (potentially changing conditions) + # 3. interacting with other contracts + # If these phases are mixed up, the other contract could call + # back into the current contract and modify the state or cause + # effects (ether payout) to be performed multiple times. + # If functions called internally include interaction with external + # contracts, they also have to be considered interaction with + # external contracts. + + # 1. Conditions + # Check if auction endtime has been reached + assert block.timestamp >= self.auctionEnd + # Check if this function has already been called + assert not self.ended + + # 2. Effects + self.ended = True + + # 3. Interaction + send(self.beneficiary, self.highestBid) + ``` + +## Deploying EVM contract on Sei + +Since Sei is an EVM compatible chain, existing EVM tooling like [hardhat](https://hardhat.org/), [foundry forge](https://book.getfoundry.sh/) or other could be re-used. + +In this example we will be using [foundry tooling](https://book.getfoundry.sh/). + +Install the [foundry tooling](https://book.getfoundry.sh/) by following this [Installation guide](https://book.getfoundry.sh/getting-started/installation.html). + +Create a new project following the [Creating New Project Guide](https://book.getfoundry.sh/projects/creating-a-new-project). + +Also make sure you have a wallet on Sei network. + +Once project is created, tweak the contract code to the following, by adding a `getCounter` function: + + ```solidity + // SPDX-License-Identifier: UNLICENSED + pragma solidity ^0.8.13; + + contract Counter { + uint256 public number; + + function setNumber(uint256 newNumber) public { + number = newNumber; + } + + function increment() public { + number++; + } + + function getCount() public view returns (uint256) { + return number; + } + } + + ``` + +And the test code to the following: + + ```solidity + // SPDX-License-Identifier: UNLICENSED + pragma solidity ^0.8.13; + + import {Test, console} from "forge-std/Test.sol"; + import {Counter} from "../src/Counter.sol"; + + contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + counter.setNumber(0); + } + + function test_Increment() public { + counter.increment(); + assertEq(counter.number(), 1); + } + + function testFuzz_SetNumber(uint256 x) public { + counter.setNumber(x); + assertEq(counter.number(), x); + } + + function test_GetCount() public { + uint256 initialCount = counter.getCount(); + counter.increment(); + assertEq(counter.getCount(), initialCount + 1); + } + } + ``` + +Run the tests with the following command: + + ```bash + $ forge test + ``` + +If tests pass, deploy the contract to the Sei chain with the following command: + + ```bash + $ forge create --rpc-url $SEI_NODE_URI --mnemonic $MNEMONIC src/Counter.sol:Counter + ``` + +Where `$SEI_NODE_URI` is the URI of the Sei node and `$MNEMONIC` is the mnemonic of the account that will deploy the contract. If you run local Sei node, the address will be `http://localhost:8545` , otherwise you could grab a `evm_rpc` url from the [registry](https://github.com/sei-protocol/chain-registry/blob/main/chains.json). If deployment is successful, you will get the EVM contract address in the output. + + ```bash + [⠒] Compiling... + No files changed, compilation skipped + Deployer: $0X_DEPLOYER_ADDRESS + Deployed to: $0X_CONTRACT_ADDRESS + Transaction hash: $0X_TX_HASH + ``` + +Let's use the `cast` command to query the contract: + + ```bash + $ cast call $0X_CONTRACT_ADDRESS "getCount()(uint256)" --rpc-url $SEI_NODE_URI + ``` + +The command should return `0` as the initial value of the counter. + +Now we can use the `cast` command to call the `increment` function: + + ```bash + $ cast send $0X_CONTRACT_ADDRESS "increment()" --mnemonic $MNEMONIC --rpc-url $SEI_NODE_URI + ``` + +If command is successful, you will get the transaction hash and other info back. + +Now let's call the `getCount` function again and this case it should return `1`. + +## Calling contract from JS client + +To call contract from frontend, you could use `ethers` like: + + ```tsx + import {ethers} from "ethers"; + + const signer = await getEthSigner(); + const provider = await getProvider(); + if (!signer) { + console.log('No signer found'); + return; + } + const abi = [ + { + "type": "function", + "name": "setNumber", + "inputs": [ + { + "name": "newNumber", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "int256", + "internalType": "int256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "increment", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + } + ]; + + // Define the address of the deployed contract + const contractAddress = 0X_CONTRACT_ADDRESS; + + // Create a new instance of the ethers.js Contract object + const contract = new ethers.Contract(contractAddress, abi, provider); + + // Call the contract's functions + async function getCount() { + const count = await contract.getCount(); + console.log(count.toString()); + } + + await getCount(); + ``` diff --git a/pages/dev-tutorials/ibc-protocol.mdx b/pages/dev-tutorials/ibc-protocol.mdx new file mode 100644 index 0000000..09e8e20 --- /dev/null +++ b/pages/dev-tutorials/ibc-protocol.mdx @@ -0,0 +1,93 @@ +# Overview + +The Inter-Blockchain Communication (IBC) protocol is a blockchain interoperability solution that allows blockchains to transfer any type of data encoded in bytes, in a secure and permissionless manner. + +The most popular IBC use case arguably is token swaps between different blockchains. + +## What differentiates IBC from other bridging protocols? + +**Universal Interoperability**. Chains that speak IBC can share any type of data as long as it's encoded in bytes, enabling the industry’s most feature-rich cross-chain interactions. + +**Permissionless access**. IBC is completely open-source: Anyone can build with IBC, and there’s no in-protocol rent extraction or hidden fees. + +**Security**. IBC’s light client-based interoperability removes the need for a trusted third party in cross-chain interactions, securing tens of billions in annual value transfer without a single exploit since launch. + +# Design Principles + +The design principles of IBC drew inspiration from the TCP/IP specification that enabled the creation of the internet. Mirroring the way TCP/IP sets the standard for seamless communication between computers, IBC defines a universal framework of abstractions that lets blockchains communicate. + +The IBC protocol stack can be decoupled into two distinct elements: the **[IBC Transport Layer](https://www.ibcprotocol.dev/blog/what-are-the-ibc-transport-and-application-layers)** and the **[IBC Application Layer](https://www.ibcprotocol.dev/blog/what-are-the-ibc-transport-and-application-layers).** + +The **IBC Transport Layer** is agnostic to the contents of transferred data packets, much like TCP/IP. The IBC Transport Layer is a foundational layer upon which feature-rich applications are developed, similar to the applications that sit on top of TCP/IP and allow for the flourishing of end-user Internet applications. + +The transport layer handles data packet transport, authentication, and ordering. The key components of the transport layer are light clients, connections, channels, and relayers. + +**Light clients** are the heart of the IBC Transport Layer. A [light client](https://www.ibcprotocol.dev/technical-resource-catalog?category=Light+Client#results) is a lightweight representation of destination chain that live within the state machine of the source chain. + +For example, chains A and B are connected over IBC via their light clients. Chain A will have a light client representing chain B in its own state machine, and Chain B has a light client of Chain A. Light clients keep track of a counterparty blockchain’s consensus algorithm by verifying block headers and Merkle proofs. + +**Connections** are responsible for connecting two different light clients together. + +**Channels** act as a conduit to connect a module/application on the source chain to a module on the destination chain. Data packets between the source and destination chains are sent over this abstraction layer. + +**Relayers** are permissionless off-chain processes that ferry data packets from one chain to another. [Relayer](https://www.ibcprotocol.dev/technical-resource-catalog?category=Relayer#results)s scan chain states, build transactions based on these states, and submit the transactions to the chains involved in the network. Relayers play a crucial role in IBC because chains do not directly send messages to each other over networking infrastructure. Instead, they create and store the data to be retrieved and used by a relayer to build IBC packets. + +Get an in-depth walkthrough of the IBC components and packet flow on the [developer documentation.](https://ibc.cosmos.network/v8/ibc/overview) + +# Asset transfer + +## Command line + +In order to transfer funds from Sei to other chain or other way round we need several bits of information. In particular: + +- from wallet e.g. Sei bech32 address +- to wallet e.g. Axelar bech32 address +- the source channel and port id + - These could be located in [registry](https://github.com/sei-protocol/chain-registry/blob/main/ibc_info.json). E.g. for `atlantic-2` Axelar, we would use: + + ```json + { + "counterparty_chain_name": "axelar-testnet-lisbon-3", + "dst_channel": "channel-257", + "src_channel": "channel-44", + "port_id": "transfer", + "client_id": "07-tendermint-80" + }, + ``` + + +With that information on hand we could run a cmd command to perform transfer like: + +```bash +$ seid tx ibc-transfer transfer transfer channel-44 $AXELAR_ADDRESS 200sei --from $SEI_ADDRESS --fees 4000usei --node https://rpc-testnet.sei-apis.com --chain-id atlantic-2 -b block +``` + +This would transfer 200 sei from sei address to axelar address. + +## JS Client + +```tsx +import {ethers} from "ethers"; +import {IBC_PRECOMPILE_ADDRESS, IBC_PRECOMPILE_ABI} from "@sei-js/evm"; + +const transferWithDefaultTimeout = async () => { + const signer = await getEthSigner(); + + if(!signer) { + toast.error('No signer found'); + return; + } + const contract = new ethers.Contract(IBC_PRECOMPILE_ADDRESS, IBC_PRECOMPILE_ABI, signer); + const axelarAddress = AXELAR_ADDRESS + + try { + console.log("Transfer") + const result = await contract.transferWithDefaultTimeout(axelarAddress, "transfer", "channel-44", "usei", "76000", "memo text"); + console.log("TransferResult: ", result); + } + catch (e) { + console.log(e) + } + + }; +``` diff --git a/pages/dev-tutorials/ibc-relayer.mdx b/pages/dev-tutorials/ibc-relayer.mdx new file mode 100644 index 0000000..a604a86 --- /dev/null +++ b/pages/dev-tutorials/ibc-relayer.mdx @@ -0,0 +1,152 @@ +# IBC Relayer + +For IBC protocol overview, refer to + +[IBC Protocol](https://www.notion.so/IBC-Protocol-61a7d667b530434c8841dde8f3aa2612?pvs=21) + +# Overview + +**Relayers** are permissionless off-chain processes that ferry data packets from one chain to another. [Relayer](https://www.ibcprotocol.dev/technical-resource-catalog?category=Relayer#results)s scan chain states, build transactions based on these states, and submit the transactions to the chains involved in the network. Relayers play a crucial role in IBC because chains do not directly send messages to each other over networking infrastructure. Instead, they create and store the data to be retrieved and used by a relayer to build IBC packets. + +Get an in-depth walkthrough of the IBC components and packet flow on the [developer documentation.](https://ibc.cosmos.network/v8/ibc/overview) + +There are several relayer implementations in different languages: + +- Golang [relayer](https://github.com/cosmos/relayer) +- Rust [hermes](https://hermes.informal.systems/) + +# Running relayer with Sei + +## Installation + +We will be using hermes as example relayer. Please note, that Sei requires hermes of version `1.3.0` . + +To install hermes simply head to the GitHub [Releases](https://github.com/informalsystems/hermes/releases) page and download Hermes binary matching your platform: + +- macOS: `hermes-v1.3.0-x86_64-apple-darwin.tar.gz` (or .zip), +- Linux: `hermes-v1.3.0-x86_64-unknown-linux-gnu.tar.gz` (or .zip). + +The step-by-step instruction below should carry you through the whole process: + +1. Make the directory where we'll place the binary: + + ``` + + mkdir -p $HOME/.hermes/bin + + ``` + +2. Extract the binary archive: + + ``` + + tar -C $HOME/.hermes/bin/ -vxzf $ARCHIVE_NAME + + ``` + +3. Update your path, by adding this line in your `.bashrc` or `.zshrc` shell configuration file: + + ``` + + export PATH="$HOME/.hermes/bin:$PATH" + ``` + + +The `Source code` [archive](https://github.com/informalsystems/hermes/archive/refs/tags/v1.3.0.tar.gz) also contains hermes documentation that you can follow in `guide/book` folder. + +## Configuration + +`$HOME/.hermes/config.toml` file should look like below. Please note that this example assumes local chains, so all RPC urls have to be substituted for real chain ones. + +```toml +[global] +log_level = 'info' + +[mode] + +[mode.clients] +enabled = true +refresh = true +misbehaviour = true + +[mode.connections] +enabled = true + +[mode.channels] +enabled = true + +[mode.packets] +enabled = true +clear_interval = 100 +clear_on_start = true +tx_confirmation = true + +[telemetry] +enabled = true +host = '127.0.0.1' +port = 3001 + +[[chains]] +id = 'ibc-0' +rpc_addr = 'http://localhost:27030' +grpc_addr = 'http://localhost:27032' +websocket_addr = 'ws://localhost:27030/websocket' +rpc_timeout = '15s' +account_prefix = 'cosmos' +key_name = 'wallet' +store_prefix = 'ibc' +gas_price = { price = 0.01, denom = 'stake' } +max_gas = 10000000 +gas_multiplier = 1.5 +clock_drift = '5s' +trusting_period = '14days' +trust_threshold = { numerator = '1', denominator = '3' } + +[[chains]] +id = 'sei-chain' +rpc_addr = 'http://localhost:26657' +grpc_addr = 'http://localhost:9090' +websocket_addr = 'ws://localhost:26657/websocket' +rpc_timeout = '15s' +account_prefix = 'sei' +key_name = 'wallet' +store_prefix = 'ibc' +gas_price = { price = 0.025, denom = 'usei' } +max_gas = 10000000 +gas_multiplier = 2 +clock_drift = '5s' +trusting_period = '14days' +trust_threshold = { numerator = '1', denominator = '3' } + +``` + +Next we need to add the account keys to hermes. + +```bash + +$ hermes keys add --key-name wallet --chain sei-chain --mnemonic-file ~/misc/mm_file_sei +$ hermes keys add --key-name wallet --chain ibc-0 --mnemonic-file ~/misc/mm_file_ibc_0 + +``` + +The contents of ~/misc/mm_file_* file is just a seed phrase of the chain account that will be associated with the chain. + +Finally we need to create clients, connections and channel. There are separate commands for that, but there is a simpler shortcut command: + +```bash +$ hermes create channel --a-chain sei-chain --b-chain ibc-0 --a-port transfer --b-port transfer --new-client-connection +``` + +The output of this command should return created channel details. + +Finally start relaying: + +```bash +$ hermes start +``` + +Please note, that this tutorial is a simplified version. Running relayer in production would require different level of + effort, configuration and monitoring. + +For more information on hermes, please refer to the [official 1.3 version documentation](https://github.com/informalsystems/hermes/archive/refs/tags/v1.3.0.tar.gz) +that can be found in the `guide/book` folder of the source code archive. \ No newline at end of file diff --git a/pages/quickstart/installing-seid.mdx b/pages/dev-tutorials/installing-seid.mdx similarity index 94% rename from pages/quickstart/installing-seid.mdx rename to pages/dev-tutorials/installing-seid.mdx index 7fa696f..a010050 100644 --- a/pages/quickstart/installing-seid.mdx +++ b/pages/dev-tutorials/installing-seid.mdx @@ -100,6 +100,8 @@ Alternatively, if you would like to import an existing seed phrase, you can add seid keys add $NAME --recover ``` +You will then be prompted to input your seed phrase. + If you are importing from an EVM wallet like MetaMask, you may need to specify the coin type. Ethereum (EVM) based wallets use coin type `60`, while the default on Sei is `118`. For example, @@ -111,3 +113,18 @@ seid keys add $NAME --recover This will generate a different address than the default coin type of `118`. + +To see your local wallets, you can run + +```bash copy +seid keys list +``` +to see a list of all wallets added, or + +```bash copy +seid keys show $NAME +``` + +to see a details about a specific wallet. + +### \ No newline at end of file diff --git a/pages/dev-tutorials/multi-sig-accounts.mdx b/pages/dev-tutorials/multi-sig-accounts.mdx new file mode 100644 index 0000000..9274d25 --- /dev/null +++ b/pages/dev-tutorials/multi-sig-accounts.mdx @@ -0,0 +1,111 @@ +# Multi-Sig accounts + +Multi-signature (multi-sig) accounts provide an enhanced security mechanism by requiring multiple approvals (signatures) for transactions. This guide will walk you through setting up a multi-sig account, signing and broadcasting transactions using seid. + +## Creating a multi-sig account + +**1. Adding Accounts to Your Local Keychain** + +First, add two accounts to your local keychain: + +``` +seid keys add ms1 +seid keys add ms2 +``` + +These commands create two key pairs named ms1 and ms2. + +**2. Creating a Multi-Sig Account** + +Next, create a multi-sig account that requires signatures from both ms1 and ms2: + +``` +seid keys add ms1ms2 --multisig-threshold=2 --multisig=ms1,ms2 +``` + +This command sets up a multi-sig account named ms1ms2 with a threshold of 2, meaning it requires signatures from both ms1 and ms2 to authorize transactions. + +## **Signing and Broadcasting a Transaction** + +Here are the steps to sign and broadcast a transaction from a multi-sig account. + +**1. Define an Unsigned Transaction** + +Create an unsigned-tx.json file with your unsigned transaction. Below is an example of a JSON structure for sending tokens using a bank send message: + +``` +{ + "body": { + "messages": [ + { + "@type": "/cosmos.bank.v1beta1.MsgSend", + "from_address": "MULTI_SIG_ACCOUNT", + "to_address": "DESIRED_DESTINATION_ADDRESS", + "amount": [ + { + "denom": "usei", + "amount": "10" + } + ] + } + ], + "memo": "", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [], + "fee": { + "amount": [ + { + "denom": "usei", + "amount": "100000" + } + ], + "gas_limit": "200000", + "payer": "", + "granter": "" + } + }, + "signatures": [] +} +``` + +Replace MULTI_SIG_ACCOUNT with your multi-sig account address and DESIRED_DESTINATION_ADDRESS with the recipient’s address. + +**2. Sign the Unsigned Transaction** + +Sign the unsigned transaction from both ms1 and ms2: + +``` +seid tx sign unsigned-tx.json --multisig=multisigAccountName --from=ms1 --output-document=signer1_signedTx.json --node YOUR_RPC_URL + +seid tx sign unsigned-tx.json --multisig=multisigAccountName --from=ms2 --output-document=signer2_signedTx.json --node YOUR_RPC_URL +``` + +These commands create signer1_signedTx.json and signer2_signedTx.json, which contain the signatures from ms1 and ms2, respectively. + +**3. Combine Signatures** + +Combine the signatures into a single transaction file: + +``` +seid tx multisign unsigned-tx.json ms1ms2 signer1_signedTx.json signer2_signedTx.json > signedTx.json +``` + +This command merges the individual signatures into a single transaction file named signedTx.json. + +**4. Broadcast the Multi-Sig Transaction** + +Finally, broadcast the signed multi-sig transaction to the network: + +``` +seid tx broadcast signedTx.json +``` + +This command sends the combined, signed transaction to the Sei blockchain for processing. + +**Summary** + +By following these steps, you can set up and use multi-sig accounts on the Sei blockchain. This process enhances security by requiring multiple signatures for transaction approval, reducing the risk of unauthorized transactions. Multi-sig accounts are particularly useful for managing shared assets and ensuring that multiple parties must agree before any significant action is taken. diff --git a/pages/quickstart/nft-contract-tutorial.mdx b/pages/dev-tutorials/nft-contract-tutorial.mdx similarity index 100% rename from pages/quickstart/nft-contract-tutorial.mdx rename to pages/dev-tutorials/nft-contract-tutorial.mdx diff --git a/pages/interoperability/pointer-contracts.mdx b/pages/dev-tutorials/pointer-contracts.mdx similarity index 98% rename from pages/interoperability/pointer-contracts.mdx rename to pages/dev-tutorials/pointer-contracts.mdx index 713ccf9..1cfd72d 100644 --- a/pages/interoperability/pointer-contracts.mdx +++ b/pages/dev-tutorials/pointer-contracts.mdx @@ -3,7 +3,6 @@ import { ImageWithCaption } from "../../components"; import PointerContractsWithout from "../../public/assets/pointer-contracts-without.png"; import PointerContractsSimplified from "../../public/assets/pointer-contracts-simplified.png"; import HowItWorks from "../../public/assets/pointer-contracts-how-it-works.png"; -import addressTranslationImage from "../../public/assets/address-derivation.png"; # Pointer Contracts @@ -15,7 +14,7 @@ Intended to be efficient and quick to deploy, a pointer simply serves as an inte Wallets and clients for feature-rich protocols typically support only a single execution environment. -EVM wallets handle ERC-20 coins and ERC-721 NFTs but cannot interact with cosmwasm contracts due to different token standards and interaction methods. +EVM wallets handle ERC-20 coins and ERC-721 NFTs but cannot interact with cosmwasm contracts due to different token standards and interaction methods. The same problem exists for clients built for other protocols (like cosmwasm) which cannot directly interact with Ethereum-based contracts or ERC tokens. Pointer Contracts solve this by enabling interoperability of either protocol, regardless of the client interface. @@ -26,7 +25,7 @@ Pointer Contracts solve this by enabling interoperability of either protocol, re -Each smart contract is limited to **one** associated pointer contract, which must be registered on chain when deploying. +Each smart contract is limited to **one** associated pointer contract, which must be registered on chain when deploying. This prevents conflicts and provides a reference point for verifying the authenticity of the paired contract itself. ### Deploying Pointer Contracts diff --git a/pages/quickstart/tokenfactory-tutorial.mdx b/pages/dev-tutorials/tokenfactory-tutorial.mdx similarity index 100% rename from pages/quickstart/tokenfactory-tutorial.mdx rename to pages/dev-tutorials/tokenfactory-tutorial.mdx diff --git a/pages/dev-validators/_meta.json b/pages/dev-validators/_meta.json new file mode 100644 index 0000000..17462ff --- /dev/null +++ b/pages/dev-validators/_meta.json @@ -0,0 +1,8 @@ +{ + "overview": "Overview", + "register": "Register a Validator", + "security-practices": "Security Best Practices", + "restore-validator": "Restore a Validator", + "oracle-price-feeder": "Oracle Price Feeder", + "validator-faq": "Validator FAQ" +} diff --git a/pages/oracles/running-an-oracle-price-feeder.mdx b/pages/dev-validators/oracle-price-feeder/running-an-oracle-price-feeder.mdx similarity index 100% rename from pages/oracles/running-an-oracle-price-feeder.mdx rename to pages/dev-validators/oracle-price-feeder/running-an-oracle-price-feeder.mdx diff --git a/pages/dev-validators/overview.mdx b/pages/dev-validators/overview.mdx new file mode 100644 index 0000000..81fb475 --- /dev/null +++ b/pages/dev-validators/overview.mdx @@ -0,0 +1,18 @@ +# What is a Validator +Validators are responsible for committing new blocks to the blockchain through an automated voting process.A validator's stake is slashed if they become unavailable or sign blocks at the same height. + +The following instructions assume you have already gone through the Run a Sei Node and are synchronized to the latest block height. + +Validators run full nodes, participate in consensus by broadcasting votes, commit new blocks to the blockchain, and participate in the governance of the blockchain. Validators can cast votes on behalf of their delegators. A validator's voting power is weighted according to their total stake. Only validators in the Active Validator Set are the only validators that sign blocks and receive revenue. + +Validators and their delegators earn the following rewards: + +- Fees are added to each transaction to avoid spamming and pay for computing power. Validators set minimum gas prices and reject transactions that have implied gas prices below this threshold. +- Mints periodically the chain will mint new tokens, this is configured in the mint module + +Validators can set commissions on the fees they receive as an additional incentive. + +For fees and mints, the tokens are distributed in every block relative to the number of tokens that a validator has staked. + +If validators double sign, are frequently offline, or do not participate in governance, their staked Sei (including the Sei of users that delegated to them) can be slashed. Penalties can vary depending on the severity of the violation. + diff --git a/pages/dev-validators/register.mdx b/pages/dev-validators/register.mdx new file mode 100644 index 0000000..fc7bd00 --- /dev/null +++ b/pages/dev-validators/register.mdx @@ -0,0 +1,145 @@ +# Registering a Validator on Sei + +## Prerequisites + +Before you register a validator, ensure that you have completed the following steps: + +1. **Install the `seid` CLI**: Follow the [installation guide](https://docs.sei.io/running-validator/install-sei) to set up the `seid` command-line interface. +2. **Set Up a Full Node**: Ensure your full node is fully synced with the network. Refer to the [full node setup guide](https://docs.sei.io/running-validator/setup-full-node). + +## Generate a Validator Key + +Generate a new keypair for your validator: + +```shell +seid keys add [flags] +``` +### Flags: +```text + --account uint32 Account number for HD derivation + --algo string Key signing algorithm to generate keys for (default "secp256k1") + --coin-type uint32 coin type number for HD derivation (default 118) + --dry-run Perform action, but don't add key to local keystore + --hd-path string Manual HD Path derivation (overrides BIP44 config) + -h, --help help for add + --index uint32 Address index number for HD derivation + -i, --interactive Interactively prompt user for BIP39 passphrase and mnemonic + --ledger Store a local reference to a private key on a Ledger device + --multisig strings List of key names stored in keyring to construct a public legacy multisig key + --multisig-threshold int K out of N required signatures. For use in conjunction with --multisig (default 1) + --no-backup Don't print out seed phrase (if others are watching the terminal) + --nosort Keys passed to --multisig are taken in the order they're supplied + --pubkey string Parse a public key in JSON format and saves key info to file. + --recover Provide seed phrase to recover existing key instead of creating + +``` +Save the generated mnemonic phrase securely as it will be used to recover your keypair. + +## Create a Validator + +Once your full node is synced, create a validator using the following command: + +```bash +seid tx staking create-validator [flags] +``` + +### Flags: + +```text +-a, --account-number uint The account number of the signing account (offline mode only) +--amount string Amount of coins to bond +-b, --broadcast-mode string Transaction broadcasting mode (sync|async|block) (default "sync") +--commission-max-change-rate string The maximum commission change rate percentage (per day) +--commission-max-rate string The maximum commission rate percentage +--commission-rate string The initial commission rate percentage +--details string The validator's (optional) details +--dry-run ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it (when enabled, the local Keybase is not accessible) +--fee-account string Fee account pays fees for the transaction instead of deducting from the signer +--fees string Fees to pay along with transaction; eg: 10uatom +--from string Name or address of private key with which to sign +--gas string gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000) +--gas-adjustment float adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored (default 1) +--gas-prices string Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom) +--generate-only Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase only accessed when providing a key name) +-h, --help help for create-validator +--identity string The optional identity signature (ex. UPort or Keybase) +--ip string The node's public IP. It takes effect only when used in combination with --generate-only +--keyring-backend string Select keyring's backend (os|file|kwallet|pass|test|memory) (default "os") +--keyring-dir string The client Keyring directory; if omitted, the default 'home' directory will be used +--ledger Use a connected Ledger device +--min-self-delegation string The minimum self delegation required on the validator +--moniker string The validator's name +--node string : to tendermint rpc interface for this chain (default "tcp://localhost:26657") +--node-id string The node's ID +--note string Note to add a description to the transaction (previously --memo) +--offline Offline mode (does not allow any online functionality +-o, --output string Output format (text|json) (default "json") +--p2p-port string The node's public port. It takes effect only when used in combination with --generate-only +--pubkey string The validator's Protobuf JSON encoded public key +--security-contact string The validator's (optional) security contact email +-s, --sequence uint The sequence number of the signing account (offline mode only) +--sign-mode string Choose sign mode (direct|amino-json), this is an advanced feature +--timeout-height uint Set a block timeout height to prevent the tx from being committed past a certain height +--website string The validator's (optional) website +-y, --yes Skip tx broadcasting prompt confirmation +``` + +## Verify Your Validator + +To verify your validator, use the following command: + +```bash +seid query staking validator [validator-addr] [flags] +``` + +## Check if Your Validator is in the Active Set +```bash +seid query tendermint-validator-set | grep "$(seid tendermint show-validator | jq -r .key)" +```` + +This command will display information about your validator, including its status and voting power. + +## Managing Your Validator + +### Edit Validator + +You can edit your validator’s details using: + +```bash +seid tx staking edit-validator [flags] +``` + +#### Flags + +```text + -a, --account-number uint The account number of the signing account (offline mode only) + -b, --broadcast-mode string Transaction broadcasting mode (sync|async|block) (default "sync") + --commission-rate string The new commission rate percentage + --details string The validator's (optional) details (default "[do-not-modify]") + --dry-run ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it (when enabled, the local Keybase is not accessible) + --fee-account string Fee account pays fees for the transaction instead of deducting from the signer + --fees string Fees to pay along with transaction; eg: 10uatom + --from string Name or address of private key with which to sign + --gas string gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default 200000) + --gas-adjustment float adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored (default 1) + --gas-prices string Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom) + --generate-only Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase only accessed when providing a key name) + -h, --help help for edit-validator + --identity string The (optional) identity signature (ex. UPort or Keybase) (default "[do-not-modify]") + --keyring-backend string Select keyring's backend (os|file|kwallet|pass|test|memory) (default "os") + --keyring-dir string The client Keyring directory; if omitted, the default 'home' directory will be used + --ledger Use a connected Ledger device + --min-self-delegation string The minimum self delegation required on the validator + --new-moniker string The validator's name (default "[do-not-modify]") + --node string : to tendermint rpc interface for this chain (default "tcp://localhost:26657") + --note string Note to add a description to the transaction (previously --memo) + --offline Offline mode (does not allow any online functionality + -o, --output string Output format (text|json) (default "json") + --security-contact string The validator's (optional) security contact email (default "[do-not-modify]") + -s, --sequence uint The sequence number of the signing account (offline mode only) + --sign-mode string Choose sign mode (direct|amino-json), this is an advanced feature + --timeout-height uint Set a block timeout height to prevent the tx from being committed past a certain height + --website string The validator's (optional) website (default "[do-not-modify]") + -y, --yes Skip tx broadcasting prompt confirmation + +``` diff --git a/pages/dev-validators/restore-validator.mdx b/pages/dev-validators/restore-validator.mdx new file mode 100644 index 0000000..41556cf --- /dev/null +++ b/pages/dev-validators/restore-validator.mdx @@ -0,0 +1,18 @@ +import {Callout} from "nextra/components"; + +# Restore a Validator + +A validator can be completely restored on a new Sei node with the following set of keys: + +- The Consensus key, stored in `~/.sei/config/priv_validator.json` +- The mnemonic to the validator wallet + + +

Before proceeding, ensure that the existing validator is not active. Double voting has severe slashing consequences.

+
+ + +To restore a validator: + +- Setup a full Sei node synced up to the latest block. +- Replace the `~/.sei/config/priv_validator.json` file of the new node with the associated file from the old node, then restart your node. diff --git a/pages/dev-validators/security-practices.mdx b/pages/dev-validators/security-practices.mdx new file mode 100644 index 0000000..001f349 --- /dev/null +++ b/pages/dev-validators/security-practices.mdx @@ -0,0 +1,54 @@ +import { Callout } from "nextra/components"; + +# Implement security practices + +Each validator candidate is encouraged to run its operations independently. Diversity across individual setups increases the resilience of the network. + +## Manage Digital Keys with HSM + +Key management is mission-critical for validators. If an attacker gains access to a validator's private key, it puts the validator's entire delegated stake at risk. Hardware Security Modules (HSMs) are an important strategy for mitigating this risk. You may also want to consider using Horcrux, a multi-party-computation (MPC) signing service. + + +

Note that Horcrux may impact your signing performance, so it's recommended to test it in Testnet

+
+ +## Defend Against DDoS Attacks + +Validators are responsible for ensuring that the network can defend against denial-of-service (DDoS) attacks. Validators can mitigate these attacks by carefully structuring their network topology in a sentry node architecture. Validator nodes should only connect to full nodes that they trust. These nodes can be run by the same validator or other validators that they know. + +A validator node will typically run in a data center, and most data centers provide direct links to major cloud providers. A validator can use these links to connect to sentry nodes in the cloud. This shifts the burden of denial-of-service from the validator's node directly to its sentry nodes. This may require new sentry nodes to be spun up or activated to mitigate attacks on existing ones. Sentry nodes can be quickly spun up or used to change IP addresses. Because links to the sentry nodes are in private IP space, an internet-based attack cannot directly disturb them. This will ensure a validator's block proposals and votes always make it to the rest of the network. + +> Learn more about sentry-node architecture. + +### For Validator Nodes + +- Edit the `config.toml` file: +```toml +# Comma separated list of nodes to keep persistent connections to. +# Do not add private peers to this list if you don't want them advertised. +persistent_peers = "comma separated list of sentry node addresses" + +# Set to true to enable the peer-exchange reactor. +pex = false +``` + +### For Sentry Nodes + +- Edit the config.toml +```toml +# Comma separated list of nodes to keep persistent connections to. +# Do not add private peers to this list if you don't want them advertised. +persistent_peers = "validator node address" + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers). +private_peer_ids = "nodeid of the validator" +``` + + +

A node address has the following format: nodeid@ip:port. You can get the node id by running seid tendermint show-node-id. The default port is 26656.

+
+ +### Update minimum gas prices +- Open `~/.sei/config/app.toml` +- Modify `minimum-gas-prices` and set the minimum price of gas a validator will accept to validate a transaction and prevent spam. + diff --git a/pages/dev-validators/validator-faq.mdx b/pages/dev-validators/validator-faq.mdx new file mode 100644 index 0000000..6cb36ab --- /dev/null +++ b/pages/dev-validators/validator-faq.mdx @@ -0,0 +1,203 @@ +# Validator FAQ + +## General Concepts + +### What is a validator? + +Validators run full nodes, participate in consensus by broadcasting votes, commit new blocks to the blockchain, and participate in the governance of the blockchain. Validators are able to cast votes on behalf of their delegators. A validator's voting power is weighted according to their total stake. + +### What is a full node? + +A full node is a program that validates the transactions and blocks of a blockchain. Validators must run full nodes. Full nodes require more resources than light nodes, which only process block headers and a small subset of transactions. Running a full node means you are running a non-compromised and up-to-date version of the Sei with low network latency and no downtime. + +It is possible and encouraged for any user to run full nodes even if they do not plan to be validators. + +### What is staking? + +Staking occurs when Sei holders delegate their Sei to a validator. Staking increases a validator's weight, which improves the likelihood of being selected to validate blocks, and in return, delegators get rewarded. + +The Sei blockchain is a public Proof of Stake (PoS) blockchain. This means a validator's weight (total stake) is determined by the amount of staking tokens (Sei) they delegate to themselves plus the Sei bonded to them by external delegators. The weight of a validator determines whether or not they are an active validator and how frequently they can propose a block. Validators with a higher weight will propose blocks more frequently, and in turn, generate more revenue. + +The active validator set is made up of the top validators who hold the most Sei. The barrier for entry into the network is dictated by the value of the lowest stake held in the validator set. For instance, if a validator is created with a higher stake than the bottom validator, then this newly created validator may join the active set. If validators double-sign or are frequently offline, they risk their staked Sei, including Sei delegated by users, by being slashed by the protocol to penalize negligence and misbehavior. + +### What is a delegator? + +Delegators are Sei holders who want to receive staking rewards without the responsibility of running a validator. Through Station, a user can delegate Sei to a validator and in exchange receive a part of a validator's revenue. + +Delegators share the benefits and rewards of staking with their Validator. If a Validator is successful, its delegators will consistently share in the rewards structure. If a Validator is slashed, the delegator’s stake will also be slashed. This is why delegators should perform due diligence on validators before delegating. Delegators can also diversify by spreading their stake over multiple validators. + +Delegators play a critical role in the system, as they are responsible for selecting the validators to which they stake. Being a delegator is not a passive role. Delegators should remain vigilant, actively monitor the actions of their validators, and re-delegate whenever they feel their current validator does not meet their needs. + +## Becoming a Validator + +### How do I become a validator? + +Any participant in the network can signal their intent to become a validator by creating a validator and registering its validator profile. The candidate then broadcasts a create-validator transaction, which contains the following data: + +- **PubKey**: Validator operators can have different accounts for validating and holding liquid funds. The submitted PubKey must be associated with the private key the validator will use to sign prevotes and precommits. +- **Address**: A seivaloper- address which is used to publicly identify your validator. The private key associated with this address is used to bond, unbond, and claim rewards. +- **Name**: (also known as the moniker) +- **Website**: (optional but recommended) +- **Description**: (optional but recommended) +- **Initial commission rate**: The commission rate on block provisions, block rewards, and fees charged to delegators. +- **Maximum commission**: The maximum commission rate which the validator will be allowed to charge. (This cannot be changed) +- **Commission change rate**: The maximum daily increase of the validator's commission. (This cannot be changed) +- **Minimum self-bond amount**: The minimum amount of bonded Sei the validator needs at all times. If the validator's self-bonded stake falls below this limit, its entire staking pool will be unbonded. +- **Initial self-bond amount**: The initial amount of Sei the validator self-bonds. + +Once a validator is created and registered, Sei holders can delegate Sei to them, effectively adding stake to its pool. The total stake of a validator is the total of their self-bonded Sei plus the Sei bonded by external delegators. + +## Validator Keys and States + +### What type of key do I need to use? + +- **Consensus Keypair**: This Consensus Keypair is on the consensus layer and consists of a unique Private Key used to sign block hashes associated with a Public Key seivalconspub. +- This Keypair is generated when a node is created with `seid init`. +- The Private Key can be found in the `priv_validator_key.json` file in the config directory after running `seid init`. +- The Public Key is derived from the Private Key and can be found and seen by running the command `seid tendermint show-validator`. +- Example: `seivalconspub1zcjduc3qcyj09qc03elte23zwshdx92jm6ce88fgc90rtqhjx8v0608qh5ssp0w94c`. + +A validator requires the above key in order to identify itself on the network, sign blocks, and sign staking/operational transactions, such as voting on Governance proposals. It is the validator's sole responsibility to secure these keys and have a contingency backup plan in the event of contingencies. + +### What are the different states a validator can be in? + +After a validator is created with the create-validator transaction, it can be in three states: + +- **bonded**: A validator that is in the active set and participates in consensus. This validator is earning rewards and can be slashed for misbehavior. +- **unbonding**: A validator that is not in the active set and cannot participate in consensus. This validator is not earning rewards but can still be slashed for misbehavior. This is a transition state from bonded to unbonded. If a validator does not send a rebond transaction while in unbonding mode, it will take three weeks for the state transition to complete. +- **unbonded**: A validator that is not in the active set and not signing blocks. Unbonded validators can't be slashed and can't earn any rewards from their operation. It is still possible to delegate Sei to unbonded validators. Undelegating from an unbonded validator is processed immediately. + +All Delegators have the same state as their validator. + +Delegations are not necessarily bonded. Sei can be delegated and bonded, delegated and unbonding, delegated and unbonded, or liquid. + +### What is "self-bonding"? How can I increase my "self-bond"? + +A validator operator's "self-bond" refers to the amount of Sei delegated to itself. You can increase your self-bond by delegating more Sei to your validator account. + +### Is there a faucet? + +Refer to the [faucet page](https://www.docs.sei.io/running-validator/faucet) for details on faucets. + +### Is there a minimum amount of Sei that must be staked to be an active (bonded) validator? + +There is no set minimum. The top validators with the highest total stake (where total stake = self-bonded stake + delegated stake) make up the active validator set. The validator with the lowest stake among the top sets the barrier to entry for the active set. + +### How will delegators choose their validators? + +Delegators are free to choose validators according to their own criteria. This may include: + +- **Amount of self-bonded Sei**: The amount of Sei a validator self-bonds to its staking pool. A validator with a higher amount of self-bonded Sei has more skin in the game, making it more liable for its actions. +- **Amount of delegated Sei**: The total amount of Sei delegated to a validator. A high stake shows that the community trusts this validator; however, this also means that a validator is a bigger target for hackers. Large stakes provide large voting power. This weakens the network. At any given time, if 33% or more of staked Sei becomes inaccessible, the network will halt. Through incentives and education, this weakness can be prevented by delegating away from validators that have too much voting power. Validators sometimes become less attractive as their amount of delegated Sei grows. +- Max voting power per validator is capped at 15%. +- **Commission rate**: The commission applied to rewards by a validator before being distributed to its delegators. +- **Track record**: Delegators can look at the track record of a validator they plan to delegate to. This includes seniority, past votes on proposals, historical average uptime, and how often the node was compromised. + +Validators can also provide a website address for advertisement and to increase transparency. However, building a good reputation in the community will always be most important when attempting to attract delegators. It's also good practice for validators to have their setup audited by a third party. Please note that the Sei team will not approve or conduct any audits. + +## Responsibilities + +### Do validators need to be publicly identified? + +No, they do not. Each delegator will value validators based on their own criteria. Validators are typically advised to register a website address when they nominate themselves so they can advertise their operation as they see fit. + +### What are the responsibilities of a validator? + +A validator must: + +- **Run the correct software versions**: Validators need to make sure that their servers are always online and that their private keys are not compromised. +- **Provide oversight and feedback on the correct deployment of community pool funds**: The Sei protocol includes a governance system for proposals to facilitate the adoption of its currencies. Validators are expected to hold budget executors to provide transparency and to use funds efficiently. +- **Be active members of the community**: Validators should always be up-to-date with the current state of the ecosystem so that they can easily adapt to any change. + +### What does staking imply? + +Think of staked Sei as a safety deposit on a validator's activities. When a validator or a delegator wants to retrieve part or all of their deposit, they send an unbonding transaction. The staked Sei then undergoes a three-week unbonding period, during which it is vulnerable to slashing risks for potential misbehavior committed by the validator before the start of the unbonding process. + +Validators receive block provisions, block rewards, and fee rewards and share these with their delegators. If a validator misbehaves, a certain portion of their total stake is slashed (the severity of the penalty depends on the type of misbehavior). This means that every user that bonds Sei to a slashed validator gets penalized in proportion to their stake. Delegators are incentivized to delegate to validators that function safely. + +### Can a validator run away with a delegator's Sei? + +No. By delegating to a validator, users delegate staking power. The more staking power a validator has, the more weight it has in the consensus and general processes. This does not mean that the validator has custody of its delegators' Sei. + +You should always prioritize validators who you trust when staking for reasons such as slashing. However, you do not need to worry about your delegated funds being stolen as it is impossible for a validator to steal staked funds. + +Although delegated funds cannot be stolen by validators, delegators are still liable if a validator misbehaves. When this happens, a delegator's stake will be partially slashed in proportion to their relative stake. + +### How often will a validator be chosen to propose the next block? Does it go up with the quantity of Sei staked? + +The validator that is selected to mine the next block is called the proposer, or the "leader" in the consensus for the round. Each proposer is selected deterministically, and the frequency of being selected is equal to the relative total stake of the validator (Total stake = self-bonded stake + delegators stake). For example, if the total bonded stake across all validators is 100 Sei, and a validator's total stake is 10 Sei, then this validator will be chosen 10% of the time as the proposer. + +## Incentives + +### What are the incentives to stake? + +Each member of a validator's staking pool earns revenue: + +- **Compute fees (gas)**: To prevent spamming, validators can set minimum gas fees for transactions to be included in their mempool. At the end of every block, compute fees are disbursed to the participating validators proportional to their stake. + +This total revenue is divided among a validator's staking pool according to each validator's weight. The revenue is then divided among delegators in proportion to each delegator's stake. Note that a commission on delegators' revenue is applied by the validator before it is distributed. + +### What is the incentive to run a validator? + +Validators earn more revenue than their delegators through commission. + +### What is a validator's commission? + +The revenue received by a validator's pool is split between a validator and their delegators. A validator can apply a commission on the part of the revenue that goes to its delegators. This commission is set as a percentage. Each validator is free to set its initial commission, maximum daily commission change rate, and maximum commission. The mainnet enforces the parameters that each validator sets. These parameters can only be defined when initially declaring candidacy, and may only be constrained further after being declared. + +### How are block provisions distributed? + +Block provisions are distributed proportionally to each validator relative to their total stake. This means that even though each validator gains rewards with each provision, all validators will still maintain equal weight. + +### How are fees distributed? + +Fees are distributed to validators in the same way as commission: proportionally to each validator's stake relative to the total stake among all validators. A Block proposer can also get a bonus if it includes more than the minimum number of required precommits. + +### Rewards + +When a validator is selected to propose the next block, they must include at least two thirds of the precommits for the previous block in the form of validator signatures. Proposers who include more than two thirds receive a bonus proportional to the amount of additional precommits. This reward ranges from 1%, if the proposer includes two thirds of the precommits, to 5%, if the proposer includes 100% of the precommits. However, if a proposer waits too long, other validators may timeout and move on to the next proposer. This is why validators must find a balance between the amount of time spent waiting in order to receive a high proportion of signatures and the possible risk of losing out on proposing the next block. This feature aims to incentivize non-empty block proposals, improve networking between validators, and mitigate censorship. + +### What are the slashing conditions? + +If a validator misbehaves, their bonded stake, along with their delegators' stake, will be slashed. The severity of punishment depends on the type of violation. The following are the main types of violations that can result in a slashing of funds: + +- **Double-signing**: If someone reports on chain A that a validator signed two blocks at the same height on chain A and chain B, and if chain A and chain B share a common ancestor, then this validator will get slashed on chain A. +- **Unavailability**: If a validator's signature has not been included in the last X blocks, the validator will get slashed by a marginal amount proportional to X. If X is above a certain limit, then the validator will get unbonded. + +Even if a validator does not intentionally misbehave, it can still be slashed if its node crashes, loses connectivity, gets DDoSed, or if its private key is compromised. + +### Are validators required to self-bond Sei? + +No, but self-bonding has benefits. A validator's total stake is made up of their self-bonded stake plus their delegated stake. This means that a validator can compensate for low amounts of self-bonded Sei by attracting more delegators. This is why reputation is very important for validators. + +Although validators are not required to self-bond Sei, all validators should have skin-in-the-game. This can help make a validator more trustworthy. + +In order for delegators to have some guarantee about how much skin-in-the-game their validator has, validators can signal a minimum amount of self-bonded Sei. If a validator's self-bond goes below the limit that it has predefined, this validator and all of its delegators will unbond. + +## Technical Requirements + +### What are the hardware requirements? + +See System Configuration of the full node guide to learn the current minimum operating requirements. + +### What are the software requirements? + +In addition to running a Sei node, validators should develop monitoring, alerting, and management solutions. Validators should expect to perform regular software updates to accommodate upgrades and bug fixes. There will inevitably be issues with the network, and this requires vigilance. + +### What are the personnel requirements? + +A successful validator will require the efforts of multiple highly skilled individuals and continuous attention to validator operations. In comparison, running a validator is considerably more involved than mining bitcoin. + +Running an effective operation is critical to avoiding unexpected unbonding or being slashed. This includes being able to respond to attacks, outages, as well as to maintain security and isolation in your data center. + +### How can validators protect themselves from Denial-of-Service attacks? + +Denial-of-service attacks occur when an attacker sends a flood of internet traffic to a validator's IP address. This can prevent a validator's server from connecting to the internet. + +To do this, an attacker scans the network, attempts to retrieve the IP address of various validator nodes, and disconnects them by flooding them with traffic. + +One way to mitigate these risks is to carefully structure a validator network with a sentry node architecture. + +Validator nodes should only connect to full nodes that they trust. These nodes can be run by the same validator or other validators that they know. A validator node will typically run in a data center and most data centers provide direct links to major cloud providers. A validator can use these links to connect to sentry nodes in the cloud. This shifts the burden of denial-of-service from the validator's node directly to its sentry nodes. This may require new sentry nodes to be spun up or activated to mitigate attacks on existing ones. + +Sentry nodes can be quickly spun up or used to change IP addresses. Because links to the sentry nodes are in private IP space, an internet-based attack cannot directly disturb them. This will ensure a validator's block proposals and votes always make it to the rest of the network. diff --git a/pages/brand-kit.mdx b/pages/general-brand-kit.mdx similarity index 100% rename from pages/brand-kit.mdx rename to pages/general-brand-kit.mdx diff --git a/pages/general-governance.mdx b/pages/general-governance.mdx new file mode 100644 index 0000000..1afd563 --- /dev/null +++ b/pages/general-governance.mdx @@ -0,0 +1,98 @@ +# Governance + +Governance is a vital aspect of blockchains, enabling [stakers](/general-staking) to participate in decision-making processes that shape the future of the network. This section provides an overview of the governance process, how to vote, where to view votes, proposal timelines, voting options, and other essential information. + +## Overview of Governance + +Governance on the Sei blockchain allows stakers to propose, discuss, and vote on changes to the network. This decentralized approach ensures that the community has a say in important decisions, maintaining the network's integrity and alignment with the interests of its participants. + +## Proposal Timelines + +The governance process follows a structured timeline to ensure thorough discussion and consideration of each proposal. + +1. **Proposal Submission**: Any staker can submit a proposal by paying a deposit. +2. **Deposit Period**: The community has a specific period to add their deposits to the proposal. If the minimum deposit threshold is met, the proposal moves to the voting period. +3. **Voting Period**: Once the deposit period ends, the proposal enters the voting period, where stakers can cast their votes. +4. **Result Period**: After the voting period, the results are tallied and the outcome is determined. + +## Voting Options + +When a proposal enters the voting period, stakers have several voting options: + +- **Yes**: Agree with the proposal. +- **No**: Disagree with the proposal. +- **No, with Veto**: Strongly disagree with the proposal and request the deposit to be burned. +- **Abstain**: Choose not to vote either for or against the proposal but still participate in the governance process. + +## Proposal Quorum + +For a proposal to be valid, it must reach a certain quorum, which is a minimum percentage of the total staked tokens that need to participate in the vote. + +## Proposal Types + +Proposals can range from parameter changes and software upgrades to community spend proposals and other governance-related matters. + +### Proposals + +Anyone can create a governance proposal on Sei. After gaining support and feedback from the community, a proposer drafts and submits a proposal alongside an initial deposit. + +The most common proposal types include: + +- `ParameterChangeProposal`: To change the parameters defined in each module. +- `CommunityPoolSpendProposal`: To spend funds in the community pool. +- `TextProposal`: To handle other issues like large directional changes or any decision requiring manual implementation. + +### Voting Process + +Community members vote with their staked Sei. One staked Sei equals one vote. If a user fails to specify a vote, their vote defaults to the validator they are staked to. Validators vote with their entire stake unless specified by delegators. For this reason, it is very important that each delegator votes according to their preferences. + +The following is a basic outline of the governance process: + +1. **Proposal Submission**: A user submits a proposal and a one-week deposit period begins. + +2. **Deposit Period**: Users deposit Sei as collateral to back the proposal. This period ends after the one-week deposit period or a minimum expedited threshold of 7000 Sei is deposited. Deposits protect against spam. If a minimum deposit of 3500 Sei is not met, all deposits are burned and the proposal does not proceed. + +3. **Voting Period**: The one-week vote period begins. The voting options are: + - `Yes`: In favor. + - `No`: Not in favor. + - `NoWithVeto`: Not in favor, and the deposit should be burned. + - `Abstain`: Voter abstains. Abstain votes count toward meeting the quorum. + +4. **Tallying Votes**: The votes are tallied. Proposals pass if they meet three conditions: + - `Quorum` is met: at least 30% of all staked Sei must vote. + - The total number of `NoWithVeto` votes is less than 33.4% of the total vote. + - `Threshold` is met: the number of `Yes` votes is greater than the number of `No` and `NoWithVeto` votes. `Abstain` votes are excluded from the `Threshold` tally. + +5. **Result Period**: If the previous conditions are not met, the proposal is rejected. + +6. **Implementation**: Accepted proposals get put into effect. Once accepted, the changes described in a governance proposal are automatically put into effect by the proposal handler. Generic proposals, such as a passed `TextProposal`, must be reviewed by the Sei team and community and must be manually implemented. + +7. **Deposit Refund/Burn**: Deposits get refunded or burned based on the voting outcome. + +### Deposits + +Deposits protect against unnecessary proposals and spam. Users can veto any proposal they deem to be spam by voting `NoWithVeto`. + +If a proposal fails to meet the minimum deposit amount within the deposit period, the proposal will not enter the voting period, and the deposit will be burned. + +Proposals that meet the minimum deposit requirement and make it to the voting period will be refunded under any vote outcome except `NoWithVeto`. If the number of `NoWithVeto` votes is above 33.4% of the total vote, the deposit will be burned. Deposits will be refunded under any other condition. + +## Additional Information + +Governance in the Sei blockchain empowers the community to actively participate in the network's development and evolution. By understanding the governance process and engaging in voting, token holders can influence the direction of the network and ensure it aligns with the community's vision and values. + +--- + +### Common Questions + +**What happens if my proposal is rejected?** +If your proposal is rejected, and it didn't meet the minimum deposit threshold, the deposit is burned. Otherwise, the deposit is returned to the proposer. + +**Can I change my vote during the voting period?** +No, once you cast your vote, it is final and cannot be changed. + +**What is the minimum deposit required for a proposal?** +The minimum deposit required is 3500 Sei, but proposals can have higher thresholds for expedited processing. + +**How do I view active proposals and vote results?** +Active proposals and vote results can be viewed on the [Sei App](https://app.sei.io/staking) or by querying the blockchain directly. diff --git a/pages/overview.mdx b/pages/general-overview.mdx similarity index 100% rename from pages/overview.mdx rename to pages/general-overview.mdx diff --git a/pages/general-staking.mdx b/pages/general-staking.mdx new file mode 100644 index 0000000..4ef90f2 --- /dev/null +++ b/pages/general-staking.mdx @@ -0,0 +1,71 @@ +# Staking + +Staking is a fundamental aspect of the Sei blockchain, enabling network security and consensus through a delegated proof-of-stake (dPoS) mechanism. By participating in staking, both validators and delegators play a critical role in maintaining and securing the network, ensuring its long-term stability, performance, and success. PoS chains rely on staked economic value rather than computational power, leading to a more energy-efficient and scalable system. Engaging in staking allows developers and users to contribute to the health and growth of the Sei ecosystem and participate in [governance](/general-governance) decisions by voting on proposals. + +In a dPoS system, token holders secure the network by delegating their tokens to validators. Validators produce new blocks and validate transactions. In return for their support, delegators earn a portion of the staking rewards. A validator’s weight is based on the number of tokens delegated to them plus their own stake. + +The Sei protocol incentivizes validators and delegators with staking rewards from gas fees and inflation rewards from newly minted Sei. New Sei is minted and released to validators and delegators at a fixed percentage per year. At the end of every block, fees and inflation rewards are distributed to validators and their delegators proportionally to their staked amount. Validators typically keep a portion of rewards as commission and distribute the rest to delegators. Users can view a validator’s commission rate on the Sei App or by querying the validator information on-chain. + +## How to Stake + +Staking on Sei can be done through the Sei App, via the `seid` CLI, or even through REST or RPC calls. + +- **Sei App**: [Staking](https://app.sei.io/staking) +- **seid CLI**: `seid tx staking [command] [flags]` +- **REST/RPC**: `GET/POST /staking/*` + +## Key Concepts + +### Delegation + +Delegating tokens to a validator allows you to earn a portion of the staking rewards. By delegating, you add to the validator’s total stake, which helps secure the network. + +### Delegators + +Delegators are users who stake their Sei tokens to a validator, contributing to the validator’s total stake. Delegators earn a portion of the transaction fees as staking rewards. Staked Sei remains under the control of the delegator and cannot be traded freely during the staking period. + +### Un-delegation + +Un-delegation is the process of withdrawing your staked tokens. This involves a 21-day un-bonding period during which the tokens are not earning rewards and cannot be transferred. After the un-bonding period, the tokens are returned to your wallet and are available for transactions. + +### Re-delegation + +Re-delegation allows you to move staked tokens from one validator to another without undergoing the un-bonding period. When re-delegating, the tokens are instantly moved, but the new validator is barred from further re-delegations for 21 days to ensure stability and prevent abuse. Each account can re-delegate a maximum of 7 times simultaneously, with a re-delegation not considered complete until the 21-day period is up. + +### Bonding + +Bonding is the process of committing your Sei tokens to a validator. This can be done through delegation. The tokens are locked and contribute to the validator’s stake, starting to earn rewards immediately. + +### Un-Bonding + +Delegators can un-bond or un-stake their Sei tokens, initiating a 21-day period during which the tokens do not earn rewards and cannot be transferred. After this period, the tokens return to the delegator’s wallet and become available for transactions. Users can re-delegate to another validator instantly without waiting for the un-bonding period to end. + +### Slashing + +Running a validator is a big responsibility. Validators must meet strict standards and constantly monitor and participate in the consensus process. Slashing is the penalty for misbehaving validators. When a validator gets slashed, they lose a portion of their stake as well as a portion of their delegator's stake. Slashed validators also get jailed, or excluded, from consensus for a period. + +Slashing occurs under the following conditions: + +- **Double Signing**: Signing two different blocks with the same chain ID at the same height. +- **Downtime**: Being unresponsive or unreachable for a period. +- **Missed Votes**: Missing votes in consensus. + +Validators monitor each other and can submit evidence of misbehavior. Once discovered, the misbehaving validator will have a portion of their funds slashed and will be jailed. + +## Common Questions + +### What happens if my validator gets slashed? + +If your validator gets slashed, a portion of both the validator’s and your staked tokens will be forfeited. This penalty encourages the selection of reliable validators and active monitoring of their performance. + +### Can I lose my staked tokens? + +Yes, if the validator you have staked with gets slashed for misbehavior, you will lose a portion of your staked tokens. + +### How are staking rewards calculated? + +Staking rewards are calculated based on the total amount of Sei staked and the validator’s performance. Rewards are distributed proportionally to the amount staked by each delegator. + +### Can I change my validator without un-bonding? + +Yes, you can use the re-delegation feature to move your stake from one validator to another without waiting for the un-bonding period to end. diff --git a/pages/submit-feedback.mdx b/pages/general-submit-feedback.mdx similarity index 100% rename from pages/submit-feedback.mdx rename to pages/general-submit-feedback.mdx diff --git a/pages/getting-started.mdx b/pages/getting-started.mdx deleted file mode 100644 index 414ff60..0000000 --- a/pages/getting-started.mdx +++ /dev/null @@ -1,12 +0,0 @@ -import { HelpCallout } from "../components"; - -# Getting Started - -Dive right into Sei to start building or set up your tooling. - -- [Setup Local Environment](/quickstart/installing-seid): Install the Seid CLI to set up your local development environment. -- [Deploying Tokens & Smart Contracts](/quickstart/introduction): Learn how to build and deploy your first token and smart contract on Sei. -- [Tools & Resources](/tools-and-resources): Access a list of development tools and public endpoints for testing. -- [Running a Node](/running-a-sei-node): Discover what it takes to operate a node on Sei and help secure the network. - - diff --git a/pages/index.mdx b/pages/index.mdx index 0eb21a5..fc5ce0f 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -6,11 +6,11 @@ import { GanttChartSquare, Wallet, Wrench } from "lucide-react"; Sei is the first parallelized EVM. This allows Sei to get the best of Solana and Ethereum - a hyper optimized execution layer that benefits from the tooling and mindshare around the EVM. - } /> - } /> + } /> + } /> } /> diff --git a/pages/interoperability/_meta.json b/pages/interoperability/_meta.json deleted file mode 100644 index 7aa54b1..0000000 --- a/pages/interoperability/_meta.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "overview": "Overview", - "precompiles": "Precompiled Contracts", - "pointer-contracts": "Pointer Contracts" -} diff --git a/pages/interoperability/precompiles/_meta.json b/pages/interoperability/precompiles/_meta.json deleted file mode 100644 index 4c46f6c..0000000 --- a/pages/interoperability/precompiles/_meta.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "cosmwasm": "CosmWasm", - "staking": "Staking", - "governance": "Governance", - "bank": "Bank", - "distribution": "Distribution", - "addr": "Addresses", - "example-usage": "Example Usage" -} diff --git a/pages/oracles/_meta.json b/pages/oracles/_meta.json deleted file mode 100644 index 341f64c..0000000 --- a/pages/oracles/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "introduction": "Introduction", - "running-an-oracle-price-feeder": "Running an Oracle Price Feeder" -} diff --git a/pages/quickstart/_meta.json b/pages/quickstart/_meta.json deleted file mode 100644 index bad730d..0000000 --- a/pages/quickstart/_meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "introduction": "Introduction", - "installing-seid": "Installing Seid", - "tokenfactory-tutorial": "Token Factory Tutorial", - "nft-contract-tutorial": "NFT Contract Tutorial", - "building-a-frontend": "Building a Frontend" -} diff --git a/pages/quickstart/introduction.mdx b/pages/quickstart/introduction.mdx deleted file mode 100644 index bbcc185..0000000 --- a/pages/quickstart/introduction.mdx +++ /dev/null @@ -1,40 +0,0 @@ -import { Callout, Cards, Card } from "nextra/components"; -import { HelpCallout } from "../../components"; - -# Introduction - -In this section, we'll be going over how to deploy tokens and smart contracts on Sei. More specifically, we'll be deploying a token using the tokenfactory module and an NFT smart contract. - -## Token Factory - -The `tokenfactory` module provides a standardized mechanism for creating fungible tokens, which are interchangeable and identical. It's an ideal solution for developers looking to deploy standard token types without delving deep into the complexities of smart contract coding. - - - For more information on Token Factory and other token standards, visit [Token - Standards](/token-standards). - - -## Smart Contracts - -Smart contracts are self-executing contracts with the terms of the agreement directly written into code. They are the foundation for creating a wide range of decentralized applications, from simple tokens to complex decentralized finance (DeFi) protocols. - -## Next Steps - -Ready to start building? Let's get started! - - - - - - - - diff --git a/pages/token-standards.mdx b/pages/token-standards.mdx deleted file mode 100644 index 5d59d7a..0000000 --- a/pages/token-standards.mdx +++ /dev/null @@ -1,39 +0,0 @@ -import { Tabs } from "nextra/components"; - -# Token Standards - -There are numerous token standards across various blockchains. These standards help ensure smart contracts remain -composable, so for instance when a new project issues a token, that it remains compatible with existing decentralized -exchanges. - -## Sei Token Standards - -Here are some of the most popular token standards on Sei: - - - - -- **ERC20**: A standard for fungible tokens on Ethereum, allowing for the creation of interchangeable tokens used for digital currencies, voting rights, or as staking tokens. -- **ERC721**: Defines a standard for non-fungible tokens (NFTs) on Ethereum, each representing a unique asset or item. Widely used for digital collectibles and artwork, allowing for the verification of ownership and uniqueness. - - - - -- **TokenFactory**: This offers a standardized mechanism for creating fungible tokens, which are interchangeable and - identical. These tokens can embody various digital assets like voting rights, virtual currencies, or staking tokens. - They are also native sdk.Coins and come with a variety of native functionality -- **CW721**: This contract provides a standard approach for handling non-fungible tokens (NFTs). These are unique and are - not interchangeable with any other token. Examples could include ownership rights to a piece of artwork, or the - licensing for a specific song. -- **CW20**: Although not recommended, this contract provides another approach for handling fungible tokens. - Similar to ERC-20 standard, contracts can implement this specification. CW20 contracts provide a standardized framework - for the issuance, transfer, and tracking of fungible tokens. - -TokenFactory is **strongly recommended** over CW20 for several reasons including: - -- performance since less gas is required to interact with it -- security since it shares the same security model as the base blockchain -- standardization since it directly integrates with the native bank module - - - diff --git a/pages/ecosystem-apps.mdx b/pages/user-ecosystem-apps.mdx similarity index 100% rename from pages/ecosystem-apps.mdx rename to pages/user-ecosystem-apps.mdx diff --git a/yarn.lock b/yarn.lock index f920039..a05d094 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,6 +47,13 @@ stream-browserify "^3.0.0" util "^0.12.4" +"@emnapi/runtime@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.2.0.tgz#71d018546c3a91f3b51106530edbc056b9f2f2e3" + integrity sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== + dependencies: + tslib "^2.4.0" + "@emotion/hash@^0.9.0": version "0.9.1" resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" @@ -77,6 +84,119 @@ "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" +"@img/sharp-darwin-arm64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz#a1cf4a7febece334f16e0328b9689f05797d7aec" + integrity sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.2" + +"@img/sharp-darwin-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz#f77be2d7c3609d3e77cd337b199a772e07b87bd2" + integrity sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.2" + +"@img/sharp-libvips-darwin-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz#b69f49fecbe9572378675769b189410721b0fa53" + integrity sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA== + +"@img/sharp-libvips-darwin-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz#5665da7360d8e5ed7bee314491c8fe736b6a3c39" + integrity sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw== + +"@img/sharp-libvips-linux-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz#8a05e5e9e9b760ff46561e32f19bd5e035fa881c" + integrity sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw== + +"@img/sharp-libvips-linux-arm@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz#0fd33b9bf3221948ce0ca7a5a725942626577a03" + integrity sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw== + +"@img/sharp-libvips-linux-s390x@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz#4b89150ec91b256ee2cbb5bb125321bf029a4770" + integrity sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog== + +"@img/sharp-libvips-linux-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz#947ccc22ca5bc8c8cfe921b39a5fdaebc5e39f3f" + integrity sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz#821d58ce774f0f8bed065b69913a62f65d512f2f" + integrity sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ== + +"@img/sharp-libvips-linuxmusl-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz#4309474bd8b728a61af0b3b4fad0c476b5f3ccbe" + integrity sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw== + +"@img/sharp-linux-arm64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz#bd390113e256487041411b988ded13a26cfc5f95" + integrity sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.2" + +"@img/sharp-linux-arm@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz#14ecc81f38f75fb4cd7571bc83311746d6745fca" + integrity sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.2" + +"@img/sharp-linux-s390x@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz#119e8081e2c6741b5ac908fe02244e4c559e525f" + integrity sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.2" + +"@img/sharp-linux-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz#21d4c137b8da9a313b069ff5c920ded709f853d7" + integrity sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.2" + +"@img/sharp-linuxmusl-arm64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz#f3fde68fd67b85a32da6f1155818c3b58b8e7ae0" + integrity sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" + +"@img/sharp-linuxmusl-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz#44373724aecd7b69900e0578228144e181db7892" + integrity sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.2" + +"@img/sharp-wasm32@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz#88e3f18d7e7cd8cfe1af98e9963db4d7b6491435" + integrity sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ== + dependencies: + "@emnapi/runtime" "^1.1.1" + +"@img/sharp-win32-ia32@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz#b1c772dd2952e983980b1eb85808fa8129484d46" + integrity sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw== + +"@img/sharp-win32-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz#106f911134035b4157ec92a0c154a6b6f88fa4c1" + integrity sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" @@ -89,7 +209,7 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.2": version "0.3.5" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== @@ -108,20 +228,12 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.24": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -141,7 +253,7 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@mdx-js/loader@^3.0.1", "@mdx-js/loader@>=0.15.0": +"@mdx-js/loader@^3.0.1": version "3.0.1" resolved "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.0.1.tgz" integrity sha512-YbYUt7YyEOdFxhyuCWmLKf5vKhID/hJAojEUnheJk4D8iYVLFQw+BAoBWru/dHGch1omtmZOPstsmKPyBF68Tw== @@ -201,7 +313,7 @@ unist-util-visit "^5.0.0" vfile "^6.0.0" -"@mdx-js/react@^2.2.1", "@mdx-js/react@^2.3.0", "@mdx-js/react@>=0.15.0": +"@mdx-js/react@^2.2.1", "@mdx-js/react@^2.3.0": version "2.3.0" resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz" integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== @@ -209,7 +321,7 @@ "@types/mdx" "^2.0.0" "@types/react" ">=16" -"@metamask/safe-event-emitter@^2.0.0", "@metamask/safe-event-emitter@2.0.0": +"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== @@ -293,6 +405,41 @@ "@motionone/dom" "^10.16.4" tslib "^2.3.1" +"@napi-rs/simple-git-android-arm-eabi@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.16.tgz#36b752f84a7e75a9dada3d8b307817f0b015a57d" + integrity sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw== + +"@napi-rs/simple-git-android-arm64@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.16.tgz#f84d9e2fdae91bb810b55ffc30a42ce5fe020c76" + integrity sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ== + +"@napi-rs/simple-git-darwin-arm64@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.16.tgz#8d995a920146c320bf13b32d1b1654f44beaa16b" + integrity sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g== + +"@napi-rs/simple-git-darwin-x64@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.16.tgz#7cc7155392c62f885d248af5f720e108d0aad2b5" + integrity sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA== + +"@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.16.tgz#d5135543d372e0571d7c19928e75751eb407d7dd" + integrity sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w== + +"@napi-rs/simple-git-linux-arm64-gnu@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.16.tgz#4e293005b2fd62d1eb399b50e53d983378c19fb7" + integrity sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw== + +"@napi-rs/simple-git-linux-arm64-musl@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.16.tgz#679edd2c6d88de6aa35993401722ade04595869b" + integrity sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg== + "@napi-rs/simple-git-linux-x64-gnu@0.1.16": version "0.1.16" resolved "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.16.tgz" @@ -303,6 +450,16 @@ resolved "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.16.tgz" integrity sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g== +"@napi-rs/simple-git-win32-arm64-msvc@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.16.tgz#e6b220574421695f4c05be4e065b1fd46ffb7007" + integrity sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw== + +"@napi-rs/simple-git-win32-x64-msvc@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.16.tgz#4ec44d57fc2c069544ffb923a2871d81d5db7cfc" + integrity sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg== + "@napi-rs/simple-git@^0.1.9": version "0.1.16" resolved "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.16.tgz" @@ -332,6 +489,26 @@ dependencies: source-map "^0.7.0" +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== + +"@next/swc-darwin-x64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" + integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== + +"@next/swc-linux-arm64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" + integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== + +"@next/swc-linux-arm64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" + integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== + "@next/swc-linux-x64-gnu@14.2.3": version "14.2.3" resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz" @@ -342,6 +519,28 @@ resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz" integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== +"@next/swc-win32-arm64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" + integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== + +"@next/swc-win32-ia32-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" + integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== + +"@next/swc-win32-x64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== + +"@noble/curves@1.2.0", "@noble/curves@~1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + "@noble/curves@^1.4.0": version "1.4.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz" @@ -349,33 +548,21 @@ dependencies: "@noble/hashes" "1.4.0" -"@noble/curves@~1.2.0", "@noble/curves@1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" - integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== - dependencies: - "@noble/hashes" "1.3.2" +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@^1.3.3", "@noble/hashes@1.4.0": +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.3": version "1.4.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@noble/hashes@~1.3.0": - version "1.3.3" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" - integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== - -"@noble/hashes@~1.3.2": +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": version "1.3.3" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== -"@noble/hashes@1.3.2": - version "1.3.2" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -384,7 +571,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -397,6 +584,41 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + "@parcel/watcher-linux-x64-glibc@2.4.1": version "2.4.1" resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz" @@ -416,6 +638,21 @@ micromatch "^4.0.5" napi-wasm "^1.1.0" +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + "@parcel/watcher@^2.4.1": version "2.4.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz" @@ -558,14 +795,6 @@ resolved "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz" integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== -"@stablelib/chacha@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz" - integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - "@stablelib/chacha20poly1305@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz" @@ -578,6 +807,14 @@ "@stablelib/poly1305" "^1.0.1" "@stablelib/wipe" "^1.0.1" +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + "@stablelib/constant-time@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz" @@ -714,7 +951,7 @@ dependencies: "@tanstack/query-persist-client-core" "4.36.1" -"@tanstack/react-query@^4.28.0", "@tanstack/react-query@^4.36.1": +"@tanstack/react-query@^4.28.0": version "4.36.1" resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.36.1.tgz" integrity sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw== @@ -788,22 +1025,6 @@ dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.7" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.56.10" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz" - integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - "@types/estree-jsx@^1.0.0": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" @@ -811,7 +1032,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -832,6 +1053,8 @@ "@types/hoist-non-react-statics@*": version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -841,11 +1064,6 @@ resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz" integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== -"@types/json-schema@*", "@types/json-schema@^7.0.8": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - "@types/katex@^0.16.0": version "0.16.7" resolved "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz" @@ -890,8 +1108,10 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@>=16", "@types/react@>=16.8": +"@types/react@*", "@types/react@>=16": version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -937,7 +1157,7 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vanilla-extract/css@^1.0.0", "@vanilla-extract/css@1.14.0": +"@vanilla-extract/css@1.14.0": version "1.14.0" resolved "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.0.tgz" integrity sha512-rYfm7JciWZ8PFzBM/HDiE2GLnKI3xJ6/vdmVJ5BSgcCZ5CxRlM9Cjqclni9lGzF3eMOijnUhCd/KV8TOzyzbMA== @@ -1090,7 +1310,7 @@ cross-fetch "^3.1.4" tslib "1.14.1" -"@walletconnect/jsonrpc-provider@^1.0.13", "@walletconnect/jsonrpc-provider@^1.0.6", "@walletconnect/jsonrpc-provider@1.0.13": +"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.13", "@walletconnect/jsonrpc-provider@^1.0.6": version "1.0.13" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz" integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== @@ -1099,7 +1319,7 @@ "@walletconnect/safe-json" "^1.0.2" tslib "1.14.1" -"@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3", "@walletconnect/jsonrpc-types@1.0.3": +"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz" integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== @@ -1107,7 +1327,7 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8", "@walletconnect/jsonrpc-utils@1.0.8": +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": version "1.0.8" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz" integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== @@ -1220,7 +1440,7 @@ motion "10.16.2" qrcode "1.5.3" -"@walletconnect/modal@^2.6.2", "@walletconnect/modal@2.6.2": +"@walletconnect/modal@2.6.2", "@walletconnect/modal@^2.6.2": version "2.6.2" resolved "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz" integrity sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA== @@ -1348,136 +1568,13 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - -"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" abitype@0.8.7: version "0.8.7" @@ -1489,17 +1586,12 @@ abitype@0.9.8: resolved "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz" integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - acorn-jsx@^5.0.0: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.0, acorn@^8.11.3, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.0.0, acorn@^8.11.3: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -1516,21 +1608,6 @@ agentkeepalive@^4.5.0: dependencies: humanize-ms "^1.2.1" -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.12.5, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -1583,16 +1660,16 @@ arch@^2.1.0: resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - arg@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz" integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -1715,7 +1792,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.10, browserslist@^4.23.0, "browserslist@>= 4.21.0": +browserslist@^4.23.0: version "4.23.0" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -1732,12 +1809,7 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^6.0.3, buffer@~6.0.3, buffer@6.0.3: +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -1745,6 +1817,13 @@ buffer@^6.0.3, buffer@~6.0.3, buffer@6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + busboy@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" @@ -1788,14 +1867,6 @@ ccount@^2.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz" @@ -1805,6 +1876,14 @@ chalk@2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" @@ -1840,11 +1919,6 @@ chokidar@^3.5.3, chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - citty@^0.1.5, citty@^0.1.6: version "0.1.6" resolved "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz" @@ -1852,11 +1926,19 @@ citty@^0.1.5, citty@^0.1.6: dependencies: consola "^3.2.3" -client-only@^0.0.1, client-only@0.0.1: +client-only@0.0.1, client-only@^0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clipboardy@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz" + integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + clipboardy@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz" @@ -1866,14 +1948,6 @@ clipboardy@^4.0.0: is-wsl "^3.1.0" is64bit "^2.0.0" -clipboardy@1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz" - integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== - dependencies: - arch "^2.1.0" - execa "^0.8.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" @@ -1883,6 +1957,11 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +clsx@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + clsx@^1.1.0: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" @@ -1893,11 +1972,6 @@ clsx@^2.0.0: resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== -clsx@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== - collapse-white-space@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz" @@ -1917,16 +1991,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^1.9.0: version "1.9.1" resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" @@ -1948,10 +2022,10 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@7: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^2.20.3: version "2.20.3" @@ -1968,11 +2042,6 @@ commander@^8.3.0: resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@7: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - compute-scroll-into-view@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz" @@ -2061,7 +2130,7 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2, csstype@^3.0.7, csstype@3.1.3: +csstype@3.1.3, csstype@^3.0.2, csstype@^3.0.7: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -2073,18 +2142,11 @@ cytoscape-cose-bilkent@^4.1.0: dependencies: cose-base "^1.0.0" -cytoscape@^3.2.0, cytoscape@^3.28.1: +cytoscape@^3.28.1: version "3.29.2" resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.29.2.tgz" integrity sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ== -d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: - version "3.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" - integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== - dependencies: - internmap "1 - 2" - "d3-array@1 - 2": version "2.12.1" resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" @@ -2092,6 +2154,13 @@ d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", dependencies: internmap "^1.0.0" +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + d3-axis@3: version "3.0.0" resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" @@ -2201,16 +2270,16 @@ d3-hierarchy@3: dependencies: d3-color "1 - 3" -d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - d3-path@1: version "1.0.9" resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + d3-polygon@3: version "3.0.1" resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" @@ -2258,13 +2327,6 @@ d3-scale@4: resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -d3-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - d3-shape@3: version "3.2.0" resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" @@ -2272,6 +2334,13 @@ d3-shape@3: dependencies: d3-path "^3.1.0" +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" @@ -2432,7 +2501,7 @@ destr@^2.0.3: resolved "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz" integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== -detect-browser@^5.3.0, detect-browser@5.3.0: +detect-browser@5.3.0, detect-browser@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== @@ -2531,14 +2600,6 @@ end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^5.16.0: - version "5.16.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz" - integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" @@ -2556,11 +2617,6 @@ es-errors@^1.3.0: resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-module-lexer@^1.2.1: - version "1.5.3" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz" - integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== - es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" @@ -2588,36 +2644,11 @@ escape-string-regexp@^5.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - estree-util-attach-comments@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz" @@ -2738,13 +2769,6 @@ eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-rpc-errors@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz" - integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== - dependencies: - fast-safe-stringify "^2.0.6" - eth-rpc-errors@4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz" @@ -2752,12 +2776,19 @@ eth-rpc-errors@4.0.2: dependencies: fast-safe-stringify "^2.0.6" +eth-rpc-errors@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0, events@^3.3.0: +events@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -2807,11 +2838,6 @@ eyes@^0.1.8: resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" @@ -2823,11 +2849,6 @@ fast-glob@^3.3.0: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - fast-redact@^3.0.0: version "3.5.0" resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz" @@ -2905,6 +2926,11 @@ fraction.js@^4.3.7: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -2980,11 +3006,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@^10.3.10: version "10.3.12" resolved "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz" @@ -3003,7 +3024,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.2.11: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3287,6 +3308,8 @@ hey-listen@^1.0.8: hoist-non-react-statics@^3.3.0: version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" @@ -3344,16 +3367,16 @@ inline-style-parser@0.2.3: resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz" integrity sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g== -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== - "internmap@1 - 2": version "2.0.3" resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + intersection-observer@^0.12.2: version "0.12.2" resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz" @@ -3523,7 +3546,7 @@ is-typed-array@^1.1.3: dependencies: which-typed-array "^1.1.14" -is-typedarray@^1.0.0, is-typedarray@1.0.0: +is-typedarray@1.0.0, is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -3582,25 +3605,16 @@ jayson@^4.1.0: "@types/connect" "^3.4.33" "@types/node" "^12.12.54" "@types/ws" "^7.4.4" + JSONStream "^1.3.5" commander "^2.20.3" delay "^5.0.0" es6-promisify "^5.0.0" eyes "^0.1.8" isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" - JSONStream "^1.3.5" uuid "^8.3.2" ws "^7.4.5" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jiti@^1.21.0: version "1.21.0" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" @@ -3626,12 +3640,7 @@ js-yaml@^4.0.0: dependencies: argparse "^2.0.1" -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-rpc-engine@^6.1.0, json-rpc-engine@6.1.0: +json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz" integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== @@ -3644,11 +3653,6 @@ json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: resolved "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz" integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" @@ -3664,14 +3668,6 @@ jsonparse@^1.2.0: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - katex@^0.16.0, katex@^0.16.9: version "0.16.10" resolved "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz" @@ -3777,11 +3773,6 @@ lit@2.8.0: lit-element "^3.3.0" lit-html "^2.8.0" -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" @@ -4897,18 +4888,6 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mime@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" @@ -4968,16 +4947,16 @@ mri@^1.1.0, mri@^1.2.0: resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@^2.0.0: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multiformats@^9.4.2: version "9.9.0" resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" @@ -5002,11 +4981,6 @@ napi-wasm@^1.1.0: resolved "https://registry.npmjs.org/napi-wasm/-/napi-wasm-1.1.0.tgz" integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - next-compose-plugins@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/next-compose-plugins/-/next-compose-plugins-2.2.1.tgz" @@ -5032,7 +5006,7 @@ next-themes@^0.2.1: resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz" integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== -next@*, next@^14.2.3, "next@^8.1.1-canary.54 || >=9.0.0", next@>=9.5.3: +next@^14.2.3: version "14.2.3" resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== @@ -5055,9 +5029,9 @@ next@*, next@^14.2.3, "next@^8.1.1-canary.54 || >=9.0.0", next@>=9.5.3: "@next/swc-win32-ia32-msvc" "14.2.3" "@next/swc-win32-x64-msvc" "14.2.3" -nextra-theme-docs@^2.13.2: +nextra-theme-docs@^2.13.4: version "2.13.4" - resolved "https://registry.npmjs.org/nextra-theme-docs/-/nextra-theme-docs-2.13.4.tgz" + resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.13.4.tgz#821795e149537413f459ae4b520eba1a195e5e07" integrity sha512-2XOoMfwBCTYBt8ds4ZHftt9Wyf2XsykiNo02eir/XEYB+sGeUoE77kzqfidjEOKCSzOHYbK9BDMcg2+B/2vYRw== dependencies: "@headlessui/react" "^1.7.17" @@ -5074,9 +5048,9 @@ nextra-theme-docs@^2.13.2: scroll-into-view-if-needed "^3.1.0" zod "^3.22.3" -nextra@^2.13.2, nextra@2.13.4: +nextra@^2.13.4: version "2.13.4" - resolved "https://registry.npmjs.org/nextra/-/nextra-2.13.4.tgz" + resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.13.4.tgz#49e9f558735d86292cd8578b5a69f6d926bc2a14" integrity sha512-7of2rSBxuUa3+lbMmZwG9cqgftcoNOVQLTT6Rxf3EhBR9t1EI7b43dted8YoqSNaigdE3j1CoyNkX8N/ZzlEpw== dependencies: "@headlessui/react" "^1.7.17" @@ -5133,8 +5107,10 @@ node-forge@^1.3.1: resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp-build@^4.2.0: +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== node-releases@^2.0.14: version "2.0.14" @@ -5469,15 +5445,6 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.35, postcss@>=8.0.9, postcss@8.4.38: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -5487,6 +5454,15 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@8.4.38, postcss@^8.4.23, postcss@^8.4.35: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + preact@^10.12.0, preact@^10.5.9: version "10.21.0" resolved "https://registry.npmjs.org/preact/-/preact-10.21.0.tgz" @@ -5517,12 +5493,7 @@ pseudomap@^1.0.2: resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qrcode@^1.5.1, qrcode@1.5.3: +qrcode@1.5.3, qrcode@^1.5.1: version "1.5.3" resolved "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz" integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== @@ -5539,16 +5510,6 @@ qs@^6.10.3: dependencies: side-channel "^1.0.6" -query-string@^6.13.5: - version "6.14.1" - resolved "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - query-string@7.1.3: version "7.1.3" resolved "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz" @@ -5559,6 +5520,16 @@ query-string@7.1.3: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +query-string@^6.13.5: + version "6.14.1" + resolved "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -5581,7 +5552,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -react-dom@*, "react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18.2.0, react-dom@^18.3.1, "react-dom@>= 16.8.0", react-dom@>=16.0.0, react-dom@>=16.13.1, "react-dom@>=16.x <=18.x", react-dom@>=17: +react-dom@^18.3.1: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -5591,6 +5562,8 @@ react-dom@*, "react-dom@^16 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18 react-is@^16.7.0: version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-remove-scroll-bar@^2.3.4: version "2.3.6" @@ -5620,7 +5593,7 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" -react@*, "react@^16 || ^17 || ^18", "react@^16.5.1 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, react@^18.3.1, "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16, react@>=16.0.0, react@>=16.13.1, react@>=16.8, "react@>=16.x <=18.x", react@>=17, react@>=17.0.0: +react@^18.3.1: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -5877,15 +5850,6 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - scroll-into-view-if-needed@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz" @@ -5908,13 +5872,6 @@ semver@^7.3.8, semver@^7.6.0: dependencies: lru-cache "^6.0.0" -serialize-javascript@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -5945,17 +5902,17 @@ shallowequal@1.1.0: resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -sharp@^0.33.2: - version "0.33.3" - resolved "https://registry.npmjs.org/sharp/-/sharp-0.33.3.tgz" - integrity sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A== +sharp@^0.33.4: + version "0.33.4" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.4.tgz#b88e6e843e095c6ab5e1a0c59c4885e580cd8405" + integrity sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q== dependencies: color "^4.2.3" detect-libc "^2.0.3" semver "^7.6.0" optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.3" - "@img/sharp-darwin-x64" "0.33.3" + "@img/sharp-darwin-arm64" "0.33.4" + "@img/sharp-darwin-x64" "0.33.4" "@img/sharp-libvips-darwin-arm64" "1.0.2" "@img/sharp-libvips-darwin-x64" "1.0.2" "@img/sharp-libvips-linux-arm" "1.0.2" @@ -5964,15 +5921,15 @@ sharp@^0.33.2: "@img/sharp-libvips-linux-x64" "1.0.2" "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" "@img/sharp-libvips-linuxmusl-x64" "1.0.2" - "@img/sharp-linux-arm" "0.33.3" - "@img/sharp-linux-arm64" "0.33.3" - "@img/sharp-linux-s390x" "0.33.3" - "@img/sharp-linux-x64" "0.33.3" - "@img/sharp-linuxmusl-arm64" "0.33.3" - "@img/sharp-linuxmusl-x64" "0.33.3" - "@img/sharp-wasm32" "0.33.3" - "@img/sharp-win32-ia32" "0.33.3" - "@img/sharp-win32-x64" "0.33.3" + "@img/sharp-linux-arm" "0.33.4" + "@img/sharp-linux-arm64" "0.33.4" + "@img/sharp-linux-s390x" "0.33.4" + "@img/sharp-linux-x64" "0.33.4" + "@img/sharp-linuxmusl-arm64" "0.33.4" + "@img/sharp-linuxmusl-x64" "0.33.4" + "@img/sharp-wasm32" "0.33.4" + "@img/sharp-win32-ia32" "0.33.4" + "@img/sharp-win32-x64" "0.33.4" shebang-command@^1.2.0: version "1.2.0" @@ -5998,7 +5955,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shiki@*, shiki@^0.14.3: +shiki@^0.14.3: version "0.14.7" resolved "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz" integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== @@ -6059,19 +6016,6 @@ source-map-js@^1.0.2, source-map-js@^1.2.0: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.7.0: version "0.7.4" resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" @@ -6125,23 +6069,7 @@ strict-uri-encode@^2.0.0: resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6159,6 +6087,13 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" @@ -6167,14 +6102,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6239,7 +6167,7 @@ styled-jsx@5.1.1: dependencies: client-only "0.0.1" -stylis@^4.1.3, stylis@4.3.2: +stylis@4.3.2, stylis@^4.1.3: version "4.3.2" resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz" integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== @@ -6281,13 +6209,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -6333,32 +6254,6 @@ tailwindcss@^3.4.1: resolve "^1.22.2" sucrase "^3.32.0" -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.20" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" - -terser@^5.26.0: - version "5.31.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz" - integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - text-encoding-utf-8@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" @@ -6442,32 +6337,12 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tslib@^1.9.0, tslib@1.14.1: +tslib@1.14.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^2.1.0: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^2.3.1: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@2.6.2: +tslib@2.6.2, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -6484,7 +6359,7 @@ typedarray-to-buffer@3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^5.3.3, typescript@>=5.0.4: +typescript@^5.3.3: version "5.4.5" resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -6655,15 +6530,7 @@ unist-util-visit-parents@^4.0.0: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" -unist-util-visit-parents@^5.0.0: - version "5.1.3" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit-parents@^5.1.1: +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: version "5.1.3" resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== @@ -6744,13 +6611,6 @@ uqr@^0.1.2: resolved "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz" integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - use-callback-ref@^1.3.0: version "1.3.2" resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz" @@ -6766,15 +6626,22 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + use-sync-external-store@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== -use-sync-external-store@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" @@ -6853,17 +6720,7 @@ vfile-message@^4.0.0: "@types/unist" "^3.0.0" unist-util-stringify-position "^4.0.0" -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -vfile@^5.3.0: +vfile@^5.0.0, vfile@^5.3.0: version "5.3.7" resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== @@ -6882,7 +6739,7 @@ vfile@^6.0.0: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" -viem@^1.0.0, viem@^1.21.4, viem@^1.6.0, viem@>=0.3.35, "viem@~0.3.19 || ^1.0.0": +viem@^1.0.0, viem@^1.21.4, viem@^1.6.0: version "1.21.4" resolved "https://registry.npmjs.org/viem/-/viem-1.21.4.tgz" integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== @@ -6906,7 +6763,7 @@ vscode-textmate@^8.0.0: resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== -wagmi@^1.4.13, "wagmi@~1.0.1 || ~1.1.0 || ~1.2.0 || ~1.3.0 || ~1.4.0": +wagmi@^1.4.13: version "1.4.13" resolved "https://registry.npmjs.org/wagmi/-/wagmi-1.4.13.tgz" integrity sha512-AScVYFjqNt1wMgL99Bob7MLdhoTZ3XKiOZL5HVBdy4W1sh7QodA3gQ8IsmTuUrQ7oQaTxjiXEhwg7sWNrPBvJA== @@ -6918,14 +6775,6 @@ wagmi@^1.4.13, "wagmi@~1.0.1 || ~1.1.0 || ~1.2.0 || ~1.3.0 || ~1.4.0": abitype "0.8.7" use-sync-external-store "^1.2.0" -watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - web-namespaces@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" @@ -6941,41 +6790,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.1.0, webpack@>=5: - version "5.91.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" @@ -7046,7 +6860,12 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@*, ws@^7.4.5, ws@^7.5.1: +ws@8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@^7.4.5, ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -7056,11 +6875,6 @@ ws@^8.5.0: resolved "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz" integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== -ws@8.13.0: - version "8.13.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - xtend@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" @@ -7116,7 +6930,7 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -"zod@^3 >=3.19.1", zod@^3.22.3: +zod@^3.22.3: version "3.23.5" resolved "https://registry.npmjs.org/zod/-/zod-3.23.5.tgz" integrity sha512-fkwiq0VIQTksNNA131rDOsVJcns0pfVUjHzLrNBiF/O/Xxb5lQyEXkhZWcJ7npWsYlvs+h0jFWXXy4X46Em1JA==