sendTransaction para enviar tokens con Metamask y datos personalizados

Mi pregunta es similar a ¿Cómo usar sendTransaction para enviar tokens ERC20 a través de Metamask? . Tengo un contrato y actualmente envío una transacción a este contrato a través de Metamask con este código:

var abiInterface = new ethers.utils.Interface(this.abi);
var functionData = abiInterface.encodeFunctionData('myFunction', [type, level]);
const transactionParameters = {
  nonce: '0x00', // ignored by MetaMask
  gasPrice: ethers.utils.hexlify(ethers.utils.parseEther(GlobalConstants.gasPrice)), // customizable by user during MetaMask confirmation.
  gas: GlobalConstants.gas, // customizable by user during MetaMask confirmation.
  to: this.contractAddress, // Required except during contract publications.
  from: ethereum.selectedAddress, // must match user's active address.
  value: ethers.utils.hexlify(ethers.utils.parseEther(price.toString())), // Only required to send ether to the recipient from the initiating external account.
  data: functionData, // Optional, but used for defining smart contract creation and interaction.
  chainId: GlobalConstants.chain, // Used to prevent transaction reuse across blockchains. Auto-filled by MetaMask.
}
const txHash = await ethereum.request({
    method: 'eth_sendTransaction',
    params: [transactionParameters],
  });

Ahora quiero enviar la transacción desde un token personalizado y, de acuerdo con la respuesta de Hamza Ahmed en el enlace de la pregunta anterior, para hacerlo necesito eliminar el parámetro 'valor' y enviar algunos como este

contractInstance.transfer.getData(address, amount); 

en el parámetro 'datos'.

El problema es que necesito enviar esto.

abiInterface.encodeFunctionData('myPayableFunction', [type, level]);

en el parámetro de datos, para interactuar con una función en mi contrato.

Entonces, la pregunta es, ¿cómo puedo enviar tokens junto con los datos personalizados para interactuar con la función de contrato?

Respuestas (1)

ERC-20 no admite el envío de tokens con datos personalizados. Para eso, necesita un estándar de token diferente .

Lo que ofrece ERC-20 es un patrón de dos transacciones

  • El usuario lo hace approve()para permitir que un contrato inteligente gaste tokens
  • El usuario realiza una transacción contra una función de contrato inteligente con datos personalizados como parámetro
  • El contrato inteligente se ejecuta transferFrom()desde la cuenta de usuario
Gracias por la respuesta. ¿Hay alguna manera de que pueda hacer esto con metamask?
Sí. Todos los servicios DeFi lo hacen todo el día. Le sugiero que intente usar servicios como Uniswap, Aave y Synthetix antes de crear sus propios servicios y vea cómo funcionan los tokens.