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.
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:
- Timelock y oferta única mueven tokens a través de
transfer
hacia y desde el contrato - Intercambio atómico usa
transfer
para transferir tokens en nombre del usuario