커스텀 컨트랙트의 생성자를 수정하여 배포 중 질문

안녕하세요.
현재 커스텀한 KIP7타입의 컨트랙트를 필요에 따라 이름, 심볼값을 변경하여 재배포할 수 있도록 로직을 구현중인데요.
코드는 아래와 같습니다.

const contractAbi = fs.readFileSync("./src/contract.json", "utf8")
async function caDeploy() {
    let rawAbi: Record<string, any>
    let jsonAbi: AbiItem[]
    let abiByteCode: string

    try {
        rawAbi = JSON.parse(contractAbi)
        jsonAbi = rawAbi.abi
        abiByteCode = rawAbi.bytecode
    } catch (e) {
        console.error(e)
    }
    const newKeyring = generateKeyringFromPrivateKey(privateKey)
    caver.wallet.add(newKeyring)
    // const contractBytecode = caver.abi.encodeContractDeploy(jsonAbi, abiByteCode})
    const myContract = new caver.contract(jsonAbi, newKeyring.address, { gasPrice: '25000000000' })
    const newContract = await myContract.deploy({ data: abiByteCode, arguments: ["newName", "newSymbol"] }).send({ from: newKeyring.address, gas: 7500000 })
    console.log(newContract)
}
caDeploy()

여기서 질문이 있는데요.
질문 1

위의 페이지에서 argument의 값은 생성자에게 전달되는 값이라고 해서 위의 코드를 실행 시켰을 때,
name = “newName” , symbol = “newSymbol” 을 가진 contract가 배포되는 것을 기대하였는데, 코드를 실행하니 아래 사진과 같은 에러가 나더라구요. 혹시 제가 잘못 이해한 걸까요?

질문 2
코드 내용중에 주석처리한 코드
const contractBytecode = caver.abi.encodeContractDeploy(jsonAbi, abiByteCode})
가 있는데요.

이 페이지에서 보면 encodeContractDeploy의 리턴타입에
string : 바이트코드 + 매개변수를 의미하는 생성자 인자를 포함한 ABI 인코딩된 스마트 컨트랙트 배포.
라고 적혀있는데 혹시 이 말이 의미하는게 배포과정까지 포함되어있다고 하는건지, 그렇다면 encodeContractDeploy에 param 추가하여 기존 컨트랙트 + param 형태로 배포할 수 있는건지 궁금합니다.

혹은 이미 존재하는 abi값의 이름, 심볼값을 변경하여 컨트랙트를 배포할 수 있는 더 좋은 의견이 있으시다면 답글달아주시면 감사하겠습니다! 감사합니다 :slight_smile:

안녕하세요 질문해주신 내용에 순차적으로 답변드리면,

  1. 함수의 파라미터와 전달하신 파라미터가 매칭이 안되서 나는 에러인데요, 생성자 함수를 한번 더 확인해보시면 좋을거같습니다.
  2. encodeContractDeploy함수는 인코딩결과만을 리턴해주는 함수입니다.
    한번 해보시고 추가 질문 부탁드리겠습니다. 보다 정확한 내용을 위해서는 컨트렉트 코드와 abi를 공유해주시면 한번 테스트해보고 추가답변 드릴 수 있을거같습니다.
1 Like

답변 정말 감사합니다!
2번은 실행해봤는데요 bytecode값을 리턴하길래
매개변수로 받은 param이 추가된 바이트 코드가 반영되어 자동적으로 재배포되는가에 대한 질문이었습니다!
인코딩 결과값만을 리턴해주는 함수이기 때문에 재배포하는데 사용하기에는 힘들겠군요 감사합니다 :slight_smile:

추가적으로 1번 질문에 대해 여쭙고 싶은게 하나 더 있습니다.

사진에서 new caver.contract() 의 매개변수로 jsonABI, address 는 필수값이고 option값의 모든 요소가
선택사항(optional)이라고 기재되어있어,

new caver.contract(jsonAbi, newKeyring.address, { gasPrice: '25000000000' })

이렇게 작성하였는데요
혹시 생성자 함수를 한번 더 확인하라고 하신게 제 스마트컨트랙트의 생성자 함수를 의미하신걸까요? 너무 기본적인 질문이라면 죄송합니다 ㅜㅜ

네 맞습니다. 컨트랙트의 생성자 함수를 확인해보시면 좋을거같아요

1 Like

답변 정말 감사합니다. 의견 주신대로 시도해보고 다시 말씀드리겠습니다.
정말 감사합니다 :slightly_smiling_face:

1 Like

@jack_jin

아래와 같이 생성자 함수에 매개변수를 넣어 컨트랙트를 생성하는 식으로 해결했습니다.
도움 주셔서 정말 감사합니다 :slight_smile:

후에 같은 내용을 검색하는 다른 분들께 도움이 될지 몰라 아래 참고했던 레퍼런스 링크 달아놓습니다.

3 Likes