Skip to content

Integration of partner pallets

Partner Pallet Integration

This guide describes adding an external FRAME pallet to the taler runtime and preparing it for network operation (genesis, weights, RPC/runtime-API if necessary).

Prerequisites: - The pallet must support no_std and have a std feature for the host. - For production, weights are mandatory and, if necessary, benchmarking.

1) Adding dependency to runtime/Cargo.toml - For Substrate pallets use git/branch SDK, for local ones — path.

[dependencies]
partner-pallet = { version = "4.0.0-dev", default-features = false, git = "https://github.com/<org>/<repo>.git", branch = "release-polkadot-v1.3.0" }

[features]
std = [
  # ... existing
  "partner-pallet/std",
]

2) Implementing Config in runtime/src/lib.rs - Import the pallet and implement its Config with types, constants and WeightInfo.

parameter_types! {
    pub const PartnerParam: u32 = 42;
}

impl partner_pallet::Config for Runtime {
    type RuntimeEvent = RuntimeEvent;
    type Currency = Balances; // if required
    type SomeParam = PartnerParam;
    type WeightInfo = partner_pallet::weights::SubstrateWeight<Runtime>;
}

3) Including in construct_runtime!

construct_runtime!(
    pub struct Runtime {
        // ... existing pallets
        PartnerPallet: partner_pallet = 210, // unique index
    }
);

4) Genesis config (optional) - If the pallet has GenesisConfig, add initialization to node/src/chain_spec.rs in the testnet_genesis function.

partner_pallet: partner_pallet::GenesisConfig {
    // initial values
},

5) Weights and benchmarking - Enable the runtime-benchmarks feature in runtime/Cargo.toml (if the pallet supports it). - Generate weights and update the partner pallet's weights.rs or use provided weights.

cargo run --release -p taler-node --features runtime-benchmarks \
  -- benchmark pallet \
  --pallet "partner_pallet" \
  --extrinsic "*" \
  --wasm-execution compiled \
  --heap-pages 4096 \
  --output ./pallets/partner-pallet/src/weights.rs \
  --template ./templates/weight-template.hbs

6) Runtime API / RPC (if necessary) - If off-chain calls are required, add runtime-API: - crate partner-pallet-runtime-api in runtime/Cargo.toml. - impl_runtime_apis! in runtime/src/lib.rs with pallet calls. - For custom RPC: - server part in node/src/rpc.rs (jsonrpsee) and providers.

7) Features and std - Ensure the pallet dependency is specified with default-features = false, and its std is included in the runtime's std feature list.

8) Updating spec_version - When changing runtime logic (pallet composition, types, constants) increment spec_version in runtime/src/lib.rs.

9) Migrations - If the pallet contains storage migrations, add its OnRuntimeUpgrade to the runtime's Migrations aggregate.

10) Verification - Build wasm and native runtime:

cargo build --release
- Start the node and verify extrinsics, storage and pallet events through polkadot.js/apps.

11) Including in Governance/Origin (optional) - If the pallet requires access rights (Root/council/tech committee), configure EnsureOrigin/EitherOfDiverse based on already used collectives (Council, TechnicalCommittee) as in existing pallets.

Notes: - Taler already uses many system pallets; avoid index conflicts in construct_runtime! and type duplicates. - For working with tokens/assets, reuse Balances, Assets, Nfts.