diff --git a/ACP-520.pdf b/ACP-520.pdf new file mode 100644 index 0000000..daf5e0c Binary files /dev/null and b/ACP-520.pdf differ diff --git a/Aptos Labs | Accelerating the Future of Web3 b/Aptos Labs | Accelerating the Future of Web3 new file mode 100644 index 0000000..3e82e89 --- /dev/null +++ b/Aptos Labs | Accelerating the Future of Web3 @@ -0,0 +1 @@ +Aptos Labs | Accelerating the Future of Web3
[ CLOSE X ]
Aptos Labs v1.01

Bringing the future on-chain

00
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
▽ Scroll ▽
user 865
user 240

About Us |Who we are ¬

01

Make your next career move

[
View open roles
]

Who we are

Aptos Labs is a team of visionaries, researchers, strategists, designers, and builders—all committed to bringing decentralization to the masses.

Our research and development is focused on creating products and applications for the Aptos blockchain that redefine the user experience and accelerate the future of Web3.

Products

[
Discover more
]

Aptos Labs in the news

2024-12-19

Announcing the Next Phase of Aptos Labs with Avery Ching as CEO

via x.com
[
Read article
]
2024-11-25

Aptos Labs Expands Advisory Board With Grayscale and OpenAI Veterans

via medium.com
[
Read article
]
2024-10-03

Aptos Labs Acquires HashPalette and Enters Japan Market

via cointelegraph.com
[
Read article
]
2024-06-20

Aptos Labs and NBCUniversal Ink Long-Term Partnership

via decrypt.co
[
Read article
]
user 493
user 347

Products |Dive into Web3 with products designed for users, builders, and beyond ¬

02

Petra Wallet

Safely store and manage all your assets with a self-custodial wallet.

[
Get a wallet
]

Aptos Connect

Bring a seamless Web3 login and transaction experience to your apps. Users can connect an Aptos account with OAuth and social login through Google, Twitter, or Facebook.

[
See how it works
]

Geomi

Build better dApps with essential tools designed for seamless API access, effortless NFT integration, and secure Web3 logins.

[
Start building
]

Aptos Names

Choose and register your Aptos identity for Web3.

[
Pick a name
]
user 531
user 129

Backers |Backed by the world’s leading investors & cutting-edge partners ¬

03

Backed by the world’s leading investors & cutting-edge partners

Partners

Google Cloud Logo
Mastercard Logo
Microsoft Logo
NBC Universal Logo

Investors

Andressen Horowitz Logo
Apollo Logo
Dragonfly Logo
Franklin Templeton Logo
Multicoin Capital Logo
PayPal Logo
user 529
user 683

Featured Press |Experience the next chapter of the internet first-hand ¬

04
2024-12-19

Announcing the Next Phase of Aptos Labs with Avery Ching as CEO

via x.com
[
Read
]
2024-12-10

Aptos' Avery Ching: Building Bridges to TradFi

via coindesk.com
[
Read
]
2024-11-25

Aptos Labs Expands Advisory Board With Grayscale and OpenAI Veterans

via medium.com
[
Read
]
2024-11-21

Aptos Labs Leads Investment Round for KGeN (Kratos Gamer Network)

via igamingbusiness.com
[
Read
]
2024-10-03

Aptos Labs Acquires HashPalette and Enters Japan Market

via cointelegraph.com
[
Read
]
2024-09-06

Libre launches Brevan Howard, BlackRock, Hamilton Lane funds on Aptos

via cointelegraph.com
[
Read
]
2024-06-20

Aptos Labs and NBCUniversal Ink Long-Term Partnership

via decrypt.co
[
Read
]
2024-04-18

Aptos Ascend Launches in Partnership with Microsoft, Brevan Howard, SK Telecom

via coindesk.com
[
Read
]
user 720
user 979

Timeline |We’re a growing company, with big ambitions ¬

05

An exciting new chapter begins. Avery Ching steps in as Aptos Labs CEO.

Welcome to the Aptos Labs family, HashPalette!

The world Experienced Aptos in Seoul—vibes were immaculate.

Partnership with NBCUniversal strengthens, with more amazing fan experiences to come.

Aptos Ascend launches in partnership with Microsoft, Brevan Howard, SK Telecom.

Aptos Labs & Google Cloud team up to elevate Web3 gaming.

Launching the very first secure and instant on-chain randomness API for PoS blockchains.

Inaugural Summit in partnership with Aptos Foundation—bringing together 30+ ecosystem projects.

Aptos Labs opens its New York City office.

Partnership with Alibaba Cloud to bolster Web3 accessibility in APAC.

Graffio, Aptos Labs’ first decentralized social application, became Web3’s overnight sensation. Happy anniversary to Mainnet.

Partnership with Microsoft to usher in a new age of AI x Blockchain.

Launched Unity SDK for Web3 gaming.

Magic in the lab…the first NFT meet up.

Announcing new partnerships with Google Cloud, NPIXEL, and MoonPay.

Launched Aptos Mainnet: the first Move-based blockchain.

Raised Series A with participation from Dragonfly, Apollo, Franklin Templeton and others.

Aptos Labs was founded to fulfill the vision of bringing fair access to decentralization to all. Raised seed funding led by a16z crypto.

user 953
user 530
\ No newline at end of file diff --git a/BitcoinStamps.md b/BitcoinStamps.md index ce42ec7..38f8a72 100644 --- a/BitcoinStamps.md +++ b/BitcoinStamps.md @@ -70,4 +70,51 @@ Users are able to trade the token on the Counterparty DEX, Dispensers or OTC or ## Future Partnerships There have been ongoing discussions with Emblem, Leather Wallet and Token.Art dev teams. +rust + libbitcoinkernel full-node. +Project Status + +work-in-progress. + +code available at: +git clone git://bitcoinbackbone.org:/public-release.git (head commit ef48074639) + + +latest updates: +block 901661 +00000000000000000001e7bf624e4a45ee8649838b89da9e4413be1b96875223 +block 908976 +000000000000000000014348a2a22e1000287a88e47803cf24623c118afbda14 +block 918215 +00000000000000000000ded924e66cd2d2098c55b272dee2e65c34fb0d2bb06b +block 924179 +00000000000000000001926920b77e91c3c10dddbd7b75ee5f01e3bb3fda83cf +block 935128 +0000000000000000000122e2402b324ee1d7a9fd692f17b87078f64e4a891893 + +Backbone Architecture + + +native multi-process with subsystems-dedicated daemons + + + mempool_mngrd tx_relayd + | | + | | + ------------------- + | + | + tx_controllerd + | + | + backbone-cli - - - - - - backboned + | + | + --------------------------------- + | | | + | | | + addr_controllerd block_relayd topo_mngrd + + +stamp (sha256): +b844f17c2f84d3e26035935eccebb5f68abd0ba2f780cb7c7d13e6f0fccfe3ad diff --git a/README.md b/README.md index 27b3f7d..45b5d48 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,47 @@ +--- +title: Welcome to WDK +description: >- + Build secure, multi-chain, self-custodial wallets for any device with minimal + effort and infinite scalability +icon: rocket +layout: + width: default + title: + visible: true + description: + visible: true + tableOfContents: + visible: true + outline: + visible: true + pagination: + visible: false + metadata: + visible: false +--- -# STAMPS: A Protocol for Storing Images On-Chain in Transaction Outputs Immutably on Bitcoin +# Welcome -**IMPORTANT NOTICE: STAMPS IS A BLOCKCHAIN-AGNOSTIC PROTOCOL.
-FOR RULES SPECIFIC TO THE BITCOIN STAMPS PROJECT, PLEASE VISIT:
-https://github.com/mikeinspace/stamps/blob/main/BitcoinStamps.md** +The **Wallet Development Kit _by Tether_ (WDK)** is Tether's open-source toolkit that empowers humans, machines and AI agents alike to build, deploy and use secure, multi-chain, self-custodial wallets that can be integrated anywhere from the smallest embedded device to any mobile, desktop and server operating system. WDK enables trillions of self-custodial wallets. +WDK provides a set of core libraries that give you the highest level of control and a wide range of user-interface templates and widgets to maximize your development and deployment speed. -- [Classic Bitcoin Stamps](BitcoinStamps.md) -- [Octet Linked Graphics & Artifacts(OLGA) Stamps](OLGA.md) -- [SRC-20 Token Specification on Bitcoin Stamps](SRC20.md) \ No newline at end of file +{% embed url="https://www.youtube.com/embed/15IRw2mAFR0?si=6lEdGgHlHgRcwnN6" %} + +*** + +### Discover WDK + +
Cover image
About WDKUnderstand WDK core features and design principlesabout.mdabout.png
Our VisionDiscover our philosophy and idea for the future walletsvision.mdvision.png
Key ConceptsLearn foundational concepts and terminologyconcepts.mdconcepts.png
+ +*** + +### Start Building + +
:code:Node.js QuickstartGet started with WDK in a Node.js environmentnodejs-bare-quickstart.md
:mobile-alt:React Native QuickstartBuild mobile wallets with React Native Exporeact-native-quickstart.md
:microchip:Bare Runtime QuickstartDeploy WDK in lightweight environmentsnodejs-bare-quickstart.md
:puzzle-piece:UI KitExplore our React Native UI Kit with pre-built componentsreact-native-ui-kit
+ +*** + +### Get Involved + +{% include ".gitbook/includes/get-involved-cards.md" %} diff --git a/beacon-chain.md b/beacon-chain.md new file mode 100644 index 0000000..b2e9924 --- /dev/null +++ b/beacon-chain.md @@ -0,0 +1,1739 @@ +# Electra -- The Beacon Chain + + + +- [Introduction](#introduction) +- [Constants](#constants) + - [Misc](#misc) + - [Withdrawal prefixes](#withdrawal-prefixes) + - [Execution layer triggered requests](#execution-layer-triggered-requests) +- [Preset](#preset) + - [Gwei values](#gwei-values) + - [Rewards and penalties](#rewards-and-penalties) + - [State list lengths](#state-list-lengths) + - [Max operations per block](#max-operations-per-block) + - [Execution](#execution) + - [Withdrawals processing](#withdrawals-processing) + - [Pending deposits processing](#pending-deposits-processing) +- [Configuration](#configuration) + - [Execution](#execution-1) + - [Validator cycle](#validator-cycle) +- [Containers](#containers) + - [New containers](#new-containers) + - [`PendingDeposit`](#pendingdeposit) + - [`PendingPartialWithdrawal`](#pendingpartialwithdrawal) + - [`PendingConsolidation`](#pendingconsolidation) + - [`DepositRequest`](#depositrequest) + - [`WithdrawalRequest`](#withdrawalrequest) + - [`ConsolidationRequest`](#consolidationrequest) + - [`ExecutionRequests`](#executionrequests) + - [`SingleAttestation`](#singleattestation) + - [Modified containers](#modified-containers) + - [`AttesterSlashing`](#attesterslashing) + - [`BeaconBlockBody`](#beaconblockbody) + - [Modified containers](#modified-containers-1) + - [`Attestation`](#attestation) + - [`IndexedAttestation`](#indexedattestation) + - [`BeaconState`](#beaconstate) +- [Helper functions](#helper-functions) + - [Predicates](#predicates) + - [Modified `compute_proposer_index`](#modified-compute_proposer_index) + - [Modified `is_eligible_for_activation_queue`](#modified-is_eligible_for_activation_queue) + - [New `is_compounding_withdrawal_credential`](#new-is_compounding_withdrawal_credential) + - [New `has_compounding_withdrawal_credential`](#new-has_compounding_withdrawal_credential) + - [New `has_execution_withdrawal_credential`](#new-has_execution_withdrawal_credential) + - [Modified `is_fully_withdrawable_validator`](#modified-is_fully_withdrawable_validator) + - [Modified `is_partially_withdrawable_validator`](#modified-is_partially_withdrawable_validator) + - [Misc](#misc-1) + - [New `get_committee_indices`](#new-get_committee_indices) + - [New `get_max_effective_balance`](#new-get_max_effective_balance) + - [Beacon state accessors](#beacon-state-accessors) + - [New `get_balance_churn_limit`](#new-get_balance_churn_limit) + - [New `get_activation_exit_churn_limit`](#new-get_activation_exit_churn_limit) + - [New `get_consolidation_churn_limit`](#new-get_consolidation_churn_limit) + - [New `get_pending_balance_to_withdraw`](#new-get_pending_balance_to_withdraw) + - [Modified `get_attesting_indices`](#modified-get_attesting_indices) + - [Modified `get_next_sync_committee_indices`](#modified-get_next_sync_committee_indices) + - [Beacon state mutators](#beacon-state-mutators) + - [Modified `initiate_validator_exit`](#modified-initiate_validator_exit) + - [New `switch_to_compounding_validator`](#new-switch_to_compounding_validator) + - [New `queue_excess_active_balance`](#new-queue_excess_active_balance) + - [New `compute_exit_epoch_and_update_churn`](#new-compute_exit_epoch_and_update_churn) + - [New `compute_consolidation_epoch_and_update_churn`](#new-compute_consolidation_epoch_and_update_churn) + - [Modified `slash_validator`](#modified-slash_validator) +- [Beacon chain state transition function](#beacon-chain-state-transition-function) + - [Epoch processing](#epoch-processing) + - [Modified `process_epoch`](#modified-process_epoch) + - [Modified `process_registry_updates`](#modified-process_registry_updates) + - [Modified `process_slashings`](#modified-process_slashings) + - [New `apply_pending_deposit`](#new-apply_pending_deposit) + - [New `process_pending_deposits`](#new-process_pending_deposits) + - [New `process_pending_consolidations`](#new-process_pending_consolidations) + - [Modified `process_effective_balance_updates`](#modified-process_effective_balance_updates) + - [Execution engine](#execution-engine) + - [Request data](#request-data) + - [Modified `NewPayloadRequest`](#modified-newpayloadrequest) + - [Engine APIs](#engine-apis) + - [Modified `is_valid_block_hash`](#modified-is_valid_block_hash) + - [Modified `notify_new_payload`](#modified-notify_new_payload) + - [Modified `verify_and_notify_new_payload`](#modified-verify_and_notify_new_payload) + - [Block processing](#block-processing) + - [Withdrawals](#withdrawals) + - [Modified `get_expected_withdrawals`](#modified-get_expected_withdrawals) + - [Modified `process_withdrawals`](#modified-process_withdrawals) + - [Execution payload](#execution-payload) + - [New `get_execution_requests_list`](#new-get_execution_requests_list) + - [Modified `process_execution_payload`](#modified-process_execution_payload) + - [Operations](#operations) + - [Modified `process_operations`](#modified-process_operations) + - [Attestations](#attestations) + - [Modified `process_attestation`](#modified-process_attestation) + - [Deposits](#deposits) + - [Modified `get_validator_from_deposit`](#modified-get_validator_from_deposit) + - [Modified `add_validator_to_registry`](#modified-add_validator_to_registry) + - [Modified `apply_deposit`](#modified-apply_deposit) + - [New `is_valid_deposit_signature`](#new-is_valid_deposit_signature) + - [Modified `process_deposit`](#modified-process_deposit) + - [Voluntary exits](#voluntary-exits) + - [Modified `process_voluntary_exit`](#modified-process_voluntary_exit) + - [Execution layer withdrawal requests](#execution-layer-withdrawal-requests) + - [New `process_withdrawal_request`](#new-process_withdrawal_request) + - [Deposit requests](#deposit-requests) + - [New `process_deposit_request`](#new-process_deposit_request) + - [Execution layer consolidation requests](#execution-layer-consolidation-requests) + - [New `is_valid_switch_to_compounding_request`](#new-is_valid_switch_to_compounding_request) + - [New `process_consolidation_request`](#new-process_consolidation_request) + + + +## Introduction + +Electra is a consensus-layer upgrade containing a number of features. Including: + +- [EIP-6110](https://eips.ethereum.org/EIPS/eip-6110): Supply validator deposits + on chain +- [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002): Execution layer + triggerable exits +- [EIP-7251](https://eips.ethereum.org/EIPS/eip-7251): Increase the + MAX_EFFECTIVE_BALANCE +- [EIP-7549](https://eips.ethereum.org/EIPS/eip-7549): Move committee index + outside Attestation +- [EIP-7691](https://eips.ethereum.org/EIPS/eip-7691): Blob throughput increase + +*Note*: This specification is built upon [Deneb](../deneb/beacon-chain.md) and +is under active development. + +## Constants + +The following values are (non-configurable) constants used throughout the +specification. + +### Misc + +| Name | Value | Description | +| ------------------------------------ | ------------------- | --------------------------------------------------------------------------------- | +| `UNSET_DEPOSIT_REQUESTS_START_INDEX` | `uint64(2**64 - 1)` | *[New in Electra:EIP6110]* Value which indicates no start index has been assigned | +| `FULL_EXIT_REQUEST_AMOUNT` | `uint64(0)` | *[New in Electra:EIP7002]* Withdrawal amount used to signal a full validator exit | + +### Withdrawal prefixes + +| Name | Value | Description | +| ------------------------------- | ---------------- | ----------------------------------------------------------------------------------- | +| `COMPOUNDING_WITHDRAWAL_PREFIX` | `Bytes1('0x02')` | *[New in Electra:EIP7251]* Withdrawal credential prefix for a compounding validator | + +### Execution layer triggered requests + +| Name | Value | +| ---------------------------- | ---------------- | +| `DEPOSIT_REQUEST_TYPE` | `Bytes1('0x00')` | +| `WITHDRAWAL_REQUEST_TYPE` | `Bytes1('0x01')` | +| `CONSOLIDATION_REQUEST_TYPE` | `Bytes1('0x02')` | + +## Preset + +### Gwei values + +| Name | Value | Description | +| ------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- | +| `MIN_ACTIVATION_BALANCE` | `Gwei(2**5 * 10**9)` (= 32,000,000,000) | *[New in Electra:EIP7251]* Minimum balance for a validator to become active | +| `MAX_EFFECTIVE_BALANCE_ELECTRA` | `Gwei(2**11 * 10**9)` (= 2048,000,000,000) | *[New in Electra:EIP7251]* Maximum effective balance for a compounding validator | + +### Rewards and penalties + +| Name | Value | +| --------------------------------------- | ------------------------- | +| `MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA` | `uint64(2**12)` (= 4,096) | +| `WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA` | `uint64(2**12)` (= 4,096) | + +### State list lengths + +| Name | Value | Unit | +| ----------------------------------- | ------------------------------- | --------------------------- | +| `PENDING_DEPOSITS_LIMIT` | `uint64(2**27)` (= 134,217,728) | pending deposits | +| `PENDING_PARTIAL_WITHDRAWALS_LIMIT` | `uint64(2**27)` (= 134,217,728) | pending partial withdrawals | +| `PENDING_CONSOLIDATIONS_LIMIT` | `uint64(2**18)` (= 262,144) | pending consolidations | + +### Max operations per block + +| Name | Value | +| -------------------------------- | ------------ | +| `MAX_ATTESTER_SLASHINGS_ELECTRA` | `2**0` (= 1) | +| `MAX_ATTESTATIONS_ELECTRA` | `2**3` (= 8) | + +### Execution + +| Name | Value | Description | +| ---------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------- | +| `MAX_DEPOSIT_REQUESTS_PER_PAYLOAD` | `uint64(2**13)` (= 8,192) | *[New in Electra:EIP6110]* Maximum number of execution layer deposit requests in each payload | +| `MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD` | `uint64(2**4)` (= 16) | *[New in Electra:EIP7002]* Maximum number of execution layer withdrawal requests in each payload | +| `MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD` | `uint64(2**1)` (= 2) | *[New in Electra:EIP7251]* Maximum number of execution layer consolidation requests in each payload | + +### Withdrawals processing + +| Name | Value | Description | +| -------------------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------- | +| `MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP` | `uint64(2**3)` (= 8) | *[New in Electra:EIP7002]* Maximum number of pending partial withdrawals to process per payload | + +### Pending deposits processing + +| Name | Value | Description | +| -------------------------------- | --------------------- | ---------------------------------------------------------------------------------- | +| `MAX_PENDING_DEPOSITS_PER_EPOCH` | `uint64(2**4)` (= 16) | *[New in Electra:EIP6110]* Maximum number of pending deposits to process per epoch | + +## Configuration + +### Execution + +| Name | Value | Description | +| ----------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------- | +| `MAX_BLOBS_PER_BLOCK_ELECTRA` | `uint64(9)` | *[New in Electra:EIP7691]* Maximum number of blobs in a single block limited by `MAX_BLOB_COMMITMENTS_PER_BLOCK` | + +### Validator cycle + +| Name | Value | +| ------------------------------------------- | ---------------------------------------- | +| `MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA` | `Gwei(2**7 * 10**9)` (= 128,000,000,000) | +| `MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT` | `Gwei(2**8 * 10**9)` (= 256,000,000,000) | + +## Containers + +### New containers + +#### `PendingDeposit` + +*Note*: The container is new in EIP7251. + +```python +class PendingDeposit(Container): + pubkey: BLSPubkey + withdrawal_credentials: Bytes32 + amount: Gwei + signature: BLSSignature + slot: Slot +``` + +#### `PendingPartialWithdrawal` + +*Note*: The container is new in EIP7251. + +```python +class PendingPartialWithdrawal(Container): + validator_index: ValidatorIndex + amount: Gwei + withdrawable_epoch: Epoch +``` + +#### `PendingConsolidation` + +*Note*: The container is new in EIP7251. + +```python +class PendingConsolidation(Container): + source_index: ValidatorIndex + target_index: ValidatorIndex +``` + +#### `DepositRequest` + +*Note*: The container is new in EIP6110. + +```python +class DepositRequest(Container): + pubkey: BLSPubkey + withdrawal_credentials: Bytes32 + amount: Gwei + signature: BLSSignature + index: uint64 +``` + +#### `WithdrawalRequest` + +*Note*: The container is new in EIP7251:EIP7002. + +```python +class WithdrawalRequest(Container): + source_address: ExecutionAddress + validator_pubkey: BLSPubkey + amount: Gwei +``` + +#### `ConsolidationRequest` + +*Note*: The container is new in EIP7251. + +```python +class ConsolidationRequest(Container): + source_address: ExecutionAddress + source_pubkey: BLSPubkey + target_pubkey: BLSPubkey +``` + +#### `ExecutionRequests` + +```python +class ExecutionRequests(Container): + deposits: List[DepositRequest, MAX_DEPOSIT_REQUESTS_PER_PAYLOAD] # [New in Electra:EIP6110] + withdrawals: List[WithdrawalRequest, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD] # [New in Electra:EIP7002:EIP7251] + consolidations: List[ConsolidationRequest, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD] # [New in Electra:EIP7251] +``` + +#### `SingleAttestation` + +```python +class SingleAttestation(Container): + committee_index: CommitteeIndex + attester_index: ValidatorIndex + data: AttestationData + signature: BLSSignature +``` + +### Modified containers + +#### `AttesterSlashing` + +```python +class AttesterSlashing(Container): + attestation_1: IndexedAttestation # [Modified in Electra:EIP7549] + attestation_2: IndexedAttestation # [Modified in Electra:EIP7549] +``` + +#### `BeaconBlockBody` + +```python +class BeaconBlockBody(Container): + randao_reveal: BLSSignature + eth1_data: Eth1Data # Eth1 data vote + graffiti: Bytes32 # Arbitrary data + # Operations + proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS] + attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS_ELECTRA] # [Modified in Electra:EIP7549] + attestations: List[Attestation, MAX_ATTESTATIONS_ELECTRA] # [Modified in Electra:EIP7549] + deposits: List[Deposit, MAX_DEPOSITS] + voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS] + sync_aggregate: SyncAggregate + # Execution + execution_payload: ExecutionPayload + bls_to_execution_changes: List[SignedBLSToExecutionChange, MAX_BLS_TO_EXECUTION_CHANGES] + blob_kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK] + execution_requests: ExecutionRequests # [New in Electra] +``` + +### Modified containers + +#### `Attestation` + +```python +class Attestation(Container): + aggregation_bits: Bitlist[MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT] # [Modified in Electra:EIP7549] + data: AttestationData + signature: BLSSignature + committee_bits: Bitvector[MAX_COMMITTEES_PER_SLOT] # [New in Electra:EIP7549] +``` + +#### `IndexedAttestation` + +```python +class IndexedAttestation(Container): + # [Modified in Electra:EIP7549] + attesting_indices: List[ValidatorIndex, MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT] + data: AttestationData + signature: BLSSignature +``` + +#### `BeaconState` + +```python +class BeaconState(Container): + # Versioning + genesis_time: uint64 + genesis_validators_root: Root + slot: Slot + fork: Fork + # History + latest_block_header: BeaconBlockHeader + block_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT] + state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT] + historical_roots: List[Root, HISTORICAL_ROOTS_LIMIT] + # Eth1 + eth1_data: Eth1Data + eth1_data_votes: List[Eth1Data, EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH] + eth1_deposit_index: uint64 + # Registry + validators: List[Validator, VALIDATOR_REGISTRY_LIMIT] + balances: List[Gwei, VALIDATOR_REGISTRY_LIMIT] + # Randomness + randao_mixes: Vector[Bytes32, EPOCHS_PER_HISTORICAL_VECTOR] + # Slashings + slashings: Vector[Gwei, EPOCHS_PER_SLASHINGS_VECTOR] # Per-epoch sums of slashed effective balances + # Participation + previous_epoch_participation: List[ParticipationFlags, VALIDATOR_REGISTRY_LIMIT] + current_epoch_participation: List[ParticipationFlags, VALIDATOR_REGISTRY_LIMIT] + # Finality + justification_bits: Bitvector[JUSTIFICATION_BITS_LENGTH] # Bit set for every recent justified epoch + previous_justified_checkpoint: Checkpoint + current_justified_checkpoint: Checkpoint + finalized_checkpoint: Checkpoint + # Inactivity + inactivity_scores: List[uint64, VALIDATOR_REGISTRY_LIMIT] + # Sync + current_sync_committee: SyncCommittee + next_sync_committee: SyncCommittee + # Execution + latest_execution_payload_header: ExecutionPayloadHeader + # Withdrawals + next_withdrawal_index: WithdrawalIndex + next_withdrawal_validator_index: ValidatorIndex + # Deep history valid from Capella onwards + historical_summaries: List[HistoricalSummary, HISTORICAL_ROOTS_LIMIT] + deposit_requests_start_index: uint64 # [New in Electra:EIP6110] + deposit_balance_to_consume: Gwei # [New in Electra:EIP7251] + exit_balance_to_consume: Gwei # [New in Electra:EIP7251] + earliest_exit_epoch: Epoch # [New in Electra:EIP7251] + consolidation_balance_to_consume: Gwei # [New in Electra:EIP7251] + earliest_consolidation_epoch: Epoch # [New in Electra:EIP7251] + pending_deposits: List[PendingDeposit, PENDING_DEPOSITS_LIMIT] # [New in Electra:EIP7251] + # [New in Electra:EIP7251] + pending_partial_withdrawals: List[PendingPartialWithdrawal, PENDING_PARTIAL_WITHDRAWALS_LIMIT] + pending_consolidations: List[PendingConsolidation, PENDING_CONSOLIDATIONS_LIMIT] # [New in Electra:EIP7251] +``` + +## Helper functions + +### Predicates + +#### Modified `compute_proposer_index` + +*Note*: The function `compute_proposer_index` is modified to use +`MAX_EFFECTIVE_BALANCE_ELECTRA` and to use a 16-bit random value instead of an +8-bit random byte in the effective balance filter. + +```python +def compute_proposer_index(state: BeaconState, indices: Sequence[ValidatorIndex], seed: Bytes32) -> ValidatorIndex: + """ + Return from ``indices`` a random index sampled by effective balance. + """ + assert len(indices) > 0 + MAX_RANDOM_VALUE = 2**16 - 1 # [Modified in Electra] + i = uint64(0) + total = uint64(len(indices)) + while True: + candidate_index = indices[compute_shuffled_index(i % total, total, seed)] + # [Modified in Electra] + random_bytes = hash(seed + uint_to_bytes(i // 16)) + offset = i % 16 * 2 + random_value = bytes_to_uint64(random_bytes[offset:offset + 2]) + effective_balance = state.validators[candidate_index].effective_balance + # [Modified in Electra:EIP7251] + if effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value: + return candidate_index + i += 1 +``` + +#### Modified `is_eligible_for_activation_queue` + +*Note*: The function `is_eligible_for_activation_queue` is modified to use +`MIN_ACTIVATION_BALANCE` instead of `MAX_EFFECTIVE_BALANCE`. + +```python +def is_eligible_for_activation_queue(validator: Validator) -> bool: + """ + Check if ``validator`` is eligible to be placed into the activation queue. + """ + return ( + validator.activation_eligibility_epoch == FAR_FUTURE_EPOCH + and validator.effective_balance >= MIN_ACTIVATION_BALANCE # [Modified in Electra:EIP7251] + ) +``` + +#### New `is_compounding_withdrawal_credential` + +```python +def is_compounding_withdrawal_credential(withdrawal_credentials: Bytes32) -> bool: + return withdrawal_credentials[:1] == COMPOUNDING_WITHDRAWAL_PREFIX +``` + +#### New `has_compounding_withdrawal_credential` + +```python +def has_compounding_withdrawal_credential(validator: Validator) -> bool: + """ + Check if ``validator`` has an 0x02 prefixed "compounding" withdrawal credential. + """ + return is_compounding_withdrawal_credential(validator.withdrawal_credentials) +``` + +#### New `has_execution_withdrawal_credential` + +```python +def has_execution_withdrawal_credential(validator: Validator) -> bool: + """ + Check if ``validator`` has a 0x01 or 0x02 prefixed withdrawal credential. + """ + return has_compounding_withdrawal_credential(validator) or has_eth1_withdrawal_credential(validator) +``` + +#### Modified `is_fully_withdrawable_validator` + +*Note*: The function `is_fully_withdrawable_validator` is modified to use +`has_execution_withdrawal_credential` instead of +`has_eth1_withdrawal_credential`. + +```python +def is_fully_withdrawable_validator(validator: Validator, balance: Gwei, epoch: Epoch) -> bool: + """ + Check if ``validator`` is fully withdrawable. + """ + return ( + has_execution_withdrawal_credential(validator) # [Modified in Electra:EIP7251] + and validator.withdrawable_epoch <= epoch + and balance > 0 + ) +``` + +#### Modified `is_partially_withdrawable_validator` + +*Note*: The function `is_partially_withdrawable_validator` is modified to use +`get_max_effective_balance` instead of `MAX_EFFECTIVE_BALANCE` and +`has_execution_withdrawal_credential` instead of +`has_eth1_withdrawal_credential`. + +```python +def is_partially_withdrawable_validator(validator: Validator, balance: Gwei) -> bool: + """ + Check if ``validator`` is partially withdrawable. + """ + max_effective_balance = get_max_effective_balance(validator) + has_max_effective_balance = validator.effective_balance == max_effective_balance # [Modified in Electra:EIP7251] + has_excess_balance = balance > max_effective_balance # [Modified in Electra:EIP7251] + return ( + has_execution_withdrawal_credential(validator) # [Modified in Electra:EIP7251] + and has_max_effective_balance + and has_excess_balance + ) +``` + +### Misc + +#### New `get_committee_indices` + +```python +def get_committee_indices(committee_bits: Bitvector) -> Sequence[CommitteeIndex]: + return [CommitteeIndex(index) for index, bit in enumerate(committee_bits) if bit] +``` + +#### New `get_max_effective_balance` + +```python +def get_max_effective_balance(validator: Validator) -> Gwei: + """ + Get max effective balance for ``validator``. + """ + if has_compounding_withdrawal_credential(validator): + return MAX_EFFECTIVE_BALANCE_ELECTRA + else: + return MIN_ACTIVATION_BALANCE +``` + +### Beacon state accessors + +#### New `get_balance_churn_limit` + +```python +def get_balance_churn_limit(state: BeaconState) -> Gwei: + """ + Return the churn limit for the current epoch. + """ + churn = max( + MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA, + get_total_active_balance(state) // CHURN_LIMIT_QUOTIENT + ) + return churn - churn % EFFECTIVE_BALANCE_INCREMENT +``` + +#### New `get_activation_exit_churn_limit` + +```python +def get_activation_exit_churn_limit(state: BeaconState) -> Gwei: + """ + Return the churn limit for the current epoch dedicated to activations and exits. + """ + return min(MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT, get_balance_churn_limit(state)) +``` + +#### New `get_consolidation_churn_limit` + +```python +def get_consolidation_churn_limit(state: BeaconState) -> Gwei: + return get_balance_churn_limit(state) - get_activation_exit_churn_limit(state) +``` + +#### New `get_pending_balance_to_withdraw` + +```python +def get_pending_balance_to_withdraw(state: BeaconState, validator_index: ValidatorIndex) -> Gwei: + return sum( + withdrawal.amount for withdrawal in state.pending_partial_withdrawals + if withdrawal.validator_index == validator_index + ) +``` + +#### Modified `get_attesting_indices` + +*Note*: The function `get_attesting_indices` is modified to support EIP7549. + +```python +def get_attesting_indices(state: BeaconState, attestation: Attestation) -> Set[ValidatorIndex]: + """ + Return the set of attesting indices corresponding to ``aggregation_bits`` and ``committee_bits``. + """ + output: Set[ValidatorIndex] = set() + committee_indices = get_committee_indices(attestation.committee_bits) + committee_offset = 0 + for committee_index in committee_indices: + committee = get_beacon_committee(state, attestation.data.slot, committee_index) + committee_attesters = set( + attester_index for i, attester_index in enumerate(committee) + if attestation.aggregation_bits[committee_offset + i] + ) + output = output.union(committee_attesters) + + committee_offset += len(committee) + + return output +``` + +#### Modified `get_next_sync_committee_indices` + +*Note*: The function `get_next_sync_committee_indices` is modified to use +`MAX_EFFECTIVE_BALANCE_ELECTRA` and to use a 16-bit random value instead of an +8-bit random byte in the effective balance filter. + +```python +def get_next_sync_committee_indices(state: BeaconState) -> Sequence[ValidatorIndex]: + """ + Return the sync committee indices, with possible duplicates, for the next sync committee. + """ + epoch = Epoch(get_current_epoch(state) + 1) + + MAX_RANDOM_VALUE = 2**16 - 1 # [Modified in Electra] + active_validator_indices = get_active_validator_indices(state, epoch) + active_validator_count = uint64(len(active_validator_indices)) + seed = get_seed(state, epoch, DOMAIN_SYNC_COMMITTEE) + i = uint64(0) + sync_committee_indices: List[ValidatorIndex] = [] + while len(sync_committee_indices) < SYNC_COMMITTEE_SIZE: + shuffled_index = compute_shuffled_index(uint64(i % active_validator_count), active_validator_count, seed) + candidate_index = active_validator_indices[shuffled_index] + # [Modified in Electra] + random_bytes = hash(seed + uint_to_bytes(i // 16)) + offset = i % 16 * 2 + random_value = bytes_to_uint64(random_bytes[offset:offset + 2]) + effective_balance = state.validators[candidate_index].effective_balance + # [Modified in Electra:EIP7251] + if effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value: + sync_committee_indices.append(candidate_index) + i += 1 + return sync_committee_indices +``` + +### Beacon state mutators + +#### Modified `initiate_validator_exit` + +*Note*: The function `initiate_validator_exit` is modified to use the new +`compute_exit_epoch_and_update_churn` function. + +```python +def initiate_validator_exit(state: BeaconState, index: ValidatorIndex) -> None: + """ + Initiate the exit of the validator with index ``index``. + """ + # Return if validator already initiated exit + validator = state.validators[index] + if validator.exit_epoch != FAR_FUTURE_EPOCH: + return + + # Compute exit queue epoch [Modified in Electra:EIP7251] + exit_queue_epoch = compute_exit_epoch_and_update_churn(state, validator.effective_balance) + + # Set validator exit epoch and withdrawable epoch + validator.exit_epoch = exit_queue_epoch + validator.withdrawable_epoch = Epoch(validator.exit_epoch + MIN_VALIDATOR_WITHDRAWABILITY_DELAY) +``` + +#### New `switch_to_compounding_validator` + +```python +def switch_to_compounding_validator(state: BeaconState, index: ValidatorIndex) -> None: + validator = state.validators[index] + validator.withdrawal_credentials = COMPOUNDING_WITHDRAWAL_PREFIX + validator.withdrawal_credentials[1:] + queue_excess_active_balance(state, index) +``` + +#### New `queue_excess_active_balance` + +```python +def queue_excess_active_balance(state: BeaconState, index: ValidatorIndex) -> None: + balance = state.balances[index] + if balance > MIN_ACTIVATION_BALANCE: + excess_balance = balance - MIN_ACTIVATION_BALANCE + state.balances[index] = MIN_ACTIVATION_BALANCE + validator = state.validators[index] + # Use bls.G2_POINT_AT_INFINITY as a signature field placeholder + # and GENESIS_SLOT to distinguish from a pending deposit request + state.pending_deposits.append(PendingDeposit( + pubkey=validator.pubkey, + withdrawal_credentials=validator.withdrawal_credentials, + amount=excess_balance, + signature=bls.G2_POINT_AT_INFINITY, + slot=GENESIS_SLOT, + )) +``` + +#### New `compute_exit_epoch_and_update_churn` + +```python +def compute_exit_epoch_and_update_churn(state: BeaconState, exit_balance: Gwei) -> Epoch: + earliest_exit_epoch = max(state.earliest_exit_epoch, compute_activation_exit_epoch(get_current_epoch(state))) + per_epoch_churn = get_activation_exit_churn_limit(state) + # New epoch for exits. + if state.earliest_exit_epoch < earliest_exit_epoch: + exit_balance_to_consume = per_epoch_churn + else: + exit_balance_to_consume = state.exit_balance_to_consume + + # Exit doesn't fit in the current earliest epoch. + if exit_balance > exit_balance_to_consume: + balance_to_process = exit_balance - exit_balance_to_consume + additional_epochs = (balance_to_process - 1) // per_epoch_churn + 1 + earliest_exit_epoch += additional_epochs + exit_balance_to_consume += additional_epochs * per_epoch_churn + + # Consume the balance and update state variables. + state.exit_balance_to_consume = exit_balance_to_consume - exit_balance + state.earliest_exit_epoch = earliest_exit_epoch + + return state.earliest_exit_epoch +``` + +#### New `compute_consolidation_epoch_and_update_churn` + +```python +def compute_consolidation_epoch_and_update_churn(state: BeaconState, consolidation_balance: Gwei) -> Epoch: + earliest_consolidation_epoch = max( + state.earliest_consolidation_epoch, compute_activation_exit_epoch(get_current_epoch(state))) + per_epoch_consolidation_churn = get_consolidation_churn_limit(state) + # New epoch for consolidations. + if state.earliest_consolidation_epoch < earliest_consolidation_epoch: + consolidation_balance_to_consume = per_epoch_consolidation_churn + else: + consolidation_balance_to_consume = state.consolidation_balance_to_consume + + # Consolidation doesn't fit in the current earliest epoch. + if consolidation_balance > consolidation_balance_to_consume: + balance_to_process = consolidation_balance - consolidation_balance_to_consume + additional_epochs = (balance_to_process - 1) // per_epoch_consolidation_churn + 1 + earliest_consolidation_epoch += additional_epochs + consolidation_balance_to_consume += additional_epochs * per_epoch_consolidation_churn + + # Consume the balance and update state variables. + state.consolidation_balance_to_consume = consolidation_balance_to_consume - consolidation_balance + state.earliest_consolidation_epoch = earliest_consolidation_epoch + + return state.earliest_consolidation_epoch +``` + +#### Modified `slash_validator` + +*Note*: The function `slash_validator` is modified to change how the slashing +penalty and proposer/whistleblower rewards are calculated in accordance with +EIP7251. + +```python +def slash_validator(state: BeaconState, + slashed_index: ValidatorIndex, + whistleblower_index: ValidatorIndex=None) -> None: + """ + Slash the validator with index ``slashed_index``. + """ + epoch = get_current_epoch(state) + initiate_validator_exit(state, slashed_index) + validator = state.validators[slashed_index] + validator.slashed = True + validator.withdrawable_epoch = max(validator.withdrawable_epoch, Epoch(epoch + EPOCHS_PER_SLASHINGS_VECTOR)) + state.slashings[epoch % EPOCHS_PER_SLASHINGS_VECTOR] += validator.effective_balance + # [Modified in Electra:EIP7251] + slashing_penalty = validator.effective_balance // MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA + decrease_balance(state, slashed_index, slashing_penalty) + + # Apply proposer and whistleblower rewards + proposer_index = get_beacon_proposer_index(state) + if whistleblower_index is None: + whistleblower_index = proposer_index + whistleblower_reward = Gwei( + validator.effective_balance // WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA) # [Modified in Electra:EIP7251] + proposer_reward = Gwei(whistleblower_reward * PROPOSER_WEIGHT // WEIGHT_DENOMINATOR) + increase_balance(state, proposer_index, proposer_reward) + increase_balance(state, whistleblower_index, Gwei(whistleblower_reward - proposer_reward)) +``` + +## Beacon chain state transition function + +### Epoch processing + +#### Modified `process_epoch` + +*Note*: The function `process_epoch` is modified to call updated functions and +to process pending balance deposits and pending consolidations which are new in +Electra. + +```python +def process_epoch(state: BeaconState) -> None: + process_justification_and_finalization(state) + process_inactivity_updates(state) + process_rewards_and_penalties(state) + process_registry_updates(state) # [Modified in Electra:EIP7251] + process_slashings(state) # [Modified in Electra:EIP7251] + process_eth1_data_reset(state) + process_pending_deposits(state) # [New in Electra:EIP7251] + process_pending_consolidations(state) # [New in Electra:EIP7251] + process_effective_balance_updates(state) # [Modified in Electra:EIP7251] + process_slashings_reset(state) + process_randao_mixes_reset(state) + process_historical_summaries_update(state) + process_participation_flag_updates(state) + process_sync_committee_updates(state) +``` + +#### Modified `process_registry_updates` + +*Note*: The function `process_registry_updates` is modified to use the updated +definitions of `initiate_validator_exit` and `is_eligible_for_activation_queue`, +changes how the activation epochs are computed for eligible validators, and +processes activations in the same loop as activation eligibility updates and +ejections. + +```python +def process_registry_updates(state: BeaconState) -> None: + current_epoch = get_current_epoch(state) + activation_epoch = compute_activation_exit_epoch(current_epoch) + + # Process activation eligibility, ejections, and activations + for index, validator in enumerate(state.validators): + if is_eligible_for_activation_queue(validator): # [Modified in Electra:EIP7251] + validator.activation_eligibility_epoch = current_epoch + 1 + elif is_active_validator(validator, current_epoch) and validator.effective_balance <= EJECTION_BALANCE: + initiate_validator_exit(state, ValidatorIndex(index)) # [Modified in Electra:EIP7251] + elif is_eligible_for_activation(state, validator): + validator.activation_epoch = activation_epoch +``` + +#### Modified `process_slashings` + +*Note*: The function `process_slashings` is modified to use a new algorithm to +compute correlation penalty. + +```python +def process_slashings(state: BeaconState) -> None: + epoch = get_current_epoch(state) + total_balance = get_total_active_balance(state) + adjusted_total_slashing_balance = min( + sum(state.slashings) * PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX, + total_balance + ) + increment = EFFECTIVE_BALANCE_INCREMENT # Factored out from total balance to avoid uint64 overflow + penalty_per_effective_balance_increment = adjusted_total_slashing_balance // (total_balance // increment) + for index, validator in enumerate(state.validators): + if validator.slashed and epoch + EPOCHS_PER_SLASHINGS_VECTOR // 2 == validator.withdrawable_epoch: + effective_balance_increments = validator.effective_balance // increment + # [Modified in Electra:EIP7251] + penalty = penalty_per_effective_balance_increment * effective_balance_increments + decrease_balance(state, ValidatorIndex(index), penalty) +``` + +#### New `apply_pending_deposit` + +```python +def apply_pending_deposit(state: BeaconState, deposit: PendingDeposit) -> None: + """ + Applies ``deposit`` to the ``state``. + """ + validator_pubkeys = [v.pubkey for v in state.validators] + if deposit.pubkey not in validator_pubkeys: + # Verify the deposit signature (proof of possession) which is not checked by the deposit contract + if is_valid_deposit_signature( + deposit.pubkey, + deposit.withdrawal_credentials, + deposit.amount, + deposit.signature + ): + add_validator_to_registry(state, deposit.pubkey, deposit.withdrawal_credentials, deposit.amount) + else: + validator_index = ValidatorIndex(validator_pubkeys.index(deposit.pubkey)) + increase_balance(state, validator_index, deposit.amount) +``` + +#### New `process_pending_deposits` + +Iterating over `pending_deposits` queue this function runs the following checks +before applying pending deposit: + +1. All Eth1 bridge deposits are processed before the first deposit request gets + processed. +2. Deposit position in the queue is finalized. +3. Deposit does not exceed the `MAX_PENDING_DEPOSITS_PER_EPOCH` limit. +4. Deposit does not exceed the activation churn limit. + +```python +def process_pending_deposits(state: BeaconState) -> None: + next_epoch = Epoch(get_current_epoch(state) + 1) + available_for_processing = state.deposit_balance_to_consume + get_activation_exit_churn_limit(state) + processed_amount = 0 + next_deposit_index = 0 + deposits_to_postpone = [] + is_churn_limit_reached = False + finalized_slot = compute_start_slot_at_epoch(state.finalized_checkpoint.epoch) + + for deposit in state.pending_deposits: + # Do not process deposit requests if Eth1 bridge deposits are not yet applied. + if ( + # Is deposit request + deposit.slot > GENESIS_SLOT and + # There are pending Eth1 bridge deposits + state.eth1_deposit_index < state.deposit_requests_start_index + ): + break + + # Check if deposit has been finalized, otherwise, stop processing. + if deposit.slot > finalized_slot: + break + + # Check if number of processed deposits has not reached the limit, otherwise, stop processing. + if next_deposit_index >= MAX_PENDING_DEPOSITS_PER_EPOCH: + break + + # Read validator state + is_validator_exited = False + is_validator_withdrawn = False + validator_pubkeys = [v.pubkey for v in state.validators] + if deposit.pubkey in validator_pubkeys: + validator = state.validators[ValidatorIndex(validator_pubkeys.index(deposit.pubkey))] + is_validator_exited = validator.exit_epoch < FAR_FUTURE_EPOCH + is_validator_withdrawn = validator.withdrawable_epoch < next_epoch + + if is_validator_withdrawn: + # Deposited balance will never become active. Increase balance but do not consume churn + apply_pending_deposit(state, deposit) + elif is_validator_exited: + # Validator is exiting, postpone the deposit until after withdrawable epoch + deposits_to_postpone.append(deposit) + else: + # Check if deposit fits in the churn, otherwise, do no more deposit processing in this epoch. + is_churn_limit_reached = processed_amount + deposit.amount > available_for_processing + if is_churn_limit_reached: + break + + # Consume churn and apply deposit. + processed_amount += deposit.amount + apply_pending_deposit(state, deposit) + + # Regardless of how the deposit was handled, we move on in the queue. + next_deposit_index += 1 + + state.pending_deposits = state.pending_deposits[next_deposit_index:] + deposits_to_postpone + + # Accumulate churn only if the churn limit has been hit. + if is_churn_limit_reached: + state.deposit_balance_to_consume = available_for_processing - processed_amount + else: + state.deposit_balance_to_consume = Gwei(0) +``` + +#### New `process_pending_consolidations` + +```python +def process_pending_consolidations(state: BeaconState) -> None: + next_epoch = Epoch(get_current_epoch(state) + 1) + next_pending_consolidation = 0 + for pending_consolidation in state.pending_consolidations: + source_validator = state.validators[pending_consolidation.source_index] + if source_validator.slashed: + next_pending_consolidation += 1 + continue + if source_validator.withdrawable_epoch > next_epoch: + break + + # Calculate the consolidated balance + source_effective_balance = min( + state.balances[pending_consolidation.source_index], source_validator.effective_balance) + + # Move active balance to target. Excess balance is withdrawable. + decrease_balance(state, pending_consolidation.source_index, source_effective_balance) + increase_balance(state, pending_consolidation.target_index, source_effective_balance) + next_pending_consolidation += 1 + + state.pending_consolidations = state.pending_consolidations[next_pending_consolidation:] +``` + +#### Modified `process_effective_balance_updates` + +*Note*: The function `process_effective_balance_updates` is modified to use the +new limit for the maximum effective balance. + +```python +def process_effective_balance_updates(state: BeaconState) -> None: + # Update effective balances with hysteresis + for index, validator in enumerate(state.validators): + balance = state.balances[index] + HYSTERESIS_INCREMENT = uint64(EFFECTIVE_BALANCE_INCREMENT // HYSTERESIS_QUOTIENT) + DOWNWARD_THRESHOLD = HYSTERESIS_INCREMENT * HYSTERESIS_DOWNWARD_MULTIPLIER + UPWARD_THRESHOLD = HYSTERESIS_INCREMENT * HYSTERESIS_UPWARD_MULTIPLIER + # [Modified in Electra:EIP7251] + max_effective_balance = get_max_effective_balance(validator) + + if ( + balance + DOWNWARD_THRESHOLD < validator.effective_balance + or validator.effective_balance + UPWARD_THRESHOLD < balance + ): + validator.effective_balance = min(balance - balance % EFFECTIVE_BALANCE_INCREMENT, max_effective_balance) +``` + +### Execution engine + +#### Request data + +##### Modified `NewPayloadRequest` + +```python +@dataclass +class NewPayloadRequest(object): + execution_payload: ExecutionPayload + versioned_hashes: Sequence[VersionedHash] + parent_beacon_block_root: Root + execution_requests: ExecutionRequests # [New in Electra] +``` + +#### Engine APIs + +##### Modified `is_valid_block_hash` + +*Note*: The function `is_valid_block_hash` is modified to include the additional +`execution_requests_list`. + +```python +def is_valid_block_hash(self: ExecutionEngine, + execution_payload: ExecutionPayload, + parent_beacon_block_root: Root, + execution_requests_list: Sequence[bytes]) -> bool: + """ + Return ``True`` if and only if ``execution_payload.block_hash`` is computed correctly. + """ + ... +``` + +##### Modified `notify_new_payload` + +*Note*: The function `notify_new_payload` is modified to include the additional +`execution_requests_list`. + +```python +def notify_new_payload(self: ExecutionEngine, + execution_payload: ExecutionPayload, + parent_beacon_block_root: Root, + execution_requests_list: Sequence[bytes]) -> bool: + """ + Return ``True`` if and only if ``execution_payload`` and ``execution_requests_list`` + are valid with respect to ``self.execution_state``. + """ + ... +``` + +##### Modified `verify_and_notify_new_payload` + +*Note*: The function `verify_and_notify_new_payload` is modified to pass the +additional parameter `execution_requests_list` when calling +`is_valid_block_hash` and `notify_new_payload` in Electra. + +```python +def verify_and_notify_new_payload(self: ExecutionEngine, + new_payload_request: NewPayloadRequest) -> bool: + """ + Return ``True`` if and only if ``new_payload_request`` is valid with respect to ``self.execution_state``. + """ + execution_payload = new_payload_request.execution_payload + parent_beacon_block_root = new_payload_request.parent_beacon_block_root + execution_requests_list = get_execution_requests_list(new_payload_request.execution_requests) # [New in Electra] + + if b'' in execution_payload.transactions: + return False + + # [Modified in Electra] + if not self.is_valid_block_hash( + execution_payload, + parent_beacon_block_root, + execution_requests_list): + return False + + if not self.is_valid_versioned_hashes(new_payload_request): + return False + + # [Modified in Electra] + if not self.notify_new_payload( + execution_payload, + parent_beacon_block_root, + execution_requests_list): + return False + + return True +``` + +### Block processing + +```python +def process_block(state: BeaconState, block: BeaconBlock) -> None: + process_block_header(state, block) + process_withdrawals(state, block.body.execution_payload) # [Modified in Electra:EIP7251] + process_execution_payload(state, block.body, EXECUTION_ENGINE) # [Modified in Electra:EIP6110] + process_randao(state, block.body) + process_eth1_data(state, block.body) + process_operations(state, block.body) # [Modified in Electra:EIP6110:EIP7002:EIP7549:EIP7251] + process_sync_aggregate(state, block.body.sync_aggregate) +``` + +#### Withdrawals + +##### Modified `get_expected_withdrawals` + +*Note*: The function `get_expected_withdrawals` is modified to support EIP7251. + +```python +def get_expected_withdrawals(state: BeaconState) -> Tuple[Sequence[Withdrawal], uint64]: + epoch = get_current_epoch(state) + withdrawal_index = state.next_withdrawal_index + validator_index = state.next_withdrawal_validator_index + withdrawals: List[Withdrawal] = [] + processed_partial_withdrawals_count = 0 + + # [New in Electra:EIP7251] Consume pending partial withdrawals + for withdrawal in state.pending_partial_withdrawals: + if withdrawal.withdrawable_epoch > epoch or len(withdrawals) == MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: + break + + validator = state.validators[withdrawal.validator_index] + has_sufficient_effective_balance = validator.effective_balance >= MIN_ACTIVATION_BALANCE + total_withdrawn = sum(w.amount for w in withdrawals if w.validator_index == withdrawal.validator_index) + balance = state.balances[withdrawal.validator_index] - total_withdrawn + has_excess_balance = balance > MIN_ACTIVATION_BALANCE + if validator.exit_epoch == FAR_FUTURE_EPOCH and has_sufficient_effective_balance and has_excess_balance: + withdrawable_balance = min( + balance - MIN_ACTIVATION_BALANCE, + withdrawal.amount) + withdrawals.append(Withdrawal( + index=withdrawal_index, + validator_index=withdrawal.validator_index, + address=ExecutionAddress(validator.withdrawal_credentials[12:]), + amount=withdrawable_balance, + )) + withdrawal_index += WithdrawalIndex(1) + + processed_partial_withdrawals_count += 1 + + # Sweep for remaining. + bound = min(len(state.validators), MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP) + for _ in range(bound): + validator = state.validators[validator_index] + # [Modified in Electra:EIP7251] + total_withdrawn = sum(w.amount for w in withdrawals if w.validator_index == validator_index) + balance = state.balances[validator_index] - total_withdrawn + if is_fully_withdrawable_validator(validator, balance, epoch): + withdrawals.append(Withdrawal( + index=withdrawal_index, + validator_index=validator_index, + address=ExecutionAddress(validator.withdrawal_credentials[12:]), + amount=balance, + )) + withdrawal_index += WithdrawalIndex(1) + elif is_partially_withdrawable_validator(validator, balance): + withdrawals.append(Withdrawal( + index=withdrawal_index, + validator_index=validator_index, + address=ExecutionAddress(validator.withdrawal_credentials[12:]), + amount=balance - get_max_effective_balance(validator), # [Modified in Electra:EIP7251] + )) + withdrawal_index += WithdrawalIndex(1) + if len(withdrawals) == MAX_WITHDRAWALS_PER_PAYLOAD: + break + validator_index = ValidatorIndex((validator_index + 1) % len(state.validators)) + return withdrawals, processed_partial_withdrawals_count +``` + +##### Modified `process_withdrawals` + +*Note*: The function `process_withdrawals` is modified to support EIP7251. + +```python +def process_withdrawals(state: BeaconState, payload: ExecutionPayload) -> None: + # [Modified in Electra:EIP7251] + expected_withdrawals, processed_partial_withdrawals_count = get_expected_withdrawals(state) + + assert payload.withdrawals == expected_withdrawals + + for withdrawal in expected_withdrawals: + decrease_balance(state, withdrawal.validator_index, withdrawal.amount) + + # Update pending partial withdrawals [New in Electra:EIP7251] + state.pending_partial_withdrawals = state.pending_partial_withdrawals[processed_partial_withdrawals_count:] + + # Update the next withdrawal index if this block contained withdrawals + if len(expected_withdrawals) != 0: + latest_withdrawal = expected_withdrawals[-1] + state.next_withdrawal_index = WithdrawalIndex(latest_withdrawal.index + 1) + + # Update the next validator index to start the next withdrawal sweep + if len(expected_withdrawals) == MAX_WITHDRAWALS_PER_PAYLOAD: + # Next sweep starts after the latest withdrawal's validator index + next_validator_index = ValidatorIndex((expected_withdrawals[-1].validator_index + 1) % len(state.validators)) + state.next_withdrawal_validator_index = next_validator_index + else: + # Advance sweep by the max length of the sweep if there was not a full set of withdrawals + next_index = state.next_withdrawal_validator_index + MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP + next_validator_index = ValidatorIndex(next_index % len(state.validators)) + state.next_withdrawal_validator_index = next_validator_index +``` + +#### Execution payload + +##### New `get_execution_requests_list` + +*Note*: Encodes execution requests as defined by +[EIP-7685](https://eips.ethereum.org/EIPS/eip-7685). + +```python +def get_execution_requests_list(execution_requests: ExecutionRequests) -> Sequence[bytes]: + requests = [ + (DEPOSIT_REQUEST_TYPE, execution_requests.deposits), + (WITHDRAWAL_REQUEST_TYPE, execution_requests.withdrawals), + (CONSOLIDATION_REQUEST_TYPE, execution_requests.consolidations), + ] + + return [ + request_type + ssz_serialize(request_data) + for request_type, request_data in requests + if len(request_data) != 0 + ] +``` + +##### Modified `process_execution_payload` + +*Note*: The function `process_execution_payload` is modified to pass +`execution_requests` into `execution_engine.verify_and_notify_new_payload` (via +the updated `NewPayloadRequest`). + +```python +def process_execution_payload(state: BeaconState, body: BeaconBlockBody, execution_engine: ExecutionEngine) -> None: + payload = body.execution_payload + + # Verify consistency of the parent hash with respect to the previous execution payload header + assert payload.parent_hash == state.latest_execution_payload_header.block_hash + # Verify prev_randao + assert payload.prev_randao == get_randao_mix(state, get_current_epoch(state)) + # Verify timestamp + assert payload.timestamp == compute_timestamp_at_slot(state, state.slot) + # Verify commitments are under limit + assert len(body.blob_kzg_commitments) <= MAX_BLOBS_PER_BLOCK_ELECTRA # [Modified in Electra:EIP7691] + # Verify the execution payload is valid + versioned_hashes = [kzg_commitment_to_versioned_hash(commitment) for commitment in body.blob_kzg_commitments] + assert execution_engine.verify_and_notify_new_payload( + NewPayloadRequest( + execution_payload=payload, + versioned_hashes=versioned_hashes, + parent_beacon_block_root=state.latest_block_header.parent_root, + execution_requests=body.execution_requests, # [New in Electra] + ) + ) + # Cache execution payload header + state.latest_execution_payload_header = ExecutionPayloadHeader( + parent_hash=payload.parent_hash, + fee_recipient=payload.fee_recipient, + state_root=payload.state_root, + receipts_root=payload.receipts_root, + logs_bloom=payload.logs_bloom, + prev_randao=payload.prev_randao, + block_number=payload.block_number, + gas_limit=payload.gas_limit, + gas_used=payload.gas_used, + timestamp=payload.timestamp, + extra_data=payload.extra_data, + base_fee_per_gas=payload.base_fee_per_gas, + block_hash=payload.block_hash, + transactions_root=hash_tree_root(payload.transactions), + withdrawals_root=hash_tree_root(payload.withdrawals), + blob_gas_used=payload.blob_gas_used, + excess_blob_gas=payload.excess_blob_gas, + ) +``` + +#### Operations + +##### Modified `process_operations` + +*Note*: The function `process_operations` is modified to support all of the new +functionality in Electra. + +```python +def process_operations(state: BeaconState, body: BeaconBlockBody) -> None: + # [Modified in Electra:EIP6110] + # Disable former deposit mechanism once all prior deposits are processed + eth1_deposit_index_limit = min(state.eth1_data.deposit_count, state.deposit_requests_start_index) + if state.eth1_deposit_index < eth1_deposit_index_limit: + assert len(body.deposits) == min(MAX_DEPOSITS, eth1_deposit_index_limit - state.eth1_deposit_index) + else: + assert len(body.deposits) == 0 + + def for_ops(operations: Sequence[Any], fn: Callable[[BeaconState, Any], None]) -> None: + for operation in operations: + fn(state, operation) + + for_ops(body.proposer_slashings, process_proposer_slashing) + for_ops(body.attester_slashings, process_attester_slashing) + for_ops(body.attestations, process_attestation) # [Modified in Electra:EIP7549] + for_ops(body.deposits, process_deposit) + for_ops(body.voluntary_exits, process_voluntary_exit) # [Modified in Electra:EIP7251] + for_ops(body.bls_to_execution_changes, process_bls_to_execution_change) + for_ops(body.execution_requests.deposits, process_deposit_request) # [New in Electra:EIP6110] + for_ops(body.execution_requests.withdrawals, process_withdrawal_request) # [New in Electra:EIP7002:EIP7251] + for_ops(body.execution_requests.consolidations, process_consolidation_request) # [New in Electra:EIP7251] +``` + +##### Attestations + +###### Modified `process_attestation` + +*Note*: The function is modified to support EIP7549. + +```python +def process_attestation(state: BeaconState, attestation: Attestation) -> None: + data = attestation.data + assert data.target.epoch in (get_previous_epoch(state), get_current_epoch(state)) + assert data.target.epoch == compute_epoch_at_slot(data.slot) + assert data.slot + MIN_ATTESTATION_INCLUSION_DELAY <= state.slot + + # [Modified in Electra:EIP7549] + assert data.index == 0 + committee_indices = get_committee_indices(attestation.committee_bits) + committee_offset = 0 + for committee_index in committee_indices: + assert committee_index < get_committee_count_per_slot(state, data.target.epoch) + committee = get_beacon_committee(state, data.slot, committee_index) + committee_attesters = set( + attester_index for i, attester_index in enumerate(committee) + if attestation.aggregation_bits[committee_offset + i] + ) + assert len(committee_attesters) > 0 + committee_offset += len(committee) + + # Bitfield length matches total number of participants + assert len(attestation.aggregation_bits) == committee_offset + + # Participation flag indices + participation_flag_indices = get_attestation_participation_flag_indices(state, data, state.slot - data.slot) + + # Verify signature + assert is_valid_indexed_attestation(state, get_indexed_attestation(state, attestation)) + + # Update epoch participation flags + if data.target.epoch == get_current_epoch(state): + epoch_participation = state.current_epoch_participation + else: + epoch_participation = state.previous_epoch_participation + + proposer_reward_numerator = 0 + for index in get_attesting_indices(state, attestation): + for flag_index, weight in enumerate(PARTICIPATION_FLAG_WEIGHTS): + if flag_index in participation_flag_indices and not has_flag(epoch_participation[index], flag_index): + epoch_participation[index] = add_flag(epoch_participation[index], flag_index) + proposer_reward_numerator += get_base_reward(state, index) * weight + + # Reward proposer + proposer_reward_denominator = (WEIGHT_DENOMINATOR - PROPOSER_WEIGHT) * WEIGHT_DENOMINATOR // PROPOSER_WEIGHT + proposer_reward = Gwei(proposer_reward_numerator // proposer_reward_denominator) + increase_balance(state, get_beacon_proposer_index(state), proposer_reward) +``` + +##### Deposits + +###### Modified `get_validator_from_deposit` + +*Note*: The function is modified to use `MAX_EFFECTIVE_BALANCE_ELECTRA` for +compounding withdrawal credential. + +```python +def get_validator_from_deposit(pubkey: BLSPubkey, withdrawal_credentials: Bytes32, amount: uint64) -> Validator: + validator = Validator( + pubkey=pubkey, + withdrawal_credentials=withdrawal_credentials, + effective_balance=Gwei(0), + slashed=False, + activation_eligibility_epoch=FAR_FUTURE_EPOCH, + activation_epoch=FAR_FUTURE_EPOCH, + exit_epoch=FAR_FUTURE_EPOCH, + withdrawable_epoch=FAR_FUTURE_EPOCH, + ) + + # [Modified in Electra:EIP7251] + max_effective_balance = get_max_effective_balance(validator) + validator.effective_balance = min(amount - amount % EFFECTIVE_BALANCE_INCREMENT, max_effective_balance) + + return validator +``` + +###### Modified `add_validator_to_registry` + +*Note*: The function `add_validator_to_registry` is modified to use the modified +`get_validator_from_deposit`. + +```python +def add_validator_to_registry(state: BeaconState, + pubkey: BLSPubkey, + withdrawal_credentials: Bytes32, + amount: uint64) -> None: + index = get_index_for_new_validator(state) + validator = get_validator_from_deposit(pubkey, withdrawal_credentials, amount) # [Modified in Electra:EIP7251] + set_or_append_list(state.validators, index, validator) + set_or_append_list(state.balances, index, amount) + set_or_append_list(state.previous_epoch_participation, index, ParticipationFlags(0b0000_0000)) + set_or_append_list(state.current_epoch_participation, index, ParticipationFlags(0b0000_0000)) + set_or_append_list(state.inactivity_scores, index, uint64(0)) +``` + +###### Modified `apply_deposit` + +*Note*: The function `apply_deposit` is modified to support EIP7251. + +```python +def apply_deposit(state: BeaconState, + pubkey: BLSPubkey, + withdrawal_credentials: Bytes32, + amount: uint64, + signature: BLSSignature) -> None: + validator_pubkeys = [v.pubkey for v in state.validators] + if pubkey not in validator_pubkeys: + # Verify the deposit signature (proof of possession) which is not checked by the deposit contract + if is_valid_deposit_signature(pubkey, withdrawal_credentials, amount, signature): + add_validator_to_registry(state, pubkey, withdrawal_credentials, Gwei(0)) # [Modified in Electra:EIP7251] + else: + return + + # Increase balance by deposit amount + # [Modified in Electra:EIP7251] + state.pending_deposits.append(PendingDeposit( + pubkey=pubkey, + withdrawal_credentials=withdrawal_credentials, + amount=amount, + signature=signature, + slot=GENESIS_SLOT # Use GENESIS_SLOT to distinguish from a pending deposit request + )) +``` + +###### New `is_valid_deposit_signature` + +```python +def is_valid_deposit_signature(pubkey: BLSPubkey, + withdrawal_credentials: Bytes32, + amount: uint64, + signature: BLSSignature) -> bool: + deposit_message = DepositMessage( + pubkey=pubkey, + withdrawal_credentials=withdrawal_credentials, + amount=amount, + ) + domain = compute_domain(DOMAIN_DEPOSIT) # Fork-agnostic domain since deposits are valid across forks + signing_root = compute_signing_root(deposit_message, domain) + return bls.Verify(pubkey, signing_root, signature) +``` + +###### Modified `process_deposit` + +*Note*: The function `process_deposit` is modified to use the modified +`apply_deposit`. + +```python +def process_deposit(state: BeaconState, deposit: Deposit) -> None: + # Verify the Merkle branch + assert is_valid_merkle_branch( + leaf=hash_tree_root(deposit.data), + branch=deposit.proof, + depth=DEPOSIT_CONTRACT_TREE_DEPTH + 1, # Add 1 for the List length mix-in + index=state.eth1_deposit_index, + root=state.eth1_data.deposit_root, + ) + + # Deposits must be processed in order + state.eth1_deposit_index += 1 + + # [Modified in Electra:EIP7251] + apply_deposit( + state=state, + pubkey=deposit.data.pubkey, + withdrawal_credentials=deposit.data.withdrawal_credentials, + amount=deposit.data.amount, + signature=deposit.data.signature, + ) +``` + +##### Voluntary exits + +###### Modified `process_voluntary_exit` + +*Note*: The function `process_voluntary_exit` is modified to ensure the +validator has no pending withdrawals in the queue. + +```python +def process_voluntary_exit(state: BeaconState, signed_voluntary_exit: SignedVoluntaryExit) -> None: + voluntary_exit = signed_voluntary_exit.message + validator = state.validators[voluntary_exit.validator_index] + # Verify the validator is active + assert is_active_validator(validator, get_current_epoch(state)) + # Verify exit has not been initiated + assert validator.exit_epoch == FAR_FUTURE_EPOCH + # Exits must specify an epoch when they become valid; they are not valid before then + assert get_current_epoch(state) >= voluntary_exit.epoch + # Verify the validator has been active long enough + assert get_current_epoch(state) >= validator.activation_epoch + SHARD_COMMITTEE_PERIOD + # Only exit validator if it has no pending withdrawals in the queue + assert get_pending_balance_to_withdraw(state, voluntary_exit.validator_index) == 0 # [New in Electra:EIP7251] + # Verify signature + domain = compute_domain(DOMAIN_VOLUNTARY_EXIT, CAPELLA_FORK_VERSION, state.genesis_validators_root) + signing_root = compute_signing_root(voluntary_exit, domain) + assert bls.Verify(validator.pubkey, signing_root, signed_voluntary_exit.signature) + # Initiate exit + initiate_validator_exit(state, voluntary_exit.validator_index) +``` + +##### Execution layer withdrawal requests + +###### New `process_withdrawal_request` + +```python +def process_withdrawal_request( + state: BeaconState, + withdrawal_request: WithdrawalRequest +) -> None: + amount = withdrawal_request.amount + is_full_exit_request = amount == FULL_EXIT_REQUEST_AMOUNT + + # If partial withdrawal queue is full, only full exits are processed + if len(state.pending_partial_withdrawals) == PENDING_PARTIAL_WITHDRAWALS_LIMIT and not is_full_exit_request: + return + + validator_pubkeys = [v.pubkey for v in state.validators] + # Verify pubkey exists + request_pubkey = withdrawal_request.validator_pubkey + if request_pubkey not in validator_pubkeys: + return + index = ValidatorIndex(validator_pubkeys.index(request_pubkey)) + validator = state.validators[index] + + # Verify withdrawal credentials + has_correct_credential = has_execution_withdrawal_credential(validator) + is_correct_source_address = ( + validator.withdrawal_credentials[12:] == withdrawal_request.source_address + ) + if not (has_correct_credential and is_correct_source_address): + return + # Verify the validator is active + if not is_active_validator(validator, get_current_epoch(state)): + return + # Verify exit has not been initiated + if validator.exit_epoch != FAR_FUTURE_EPOCH: + return + # Verify the validator has been active long enough + if get_current_epoch(state) < validator.activation_epoch + SHARD_COMMITTEE_PERIOD: + return + + pending_balance_to_withdraw = get_pending_balance_to_withdraw(state, index) + + if is_full_exit_request: + # Only exit validator if it has no pending withdrawals in the queue + if pending_balance_to_withdraw == 0: + initiate_validator_exit(state, index) + return + + has_sufficient_effective_balance = validator.effective_balance >= MIN_ACTIVATION_BALANCE + has_excess_balance = state.balances[index] > MIN_ACTIVATION_BALANCE + pending_balance_to_withdraw + + # Only allow partial withdrawals with compounding withdrawal credentials + if has_compounding_withdrawal_credential(validator) and has_sufficient_effective_balance and has_excess_balance: + to_withdraw = min( + state.balances[index] - MIN_ACTIVATION_BALANCE - pending_balance_to_withdraw, + amount + ) + exit_queue_epoch = compute_exit_epoch_and_update_churn(state, to_withdraw) + withdrawable_epoch = Epoch(exit_queue_epoch + MIN_VALIDATOR_WITHDRAWABILITY_DELAY) + state.pending_partial_withdrawals.append(PendingPartialWithdrawal( + validator_index=index, + amount=to_withdraw, + withdrawable_epoch=withdrawable_epoch, + )) +``` + +##### Deposit requests + +###### New `process_deposit_request` + +```python +def process_deposit_request(state: BeaconState, deposit_request: DepositRequest) -> None: + # Set deposit request start index + if state.deposit_requests_start_index == UNSET_DEPOSIT_REQUESTS_START_INDEX: + state.deposit_requests_start_index = deposit_request.index + + # Create pending deposit + state.pending_deposits.append(PendingDeposit( + pubkey=deposit_request.pubkey, + withdrawal_credentials=deposit_request.withdrawal_credentials, + amount=deposit_request.amount, + signature=deposit_request.signature, + slot=state.slot, + )) +``` + +##### Execution layer consolidation requests + +###### New `is_valid_switch_to_compounding_request` + +```python +def is_valid_switch_to_compounding_request( + state: BeaconState, + consolidation_request: ConsolidationRequest +) -> bool: + # Switch to compounding requires source and target be equal + if consolidation_request.source_pubkey != consolidation_request.target_pubkey: + return False + + # Verify pubkey exists + source_pubkey = consolidation_request.source_pubkey + validator_pubkeys = [v.pubkey for v in state.validators] + if source_pubkey not in validator_pubkeys: + return False + + source_validator = state.validators[ValidatorIndex(validator_pubkeys.index(source_pubkey))] + + # Verify request has been authorized + if source_validator.withdrawal_credentials[12:] != consolidation_request.source_address: + return False + + # Verify source withdrawal credentials + if not has_eth1_withdrawal_credential(source_validator): + return False + + # Verify the source is active + current_epoch = get_current_epoch(state) + if not is_active_validator(source_validator, current_epoch): + return False + + # Verify exit for source has not been initiated + if source_validator.exit_epoch != FAR_FUTURE_EPOCH: + return False + + return True +``` + +###### New `process_consolidation_request` + +```python +def process_consolidation_request( + state: BeaconState, + consolidation_request: ConsolidationRequest +) -> None: + if is_valid_switch_to_compounding_request(state, consolidation_request): + validator_pubkeys = [v.pubkey for v in state.validators] + request_source_pubkey = consolidation_request.source_pubkey + source_index = ValidatorIndex(validator_pubkeys.index(request_source_pubkey)) + switch_to_compounding_validator(state, source_index) + return + + # Verify that source != target, so a consolidation cannot be used as an exit + if consolidation_request.source_pubkey == consolidation_request.target_pubkey: + return + # If the pending consolidations queue is full, consolidation requests are ignored + if len(state.pending_consolidations) == PENDING_CONSOLIDATIONS_LIMIT: + return + # If there is too little available consolidation churn limit, consolidation requests are ignored + if get_consolidation_churn_limit(state) <= MIN_ACTIVATION_BALANCE: + return + + validator_pubkeys = [v.pubkey for v in state.validators] + # Verify pubkeys exists + request_source_pubkey = consolidation_request.source_pubkey + request_target_pubkey = consolidation_request.target_pubkey + if request_source_pubkey not in validator_pubkeys: + return + if request_target_pubkey not in validator_pubkeys: + return + source_index = ValidatorIndex(validator_pubkeys.index(request_source_pubkey)) + target_index = ValidatorIndex(validator_pubkeys.index(request_target_pubkey)) + source_validator = state.validators[source_index] + target_validator = state.validators[target_index] + + # Verify source withdrawal credentials + has_correct_credential = has_execution_withdrawal_credential(source_validator) + is_correct_source_address = ( + source_validator.withdrawal_credentials[12:] == consolidation_request.source_address + ) + if not (has_correct_credential and is_correct_source_address): + return + + # Verify that target has compounding withdrawal credentials + if not has_compounding_withdrawal_credential(target_validator): + return + + # Verify the source and the target are active + current_epoch = get_current_epoch(state) + if not is_active_validator(source_validator, current_epoch): + return + if not is_active_validator(target_validator, current_epoch): + return + # Verify exits for source and target have not been initiated + if source_validator.exit_epoch != FAR_FUTURE_EPOCH: + return + if target_validator.exit_epoch != FAR_FUTURE_EPOCH: + return + # Verify the source has been active long enough + if current_epoch < source_validator.activation_epoch + SHARD_COMMITTEE_PERIOD: + return + # Verify the source has no pending withdrawals in the queue + if get_pending_balance_to_withdraw(state, source_index) > 0: + return + + # Initiate source validator exit and append pending consolidation + source_validator.exit_epoch = compute_consolidation_epoch_and_update_churn( + state, source_validator.effective_balance + ) + source_validator.withdrawable_epoch = Epoch( + source_validator.exit_epoch + MIN_VALIDATOR_WITHDRAWABILITY_DELAY + ) + state.pending_consolidations.append(PendingConsolidation( + source_index=source_index, + target_index=target_index + )) +``` diff --git a/bitcoin_basque.pdf b/bitcoin_basque.pdf new file mode 100644 index 0000000..5f86d69 Binary files /dev/null and b/bitcoin_basque.pdf differ diff --git a/check b/check new file mode 100644 index 0000000..1e9ef9c --- /dev/null +++ b/check @@ -0,0 +1 @@ +Coinbase International Exchange
\ No newline at end of file diff --git a/database-backup-and-recovery-reference.pdf b/database-backup-and-recovery-reference.pdf new file mode 100644 index 0000000..492baaa Binary files /dev/null and b/database-backup-and-recovery-reference.pdf differ diff --git a/ecosystem b/ecosystem new file mode 100644 index 0000000..15fa167 --- /dev/null +++ b/ecosystem @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The Aptos Community | Meetups, Events, & Builders | Aptos Network + + + + + + + + + + + + + + +

The Aptos Ecosystem in Action

The Aptos ecosystem spans the globe: builders, creators, and innovators turning ideas into real projects. From hackathons to local meetups, it’s where connections spark collaboration and projects find momentum.

Aptos Ecosystem

Explore the Aptos ecosystem

From social apps to educational platforms to DeFi protocols, get to know the 300+ projects already calling Aptos home.

Meet the founders behind the breakouts

Visionary teams across DeFi, gaming, and infrastructure are building the next wave of trailblazing projects on Aptos.

Experiment.
Launch.
Scale.

Get Started
\ No newline at end of file diff --git a/releases b/releases new file mode 100644 index 0000000..eab1e4e --- /dev/null +++ b/releases @@ -0,0 +1,4461 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Releases · MetaMask/metamask-mobile · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ Skip to content + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + / + + metamask-mobile + + + Public +
+ + +
+ +
+ + +
+
+ +
+
+ + + + +
+ + + + + +
+ + + + + + +

Releases: MetaMask/metamask-mobile

+
+
+
+ + + +
+ +
+
+ + + +
+
+
+
+ +
+
+

Release 7.64.0

+ +
+
+
+ + 06 Feb 18:22 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.64.0 + + Latest +
+ + +
+
+
+ +
+ Latest +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3646 (e935da4)
  • +
  • [skip ci] Bump version number to 3642 (85b48ff)
  • +
  • chore(runway): cherry-pick feat(card): cp-7.64.0 change CardHome button colors (#25737) (e48efc9)
  • +
  • release: release/7.64.0-Changelog (#25410) (94ba5a5)
  • +
  • [skip ci] Bump version number to 3639 (95be05b)
  • +
  • chore(runway): cherry-pick fix(perps): clear confirmation on order view unmount cp-7.64.0 (#25714) (6fef301)
  • +
  • chore(runway): cherry-pick fix: background color for Perps deposit cp-7.64.0 (#25720) (ed2a205)
  • +
  • [skip ci] Bump version number to 3638 (4e74028)
  • +
  • chore(runway): cherry-pick feat(card): cp-7.64.0 create card-kyc-notification deep link handler (#25703) (05850d9)
  • +
  • [skip ci] Bump version number to 3637 (21c4ad3)
  • +
  • chore(runway): cherry-pick fix: display specific geolocation error message for selected rwa token cp-7.64.0 (#25690) (a9ecd54)
  • +
  • [skip ci] Bump version number to 3634 (2302b2a)
  • +
  • chore(runway): cherry-pick refactor: Market discoverability improvements (#25666) (e5d29d1)
  • +
  • [skip ci] Bump version number to 3633 (abaf57a)
  • +
  • chore(runway): cherry-pick fix: Remove userLoggedIn conditional for route definition (#25658) (841e0f0)
  • +
  • [skip ci] Bump version number to 3632 (9049f8a)
  • +
  • chore(runway): cherry-pick fix(perps): improve connection toast (swipe dismiss, delay, styling) cp-7.64.0 (#25659) (48891cd)
  • +
  • [skip ci] Bump version number to 3631 (a1313ef)
  • +
  • chore: update release with stable (#25662) (b3fb79d)
  • +
  • Merge branch 'release/7.64.0' into upd-764-stable (2476027)
  • +
  • update 7.64.0 with stable (74ca9ca)
  • +
  • chore(runway): cherry-pick fix(analytics): cp-7.63.1 correct capitalization in Deep link event name (#25599) (e187824)
  • +
  • [skip ci] Bump version number to 3630 (125a4ca)
  • +
  • chore(runway): cherry-pick fix: default explore feature to enabled cp-7.64.0 (#25654) (1572dc5)
  • +
  • chore(runway): cherry-pick fix: cp-7.64.0 when switching the network filter from a non-EVM network to "Popular networks" EVM tokens aren't displayed (#25653) (bd02a1b)
  • +
  • Revert "fix: MUL-1331 modify android manifest file for correct BLE location permission. (#23759)" (0db00df)
  • +
  • release: 7.63.1 (#25572) (a2360c2)
  • +
  • [skip ci] Bump version number to 3627 (f9a6bb6)
  • +
  • chore(runway): cherry-pick fix(perps): set confirmation header and safe area by navigation source cp-7.64.0 (#25627) (2b602f5)
  • +
  • [skip ci] Bump version number to 3626 (d0cc084)
  • +
  • chore(runway): cherry-pick chore: New Crowdin translations by Github Action cp-7.64.0 (#25628) (4db8291)
  • +
  • release: release/7.63.1-Changelog (#25584) (9c56a0e)
  • +
  • [skip ci] Bump version number to 3622 (b1f276b)
  • +
  • chore(runway): cherry-pick feat: cp-7.64.0 MUSD-279 moved Earn CTAs to be next to asset name (#25600) (e180edc)
  • +
  • [skip ci] Bump version number to 3621 (9cbb539)
  • +
  • chore(runway): cherry-pick fix: Android ANR bug (#25597) (802dfac)
  • +
  • [skip ci] Bump version number to 3619 (1ce0f62)
  • +
  • chore(runway): cherry-pick fix: MUSD-266 staked ethereum balance mismatch (#25580) (212cbd0)
  • +
  • [skip ci] Bump version number to 3617 (40c829e)
  • +
  • chore(runway): cherry-pick fix: add missing prop to fix TokenListItem test (#25593) (6929c41)
  • +
  • [skip ci] Bump version number to 3611 (4c150e4)
  • +
  • chore(runway): cherry-pick fix: O(n) api calls to ramps on token details page cp-7.64.0 (#25550) (0bf3a05)
  • +
  • chore(runway): cherry-pick fix: cp-7.64.0 MUSD-268 only render Earn CTA when above minimum required balance of 1 cent (#25531) (cb2abc8)
  • +
  • chore(runway): cherry-pick feat(card): cp-7.64.0 Onboarding and Metal Card flow fixes (#25538) (bfb9e9f)
  • +
  • [skip ci] Bump version number to 3603 (6554660)
  • +
  • chore(runway): cherry-pick fix(perps): reduce WebSocket subscription overhead and prevent leaks cp-7.63.0 cp-7.64.0 (#25504) (6f8e8e8)
  • +
  • [skip ci] Bump version number to 3601 (0cf3191)
  • +
  • chore(runway): cherry-pick fix(perps): add spotMeta caching to reduce API calls on HIP-3 markets cp-7.63.0 cp-7.64.0 (#25500) (cc2d520)
  • +
  • [skip ci] Bump version number to 3594 (1fc5d62)
  • +
  • Merge branch 'stable' into release/7.64.0 (d3f7f7d)
  • +
  • [skip ci] Bump version number to 3593 (36af569)
  • +
  • chore(runway): cherry-pick fix(perps): potential rate limit on close positions cp-7.63.0 cp-7.64.0 cp-7.62.2 (#25457) (68e7a87)
  • +
  • chore(runway): cherry-pick feat: implement Url Bar Button Updates (#25459) (a86c788)
  • +
  • [skip ci] Bump version number to 3589 (1b55cbd)
  • +
  • chore(runway): cherry-pick feat: return actual host for known public domains in analytics cp-7.64.0 (#25448) (d0c242b)
  • +
  • [skip ci] Bump version number to 3586 (5f7e4d6)
  • +
  • chore(runway): cherry-pick fix(perps): watchlist and explore header and list padding fix cp-7.64.0 (#25422) (554270b)
  • +
  • test(MMQA-1340): fixed perps and predictions tests (#25372) (0ee7328)
  • +
  • test: skip insufficient funds test to unblock pipeline (#25401) (21cae71)
  • +
  • revert: swaps new slippage modal (#25394) (6e61412)
  • +
  • fix: don't pin selected asset if it doesn't match search (#25395) (52d2ff9)
  • +
  • fix: 25144 QR code popup constantly in explorer screen due to predictions require typed sign to connect. cp-7.63.0 (#25334) (1d4bd68)
  • +
  • feat(perps): allow users to trade with any token PoC (#24964) (de0997f)
  • +
  • chore: upgrade ReOwn/WalletConnect (#24800) (351770f)
  • +
  • refactor(card): onboarding screens (#25347) (986b85c)
  • +
  • feat: swaps new slippage modal (#25124) (de82fcb)
  • +
  • chore: replace transaction details view to support gasless tx musd convert (#25349) (a4ad52c)
  • +
  • chore: remove epd feature flag (#23725) (cae67fb)
  • +
  • docs: update create-deeplink-handler command to match DeeplinkManager (#25373) (8c57559)
  • +
  • feat: MUSD-233 remove stablecoin earn percentage cta to avoid conflicting with musd conversions (#25351) (76d6694)
  • +
  • fix(perps): geo-restrictions on ui cp-7.63.0 (#25379) (d87e9ea)
  • +
  • feat(analytics): migrate Batch 1-2 Ramp useAnalytics to analytics utility (#25377) (080c842)
  • +
  • fix: flaky trending e2e tests (#25371) (f588bd3)
  • +
  • chore: Add pull to refresh to Wallet (#23618) (736e6e4)
  • +
  • feat: MUSD-243 enforce same chain conversions in one click (#25238) (5ca0cc6)
  • +
  • chore(release): sync stable to main for version 7.65.0 (#25381) (ff3d459)
  • +
  • Merge origin/main into stable-main-7.65.0 (74a8adc)
  • +
  • refactor(multichain): convert MultichainTransactionDetailsModal to BottomSheet (#25332) (d28119c)
  • +
  • chore: Remove experimental workflows (#25365) (7a62afe)
  • +
  • fix: Enable the “Got it” button (#25368) (a755dc2)
  • +
  • chore: Adds tempo testnet network (#25187) (a033b30)
  • +
  • chore: swaps api prop refactor (#25364) (31c3da6)
  • +
  • feat(card): metal card checkout flow (#25172) (76adcaa)
  • +
  • feat: Allow queueing of Snap dialogs (#25319) (e8fec36)
  • +
  • fix: Remove unexpected header background when confirmation modal shown (#25363) (f41c183)
  • +
  • chore(perps): use feature flag for referral code (#25282) (9236943)
  • +
  • fix: Multiple bugs when editing SL via Stop Loss Banner (#25234) (425beae)
  • +
  • feat(perps): show trending markets in Perps tab for users without positions (#25302) (cf684d6)
  • +
  • feat: rewards dropdown filter on activity tab (#24910) (9d97e2f)
  • +
  • feat: convert manualBackupStep1 code to typescript (#24346) (129c314)
  • +
  • feat: allow users to set a referral code in settings (#25085) (bd0fc32)
  • +
  • refactor: Improve Perps market list discoverability (#25343) (9c69c7d)
  • +
  • fix: textField error case styling and update conditions (#25254) (ac96563)
  • +
  • feat: change password ui fixes (#25301) (e135731)
  • +
  • feat: continue button placement changes in create pasword screen (#25264) (8f45d17)
  • +
  • docs(predict): Architectural refactoring documentation and roadmap (#25348) (7e62d28)
  • +
  • feat: add close button to EarnTokenList BottomSheet (#25006) (cef1d5b)
  • +
  • chore: New Crowdin translations by Github Action - cp-7.63.0 (#24364) (5500c95)
  • +
  • fix: WalletConnect URL validation (#24904) (c37453b)
  • +
  • fix: Swaps network pill style (#25342) (1c2208f)
  • +
  • chore: Updated Settings header to use HeaderCenter (#25329) (1d43171)
  • +
  • chore: build workflow to gh (#25341) (fc6e0cd)
  • +
  • chore: Remove reset password from updateAuthPreferences (#25295) (a425938)
  • +
  • fix: standardize fiat value decimal places in asset picker (#25289) (448ed23)
  • +
  • fix: format input amount when validating balance (#25333) (394d42d)
  • +
  • feat(earn): add earn-musd deeplink handler with navigation fixes (#25285) (67d8043)
  • +
  • feat(analytics): add client in metadata for smartTransaction and relayTransaction transaction submission (#25331) (59fc95f)
  • +
  • fix: align token balance update with confirmation status update (#25299) (16b22b8)
  • +
  • fix: Wrap navigation proxy using requestAnimationFrame (#25241) (7b7bbb8)
  • +
  • chore: validate env expo (#25236) (bf4da46)
  • +
  • test: Normalize re-run CI workflow on skipped tags (#25324) (db8fa73)
  • +
  • refactor(analytics): migrate Batch 1-3 and 1-7: platform team or no CO (#25327) (3dfa001)
  • +
  • feat: integrate token list controller storage service (#24019) (390ecfd)
  • +
  • feat: redirect user to homepage after claiming bonus (#25274) (7af7bc7)
  • +
  • chore: remove legacy confirmation code (#24929) (cb2e27a)
  • +
  • fix(ramp): update postal code input to allow punctuation (#25323) (a517010)
  • +
  • fix(perps): geo-restrict modify and close cp-7.63.0 (#25314) (4d2533f)
  • +
  • fix: disable "switch tokens" button when destination network is not enabled (#25311) (991507e)
  • +
  • test: Allow Smart E2E selector to include the Performance tests (#24961) (7811279)
  • +
  • chore(rewards): remove remote feature flag dependencies from selectors (#25316) (7da1175)
  • +
  • refactor: adds tooltip to Bonus claim section and changes the way bonus amount is displayed (#25310) (c7cd456)
  • +
  • fix: filter unclickable trending cp-7.63.0 (#25309) (9fd380d)
  • +
  • fix: don't pin selected asset if on different network (#25308) (ee837dd)
  • +
  • chore: remove 'Powered by Relay' tooltip from conversion screen (#25318) (7cbc66f)
  • +
  • feat: Add Multichain API support to Snaps (#24885) (3ce033d)
  • +
  • chore(rewards): modal copy changes for eos (#25313) (93cc2a9)
  • +
  • chore: skip Sonar Cloud jobs on merge queue to optimize performance (#25134) (28854be)
  • +
  • fix: missing stock badge on asset overview from trending token (#25288) (2462a0f)
  • +
  • feat(rewards): add Bitcoin and Tron account support for rewards (#24890) (ecb6a0e)
  • +
  • chor...
  • +
+ Read more +
+ +
+ +
+
+
+

Release 7.63.1

+ +
+
+
+ + 04 Feb 10:46 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.63.1 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3625 (a0dbbb3)
  • +
  • [skip ci] Bump version number to 3620 (693a940)
  • +
  • chore(runway): cherry-pick fix: Android ANR bug (#25596) (04c476e)
  • +
  • [skip ci] Bump version number to 3618 (90eeb96)
  • +
  • chore(runway): cherry-pick fix(analytics): cp-7.63.1 correct capitalization in Deep link event name (#25599) (6be5182)
  • +
  • [skip ci] Bump version number to 3615 (342a919)
  • +
  • [skip ci] Bump version number to 3614 (fbfecd0)
  • +
  • Merge branch 'stable' into release/7.63.1 (a373eef)
  • +
  • chore(runway): cherry-pick feat(perps): sdk reconnect on native socket event (#25022) (#25573) (e51d6d1)
  • +
  • bump semvar version to 7.63.1 && build version to 3613 (6a9d90f)
  • +
  • release: 7.63.0 (#25068) (6814278)
  • +
+
+ +
+ +
+
+
+

Release 7.63.0

+ +
+
+
+ + 02 Feb 18:24 + +
+ + + + + +
+ + + + 418f4f3 + +
+
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.63.0 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • chore(runway): cherry-pick chore: validate env expo (#25481) (418f4f3)
  • +
  • [skip ci] Bump version number to 3604 (67a50f5)
  • +
  • chore(runway): cherry-pick fix(perps): reduce WebSocket subscription overhead and prevent leaks cp-7.63.0 cp-7.64.0 (#25503) (7b1fcba)
  • +
  • chore(runway): cherry-pick fix(perps): add spotMeta caching to reduce API calls on HIP-3 markets (#25511) (e2ca72f)
  • +
  • fix: Perps rate limit hotfix cp-7.63.0 (#25472) (c6e1142)
  • +
  • Merge branch 'stable' into release/7.63.0 (f0a295f)
  • +
  • release: 7.62.2 (#25436) (8e96db4)
  • +
  • release: release/7.62.2-Changelog (#25460) (dc3df2a)
  • +
  • Merge branch 'stable' into release/7.62.2 (cb36d78)
  • +
  • [skip ci] Bump version number to 3585 (dfab74f)
  • +
  • release: release/7.63.0-Changelog (#25067) (4f5e2bf)
  • +
  • [skip ci] Bump version number to 3577 (3ebcfa8)
  • +
  • chore(runway): cherry-pick fix(perps): geo-restrictions on ui (#25392) (e36d829)
  • +
  • [skip ci] Bump version number to 3572 (87d2dae)
  • +
  • chore: update release/7.63.0 with stable (#25378) (42a026b)
  • +
  • Merge branch 'stable' into stable-merge-7.63.0 (4bf7bd0)
  • +
  • fix: update selectedGasFeeToken when payment token is selected for gasless flow cp-7.62.1 (#25209) (a74773c)
  • +
  • update changelog (a13329c)
  • +
  • release: release/7.62.1-Changelog (#25214) (4058c42)
  • +
  • release: release/7.62.0-Changelog (#24580) (d858ef1)
  • +
  • Revert "fix: MUL-1331 modify android manifest file for correct BLE location permission. (#23759)" (a254115)
  • +
  • release: 7.62.1 (#25213) (4a7ca70)
  • +
  • update changelog (0f596ee)
  • +
  • release: release/7.62.1-Changelog (#25214) (e1b3ca2)
  • +
  • [skip ci] Bump version number to 3568 (b8fcbe0)
  • +
  • chore(runway): cherry-pick chore: New Crowdin translations by Github Action - cp-7.63.0 (#25353) (5661f0c)
  • +
  • chore(runway): cherry-pick chore(rewards): modal copy changes for eos (#25352) (83bb8e0)
  • +
  • Merge branch 'stable' into release/7.62.1 (af66d60)
  • +
  • [skip ci] Bump version number to 3566 (e3f8e8e)
  • +
  • chore(runway): cherry-pick fix: filter unclickable trending cp-7.63.0 (#25322) (a0e9313)
  • +
  • chore(runway): cherry-pick fix(perps): geo-restrict modify and close cp-7.63.0 (#25328) (5b84ef7)
  • +
  • [skip ci] Bump version number to 3564 (ef19971)
  • +
  • chore(runway): cherry-pick fix: cp-7.63.0 Fix mm_pay_quote_* metrics (#25306) (4812116)
  • +
  • [skip ci] Bump version number to 3557 (cbf4e7b)
  • +
  • chore(runway): cherry-pick fix: rehydration login cp-7.63.0 (#25261) (f2ddb8c)
  • +
  • [skip ci] Bump version number to 3555 (848d1e7)
  • +
  • chore(runway): cherry-pick fix: bump transaction-pay-controller to 11.1.0 (#25250) (ade1878)
  • +
  • [skip ci] Bump version number to 3551 (f9ef1d0)
  • +
  • chore(runway): cherry-pick fix(predict): update Seahawks team color for accessibility cp-7.63.0 (#25232) (7eefd25)
  • +
  • [skip ci] Bump version number to 3550 (49771c6)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.63.0 game picks not showing for claimable positions (#25229) (6187643)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.63.0 compact game card in explore tab (#25224) (9d961df)
  • +
  • [skip ci] Bump version number to 3549 (6147266)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.63.0 override Super Bowl event title (#25217) (687b3e2)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.63.0 override team colors for Super Bowl (#25208) (655dac3)
  • +
  • [skip ci] Bump version number to 3547 (1b21313)
  • +
  • chore(runway): cherry-pick fix: [Explore] design issues cp-7.63.0 (#25193) (4fa454f)
  • +
  • chore(runway): cherry-pick fix: [Explore] search text is invisible on android cp-7.63.0 (#25191) (6cd0bbf)
  • +
  • chore(runway): cherry-pick fix: Aggregator guard on perps banner in detail screen cp-7.63.0 (#25203) (15bb9c1)
  • +
  • chore(runway): cherry-pick fix: [Explore] predict text overflows from card cp-7.63.0 (#25190) (acb6eec)
  • +
  • release: 7.62.0...
  • +
+ Read more +
+ +
+ +
+
+
+

Release 7.62.2

+ +
+
+
+ + 30 Jan 20:27 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.62.2 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3591 (48ead2a)
  • +
  • [skip ci] Bump version number to 3590 (686733f)
  • +
  • chore(runway): cherry-pick fix(perps): potential rate limit on close positions (#25456) (69080ae)
  • +
  • [skip ci] Bump version number to 3588 (be93d6d)
  • +
  • fix: cherry-pick 429 rate limiting fix with coin naming convention (#25443) (03f318a)
  • +
  • bump semvar version to 7.62.2 && build version to 3587 (cb0aa6e)
  • +
  • release: 7.62.1 (#25213) (4a7ca70)
  • +
  • update changelog (0f596ee)
  • +
  • release: release/7.62.1-Changelog (#25214) (e1b3ca2)
  • +
  • Merge branch 'stable' into release/7.62.1 (af66d60)
  • +
  • release: 7.62.0 (#24578) (f189369)
  • +
  • release: release/7.62.0-Changelog (#24580) (12dffda)
  • +
+
+ +
+ +
+
+
+

Release 7.62.1

+ +
+
+
+ + 28 Jan 17:01 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.62.1 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3561 (a77a49e)
  • +
  • [skip ci] Bump version number to 3559 (f90a5ce)
  • +
  • fix: update selectedGasFeeToken when payment token is selected for ga… (#25273) (3e0a296)
  • +
  • bump semvar version to 7.62.1 && build version to 3546 (a29e20b)
  • +
+
+ +
+ +
+
+
+

Release 7.62.0

+ +
+
+
+ + 24 Jan 05:53 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.62.0 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3527 (bd0727f)
  • +
  • Revert "fix: MUL-1331 modify android manifest file for correct BLE location permission. (#23759)" (c54b9b6)
  • +
  • [skip ci] Bump version number to 3521 (17261b2)
  • +
  • [skip ci] Bump version number to 3512 (f7e5607)
  • +
  • chore(runway): cherry-pick fix: cp-7.62.0 Fix unknown asset presentation when nonEVM selected on network manager (#25056) (060968e)
  • +
  • chore(runway): cherry-pick fix(EarnBalance): only show stake button for native TRX (#25057) (89e91c6)
  • +
  • chore(runway): cherry-pick fix: cp-7.62.0 disable stablecoin lending batch deposit flow (#25051) (f485038)
  • +
  • chore(runway): cherry-pick chore: cp-7.62.0 enable tron QR scanning (#25058) (851e156)
  • +
  • [skip ci] Bump version number to 3511 (a45f454)
  • +
  • chore: disable lodash temp (#25027) (4022bdc)
  • +
  • [skip ci] Bump version number to 3505 (3318ef9)
  • +
  • feat(predict): cp-7.62.0 improve game chart UI and add optimistic position updates (#24918) (6b2c294)
  • +
  • [skip ci] Bump version number to 3503 (e4fae8b)
  • +
  • fix: render native tokens as source when navigate from asset details cp-7.62.0 (#24876) (e40fa56)
  • +
  • [skip ci] Bump version number to 3497 (521f26e)
  • +
  • fix: biometric on create srp wallet (#24695) (#24951) (03f4911)
  • +
  • [skip ci] Bump version number to 3489 (6d3411e)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.62.0 show correct action buttons when NFL game ends (#24899) (df5d5e9)
  • +
  • [skip ci] Bump version number to 3488 (dd1bee8)
  • +
  • chore(runway): cherry-pick feat(predict): cp-7.62.0 improve PredictGameChart with market prop and smart timeframe defaults (#24896) (0fcafbb)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.62.0 display user positions in sport market cards (#24895) (c15e817)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.62.0 use bestAsk from live price updates (buy) (#24894) (16dafe9)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.62.0 NFL bug fixes for game periods, search highlights, and gameId parsing (#24893) (6932d5a)
  • +
  • [skip ci] Bump version number to 3487 (eb63549)
  • +
  • chore(runway): cherry-pick fix: invalid order book buttons cp-7.62.0 (#24889) (d1c56c9)
  • +
  • [skip ci] Bump version number to 3486 (5168c3f)
  • +
  • chore(runway): cherry-pick feat(predict): cp-7.62.0 add live price updates to action buttons (#24849) (9ca42b4)
  • +
  • chore(runway): cherry-pick fix: bring back legacy SwapsLiveness to fix gassless swaps cp-7.62.0 (#24868) (c6c4025)
  • +
  • chore(runway): cherry-pick feat(predict): cp-7.62.0 add market highlights feature flag support (#24850) (67af102)
  • +
  • [skip ci] Bump version number to 3472 (33b8c8e)
  • +
  • chore(runway): cherry-pick feat: cp-7.62.0 Use ConnectivityController to suppress network banners and events when device is offline (#24844) (a8e822f)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.62.0 refactor PredictSportScoreboard to use game prop with live updates (#24847) (57e20b6)
  • +
  • [skip ci] Bump version number to 3471 (d25ecad)
  • +
  • chore(runway): cherry-pick feat(predict): cp-7.62.0 render PredictMarketSportCard for NFL game markets (#24840) (d0db1c8)
  • +
  • feat(predict): cp-7.62.0 adds PredictMarketSportCard (#24601) (bbdc25b)
  • +
  • [skip ci] Bump version number to 3470 (95b43cf)
  • +
  • fix: use subscript for price notation (#24441) (4dca9ba)
  • +
  • [skip ci] Bump version number to 3467 (95fb5a3)
  • +
  • chore(runway): cherry-pick fix: return correct address based on network type cp-7.62.0 (#24835) (03cd524)
  • +
  • [skip ci] Bump version number to 3466 (5de8b3d)
  • +
  • chore(runway): cherry-pick fix(predict): cp-7.62.0 debounce search input in PredictSearchOverlay (#24825) (d80a018)
  • +
  • [skip ci] Bump version number to 3465 (9d5193b)
  • +
  • chore(runway): cherry-pick feat(predict): cp-7.62.0 improve chart loading state and timestamp positioning (#24818) (c11f4d7)
  • +
  • [skip ci] Bump version number to 3464 (a38179c)
  • +
  • chore(runway): cherry-pick fix: regex in typed-data parsing cp-7.62.0 (#24810) (6bcff72)
  • +
  • [skip ci] Bump version number to 3463 (0c1820b)
  • +
  • chore(runway): cherry-pick fix(card): cp-7.62.0 general UI issues (#24801) (b118813)
  • +
  • [skip ci] Bump version number to 3462 (a83bf8a)
  • +
  • chore(runway): cherry-pick fix: check for non-evm chains before doing the toHex cp-7.62.0 ([#24798](https://github.com/MetaMask/metam...
  • +
+ Read more +
+ +
+ +
+
+
+

Release 7.61.6

+ +
+
+
+ + 12 Jan 07:09 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.61.6 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3412 (d4b97da)
  • +
  • [skip ci] Bump version number to 3410 (e099f12)
  • +
  • fix: apr display value (90a72fc)
  • +
  • chore(runway): cherry-pick chore: bump @metamask/tron-wallet-snap to version 1.19.0 cp-7.61.6 (#24378) (223de32)
  • +
  • chore(runway): cherry-pick fix(tron): max energy and bandwidth incorrectly set to 1 instead of 0 cp-7.61.6 (#24376) (48c63c9)
  • +
  • Merge branch 'stable' into release/7.61.6 (8580b73)
  • +
  • [skip ci] Bump version number to 3393 (8b605f3)
  • +
  • bitrise: do not bump version code on pr_rc_rwy_pipeline (35e5000)
  • +
  • [skip ci] Bump version number to 3390 (c08da16)
  • +
  • [skip ci] Bump version number to 3389 (a79aed2)
  • +
  • [skip ci] Bump version number to 3388 (324b07c)
  • +
  • chore(runway): cherry-pick fix: include hip3 dexes when building position map on init (#24300) (bd415f5)
  • +
  • [skip ci] Bump version number to 3376 (74d7292)
  • +
  • [skip ci] Bump version number to 3372 (3f8578c)
  • +
  • chore(perps): Refactor HL subscription service (#24015) (#24274) (d400d2e)
  • +
  • [skip ci] Bump version number to 3371 (21ea821)
  • +
  • chore(runway): cherry-pick chore: fix apr issue with znon-zero values cp-7.61.6 (#24261) (6a7a89d)
  • +
  • release: 7.61.5 (#24224) (e751553)
  • +
  • [skip ci] Bump version number to 3368 (ba08ee9)
  • +
  • fix: missing code from previous CP (#24241) (38ad079)
  • +
  • Merge branch 'stable' into release/7.61.5 (8eec71f)
  • +
  • release: 7.61.4 (#24221) (c191f28)
  • +
  • fix package.json (673828f)
  • +
  • chore: resolution for qs package (#24235) (14442c1)
  • +
  • bump semvar version to 7.61.6 && build version to 3367 (d4d802a)
  • +
  • resolution for qa package (9ce86cb)
  • +
  • update changelog (7c6f4aa)
  • +
  • Merge branch 'stable' into release/7.61.4 (222b538)
  • +
  • release: 7.61.3 (#24194) (835c854)
  • +
  • release: release/7.61.3-Changelog (#24203) (777b7e1)
  • +
  • release/7.61.3 - fix WalletConnectV2 type errors. Skip Origin Rejection scenario (#24216) (50f4ab8)
  • +
  • fix formatting issue (9fe8077)
  • +
+
+ +
+ +
+
+
+

Release 7.61.5

+ +
+
+
+ + 24 Dec 21:02 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.61.5 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3341 (f306b8e)
  • +
  • chore: refine hardware signing flow (#24228) (0645fe2)
  • +
  • [skip ci] Bump version number to 3338 (97cc155)
  • +
  • fix: robustness deeplinking (#24227) (db32ce8)
  • +
  • bump semvar version to 7.61.5 && build version to 3336 (ac7aa56)
  • +
+
+ +
+ +
+
+
+

Release 7.61.4

+ +
+
+
+ + 23 Dec 22:34 + +
+ + + + + + +
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.61.4 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • [skip ci] Bump version number to 3335 (4a50956)
  • +
  • chore: robust implementation dapp connection (#24222) (8240280)
  • +
  • bump semvar version to 7.61.4 && build version to 3334 (eb642e2)
  • +
+
+ +
+ +
+
+
+

Release 7.61.3

+ +
+
+
+ + 21 Dec 21:47 + +
+ + + + + +
+ + + + a8659a1 + +
+
+ + + + + +
+
+
+

+ Choose a tag to compare +

+ +
+
+ +
+
+
+ + + +
+ + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ Release 7.61.3 + + +
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
    +
  • remove duplicate import (a8659a1)
  • +
  • [skip ci] Bump version number to 3327 (7a663f7)
  • +
  • chore: connection updates and improvements (#24215) (3c7ec9d)
  • +
  • fix lint issues (f26890c)
  • +
  • [skip ci] Bump version number to 3321 (298ba21)
  • +
  • chore(runway): cherry-pick feat: add Tron stakeComputeFee and other improvements (#24209) (d95fab3)
  • +
  • chore(runway): cherry-pick feat: NWNT-681: Add useTronStakeApy hook (#24206) (fa25d60)
  • +
  • chore(runway): cherry-pick feat: add support for accountChanged for Tron network (#24207) (eac2dd6)
  • +
  • chore(runway): cherry-pick chore: update @metamask/keyring-api and @metamask/tron-wallet-snap versions (#24205) (c7a07c1)
  • +
  • chore(runway): cherry-pick chore: adds localization method and other improvements (#24204) (2064816)
  • +
  • chore(runway): cherry-pick chore: add support for fiat use in tron staking/unstaking flows (#24199) (2b3985d)
  • +
  • chore(runway): cherry-pick chore: adds the Tron staking details preview (#24198) (2dfdcf8)
  • +
  • chore(runway): cherry-pick fix(ramp): use ScrollView from react-native-gesture-handler in PaymentMethodSelectorModal (#24197) (e855c62)
  • +
  • Merge branch 'stable' into release/7.61.3 (ab96066)
  • +
  • chore(runway): cherry-pick chore: broadcast staking TRX transaction cp-7.61.3 (#24196) (6f59628)
  • +
  • bump semvar version to 7.61.3 && build version to 3314 (0b682a7)
  • +
  • release: 7.61.2 (#24167) (33701f9)
  • +
  • chore: release/7.61.2-Changelog (#24173) (4d533ac)
  • +
  • Merge branch 'stable' into release/7.61.2 (2faa54e)
  • +
  • release: 7.61.1 (#24026) (e500ada)
  • +
  • update changelog (b4ff01d)
  • +
  • Merge branch 'stable' into release/7.61.1 (16f498f)
  • +
  • release: 7.61.0 (#23381) (dfd47cb)
  • +
  • release: release/7.61.0-Changelog (#23380) (da90c17)
  • +
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/superchain.dev-vercel-domains.png b/superchain.dev-vercel-domains.png new file mode 100644 index 0000000..9181f94 Binary files /dev/null and b/superchain.dev-vercel-domains.png differ diff --git a/verify b/verify new file mode 100644 index 0000000..799ed7f --- /dev/null +++ b/verify @@ -0,0 +1,69 @@ + + + + Persona + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +