Не удалось вызвать функцию контракта

Я хочу получить доступ к балансу контракта (т.е. 0x552F3AfaA0394632f4aEfa9E923fA3e2bbDAF5FE) и его totalSupply (переменная состояния). Я мог получить доступ к балансу этого контракта, но почему я не мог вызвать его функцию, т.е. getTotalSupply()у меня есть следующий код;

async function myContractAddress() {
    myContAddr = '0x552F3AfaA0394632f4aEfa9E923fA3e2bbDAF5FE';
    web3.eth.getBalance(myContAddr).then(console.log);
    tokens = await myContAddr.methods.getTotalSupply().call();
    tokens = tokens.toString(10);
    console.log("Toten supply is : ",tokens);

  }
  myContractAddress();

вот моя ошибка;

(node:6028) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'getTotalSupply' of undefined
    at myContractAddress (C:\Users\jj\Desktop\temp\deploy.js:36:39)
    at C:\Users\jj\Desktop\temp\deploy.js:26:1
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:6028) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This
error originated either by throwing inside of an async function without a catch
block, or by rejecting a promise which was not handled with .catch(). (rejectio
 id: 1)
(node:6028) [DEP0018] DeprecationWarning: Unhandled promise rejections are depr
cated. In the future, promise rejections that are not handled will terminate th
 Node.js process with a non-zero exit code.
0 // actually this is my contract balance , which have shown

Ответы (1)

Что вы делаете неправильно, так это то, что в вашем коде myContAddr является строкой, и вы пытаетесь получить доступ к параметрам этой переменной. Чтобы получить доступ к .methods.getTotalSupply().call(), вам необходимо создать экземпляр контракта, используя следующий код:

async function myContractAddress() {
    var myContAddr = '0x552F3AfaA0394632f4aEfa9E923fA3e2bbDAF5FE';
    var myContractAbiDefenition = 'CONTRACT_ABI';
    var myContractInstance = new web3.eth.Contract(myContractAbiDefenition, myContAddr);
    tokens = await myContractInstance.methods.getTotalSupply().call();
    console.log("Tokens: ",tokens);
}
myContractAddress();
но указанный выше адрес уже развернут в тестовой сети ethereum, тогда почему одна функция посчитала его ОК (как контракт и дает баланс), а другая посчитала его не ОК и выдает ошибку....