Caver-js 문의드립니다

안녕하세요.

klaytn 공부중 caver-js를 연동하여 스마트 컨트랙트 동작을 확인하는 예제 작성 및 테스트가 잘되지 않아 조언을 구하고자 문의 드립니다.
스마트 컨트랙트를 생성하고 truffle을 이용하여 baobab 테스트 넷에 배포까지 진행하여 컨트랙트 주소를 생성하였습니다.

이후 javascript를 이용하여 테스트용 privateKey 를 이용하여 wallet 정보 로드 후
.methods.<함수명>({…}).once(‘receipt’, (receipt) => {}) 를 이용하여 recept 정보를 확인하고자 하였으나
다음에 캡쳐된 화면과 같은 에러메세지 출력과 함께 동작이 되지 않아 문의드립니다.
(error 메세지 : TypeError: Object(…)().methods.createSchedule(…).send(…).once is not a function)

화면 캡처 2022-03-20 001011

해당 페이지를 참고하여
.methods.<함수명>({…}).on(‘receipt’, (receipt) => {}) 과 같이 변경해 보았지만 결과는 동일하였습니다.

이틀을 꼬박 고민해봤는데도 해결 방법을 찾지 못하여
제가 놓치고 있는 부분이 있는지 조언을 구하고자 합니다.

감사합니다.

p.s.
제가 테스트에 사용한 개발환경 입니다.
OS Ubuntu 20.04
Node v10.24.1
Web3.js v1.2.9
Truffle v5.1.61
vue/cli v4.5.16
vue-router v3.5.2
caver-js v1.8.0 (v1.4.1 버전도 호환 되는 것 같음)

그리고 제가 작성한 예제 소스코드도 같이 올려봅니다.
일부만 발췌 및 수정하여 오타가 있을수 있습니다.
단순 오타는 무시하여 주시고 전체적인 구조로 살펴주시면 감사하겠습니다.
//=======================================================================

  1. Test.sol

pragma solidity ^0.5.6;
contract Test {
uint256[] public schedules;
struct Schedule {
uint256 scheduleId;
string date;
string time;
string place;
}

function createSchedule(
string memory date,
string memory time,
string memory place
) public returns (bool) {

uint256 scheduleId = schedules.length + 1;

Schedule memory newSchedule;	
newSchedule.scheduleId = scheduleId;
newSchedule.date = date;
newSchedule.time = time;
newSchedule.place = place;

schedules.push(scheduleId);

emit ScheduleCreated(scheduleId, msg.sender);
return true;

}
}

//=======================================================================

  1. caver.js

import Caver from ‘caver-js’

const CONTRACT = ‘<배포된 컨트랙트 주소>’
const CONTRACT_ABI = require(’@/contracts/Test.json’).abi
const TEST_NET = ‘https://api.baobab.klaytn.net:8651
const cav = new Caver(TEST_NET)

const getContractInstance = () => {
const contractInstance = CONTRACT_ABI
&& CONTRACT
&& new cav.klay.Contract(CONTRACT_ABI, CONTRACT)
return contractInstance
}

export {cav, CONTRACT, getContractInstance}

//=======================================================================

  1. klaytnService.js

import {cav, CONTRACT, getContractInstance} from ‘./caver’

createSchedule (date, time, place, dispatch, errorCb) {
const walletInstance = cav.klay.accounts.wallet && cav.klay.accounts.wallet[0]

if (!walletInstance) {
console.log(‘No walletInstance’)
return
}

const address = walletInstance.address
getTicketsInstance().methods.createSchedule(date, time, place).send({
from: address,
gas: ‘100000000’
})
.once(‘transactionHash’, (txHash) => {
console.log(Sending a transaction...txHash: ${txHash})
})
.once(‘receipt’, (receipt) => {
console.log(Received receipt! (#${receipt.blockNumber} ,${receipt.transactionHash}), receipt)
dispatch(receipt)
})
.once(‘error’, (error) => {
errorCb(error.message)
})
}

//=======================================================================

TypeError: Object(…)().methods.createSchedule(…).send(…).once is not a function 문제는 caver문제라기 보다는, once 함수가 정의되어있지 않아 발생한 문제로 생각됩니다.

해당 에러메시지로 구글링을 하시어 dependency 문제를 해결하시거나,
단순히 트랜잭션을 실행해보고 싶으시면 해당 함수 (.once)를 사용하지 않으시고 처리하시는게 좋을것 같습니다.

예를들어

const receipt = await getTicketsInstance().methods.createSchedule(date, time, place).send({
from: address,
gas: ‘100000000’
})

으로 실행하신 후 receipt 내용을 검토하는 방식으로 진행해보시길 바랍니다.

1 Like

조언 감사드립니다.
제시해주신 예시대로 수정하여 테스트를 진행해보니 receipt 정보를 받아서 확인할 수 있었습니다.

추가적으로 자료를 더 찾아보던중 다음과같이 .then 함수를 이용하여 receipt 를 확인하는 방법도 찾을수 있었습니다.

getTicketsInstance().methods.createSchedule(date, time, place).send({
from: address,
gas: ‘100000000’
})
.then(function(receipt) {

})

1 Like