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:
@@ -3661,7 +3719,26 @@ To create the NFT contract, you can follow the steps below:
3661
3719
3. Now, paste the following NFT contract code into the editor.
3662
3720
3663
3721
```solidity title="MyNFT.sol"
3664
-
3722
+
// SPDX-License-Identifier: MIT
3723
+
// Compatible with OpenZeppelin Contracts ^5.0.0
3724
+
pragma solidity ^0.8.22;
3725
+
3726
+
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
3727
+
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
3728
+
3729
+
contract MyToken is ERC721, Ownable {
3730
+
uint256 private _nextTokenId;
3731
+
3732
+
constructor(address initialOwner)
3733
+
ERC721("MyToken", "MTK")
3734
+
Ownable(initialOwner)
3735
+
{}
3736
+
3737
+
function safeMint(address to) public onlyOwner {
3738
+
uint256 tokenId = _nextTokenId++;
3739
+
_safeMint(to, tokenId);
3740
+
}
3741
+
}
3665
3742
```
3666
3743
3667
3744
The key components of the code above are:
@@ -8224,7 +8301,16 @@ The [`Account` data type](https://paritytech.github.io/polkadot-sdk/master/frame
8224
8301
The code snippet below shows how accounts are defined:
8225
8302
8226
8303
```rs
8227
-
8304
+
/// The full account information for a particular account ID.
8305
+
#[pallet::storage]
8306
+
#[pallet::getter(fn account)]
8307
+
pub type Account<T: Config> = StorageMap<
8308
+
_,
8309
+
Blake2_128Concat,
8310
+
T::AccountId,
8311
+
AccountInfo<T::Nonce, T::AccountData>,
8312
+
ValueQuery,
8313
+
>;
8228
8314
```
8229
8315
8230
8316
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 +8334,24 @@ For a detailed explanation of storage maps, see the [`StorageMap`](https://parit
8248
8334
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.
8341
+
pub nonce: Nonce,
8342
+
/// The number of other modules that currently depend on this account's existence. The account
8343
+
/// cannot be reaped until this is zero.
8344
+
pub consumers: RefCount,
8345
+
/// The number of other modules that allow this account to exist. The account may not be reaped
8346
+
/// until this and `sufficients` are both zero.
8347
+
pub providers: RefCount,
8348
+
/// The number of modules that allow this account to exist for their own purposes only. The
8349
+
/// account may not be reaped until this and `providers` are both zero.
8350
+
pub sufficients: RefCount,
8351
+
/// The additional data that belongs to this account. Used to store the balance(s) in a lot of
8352
+
/// chains.
8353
+
pub data: AccountData,
8354
+
}
8252
8355
```
8253
8356
8254
8357
The `AccountInfo` structure includes the following components:
@@ -9262,7 +9365,8 @@ The [`XcmRouter`](https://paritytech.github.io/polkadot-sdk/master/pallet_xcm/pa
9262
9365
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 +10492,95 @@ The `xcm-emulator` provides macros for defining a mocked testing environment. Ch
10388
10492
- **[`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
10550
10402
10551
```rust
10403
-
10552
+
decl_test_bridges! {
10553
+
pub struct RococoWestendMockBridge {
10554
+
source = BridgeHubRococoPara,
10555
+
target = BridgeHubWestendPara,
10556
+
handler = RococoWestendMessageHandler
10557
+
},
10558
+
pub struct WestendRococoMockBridge {
10559
+
source = BridgeHubWestendPara,
10560
+
target = BridgeHubRococoPara,
10561
+
handler = WestendRococoMessageHandler
10562
+
}
10563
+
}
10404
10564
```
10405
10565
10406
10566
- **[`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
10567
10408
10568
```rust
10409
-
10569
+
decl_test_networks! {
10570
+
pub struct WestendMockNet {
10571
+
relay_chain = Westend,
10572
+
parachains = vec![
10573
+
AssetHubWestend,
10574
+
BridgeHubWestend,
10575
+
CollectivesWestend,
10576
+
CoretimeWestend,
10577
+
PeopleWestend,
10578
+
PenpalA,
10579
+
PenpalB,
10580
+
],
10581
+
bridge = ()
10582
+
},
10583
+
}
10410
10584
```
10411
10585
10412
10586
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