gugu_gu
September 6, 2021, 10:16pm
1
안녕하세요
caver-js을 사용하여 디앱을 만들고 있습니다.
해당 메소드를 참고하여 특정 event를 on 하고 있다가
불시에 이벤트 발생시 캐치하길 바라는데
js 실행시 한번 실행 후에 null이 리턴 되고나서
바로 script가 종료 됩니다.
getPastEvents는 잘 작동 됩니다.
web3로 이더리움 컨트랙트 이벤트를 구독할때는
script 종료 없이 이벤트 발생도 캐치를 잘하는데
어느 부분이 문제인지 미천한 개발실력으로는 잘 모르겠습니다.
조언 부탁 드립니다.
const Caver = require('caver-js');
const caver = new Caver('http://en node...');
const contract_addr = 'address';
const abi = [{
anonymous: false,
inputs: [
{
indexed: true,
name: 'from',
type: 'address',
},
{
indexed: true,
name: 'to',
type: 'address',
},
{
indexed: false,
name: 'value',
type: 'uint256',
},
],
name: 'Transfer',
type: 'event',
}]
const myToken = new caver.contract(abi,contract_addr);
//null 리턴 후 스크립트 종료
myToken.events.Transfer({
fromBlock: 0
}, function(error, event) { console.log(event) })
.on('connected', function(subscriptionId){
console.log(subscriptionId)
})
.on('data', function(event){
console.log(event)
})
.on('error', console.error)
//정상 작동 됨
myToken.getPastEvents('Transfer', {
fromBlock: 69241014,
toBlock: 'latest'
}, function(error, events) { console.log(events); })
.then(function(events) {
console.log(events) // same results as the optional callback above
});
Jamie
September 7, 2021, 1:55am
2
안녕하세요, 질문 주셔서 감사합니다.
먼저 subscribe 기능은 Websocket Provider에서만 제공되는 기능입니다.
contract.events.eventName
을 통해서 이벤트를 subscribe 하기 위해서는 websocket provider를 사용해야 합니다.
주신 코드를 실행하면 아마 아래의 에러가 발생할 것입니다.
Error: The current provider doesn't support subscriptions: HttpProvider
at Subscription.subscribe (/Users/jasmine/projects/caver-js/packages/caver-core-subscriptions/src/subscription.js:216:22)
at KIP7.Contract._on (/Users/jasmine/projects/caver-js/packages/caver-contract/src/index.js:1283:18)
at eventForum (/Users/jasmine/projects/caver-js/test.js:31:10)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
위의 에러는 현재 HttpProvider는 subscriptions을 할 수 없다는 내용으로 이를 Websocket Provider도 변경해 주면 아래와 같이 사용할 수 있습니다.
const caver = new Caver('ws://{en node url}:{ws port}/')
const keyring = caver.wallet.add(
caver.wallet.keyring.createFromPrivateKey('0x{private key}')
)
const myToken = await caver.kct.kip7.deploy(
{
name: 'JASMINE',
symbol: 'JAS',
decimals: 18,
initialSupply: '100000000000000000000000',
},
keyring.address
)
myToken.events
.Transfer(
{
fromBlock: 0,
},
function(error, event) {
console.log(event)
}
)
.on('data', function(event) {
console.log(`event at '.on('data')'`)
console.log(event)
})
.on('error', console.error)
setTimeout(async () => {
const receipt = await myToken.transfer(caver.wallet.keyring.generate().address, 10, { from: keyring.address })
console.log(`First Transfer Status from Receipt: ${receipt.status}`)
setTimeout(async () => {
const receipt = await myToken.transfer(caver.wallet.keyring.generate().address, 20, { from: keyring.address })
console.log(`Second Transfer Status from Receipt: ${receipt.status}`)
}, 1000)
}, 1000)