Skip to content

[EAN-Issue-2530] Added emv-contracts-details move module#342

Open
aregng wants to merge 107 commits intodevfrom
task/issue-2530
Open

[EAN-Issue-2530] Added emv-contracts-details move module#342
aregng wants to merge 107 commits intodevfrom
task/issue-2530

Conversation

@aregng
Copy link
Copy Markdown

@aregng aregng commented Mar 10, 2026

  • The module will hold the evm contract names associated with the corresponding addresses
  • Supra node runtime will utilize this information to retrieve evm block-metadata and automation-registry contract addresses
  • Users can retrieve the 0x1::evm_contracts_details::EvmContractsDetails resource to get info on supra native evm contracts

Fixes: https://github.com/Entropy-Foundation/smr-moonshot/issues/2530

hsaleemsupra and others added 21 commits January 15, 2026 09:55
* feat(types,accumulator): Add features for transactions inclusions and events emissions proofs.

- RLP's `Encodable` trait implementation for Contract Events.
- `get_proof_by_position` method for Merkle Accumulator.

* feat: add `EventV2` api type

* chore: cargo feature optimization

* refactor(aptos-api-types): transformed `Event` to `EventV1` and applied Full-Clone on `EventV2`

* feat: add `hash` in `EventV1` with serialization disabled

* docs: fix oai docs for `EventV1`

* feat(aptos_api_types): add `try_into_v2_events` to convert `ContractEvent` to `EventV2`

* feat: add `SUPRA_TRANSACTIONS_INCLUSION_PROOFS` feature flag

* feat: replace rlp encoding with custom encoding to generate event hash

* chore: replace `alloy` with `sha3` for `Keccak256` impl

* fix: Keccack256 hash implementation using `sha3`

---------

Co-authored-by: Nikita Puzankov <n.puzankov@supraoracles.com>
Co-authored-by: Simon Chen <s.chen@supraoracles.com>
hsaleemsupra and others added 3 commits March 24, 2026 17:56
- The module will hold the evm contract names accosiated with the corresponding addresses
- Supra node runtime will utilize this information to retrieve evm block-metadata and automation-registry contract addresses
- Users can retrieve the 0x1::evm_contracts_details::EvmContractsDetails resource to get info on supra native evm contracts
/// supra_framework::evm_genesis_config::set_for_next_epoch(&framework_signer, vector["contact1_name"], [contract1_address]);
/// supra_framework::supra_governance::reconfigure(&framework_signer);
/// ```
public fun upset_for_next_epoch(account: &signer, keys: vector<String>, values: vector<address>) acquires EvmContractsDetails {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public fun upset_for_next_epoch(account: &signer, keys: vector<String>, values: vector<address>) acquires EvmContractsDetails {
public fun upsert_for_next_epoch(account: &signer, keys: vector<String>, values: vector<address>) acquires EvmContractsDetails {

public(friend) fun on_new_epoch(framework: &signer) acquires EvmContractsDetails {
system_addresses::assert_supra_framework(framework);
if (config_buffer::does_exist<EvmContractsDetails>()) {
let new_config = config_buffer::extract<EvmContractsDetails>();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this compatible with another PR that @supra-yoga worked on ? Essentially this config_buffer::extract is an unprotected extraction flagged by auditor so we have extract_v2 somewhere which takes framework signer. This is going to conflict with that.

Comment on lines +98 to +104
/// Input for DKG key output - contains threshold type and keys for one committee
struct DkgCommitteeOutput has copy, drop {
/// The threshold type (0=validity, 1=quorum, 2=unanimous, etc.)
threshold_type: u8,
/// Public key shares for each validator (indexed by validator position)
keys: vector<vector<u8>>,
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

struct should be before any method as a standard practice in Move modules

Comment on lines +31 to +91
public fun new_dkg_node_config(addr: address, identity: vector<u8>, dkg_pubkey: vector<u8>,): DkgNodeConfig{
DkgNodeConfig{
addr,
identity,
dkg_pubkey
}
}

public fun get_addr(dkg_node: &DkgNodeConfig): address{
dkg_node.addr
}

public fun get_dkg_pubkey(dkg_node: &DkgNodeConfig): vector<u8>{
dkg_node.dkg_pubkey
}

public fun len(committee: &DkgCommittee): u64{
vector::length(&committee.committee)
}

public fun get_committee(dkg_committee: &DkgCommittee): vector<DkgNodeConfig>{
dkg_committee.committee
}

public fun new_dkg_committee(committee: vector<DkgNodeConfig>, threshold_type: CertificateThresholdType): DkgCommittee{

assert!(vector::length(&committee) > 0, EINVALID_DKG_COMMITTEE_SIZE);
DkgCommittee{
committee,
threshold_type
}
}

public fun new_dkg_committee_from_validator_consensus_info(validator_committee: vector<ValidatorConsensusInfo>, threshold_type: CertificateThresholdType): DkgCommittee{

assert!(vector::length(&validator_committee) > 0, EINVALID_DKG_COMMITTEE_SIZE);

// The order of the committee members is important for DKG.
// The order should correspond to the order of the validator committee.
// The output of the DKG has keys in the same order as the committee.
let dkg_committee = vector[];
vector::for_each(validator_committee, |x|
{
let validator_keys_bytes = validator_consensus_info::get_pk_bytes(&x);
let addr = validator_consensus_info::get_addr(&x);
vector::push_back(&mut dkg_committee, DkgNodeConfig{
addr,
identity: bcs::to_bytes(&addr),
dkg_pubkey: validator_keys_bytes,
});
}
);

DkgCommittee{
committee: dkg_committee,
threshold_type
}
}

public fun new_receiver_committee(is_resharing: bool, dkg_threshold_type: CertificateThresholdType, committee: DkgCommittee): ReceiverCommittee{
ReceiverCommittee{
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all of the methods here are pure functions so should either be tagged as view or perhaps use public(friend) if this is to be invoked only from other module? Not sure what purpose is served by this module since Move state is not changed at all. If this is only for validators, wouldn't it make more sense to do this in rust layer?

use supra_framework::system_addresses;
use supra_framework::staking_config::{Self, StakingConfig, StakingRewardsConfig};
use supra_framework::chain_status;
use std::dkg_committee;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use supra_framework::dkg_committee

Comment on lines +164 to +175
let len = vector::length(&public_key_shares_all_comms.commitments);
while (i < len) {
let commitment = vector::borrow(&public_key_shares_all_comms.commitments, i);
// As the first index contains the committee's threshold public key, we can skip that
let evals = vector::slice(&commitment.bls12381_commitment_evals, 1, vector::length(&commitment.bls12381_commitment_evals));

vector::push_back(
&mut committee_outputs,
new_dkg_committee_output(commitment.threshold_type, evals)
);
i = i + 1;
};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the vector is ok to be destroyed use vector::for_each_reverse otherwise use vector::for_each_ref, in general use functional style vector operations available in vector.move

}

/// Return the last completed DKG session state, if it exists.
public fun last_completed_session(): Option<DKGSessionState> acquires DKGState {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be public fun or public(friend) fun?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if it should be public fun then should be tagged as view

Comment on lines +1 to +3
// Copyright (c) Aptos Foundation
// SPDX-License-Identifier: Apache-2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure why Aptos Foundation header got added, is this auto generated?

Comment on lines +1 to 3
// Copyright (c) Aptos Foundation
// SPDX-License-Identifier: Apache-2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, not sure why this got added as header, this is purely SUPRA code

Comment on lines +1 to +3
// Copyright (c) Aptos Foundation
// SPDX-License-Identifier: Apache-2.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Purely supra code, remove this header, not sure why this got added

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants