안녕하세요.
klaytn 공부중 caver-js를 연동하여 스마트 컨트랙트 동작을 확인하는 예제 작성 및 테스트가 잘되지 않아 조언을 구하고자 문의 드립니다.
스마트 컨트랙트를 생성하고 truffle을 이용하여 baobab 테스트 넷에 배포까지 진행하여 컨트랙트 주소를 생성하였습니다.
이후 javascript를 이용하여 테스트용 privateKey 를 이용하여 wallet 정보 로드 후
.methods.<함수명>({…}).once(‘receipt’, (receipt) => {}) 를 이용하여 recept 정보를 확인하고자 하였으나
다음에 캡쳐된 화면과 같은 에러메세지 출력과 함께 동작이 되지 않아 문의드립니다.
(error 메세지 : TypeError: Object(…)().methods.createSchedule(…).send(…).once is not a function)
해당 페이지를 참고하여
.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 버전도 호환 되는 것 같음)
그리고 제가 작성한 예제 소스코드도 같이 올려봅니다.
일부만 발췌 및 수정하여 오타가 있을수 있습니다.
단순 오타는 무시하여 주시고 전체적인 구조로 살펴주시면 감사하겠습니다.
//=======================================================================
- 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;
}
}
//=======================================================================
- 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}
//=======================================================================
- 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)
})
}
//=======================================================================