Files
pezkuwi-subxt/cumulus/parachains/runtimes/contracts/contracts-rococo
Adrian Catangiu e7651cf41b pallet-xcm: add new flexible transfer_assets() call/extrinsic (#2388)
# Motivation (+testing)

### Enable easy `ForeignAssets` transfers using `pallet-xcm` 

We had just previously added capabilities to teleport fees during
reserve-based transfers, but what about reserve-transferring fees when
needing to teleport some non-fee asset?

This PR aligns everything under either explicit reserve-transfer,
explicit teleport, or this new flexible `transfer_assets()` which can
mix and match as needed with fewer artificial constraints imposed to the
user.

This will enable, for example, a (non-system) parachain to teleport
their `ForeignAssets` assets to AssetHub while using DOT to pay fees.
(the assets are teleported - as foreign assets should from their owner
chain - while DOT used for fees can only be reserve-based transferred
between said parachain and AssetHub).

Added `xcm-emulator` tests for this scenario ^.

# Description

Reverts `(limited_)reserve_transfer_assets` to only allow reserve-based
transfers for all `assets` including fees.

Similarly `(limited_)teleport_assets` only allows teleports for all
`assets` including fees.
    
For complex combinations of asset transfers where assets and fees may
have different reserves or different reserve/teleport trust
configurations, users can use the newly added `transfer_assets()`
extrinsic which is more flexible in allowing more complex scenarios.

`assets` (excluding `fees`) must have same reserve location or otherwise
be teleportable to `dest`.
No limitations imposed on `fees`.

- for local reserve: transfer assets to sovereign account of destination
chain and forward a notification XCM to `dest` to mint and deposit
reserve-based assets to `beneficiary`.
- for destination reserve: burn local assets and forward a notification
to `dest` chain to withdraw the reserve assets from this chain's
sovereign account and deposit them to `beneficiary`.
- for remote reserve: burn local assets, forward XCM to reserve chain to
move reserves from this chain's SA to `dest` chain's SA, and forward
another XCM to `dest` to mint and deposit reserve-based assets to
`beneficiary`.
- for teleports: burn local assets and forward XCM to `dest` chain to
mint/teleport assets and deposit them to `beneficiary`.

## Review notes

Only around 500 lines are prod code (see `pallet_xcm/src/lib.rs`), the
rest of the PR is new tests and improving existing tests.

---------

Co-authored-by: command-bot <>
2023-12-06 13:18:12 +02:00
..

Contracts 📝

This is a parachain node for smart contracts; it contains a default configuration of Substrate's module for smart contracts the pallet-contracts.

The node is only available on Rococo, a testnet for Polkadot and Kusama parachains. It has been configured as a common good parachain, as such it uses the Rococo relay chain's native token ROC instead of defining a token of its own. See the section Rococo Deployment below for more details.

If you have any questions, it's best to ask in the Substrate StackExchange.

Smart Contracts Development

Contracts Overview

This node contains Substrate's smart contracts module the pallet-contracts. This pallet takes smart contracts as WebAssembly blobs and defines an API for everything a smart contract needs (storage access, …). As long as a programming language compiles to WebAssembly and there exists an implementation of this API in it, you can write a smart contract for this pallet (and thus for this parachain) in that language.

This is a list of languages you can currently choose from:

There are also different user interfaces and command-line tools you can use to deploy or interact with contracts:

  • Contracts UI a beginner-friendly UI for smart contract developers.
  • polkadot-js the go-to expert UI for smart contract developers.
  • cargo-contract a CLI tool, ideal for scripting or your terminal workflow.

If you are looking for a quickstart, we can recommend ink!'s Guided Tutorial for Beginners.

Build & Launch a Node

To run a Contracts node that connects to Rococo you will need to compile the polkadot-parachain binary:

cargo build --release --locked --bin polkadot-parachain

Once the executable is built, launch the parachain node via:

./target/release/polkadot-parachain --chain contracts-rococo

Refer to the setup instructions to run a local network for development.

Rococo Deployment

We have a live deployment on Rococo a testnet for Polkadot and Kusama parachains.

You can interact with the network through Polkadot JS Apps, click here for a direct link to the parachain.

This parachain uses the Rococo relay chain's native token ROC instead of defining a token of its own. Due to this you'll need ROC in order to deploy contracts on this parachain.

As a first step, you should create an account. See here for a detailed guide.

As a second step, you have to get ROC testnet tokens through the Rococo Faucet. This is a chat room in which you'd need to post the following message:

!drip YOUR_SS_58_ADDRESS:1002

The number 1002 is the id of this parachain on Rococo, by supplying it the faucet will teleport ROC tokens directly to your account on the parachain.

If everything worked out, the teleported ROC tokens will show up under the "Accounts" tab.

Once you have ROC you can deploy a contract as you would normally. If you're unsure about this, our guided tutorial will clarify that for you in no time.