Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Proposal for web3-compatible wallets support #518

Open
alexauroradev opened this issue Nov 15, 2023 · 20 comments
Open

Proposal for web3-compatible wallets support #518

alexauroradev opened this issue Nov 15, 2023 · 20 comments
Labels
A-NEP A NEAR Enhancement Proposal (NEP). S-review/needs-sme-review A NEP in the REVIEW stage is waiting for Subject Matter Expert review. WG-protocol Protocol Standards Work Group should be accountable

Comments

@alexauroradev
Copy link

Summary

This proposal introduces a significant enhancement to the NEAR Protocol, aiming to make its ecosystem closer with Ethereum by integrating Web3 wallet support. The primary goal is to resolve the incompatibility issues between Ethereum and NEAR standards, thus facilitating a seamless user experience for Ethereum users on the NEAR platform. Central to this initiative are several components: the Wallet Contract, Wallet Selector Extension, RPC-Translator, Transaction Relayer, and the Ethereum Translation Contract. Together, these elements enable Ethereum-compatible transactions within NEAR, ensuring that users familiar with Ethereum's environment face minimal friction in using NEAR dApps.

Key features include a protocol change that embeds the Wallet Contract for implicit Ethereum-style accounts as a fundamental feature of NEAR and simulating Ethereum standards for transaction compatibility on the level of this contract.

Proposal also acknowledges inherent limitations and risks, which, however, are manageable. The proposal outlines future opportunities for extending its capabilities to include more Ethereum standards and exploring further integrations. The project's scope is vast, requiring rigorous development, testing, and collaboration across various components and entities of the NEAR ecosystem.

In essence, this proposal strives to enhance NEAR's interoperability with Ethereum, significantly improving accessibility and user experience for a broader audience in the blockchain community.

The proposal has core and advanced topics. Pieces that are marked with [COMPLEX] may be omitted during the first read.

Problem Statement

Currently, the Ethereum ecosystem is a leading force in the smart contract blockchain space, boasting a large user base and extensive installations of Ethereum-compatible tooling and wallets. However, a significant challenge arises due to the incompatibility of these tools and wallets with NEAR Protocol. This incompatibility necessitates a complete onboarding process for users to interact with NEAR contracts and accounts, leading to confusion, decreased adoption, and the marginalization of NEAR Protocol.

Implementing Web3 wallet support in NEAR Protocol, with an emphasis on user experience continuity, would significantly benefit the entire NEAR Ecosystem.

Goals / Deliverables

The primary goal is to develop a solution enabling Web3 wallet users to seamlessly interact with NEAR Protocol while retaining their user experience with other EVM-compatible networks. This solution should be straightforward, requiring minimal changes to the NEAR protocol, avoiding potential reversals of protocol changes, and minimizing the need for extensive user education. Additionally, it should prioritize minimizing the risk of phishing attacks that trick users into signing indecipherable data. It's crucial that transactions signed by users are processed unambiguously at the NEAR blockchain level, eliminating the need for a trusted intermediary.

Prior work

Previous efforts have been made in this area. Notable examples include the nEth project and the Metamask Snap for NEAR. These projects enable Metamask compatibility with NEAR natively but fall short in supporting arbitrary Ethereum wallets. Moreover, neither project provides a user experience comparable to that of EVM-compatible chains.

With nEth, users must sign EIP-712 messages, which differs from executing standard transactions in Metamask. The Metamask Snap project effectively creates a distinct application within Metamask, separate from typical Metamask workflows. This application cannot interact with Metamask keys, nor can it display token balances or transaction histories, and it lacks integration with Ledger. Both projects also necessitate funding new accounts from external sources.

Aurora XCC offers another avenue for Ethereum wallet users to interact with Near native. However, this approach has drawbacks, such as the requirement for WNEAR (NEP-141 wrapped NEAR bridged into Aurora from Near native) for many applications. This necessity complicates users' understanding of transaction costs. Additionally, XCC introduces a gas overhead compared to direct Near usage, potentially hindering user interactions with some applications due to Near's 300 Tgas transaction limit.

Technical Description

Ethereum and NEAR exhibit several fundamental incompatibilities that impact areas such as transaction formats, signature algorithms, addressing schemes, public RPC APIs, and interaction workflows. This proposal seeks to effectively conceal and/or resolve these incompatibilities to facilitate standard wallet operations like balance inquiries, account top-ups, transfers of fungible tokens, and smart contract function calls on the NEAR blockchain.

Solution Overview

The proposed solution comprises five key components:

  1. Wallet Contract (WC): An on-chain smart contract designed to receive, validate, and execute Ethereum-compatible transactions on the NEAR blockchain. It functions as a user account.

  2. Wallet Selector Extension: A frontend module that connects NEAR-compatible wallets to dApps. This project aims to develop add-ons supporting Ethereum wallets, primarily to create Ethereum-compatible transactions from NEAR-compatible inputs.

  3. RPC-Translator (RPCT): Given that Ethereum wallets access blockchain state via a specific Web3 API, the RPC-Translator is designed to provide Ethereum methods implementations using the NEAR RPC as a data source. This component, along with the Transaction Relayer, is publicly hosted and accessible to all users. While the RPC-Translator and Transaction Relayer are operated together, they are listed separately to highlight their distinct functions.

  4. Transaction Relayer (TR): Ethereum wallets cannot generate NEAR-compatible transactions. Instead, Ethereum-compatible transactions produced by them are processed by the Transaction Relayer, which embeds it into a NEAR transaction and forwards it to the user’s Wallet Contract. Again, while operated in conjunction with the RPC-Translator, the Transaction Relayer is distinct in its role.

  5. [COMPLEX] Ethereum Translation Contract (ETC): Addressing the incompatibility between NEAR's human-readable account names and Ethereum's cryptographic hash-based addresses, the ETC functions as an on-chain mapping system. This system records NEAR-compatible input values (like NEAR account names and smart contract function names) and maps them to their corresponding Ethereum-compatible cryptographic hashes. This feature is vital for preserving familiar user experiences, such as recognizing ft_transfer operations in NEP-141 as fungible token (ERC20) transfers, rather than generic contract calls, and ensuring that fungible token balances are displayed in Web3 wallets.

Transaction Flow

The transaction flow between components is outlined as follows:

  • The dApp frontend initiates a call to the Wallet Selector.
  • The Wallet Selector then interacts with the Ethereum Wallet.
  • The Ethereum Wallet communicates with the Transaction Relayer.
  • The Transaction Relayer submits the transaction to the NEAR RPC.
  • The NEAR protocol processes the transaction through the Wallet Contract.
  • Finally, the Wallet Contract interacts with the dApp contract.

Below are detailed examples, with implementation specifics provided subsequently.

Example Transaction Flow: Incoming $NEAR Transfer

  • Alice, a NEAR compatible wallet user, controls the alice.near account on NEAR.
  • Bob, an Ethereum compatible wallet user, controls the Ethereum address (EOA) 0xb794f5ea0ba39494ce839613fffba74279579268.
  • Alice directs her NEAR wallet to transfer 2 $NEAR to 0xb794f5ea0ba39494ce839613fffba74279579268.
  • On NEAR, an implicit account named 0xb794f5ea0ba39494ce839613fffba74279579268 is created, with a Wallet Contract deployed to it by the NEAR Protocol.
  • Bob’s wallet periodically queries the eth_getBalance RPC method via the RPC-Translator. Once Alice’s transaction is confirmed on-chain, the RPC-Translator reports the balance of the implicit account, which is then displayed to Bob by his wallet.

This process aligns with the user experience expectations of both NEAR and Ethereum users.

Example Transaction Flow: Outgoing Function Call

  • Bob, using an Ethereum compatible wallet, controls the Ethereum address 0xb794f5ea0ba39494ce839613fffba74279579268.
  • DefiEx, a dApp on NEAR, consists of a web frontend and a smart contract at defiex.near.
  • Bob uses DefiEx’s web frontend, which employs the Wallet Selector to connect his Ethereum compatible wallet. The frontend invokes the signAndSendTransaction method, typical in NEAR wallet interactions.
  • Wallet Selector addon constructs an Ethereum transaction, which is then sent to Bob's wallet and signed.
  • The Ethereum Wallet communicates this transaction to the Transaction Relayer via eth_sendRawTransaction.
  • The Transaction Relayer validates the Ethereum transaction, converts it into a NEAR-compatible format, and sends it to Bob’s Wallet Contract at 0xb794f5ea0ba39494ce839613fffba74279579268.
  • The Wallet Contract decodes the Ethereum transaction, verifies the signature against the Ethereum address, and executes the corresponding action on the DefiEx smart contract.

This method meets the expectations of both NEAR developers and Ethereum users.

[COMPLEX] Example Transaction Flow: NEP-141 Transfer from Metamask

  • Charlie, a Metamask user, controls the Ethereum address 0xb794f5ea0ba39494ce839613fffba74279579268.
  • Declan, another Metamask user, controls the Ethereum address 0xf977814e90da44bfa03b6295a0616a897441acec.
  • Charlie, having acquired USDT on a centralized exchange, wishes to transfer 10 NEAR-native USDT to Declan’s address.
  • Charlie adds NEAR-native USDT to Metamask, using an address derived from the keccak-256 hash of the NEAR account usdt.tether-token.near.
  • Metamask, via RPC Translator, displays USDT as a standard ERC20 token.
  • Charlie initiates a transfer from Metamask to Declan. This is processed as a standard ERC20 transfer method call.
  • The Transaction Relayer converts this into a NEAR transaction and sends it to the NEAR Blockchain.
  • The Wallet Contract identifies this as a special ERC-20 transfer, queries the Ethereum Translation Contract for a corresponding NEAR contract, and constructs an action for the usdt.tether-token.near contract.
    • First, it checks if Declan’s account is registered with USDT, funding the storage if necessary.
    • Next, it processes the ft_transfer action, attaching 1 yoctoNEAR as per NEP-141.
  • Post-transaction, the RPC Translator provides ERC-20 transaction logs to Metamask, confirming the transfer to Charlie.

This transaction flow adheres to the expectations of Ethereum users.

Wallet Selector and Transaction Transformation

Ethereum transactions, RLP encoded, encapsulate the following information:

  • To address of the transaction,
  • From address (derived from the signature),
  • Gas price,
  • Gas limit,
  • Nonce,
  • Base token transfer amount within a transaction (value),
  • Chain ID,
  • Data field,
  • Signature (yielding the public key and From address).

For function calls to a smart contract, the data field contains:

  • The Function Selector,
  • Function call parameters.

Both To and From addresses, encoded in hexadecimal and prefixed with “0x”, comprise 20 bytes. The From address is the right-most 20 bytes of the Keccak-256 hash of the binary public key of the transaction sender (an EOA, externally owned address). The To address signifies either the recipient EOA or an on-chain contract address.

The Function Selector is the first 4 bytes of the Keccak-256 hash of the full function signature intended for the contract specified by the To address. For instance, the ERC-20 standard function transfer(address _to, uint256 _value) has the Function Selector keccak-256("transfer(address,uint256)")[0,4], equal to 0xa9059cbb.

Proposed Ethereum Transaction Construction

  • Set the chain ID to a public constant (to be determined).
  • The gas price, fetched by the Ethereum Wallet from the RPC Translator (sourced from NEAR RPC), reflects the NEAR gas price.
    • [COMPLEX]: Align Ethereum's gas consumption (usually in thousands or millions) with NEAR's TGas denomination. For instance, a 50k Ethereum gas consumption for ERC20 transfers aligns with 2-10 TGas in NEP-141 transfers. A 100,000x multiplier is proposed for translating NEAR TGas to Ethereum gas. For example, a 10 TGas NEAR transaction would appear as 1M Ethereum Gas in an Ethereum wallet. Similarly, apply the inverse multiplier to gas prices. A typical NEAR gas price of 1e-4 $NEAR per TGas translates to 1e-9 $NEAR or 1 gwei for Ethereum wallets, a familiar unit for Ethereum users.
  • The gas limit is determined by the dApp-developer or through eth_estimateGas by the Ethereum Wallet, applying the aforementioned recalculation rules.
  • The nonce and signature are managed by the Ethereum wallet, in line with Ethereum protocol.
  • The From address adheres to Ethereum protocol too.

Special Considerations for To and Data Field

The To address and data field creation vary based on the dApp's input to the Wallet Selector:

  • [COMPLEX] If the receiverID matches ^0x[a-f0-9]{40}$ (indicating another Ethereum account), it's treated as an EOA and used as-is. This case is restricted to $NEAR transfers (excluding smart contract calls) and is integral to the Ethereum standards simulation.
    • Note: NEAR protocol will not host Ethereum smart contracts on Ethereum-style accounts post-implementation of this proposal.
  • Otherwise, the receiverID refers to a non-EOA account on NEAR. Here kekeccak-256(receiverID)[12,32] is used as the To address.

For the data field:

  • When initiated by the Wallet Selector, function selectors and parameters mirror NEAR actions, encoded as native Ethereum types. For example:
    • FunctionCall(to: string, method: string, args: bytes, yoctoNear: uint32)
    • Transfer(to: string, yoctoNear: uint32)
    • Stake(public_key: bytes, yoctoNear: uint32)
    • AddKey(public_key: bytes, nonce: uint64, is_full_access: bool, allowance: uint256, receiver_id: string, method_names: string[])
    • etc.
  • [COMPLEX] The yoctoNear values are 32-bit, accommodating values under 1e6. The total yoctoNEAR attached to a NEAR Action is 1e6 * <ethereum transaction value> + <yoctoNEAR in data field>, enabling:
    • Accurate display of $NEAR balances in Ethereum wallets (assuming 18 decimals).
    • Compatibility with NEAR standards like NEP-141, requiring 1 yoctoNEAR for ft_transfer and ft_transfer_call methods.
  • [COMPLEX] If initiated by the Ethereum wallet (limited use cases like native or fungible token transfers), the data field is retained as-is. For instance, ERC-20 transfer(to address, amount uint256) calls map to NEAR actions in the Wallet Contract.

Wallet Contract

The Wallet Contract is designed to process Ethereum transactions through the method executeRLP(target: AccountId, rlp_transaction: Vec<u8>). The following steps outline its operation:

  1. Parse the Transaction: It starts by parsing the incoming Ethereum transaction.

  2. Verify Target Address: It checks if the target equals the transaction's To address, or if keccak256(target)[12,32] matches the To address.

  3. Signature Verification and Extraction: The contract verifies the signature to extract the Public key and chainID, ensuring the integrity of the transaction.

  4. From Address Creation and Verification: It generates the From address from the public key and confirms that it aligns with the current_account_id (the ID of the Wallet Contract).

  5. ChainID Validation: The contract validates that the chainID corresponds to the constant defined for NEAR.

  6. Nonce Verification and Update: It ensures the transaction nonce matches the stored nonce and then increments the stored nonce by one.

  7. [COMPLEX] Value Calculation: The contract sets the Value by multiplying the Ethereum transaction value by 1e6 and adding the yoctoNear value from the data field. It then confirms the attached deposit is either greater than or equal to this value or identifies it as a self-transaction (refer to TR and Gas Payment section for details).

  8. [COMPLEX] ETC Lookup and Execution for Ethereum Transfers:

    • If the To Address equals the target and the value is more than zero (indicating an Ethereum transfer), the Wallet Contract consults the ETC ("Ethereum Translation Contract") for the To address.
      • If the ETC lacks an entry for the To address, it implies the recipient is an Ethereum EOA. In this case, the transaction is an ordinary transfer and should be executed as such.
      • If the ETC contains an entry for the To address, indicating the recipient is a NEAR smart contract simulating an Ethereum standard (like NEP-141), the data field of the transaction is parsed against supported ERC standard calls to form the appropriate NEAR action.
  9. NEAR Native Account Transfer: If the data field is empty, it transfers the value to the target, typical for a $NEAR transfer to a NEAR-native account. Values below 1e6 yoctoNEAR cannot be transferred.

  10. Function Selector and Parameter Verification: In cases where the data field is not empty, the contract verifies the function selector against matching NEAR actions.

  11. Execution of NEAR Action: After parameter verification, the Wallet Contract executes the corresponding NEAR action by creating a promise.

These steps ensure that the Wallet Contract accurately processes and executes transactions, bridging the gap between Ethereum and NEAR protocols.

Transaction Relayer and Gas Payment

The Transaction Relayer (TR) serves as an HTTP-JSONRPC endpoint compatible with Ethereum, primarily implementing the eth_sendRawTransaction method. Its validation process involves:

  • Ensuring correct encoding and signing of the transaction.
  • Verifying the existence of the sender as an account on NEAR.
  • Checking if the nonce is greater than the stored value in the Wallet Contract.

Upon receiving a transaction, the TR assesses the To Address:

  • If it exists on-chain, the TR crafts a transaction with a FunctionCall to executeRLP on the From address account, setting target to the To Address.
  • [COMPLEX] If the To Address is not on-chain, the TR consults the ETC (Ethereum Translation Contract) for the preimage of the To Address. If retrievable, it creates a FunctionCall to executeRLP on the From address account, directing target to the ETC result.

Approaches to Gas Payment

This project's challenge lies in appropriately assigning gas costs to the Ethereum-compatible account. Our proposed solutions are:

  1. Simplified Gas Calculation: By default, all transactions use the maximum gas limit, or a limit specified by the dApp developer, to bypass the complexity of gas amount computation.

  2. Gas Payment Scheme:

    • Register the account with TR. The Ethereum wallet sets up a functionCall key on its account, authorizing the executeRLP method call with a public key from the Transaction Relayer. This setup, compatible with the Transaction Translation model, employs the AddKey Action. Received transactions under this scheme are forwarded and paid for by the Transaction Relayer. Alternatively, the Wallet Contract could reimburse the Transaction Relayer via a Transfer promise.
    • Once an Ethereum wallet is registered with the Transaction Relayer, this functionCall key is utilized for all subsequent transactions. Effectively, the Transaction Relayer operates on the account's behalf, with the account bearing all gas costs.
    • To mitigate potential abuse by the Transaction Relayer, the Wallet Contract can revoke the functionCall key in cases of non-parseable transactions, invalid signatures, or nonce replay (subject to specific time and value deltas). This limitation restricts a dishonest Transaction Relayer to a single invalid transaction's NEAR gas cost (typically not exceeding 0.03 $NEAR under normal conditions).

[COMPLEX]: This approach avoids unnecessary cross-contract calls, maintaining NEAR protocol interactivity for Ethereum users.

Optional Free Transactions: Some relayers may offer a number of free transactions as an incentive for users to engage with NEAR. This can be achieved by the relayer's account directly calling the Wallet Contract's executeRLP function, instead of using the user’s account's functionCall access key. Some of these transactions may require attachment of $NEAR for covering storage staking or other requirements of NEAR protocol standards.

RPC Translator

The RPC-Translator, functioning as an HTTP-JSONRPC endpoint compatible with Ethereum, implements a set of methods crucial for supporting Ethereum wallets. These include:

  • eth_chainId: Returns a constant value.
  • eth_gasPrice: Fetches and recalculates respective data from NEAR RPC.
  • eth_estimateGas: Returns a constant 30M, aligned with the gas recalculation considerations previously mentioned.
  • eth_blockNumber: Provides the current NEAR block height.
  • eth_getBalance: Delivers the account's $NEAR balance, adjusted to Ethereum's decimal count (omitting the last 6 digits).
  • eth_getTransactionCount: Retrieves the nonce value from the account's Wallet Contract.
  • eth_getTransactionByHash and eth_getTransactionReceipt: Present transaction details by indexing the NEAR chain, with values recalculated for Ethereum's decimal count.
  • get_logs: Offers log information from the NEAR chain, reformatted and recalculated for Ethereum compatibility.
  • eth_call: Conducts a view call against NEAR RPC, translating parameters as per the Ethereum standards simulation.

These methods enable Ethereum wallets to create transactions and access transaction status. The proposal also accommodates direct $NEAR and ERC20 transfers from Ethereum wallets.

[COMPLEX] Ethereum Standards Simulation and Ethereum Translation Contract

To bridge the gap between NEAR's and Ethereum's differing addressing schemes, especially for interactions initiated directly from web3 wallets, the Ethereum Translation Contract (ETC) is pivotal. It maintains a simple mapping between Ethereum transaction hashes and corresponding NEAR account names:

  • key: keccak256(<NEAR account>)[12,32]
  • value: <NEAR account>

The ETC provides two core functions:

  • record(account_id: AccountId): Calculates the hash and records it in the map, requiring a deposit for storage staking. It is not applicable for Ethereum-style accounts.
  • lookup(hash: [u8; 32]) -> Option<AccountId>: A view function that returns the associated NEAR account for a given hash, if available.

NEAR accounts intending to interact with Ethereum wallets must register with the ETC. This registration is permissionless, allowing third-party on-the-fly registrations if necessary.

It's important to note that ETC registration is not mandatory for most NEAR applications. For instance, applications like ref.finance, typically not called directly from Metamask, would route their contract calls through the frontend, thereby utilizing the Wallet Selector's transaction translation.

In the initial phase, the focus will be on $NEAR token transfers and ERC-20 transfers, and approval management in the Ethereum Standards Simulation. Future expansions may include additional standards in the Wallet Contract (refer to the testing and upgrades section). The ETC itself does not require upgrades to support these enhancements.

Implementation Notes

The proposed solution necessitates a protocol change for deploying the Wallet Contract on implicit Ethereum accounts. To facilitate this, we suggest integrating the Wallet Contract as a core feature of the NEAR protocol. This change would treat all Ethereum accounts as if they already have the Wallet Contract deployed.

Additionally, to enhance security and align with Ethereum's operational flows, we propose prohibiting the deployment of other contracts on Ethereum accounts. This can be achieved by restricting Ethereum users from adding full access keys to these accounts, thereby significantly reducing the attack surface.

Testing and Upgrades

Integrating the Wallet Contract as a protocol feature requires synchronized testing and upgrade processes between nearcore and the Wallet Contract. Fortunately, due to the absence of cross-dependencies, the Wallet Contract can be developed, maintained, and tested independently. Its latest stable version would then be incorporated into the nearcore Testnet release, followed by integration into the Mainnet release.

We recommend that any modifications to the Wallet Contract's functionality, such as adding support for new Ethereum standards over time, should be incorporated into the NEAR enhancement process. This approach ensures a structured and systematic update mechanism.

The development and testing of off-chain components, like the RPC-Translator, will precede those of on-chain components. This sequential approach allows for thorough testing and refinement of each component before integration into the larger system.

Limitations and Risks

  • [COMPLEX] Dependence on Ethereum Standards Simulation: The solution heavily depends on simulating Ethereum standards in the Wallet Contract and RPC-Translator. While standards like ERC20 are manageable, others may be too complex or impossible to emulate accurately.

  • [COMPLEX] Ambiguity in Transaction Conversion: The emulation of Ethereum standards may lead to confusion in indexing or displaying transactions due to the dual paths of NEP-141 transfer encoding – either through standard conversion via Wallet Selector or originating directly from the wallet. This does not introduce new attack vectors. Users in general should exercise caution and avoid transactions with unfamiliar contracts or frontends.

  • RPC-Translator Limitations: The RPC-Translator is tailored for wallet interactions and simple chain functions, but it's not equipped for advanced use cases requiring complete block data. Extending its capabilities could be challenging and resource-intensive.

  • [COMPLEX] Challenges with the Ethereum Translation Contract (ETC): The ETC, vital for integrating NEAR accounts with Ethereum wallets, adds complexity and can lead to user experience issues if registration is overlooked. Automating ETC population through indexing services could mitigate this risk. Future developments might explore on-chain contract lists and function signatures for introspection.

  • Power and Opacity of Wallet Contract: The Wallet Contract, pivotal for executing NEAR Actions, may be obscure to Ethereum Wallet users. This necessitates stringent checks and limitations on action parameters, as noted in the proposal to restrict full access key additions.

  • Lack of Batch Transaction Support: The proposal currently does not accommodate batch transactions available in Wallet Selector, primarily due to limited utility and the complexity it would introduce, along with associated security concerns.

  • [COMPLEX] Potential for inclusion NEAR account functionality in Wallet Contract: An expanded version of the Wallet Contract, which includes NEAR account functionality, could retain valuable NEAR user patterns. For example, alowing using BOS frontend functionCall keys for Ethereum accounts. This would facilitate simple actions without needing to sign each transaction in the Ethereum wallet. While promising, this approach requires careful management.

  • Wallet Contract Upgrades: Positioning the Wallet Contract as a protocol feature could limit its upgradability and inadvertently enable smart contract deployments with unbilled storage allocation. Careful implementation can mitigate potential storage growth on NEAR.

  • Exclusion of Native Ethereum Contract Deployment on NEAR: The proposal does not address the deployment of Ethereum contracts natively on NEAR. Although this is possible via the Aurora network, interactions between NEAR-onboarded Ethereum users and Aurora contracts would necessitate additional steps, like asset bridging or using the Aurora XCC SDK.

Future Opportunities

  • Expansion of Ethereum Standards: A key future development involves simulating other Ethereum standards such as ERC-721, ERC-1155, or ERC-3643. This would enhance NEAR's frontend compatibility with various Ethereum use cases.
  • Account Abstraction and Extended Features: This proposal lays the groundwork for account abstraction, potentially leading to the introduction of advanced features in the Wallet Contract. These could include native support for multi-signatures, time-locks, social recovery, and alternative signature algorithms compatible with secure elements in widespread devices.
  • Aurora Integration: Exploring integration with Aurora to enable interactions with Aurora-hosted contracts through NEAR, utilizing Ethereum transaction formats and processes.
  • Bridging and Oracle Onboarding: This model could facilitate simplified bridging and oracle integration, contributing to the expansion of NEAR's infrastructure.

Scope of the Project

The scope of this project is extensive, encompassing several critical components:

  1. Core Technology:

    • Wallet Contract: A crucial, security-sensitive component requiring detailed audits and testing.
    • nearcore Protocol Upgrade: Modification to treat Ethereum-style accounts as implicit and deploy the Wallet Contract on them.
    • Wallet Selector Add-Ons: Ensuring compatibility with Metamask and WalletConnect-compatible wallets.
    • Transaction Relayer and RPC Translator: Key elements of the NEAR Web3 RPC middleware, working alongside the NEAR node.
    • Ethereum Translation Contract (ETC): A simpler component in comparison to others, yet vital for the system.
  2. Integration Testing: Given the solution's distributed nature, comprehensive integration testing is imperative.

  3. Documentation Development: Detailed documentation is necessary, enabling third-party developers to understand and potentially replicate parts of the system, except for the Wallet Contract.

  4. Node Operators Awareness and Public Infrastructure: Launching and maintaining the NEAR Web3 RPC as a public service, similar to the existing NEAR RPC, and informing third-party node operators about the update and maintenance protocols.

  5. Integration with Key Platforms: For effective Ethereum user engagement, integration with the following is essential:

    • Centralized Exchanges: Permitting withdrawals to Ethereum-style addresses.
    • Bridges: Facilitating login on the NEAR side with Ethereum-compatible wallets.
    • NEAR-native Projects: Updating Wallet Selector configurations to support Ethereum-compatible wallet logins. Anticipated challenges include wallet address display issues, requiring adjustments.
    • Products to allow for key NEAR Wallet functionality. Allowing Etherum users to exercise core features of the NEAR protcol in a dApp: staking, key management, work with lockup contracts, etc. These may be implemented as BOS components.
  6. Bug Bounty Program: Establishing a program to address potential vulnerabilities, especially for on-chain components like the Wallet Contract and ETC.

  7. Ongoing Development and Bug Fixes: The project's complexity necessitates a proactive approach to bug fixes and future enhancements.

@alexauroradev
Copy link
Author

This proposal is an extension and rework of the #498
Adding Ethereum implicit accounts to nearcore is managed by this tracking issue: near/nearcore#10018

@alexauroradev alexauroradev transferred this issue from near/nearcore Nov 16, 2023
@alexauroradev alexauroradev added WG-protocol Protocol Standards Work Group should be accountable A-NEP A NEAR Enhancement Proposal (NEP). labels Nov 16, 2023
@alexauroradev
Copy link
Author

@walnut-the-cat
Copy link
Contributor

@near/wg-protocol , please nominate SMEs who can review this NEP

@mfornet
Copy link
Member

mfornet commented Nov 21, 2023

@near/wg-protocol , please nominate SMEs who can review this NEP

Notice that this is not a NEP yet but a proposal for discussion. This format is beneficial for high-level discussion, and once it becomes a NEP, we can discuss low-level details of the implementation.

@Tarnadas
Copy link

I just wanted to say, that I've been integrating the Aurora SDK into a Near smart contract and the asset bridging is extremely complex and also the gas usage is so high, that it's very limiting.

In theory it's a nice addition, but almost all DeFi apps would need some sort of token bridging, but all the cross contract calls consume so much gas, that you have very few gas remaining for the actual smart contract execution on Near. You can check out this example, that I co-authored and there's only 35TGas allocated for the Near smart contract call, because the remaining gas is consumed elsewhere:
https://github.com/aurora-is-near/aurora-contracts-sdk/blob/ae124d2faa2cd9cfdaaeb72949610887256f122f/examples/ft-refund/solidity-contract/src/FtRefund.sol#L12

The bridged wNEAR for Aurora XCC that Alex is mentioning can be circumvented by a small code change in the Aurora SDK, but you would need to make sure, that users would have to pay for the wNEAR deposit somehow else (e.g. by depositing ETH instead, like it's done with Gas on Aurora).

Overall the Aurora SDK is somewhat impractical for DeFi apps on Near (but much better for dapps, that don't need token bridging), but it's possible to use it and you can implement some tricky workarounds to have better way of token refunding.

github-merge-queue bot pushed a commit to near/nearcore that referenced this issue Nov 24, 2023
## Context
Tracking issue: #10018.
Design: near/NEPs#518 (comment).

### Goal
We want the NEAR Protocol's ecosystem to be closer with Ethereum by
integrating Web3 wallet support.
To accomplish that, some changes on the protocol level are needed with
an emphasis on user experience continuity.
Following the design, the main change on the protocol level would be to
have ETH-style addresses managed by a new `Wallet Contract` integrated
into the protocol.
For seamless onboarding of EVM users, the contract will be free of
charge.

### Previous work
This PR is built on top of a [preparatory
PR](#10020).
It reintroduces some changes from a [closed
PR](#10056) that follows an old
design.

## Summary
On a transfer to an ETH-implicit address:
1. An account is created at this address.
2. The account does not have any access key added. Thus, it is not
possible to make a transaction from this account directly.
3. The Wallet Contract (as a part of the protocol) is deployed to the
account. For this PR, an empty smart contract is used as a placeholder.

### Changes
- On a transfer to an ETH-implicit address, if an account does not exist
yet at this address:
   - Create account at this address.
- Deploy a `Wallet Contract` placeholder (empty contract now) to this
account.
- Update fee for a transfer to an ETH-implicit address to include
account creation cost. `Wallet Contract` deployment is free of charge
(user only pays for an increased storage).
- Tests:
- Test whether it is possible to create an ETH-implicit account by
making a transfer to that address, and whether further funds can be sent
to this account.
- Test that no access key is added to an ETH-implicit account (the
account is locked) and in consequence no transactions are possible from
this account.
- Guard the changes with `EthImplicitAccounts` protocol feature and
`eth_implicit_accounts` runtime config flag.

## Next work
- Discuss how the `Wallet Contract` should be integrated into the
protocol for efficiency.
- Use the `Wallet Contract` placeholder implementation that allows to
transfer funds only.
@walnut-the-cat
Copy link
Contributor

@alexauroradev , please ping NEP moderator once the NEP is ready to be reviewed-

@walnut-the-cat walnut-the-cat added S-draft/needs-author-revision A NEP in the DRAFT stage that needs an author revision. S-draft/needs-implementation A NEP in the DRAFT stage that needs implementation. and removed S-review/needs-sme-review A NEP in the REVIEW stage is waiting for Subject Matter Expert review. labels Dec 4, 2023
@swapnilraj
Copy link

I don't have a lot of context, so forgive me for that.

Is this design inspired by EIP-4337?

@Ekleog-NEAR
Copy link
Contributor

We had some related discussion in https://near.zulipchat.com/#narrow/stream/295306-pagoda.2Fcontract-runtime/topic/Eth-wallet.20support/near/403646004 .

In particular, I think the idea of actually having some hash-containing placeholder for the smart contract code, would help us be forward-compatible with shared smart contracts. This idea would result in us having eg. near[contract hash] as the deployed code, which does not run at a risk of collision with real contracts considering these ones must start with \0asm.

@Ekleog-NEAR
Copy link
Contributor

I’m seeing that this is suggesting keccak256(...)[12,32] as a way to generate the hashes. Why is there these [12,32] magic numbers? Is it possible to document the rationale behind this choice for the hashing function?

@birchmd
Copy link
Contributor

birchmd commented Dec 13, 2023

I’m seeing that this is suggesting keccak256(...)[12,32] as a way to generate the hashes. Why is there these [12,32] magic numbers? Is it possible to document the rationale behind this choice for the hashing function?

On Ethereum itself the addresses are derived from the public key for the account by taking the rightmost 20 bytes (160 bits) of the keccak256 hash (this is defined in Appendix F, eq 323 of the Ethereum Yellow Paper). We are applying this same rule when deriving an address from a Near account id.

We could choose any rule for deriving a 20-byte address from a Near account id, but reusing the Ethereum rule for an Ethereum compatibility protocol is a sensible choice in my opinion (principle of least surprise for devs familiar with Ethereum).

github-merge-queue bot pushed a commit to near/nearcore that referenced this issue Dec 18, 2023
## Context
NEP: near/NEPs#518
Tracking issue: #10018.

### Goal
We want the NEAR Protocol's ecosystem to be closer with Ethereum by
integrating Web3 wallet support.
To accomplish that, some changes on the protocol level are needed with
an emphasis on user experience continuity.
Following the design, the main change on the protocol level would be to
have ETH-style addresses managed by a new `Wallet Contract` integrated
into the protocol. For seamless onboarding of EVM users, the contract
will be free of charge.

### Previous work
This PR is built on top of two PRs:
* #10020: no-op PR, laying
groundwork for further changes.
* #10224: empty contract as a
placeholder, literally deployed to new ETH accounts.

## Summary
This PR adds `near-wallet-contract` crate (based on
`runtime/near-test-contracts`) that exposes `Wallet Contract` WASM code
to the runtime.
It stops deploying a copy of the `Wallet Contract` to each newly created
ETH-implicit account.
Instead, it uses an in-memory cached contract code on
`execute_function_call` action from such account.

### Changes
- Add `wallet-contract` crate (separated from the workspace) with
placeholder `Wallet Contract` implementation.
- Add `near-wallet-contract` crate (part of the workspace) that
generates (through `build.rs`) and exposes the `Wallet Contract` WASM
code.
- Do not literally deploy `Wallet Contract` when creating ETH-implicit
account. Just store reference to the `Wallet Contract`.
- Treat ETH-implicit accounts specially when retrieving contract code
from an account (in such case returns in-memory cached `Wallet Contract`
code).
- Add tests calling `Wallet Contract` where a transfer from an
ETH-implicit account is possible depending on the public key passed with
`rlp_transaction` argument.
@walnut-the-cat
Copy link
Contributor

What's the current status of this NEP? It is ready to be reviewed by SMEs?

@walnut-the-cat
Copy link
Contributor

another gentle ping to understand the readiness of the NEP :)

zwong91 added a commit to utnet-org/utility-readonly that referenced this issue Mar 12, 2024
* build fuzzers on Big machines (#10252)

See eg. the likely-OOM at
https://github.com/near/nearcore/actions/runs/6890897651/job/18744849948

* test: add tests for SnapshotHostInfo broadcast behavior (#10204)

Add a few tests which test that `SnapshotHostInfo` is properly broadcast
between peers.

`SnapshotHostInfo` lets other peers know that a certain peer has a state
snapshot at a specific point in time, which is later used for state
sync. Nodes publish this information periodically and it should be
broadcast to all nodes in the network.

Fixes: #10172

* allow warnings for fuzzer building (#10253)

Fuzzer building runs on rustc nightly, which can have a different set of
warnings than rustc stable. Rather than introduce a new compilation step
for all the PRs, just compile fuzzers without caring about warnings.

Fixes a recent fuzzer building issue, probably caused by a nightly
upgrade:
https://github.com/near/nearcore/actions/runs/6929988512/job/18848791016

* fix: use header_head to determine validators for forwarding transactions (#10256)

Functions `find_chunk_producer_for_forwarding()`,
`find_validator_for_forwarding()` are not used much, one calls another,
and they both call `chain.head()`.

That seems unnecessary. Refactored to call `get_chunk_producer()`
directly, and not worry about 3 layers of functions using different
types of heads.

See https://github.com/near/nearcore/pull/10251 for context

* drop buildkite pipeline (#10227)

We have now fully migrated off buildkite, so let’s remove the old
pipeline from the repository :)

* configurable tx routing horizon (#10251)

Community reports that sometimes it takes minutes for a transaction to
be recorded on chain.
My guess is that it takes that much time to record a transaction on
chain, because it gets forwarded to nodes which either:
* fail to produce their chunks
* don't have time to process incoming tx RPCs before producing their
chunks
* the node producing a tx is out of sync and the set of validators is
already too late

All of these can be fixed by multicasting transactions further into the
future.

This PR is the simplest attempt to send transactions further into the
future.

Tested: Had a testnet node and submitted a tx that was supposed to be
forwarded to chunk producers of the next 100 blocks. In practice it gets
forwarded to 5 validators. Sending a message to a validator takes about
100µs for a trivial tx.

* refactor: more work removing `num_shards()` (#10255)

Building on top of https://github.com/near/nearcore/pull/10249, further
reduces use of `num_shards()` in chain.rs.

Also removes some "premature" optimisations that I don't think would
necessarily help in production and just add complexity to the code.

* fix(config): disable epoch sync, enable state sync (#10260)

* Simplifies `state_sync_enabled` and `enable_multiline_logging`.
* Adjusts {min,max}_block_production_delay config options when
generating configs for testnet and mainnet.
* Simplifies config initialization logic.
* Deletes betanet and stakewars

* bump openssl (#10262)

Fixes https://rustsec.org/advisories/RUSTSEC-2023-0072, reported by the
cargo-audit CI job

* add a Justfile for reproducing CI locally, use it for CI (#10235)

* feat: support partial mandates in chunk validator assignment (#10241)

Adds support for partial mandates in chunk validator assignment.

Currently only full mandates are considered. Assume `stake_per_mandate =
5`, then:

- Valdiator `V1` with stake 12 holds 2 full mandates corresponding to a
stake of 10. The remaining stake of 2 does not participate in
validation.
- Validator `V2` with stake 4 holds 0 full mandates and does not
participate in validation at all.

With support for partial mandates `V1` gets a partial mandate with
weight 2 and `V2` gets a partial mandate of 4. So partial mandates allow
to increase the number of validators and allows them to commit their
entire stake to validation.

### Probability of shard corruption

In [these
simulations](https://near.zulipchat.com/#narrow/stream/407237-pagoda.2Fcore.2Fstateless-validation/topic/chunk.20validator.20assignment.20simulation.20with.20partial.20seats),
the probability of shard corruption decreases as partial seats are
included. In general, the effect of including partial seats depends on
the distribution of (malicious) stake across validators and the stake
required per mandate.

### `ValidatorMandatesAssignment`

This type is introduced to more clearly document the result of sampling
chunk validators and to avoid passing around a raw
`Vec<HashMap<ValidatorId, _>>`.

### Shuffling of shard ids

[This
thread](https://github.com/mooori/sim-validator-assignment/pull/12#discussion_r1389895314)
points out a bias towards small shard ids and brings up shard id
shuffling as a way to fix it. For now shard ids are not shuffled in this
PR, since I think it would make the diff harder to review. I would
suggest to introduce shard id shuffling in a separate PR. This should
not pose a risk as chunk validator assignment is not enabled in
production.

* [Snyk] Upgrade @types/react-dom from 18.2.14 to 18.2.15 (#10270)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade
@types/react-dom from 18.2.14 to 18.2.15.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **1 version** ahead of your current
version.
- The recommended version was released **22 days ago**, on 2023-11-07.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>@types/react-dom</b></summary>
    <ul>
      <li>
        <b>18.2.15</b> - 2023-11-07
      </li>
      <li>
        <b>18.2.14</b> - 2023-10-18
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/DefinitelyTyped/DefinitelyTyped/releases">@types/react-dom
GitHub release notes</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI5MDM2MzdmYS0yNGU2LTRiZjktYjY1NC1hYzYzNzFiMDY5MDEiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjkwMzYzN2ZhLTI0ZTYtNGJmOS1iNjU0LWFjNjM3MWIwNjkwMSJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;@types/react-dom&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"903637fa-24e6-4bf9-b654-ac6371b06901","prPublicId":"903637fa-24e6-4bf9-b654-ac6371b06901","dependencies":[{"name":"@types/react-dom","from":"18.2.14","to":"18.2.15"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":1,"publishedDate":"2023-11-07T20:33:53.244Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>

* feat: use the < operator instead of cmp method to improve readability (#10268)

The following code is currently used for comparing `boundary_account`
and `account_id`:
```rust
if boundary_account.cmp(account_id) == Greater {
    ...
}
```

IMO it's a bit confusing - it isn't immediately obvious whether this
means `boundary_account` > `account_id` or `account_id` >
`boundary_account`. I misread this line and because of that I made a
mistake in #10240.

Let's change it to something that is easier to read:
```rust
if account_id < boundary_account {
    ...
}
```

* feat: add database analyse-gas-usage command (#10240)

Add a command which allows to analyse gas usage on some part of the
blockchain.
The command goes over the specified blocks and gathers information about
how much
gas was used by each block, shard and account.
Then it displays an analysis of all the data.

The analysis contains:
* Total gas used
* Gas used on each shard
* Top 10 accounts by gas usage
* The optimal account by which a shard could be split into two halves
with similar gas usage

Help page:
```bash
$ ./neard database analyse-gas-usage --help
Analyse gas usage in a chosen sequnce of blocks

Usage: neard database analyse-gas-usage [OPTIONS]

Options:
      --last-blocks <LAST_BLOCKS>
          Analyse the last N blocks in the blockchain
      --from-block-height <FROM_BLOCK_HEIGHT>
          Analyse blocks from the given block height, inclusive
      --to-block-height <TO_BLOCK_HEIGHT>
          Analyse blocks up to the given block height, inclusive
  -h, --help
          Print help
```

Example usage:
```bash
# Analyse gas usage in the last 1000 blocks
cargo run --bin neard -- database analyse-gas-usage --last-blocks 1000

# Analyse gas usage in blocks with heights between 200 and 300 (inclusive)
./neard database analyse-gas-usage --from-block-height 200 --to-block-height 300
```

* refactor: replace all remaining uses of `num_shards()` with `shard_ids()` (#10271)

Closes https://github.com/near/nearcore/issues/10237

* Update resharding.md (#10264)

A pretty heavy handed rewrite of the resharding documentation. I'm open
to some heavy handed suggestions ;)

I'm not sure what's the best trade off between duplicating some content
from the NEPs here and keeping in minimal with just links.

There is some new content here, mainly the rollout section, I would love
to hear some thoughts about this in particular from @gmilescu and
@posvyatokum.

* introduce hack for fuzzers building (#10276)

This introduces a hack in our fork of cargo-bolero, needed for proper
fuzzer building. The reason is still the same as the patch previously
applied: the current bolero way of auto-detecting fuzzers is suboptimal.

All these patches should be able to go away with some work on
cargo-bolero, but we have other priorities, and this hack seems to make
the tarball builds work locally at least.

With this, we run with two patches:
-
https://github.com/Ekleog-NEAR/bolero/commit/877f19959e708f288e2e3c814768743f86f69c80,
which is a bit hacky but might deserve being included upstream were it
not for backward compatibility reasons
-
https://github.com/Ekleog-NEAR/bolero/commit/56da8e6d1d018519a30b36d85d3a53fe35a42eaf,
which is a real, bad hack, but seems to be enough to stop having to care
about it for now, until we can go back to it and fix the underlying
issue that fuzzer listing is currently not well-implemented. Its
consequence is, any fuzzer in the `neard` crate will not actually run on
our fuzzing infrastructure. We’ll have to fix it at some point.

* refactor: move runtime tests into a separate file (#10274)

This PR moves NightshadeRuntime tests module into a separate file
without changing anything else.

See https://github.com/near/nearcore/issues/10275 for more context.


In case having tests as a separate file is a good idea for the following
reasons:
- these are mostly integration-style tests with heavy setup (see
`TestEnv`) and quite a lot of code, so to me it seems like it deserves
to be in a separate file
- the code is already in `mod.rs` file, so we don't need to create a
separate directory structure.

* [ChunkValidation] Remove the feature flag protocol_feature_chunk_validation. (#10257)

We discussed as a team earlier that we don't need these feature flags.
Removing it to simplify further development of chunk validation.

* Chore: Removed unused imports/exports (#10288)

* crypto: simplify split usage  [trivial] (#10285)

* [Snyk] Upgrade @types/react from 18.2.25 to 18.2.37 (#10284)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade @types/react
from 18.2.25 to 18.2.37.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **12 versions** ahead of your current
version.
- The recommended version was released **25 days ago**, on 2023-11-07.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>@types/react</b></summary>
    <ul>
      <li>
        <b>18.2.37</b> - 2023-11-07
      </li>
      <li>
        <b>18.2.36</b> - 2023-11-06
      </li>
      <li>
        <b>18.2.35</b> - 2023-11-05
      </li>
      <li>
        <b>18.2.34</b> - 2023-11-01
      </li>
      <li>
        <b>18.2.33</b> - 2023-10-26
      </li>
      <li>
        <b>18.2.32</b> - 2023-10-25
      </li>
      <li>
        <b>18.2.31</b> - 2023-10-20
      </li>
      <li>
        <b>18.2.30</b> - 2023-10-19
      </li>
      <li>
        <b>18.2.29</b> - 2023-10-18
      </li>
      <li>
        <b>18.2.28</b> - 2023-10-10
      </li>
      <li>
        <b>18.2.27</b> - 2023-10-09
      </li>
      <li>
        <b>18.2.26</b> - 2023-10-09
      </li>
      <li>
        <b>18.2.25</b> - 2023-10-04
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/DefinitelyTyped/DefinitelyTyped/releases">@types/react
GitHub release notes</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiJkYjA5OTM4YS0zZGY5LTRkMTYtYTM5MS00MDkyMzVkNTllMDUiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6ImRiMDk5MzhhLTNkZjktNGQxNi1hMzkxLTQwOTIzNWQ1OWUwNSJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;@types/react&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"db09938a-3df9-4d16-a391-409235d59e05","prPublicId":"db09938a-3df9-4d16-a391-409235d59e05","dependencies":[{"name":"@types/react","from":"18.2.25","to":"18.2.37"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":12,"publishedDate":"2023-11-07T20:31:32.792Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>

* [Snyk] Security upgrade react-query from 3.39.3 to 4.0.0 (#10282)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to fix one or more
vulnerable packages in the `npm` dependencies of this project.</h3>



#### Changes included in this PR

- Changes to the following files to upgrade the vulnerable dependencies
to a fixed version:
    - tools/debug-ui/package.json
    - tools/debug-ui/package-lock.json



#### Vulnerabilities that will be fixed
##### With an upgrade:
Severity | Priority Score (*) | Issue | Breaking Change | Exploit
Maturity

:-------------------------:|-------------------------|:-------------------------|:-------------------------|:-------------------------
![high
severity](https://res.cloudinary.com/snyk/image/upload/w_20,h_20/v1561977819/icon/h.png
"high severity") | **661/1000** <br/> **Why?** Recently disclosed, Has a
fix available, CVSS 7.5 | Missing Release of Resource after Effective
Lifetime
<br/>[SNYK-JS-INFLIGHT-6095116](https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116)
| Yes | No Known Exploit

(*) Note that the real score may have changed since the PR was raised.





<details>
  <summary><b>Commit messages</b></summary>
  </br>
  <details>
    <summary>Package name: <b>react-query</b></summary>
    The new version differs by 1 commits.</br>
    <ul>
<li><a
href="https://snyk.io/redirect/github/TanStack/query/commit/357ec041a6fcc4a550f3df02c12ecc7bcdefbc05">357ec04</a>
v4 release (#3842)</li>
    </ul>

<a
href="https://snyk.io/redirect/github/TanStack/query/compare/ef684205cb4890db904db5b387513fb9042e0bb6...357ec041a6fcc4a550f3df02c12ecc7bcdefbc05">See
the full diff</a>
  </details>
</details>






Check the changes in this PR to ensure they won't cause issues with your
project.



------------



**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open fix PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiIyMzRmMTE2Yi0wYWFjLTRkOTMtYWRlZi0zMjNhMDgyMTQ2MzAiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjIzNGYxMTZiLTBhYWMtNGQ5My1hZGVmLTMyM2EwODIxNDYzMCJ9fQ=="
width="0" height="0"/>
🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr)

🛠 [Adjust project
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr/settings)

📚 [Read more about Snyk's upgrade and patch
logic](https://support.snyk.io/hc/en-us/articles/360003891078-Snyk-patches-to-fix-vulnerabilities)

[//]: #
(snyk:metadata:{"prId":"234f116b-0aac-4d93-adef-323a08214630","prPublicId":"234f116b-0aac-4d93-adef-323a08214630","dependencies":[{"name":"react-query","from":"3.39.3","to":"4.0.0"}],"packageManager":"npm","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=fix-pr","type":"auto","patch":[],"vulns":["SNYK-JS-INFLIGHT-6095116"],"upgrade":["SNYK-JS-INFLIGHT-6095116"],"isBreakingChange":true,"env":"prod","prType":"fix","templateVariants":["updated-fix-title","priorityScore"],"priorityScoreList":[661],"remediationStrategy":"vuln"})

---

**Learn how to fix vulnerabilities with free interactive lessons:**

🦉 [Learn about vulnerability in an interactive lesson of Snyk
Learn.](https://learn.snyk.io/?loc&#x3D;fix-pr)

Co-authored-by: snyk-bot <[email protected]>

* build(deps-dev): bump @adobe/css-tools from 4.3.1 to 4.3.2 in /tools/debug-ui (#10272)

Bumps [@adobe/css-tools](https://github.com/adobe/css-tools) from 4.3.1
to 4.3.2.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/adobe/css-tools/blob/main/History.md"><code>@​adobe/css-tools</code>'s
changelog</a>.</em></p>
<blockquote>
<h1>4.3.2 / 2023-11-28</h1>
<ul>
<li>Fix redos vulnerability with specific crafted css string -
CVE-2023-48631</li>
<li>Fix Problem parsing with :is() and nested :nth-child() <a
href="https://redirect.github.com/adobe/css-tools/issues/211">#211</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/adobe/css-tools/commits">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@adobe/css-tools&package-manager=npm_and_yarn&previous-version=4.3.1&new-version=4.3.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts page](https://github.com/near/nearcore/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update resharding.md (#10281)

Added some metrics from tests in mainnet and testnet. 

ref data mainnet https://nearinc.grafana.net/goto/aFBwfLHSg?orgId=1
ref data testnet https://nearinc.grafana.net/goto/XgBUBYNSg?orgId=1

* fix: Document HeaderSync (#10280)

Made no functional changes except:
* Replaced a tuple with a struct
* Introduced a function `made_enough_progress()` to make the code much
simpler to understand.
* Renamed a ban reason

* fix: format tcp connection error using `Display` (#10286)

Reported by @wacban.

Debug printing results in multiline strings, which are hard to
interpret. It also breaks tooling one might want to use to analyze logs.

Example:
```
2023-12-01T10:22:08.186809Z INFO network: failed to connect to ed25519:[email protected]:54063 result=Err(tcp::Stream::connect()
Caused by:
deadline has elapsed)
```

I believe this is coming from the default `Debug` impl for
`anyhow::Error`. Using `Display` impl should fix it as it concatenates
the context via `:` instead.

---------

Co-authored-by: nikurt <[email protected]>

* refactor: remove some more usage of `num_shards()` (#10291)

See https://github.com/near/nearcore/issues/10237.

* feat: limit the number of shards ids in SnapshotHostInfo (#10294)

`SnapshotHostInfo` contains a list of shard ids for which a peer has a
snapshot.
Under normal circumstances this list is pretty small - the maximum size
would be the total number of shards.
But a malicious peer could craft a `SnapshotHostInfo` message with very
large number of shards - millions of shard ids. This could cause
problems on the receiver node, so there has to be limit on the number of
shard ids in a message.

Let's limit the number of shard ids in a single message to
`MAX_SHARDS_PER_SNAPSHOT_HOST_INFO = 512`.
It's a constant that describes how many shards a single peer can have
snapshots for.
A peer doesn't keep more state snapshots than the number of tracked
shards, so this limit is reasonable. 512 shards ought to be enough for
anyone.

In an ideal world we could check the current number of shards and reject
messages that contain more shard ids than the current number, but sadly
this can't be implemented. The problem is that the receiving node might
be behind the rest of the blockchain, and the latest information just
isn't available, so it can't check what the current number of shards is.
We could reject messages in such situations, but this would lead to loss
of information.

Limiting the number of shard ids to a constant number is an okay
alternative.

* feat(resharding): dynamic config (#10290)

make the resharding config dynamic

* Remove rust-version.workspace = true from published crates (#10292)

This comes at the request of dev-hub, where dependencies downstream have
been having issues with our aggressive rust-version policy. Supporting
only the latest rust-version is not enough for them.

As a consequence, we’re removing rust-version here. This sounds like a
more semantically reasonable use for rust-version anyway: a crate
without rust-version set should be assumed to work with the latest
stable version anyway, and maybe more without guarantees… which is
exactly our guarantees.

Also update the themis tool to make sure we don’t make this mistake
again.

* [resharding] Add pytest for checking RPC calls after resharding (#10296)

This PR adds a basic pytest to check if the RPC calls to tx endpoint
work after a resharding event.

Note that this test currently works under the assumption that the node
is tracking all shards and future improvements to the tests where we may
need to redirect the request to a node tracking the specific shard we
are interested in, would come later.

Resolving https://github.com/near/nearcore/issues/5047

* build fuzzers on ubuntu-20.04 (#10299)

Currently, our clusterfuzz runners do not have the glibc version
required to run builds made on ubuntu-22.04.

Building fuzzers on ubuntu-20.04 should fix the issue (that is only
apparent in fuzzer logs); hopefully once we upgrade our clusterfuzz
runners we’ll be able to bump to a newer ubuntu LTS.

* refactor: Rename BodySync to BlockSync for consistency (#10293)

And a bit of documentation for header sync.
And a bit of documentation of block sync.
And a bit of refactoring of block sync.
And a tiny refactoring related to state sync.
And a lot of TODOs.

* fix(resharding): fix dynamic config (#10297)

Fixing the dynamic config since #10290 was accidentaly merged
prematurely before it was fully tested and fixed.
Tested on localnet for now, will then test on mocknet and only then
merge.

* refactor: don't use `Fn` when `FnOnce` will suffice (#10301)

This function calls the closure just once so no need to take a more
restrictive closure.

* enable resharding v2 (#10303)

# Feature to stabilize
This PR stabilizes the Resharding V2 protocol feature. It introduces a
new implementation for resharding and a new shard layout for the
production networks - mainnet and testnet. The resharding process from
the current shard layout to the new shard layout will be triggered
automatically an epoch before the switch to the new protocol version.

# Context

- https://github.com/near/NEPs/pull/508
- https://github.com/near/nearcore/issues/8992

# Testing and QA

This feature was extensively tested in unit tests, integration tests,
nayduck tests, mocknet, testnet and mainnet.

# Checklist
- [ ] nayduck - https://nayduck.near.org/#/run/3308 
- [x] Update CHANGELOG.md to include this protocol feature in the
`Unreleased` section.

* Reintroduce configurable cache size for the FlatState column (#10304)

One way to reduce flat state read latency during the NEAT incident was
to increase the cache size 3x.
As the config parameter was helpful during the incident, re-introduce
this config parameter.
Additionally make caches for State and FlatState configurable
separately.

* refactor: same treatment for `get_shard_uids()` as for `shard_ids()` (#10305)

- renames `get_shard_uids()` to `shard_uids()`
- `shard_uids()` return an iterator instead of a vector.

* refactor(state-sync): Request sync block in client actor before starting state sync (#10175)

We only use this logic for state sync when the nodes starts with old
blocks.
If the nodes has been running during the epoch change, it is supposed to
have the block so it does not need it at state sync during catchup.

* refactor: group runtime apply_transactions block/chunk-related arguments (#10279)

This PR groups block- and chunk-related
`RuntimeAdapter::apply_transactions` arguments into a separate structs.
It also replaces usage `update_shard::BlockContext` with
`ApplyTransactionsBlockContext` as well as a bit of refactoring around
`ShardUpdateReason` to only require data which is actually used.

Implements the first idea from
https://github.com/near/nearcore/issues/10261.

* fix: State Sync Header Request no longer crashes a node (#10313)

* feat: add a time limit for processing transactions in produce_chunk (#10310)

To produce a chunk the node fetches transactions from the transaction
pool and adds them to the chunk. Adding a transaction to the chunk can
be computationally expensive - the transaction is converted to receipt,
which burns gas. Because of that the number of transactions has to be
limited. The node will fetch transactions until some kind of limit is
reached, and then decide that the chunk is ready and publish it.

Currently we have a limit of gas that can be used for preparing
transactions, but there is a big problem with it - it doesn't take into
account discarding invalid transactions from the pool. Processing an
invalid transaction doesn't burn gas, so the node could spend a lot of
time discarding invalid transactions without ever reaching the limit.
This would make chunk production very slow and the others might decide
to just skip the chunk instead of waiting for it.

Let's add another limit to `prepare_transactions`: a time limit. When
producing a chunk the node will be allowed to add new transactions to
the chunk for up to X milliseconds. This will ensure that a chunk is
produced quickly, even when there are many invalid transactions.

Choosing a good value for the limit is difficult, so a new config option
is added to allow changing it on the fly:
`produce_chunk_add_transactions_time_limit`.

The default value for the time limit is 200ms. The reasoning for
choosing this value is as follows:
* Assuming that we want to produce ~1 block per second, 200ms is the
largest value that would support that. If my understanding of the flow
is correct, a 200ms chunk production would look like this:
  * Chunk producer produces a chunk (200ms)
  * Chunk producer publishes the chunk (50ms (?))
  * Validator receives the chunk
* Validator validates the transactions, redoing chunk producer's work
(200ms)
  * Validator runs receipts (500ms)
  
  This gives us a 1s time to produce a block.
* Looking at the metrics from mainnet, the P99 time to produce a chunk
is ~60ms (and maximum is similar). 200ms is more than three times that,
so it shouldn't break anything on the chain:
https://nearinc.grafana.net/d/cd668436-f19a-4f3d-b4a5-a35ebd3701b0/chunk-production-stats?from=now-12h&to=now&refresh=1h&orgId=1
* During the minting of NEAT, the P99 time to produce a chunk jumped to
~860ms. This is unacceptable, as this will cause the chain to produce
less than one block per second. This limit would prevent that.
https://nearinc.grafana.net/d/cd668436-f19a-4f3d-b4a5-a35ebd3701b0/chunk-production-stats?from=1701298800000&to=1701342000000&orgId=1

For a more detailed discussion, see the comments in
https://github.com/near/nearcore/issues/10278

Fixes: #10278

* fix(resharding): fix tests (#10314)

This should fix a bunch of the nayduck tests. 

https://nayduck.near.org/#/run/3318

* feat(chunk-validator-assignment): shuffle shard ids (#10298)

Introduces a shuffling of shard ids when assigning chunk validators to
shards. Without that shuffling it is predictable which shards receive
fewer (partial) mandates when they cannot be distributed evenly across
shards. See this
[comment](https://github.com/mooori/sim-validator-assignment/pull/12#discussion_r1389895314)
which also brings up the idea of shard id shuffling.

### Separate shuffles for full and partial mandate assignment

If there was only one shuffling for both full and partial mandates, then
the shard(s) that get a full mandate less may also get a partial mandate
less. Separate shufflings counter that and ideally (depending on
randomness) stake is distributed more evenly as shards that receive a
full mandate less may still get the maximum amount of partial mandates.

### Related issue

#10014

* docs(resharding) - described how to dynamically update the config (#10315)

* feat: stateless validation jobs in test mode (#10248)

This is a next step for #9982.
Here I introduce jobs which will perform stateless validation of newly
received chunk by executing txs and receipts.
Later they should be executed against state witness, but for now I just
set a foundation by running these jobs against state data in DB. All
passing tests verify that old and new jobs generate the same result.
The final switch will happen when stateful jobs will be replaced with
stateless ones.

### Details

This doesn't introduce any load on stable version. On nightly version
there will be `num_shards` extra jobs which will check that stateless
validation results are consistent with stateful execution. But as we use
nightly only for testing, it shouldn't mean much overhead.

I add more fields to `ShardContext` structure to simplify code. Some of
them are needed to break early if there is resharding, and the logic is
the same for both kinds of jobs.

`StorageDataSource::DbTrieOnly` is introduced to read data only from
trie in stateless jobs. This is annoying but still needed if there are a
lot of missing chunks and flat storage head moved above the block at
which previous chunk was created. When state witness will be
implemented, `Recorded` will be used instead.

## Testing

* Failure to update current_chunk_extra on the way leads to >20 tests
failing in process_blocks, with errors like `assertion `left == right`
failed: For stateless validation, chunk extras for block
CMV88CBcnKoxa7eTnkG64psLoJzpW9JeAhFrZBVv6zDc and shard s3.v2 do not
match...`
* If I update current_chunk_extra only once,
`tests::client::resharding::test_latest_protocol_missing_chunks_high_missing_prob`
fails which was specifically introduced for that. Actually this helped
to realize that `validate_chunk_with_chunk_extra` is still needed but I
will introduce it later.
* Nayduck: ~https://nayduck.near.org/#/run/3293 - +10 nightly tests
failing, will take a look~ https://nayduck.near.org/#/run/3300

---------

Co-authored-by: Longarithm <[email protected]>

* [Snyk] Upgrade @types/node from 16.18.3 to 16.18.62 (#10312)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade @types/node
from 16.18.3 to 16.18.62.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **59 versions** ahead of your current
version.
- The recommended version was released **22 days ago**, on 2023-11-18.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>@types/node</b></summary>
    <ul>
      <li>
        <b>16.18.62</b> - 2023-11-18
      </li>
      <li>
        <b>16.18.61</b> - 2023-11-07
      </li>
      <li>
        <b>16.18.60</b> - 2023-10-31
      </li>
      <li>
        <b>16.18.59</b> - 2023-10-18
      </li>
      <li>
        <b>16.18.58</b> - 2023-10-06
      </li>
      <li>
        <b>16.18.57</b> - 2023-10-02
      </li>
      <li>
        <b>16.18.56</b> - 2023-10-02
      </li>
      <li>
        <b>16.18.55</b> - 2023-09-29
      </li>
      <li>
        <b>16.18.54</b> - 2023-09-23
      </li>
      <li>
        <b>16.18.53</b> - 2023-09-20
      </li>
      <li>
        <b>16.18.52</b> - 2023-09-16
      </li>
      <li>
        <b>16.18.51</b> - 2023-09-15
      </li>
      <li>
        <b>16.18.50</b> - 2023-09-08
      </li>
      <li>
        <b>16.18.49</b> - 2023-09-08
      </li>
      <li>
        <b>16.18.48</b> - 2023-09-02
      </li>
      <li>
        <b>16.18.47</b> - 2023-09-01
      </li>
      <li>
        <b>16.18.46</b> - 2023-08-24
      </li>
      <li>
        <b>16.18.45</b> - 2023-08-24
      </li>
      <li>
        <b>16.18.44</b> - 2023-08-23
      </li>
      <li>
        <b>16.18.43</b> - 2023-08-22
      </li>
      <li>
        <b>16.18.42</b> - 2023-08-22
      </li>
      <li>
        <b>16.18.41</b> - 2023-08-17
      </li>
      <li>
        <b>16.18.40</b> - 2023-08-08
      </li>
      <li>
        <b>16.18.39</b> - 2023-07-21
      </li>
      <li>
        <b>16.18.38</b> - 2023-06-30
      </li>
      <li>
        <b>16.18.37</b> - 2023-06-26
      </li>
      <li>
        <b>16.18.36</b> - 2023-06-13
      </li>
      <li>
        <b>16.18.35</b> - 2023-06-10
      </li>
      <li>
        <b>16.18.34</b> - 2023-05-26
      </li>
      <li>
        <b>16.18.33</b> - 2023-05-25
      </li>
      <li>
        <b>16.18.32</b> - 2023-05-21
      </li>
      <li>
        <b>16.18.31</b> - 2023-05-16
      </li>
      <li>
        <b>16.18.30</b> - 2023-05-13
      </li>
      <li>
        <b>16.18.29</b> - 2023-05-11
      </li>
      <li>
        <b>16.18.28</b> - 2023-05-10
      </li>
      <li>
        <b>16.18.27</b> - 2023-05-08
      </li>
      <li>
        <b>16.18.26</b> - 2023-05-05
      </li>
      <li>
        <b>16.18.25</b> - 2023-04-25
      </li>
      <li>
        <b>16.18.24</b> - 2023-04-19
      </li>
      <li>
        <b>16.18.23</b> - 2023-03-30
      </li>
      <li>
        <b>16.18.22</b> - 2023-03-28
      </li>
      <li>
        <b>16.18.21</b> - 2023-03-25
      </li>
      <li>
        <b>16.18.20</b> - 2023-03-24
      </li>
      <li>
        <b>16.18.19</b> - 2023-03-23
      </li>
      <li>
        <b>16.18.18</b> - 2023-03-20
      </li>
      <li>
        <b>16.18.17</b> - 2023-03-20
      </li>
      <li>
        <b>16.18.16</b> - 2023-03-14
      </li>
      <li>
        <b>16.18.15</b> - 2023-03-13
      </li>
      <li>
        <b>16.18.14</b> - 2023-03-02
      </li>
      <li>
        <b>16.18.13</b> - 2023-02-26
      </li>
      <li>
        <b>16.18.12</b> - 2023-02-04
      </li>
      <li>
        <b>16.18.11</b> - 2022-12-26
      </li>
      <li>
        <b>16.18.10</b> - 2022-12-16
      </li>
      <li>
        <b>16.18.9</b> - 2022-12-13
      </li>
      <li>
        <b>16.18.8</b> - 2022-12-10
      </li>
      <li>
        <b>16.18.7</b> - 2022-12-08
      </li>
      <li>
        <b>16.18.6</b> - 2022-12-05
      </li>
      <li>
        <b>16.18.5</b> - 2022-12-05
      </li>
      <li>
        <b>16.18.4</b> - 2022-11-30
      </li>
      <li>
        <b>16.18.3</b> - 2022-10-30
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/DefinitelyTyped/DefinitelyTyped/releases">@types/node
GitHub release notes</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI0NTA4MzY5Mi1lOWNjLTQyMjYtOWRkMi01NDFhODBhNTYzYTgiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjQ1MDgzNjkyLWU5Y2MtNDIyNi05ZGQyLTU0MWE4MGE1NjNhOCJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;@types/node&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"45083692-e9cc-4226-9dd2-541a80a563a8","prPublicId":"45083692-e9cc-4226-9dd2-541a80a563a8","dependencies":[{"name":"@types/node","from":"16.18.3","to":"16.18.62"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":59,"publishedDate":"2023-11-18T20:08:25.418Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>

* test(resharding) - test for getting the shard layout info by rpc (#10320)

We need a way for near ecosystem developers to query the current shard
layout. The EXPERIMENTAL_protocol_config allows that although with some
extra steps. It should be good enough until we have time to implement a
dedicated endpoint just for the shard layout. In this PR I extended the
resharding nayduck test to check that the mentioned rpc endpoint works
as expected and that changes in the shard layout are reflected in the
rpc.

* fix: remove flakiness in the test try_map_result_stops_on_error (#10318)

`try_map_result` is a function which takes a list of tasks and runs them
on multiple threads producing task outputs until the first error occurs.

The test `try_map_result_stops_on_error` asks to execute an infinite
list of tasks, but the 100th task throws an error, so the function
should stop after executing ~100 tasks.

The test checked that the function produces outputs for the first 10
tasks, but this isn't always true. The first 10 tasks could end up on a
thread that is preempted and the tasks aren't executed before the error
is hit on the 100th task. Because of this the test is flaky.

I assumed that the first 10 tasks would be executed first, but this was
wrong, we can't assume anything here. Let's remove all checks that could
be broken by race conditions, no matter how unlikely. This makes the
test weaker, but at least it won't be flaky.

* make crates publish-able for other branches than master (#10322)

* Fix sync_ban.py (#10323)

The log message tracked by this test was changed.

* [Snyk] Upgrade @types/react-dom from 18.2.15 to 18.2.16 (#10324)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade
@types/react-dom from 18.2.15 to 18.2.16.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **1 version** ahead of your current
version.
- The recommended version was released **22 days ago**, on 2023-11-21.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>@types/react-dom</b></summary>
    <ul>
      <li>
        <b>18.2.16</b> - 2023-11-21
      </li>
      <li>
        <b>18.2.15</b> - 2023-11-07
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/DefinitelyTyped/DefinitelyTyped/releases">@types/react-dom
GitHub release notes</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiIyNjJjMzRiNi1iYjljLTQ2YjYtYmQzMy04NDdkZDU2ZjRiNDciLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjI2MmMzNGI2LWJiOWMtNDZiNi1iZDMzLTg0N2RkNTZmNGI0NyJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;@types/react-dom&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"262c34b6-bb9c-46b6-bd33-847dd56f4b47","prPublicId":"262c34b6-bb9c-46b6-bd33-847dd56f4b47","dependencies":[{"name":"@types/react-dom","from":"18.2.15","to":"18.2.16"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":1,"publishedDate":"2023-11-21T01:34:32.698Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>

* [Snyk] Upgrade @types/node from 16.18.62 to 16.18.63 (#10326)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade @types/node
from 16.18.62 to 16.18.63.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **1 version** ahead of your current
version.
- The recommended version was released **22 days ago**, on 2023-11-21.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>@types/node</b></summary>
    <ul>
      <li>
        <b>16.18.63</b> - 2023-11-21
      </li>
      <li>
        <b>16.18.62</b> - 2023-11-18
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/DefinitelyTyped/DefinitelyTyped/releases">@types/node
GitHub release notes</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI0NmJkMTg5Yy02MDg5LTRlNTQtOTZmMC0yOTFlNzZlY2ZkMzkiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjQ2YmQxODljLTYwODktNGU1NC05NmYwLTI5MWU3NmVjZmQzOSJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;@types/node&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"46bd189c-6089-4e54-96f0-291e76ecfd39","prPublicId":"46bd189c-6089-4e54-96f0-291e76ecfd39","dependencies":[{"name":"@types/node","from":"16.18.62","to":"16.18.63"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":1,"publishedDate":"2023-11-21T01:32:12.982Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>
Co-authored-by: nikurt <[email protected]>

* refactor: various cleanups and fixes in `chain.rs` (#10327)

get_state_response_part():
- remove the contiguous shard_ids assumption. Instead of checking the
shard id against the number of chunks, look up the list of shard ids
instead.
- since the epoch id is remains the same for the current and the prev
block, the set of shard ids should also remain the same so we only need
to do the check once.
- remove some unnecessary clones
- finally rename some variables to make them shorter. Mainly remove the
`sync_` prefix. I am not sure how much value this prefix is adding and
the shorter variables are still conveying the same amount of
information.


compute_state_response_header():
- Similar to above, remove the contiguous shard_ids assumption.  
- Remove some unnecessary clones and dereferences


save_receipt_id_to_shard_id_for_block():
- there is a potential bug in the function where if encounter an error
in middle of iteration, we do not roll back the changes. Hence, pre
compute the list of hashmaps before saving receipts.
- Take a list of shard ids instead of num_shards to remove the
contiguous shard ids assumption

* Remove a scary warning from GCS State Sync (#10329)

* [Snyk] Upgrade @types/react-dom from 18.2.16 to 18.2.17 (#10332)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade
@types/react-dom from 18.2.16 to 18.2.17.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **1 version** ahead of your current
version.
- The recommended version was released **22 days ago**, on 2023-11-22.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>@types/react-dom</b></summary>
    <ul>
      <li>
        <b>18.2.17</b> - 2023-11-22
      </li>
      <li>
        <b>18.2.16</b> - 2023-11-21
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/DefinitelyTyped/DefinitelyTyped/releases">@types/react-dom
GitHub release notes</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI3MTZkNzFlYS01ZDExLTRjYTAtYjA1NS05YzMzZjdlMDVlODUiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjcxNmQ3MWVhLTVkMTEtNGNhMC1iMDU1LTljMzNmN2UwNWU4NSJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;@types/react-dom&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"716d71ea-5d11-4ca0-b055-9c33f7e05e85","prPublicId":"716d71ea-5d11-4ca0-b055-9c33f7e05e85","dependencies":[{"name":"@types/react-dom","from":"18.2.16","to":"18.2.17"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":1,"publishedDate":"2023-11-22T00:59:09.852Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>

* [Snyk] Upgrade react-router-dom from 6.19.0 to 6.20.0 (#10331)

<p>This PR was automatically created by Snyk using the credentials of a
real user.</p><br /><h3>Snyk has created this PR to upgrade
react-router-dom from 6.19.0 to 6.20.0.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.
<hr/>

- The recommended version is **2 versions** ahead of your current
version.
- The recommended version was released **21 days ago**, on 2023-11-22.


<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>react-router-dom</b></summary>
    <ul>
      <li>
<b>6.20.0</b> - <a
href="https://snyk.io/redirect/github/remix-run/react-router/releases/tag/react-router-native%406.20.0">2023-11-22</a></br><p>[email protected]</p>
      </li>
      <li>
        <b>6.20.0-pre.0</b> - 2023-11-21
      </li>
      <li>
        <b>6.19.0</b> - 2023-11-16
      </li>
    </ul>
from <a
href="https://snyk.io/redirect/github/remix-run/react-router/releases">react-router-dom
GitHub release notes</a>
  </details>
</details>


<details>
  <summary><b>Commit messages</b></summary>
  </br>
  <details>
    <summary>Package name: <b>react-router-dom</b></summary>
    <ul>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/3cc38eac4753702a9a8a1fe239e2138d63ac6cc5">3cc38ea</a>
chore: Update version for release (#11050)</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/77862f95f71397d92b8b583a16674c56efccc55f">77862f9</a>
Exit prerelease mode</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/1621319ffa353bf33f33064d7611859df16286ee">1621319</a>
Update Release Notes TOC</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/f1f8ed0acffb3d6c2860c362fc2b376dbf87df24">f1f8ed0</a>
Update release notes</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/1e026b6f1ac34a774b4f77e5e3696251e8f79940">1e026b6</a>
chore: Update version for release (pre) (#11047)</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/4a08d64c368c07816e753632345a13b8da050111">4a08d64</a>
Enter prerelease mode</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/c0b4e12d12c5abdf5f7723e71959c4eb5e9effd9">c0b4e12</a>
Merge branch &#x27;main&#x27; into release-next</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/58d421fc4c592661a68dea59edc507fc4668ba5d">58d421f</a>
Fix other code paths for resolveTo from a splat route (#11045)</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/5f530a775cd266940f725894277b6ea7bc55b5d0">5f530a7</a>
Do not revalidate unmounted fetchers when v7_persistFetcher is enabled
(#11044)</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/f320378b5145f59bb266a35a7655b563f712daef">f320378</a>
Add additional test case for #10983</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/a48c43c8118bbf75b23b3ee748648bb3ee4d688e">a48c43c</a>
feat: export &#x60;PathParam&#x60; type (#10719)</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/1d56e55d3f95730f99617dff23cf153f82394921">1d56e55</a>
Remove tag links from headings in CHANGELOG.md</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/3b1a7364c730209b4baed9454c7f6c17c55e3ba8">3b1a736</a>
Fix flaky test</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/406a1ddecd399ede2a517d7cae5f3ee63d02ed91">406a1dd</a>
Merge branch &#x27;release-next&#x27; into dev</li>
<li><a
href="https://snyk.io/redirect/github/remix-run/react-router/commit/6a5939b07c06c9dacd82705645dbbbe46de90e5e">6a5939b</a>
Merge branch &#x27;release-next&#x27;</li>
    </ul>

<a
href="https://snyk.io/redirect/github/remix-run/react-router/compare/dcf0c2a85aac3a78059a287ea478ff12adcb6a2d...3cc38eac4753702a9a8a1fe239e2138d63ac6cc5">Compare</a>
  </details>
</details>
<hr/>

**Note:** *You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs.*

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiIyZmI3YjkxYi0zN2NiLTQzYzgtOWNkYS02ODAzNTFmYzMwNmQiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjJmYjdiOTFiLTM3Y2ItNDNjOC05Y2RhLTY4MDM1MWZjMzA2ZCJ9fQ=="
width="0" height="0"/>

🧐 [View latest project
report](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763/settings/integration?pkg&#x3D;react-router-dom&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

<!---
(snyk:metadata:{"prId":"2fb7b91b-37cb-43c8-9cda-680351fc306d","prPublicId":"2fb7b91b-37cb-43c8-9cda-680351fc306d","dependencies":[{"name":"react-router-dom","from":"6.19.0","to":"6.20.0"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/ecp88/project/98480bdc-d80b-4fd1-89d7-c4c56a706763?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"98480bdc-d80b-4fd1-89d7-c4c56a706763","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":2,"publishedDate":"2023-11-22T16:56:32.720Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]})
--->

Co-authored-by: snyk-bot <[email protected]>
Co-authored-by: nikurt <[email protected]>

* feat(resharding): making resharding interruptible (#10328)

Currently ctrl-c doesn't fully stop neard while it's in the middle of
resharding.
Adding StateSplitHandle that allows for stopping resharding in the
`build_state_for_split_shards` method.

to be tested in mocknet soon

* bump shared crates version to 0.18, as released on the 1.36.1 branch (#10336)

* better wording for workflow option (#10337)

* fix: remove potential flakiness from a snapshot_hosts test (#10317)

The test `snapshot_hosts::invalid_signature_not_broadcast` sends out a
message containing three instances of `SnapshotHostInfo`, one of which
has an invalid signature, and then verifies that this message is
rejected.

There is a subtelty here that I didn't take into account when I wrote
this test. When the `PeerManager` receives a message with multiple
`SnapshotHostInfos`, it can accept the valid instances, even in the case
where there are other invalid instances in the message. Because of this
the test could fail - `PeerManager` could accept `ok_info_a` or
`ok_info_b` and then the final assert would fail. Whether it accepts
them or not depends on the timing, as the instances are processed on
multiple threads and the processing stops at the first invalid instance.
Because of that the test could be flaky.

Let's fix it by filtering out `ok_info_a` and `ok_info_b` in the final
check. This way even if the `PeerManager` accepts them, it won't break
the test. The code is the same as in
`snapshot_hosts::too_many_shards_not_broadcast()`.

* Implement simple state witness distribution, chunk validation, and chunk approval distribution skeletons. (#10287)

This is a pretty rough PR, but I'm making an attempt to concretely
implement the flow from distributing the state witness to sending the
chunk endorsement. The following is left out: (1) production of the
state witness; (2) actual validation logic; (3) receiving the chunk
endorsement. However, the skeleton of the flow is there, including
multithreading of the validation logic.

Very open to comments.

* nit: remove unnecessary `?` and `return`s in chain.rs (#10340)

* init project

* Wallet Contract placeholder (#10269)

## Context
NEP: https://github.com/near/NEPs/issues/518
Tracking issue: https://github.com/near/nearcore/issues/10018.

### Goal
We want the NEAR Protocol's ecosystem to be closer with Ethereum by
integrating Web3 wallet support.
To accomplish that, some changes on the protocol level are needed with
an emphasis on user experience continuity.
Following the design, the main change on the protocol level would be to
have ETH-style addresses managed by a new `Wallet Contract` integrated
into the protocol. For seamless onboarding of EVM users, the contract
will be free of charge.

### Previous work
This PR is built on top of two PRs:
* https://github.com/near/nearcore/pull/10020: no-op PR, laying
groundwork for further changes.
* https://github.com/near/nearcore/pull/10224: empty contract as a
placeholder, literally deployed to new ETH accounts.

## Summary
This PR adds `near-wallet-contract` crate (based on
`runtime/near-test-contracts`) that exposes `Wallet Contract` WASM code
to the runtime.
It stops deploying a copy of the `Wallet Contract` to each newly created
ETH-implicit account.
Instead, it uses an in-memory cached contract code on
`execute_function_call` action from such account.

### Changes
- Add `wallet-contract` crate (separated from the workspace) with
placeholder `Wallet Contract` implementation.
- Add `near-wallet-contract` crate (part of the workspace) that
generates (through `build.rs`) and exposes the `Wallet Contract` WASM
code.
- Do not literally deploy `Wallet Contract` when creating ETH-implicit
account. Just store reference to the `Wallet Contract`.
- Treat ETH-implicit accounts specially when retrieving contract code
from an account (in such case returns in-memory cached `Wallet Contract`
code).
- Add tests calling `Wallet Contract` where a transfer from an
ETH-implicit account is possible depending on the public key passed with
`rlp_transa…
github-merge-queue bot pushed a commit to near/nearcore that referenced this issue Apr 8, 2024
This PR adds the eth wallet contract implementation which will be
automatically deployed with eth implicit accounts. This is as per the
design outlined in near/NEPs#518 .

It is intentional that the wallet contract implementation is isolated as
its own crate and not contained in the broader nearcore workspace. This
allows it to be reviewed, tested and audited independently from the rest
of the Near code. The crate includes integration tests written using
`near-workspaces`. However, the nearcore integration test related to the
wallet contract has also been updated to check that the contract is
automatically deployed when creating an eth address and that it works as
expected.

This will not be the last PR in this project because I am only adding
the logic for the implementation. It still remains to setup the
reproducible build pipeline and update the tests which check the
contract hashes. Additionally, there are still a few details which need
to be finalized: (1) the Ethereum chain ID that will be associated with
Near and (2) the Near account ID that will have the eth address
registrar contract deployed. The eth address registrar contract stores a
reverse lookup of Ethereum-like address to Near account IDs. It is
necessary for the wallet contract to detect faulty relayers.

However this (relatively large) PR can be reviewed and merged, and the
points above will be addressed in much more manageable follow-up PRs.
@victorchimakanu
Copy link

Hello everyone, I'd like to understand the current status of this NEP? Can we nominate reviewers and discuss low-level details of the implementation?

@birchmd
Copy link
Contributor

birchmd commented Jun 3, 2024

There is an implementation prepared under a nightly feature of nearcore and it is currently being audited. The proposal also has support from the infrastructure working group (they already have a tracking issue related to tasks associated with the proposal). I suggest we move forward with the review and voting stage for the protocol change parts of this proposal (which is just the wallet contract and eth-implicit accounts).

@victorchimakanu
Copy link

Thank you @alexauroradev for submitting this NEP.

As a moderator, I reviewed this NEP and it meets the proposed template guidelines. I am moving this NEP to the REVIEW stage and would like to ask the @near/wg-protocol working group members to assign 2 Technical Reviewers to complete a technical review.

github-merge-queue bot pushed a commit to near/nearcore that referenced this issue Jul 8, 2024
…#11606)

The eth-implicit accounts feature had been assuming that all Ethereum
address-like accounts would be [created
implicitly](https://github.com/near/nearcore/blob/c020ee5bf48c0426b3913497550c2b639c7f7f73/runtime/runtime/src/actions.rs#L505)
(via a `Transfer` action as opposed to the `CreateAccount` action) and
therefore always have [the wallet contract "magic bytes"
deployed](https://github.com/near/nearcore/blob/c020ee5bf48c0426b3913497550c2b639c7f7f73/runtime/runtime/src/actions.rs#L582).
This invariant is maintained after account creation because the wallet
contract [does not allow adding full-access
keys](https://github.com/near/nearcore/blob/c020ee5bf48c0426b3913497550c2b639c7f7f73/runtime/near-wallet-contract/implementation/wallet-contract/src/lib.rs#L312)
and therefore deploying different contract code is impossible.

However, on Near today there are already 5552 accounts (attached list:
[eth_addresses.txt](https://github.com/user-attachments/files/15892188/eth_addresses.txt))
that will be [classified as eth-implicit
accounts](https://github.com/near/near-account-id-rs/blob/86b3003c28760c6d83e32fc81439da1ce83edd6e/src/validation.rs#L96).
These accounts do have full access keys and therefore can have any
arbitrary Wasm code deployed to them. Thus the supposed invariant of all
eth-implicit accounts having the magic bytes deployed is in fact already
broken.

This PR removes the `assert` from the runtime which was checking this
invariant.

As a side note, the broader [web3 wallets
project](near/NEPs#518) will blacklist these
5552 accounts in the relayer implementation since the relayer also
operations on the assumption that the accounts it interacts with will
have the protocol-level wallet contract deployed and this assumption
cannot be guaranteed on "legacy" eth-implicit accounts.
@bowenwang1996
Copy link
Collaborator

As a working group member, I nominate @akhi3030 and @nagisa as SME reviewers

@akhi3030
Copy link
Contributor

I only see an issue here and not a PR for the NEP. Is there a link to the NEP?

@birchmd
Copy link
Contributor

birchmd commented Jul 22, 2024

@akhi3030 I'll make a PR which contains this issue description. For now please treat the issue description as the NEP.

@akhi3030
Copy link
Contributor

akhi3030 commented Jul 22, 2024

@birchmd: thanks, I will start with the issue description. It will be great to have the PR eventually as that will make it easier to review and provide feedback.

@ori-near ori-near added S-review/needs-sme-review A NEP in the REVIEW stage is waiting for Subject Matter Expert review. and removed S-draft/needs-author-revision A NEP in the DRAFT stage that needs an author revision. S-draft/needs-implementation A NEP in the DRAFT stage that needs implementation. labels Jul 22, 2024
birchmd added a commit to aurora-is-near/NEPs that referenced this issue Jul 22, 2024
birchmd added a commit to aurora-is-near/NEPs that referenced this issue Jul 22, 2024
@birchmd
Copy link
Contributor

birchmd commented Jul 22, 2024

@akhi3030 I have created the PR: #555

gambinish added a commit to MetaMask/metamask-extension that referenced this issue Aug 16, 2024
## **Description**

Adds NEAR Icon for ChainId `397` and `398`. These chains are currently
new networks being integrated onto EVM. They are currently in
development, but it was requested from their team to preemptively add
these icons, before production RPC endpoints are available.

For context, here is their proposal:
near/NEPs#518

https://chainlist.org/chain/397
https://chainlist.org/chain/398

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/26459?quickstart=1)

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MMASSETS-343

## **Manual testing steps**

Once production RPCs are available, these icons should appear when NEAR
RPC gets added in custom networks.

## **Screenshots/Recordings**

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-NEP A NEAR Enhancement Proposal (NEP). S-review/needs-sme-review A NEP in the REVIEW stage is waiting for Subject Matter Expert review. WG-protocol Protocol Standards Work Group should be accountable
Projects
Status: REVIEW
Development

No branches or pull requests