Obtener datos ABI para tokens ERC20 programáticamente con Web3 [duplicado]

Estoy empezando a sumergirme en Web3. Estoy tratando de mostrar los distintos valores del token ERC20 para una dirección de Ethereum determinada.

Las piezas que necesito para hacer esto son:

  • Dirección de contrato de token
  • Contrato de token ABI

¿Existen formas programáticas de obtener la ABI del contrato con una dirección de contrato de la cadena de bloques?

Si no, parece justo asumir que el contrato ABI es constante para cualquier contrato de token... ¿alguien ha centralizado una base de datos que pueda usarse para interactuar con estos tokens ERC20 mediante programación?

¿Puede interactuar con un contrato de token sin el ABI completo? Por ejemplo, según el estándar ERC20, cada contrato debe tener balanceOf(), ¿podemos llamar a esta función con una dirección y sin ABI?

Respuestas (2)

Gracias K.Fichter por la ayuda, solo quiero aclarar completamente la respuesta para cualquier otra persona que pueda tener este problema.

Digamos que desea obtener el saldo de un token en una dirección de Ethereum. Usando Web3 haría lo siguiente:

var tokenContract = web3.eth.contract(contractABI).at(contractAddress)
var decimal = tokenContract.decimals()
var balance = tokenContract.balanceOf(address)
var adjustedBalance = balance / Math.pow(10, decimal)
var tokenName = tokenContract.name()
var tokenSymbol = tokenContract.symbol()

Entonces su resultado final podría ser algo como esto:

output = adjustedBalance + " " +  tokenSymbol + " (" + tokenName + ")";

Pensé que necesitaría cargar uno nuevo contractABIpara cada uno contractAddressporque cada token puede tener sus propias funciones incluso si siguen el estándar ERC20. Sin embargo, solo necesita definir la ABI para las funciones que está utilizando .

Entonces, en mi ejemplo, solo necesita definir:

  1. balanceOf()
  2. decimals()
  3. name()
  4. symbol()

Suponiendo que el token siga el estándar ERC20, estas funciones siempre serán las mismas y se pueden representar con esta ABI:

[
  {
    "constant": true,
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "name": "",
        "type": "string"
      }
    ],
    "payable": false,
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "name": "",
        "type": "uint8"
      }
    ],
    "payable": false,
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [
      {
        "name": "_owner",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "name": "balance",
        "type": "uint256"
      }
    ],
    "payable": false,
    "type": "function"
  },
  {
    "constant": true,
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "name": "",
        "type": "string"
      }
    ],
    "payable": false,
    "type": "function"
  }
]

Con esto, puede conectarse a cualquiera contractAddressy obtener la información del saldo, suponiendo que sigan el estándar ERC20.

EDITAR: Escribí una publicación de blog sobre esto aquí . ¡Espero que ayude a otros!

¡Gracias Shawn, no sabía que no es necesario abi completo para conectarse al contrato!

Si está interactuando con un token ERC20 estándar, todos los contratos compartirán la misma ABI base. Esta ABI está disponible en línea , pero también se puede recuperar implementando su propio estándar ERC20 y compilando la ABI.

ABI es realmente solo una interfaz que le dice a Web3 cómo crear el objeto de "contrato" para que usted interactúe. Básicamente incluye cada nombre de campo/función y algunos metadatos adjuntos. Debido a que todas las funciones para los tokens ERC20 estándar deben coincidir con el estándar como se describe aquí , estos campos/funciones y metadatos siempre coincidirán.

Básicamente, debido a que los tokens ERC20 compartirán el mismo ABI, puede codificar el ABI ERC20 estándar en su aplicación y usarlo para cada token . Sin embargo, no puede obtener el contrato ABI sin el código fuente del contrato.

Gracias, esto respondió a mi pregunta. Para decirlo de una manera que tenga más sentido para mí: (1) El ABI completo para un token solo está disponible si tiene el código fuente de Solidity, que no está descompilado en la cadena de bloques. (2) Puede usar Etherscan.io como una API básica para contratos ABI . (3) NO necesita el ABI completo para que un contrato interactúe con él. Solo necesita definir las funciones en la ABI con las que desea interactuar, y ERC20 ha estandarizado esto, por lo que siempre puede tener una ABI de referencia cuando interactúa con estos tokens.
¡Sí! Lo siento, me estaba centrando más en su caso de uso, pero esta es definitivamente una buena pregunta. Es posible que desee considerar enviar su propia respuesta, ya que creo que es una solución mucho más clara a su pregunta original.
Gracias por su ayuda de nuevo. Avíseme si algo en mi respuesta se ve mal.
@ShawnTabrizi sí, ¡se ve bien!