Import "@klaytn/contracts/token/KIP7/KIP7Token.sol"; Not found 에러

@klaytn/contracts”: “^0.9.0”, 의존성을 가진 토큰 컨트렉트를 불러오려고 합니다.

IDE에서 코드를 불러오니

import “@klaytn/contracts/token/KIP7/KIP7Token.sol”; 부분에서 Error: Not found를 리턴합니다.

포럼에 해당 이슈에 대해 컨트렉트 디렉터리가 변경됐다, 다른 곳을 찾아보라는 내용이 몇 개 있어서 시도해봤지만 제대로 작동하지 못하는 것 같습니다. 어떤 식으로 변경하면 될지 문의드립니다.

안녕하세요 아래 레포 참고하셔서 수정하시면 될 것 같습니다.

pragma solidity ^0.8.0;

import "@klaytn/contracts/KIP/token/KIP17/KIP17.sol";

contract MyCollectible is KIP17 {
    constructor() KIP17("MyCollectible", "MCO") {
    }
}

답변 감사합니다.

링크를 확인해서 코드를 조금 수정해봤는데도 정확히 해결이 되지 않아 그런데 어떤 식으로 해결이 될 수 있는지 문의드려도 될까요? 코드를 그대로 유지하면서 이미 배포된 컨트렉트에 접근해야 버그가 발생하지 않을 것 같은데 위와 같이 컨스트럭트를 붙이거나 하면 작동이 될까 의문입니다.

안녕하세요, 다음 path로 설정해보시겠어요?

import "@klaytn/contracts/KIP/token/KIP7/KIP7.sol";

만약 새로 KIP7 토큰을 배포하는 것이 아닌, 이미 배포되어있는 KIP7 토큰의 인터페이스를 사용하고 싶으시다면 (approve, transferFrom 등), IKIP7.sol을 import하셔서 사용하시면 될 것 같습니다.

예시

`import "@klaytn/contracts/KIP/token/KIP7/IKIP7.sol";`

contract myContract {

  IKIP7 public token;

  constructor(address _tokenAddress) {
    token = IKIP7(_tokenAddress);
  }

  function checkBalance(address _user) public view returns (uint256) {
    return token.balanceOf(_user);
  }
}

다음과 같이 해보시고 안되시는 부분 있으시면 말씀부탁드립니다.

감사합니다.

답변 감사합니다. 위에 알려주신 방향으로 진행해보니 버전 차이가 있어서 작동이 안되는 것 같습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.5.4;

를 사용하고 있는데 해당 코드로 수정했을 때 다음의 에러가 리턴됩니다.

@klaytn/contracts/KIP/token/KIP7/IKIP7.sol:6:1: ParserError: Source file requires different compiler version (current compiler is 0.5.17+commit.d19bba13.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version
pragma solidity ^0.8.0;
^---------------------^

pragma solidity ^0.8.0; 코드를 적용하면 이미 작성된 컨트렉트의 다른 코드와 충돌하게 됩니다.
어떻게 해결이 가능할까요?

안녕하세요, solidity 0.5.4 버전을 반드시 사용해야 할 이유가 없다면, 개발 중이신 컨트랙트의 solidity 버전 업데이트를 하시는 것을 추천드립니다.

만약 버전 업데이트를 하기가 어려우시다면, 직접 0.5.X 버전의 KIP contract를 로컬로 가져오신 후 import하시기 바랍니다.

File structure example:

/contracts
    /KIPContract
        /IKIP7.sol // IKIP7 solidity file with 0.5.X
    /MyContract
        /SampleContract.sol
// in SampleContract.sol
import "../KIPContract/IKIP7.sol"

...

위 예시처럼 로컬에서 IKIP7 인터페이스를 사용하실 수 있습니다. (버전 다운은 직접 진행하셔야 합니다. 아마 IKIP7의 일부 함수 input의 memory → calldata 수정이 필요할 것 같습니다.)

다만 위에서 말씀드렸듯 0.5.x 버전을 반드시 사용해야하는 것이 아니라면, 전체적으로 코드 업데이트를 진행하시길 추천드립니다.

감사합니다.

안녕하세요. 제안 주신 것처럼 solidity 버전 업그레이드를 진행해, 0.8.0로 하게 되는 경우에는

ParserError: Expected a state variable declaration. If you intended this as a fallback function or a function to handle plain ether transactions, use the "fallback" keyword or the "receive" keyword instead.
  --> contracts/1_Storage.sol:62:33:
   |
62 |     function() external payable {}
   |                                 ^

가 발생하고, 해당 부분을 수정하면 다른 에러가 발생해 배포된 컨트렉트 접근 자체가 안되는 것 같습니다. 과거 버전의

import "@klaytn/contracts/token/KIP7/KIP7Token.sol";

를 가져와서 사용하고자 하는데 찾기가 쉽지 않네요. 어떻게 하면 좋을지 도움 부탁드립니다.

에 해당 contract이 존재합니다

답변 감사합니다.

import "@klaytn-contracts-old/contracts/token/KIP7/KIP7Token.sol";

로 변경해서 실행하니

Error: not found @klaytn-contracts-old/contracts/token/KIP7/KIP7Token.sol

를 반환합니다. 접근을 어떻게 하면 좋을까요?

앞서 @Lewis 께서 답변 주신 것처럼, 해당 컨트랙트를 로컬로 가져오신 뒤 import 하시면 될 것 같은데요,
npm library로 import 하시는 이유가 있나요?

로컬로 옮겨 디렉터리 전체를 업로드해서 진행하는 경우엔 리믹스 환경에서 컴파일이 완료가 되지 않습니다. 그래서 라이브러리 참조만 되는 것 같아서 문의드렸습니다. 이렇게 컴파일이 극단적으로 느려져 진행되지 않는 상황이 올 때는 어떻게 하면 좋을까요?

컴파일 속도에 대해서는 환경설정이 잘못된 것이 아닌지 다른 요건들을 체크해보셔야하겠으나,

리믹스를 사용한다면

import "@klaytn/contracts@0.9.0/token/KIP7/KIP7Token.sol";

로 사용해보세요

알려주신 방법으로 진행시에 사진과 같은 에러가 나타납니다.

해당 파일이 다른 solidity version의 파일을 import하고 있는지 등등을 확인해보셨나요?

klaytn-contract old version은 해당 import를 통해 정상적으로 작동됨이 확인됩니다.

https://remix-ide.readthedocs.io/en/latest/import.html

를 통해 추가적인 에러 발생시에는 remix 사용법을 확인해보시는 것이 좋을것 같습니다.

참조하는 컨트렉트는

// SPDX-License-Identifier: MIT

pragma solidity ^0.5.4;

import "@klaytn/contracts@0.9.0/token/KIP7/KIP7Token.sol";

import "@openzeppelin/contracts/ownership/Ownable.sol";

이정도 뿐입니다. 알려주신 내용대로 했을 때 위의 에러 메시지가 나오는 상황입니다.

말씀주신 것처럼 import 자체는 문제가 없어보입니다.

다른 코드를 삭제하고 참조부분만 남겨서 보니 문제의 원인이

import "@openzeppelin/contracts/ownership/Ownable.sol";

인 것 같습니다.

Ownable.sol 컨트렉트에서 포인팅하는 컨트렉트가 “@klaytn/contracts@0.9.0/~~~” 로 보이는데 이 경우라면 아랫 줄에 있는 컨트렉트의 참조도 예전 클레이튼 버전에 맞추도록 변경이 되어야하는것 같습니다.

Klaytn에서는 Klaytn Wizard서비스를 지원하고있습니다.

해당 서비스를 활용하셔서 개발하시고자 하는 컨트랙트의 기본 틀을 잡으시면 도움이 되실 것 같습니다.

“해당 파일이 다른 solidity version의 파일을 import하고 있는지 등등을 확인해보셨나요?”

에 대해서, 해당 Owanble.sol 파일의 solidity version을 체크해보셨나요?

오픈제플린 역시 2.x, 3.x 4.x 버전에 대해서 solidity version의 서포트 범위가 다릅니다

컴파일에 사용한 solidity 버전이 동일한 상태인데 오픈제플린에 올라온 컨트렉트 코드는 과거 솔리디티 버전과 호환되지 않도록 변경하는 일이 있다는 걸까요? 다른 프로그래밍 언어에서는 경험해본 적 없는 개념이라 당혹스럽네요.

사용해봤는데 어떤 차이점이 있는지 모르겠네요.

Open in Remix를 눌러 들어가보니 기존 리믹스 콘솔과 차이점이 어디에 있는지 확인이 어렵습니다.
다운로드를 통해서 로컬 환경에서 개발할 때 사용하는 도구일까요.

추가로 확인해보니 오픈제플린에 대한 건 컴파일 에러 11개 중 하나고, 제안주신 KIP17Token에서 발생한 것이 10개인데, 컨트렉트에서 참조하는 다른 소스에 대해서는 존재하지 않아 생기는 문제로 보이네요. 클레이튼 라이브러리가 이전 버전에 사용하는게 동일하게 임포트 할 수 있다면 생길 수 없는 문제라 생각됩니다.