Skip to content

Commit

Permalink
feat: add batch precompile (#989)
Browse files Browse the repository at this point in the history
* feat: add batch precompile

* typo

* add tests

* minor fixes and updates

* refactor, add batch to local

* fix expect_arguments

* add logs

* update license

* taplo fix

* more refactor, remote evm crate

* remove evm crate, update utils version, add std in dappsstaking

* update pallet_balances::config in mock

* update pallet_evm config

* update license

* add to std-feature

* utils: rectify  patch to minor update

* remove pub from logs function

* fix typos

* remove comments

* refactor

* fmt
  • Loading branch information
gitofdeepanshu authored Aug 11, 2023
1 parent 1302aa9 commit c0d3999
Show file tree
Hide file tree
Showing 21 changed files with 2,578 additions and 461 deletions.
36 changes: 35 additions & 1 deletion Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ num-traits = { version = "0.2", default-features = false }
rand = { version = "0.8.5", default-features = false }
bounded-collections = { version = "0.1.5", default-features = false }
hex = { version = "0.4.3", default-features = false }
paste = "1.0.6"

# (native)
array-bytes = "6.0.0"
Expand Down Expand Up @@ -285,6 +286,7 @@ pallet-evm-precompile-substrate-ecdsa = { path = "./precompiles/substrate-ecdsa"
pallet-evm-precompile-xcm = { path = "./precompiles/xcm", default-features = false }
pallet-evm-precompile-xvm = { path = "./precompiles/xvm", default-features = false }
pallet-evm-precompile-dapps-staking = { path = "./precompiles/dapps-staking", default-features = false }
pallet-evm-precompile-batch = { path = "./precompiles/batch", default-features = false }

pallet-chain-extension-dapps-staking = { path = "./chain-extensions/dapps-staking", default-features = false }
pallet-chain-extension-xvm = { path = "./chain-extensions/xvm", default-features = false }
Expand Down
77 changes: 77 additions & 0 deletions precompiles/batch/Batch.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.3;

/// Interface to the precompiled contract on Shibuya/Shiden/Astar
/// Predeployed at the address 0x0000000000000000000000000000000000005006
/// For better understanding check the source code:
/// repo: https://github.com/AstarNetwork/astar

/// @title Batch precompile
/// @dev Allows to perform multiple calls through one call to the precompile.
/// Can be used by EOA to do multiple calls in a single transaction.
interface Batch {
/// @dev Batch multiple calls into a single transaction.
/// All calls are performed from the address calling this precompile.
///
/// In case of one subcall reverting following subcalls will still be attempted.
///
/// @param to List of addresses to call.
/// @param value List of values for each subcall. If array is shorter than `to` then additional
/// calls will be performed with a value of 0.
/// @param callData Call data for each `to` address. If array is shorter than `to` then
/// additional calls will be performed with an empty call data.
/// @param gasLimit Gas limit for each `to` address. Use 0 to forward all the remaining gas.
/// If array is shorter than `to` then the remaining gas available will be used.
function batchSome(
address[] memory to,
uint256[] memory value,
bytes[] memory callData,
uint64[] memory gasLimit
) external;

/// @dev Batch multiple calls into a single transaction.
/// All calls are performed from the address calling this precompile.
///
/// In case of one subcall reverting, no more subcalls will be executed but
/// the batch transaction will succeed. Use "batchAll" to revert on any subcall revert.
///
/// @param to List of addresses to call.
/// @param value List of values for each subcall. If array is shorter than `to` then additional
/// calls will be performed with a value of 0.
/// @param callData Call data for each `to` address. If array is shorter than `to` then
/// additional calls will be performed with an empty call data.
/// @param gasLimit Gas limit for each `to` address. Use 0 to forward all the remaining gas.
/// If array is shorter than `to` then the remaining gas available will be used.
function batchSomeUntilFailure(
address[] memory to,
uint256[] memory value,
bytes[] memory callData,
uint64[] memory gasLimit
) external;

/// @dev Batch multiple calls into a single transaction.
/// All calls are performed from the address calling this precompile.
///
/// In case of one subcall reverting, the entire batch will revert.
///
/// @param to List of addresses to call.
/// @param value List of values for each subcall. If array is shorter than `to` then additional
/// calls will be performed with a value of 0.
/// @param callData Call data for each `to` address. If array is shorter than `to` then
/// additional calls will be performed with an empty call data.
/// @param gasLimit Gas limit for each `to` address. Use 0 to forward all the remaining gas.
/// If array is shorter than `to` then the remaining gas available will be used.
function batchAll(
address[] memory to,
uint256[] memory value,
bytes[] memory callData,
uint64[] memory gasLimit
) external;

/// Emitted when a subcall succeeds.
event SubcallSucceeded(uint256 index);

/// Emitted when a subcall fails.
event SubcallFailed(uint256 index);

}
57 changes: 57 additions & 0 deletions precompiles/batch/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
[package]
name = "pallet-evm-precompile-batch"
description = "A Precompile to batch multiple calls."
version = "0.1.0"
authors = ["StakeTechnologies", "PureStake"]
edition.workspace = true
homepage.workspace = true
repository.workspace = true

[dependencies]
log = { workspace = true }
num_enum = { workspace = true }
paste = { workspace = true }
slices = { workspace = true }

# Moonbeam
precompile-utils = { workspace = true }

# Substrate
frame-support = { workspace = true }
frame-system = { workspace = true }
parity-scale-codec = { workspace = true, features = ["max-encoded-len"] }
sp-core = { workspace = true }
sp-io = { workspace = true }
sp-std = { workspace = true }

# Frontier
evm = { workspace = true, features = ["with-codec"] }
fp-evm = { workspace = true }
pallet-evm = { workspace = true }

[dev-dependencies]
derive_more = { workspace = true }
hex-literal = { workspace = true }
serde = { workspace = true }
sha3 = { workspace = true }

pallet-balances = { workspace = true, features = ["std"] }
pallet-timestamp = { workspace = true, features = ["std"] }
parity-scale-codec = { workspace = true, features = ["max-encoded-len", "std"] }
precompile-utils = { workspace = true, features = ["std", "testing"] }
scale-info = { workspace = true, features = ["derive", "std"] }
sp-runtime = { workspace = true, features = ["std"] }

[features]
default = ["std"]
std = [
"fp-evm/std",
"frame-support/std",
"frame-system/std",
"pallet-evm/std",
"parity-scale-codec/std",
"precompile-utils/std",
"sp-core/std",
"sp-io/std",
"sp-std/std",
]
Loading

0 comments on commit c0d3999

Please sign in to comment.