알려주신 샘플코드로 테스트해보니 문제없이 Transaction Receipt 값이 생성되었습니다.
알려주신 상황으로 추측을 해보면 Klaytn network로 전달된 트랜잭션이 블록에 기록되기 전에 PollingTransactionReceiptProcessor가 동작을 마쳤기때문에 생기는 문제로 보입니다.
위 코드를 기준으로 Transaction receipt을 가지고오기 위해서 feePayerManager.executeTransaction(senderRawTransaction);
를 실행하면 FeePayerManager의 TransactionReceiptProcessor instance의 waitTransactionReceipt을 호출하게 됩니다.
FeePayManager의 Instance를 생성 시, TranasctionReceiptProcessor를 따로 Setter function을 통해 설정하지않으면 PollingTransactionReceiptProcessor instance를 자동으로 생성하여 설정하는데
이 PollingTransactionReceiptProcessor는 주어진 주기 및 횟수를 기준으로
특정 시간의 주기로 getTransactionReceipt를 호출하여 TransactionReceipt을 가지고 오기위해 시도합니다.
결론은, FeePayerManager의 자동으로 생성된 PollingTranasctionReceiptProcessor는 1초 주기로 총 15회의 getTransactionReceipt를 호출하게됩니다.
아래코드는 1초 주기로 30회를 getTransactionReceipt을 호출하는 PollingTransactionReceiptProcessor를 FeePayerManager에 등록하는 코드입니다.
TransactionReceiptProcessor transactionReceiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 30);
FeePayerManager feePayerManager = new FeePayerManager.Builder(caver, feePayer)
.setChainId(LOCAL_CHAIN_ID)
.setTransactionReceiptProcessor(transactionReceiptProcessor)
.build();
위 코드와 같이 PollingTransactionReceiptProcessor의 설정값을 조절해서 다시 한번 테스트 부탁드립니다.
Caver caver = Caver.build(apiUrl);
KlayCredentials credentials = KlayCredentials.create(fromPK);
Function function = new Function(
“transferFrom”,
Arrays.asList(
new Address(fromAddress),
new Address(toAddress),
new Uint256(sendValue)
), // inputParameters
Collections.emptyList() // outputParameters
);
String data = FunctionEncoder.encode(function);
TransactionManager transactionManager = new TransactionManager.Builder(caver, credentials).setChaindId(ChainId.MAINNET).build();
SmartContractExecutionTransaction smartContractExecution =
SmartContractExecutionTransaction.create(
credentials.getAddress(), // fromAddress
tokenContractAddress, // contractAddress
BigInteger.TEN, // value
Numeric.hexStringToByteArray(data), // data
BigInteger.valueOf(300_000) // gasLimit
);
String senderRawTransaction = transactionManager.sign(smartContractExecution, true).getValueAsString();
log.debug("]-----] senderRawTransaction [-----[ {}", senderRawTransaction);
KlayCredentials feePayer = KlayCredentials.create(
“feePrivateKey”,
“feeAddress”
);
TransactionReceiptProcessor transactionReceiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 30);
FeePayerManager feePayerManager = new FeePayerManager
.Builder(caver, feePayer)
.setTransactionReceiptProcessor(transactionReceiptProcessor)
.setChainId(ChainId.MAINNET).build();
feePayerManager.executeTransaction(senderRawTransaction);
도움 주신 코드로 테스트해본 결과 정상적으로 블록이 생성되는 것을 확인할 수 있었습니다.
하지만 해당 코드로 TransferFrom 메소드를 실행한 결과 “Fail : ErrExecutionReverted - uint(0x09)” 에러가 출력 됩니다.
따라서, 아래 두 가지 내용에 대해 문의 드리고자 합니다.
1.토큰 전송 시 트랜잭션 Sender의 서명 후 FeePayer의 서명을 진행하였는데
혹시, 해당 순서로 인해 "Fail : ErrExecutionReverted - uint(0x09)"에러가 출력된 것인지 궁금합니다.
2.만약 1번 문제가 아니라면 어떤 이유로 “Fail : ErrExecutionReverted - uint(0x09)” 에러가 출력 되는 것인지 궁금합니다.