You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -256,7 +256,7 @@ First, you'll update the runtime's `Cargo.toml` file to include the Utility pall
256
256
1. Open the `runtime/Cargo.toml` file and locate the `[dependencies]` section. Add pallet-utility as one of the features for the `polkadot-sdk` dependency with the following line:
257
257
258
258
```toml hl_lines="4" title="runtime/Cargo.toml"
259
-
259
+
[dependencies]
260
260
...
261
261
polkadot-sdk = { workspace = true, features = [
262
262
"pallet-utility",
@@ -267,17 +267,19 @@ First, you'll update the runtime's `Cargo.toml` file to include the Utility pall
267
267
2. In the same `[dependencies]` section, add the custom pallet that you built from scratch with the following line:
3. In the `[features]` section, add the custom pallet to the `std` feature list:
276
276
277
277
```toml hl_lines="5" title="Cargo.toml"
278
-
278
+
[features]
279
+
default = ["std"]
280
+
std = [
279
281
...
280
-
282
+
"custom-pallet/std",
281
283
...
282
284
]
283
285
```
@@ -2699,13 +2701,53 @@ To build the smart contract, follow the steps below:
2699
2701
6. Add the getter and setter functions:
2700
2702
2701
2703
```solidity
2702
-
2704
+
// SPDX-License-Identifier: MIT
2705
+
pragma solidity ^0.8.28;
2706
+
2707
+
contract Storage {
2708
+
// State variable to store our number
2709
+
uint256 private number;
2710
+
2711
+
// Event to notify when the number changes
2712
+
event NumberChanged(uint256 newNumber);
2713
+
2714
+
// Function to store a new number
2715
+
function store(uint256 newNumber) public {
2716
+
number = newNumber;
2717
+
emit NumberChanged(newNumber);
2718
+
}
2719
+
2720
+
// Function to retrieve the stored number
2721
+
function retrieve() public view returns (uint256) {
2722
+
return number;
2723
+
}
2724
+
}
2703
2725
```
2704
2726
2705
2727
??? code "Complete Storage.sol contract"
2706
2728
2707
2729
```solidity title="Storage.sol"
2708
-
2730
+
// SPDX-License-Identifier: MIT
2731
+
pragma solidity ^0.8.28;
2732
+
2733
+
contract Storage {
2734
+
// State variable to store our number
2735
+
uint256 private number;
2736
+
2737
+
// Event to notify when the number changes
2738
+
event NumberChanged(uint256 newNumber);
2739
+
2740
+
// Function to store a new number
2741
+
function store(uint256 newNumber) public {
2742
+
number = newNumber;
2743
+
emit NumberChanged(newNumber);
2744
+
}
2745
+
2746
+
// Function to retrieve the stored number
2747
+
function retrieve() public view returns (uint256) {
2748
+
return number;
2749
+
}
2750
+
}
2709
2751
```
2710
2752
2711
2753
## Understanding the Code
@@ -3343,7 +3385,23 @@ To create the ERC-20 contract, you can follow the steps below:
3343
3385
3. Now, paste the following ERC-20 contract code into the editor:
3344
3386
3345
3387
```solidity title="MyToken.sol"
3346
-
3388
+
// SPDX-License-Identifier: MIT
3389
+
// Compatible with OpenZeppelin Contracts ^5.0.0
3390
+
pragma solidity ^0.8.22;
3391
+
3392
+
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
3393
+
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
3394
+
3395
+
contract MyToken is ERC20, Ownable {
3396
+
constructor(address initialOwner)
3397
+
ERC20("MyToken", "MTK")
3398
+
Ownable(initialOwner)
3399
+
{}
3400
+
3401
+
function mint(address to, uint256 amount) public onlyOwner {
3402
+
_mint(to, amount);
3403
+
}
3404
+
}
3347
3405
```
3348
3406
3349
3407
The key components of the code above are:
@@ -8224,7 +8282,16 @@ The [`Account` data type](https://paritytech.github.io/polkadot-sdk/master/frame
8224
8282
The code snippet below shows how accounts are defined:
8225
8283
8226
8284
```rs
8227
-
8285
+
/// The full account information for a particular account ID.
8286
+
#[pallet::storage]
8287
+
#[pallet::getter(fn account)]
8288
+
pub type Account<T: Config> = StorageMap<
8289
+
_,
8290
+
Blake2_128Concat,
8291
+
T::AccountId,
8292
+
AccountInfo<T::Nonce, T::AccountData>,
8293
+
ValueQuery,
8294
+
>;
8228
8295
```
8229
8296
8230
8297
The preceding code block defines a storage map named `Account`. The `StorageMap` is a type of on-chain storage that maps keys to values. In the `Account` map, the key is an account ID, and the value is the account's information. Here, `T` represents the generic parameter for the runtime configuration, which is defined by the pallet's configuration trait (`Config`).
@@ -8248,7 +8315,24 @@ For a detailed explanation of storage maps, see the [`StorageMap`](https://parit
8248
8315
The `AccountInfo` structure is another key element within the [System pallet](https://paritytech.github.io/polkadot-sdk/master/src/frame_system/lib.rs.html){target=\_blank}, providing more granular details about each account's state. This structure tracks vital data, such as the number of transactions and the account’s relationships with other modules.
/// The number of transactions this account has sent.
8322
+
pub nonce: Nonce,
8323
+
/// The number of other modules that currently depend on this account's existence. The account
8324
+
/// cannot be reaped until this is zero.
8325
+
pub consumers: RefCount,
8326
+
/// The number of other modules that allow this account to exist. The account may not be reaped
8327
+
/// until this and `sufficients` are both zero.
8328
+
pub providers: RefCount,
8329
+
/// The number of modules that allow this account to exist for their own purposes only. The
8330
+
/// account may not be reaped until this and `providers` are both zero.
8331
+
pub sufficients: RefCount,
8332
+
/// The additional data that belongs to this account. Used to store the balance(s) in a lot of
8333
+
/// chains.
8334
+
pub data: AccountData,
8335
+
}
8252
8336
```
8253
8337
8254
8338
The `AccountInfo` structure includes the following components:
@@ -9262,7 +9346,8 @@ The [`XcmRouter`](https://paritytech.github.io/polkadot-sdk/master/pallet_xcm/pa
9262
9346
For instance, the Kusama network employs the [`ChildParachainRouter`](https://paritytech.github.io/polkadot-sdk/master/polkadot_runtime_common/xcm_sender/struct.ChildParachainRouter.html){target=\_blank}, which restricts routing to [Downward Message Passing (DMP)](https://wiki.polkadot.com/learn/learn-xcm-transport/#dmp-downward-message-passing){target=\_blank} from the relay chain to parachains, ensuring secure and controlled communication.
For more details about XCM transport protocols, see the [XCM Channels](/develop/interoperability/xcm-channels/){target=\_blank} page.
@@ -10388,25 +10473,95 @@ The `xcm-emulator` provides macros for defining a mocked testing environment. Ch
10388
10473
- **[`decl_test_relay_chains`](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2506-2/cumulus/xcm/xcm-emulator/src/lib.rs#L361){target=\_blank}**: Defines runtime and configuration for the relay chains. Example:
- **[`decl_test_parachains`](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2506-2/cumulus/xcm/xcm-emulator/src/lib.rs#L596){target=\_blank}**: Defines runtime and configuration for parachains. Example:
- **[`decl_test_bridges`](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2506-2/cumulus/xcm/xcm-emulator/src/lib.rs#L1221){target=\_blank}**: Creates bridges between chains, specifying the source, target, and message handler. Example:
10401
10531
10402
10532
```rust
10403
-
10533
+
decl_test_bridges! {
10534
+
pub struct RococoWestendMockBridge {
10535
+
source = BridgeHubRococoPara,
10536
+
target = BridgeHubWestendPara,
10537
+
handler = RococoWestendMessageHandler
10538
+
},
10539
+
pub struct WestendRococoMockBridge {
10540
+
source = BridgeHubWestendPara,
10541
+
target = BridgeHubRococoPara,
10542
+
handler = WestendRococoMessageHandler
10543
+
}
10544
+
}
10404
10545
```
10405
10546
10406
10547
- **[`decl_test_networks`](https://github.com/paritytech/polkadot-sdk/blob/polkadot-stable2506-2/cumulus/xcm/xcm-emulator/src/lib.rs#L958){target=\_blank}**: Defines a testing network with relay chains, parachains, and bridges, implementing message transport and processing logic. Example:
10407
10548
10408
10549
```rust
10409
-
10550
+
decl_test_networks! {
10551
+
pub struct WestendMockNet {
10552
+
relay_chain = Westend,
10553
+
parachains = vec![
10554
+
AssetHubWestend,
10555
+
BridgeHubWestend,
10556
+
CollectivesWestend,
10557
+
CoretimeWestend,
10558
+
PeopleWestend,
10559
+
PenpalA,
10560
+
PenpalB,
10561
+
],
10562
+
bridge = ()
10563
+
},
10564
+
}
10410
10565
```
10411
10566
10412
10567
By leveraging these macros, developers can customize their testing networks by defining relay chains and parachains tailored to their needs. For guidance on implementing a mock runtime for a Polkadot SDK-based chain, refer to the [Pallet Testing](/parachains/customize-runtime/pallet-development/pallet-testing/){target=\_blank} article.
0 commit comments