Erc20 기반에 Transaction 샘플 코드가 혹시 있는지요?

안녕하세요.

klay 노드 기반에 토큰(ERC20) 을 발행 하여 사용 할려고 합니다.

아래는 제가 사용 했던 WEB3J 기반에 토큰 전송 하는 함수인데요…
klay 기반으로 토큰 전송 시 아래와 같은 샘플 소스 혹시 있는지요?
있다면, 아래의 WEB3J 전송 코드와 같이 사용 할 수 있는 샘플 소스 부탁드립니다.
감사합니다.

############################################
WEB3J erc20 token 전송 소스(Java) :

private String execute(
Credentials credentials, Function function, String contractAddress) throws Exception {
BigInteger nonce = getNonce(credentials.getAddress());

String encodedFunction = FunctionEncoder.encode(function);

RawTransaction rawTransaction = RawTransaction.createTransaction(
        nonce,
        GAS_PRICE,
        GAS_LIMIT,
        contractAddress,
        encodedFunction);

byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Numeric.toHexString(signedMessage);

EthSendTransaction transactionResponse = web3j.ethSendRawTransaction(hexValue)
        .sendAsync().get();

return transactionResponse.getTransactionHash();
1 Like

아래 예제에서 functionCallData.getBytes()Numeric.hexStringToByteArray(functionCallData)로 수정되었습니다.

caver-java로 컨트랙트 함수를 호출하는 방법은 두가지입니다. 하나는 Function 객체를 사용하여 트랜잭션을 수동으로 생성, 서명하는 방법, 그리고 다른 하나는 컨트랙트 객체를 사용하는 방법입니다.

예시로 남겨주신 코드는 이더리움에서 Function 객체를 사용하여 트랜잭션을 직접 생성하고 서명하는 코드입니다. 해당 방식은 caver-java로 다음과 같이 프로그래밍 할 수 있습니다.

// Common variables
int chainId = ChainId.BAOBAB_TESTNET;
DefaultBlockParameter blockParameter = DefaultBlockParameterName.LATEST;
BigInteger gasLimit = new DefaultGasProvider().getGasLimit();
// KlayCredentials senderCredential = KlayCredentials.create("private_key");
// Caver caver = Caver.build("URL of the Klaytn network you connect to (e.g., https://api.baobab.klaytn.net:8651/ for Baobab)");

// Using Function object
try {
    // String contractAddress = "put_your_contract_address";
    // Function function = new Function(...); // your Function object

    // Using web3j FunctionEncoder is fine
    String functionCallData = FunctionEncoder.encode(function);

    // Get your nonce; refactor this as getNonce() if you want
    BigInteger nonce = caver.klay().getTransactionCount(senderCredential.getAddress(), blockParameter).send().getValue();

    // Explicitly create a transaction of type SmartContractExecutionTransaction
    TxType tx = SmartContractExecutionTransaction
            .create(senderCredential.getAddress(),
                    contractAddress,
                    BigInteger.ZERO,
                    Numeric.hexStringToByteArray(functionCallData),
                    gasLimit)
            .nonce(nonce)
            .build();

    // This is your signed raw transaction
    String rawTx = tx.sign(senderCredential, chainId).getValueAsString();

    TransactionManager manager = new TransactionManager.Builder(caver, senderCredential)
            .setTransactionReceiptProcessor(new PollingTransactionReceiptProcessor(caver, 1000, 10))
            .setChaindId(chainId)
            .build();

    KlayTransactionReceipt.TransactionReceipt receipt = manager.executeTransaction(rawTx);
    System.out.println(receipt);
} catch (Exception e) {
    // handle exceptions
}

컨트랙트 객체를 사용할 경우 보다 간결하게 프로그래밍이 가능합니다. 컨트랙트 객체의 생성방법은 다음을 참조하시기 바랍니다.

// Same common variables are required
try {
    // Using contract object instead of creating Function object manually.
    // For this example, I used a simple example contract called Count to illustrate the use of the class.
    // Use caver-java command line to generate contract class.
    Count contract = Count.load(
            contractAddress,
            caver,
            senderCredential,
            chainId,
            new DefaultGasProvider()
    );

    KlayTransactionReceipt.TransactionReceipt receipt = contract.setCount(BigInteger.valueOf(10)).send();
// Alternatively, you can use sendAsync().    
//    CompletableFuture<KlayTransactionReceipt.TransactionReceipt> future = contract.setCount(BigInteger.valueOf(10)).sendAsync();
//    KlayTransactionReceipt.TransactionReceipt receipt = future.get();
    System.out.println(receipt);
} catch (Exception e) {
    // handle exceptions
}
1 Like