Retirar activos
En el ecosistema de Polkadot hay dos formas de transferir activos entre cadenas remotas: teletransporte y transferencia de reservas. El teletransporte consiste esencialmente en quemar un activo por un lado y acuñarlo por el otro, de modo que el saldo total antes y después del teletransporte siga siendo el mismo.
La segunda forma de transferir activos utiliza tokens envueltos, respaldados por activos en la cadena de origen. Los activos que se van a transferir se bloquean en la cadena de origen y se crean versiones 1:1 en la de destino. Dependiendo de la lógica de negocio, la cadena de origen que aún posee los activos, puede querer acuñar algunos derivados para reflejar esa propiedad. De este modo, los activos originales no abandonan realmente la cadena, pero su propiedad pasa a ser transferible.
Supongamos que queremos importar tokens SBY
de Shibuya como activos envueltos en Shiden, dando como resultado wSBY
.
- La red Shibuya necesitará tener la cuenta soberana de Shiden. Esta cuenta está controlada por Shiden y representa todos los fondos que se le envían, desde la cadena remota (Shiden, desde la perspectiva de Shibuya en este ejemplo).
- La red Shiden deberá crear el activo
wSBY
y configurarlo para que actúe como activo de cadena cruzada (XC20). - Los canales HRMP deben estar habilitados y configurados para que las parachains se comuniquen e intercambien mensajes XCM.
- Para pagar el tiempo de ejecución,
wSBY
debe configurarse como activo de pago en Shiden.
Durante la transferencia ocurrirá lo siguiente:
- Se mueve una cantidad de
SBY
de la cuenta de origen a la cuenta soberana de Shiden en Shibuya. - Se envía a Shiden un mensaje XCM que contiene la instrucción
ReserveTransferAssets
. - La instrucción
ReserveTransferAssets
es procesada por la paletaassets
en Shiden, y la cantidad correspondiente dewSBY
es acuñada en Shiden. - Las fichas
wSBY
acuñadas se depositan en la cuenta de destino. - Se deduce una pequeña cantidad de
wSBY
de la cuenta de destino como pago por el tiempo de ejecución
Nota: El ejemplo anterior es específico de la implementación de dos parachains concretas. XCM no dicta ni impone ninguna restricción sobre cómo interpretar los mensajes entrantes o cómo gestionar los activos derivados. Otras parachains pueden, o no, utilizar la paleta assets
; la única suposición es que assets_reserve_transfer
formará un mensaje XCM con un origen especificado por su parachain_id
. Todo lo demás depende de la cadena remota y su lógica, y no habrá reintentos en caso de fallo.
Precompilados EVM
Esta funcionalidad se expone a los contratos inteligentes EVM a través de precompilaciones. La interfaz se puede conseguir aquí bajo los precompilados XCM.
function assets_reserve_transfer(
address[] calldata asset_id,
uint256[] calldata asset_amount,
bytes32 recipient_account_id,
bool is_relay,
uint256 parachain_id,
uint256 fee_index
) external payable returns (bool);
asset_id
- Una lista de activos a transferir; para transferir activos nativos, véase la siguiente sección.asset_amount
- El monto correspondiente de activos.recipient_account_id
- El account id del destinatario en la cadena de destino (o en una Relay Chain).is_relay
Es verdadero si la cuenta de destino está en la Relay Chain.parachain_id
- El id de la parachain de destino.fee_index
- Qué activo deasset_id
se utiliza para pagar el gas de XCM.
Nota: existe otra versión de assets_reserve_transfer
precompilada que acepta address
en lugar de bytes32
para el recipient_account_id
.
Detalles de implementación
Astar usa un pallet XCM personalizado que fue ampliado por reserve_withdraw_assets
.