ERC-721 setApprovalForAll() 사용 하려고 하는데 잘 안되네요 ㅠㅠ
const receipt = await contract.methods.setApprovalForAll('0x{컨트렉주소}', true)
.send({
from: '0x{유저주소}',
gas: 250000,
}
);
위와 같이 setApprovalForAll() 를 사용하려고하는데…
Uncaught (in promise) Error: Returned error: unknown account
at Object.ErrorResponse (errors.js:87:16)
at eval (index.js:155:44)
at XMLHttpRequest.request.onreadystatechange (index.js:122:13)
이런 에러가 발생하네요~
혹시 아시는분 계실까요? ㅠㅠ;;
caver-js: 1.6.7
ERC-721
nodejs: v14.17.4
solidity: ^v0.5.0
send() 함수의 from은 트랜잭션을 수행하는 주소를 이용하셔야 합니다.
이는 인스턴스를 생성하신 contract
객체 내에 등록된 주소를 사용하셔야 하기때문에 이부분이 등록되지 않으면, 트랜잭션에서 실패하시게 됩니다.
아마 아래 코드를 해당 코드 상단에 추가해 해결하실수 있을것이라 생각하는데, 확인해보시겠어요?
const privateKey = '0x{유저주소} 와 pair의 privateKey'
const keyringContainer = new caver.keyringContainer()
const keyring = keyringContainer.add(keyringContainer.keyring.createFromPrivateKey(privateKey))
const contract = await caver.contract(contractABI, contractAddress) // 컨트랙트 인스턴스 생성후
contract.setWallet(keyringContainer)
위와 같이 수행하신 경우, send에 정의된 from: 에는 keyring.address
로 유저주소를 입력해주시면 됩니다.
감사합니다.
답변 감사합니다. ^^
근데 첫줄 new caver.keyringContainer() 여기서 부터 에러가 나긴하네요 ㅠㅠ;
아무튼 핵심은 .add({keyring}) 이라고 말씀하시는 것 같아서 제 코드에 맞게 해보았는데…
그 문제가 아닌것 같네요 ㅠ;
궁금한게 있는데 이건 위의 에러 코드와는 관련 없는 질문이긴 한데…
최근에 잠깐 공부하면서 느낀건데 caver-js v1.6 버전은 왜이렇게 공식 문서보고 하기 힘들고 먼가 안맞는 느낌이 들까요? ㅎ; caver-js v1.4로 바꿔보면 잘되려나 라는 생각도 들긴하는데
실제 운영 서비스 개발하는데 caver-js v1.4 , v1.6 중 무엇이 더 좋은 선택일까요?
Denver
February 3, 2022, 5:31am
4
@himmana
안녕하세요. 가급적 최신 버전의 caver 를 사용하시는 것을 권장드립니다.
더불어 아래의 예제 레포지토리도 참고 부탁드립니다.
다양한 시나리오 별로 예제 코드들을 정리해둔 레포지토리 입니다.
독스로만 부족하다고 생각이 드실 때 참고해주시면 좋습니다.
도움이 되었길 바랍니다.
감사합니다.
1 Like
Jamie
February 3, 2022, 8:48am
5
Contract 객체 (KIP7, KIP17, KIP37)는 in-memory wallet에 추가된 키링을 사용하여 편리하게 스마트 컨트랙트를 배포/실행하는 기능을 제공합니다.
그렇기 때문에 caver-js를 사용하고 계시다면 키링을 in-memory wallet에 추가해 주시면 됩니다.
하지만 common architecture 이전과 이후에 사용하는 방법이 다릅니다.
간혹 이를 혼용하여 사용하시는 경우가 있는데 그러면 정상적으로 동작하지 않습니다.
문서도 분리되어 있으므로 사용하는 피처에 따라서 문서를 따로 봐야 합니다.
Common Architecture에서 도입된 최신 기능 문서
Common Architecture 이전 기능 문서
아래 참고하시기 바랍니다.
Common architecture 이후 (caver-js v1.5.0 이상 버전에서만 제공)
caver.wallet.add(caver.wallet.keyring.createFromPrivateKey('0x{private key}'))
const kip17Contract = caver.kct.kip17.create('0x{contract address}')
or
caver.wallet.add(caver.wallet.keyring.createFromPrivateKey('0x{private key}')
const kip17Contract = caver.contract.create('0x{contract address}', kip17ABI)
Common architecture 이전 (모든 버전에서 제공하나 권장되지 않음)
caver.klay.accounts.wallet.add('0x{private key}')
const kip17Contract = new caver.klay.KIP17('0x{contract address}')
or
caver.klay.accounts.wallet.add('0x{private key}')
const kip17Contract = new caver.klay.Contract('0x{contract address}', kip17ABI)
버전은 최신 버전을 사용하는 것을 권장합니다.
2 Likes
아 알려주신 코드보고 처음 abi 이용해서 컨트렉 생성하는 부분 부터가 문제였던 것을 확인했습니다.
... 생략 ...
const cont = caver.contract.create(DEPLOYED_ABI, DEPLOYED_ADDRESS);
... 생략 ...
감사합니다. 단서를 주셔서 ㅠㅠ 눈물나게 고맙네요…
질문하나 더 드려도 될까요??
KIP-17은 또 머죠? ERC-721과 비슷한것 같은데…
저는 ERC-721관련된 문서 보면서 열심히 공부하고있었는데… KIP-17은 몰랐네요 ㅠㅠ
Jamie
February 3, 2022, 11:38pm
7
KIP-17은 Klaytn의 Non fungible token standard입니다.
KIP 17: Non-fungible Token Standard 이 문서 읽어보시면 됩니다
1 Like
ERC-721로 개발하는게 좋은가요 KIP-17로 개발하는 것이 좋은가요?
초보라 아직 개념도 잘 모르겠네요 ;;
Denver
February 4, 2022, 7:37am
9
@himmana
Klaytn 에서의 원활한 사용을 원하신다면 KIP-17 이 여러모로 유리할 듯합니다.
Klaytn SDK에서도 기본적으로 KIP-17을 위한 편리한 기능들 을 많이 제공하고 있습니다.
ERC-721을 활용하시면 Klaytn SDK를 통한 편의기능들은 활용하실 수 없습니다.
참고부탁드립니다.
감사합니다.
himmana
February 4, 2022, 9:04am
10
크~ 알려주셔서 감사합니다.~
클레이튼은 ERC-721 보다 KIP-17이 더 권장 되는 형태이군요…
이제 겨우 openzepplelin-solidity 이용해서 솔리디티 작성하는거 대충 감잡았는데, 다시 KIP-17 사용법 공부해야겠습니다~ ㅎ
감사합니다~
1 Like