안녕하세요 먼저 질문 올려주셔서 감사합니다.
- 현재 caver.klay.contract. caver.klay.kip7, caver.klay.kip17 모두 수수료 대납은 지원되지 않습니다. 따라서 스마트 컨트랙트를 호출할 때에 수수료를 대납하고 싶으신 경우, 별도로 트랜잭션을 생성해서 서명하고 전송해 주셔야 합니다.
아래에 간단한 예시를 작성했습니다.
Prepare for testing 부분은 테스트를 위한 준비 과정이므로, 생략 하셔도 되고 그 이후부터 보시면 됩니다.
간략하게 설명드리면 아래의 플로우로 진행됩니다.
-FEE_DELEGATED_SMART_CONTRACT_EXECUTION 타입의 트랜잭션을 생성
이 때에 data에는 encode된 function call이 들어가야 함. (참고로 올려주신 예제에서 transferFrom을 사용하고 계셔서, KIP7의 transferFrom을 기준으로 작성되었습니다.) encodeFunctionCall을 하는 방법은 https://docs.klaytn.com/bapp/sdk/caver-js/v1.4.1/api-references/caver.klay.abi#encodefunctioncall 이 문서를 참고해 주세요.
-트랜잭션 sender 서명
-트랜잭션 fee payer 서명
-Klaytn network 전송
const sender = caver.klay.accounts.wallet.add('0x{private key}')
const feePayer = caver.klay.accounts.wallet.add('0x{private key}')
const to = caver.klay.accounts.create() // to account
// Prepare for testing
const kip7 = await caver.klay.KIP7.deploy(
{
name: 'Jasmine',
symbol: 'JAS',
decimals: 18,
initialSupply: '1000000000000000000',
},
sender.address
)
const kip7TokenAddress = kip7.options.address
const spender = caver.klay.accounts.wallet.add('0x{private key}')
const vt = {
type: 'VALUE_TRANSFER',
from: sender.address,
to: spender.address,
value: caver.utils.toPeb(10, 'KLAY'),
gas: 30000,
}
const signed = await caver.klay.accounts.signTransaction(vt)
const receipt = await caver.klay.sendSignedTransaction(signed)
console.log(`Token transfer to test receipt ==========> `)
console.log(receipt)
const approved = await kip7.approve(spender.address, 100000, { from: sender.address })
console.log(`\nToken approve to test receipt ==========> `)
console.log(approved)
// Prepare for testing is done
// Create FEE_DELEGATED_SMART_CONTRACT_EXECUTION
const execution = {
type: 'FEE_DELEGATED_SMART_CONTRACT_EXECUTION',
from: spender.address,
to: kip7TokenAddress,
data: caver.klay.abi.encodeFunctionCall(
{
constant: false,
inputs: [{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'value', type: 'uint256' }],
name: 'transferFrom',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
[sender.address, to.address, 10]
),
gas: 100000,
}
const senderSigned = await caver.klay.accounts.signTransaction(execution)
console.log(`\nSender signing result ==========> `)
console.log(senderSigned)
const feePayerSigned = await caver.klay.accounts.feePayerSignTransaction(senderSigned.rawTransaction, feePayer.address)
console.log(`\nFee payer signing result ==========> `)
console.log(feePayerSigned)
// Send signed transaction to the Klaytn network
const receiptForTransferFrom = await caver.klay.sendSignedTransaction(feePayerSigned)
console.log(`\nTransferFrom receipt ==========> `)
console.log(receiptForTransferFrom)
- fee payer 의 nonce 는 따로 트랜잭션에 저장되는 정보가 아니기 때문에 동시에 서로 다른 복수 개의 트랜잭션에 하나의 fee payer 주소로 이용이 가능할 것 같습니다. 혹시 해보시고 문제 생기시면 말씀해 주세요.
감사합니다