안녕하세요,
Klaytn IDE에서 저희 컨트랙을 배포하고 caver.js로 프론트에서 Bapp 로직을 구현하고 있습니다.
저희 프론트에서 사용자 인증을 Kaikas로 진행하고 있는데요,
Kaikas account를 연동하여 컨트랙 메서드를 실행하는 중에 두가지 궁금증이 있어서 문의드립니다.
Kaikas 로그인에 성공하면 window.klay.selectedAddress 값에 현재 로그인한 지갑 주소 값이 저장되어서 사용할 수 있습니다.
그리고 상태를 변경하는 컨트랙트 메서드를 실행할 때, 아래와 같이 send메서드를 호출할때 wallet address를 from의 인자 값으로 전달하려고 합니다.
(사용자가 UI에서 특정 부분을 선택하면 코인 전송이 발생하며 관련된 객체의 상태정보를 변경시키는 메서드)
myContract.methods.buyGrid('0x0eB1f74667eB20B1f7f89872327B7967A804b8a0')
.send({
from: {wallet_address} // cav.klay.accounts.wallet[0].address로 설정하면 정상 실행 됨.
gas: '200000',
value: 1_000_000_000_000_000_0 // 0.01 KLAY
})
.then((receipt) => {
console.log(receipt)
}).catch((error) => {
console.log(error)
}))
이때 window.klay.selectedAddress 값을 바로 설정하면
Error: Returned error: unknown account
at Object.ErrorResponse (errors.js:87)
at index.js:155
...
at endReadableNT (_stream_readable.js:1010)
at afterTickTwo (index.js:28)
이렇게 에러가 리턴이 되어서 좀 살펴보니 caver.klay.accounts.wallet에 해당 주소를 추가를 미리 해주어야하는 것 같아서 컨트랙 메서드 실행 전에 아래와 같이 지갑 주소를 caver.klay.accounts.wallet에 추가해주었습니다.
caver.klay.accounts.wallet.add(
{
privateKey: '0x{제 kaikas 프라이빗키}',
address: klaytn.selectedAddress
})
이렇게 설정을 해주니 일단 buyGrid 메서드는 실행이 되더군요,
여기서 한가지 의문점은 사용자로부터 kaikas, klip등과 같은 지갑 플러그인을 통해 인증을 받고 이 정보를 바탕으로 bapp 로직의 바탕이 되는 컨트랙 메서드들을 구동하려고 하는데요, 이 privateKey는 꼭 필요한 정보일까요?
caver.js Counter 예제를 좀 살펴보니 여기서는 사용자로부터 privatekey와 password를 직접 입력을 받아서 caver.klay.accounts에 추가를 하는 방식으로 구현을 하더군요.
저희 같은 케이스는 사용자로부터 컨트랙 실행할때마다 privateKey를 입력받기도 곤란하고 어떻게 처리하면 좋을지 막막하군요.
- caver.js Documentation을 읽어보니 컨트랙 메서드 실행 후에 on 혹은 once라는 키워드를 통해 각 이벤트에 대한 콜백을 설정할 수가 있는 것 같은데요. 아래와 같이 구현하니 on, once라는 메서드를 찾을 수 없다는 에러가 발생합니다.
Uncaught TypeError: myContract.methods.buyGrid(...).send(...).once is not a function
at onClick (Footer.jsx:215)
...
at react-dom.development.js:8508
콘솔 로그로 myContract.methods.buyGrid(…).send(…)에 대한 타입을 살펴보니 단순한 javascript Promise 객체로 리턴이 되는 것 같아서 이렇게 .then으로 처리를 하니 일단 이벤트 처리에는 성공하였습니다.
myContract.methods.buyGrid(...).send(...).then((receipt) => {
console.log(receipt)
}).catch((error) => {
console.log(error)
}))
https://docs.kaikas.io/02_api_reference/02_caver_methods
다만 이 매뉴얼에 나온대로 트랜잭션 실행 후에 각 이벤트에 대한 콜백을 상세히 지정할 수 있으면 더 좋을 것 같아서요,
어떻게 하면 on, once등의 메서드를 실행할 수 있을까요?
항상 감사드립니다.