Utilizando asignaciones grant

Utilizando derechos de asignación para ejecutar operaciones

Dado que uno de los principales usos del módulo de Concesión de Comisiones es ayudar a la incorporación de nuevos usuarios, esta sección de la guía mostrará cómo permitir a los usuarios ejecutar transacciones utilizando la asignación que se les ha concedido.

Consultar una asignación

Ahora que se ha asignado una asignación a una dirección de cuenta, debería poder verificar los detalles de dicha asignación. La información devuelta incluirá la dirección del otorgante, el importe de la asignación y cualquier otra condición establecida por el otorgante, como la fecha de caducidad de la asignación.

El siguiente comando usando archwayd dará los detalles de una concesión:

archwayd query feegrant grant "${granter_address}" "${grantee_address}" --chain-id constantine-3 --node https://rpc.constantine.archway.tech:443

Resultado:

allowance:
  '@type': /cosmos.feegrant.v1beta1.BasicAllowance
  expiration: null
  spend_limit:
  - amount: "4806067100000000000"
    denom: aconst
grantee: archway1vve3d5u89h966t8kcvemwu88rnzzgcqxvkuj4s
granter: archway1u0p8vfpf5gjwje84073x0d6w40vm2s25603359

Esto también se puede conseguir a través del siguiente punto final de la API, donde api_endpoint es un punto final de la API conectado a una de las redes de Archway (Testnet o Mainnet). granter es la dirección que concedió la asignación y grantee es la dirección que recibió la asignación:

{api_endpoint}/cosmos/feegrant/v1beta1/allowance/{granter}/{grantee}

Resultado:

{
  "allowance": {
    "granter": "archway1u0p8vfpf5gjwje84073x0d6w40vm2s25603359",
    "grantee": "archway1vve3d5u89h966t8kcvemwu88rnzzgcqxvkuj4s",
    "allowance": {
      "@type": "/cosmos.feegrant.v1beta1.BasicAllowance",
      "spend_limit": [
        {
          "denom": "aconst",
          "amount": "4806067100000000000"
        }
      ],
      "expiration": null
    }
  }
}

Creando una trasaccion

Al igual que cualquier otra transacción en Archway, una transacción que utilizará una asignación concedida para tasas debe incluir cierta información, como el tipo de transacción (es decir, el mensaje). En lugar del objeto de tasa normal, la transacción debe incluir la cuenta del otorgante que pagará la tasa de transacción. Esto se consigue haciendo lo siguiente

const fee = await signingClient.calculateFee(signerAddress, messages, '', 1.5, feeGranterAddress);
      
const broadcastResult = await signingClient.signAndBroadcast(signerAddress, messages, fee);

El método signAndBroadcast no permite establecer la dirección feeGranterAddress para estipular que esta cuenta debe cubrir las tasas y, por lo tanto, se debe generar un objeto de tasa personalizado que esté disponible dentro de arch3.js mediante el método calculateFee como se muestra aquí. A continuación, esta tarifa se introduce en el método signAndBroadcast y, si existe una asignación de la feeGranterAddress para la signerAddress, el importe se deducirá de la feeGranterAddress. Si no, el importe se deducirá de la signerAddress.

Esta es la principal diferencia en la ejecución de una transacción con honorarios pagados por el firmante frente a los honorarios pagados por un allwoance de concesión de honorarios.

Ejemplos básicos de Keplr

El siguiente ejemplo permitirá a un usuario incrementar el contador es nuestro contrato básico de incremento que puedes crear fácilmente desde una plantilla dentro de Archway CLI.. La siguiente guía de configuración le ayudará a crear y desplegar dicho contrato en Archway.

Información

Este tutorial necesita estar incrustado en una página web para que funcione. Para ver un ejemplo de funcionamiento completo, consulta ejemplos de dapp.

Pre requisitos

Antes de seguir adelante, asegúrese de haber completado los siguientes requisitos previos:

  • Instale la extensión Keplr en su navegador

  • Instala la librería arch3.js en tu proyecto

Crear configuración

Cree un nuevo archivo de configuración en su proyecto. Puedes nombrar el archivo triomphe.config.js si usas mainnet, o constantine.config.js si usas testnet. El archivo debe tener el siguiente contenido:

Mainnet
const currency = {
  coinDenom: 'ARCH',
  coinMinimalDenom: 'aarch',
  coinDecimals: 18,
  coinGeckoId: 'archway',
};
const ChainInfo = {
  chainId: 'archway-1',
  chainName: 'Mainnet',
  rpc: 'https://rpc.mainnet.archway.io',
  rest: 'https://api.mainnet.archway.io',
  stakeCurrency: currency,
  bip44: {
    coinType: 118,
  },
  bech32Config: {
    bech32PrefixAccAddr: 'archway',
    bech32PrefixAccPub: 'archwaypub',
    bech32PrefixValAddr: 'archwayvaloper',
    bech32PrefixValPub: 'archwayvaloperpub',
    bech32PrefixConsAddr: 'archwayvalcons',
    bech32PrefixConsPub: 'archwayvalconspub',
  },
  currencies: [currency],
  feeCurrencies: [currency],
  coinType: 118,
  features: ['cosmwasm', 'ibc-transfer', 'ibc-go'],
  // walletUrlForStaking: '',
};
export default chainInfo;

Testnet
const currency = {
  coinDenom: 'CONST',
  coinMinimalDenom: 'aconst',
  coinDecimals: 18,
  coinGeckoId: 'constantine-network',
};
const ChainInfo = {
  chainId: 'constantine-3',
  chainName: 'Constantine',
  rpc: 'https://rpc.constantine.archway.tech',
  rest: 'https://api.constantine.archway.tech',
  stakeCurrency: currency,
  bip44: {
    coinType: 118,
  },
  bech32Config: {
    bech32PrefixAccAddr: 'archway',
    bech32PrefixAccPub: 'archwaypub',
    bech32PrefixValAddr: 'archwayvaloper',
    bech32PrefixValPub: 'archwayvaloperpub',
    bech32PrefixConsAddr: 'archwayvalcons',
    bech32PrefixConsPub: 'archwayvalconspub',
  },
  currencies: [currency],
  feeCurrencies: [currency],
  coinType: 118,
  features: ['cosmwasm', 'ibc-transfer', 'ibc-go'],
  // walletUrlForStaking: '',
};
export default chainInfo;

Conectando a keplr

  • Las siguientes importaciones son necesarias para completar su transacción.

Mainnet
import { SigningArchwayClient } from '@archwayhq/arch3.js';
import ChainInfo from './triomphe.config.js';
import { MsgExecuteContract } from 'cosmjs-types/cosmwasm/wasm/v1/tx.js';
import { toUtf8 } from '@cosmjs/encoding';

Testnet
import { SigningArchwayClient } from '@archwayhq/arch3.js';
import ChainInfo from './constantine.config.js';
import { MsgExecuteContract } from 'cosmjs-types/cosmwasm/wasm/v1/tx.js';
import { toUtf8 } from '@cosmjs/encoding';
  • A continuación, comprueba que Keplr está instalado en el navegador y que tiene al menos una cuenta configurada. Si Keplr está instalado, utilice el método suggestChain para añadir la red Constantine a Keplr. Además, para evitar que Keplr anule las tarifas establecidas por arch3.js, establezca el valor de la opción interactiva preferNoSetFee en true.

window.onload = async () => {
    if (!window.getOfflineSignerAuto || !window.keplr) {
        alert("Please install keplr extension");
    } else {
        if (window.keplr.experimentalSuggestChain) {
            try {
                await window.keplr.experimentalSuggestChain(ChainInfo);
                window.keplr.defaultOptions = {
                    sign: {
                        preferNoSetFee: true,
                    }
                }
            } catch {
                alert("Failed to suggest the chain");
            }
        } else {
            alert("Please use the recent version of keplr extension");
        }
    }
};
  • Habilita la cadena para conectarte a ella.

/const chainId = ChainInfo.chainId;
await window.keplr.enable(chainId);
  • Crea un firmante offline utilizando el método getOfflineSignerAuto y también un cliente de firma utilizando SigningArchwayClient.

const offlineSigner = window.keplr.getOfflineSignerAuto(chainId);
const signingClient = await SigningArchwayClient.connectWithSigner(ChainInfo.rpc, offlineSigner);
  • Obtener la cuenta del firmante, que proporcionará su dirección.

const accounts = await offlineSigner.getAccounts();
const signerAddress = accounts[0].address;

Ejecutar trasaccion

  • Establezca las direcciones del otorgante de la tasa y del contrato.

const smartContractAddress = process.env.SMART_CONTRACT_ADDRESS;
const feeGranterAddress = process.env.FEE_GRANTER_ADDRESS;
  • Defina los detalles de la transacción que incluye el mensaje al contrato.

// Increment contract message to increase counter
const contractMsg = {
    increment: {},
};
// Message to execute a transaction via the smart contract
const executeMsg = {
    typeUrl: '/cosmwasm.wasm.v1.MsgExecuteContract',
    value: MsgExecuteContract.fromPartial({
        sender: signerAddress,
        contract: smartContractAddress,
        msg: toUtf8(JSON.stringify(contractMsg)),
        funds: [],
    }),
};
const messages = [executeMsg];
  • Calcula la tasa dinámicamente pero también establece la dirección del otorgante de la tasa pagará la tasa de transacción si existe una asignación. La nota se establece en una cadena vacía y el ajuste de la tasa se establece en 1.5.

const fee = await signingClient.calculateFee(signerAddress, messages, '', 1.5, feeGranterAddress);
  • Firme y emita la transacción.

const broadcastResult = await signingClient.signAndBroadcast(signerAddress, messages, fee);
if (broadcastResult.code !== undefined &&
    broadcastResult.code !== 0) {
    alert("Failed to send tx: " + broadcastResult.log || broadcastResult.rawLog);
} else {
    alert("Succeed to send tx:" + broadcastResult.transactionHash);
}

Clona el repositorio y inténtalo tu mismo!

Puedes encontrar un ejemplo funcional de esta dapp frontend en el repositorio de ejemplos de dapp.

Last updated