[Tech] Klaytn FeeDelegation Tx

Tech At CHANNEL-iN
@CHANNEL-iN
Published in
4 min readDec 12, 2023

Overview

클레이튼 네트워크에서 유저의 Transaction을 실행할때
Tx Type에는 Fee Delegation, Partial Fee Delegation 타입이 존재 합니다.

dapp(bapp) 서비스 이용에 익숙치 않은 유저,
혹은 네트워크 첫 이용 유저의 경우 서비스를 이용하기 위하여
네이티브 코인(gasFee)을 보유하여야 이용이 가능합니다.

이는 사용자 접근을 어렵게 하는 문턱으로 작용합니다.
이를 해결해주는 것이 바로 대납기능을 이용한 서비스 구축 입니다.

서비스빌더(제공자)가 feePayer에 대한 설정을 해둔다면
사용자는 네트워크의 네이티브 코인을 보유하고 있지 않아도
사용이 가능 합니다.

klaytn에서는 사용자 편의성을 위하여
이를 쉽게 적용할 수 있도록 제공 하고 있습니다.

https://ko.docs.klaytn.foundation/content/dapp/sdk/caver-js/api-references/caver.transaction

사용 예제코드를 통하여 수수료 대납기능을 사용해 봅시다!

준비물

  • 가스피를 대납할 어카운트
  • 예제에서 사용할 baobab(testNet) Klay
  • 만약 없다면 faucet을 통해 50 klay를 수령할 수 있습니다.

시나리오

미리 예제를 위해 만들어놓은 ERC20의 Mint를 호출하고자 합니다.
서비스 제공자는 feePayer로 사용할 어카운트 정보를 등록하고
유저에게 토큰을 받을 주소와, 수량을 입력 받아 실행 합니다.

STEP 1.

feePayer로 사용할 Account에 Klay를 충전합니다.
만약 Klay가 없다면 faucet를 통해 테스트용 클레이를 전송 받습니다.

STEP 2.

이후 필요한 account는
caller(호출 account)와 feePayer(대납 어카운트)를 network에 add 합니다.
예제이기에 caller는 임의로 생성하도록 적용 했습니다.

  // generate keyring instance
const caller = caver.wallet.keyring.generate();
caver.wallet.add(caller);
// write fee payer's private key
const feePayer = caver.wallet.keyring.createFromPrivateKey("0x{private key}");
caver.wallet.add(feePayer);

STEP 3.

이번 예제에서 token을 mint 받는걸 가정하기에
token contract의 instance를 생성합니다.

const techTokenInstance = caver.contract.create(
TECH_TOKEN_ABI, // contract의 ABI
TECH_TOKEN_ADDRESS // contract의 address
);

STEP 4.

생성한 instance를 통해 tx을 send할때 들어가는 필드값에
feeDelegation, feePayer 추가하고 Tx를 전송합니다.

const receipt = await techTokenInstance.send(
{
from: caller.address,
gas: "1000000",
feeDelegation: true, // requirement
feePayer: feePayer.address,// requirement
value: 0,
},
"mint", // token contract의 실행할 함수명
to, // 함수실행시 들어가야하는 input params
amount // 함수실행시 들어가야하는 input params
);

console.log(receipt);

이후 receipt에서 tx에 대한 정보들을 scope에서 확인이 가능합니다.

예제 깃헙 링크

--

--