Skip to content
  1. Feb 23, 2024
  2. Feb 21, 2024
    • Alexander Theißen's avatar
      contracts: Fix double charge of gas for host functions (#3361) · f3a6b6dc
      Alexander Theißen authored
      
      
      This PR is fixing a bug in the sync mechanism between wasmi and
      pallet-contracts. This bug leads to essentially double charging all the
      gas that was used during the execution of the host function. When the
      `call` host function is used for recursion this will lead to a quadratic
      amount of gas consumption with regard to the nesting depth.We also took
      the chance to refactor the code in question and improve the rust docs.
      
      The bug was caused by not updating `GasMeter::executor_consumed`
      (previously `engine_consumed`) when leaving the host function. This lead
      to the value being stale (too low) when entering another host function.
      
      ---------
      
      Co-authored-by: default avatarPG Herveou <[email protected]>
      f3a6b6dc
  3. Feb 20, 2024
    • PG Herveou's avatar
      Contracts: Stabilize APIs (#3384) · d250a6e4
      PG Herveou authored
      Remove `#[unstable]` on `call_v2`, `instantiate_v2`,
      `lock_delegate_dependency` and `unlock_delegate_dependency`.
      See ink! integrations: 
      - call_v2: https://github.com/paritytech/ink/pull/2077
      - instantiate_v2: <TODO>
      - lock/unlock dependency: https://github.com/paritytech/ink/pull/2076
      d250a6e4
  4. Feb 19, 2024
    • PG Herveou's avatar
      Contracts: xcm host fn fixes (#3086) · ca382f32
      PG Herveou authored
      ## Xcm changes:
      - Fix `pallet_xcm::execute`, move the logic into The `ExecuteController`
      so it can be shared with anything that implement that trait.
      - Make `ExecuteController::execute` retursn `DispatchErrorWithPostInfo`
      instead of `DispatchError`, so that we don't charge the full
      `max_weight` provided if the execution is incomplete (useful for
      force_batch or contracts calls)
      - Fix docstring for `pallet_xcm::execute`, to reflect the changes from
      #2405
      - Update the signature for `ExecuteController::execute`, we don't need
      to return the `Outcome` anymore since we only care about
      `Outcome::Complete`
      
      ## Contracts changes:
      
      - Update host fn `xcm_exexute`, we don't need to write the `Outcome` to
      the sandbox memory anymore. This was also not charged as well before so
      it if fixes this too.
      - One of the issue was that the dry_run of a contract that call
      `xcm_execute` would exhaust the `gas_limit`.
      
      This is because `XcmExecuteController::execute` takes a `max_weight`
      argument, and since we don't want the user to specify it manually we
      were passing everything left by pre-charghing
      `ctx.ext.gas_meter().gas_left()`
      
      - To fix it I added a `fn influence_lowest_limit` on the `Token` trait
      and make it return false for `RuntimeCost::XcmExecute`.
      - Got rid of the `RuntimeToken` indirection, we can just use
      `RuntimeCost` directly.
      
      ---------
      
      Co-authored-by: command-bot <>
      ca382f32
    • Gilt0's avatar
      [FRAME Core] remove unnecessary overrides while using derive_impl for frame_system (#3317) · b78c72cf
      Gilt0 authored
      
      
      # Description
      
      This PR removes redundant type definition from test definition config
      implementations like
      ```
      #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)]
      impl frame_system::Config for Test {
          type A = A;
          ...
      }
      ```
      
      This changes avoid redundancies in the code as the macro `derive_impl`
      defines the relevant types. To implement the changes, it was a simple
      fact of running tests and making sure that the tests would still run
      while the definition would be removed.
      
      Closes #3237
      
      As a note, here is a brief account of things done from the Issue's
      description statement
      ```
      alliance migrate alliance, fast-unstake and bags list to use derive-impl #1636
      asset-conversion                                                                                            DONE
      asset-rate                                                                                                  DONE
      assets                                                                                                      DONE
      atomic-swap                                                                                                 DONE
      aura                                                                                                        DONE
      authority-discovery                                                                                         DONE                                                                     
      authorship  migrate babe and authorship to use derive-impl #1790
      babe  migrate babe and authorship to use derive-impl #1790
      bags-list migrate alliance, fast-unstake and bags list to use derive-impl #1636
      balances                                                                                                    DONE
      beefy                                                                                                       NOTHING TO DO --- also noted this error without failing tests Feb 13 13:49:08.941 ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0
      beefy-mmr                                                                                                   NOTHING TO DO
      bounties                                                                                                    DONE
      child-bounties                                                                                              DONE
      collective                                                                                                  DONE
      contracts                                                                                                   DONE
      conviction-voting                                                                                           DONE
      core-fellowship                                                                                             NOTHING TO DO
      democracy                                                                                                   DONE
      election-provider-multi-phase                                                                               NOTHING TO DO
      elections-phragmen                                                                                          DONE
      executive                                                                                                   NOTHING TO DO
      fast-unstake migrate alliance, fast-unstake and bags list to use derive-impl #1636
      glutton                                                                                                     DONE
      grandpa                                                                                                     DONE
      identity                                                                                                    DONE
      im-online                                                                                                   NOTHING TO DO
      indices Refactor indices pallet #1789
      insecure-randomness-collective-flip                                                                         DONE
      lottery                                                                                                     DONE
      membership                                                                                                  DONE
      merkle-mountain-range                                                                                       NOTHING TO DO
      message-queue                                                                                               DONE
      multisig add frame_system::DefaultConfig to individual pallet DefaultConfigs substrate#14453
      nft-fractionalization                                                                                       DONE
      nfts                                                                                                        DONE
      nicks Refactor pallet-state-trie-migration to fungible::* traits #1801                                      NOT IN REPO
      nis                                                                                                         DONE
      node-authorization                                                                                          DONE
      nomination-pools                                                                                            NOTHING TO DO -- ONLY impl for Runtime
      offences                                                                                                    DELETED EVERYTHING -- IS THAT CORRECT??
      preimage                                                                                                    DONE
      proxy add frame_system::DefaultConfig to individual pallet DefaultConfigs substrate#14453
      ranked-collective                                                                                           NOTHING TO DO
      recovery                                                                                                    DONE
      referenda                                                                                                   DONE
      remark                                                                                                      DONE
      root-offences                                                                                               DONE
      root-testing                                                                                                NOTHING TO DO
      salary                                                                                                      NOTHING TO DO
      scheduler                                                                                                   DONE
      scored-pool                                                                                                 DONE
      session                                                                                                     DONE -- substrate/frame/session/benchmarking/src/mock.rs untouched
      society                                                                                                     NOTHING TO DO
      staking                                                                                                     DONE
      staking-bags-benchmarks                                                                                     NOT IN REPO
      state-trie-migration                                                                                        NOTHING TO DO
      statement                                                                                                   DONE
      sudo                                                                                                        DONE
      system                                                                                                      DONE
      timestamp                                                                                                   DONE
      tips                                                                                                        DONE
      transaction-payment                                                                                         NOTHING TO DO
      transaction-storage                                                                                         NOTHING TO DO
      treasury                                                                                                    DONE
      try-runtime                                                                                                 NOTHING TO DO -- no specific mention of 'for Test'
      uniques                                                                                                     DONE
      utility                                                                                                     DONE
      vesting                                                                                                     DONE
      whitelist                                                                                                   DONE
      ```
      
      ---------
      
      Co-authored-by: command-bot <>
      Co-authored-by: default avatargupnik <[email protected]>
      b78c72cf
  5. Feb 08, 2024
    • Alexander Theißen's avatar
      contracts: Remove no longer enforced limits from the `Schedule` (#3184) · d54412ce
      Alexander Theißen authored
      When switching from the instrumented gas metering to the wasmi gas
      metering we also removed all imposed limits regarding Wasm module
      internals. All those things do not interact with the host and have to be
      handled by wasmi. For example, Wasmi charges additional gas for
      parameters to each function because as they incur some overhead.
      
      Back then we took the opportunity to remove the dependency on the
      deprecated `parity-wasm` which was used to enforce those limits.
      
      This PR merely removes them from the `Schedule` they aren't enforced for
      a while.
      d54412ce
    • Alexander Theißen's avatar
      contracts: Remove unused benchmarks (#3185) · 7fa05518
      Alexander Theißen authored
      Those were used for some adhoc comparison of solang vs ink! with regards
      to ERC20 transfers. Not been used for a while.
      
      Benchmarking is done here now:
      [smart-bench](https://github.com/paritytech/smart-bench): Weight based
      benchmark to test how much transaction actually fit into a block with
      the current Weights
      [schlau](https://github.com/ascjones/schlau): Time based benchmarks to
      compare performance
      7fa05518
    • Alexander Theißen's avatar
      contracts: Don't fail fast if the `Weight` limit of a cross contract call is too big (#3243) · 28463a12
      Alexander Theißen authored
      
      
      When doing a cross contract call you can supply an optional Weight limit
      for that call. If one doesn't specify the limit (setting it to 0) the
      sub call will have all the remaining gas available. If one does specify
      the limit we subtract that amount eagerly from the Weight meter and fail
      fast if not enough `Weight` is available.
      
      This is quite annoying because setting a fixed limit will set the
      `gas_required` in the gas estimation according to the specified limit.
      Even if in that dry-run the actual call didn't consume that whole
      amount. It effectively discards the more precise measurement it should
      have from the dry-run.
      
      This PR changes the behaviour so that the supplied limit is an actual
      limit: We do the cross contract call even if the limit is higher than
      the remaining `Weight`. We then fail and roll back in the cub call in
      case there is not enough weight.
      
      This makes the weight estimation in the dry-run no longer dependent on
      the weight limit supplied when doing a cross contract call.
      
      ---------
      
      Co-authored-by: default avatarPG Herveou <[email protected]>
      28463a12
  6. Feb 06, 2024
    • Squirrel's avatar
      sp-std -> core (#3199) · bc2e5e1f
      Squirrel authored
      First in a series of PRs that reduces our use of sp-std with a view to
      deprecating it.
      
      This is just looking at /substrate and moving some of the references
      from `sp-std` to `core`.
      These particular changes should be uncontroversial.
      
      Where macros are used `::core` should be used to remove any ambiguity.
      
      part of https://github.com/paritytech/polkadot-sdk/issues/2101
      bc2e5e1f
  7. Feb 03, 2024
  8. Jan 31, 2024
    • Branislav Kontur's avatar
      [frame] `#[pallet::composite_enum]` improved variant count handling + removed... · bb8ddc46
      Branislav Kontur authored
      [frame] `#[pallet::composite_enum]` improved variant count handling + removed `pallet_balances`'s `MaxHolds` config (#2657)
      
      I started this investigation/issue based on @liamaharon
      
       question
      [here](https://github.com/paritytech/polkadot-sdk/pull/1801#discussion_r1410452499).
      
      ## Problem
      
      The `pallet_balances` integrity test should correctly detect that the
      runtime has correct distinct `HoldReasons` variant count. I assume the
      same situation exists for RuntimeFreezeReason.
      
      It is not a critical problem, if we set `MaxHolds` with a sufficiently
      large value, everything should be ok. However, in this case, the
      integrity_test check becomes less useful.
      
      **Situation for "any" runtime:**
      - `HoldReason` enums from different pallets:
      ```rust
              /// from pallet_nis
              #[pallet::composite_enum]
      	pub enum HoldReason {
      		NftReceipt,
      	}
      
              /// from pallet_preimage
              #[pallet::composite_enum]
      	pub enum HoldReason {
      		Preimage,
      	}
      
              // from pallet_state-trie-migration
              #[pallet::composite_enum]
      	pub enum HoldReason {
      		SlashForContinueMigrate,
      		SlashForMigrateCustomTop,
      		SlashForMigrateCustomChild,
      	}
      ```
      
      - generated `RuntimeHoldReason` enum looks like:
      ```rust
      pub enum RuntimeHoldReason {
      
          #[codec(index = 32u8)]
          Preimage(pallet_preimage::HoldReason),
      
          #[codec(index = 38u8)]
          Nis(pallet_nis::HoldReason),
      
          #[codec(index = 42u8)]
          StateTrieMigration(pallet_state_trie_migration::HoldReason),
      }
      ```
      
      - composite enum `RuntimeHoldReason` variant count is detected as `3`
      - we set `type MaxHolds = ConstU32<3>`
      - `pallet_balances::integrity_test` is ok with `3`(at least 3)
      
      However, the real problem can occur in a live runtime where some
      functionality might stop working. This is due to a total of 5 distinct
      hold reasons (for pallets with multi-instance support, it is even more),
      and not all of them can be used because of an incorrect `MaxHolds`,
      which is deemed acceptable according to the `integrity_test`:
        ```
        // pseudo-code - if we try to call all of these:
      
      T::Currency::hold(&pallet_nis::HoldReason::NftReceipt.into(),
      &nft_owner, deposit)?;
      T::Currency::hold(&pallet_preimage::HoldReason::Preimage.into(),
      &nft_owner, deposit)?;
      
      T::Currency::hold(&pallet_state_trie_migration::HoldReason::SlashForContinueMigrate.into(),
      &nft_owner, deposit)?;
      
        // With `type MaxHolds = ConstU32<3>` these two will fail
      
      T::Currency::hold(&pallet_state_trie_migration::HoldReason::SlashForMigrateCustomTop.into(),
      &nft_owner, deposit)?;
      
      T::Currency::hold(&pallet_state_trie_migration::HoldReason::SlashForMigrateCustomChild.into(),
      &nft_owner, deposit)?;
        ```  
      
      
      ## Solutions
      
      A macro `#[pallet::*]` expansion is extended of `VariantCount`
      implementation for the `#[pallet::composite_enum]` enum type. This
      expansion generates the `VariantCount` implementation for pallets'
      `HoldReason`, `FreezeReason`, `LockId`, and `SlashReason`. Enum variants
      must be plain enum values without fields to ensure a deterministic
      count.
      
      The composite runtime enum, `RuntimeHoldReason` and
      `RuntimeFreezeReason`, now sets `VariantCount::VARIANT_COUNT` as the sum
      of pallets' enum `VariantCount::VARIANT_COUNT`:
      ```rust
      #[frame_support::pallet(dev_mode)]
      mod module_single_instance {
      
      	#[pallet::composite_enum]
      	pub enum HoldReason {
      		ModuleSingleInstanceReason1,
      		ModuleSingleInstanceReason2,
      	}
      ...
      }
      
      #[frame_support::pallet(dev_mode)]
      mod module_multi_instance {
      
      	#[pallet::composite_enum]
      	pub enum HoldReason<I: 'static = ()> {
      		ModuleMultiInstanceReason1,
      		ModuleMultiInstanceReason2,
      		ModuleMultiInstanceReason3,
      	}
      ...
      }
      
      
      impl self::sp_api_hidden_includes_construct_runtime::hidden_include::traits::VariantCount
          for RuntimeHoldReason
      {
          const VARIANT_COUNT: u32 = 0
              + module_single_instance::HoldReason::VARIANT_COUNT
              + module_multi_instance::HoldReason::<module_multi_instance::Instance1>::VARIANT_COUNT
              + module_multi_instance::HoldReason::<module_multi_instance::Instance2>::VARIANT_COUNT
              + module_multi_instance::HoldReason::<module_multi_instance::Instance3>::VARIANT_COUNT;
      }
      ```
      
      In addition, `MaxHolds` is removed (as suggested
      [here](https://github.com/paritytech/polkadot-sdk/pull/2657#discussion_r1443324573))
      from `pallet_balances`, and its `Holds` are now bounded to
      `RuntimeHoldReason::VARIANT_COUNT`. Therefore, there is no need to let
      the runtime specify `MaxHolds`.
      
      
      ## For reviewers
      
      Relevant changes can be found here:
      - `substrate/frame/support/procedural/src/lib.rs` 
      -  `substrate/frame/support/procedural/src/pallet/parse/composite.rs`
      -  `substrate/frame/support/procedural/src/pallet/expand/composite.rs`
      -
      `substrate/frame/support/procedural/src/construct_runtime/expand/composite_helper.rs`
      -
      `substrate/frame/support/procedural/src/construct_runtime/expand/hold_reason.rs`
      -
      `substrate/frame/support/procedural/src/construct_runtime/expand/freeze_reason.rs`
      - `substrate/frame/support/src/traits/misc.rs`
      
      And the rest of the files is just about removed `MaxHolds` from
      `pallet_balances`
      
      ## Next steps
      
      Do the same for `MaxFreezes`
      https://github.com/paritytech/polkadot-sdk/issues/2997.
      
      ---------
      
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarBastian Köcher <[email protected]>
      Co-authored-by: default avatarDónal Murray <[email protected]>
      Co-authored-by: default avatargupnik <[email protected]>
      bb8ddc46
  9. Jan 26, 2024
    • Alexander Theißen's avatar
      contracts: Fix printing the `Schedule` (#3021) · 5e5341da
      Alexander Theißen authored
      Printing the `Schedule` is a useful debugging tool and general sanity
      check. It is much more easy to interpret than the raw weights.
      
      The printing relied on using `println` and hence was only available from
      the native runtime. This is no longer available. This is why in this PR
      we switch to using `log` which works from Wasm.
      
      I made sure that the `WeightDebug` is only derived when
      `runtime-benchmarks` is set so that we don't increase the size of the
      binary.
      
      Some other changes were necessary to make this actually work inside the
      runtime. For example, I needed to remove `format!` and usage of floats.
      
      Please note that this removed the decimal from the number because
      truncating the fraction without using floats would not be easy and would
      require custom code. I think the precision here is sufficient.
      
      This is how the output looks like now:
      ```
      Schedule {
          limits: Limits {
              event_topics: 4,
              globals: 256,
              locals: 1024,
              parameters: 128,
              memory_pages: 16,
              table_size: 4096,
              br_table_size: 256,
              subject_len: 32,
              payload_len: 16384,
              runtime_memory: 134217728,
          },
          instruction_weights: InstructionWeights {
              base: 2565,
              _phantom: PhantomData<kitchensink_runtime::Runtime>,
          },
          host_fn_weights: HostFnWeights {
              caller: 322 ns, 6 bytes,
              is_contract: 28 µs, 2684 bytes,
              code_hash: 29 µs, 2688 bytes,
              own_code_hash: 400 ns, 6 bytes,
              caller_is_origin: 176 ns, 3 bytes,
              caller_is_root: 158 ns, 3 bytes,
              address: 315 ns, 6 bytes,
              gas_left: 355 ns, 6 bytes,
              balance: 1 µs, 6 bytes,
              value_transferred: 314 ns, 6 bytes,
              minimum_balance: 318 ns, 6 bytes,
              block_number: 313 ns, 6 bytes,
              now: 325 ns, 6 bytes,
              weight_to_fee: 1 µs, 14 bytes,
              input: 263 ns, 6 bytes,
              input_per_byte: 989 ps, 0 bytes,
              r#return: 0 ps, 45 bytes,
              return_per_byte: 320 ps, 0 bytes,
              terminate: 1 ms, 5266 bytes,
              random: 1 µs, 10 bytes,
              deposit_event: 1 µs, 10 bytes,
              deposit_event_per_topic: 127 µs, 2508 bytes,
              deposit_event_per_byte: 501 ps, 0 bytes,
              debug_message: 226 ns, 7 bytes,
              debug_message_per_byte: 1 ns, 0 bytes,
              set_storage: 131 µs, 293 bytes,
              set_storage_per_new_byte: 576 ps, 0 bytes,
              set_storage_per_old_byte: 184 ps, 1 bytes,
              set_code_hash: 297 µs, 3090 bytes,
              clear_storage: 131 µs, 289 bytes,
              clear_storage_per_byte: 92 ps, 1 bytes,
              contains_storage: 29 µs, 289 bytes,
              contains_storage_per_byte: 213 ps, 1 bytes,
              get_storage: 29 µs, 297 bytes,
              get_storage_per_byte: 980 ps, 1 bytes,
              take_storage: 131 µs, 297 bytes,
              take_storage_per_byte: 921 ps, 1 bytes,
              transfer: 156 µs, 2520 bytes,
              call: 484 µs, 2721 bytes,
              delegate_call: 406 µs, 2637 bytes,
              call_transfer_surcharge: 607 µs, 5227 bytes,
              call_per_cloned_byte: 970 ps, 0 bytes,
              instantiate: 1 ms, 2731 bytes,
              instantiate_transfer_surcharge: 131 µs, 2549 bytes,
              instantiate_per_input_byte: 1 ns, 0 bytes,
              instantiate_per_salt_byte: 1 ns, 0 bytes,
              hash_sha2_256: 377 ns, 8 bytes,
              hash_sha2_256_per_byte: 1 ns, 0 bytes,
              hash_keccak_256: 767 ns, 8 bytes,
              hash_keccak_256_per_byte: 3 ns, 0 bytes,
              hash_blake2_256: 443 ns, 8 bytes,
              hash_blake2_256_per_byte: 1 ns, 0 bytes,
              hash_blake2_128: 440 ns, 8 bytes,
              hash_blake2_128_per_byte: 1 ns, 0 bytes,
              ecdsa_recover: 45 µs, 77 bytes,
              ecdsa_to_eth_address: 11 µs, 42 bytes,
              sr25519_verify: 41 µs, 112 bytes,
              sr25519_verify_per_byte: 5 ns, 1 bytes,
              reentrance_count: 174 ns, 3 bytes,
              account_reentrance_count: 248 ns, 40 bytes,
              instantiation_nonce: 154 ns, 3 bytes,
              add_delegate_dependency: 131 µs, 2606 bytes,
              remove_delegate_dependency: 130 µs, 2568 bytes,
          },
      }
      ###############################################
      Lazy deletion weight per key: Weight(ref_time: 126109302, proof_size: 70)
      Lazy deletion keys per block: 15859
      ```
      5e5341da
  10. Jan 22, 2024
  11. Jan 19, 2024
    • Robin Freyler's avatar
      Update Wasm benchmarks (#2957) · e02c5204
      Robin Freyler authored
      In https://github.com/paritytech/polkadot-sdk/pull/2941 we found out
      that the new Wasmi (register) is very effective at optimizing away
      certain benchmark bytecode constructs in a way that created an unfair
      advantage over Wasmi (stack) which yielded our former benchmarks to be
      ineffective at properly measuring the performance impact.
      
      This PR adjusts both affected benchmarks to fix the stated problems.
      Affected are
      - `instr_i64const` -> `instr_i64add`: Renamed since it now measures the
      performance impact of the Wasm `i64.add` instruction with locals as
      inputs and outputs. This makes it impossible for Wasmi (register) to
      aggressively optimize away the entire function body (as it previously
      did) but still provides a way for Wasmi (register) to shine with its
      register based execution model.
      - `call_with_code_per_byte`: Now uses `local.get` instead of `i32.const`
      for the `if` condition which prevents Wasmi (register) to aggressively
      optimizing away whole parts of the `if` creating an unfair advantage.
      
      cc @athei
      
      
      
      ---------
      
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarAlexander Theißen <[email protected]>
      Co-authored-by: default avatarIgnacio Palacios <[email protected]>
      e02c5204
  12. Jan 18, 2024
    • Hero Bird's avatar
      contracts: Update weights (#2969) · f9bbe7db
      Hero Bird authored
      As demanded by @athei to run benchmarks via CI.
      Somehow I was not able to push a PR without commits.
      
      ---------
      
      Co-authored-by: command-bot <>
      f9bbe7db
    • Bastian Köcher's avatar
      pallet-contracts: Fix compilation on latest nightly (#2986) · 0e124a05
      Bastian Köcher authored
      Apparently they changed detection for visibility identifiers on traits,
      which broke more than it should. There is an issue open:
      https://github.com/rust-lang/rust/issues/119924 The easy solution for us
      is to move the declaration of the global variable outside of the trait.
      
      Closes: https://github.com/paritytech/polkadot-sdk/issues/2960
      0e124a05
  13. Jan 16, 2024
    • Francisco Aguirre's avatar
      XCMv4 (#1230) · 8428f678
      Francisco Aguirre authored
      
      
      # Note for reviewer
      
      Most changes are just syntax changes necessary for the new version.
      Most important files should be the ones under the `xcm` folder.
      
      # Description 
      
      Added XCMv4.
      
      ## Removed `Multi` prefix
      The following types have been renamed:
      - MultiLocation -> Location
      - MultiAsset -> Asset
      - MultiAssets -> Assets
      - InteriorMultiLocation -> InteriorLocation
      - MultiAssetFilter -> AssetFilter
      - VersionedMultiAsset -> VersionedAsset
      - WildMultiAsset -> WildAsset
      - VersionedMultiLocation -> VersionedLocation
      
      In order to fix a name conflict, the `Assets` in `xcm-executor` were
      renamed to `HoldingAssets`, as they represent assets in holding.
      
      ## Removed `Abstract` asset id
      
      It was not being used anywhere and this simplifies the code.
      
      Now assets are just constructed as follows:
      
      ```rust
      let asset: Asset = (AssetId(Location::new(1, Here)), 100u128).into();
      ```
      
      No need for specifying `Concrete` anymore.
      
      ## Outcome is now a named fields struct
      
      Instead of
      
      ```rust
      pub enum Outcome {
        Complete(Weight),
        Incomplete(Weight, Error),
        Error(Error),
      }
      ```
      
      we now have
      
      ```rust
      pub enum Outcome {
        Complete { used: Weight },
        Incomplete { used: Weight, error: Error },
        Error { error: Error },
      }
      ```
      
      ## Added Reanchorable trait
      
      Now both locations and assets implement this trait, making it easier to
      reanchor both.
      
      ## New syntax for building locations and junctions
      
      Now junctions are built using the following methods:
      
      ```rust
      let location = Location {
          parents: 1,
          interior: [Parachain(1000), PalletInstance(50), GeneralIndex(1984)].into()
      };
      ```
      
      or
      
      ```rust
      let location = Location::new(1, [Parachain(1000), PalletInstance(50), GeneralIndex(1984)]);
      ```
      
      And they are matched like so:
      
      ```rust
      match location.unpack() {
        (1, [Parachain(id)]) => ...
        (0, Here) => ...,
        (1, [_]) => ...,
      }
      ```
      
      This syntax is mandatory in v4, and has been also implemented for v2 and
      v3 for easier migration.
      
      This was needed to make all sizes smaller.
      
      # TODO
      - [x] Scaffold v4
      - [x] Port github.com/paritytech/polkadot/pull/7236
      - [x] Remove `Multi` prefix
      - [x] Remove `Abstract` asset id
      
      ---------
      
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarKeith Yeung <[email protected]>
      8428f678
  14. Jan 15, 2024
  15. Jan 12, 2024
  16. Dec 20, 2023
    • Dónal Murray's avatar
      Fix clippy lints behind feature gates and add new CI step all features (#2569) · d68868f6
      Dónal Murray authored
      
      
      Many clippy lints usually enforced by `-Dcomplexity` and `-Dcorrectness`
      are not caught by CI as they are gated by `features`, like
      `runtime-benchmarks`, while the clippy CI job runs with only the default
      features for all targets.
      
      This PR also adds a CI step to run clippy with `--all-features` to
      ensure the code quality is maintained behind feature gates from now on.
      
      To improve local development, clippy lints are downgraded to warnings,
      but they still will result in an error at CI due to the `-Dwarnings`
      rustflag.
      
      ---------
      
      Co-authored-by: default avatarLiam Aharon <[email protected]>
      d68868f6
  17. Dec 18, 2023
  18. Nov 29, 2023
    • PG Herveou's avatar
      Contracts: use compiled rust tests (#2347) · 2135fa87
      PG Herveou authored
      
      
      see #2189
      
      This PR does the following:
      - Bring the user api functions into a new pallet-contracts-uapi (They
      are currently defined in ink!
      [here])(https://github.com/paritytech/ink/blob/master/crates/env/src/engine/on_chain/ext.rs)
      - Add older api versions and unstable to the user api trait.
      - Remove pallet-contracts-primitives and bring the types it defined in
      uapi / pallet-contracts
      - Add the infrastructure to build fixtures from Rust files and test it
      works by replacing `dummy.wat` and `call.wat`
      - Move all the doc from wasm/runtime.rs to pallet-contracts-uapi.
      
      This will be done in a follow up:
      - convert the rest of the test from .wat to rust
      - bring risc-v uapi up to date with wasm
      - finalize the uapi host fns, making sure everything is codegen from the
      source host fns in pallet-contracts
      
      ---------
      
      Co-authored-by: default avatarAlexander Theißen <[email protected]>
      2135fa87
  19. Nov 28, 2023
    • Aaro Altonen's avatar
      Rework the event system of `sc-network` (#1370) · e71c484d
      Aaro Altonen authored
      
      
      This commit introduces a new concept called `NotificationService` which
      allows Polkadot protocols to communicate with the underlying
      notification protocol implementation directly, without routing events
      through `NetworkWorker`. This implies that each protocol has its own
      service which it uses to communicate with remote peers and that each
      `NotificationService` is unique with respect to the underlying
      notification protocol, meaning `NotificationService` for the transaction
      protocol can only be used to send and receive transaction-related
      notifications.
      
      The `NotificationService` concept introduces two additional benefits:
        * allow protocols to start using custom handshakes
        * allow protocols to accept/reject inbound peers
      
      Previously the validation of inbound connections was solely the
      responsibility of `ProtocolController`. This caused issues with light
      peers and `SyncingEngine` as `ProtocolController` would accept more
      peers than `SyncingEngine` could accept which caused peers to have
      differing views of their own states. `SyncingEngine` would reject excess
      peers but these rejections were not properly communicated to those peers
      causing them to assume that they were accepted.
      
      With `NotificationService`, the local handshake is not sent to remote
      peer if peer is rejected which allows it to detect that it was rejected.
      
      This commit also deprecates the use of `NetworkEventStream` for all
      notification-related events and going forward only DHT events are
      provided through `NetworkEventStream`. If protocols wish to follow each
      other's events, they must introduce additional abtractions, as is done
      for GRANDPA and transactions protocols by following the syncing protocol
      through `SyncEventStream`.
      
      Fixes https://github.com/paritytech/polkadot-sdk/issues/512
      Fixes https://github.com/paritytech/polkadot-sdk/issues/514
      Fixes https://github.com/paritytech/polkadot-sdk/issues/515
      Fixes https://github.com/paritytech/polkadot-sdk/issues/554
      Fixes https://github.com/paritytech/polkadot-sdk/issues/556
      
      ---
      These changes are transferred from
      https://github.com/paritytech/substrate/pull/14197 but there are no
      functional changes compared to that PR
      
      ---------
      
      Co-authored-by: default avatarDmitry Markin <[email protected]>
      Co-authored-by: default avatarAlexandru Vasile <[email protected]>
      e71c484d
    • gupnik's avatar
      Moves all test runtimes to use `derive_impl` (#2409) · cd8741c8
      gupnik authored
      
      
      Step in https://github.com/paritytech/polkadot-sdk/issues/171
      
      This PR adds `derive_impl` on all `frame_system` config impls for mock
      runtimes. The overridden configs are maintained as of now to ensure
      minimal changes.
      
      ---------
      
      Co-authored-by: default avatarOliver Tale-Yazdi <[email protected]>
      cd8741c8
  20. Nov 23, 2023
  21. Nov 14, 2023
  22. Nov 10, 2023
  23. Nov 02, 2023
    • Piotr Mikołajczyk's avatar
      Make `ExecResult` encodable (#1809) · 10857d0b
      Piotr Mikołajczyk authored
      # Description
      We derive few useful traits on `ErrorOrigin` and `ExecError`, including
      `codec::Encode` and `codec::Decode`, so that `ExecResult` is
      en/decodable as well. This is required for a contract mocking feature
      (already prepared in drink:
      https://github.com/Cardinal-Cryptography/drink/pull/61). In more detail:
      `ExecResult` must be passed from runtime extension, through runtime
      interface, back to the pallet, which requires that it is serializable to
      bytes in some form (or implements some rare, auxiliary traits).
      
      **Impact on runtime size**: Since most of these traits is used directly
      in the pallet now, compiler should be able to throw it out (and thus we
      bring no new overhead). However, they are very useful in secondary tools
      like drink or other testing libraries.
      
      # Checklist
      
      - [x] My PR includes a detailed description as outlined in the
      "Description" section above
      - [ ] My PR follows the [labeling requirements](CONTRIBUTING.md#Process)
      of this project (at minimum one label for `T`
        required)
      - [x] I have made corresponding changes to the documentation (if
      applicable)
      - [x] I have added tests that prove my fix is effective or that my
      feature works (if applicable)
      10857d0b
  24. Oct 31, 2023
  25. Oct 30, 2023
    • Liam Aharon's avatar
      contracts migration: remove unnecessary panics (#2079) · ad5163ba
      Liam Aharon authored
      Runtime migration CI is currently failing
      (https://gitlab.parity.io/parity/mirrors/polkadot-sdk/builds/4122083)
      for the contracts testnet due to unnecessary panicing in a `pre_upgrade`
      hook.
      
      Soon idempotency will be enforced
      https://github.com/paritytech/try-runtime-cli/issues/42, in the mean
      time we need to manually fix these issues as they arise.
      
      ---
      
      also removes backticks from the string in `echo`, which caused a
      'command not found' error in ci output
      ad5163ba
  26. Oct 24, 2023
    • Kian Paimani's avatar
      Ensure correct variant count in `Runtime[Hold/Freeze]Reason` (#1900) · 35eb133b
      Kian Paimani authored
      
      
      closes https://github.com/paritytech/polkadot-sdk/issues/1882
      
      ## Breaking Changes
      
      This PR introduces a new item to `pallet_balances::Config`:
      
      ```diff
      trait Config {
      ++    type RuntimeFreezeReasons;
      }
      ```
      
      This value is only used to check it against `type MaxFreeze`. A similar
      check has been added for `MaxHolds` against `RuntimeHoldReasons`, which
      is already given to `pallet_balances`.
      
      In all contexts, you should pass the real `RuntimeFreezeReasons`
      generated by `construct_runtime` to `type RuntimeFreezeReasons`. Passing
      `()` would also work, but it would imply that the runtime uses no
      freezes at all.
      
      ---------
      
      Signed-off-by: default avatarOliver Tale-Yazdi <[email protected]>
      Co-authored-by: default avatarOliver Tale-Yazdi <[email protected]>
      35eb133b
  27. Oct 11, 2023
  28. Sep 29, 2023
    • Piotr Mikołajczyk's avatar
      Enable mocking contracts (#1331) · d8d90a82
      Piotr Mikołajczyk authored
      # Description
      This PR introduces two changes:
      - the previous `Tracing` trait has been modified to accept contract
      address instead of code hash (seems to be way more convenient)
      - a new trait `CallInterceptor` that allows intercepting contract calls;
      in particular the default implementation for `()` will just proceed in a
      standard way (after compilation optimizations, there will be no
      footprint of that); however, implementing type might decide to mock
      invocation and return `ExecResult` instead
      
      Note: one might try merging `before_call` and `intercept_call`. However,
      IMHO this would be bad, since it would mix two completely different
      abstractions - tracing without any effects and actual intervention into
      execution process.
      
      This will unblock working on mocking contracts utility in drink and
      similar tools (https://github.com/Cardinal-Cryptography/drink/issues/33)
      
      # Checklist
      
      - [x] My PR includes a detailed description as outlined in the
      "Description" section above
      - [ ] My PR follows the [labeling
      requirements](https://github.com/paritytech/polkadot-sdk/blob/master/docs/CONTRIBUTING.md#process)
      of this project (at minimum one label for `T` required)
      - [x] I have made corresponding changes to the documentation (if
      applicable)
      - [x] I have added tests that prove my fix is effective or that my
      feature works (if applicable)
      d8d90a82
  29. Sep 25, 2023
    • Kevin Wang's avatar
      contracts: Fix incorrect storage alias in mirgration (#1687) · e8da3207
      Kevin Wang authored
      
      
      # Description
      
      We are recently trying to upgrade our Substrate version from
      `polkadot-v0.9.43` to `polkadot-v1.0.0` and we noticed a critical issue:
      all deployed contracts seem to be experiencing a `CodeNotFound` error.
      After a thorough investigation, it appears that the root cause of this
      issue lies in the mismatch between the storage alias of `CodeInfoOf<T>`
      in the migration and its original definition.
      
      This PR corrects the storage alias to align it with its original
      definition
      
      I am uncertain about the proper approach for adding tests to this
      change. Would the team consider taking over this PR to bring it to
      completion?
      
      ---------
      
      Co-authored-by: default avatarpgherveou <[email protected]>
      e8da3207
  30. Sep 11, 2023
    • Alexander Theißen's avatar
      contracts: Run start function (#1367) · c879d1d5
      Alexander Theißen authored
      Fixes #116 
      
      Start function wasn't allowed in a contract. Now it is allowed and is
      being run.
      
      It was disallowed because it is not used by Rust and supporting it made
      the code more complex. However, not running the start function violates
      the wasm standard. This makes life harder for some languages (see linked
      ticket).
      c879d1d5
  31. Sep 05, 2023
  32. Sep 04, 2023
  33. Sep 02, 2023
    • Alexander Theißen's avatar
      contracts: Update to wasmi 0.31 (#1350) · 3f92be2c
      Alexander Theißen authored
      * contracts: Update to wasmi 0.31
      
      * ".git/.scripts/commands/bench/bench.sh" --subcommand=pallet --runtime=dev --target_dir=substrate --pallet=pallet_contracts
      
      ---------
      
      Co-authored-by: command-bot <>
      3f92be2c
  34. Sep 01, 2023
  35. Aug 31, 2023