Saltar al contenido principal

Esquema URI para facilitar la firma delegada

información

Esta guía está disponible en tres lenguajes de programación diferentes: Typescript, Kotlin y Flutter (Dart). Puedes cambiar la versión mostrada en cada página mediante los botones de arriba.

El estándar Sep-7 define una manera para que una aplicación que no es una billetera construya un esquema URI que represente una transacción específica para que una cuenta firme. El esquema utilizado es web+stellar, seguido de dos puntos. Ejemplo: web+stellar:<operation>?<param1>=<value1>&<param2>=<value2>

Operación Tx

La operación tx representa una solicitud para firmar un sobre de transacción específico, con algunos parámetros configurables.

const sourceAccountKeyPair = "G...";
const destinationAccountKeyPair = "G...";
const txBuilder = await stellar.transaction({
sourceAddress: sourceAccountKeyPair,
});
const tx = txBuilder.createAccount(destinationAccountKeyPair).build();
const xdr = encodeURIComponent(tx.toEnvelope().toXDR().toString("base64"));
const callback = encodeURIComponent("https://example.com/callback");
const txUri = `web+stellar:tx?xdr=${xdr}&callback=${callback}`;
const uri = wallet.parseSep7Uri(txUri);
// uri can be parsed and transaction can be signed/submitted by an application that implements Sep-7

Puedes establecer reemplazos para ser realizados en el xdr para campos específicos por la aplicación, estos se añadirán en el formato de representación de transacción Sep-11 al URI.

const uri = new Sep7Tx(txUri);
uri.addReplacement({
id: "X",
path: "sourceAccount",
hint: "account from where you want to pay fees",
});

Puedes asignar parámetros después de crear la instancia inicial usando el setter apropiado para el parámetro.

const sourceAccountKeyPair = "G...";
const destinationAccountKeyPair = "G...";
const txBuilder = await stellar.transaction({
sourceAddress: sourceAccountKeyPair,
});
const tx = txBuilder.createAccount(destinationAccountKeyPair).build();
const uri = wallet.Sep7Tx.forTransaction(tx);
uri.callback = "https://example.com/callback";
uri.msg = "here goes a message";
uri.toString(); // encodes everything and converts to a uri string

Operación de Pago

La operación de pago representa una solicitud para pagar una dirección específica con un activo específico, independientemente del activo fuente utilizado por el pagador. Puedes configurar parámetros para crear la operación de pago.

const destination = "G...";
const assetIssuer = "G...";
const assetCode = "USDC";
const amount = "120.1234567";
const memo = "memo";
const message = encodeURIComponent("pay me with lumens");
const originDomain = "example.com";
const payUri = `web+stellar:pay?destination=${destination}&amount=${amount}&memo=${memo}&msg=${message}&origin_domain=${originDomain}&asset_issuer=${assetIssuer}&asset_code=${assetCode}`;
const uri = parseSep7Uri(payUri);
// uri can be parsed and transaction can be built/signed/submitted by an application that implements Sep-7

Puedes asignar parámetros después de crear la instancia inicial usando el setter apropiado para el parámetro.

const uri = wallet.Sep7Pay.forDestination("G...");
uri.callback = "https://example.com/callback";
uri.msg = "here goes a message";
uri.assetCode = "USDC";
uri.assetIssuer = "G...";
uri.amount = "10";
uri.toString(); // encodes everything and converts to a uri string

El último paso después de crear un Sep7Tx o Sep7Pay es añadir una firma a tu uri. Esto creará un payload a partir de la transacción y la firmará con el keypair proporcionado.

const uri = wallet.Sep7Pay.forDestination("G...");
uri.originDomain = "example.com";
const keypair = wallet.stellar().account().createKeypair();
uri.addSignature(Keypair.fromSecret(keypair.secretKey));
console.log(uri.signature); // signed uri payload

La firma puede ser verificada luego al obtener el archivo toml de Stellar del dominio de origen en el uri, y utilizando la clave de firma incluida para verificar la firma del uri. Todo esto se realiza como parte del método verifySignature.

const passesVerification = await uri.verifySignature(); // true or false