Skip to content

Commit

Permalink
feat: add unified account chain extension
Browse files Browse the repository at this point in the history
  • Loading branch information
ashutoshvarma committed Oct 15, 2023
1 parent 7364f63 commit 47b75ef
Show file tree
Hide file tree
Showing 12 changed files with 248 additions and 3 deletions.
33 changes: 33 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ members = [
"chain-extensions/dapps-staking",
"chain-extensions/pallet-assets",
"chain-extensions/xvm",
"chain-extensions/unified-accounts",
"chain-extensions/types/*",

"vendor/evm-tracing",
Expand Down Expand Up @@ -294,10 +295,12 @@ pallet-evm-precompile-batch = { path = "./precompiles/batch", default-features =
pallet-chain-extension-dapps-staking = { path = "./chain-extensions/dapps-staking", default-features = false }
pallet-chain-extension-xvm = { path = "./chain-extensions/xvm", default-features = false }
pallet-chain-extension-assets = { path = "./chain-extensions/pallet-assets", default-features = false }
pallet-chain-extension-unified-accounts = { path = "./chain-extensions/unified-accounts", default-features = false }

dapps-staking-chain-extension-types = { path = "./chain-extensions/types/dapps-staking", default-features = false }
xvm-chain-extension-types = { path = "./chain-extensions/types/xvm", default-features = false }
assets-chain-extension-types = { path = "./chain-extensions/types/assets", default-features = false }
unified-accounts-chain-extension-types = { path = "./chain-extensions/types/unified-accounts", default-features = false }

precompile-utils = { path = "./precompiles/utils", default-features = false }

Expand Down
27 changes: 27 additions & 0 deletions chain-extensions/types/unified-accounts/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[package]
name = "unified-accounts-chain-extension-types"
version = "0.1.0"
description = "Types definitions for contracts using Unified Accounts chain-extension."
authors.workspace = true
edition.workspace = true
homepage.workspace = true
repository.workspace = true

[dependencies]
num_enum = { workspace = true }
parity-scale-codec = { workspace = true }
scale-info = { workspace = true }

#substarte
sp-core = { workspace = true }
sp-runtime = { workspace = true }

[features]
default = ["std"]
std = [
"num_enum/std",
"parity-scale-codec/std",
"scale-info/std",
"sp-core/std",
"sp-runtime/std",
]
35 changes: 35 additions & 0 deletions chain-extensions/types/unified-accounts/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// This file is part of Astar.

// Copyright (C) 2019-2023 Stake Technologies Pte.Ltd.
// SPDX-License-Identifier: GPL-3.0-or-later

// Astar is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Astar is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Astar. If not, see <http://www.gnu.org/licenses/>.

#![cfg_attr(not(feature = "std"), no_std)]

use num_enum::{IntoPrimitive, TryFromPrimitive};
use parity_scale_codec::{Decode, Encode};

#[repr(u16)]
#[derive(TryFromPrimitive, IntoPrimitive, Decode, Encode)]
pub enum Command {
/// Get the mapped Evm address if any
GetEvmAddress = 0,
/// Get the mapped Evm address if any otheriwse default associated Evm address
GetEvmAddressOrDefault = 1,
/// Get the mapped Native address if any
GetNativeAddress = 2,
/// Get the mapped Native address if any otheriwse default associated Native address
GetNativeAddressOrDefault = 3,
}
44 changes: 44 additions & 0 deletions chain-extensions/unified-accounts/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
[package]
name = "pallet-chain-extension-unified-accounts"
version = "0.1.0"
description = "Chain extension for AU"
authors.workspace = true
edition.workspace = true
homepage.workspace = true
repository.workspace = true

[dependencies]
frame-support = { workspace = true }
frame-system = { workspace = true }
log = { workspace = true }
num-traits = { workspace = true }
pallet-contracts = { workspace = true }
pallet-contracts-primitives = { workspace = true }
parity-scale-codec = { workspace = true }
scale-info = { workspace = true }
sp-core = { workspace = true }
sp-runtime = { workspace = true }
sp-std = { workspace = true }

# Astar
astar-primitives = { workspace = true }
pallet-unified-accounts = { workspace = true }
unified-accounts-chain-extension-types = { workspace = true }

[features]
default = ["std"]
std = [
"parity-scale-codec/std",
"frame-support/std",
"frame-system/std",
"num-traits/std",
"pallet-contracts/std",
"pallet-contracts-primitives/std",
"scale-info/std",
"sp-std/std",
"sp-core/std",
"sp-runtime/std",
# Astar
"astar-primitives/std",
"pallet-unified-accounts/std",
]
84 changes: 84 additions & 0 deletions chain-extensions/unified-accounts/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// This file is part of Astar.

// Copyright (C) 2019-2023 Stake Technologies Pte.Ltd.
// SPDX-License-Identifier: GPL-3.0-or-later

// Astar is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Astar is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Astar. If not, see <http://www.gnu.org/licenses/>.

#![cfg_attr(not(feature = "std"), no_std)]

use astar_primitives::evm::{EvmAddress, UnifiedAddressMapper};
use core::marker::PhantomData;
use sp_runtime::DispatchError;

use frame_support::{traits::Get, DefaultNoBound};
use pallet_contracts::chain_extension::{
ChainExtension, Environment, Ext, InitState, Result as DispatchResult, RetVal,
};
use parity_scale_codec::Encode;
pub use unified_accounts_chain_extension_types::Command::{self, *};

#[derive(DefaultNoBound)]
pub struct UnifiedAccountsExtension<T, UA>(PhantomData<(T, UA)>);

impl<T, UA> ChainExtension<T> for UnifiedAccountsExtension<T, UA>
where
T: pallet_contracts::Config + pallet_unified_accounts::Config,
UA: UnifiedAddressMapper<T::AccountId>,
{
fn call<E>(&mut self, env: Environment<E, InitState>) -> DispatchResult<RetVal>
where
E: Ext<T = T>,
{
let mut env = env.buf_in_buf_out();
match env.func_id().try_into().map_err(|_| {
DispatchError::Other("Unsupported func id in Unified Accounts Chain Extension")
})? {
GetEvmAddress => {
let account_id: T::AccountId = env.read_as()?;

let base_weight = <T as frame_system::Config>::DbWeight::get().reads(1);
env.charge_weight(base_weight)?;
// write to buffer
UA::to_h160(&account_id).using_encoded(|r| env.write(r, false, None))?;
}
GetEvmAddressOrDefault => {
let account_id: T::AccountId = env.read_as()?;

let base_weight = <T as frame_system::Config>::DbWeight::get().reads(1);
env.charge_weight(base_weight)?;
// write to buffer
UA::to_h160_or_default(&account_id).using_encoded(|r| env.write(r, false, None))?;
}
GetNativeAddress => {
let evm_address: EvmAddress = env.read_as()?;

let base_weight = <T as frame_system::Config>::DbWeight::get().reads(1);
env.charge_weight(base_weight)?;
// write to buffer
UA::to_account_id(&evm_address).using_encoded(|r| env.write(r, false, None))?;
}
GetNativeAddressOrDefault => {
let evm_address: EvmAddress = env.read_as()?;

let base_weight = <T as frame_system::Config>::DbWeight::get().reads(1);
env.charge_weight(base_weight)?;
// write to buffer
UA::to_account_id_or_default(&evm_address)
.using_encoded(|r| env.write(r, false, None))?;
}
};
Ok(RetVal::Converging(0))
}
}
2 changes: 2 additions & 0 deletions runtime/local/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ pallet-transaction-payment-rpc-runtime-api = { workspace = true }
astar-primitives = { workspace = true }
pallet-block-reward = { workspace = true }
pallet-chain-extension-dapps-staking = { workspace = true }
pallet-chain-extension-unified-accounts = { workspace = true }
pallet-chain-extension-xvm = { workspace = true }
pallet-dapps-staking = { workspace = true }
pallet-dynamic-evm-base-fee = { workspace = true }
Expand Down Expand Up @@ -116,6 +117,7 @@ std = [
"pallet-contracts-primitives/std",
"pallet-chain-extension-dapps-staking/std",
"pallet-chain-extension-xvm/std",
"pallet-chain-extension-unified-accounts/std",
"pallet-dapps-staking/std",
"pallet-dynamic-evm-base-fee/std",
"pallet-ethereum/std",
Expand Down
7 changes: 6 additions & 1 deletion runtime/local/src/chain_extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@
// You should have received a copy of the GNU General Public License
// along with Astar. If not, see <http://www.gnu.org/licenses/>.

use super::{Runtime, Xvm};
use super::{Runtime, UnifiedAccounts, Xvm};

/// Registered WASM contracts chain extensions.
pub use pallet_chain_extension_assets::AssetsExtension;
use pallet_contracts::chain_extension::RegisteredChainExtension;

pub use pallet_chain_extension_dapps_staking::DappsStakingExtension;
pub use pallet_chain_extension_unified_accounts::UnifiedAccountsExtension;
pub use pallet_chain_extension_xvm::XvmExtension;

// Following impls defines chain extension IDs.
Expand All @@ -40,3 +41,7 @@ impl<W: pallet_chain_extension_assets::weights::WeightInfo> RegisteredChainExten
{
const ID: u16 = 02;
}

impl RegisteredChainExtension<Runtime> for UnifiedAccountsExtension<Runtime, UnifiedAccounts> {
const ID: u16 = 03;
}
6 changes: 6 additions & 0 deletions runtime/local/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -507,12 +507,18 @@ impl pallet_utility::Config for Runtime {
type WeightInfo = pallet_utility::weights::SubstrateWeight<Runtime>;
}

parameter_types! {
pub const AccountMappingStorageFee: u128 = deposit(2, 84);
}

impl pallet_unified_accounts::Config for Runtime {
type RuntimeEvent = RuntimeEvent;
type Currency = Balances;
type DefaultEvmToNative = pallet_evm::HashedAddressMapping<BlakeTwo256>;
type DefaultNativeToEvm = HashedAccountMapping<BlakeTwo256>;
type AccountMappingStorageFee = AccountMappingStorageFee;
type ChainId = ChainId;

type WeightInfo = pallet_unified_accounts::weights::SubstrateWeight<Self>;
}

Expand Down
2 changes: 2 additions & 0 deletions runtime/shibuya/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ orml-xtokens = { workspace = true }
astar-primitives = { workspace = true }
pallet-block-reward = { workspace = true }
pallet-chain-extension-dapps-staking = { workspace = true }
pallet-chain-extension-unified-accounts = { workspace = true }
pallet-chain-extension-xvm = { workspace = true }
pallet-collator-selection = { workspace = true }
pallet-dapps-staking = { workspace = true }
Expand Down Expand Up @@ -166,6 +167,7 @@ std = [
"pallet-contracts-primitives/std",
"pallet-chain-extension-dapps-staking/std",
"pallet-chain-extension-xvm/std",
"pallet-chain-extension-unified-accounts/std",
"pallet-dynamic-evm-base-fee/std",
"pallet-ethereum/std",
"pallet-preimage/std",
Expand Down
7 changes: 6 additions & 1 deletion runtime/shibuya/src/chain_extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@
// You should have received a copy of the GNU General Public License
// along with Astar. If not, see <http://www.gnu.org/licenses/>.

use super::{Runtime, Xvm};
use super::{Runtime, UnifiedAccounts, Xvm};

/// Registered WASM contracts chain extensions.
pub use pallet_chain_extension_assets::AssetsExtension;
use pallet_contracts::chain_extension::RegisteredChainExtension;

pub use pallet_chain_extension_dapps_staking::DappsStakingExtension;
pub use pallet_chain_extension_unified_accounts::UnifiedAccountsExtension;
pub use pallet_chain_extension_xvm::XvmExtension;

// Following impls defines chain extension IDs.
Expand All @@ -40,3 +41,7 @@ impl<W: pallet_chain_extension_assets::weights::WeightInfo> RegisteredChainExten
{
const ID: u16 = 02;
}

impl RegisteredChainExtension<Runtime> for UnifiedAccountsExtension<Runtime, UnifiedAccounts> {
const ID: u16 = 03;
}
1 change: 0 additions & 1 deletion runtime/shibuya/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,6 @@ impl pallet_xc_asset_config::Config for Runtime {
}

parameter_types! {
///
pub const AccountMappingStorageFee: u128 = deposit(2, 84);
}

Expand Down

0 comments on commit 47b75ef

Please sign in to comment.