Klip App2App JavaScript SDK 사용 중, prepare.executeContract 관련 문의

안녕하세요. 현재 Klip 지갑에 대해 배포된 컨트랙트 코드의 특정 트랜잭션을 실행시키는 기능을 구현 중에 있습니다. 질문드리고 싶은 부분이 총 2가지가 있는데,

  1. Klip 지갑에 대해 prepare.executeContract SDK를 사용하여 res값을 받는데, 아래와 같은 에러코드가 발생합니다.
{code: 6408, err: 'invalid params'}

params의 인자들에 대해 잘못 기입해주어 발생하는 문제일 것으로 추측되는데, abi형태에 따라 데이터 재가공을 가능한 한 많은 경우의 수를 대입해주어도, 같은 에러코드가 반복되어 질문을 드립니다.

데이터의 형식은

const bappName = 'Name';
const from = caver._provider.selectedAddress;
const to = '0xAddress';
const value = '0';
const abi = `{
"inputs": [
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "from",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                  },
                  {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint256",
                    "name": "relAmount",
                    "type": "uint256"
                  },
                  {
                    "internalType": "address",
                    "name": "included",
                    "type": "address"
                  }
                ],
                "internalType": "struct Abi.Test[]",
                "name": "_amounts",
                "type": "tuple[]"
              },
              {
                "internalType": "uint256",
                "name": "amountOut",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "limitAmount",
                "type": "uint256"
              }
            ],
            "name": "SEMT",
            "outputs": [],
            "stateMutability": "payable",
            "type": "function",
            "payable": true
}`;
const params = `[
          "[
            {
              'relAmount': 997205,
              'from': "0xAddress",
              'included': "0xAddress",
              'amount': 0,
              'to': "0xAddress",
            },
            {
              'relAmount': 997205,
              'from': "0xAddress",
              'included': "0xAddress",
              'amount': 0,
              'to': "0xAddress",
            },
]", ${amountBAmount}, ${(slippage * 100).toString()}]`;
const successLink = '/successPage';
const failLink = '/failPage';
const res = await prepare.executeContract({ bappName, from, to, value, abi, params, successLink, failLink });
console.log(res);

현재 코드는 이러한 상황이고, 상기된 에러코드가 꾸준히 발생하는 것으로 보아, params에 들어가는 인자들의 형식이나, 구성에 문제가 있는 것으로 보여집니다.
JSON.stringify나 값들만 구성하여 데이터를 재가공 하여도 문제가 꾸준히 발생합니다. 혹 위의 abi에 맞는 params를 예시로 알려주시는 것이 가능하실지 궁금합니다.

  1. prepare.executeContract 외에, Klip 지갑에 Smart Contract Execution을 보낼 수 있는 방법이 있을지 궁금합니다. 현재 Klip 지갑에 대해 View Function들은
const caver = new Caver(window.klaytn);
const contractTest = new caver.contract(ABIs, contractAddress);
contractTest.balanceOf(EOA);

등의 코드로 클립 사용자의 주소를 알 경우 인증을 받지 않아도 확인이 가능한데, View Function이 아닌 Function들도 위의 방식으로 prepare.executeContract를 사용했을 때와 마찬가지로 res값을 받을 수 있는 코드를 작성할 수 있을지 궁금합니다.

forum에서 많은 도움 얻고 있습니다. 바쁘실텐데 항상 성심성의껏 답변해주셔서 감사합니다.

안녕하세요 :slight_smile:

  1. 현재 contract execution의 파라미터 타입으로 직접 선언한 struct는 지원하지 않습니다. 다소 불편하시겠지만 풀어서 쓰셔야하겠습니다.
  2. contract execution 타입 이외에 결과값을 받을 수 있는 임의의 컨트랙트 실행은 지원하지 않습니다.

감사합니다.

struct를 풀어서 전송하라고 말씀하셨는데, 혹 param을 전송할 때, struct를 풀어쓰는 방법이 있을까요? 어떤 방식으로 풀어서 전송 해야할지 여쭤봐도 괜찮으실지요.

solidity에서 풀어진 데이터를 받아서 실행시키기에는, 타입을 지정해줘야 하기 때문에 문제가 있을 것으로 보입니다.

컨트랙트 코드 수정이 필요해보이는데요, 특별한 방법은 아니고 예를 들면 아래와 같은 형태가 되겠습니다.

기존 코드 예시 :

struct A {
   address addr,
   int256   value
}

function foo(A[]) { ... }

신규 코드 예시 :

function foo(address[], int256 []) { ... }

확인했습니다. 컨트랙트 단에서 코드 수정하도록 하겠습니다. 감사합니다…!!

1개의 좋아요

늦은 시간에 죄송합니다. 혹 param으로 보내주는 데이터가 이중 배열이어도 인식이 안될까요…?

const abi = `{
            "inputs": [
              {
                "internalType": "address[][]",
                "name": "tokenAddr",
                "type": "address[][]"
              },
              {
                "internalType": "uint256[][]",
                "name": "amount",
                "type": "uint256[][]"
              },
              {
                "internalType": "uint256",
                "name": "amountOut",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "limitAmount",
                "type": "uint256"
              }
            ],
            "name": "SEMT",
            "outputs": [],
            "stateMutability": "payable",
            "type": "function",
            "payable": true
          }`

형식으로 다시 작성했는데, 2중배열을 param으로 작성했는데 동일한 오류가 나고 있습니다.

다중 배열은 지원됩니다. 내부에서 간단히 동작 테스트 확인했는데요, 혹시 인자를 잘못 사용하셨는지 확인 부탁드립니다.

혹 가능하시다면 다중 배열 테스트의 abi와 params 예시를 한 번 확인할 수 있을까요…?

uint256값에는 따옴표를 제거했고, address값에는 붙이는 형식이라고 알고있었으나, 최대한 모든 경우의 수를 고려하고 싶어 인자들을 직접 하드코딩하여 따옴표를 붙이고 제거하고 작업을 진행하였으나, 계속 invalid params가 나오는 상황입니다.

json stringify를 통해 서버에 post 방식으로 전송되어지는 것 같은데, 배열 내부 및 외부에 따옴표 적용을 어떻게 시켜야할지…

번거로우실텐데 자꾸 질문드려 죄송합니다.

혹시 다중 배열말고 다른 간단한 요청은 성공하셨을까요? Klip Docs 튜토리얼 예제를 한 번 참고해주시면 좋을 것 같습니다~

curl -X POST "https://a2a-api.klipwallet.com/v2/a2a/prepare" \
-d '{"bapp": { "name" : "My BApp" }, "type": "execute_contract", "transaction": { "to": "0xd4fFbe967c31C29199478Be2b5A53dC69eF9B825", "value": "0", "abi": "{ \"constant\": false, \"inputs\": [ { \"name\": \"a\", \"type\": \"string\" } ], \"name\": \"testString\", \"outputs\": [], \"payable\": false, \"stateMutability\": \"nonpayable\", \"type\": \"function\" }", "params": "[\"test_string\"]" } }' \
-H "Content-Type: application/json"

답변해주셔서 감사합니다.

현재 token에 대한 allowance 등, 다른 간단한 abi 및 param을 사용하는 요청은 성공한 상태입니다.

SC단에서 문제가 생긴 것인지, FE단에서 보내주는 param의 값이 잘못된 것인지, 디버깅 할 수 있는 수단이 용이하지않아 일단 문제 해결 중에 있습니다.

동일한 param을 가진 요청이 Kaikas로는 정상 작동 하는 것으로 미루어볼 때 SC단에서 문제가 있는 것은 아닐 것으로 예상되어지긴 합니다.

혹 문제가 해결되었을 때 공유하도록 하겠습니다.

1개의 좋아요