Saltar al contenido principal

Integrar Contratos de Activos Stellar

Al interactuar con activos en un contrato inteligente, el Contrato de Activos Stellar no es diferente de cualquier otro token que implemente la Interfaz de Token SEP-41 de Stellar.

Código del Contrato

El SDK de Rust contiene un cliente pre-generado para cualquier contrato que implemente la interfaz de token:

use soroban_sdk::{contract, contractimpl}
use soroban_sdk::token;

#[contract]
pub struct MyContract;

#[contractimpl]
impl MyContract {
pub fn token_fn(e: Env, id: Address) {
// Create a client instance for the provided token identifier. If the id
// value corresponds to an SAC contract, then SAC implementation is used.
let client = token::TokenClient::new(&env, &id);
// Call token functions part of the Stellar SEP-41 token interface
client.transfer(...);
}
}

El parámetro asset no es la dirección del emisor de un activo, corresponde a la dirección del contrato desplegado para este activo.

stellar contract id asset \
--source G... \
--network testnet \
--asset [asset:issuer]

Por ejemplo. para USDC, sería --asset USDC:G... Para el activo nativo, XLM, --asset native. Consulta la guía de [despliegue SAC] para más detalles.

Clients

Un cliente creado por token::TokenClient implementa las funciones definidas por cualquier contrato que implemente la Interfaz de Token SEP-41. Pero con [el activo estandarizado de contrato inteligente CAP-46-6], el Contrato de Activos Stellar expone funciones adicionales como mint. Para acceder a las funciones adicionales, se necesita usar otro cliente: token::StellarAssetClient. Este cliente solo implementa las funciones de CAP-46-6, que no son parte de la interfaz SEP-41.

let client = token::StellarAssetClient::new(&env, &id);
// Call token functions which are not part of the SEP-41 token interface
// but part of the CAP-46-6 Smart Contract Standardized Asset
client.mint(...);

Pruebas

El SDK de Soroban Rust proporciona una manera fácil de instanciar tokens de Contrato de Activos Stellar usando register_stellar_asset_contract_v2. Esta función puede verse como el despliegue de un token genérico. Esta función puede verse como el despliegue de un token genérico. También te permite manipular flags en la cuenta del emisor como AUTH_REVOCABLE y AUTH_REQUIRED. En el siguiente ejemplo, estamos siguiendo las prácticas recomendadas descritas en la sección de Cuentas de Emisión y Distribución:

#![cfg(test)]

use soroban_sdk::testutils::Address as _;
use soroban_sdk::{token, Address, Env};
use token::{StellarAssetClient, TokenClient};

#[test]
fn test() {
let e = Env::default();
e.mock_all_auths();

let issuer = Address::generate(&e);
let distributor = Address::generate(&e);

let sac = e.register_stellar_asset_contract_v2(issuer.clone());
let token_address = sac.address();

// client for SEP-41 functions
let token = TokenClient::new(&e, &token_address);
// client for Stellar Asset Contract functions
let token_sac = StellarAssetClient::new(&e, &token_address);

// note that you need to account for the difference between the minimal
// unit and the unit itself when working with amounts.
// E.g. to mint 1 TOKEN, we need to use 1*1e7 in the mint function.
let genesis_amount: i128 = 1_000_000_000 * 10_000_000;

token_sac.mint(&distributor, &genesis_amount);

assert_eq!(token.balance(&distributor), genesis_amount);

// Make issuer AuthRequired and AuthRevocable
sac.issuer().set_flag(IssuerFlags::RevocableFlag);
sac.issuer().set_flag(IssuerFlags::RequiredFlag);
}

Ejemplos

Consulta los ejemplos completos que utilizan el contrato de token de diversas maneras para más detalles: