contract.getMethod.sign() / contract.getMethod.signAsFeePayer()관련 질문입니다

안녕하세요.

String input = contract.encodeABI("transfer", account, new BigInteger(convertAmount));
FeeDelegatedSmartContractExecution fdsce =  new FeeDelegatedSmartContractExecution.Builder()
        .setKlaytnCall(caver.rpc.klay)
        .setFrom(senderKeyring.getAddress())
        .setTo(toAddress)
        .setGas(sendOption.getGas())
        .setInput(input)
        .setFeePayer(feePayerKeyring.getAddress())
        .build();

caver.wallet.sign(senderKeyring.getAddress(), fdsce);
caver.wallet.signAsFeePayer(feePayerKeyring.getAddress(), fdsce);
String decoded = fdsce.getRLPEncoding();

Bytes32 txHash_executed = caver.rpc.klay.sendRawTransaction(decoded).send();

위 소스처럼 FeeDelegatedSmartContractExecution을 호출하려고 합니다.

Contract contract = KIP7.create(caver, token.getAbi(),  tokenContractAddress);

caver.wallet.add(senderKeyring);
caver.wallet.add(feePayerKeyring);

contract.getDefaultSendOptions().setFrom(senderKeyring.getAddress());
contract.getDefaultSendOptions().setFeeDelegation(true);
contract.getDefaultSendOptions().setFeePayer(feePayerKeyring.getAddress());
contract.setWallet(caver.wallet);

SendOptions sendOptions = determineSendOptions(contract, contract.getDefaultSendOptions(), method, Arrays.asList(toAddress, amount));
AbstractTransaction signData = contract.getMethod(method).sign(Arrays.asList(toAddress, amount), sendOptions);
// AbstractTransaction feePayersignData = contract.getMethod(method).signAsFeePayer(Arrays.asList(toAddress, amount), sendOptions); // 이 방법도 해보았는데 동일하게 에러가 발생했습니다 ㅜㅜ

String decoded = signData.getRLPEncoding();
Bytes32 txHash_executed = caver.rpc.klay.sendRawTransaction(decoded).send();

위 방법으로 txHash값을 가져오고 싶은데

"{"jsonrpc":"2.0","id":7,"error":{"code":-32000,"message":"invalid fee payer"}}"

위와 같은 feepayer가 없다고 나오네요…
어느 부분이 잘못되었을까요?

안녕하세요 feepayer keyring을 어떻게 만드셨는지 공유부탁드립니다.

@jack_jin

KeyringFactory.decrypt(keyStore, privateKey);

위 함수를 사용해서 생성했습니다

feePayer주소에 클레이가 있는지 한번 확인해보시겠어요?

@jack_jin
Feepayer : 0xe6cb02f70943e3fe3565ec75ca36c3bc466e1a57
chainId : 1001(바오밥)인것도 확인했습니다
Klay : 448.66 Klay

RoleBaseKeyring으로 되어 선언해서 테스트하고 있었는데
이거하고 연관이 있을까요?

네 관련코드 전체를 올려주시면 답변드리는데 도움될거같은데요, roleBasedAccount타입으로 대납을 하실때는, 내부 대납키를 이용해서 서명하셔야 정상적으로 대납이 실행됩니다.

기존에 테스트해서 성공한 방식대로 했을 때도 동일한 FeePayer를 사용해서 Tx Hash를 얻었는데 잘 모르겠네요 ㅜㅜ

FeeDelegatedSmartContractExecution을 서명할 때
"caver.wallet.sign(senderKeyring.getAddress(), fdsce);"처럼 from이 서명을하고
“caver.wallet.signAsFeePayer(feePayerKeyring.getAddress(), fdsce);” feepayer가 서명을 하는거처럼 보여지는데

AbstractTransaction signData = contract.getMethod(method).sign(Arrays.asList(toAddress, amount), sendOptions);

으로 얻은 sginData에 feepayer에 대한 서명을 해야할거 같다고 생각하는데 제가 생각한게 맞을까요??
그래서 Contract / ContractMethod의 Wrapper클래스를 찾아서 signAsFeePayer도 해주었는데 안되네요;;

네 그아래에

caver.wallet.signAsFeePayer(feePayer, (AbstractFeeDelegatedTransaction)transaction);

이렇게 하신뒤에 한번 해보시겠어요?