sendTransaction zum Senden von Token mit Metamask und benutzerdefinierten Daten

Meine Frage ähnelt der von How to use sendTransaction to send ERC20 tokens through Metamask? . Ich habe einen Vertrag und sende derzeit eine Transaktion an diesen Vertrag über Metamask mit diesem Code:

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],
  });

Jetzt möchte ich die Transaktion von einem benutzerdefinierten Token senden, und gemäß der Antwort von Hamza Ahmed im obigen Link muss ich dazu den Parameter „value“ entfernen und einige davon senden

contractInstance.transfer.getData(address, amount); 

im 'data'-Parameter.

Das Problem ist, dass ich das senden muss

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

im Datenparameter, um mit einer Funktion in meinem Vertrag zu interagieren.

Die Frage ist also, wie kann ich Token zusammen mit den benutzerdefinierten Daten senden, um mit der Vertragsfunktion zu interagieren?

Antworten (1)

ERC-20 unterstützt das Senden von Token mit benutzerdefinierten Daten nicht. Dafür benötigen Sie einen anderen Token-Standard .

Was ERC-20 bietet, sind zwei Transaktionsmuster

  • Der Benutzer erlaubt approve()einem Smart Contract, Token auszugeben
  • Der Benutzer führt eine Transaktion gegen eine intelligente Vertragsfunktion mit benutzerdefinierten Daten als Parameter durch
  • Smart Contract wird transferFrom()vom Benutzerkonto ausgeführt
Danke für die Antwort. Gibt es eine Möglichkeit, dies mit Metamask zu tun?
Ja. Alle DeFi-Dienste tun dies den ganzen Tag. Ich schlage vor, dass Sie versuchen, Dienste wie Uniswap, Aave und Synthetix zu verwenden, bevor Sie Ihre eigenen Dienste erstellen, und sehen, wie Token funktionieren.