# 스마트 컨트랙트 실행

## 튜토리얼에 앞서

* API 호출에 사용되는 `x-chain-id` 값은 8217(Cypress) 또는 1001(Baobab)입니다.
* API 호출에 필요한 필수 파라미터는 각 예시에 설명됩니다.

API 호출 시 사용자가 입력해야 하는 값은 중괄호 1개(`{}`)로 표시합니다. 사용자가 입력해야 하는 값은 아래 테이블과 같습니다.

| 항목                | 값                     | 비고                                                      |
| ----------------- | --------------------- | ------------------------------------------------------- |
| chain-id          | 8217 또는 1001          | Cypress(Klaytn 메인넷) 또는 Baobab(Klaytn 테스트넷)              |
| access-key-id     | 인증 아이디                | KAS 콘솔 - Security - Credential에서 발급받은 `accessKeyId`     |
| secret-access-key | 인증 비밀번호               | KAS 콘솔 - Security - Credential에서 발급받은 `secretAccessKey` |
| krn               | (optional) 계정 저장소의 ID | 기본 계정 저장소 사용 시 불필요                                      |

API 인증 키가 있으면 모든 KAS 서비스를 사용할 수 있으며 Wallet API를 호출해 만든 Klaytn 계정에 대한 모든 권한을 소유합니다. 모든 권한에는 Klaytn 계정의 자산(KLAY 등) 이동이나 [트랜잭션](https://ground-x.gitbook.io/kas-docs/tutorial/wallet-api/wallet-transaction-api) 전송 및 실행 권한이 포함됩니다. 만약 API 인증 키에 타인이 접근한다면 Klaytn 계정 권한을 탈취당해 원치 않는 트랜잭션이 발생할 수 있습니다.

{% hint style="danger" %}
KAS/Klaytn 계정 보안을 위해 KAS API 인증 키(Secret Access Key)를 타인과 함부로 공유하지 말고 주의해 관리하십시오.
{% endhint %}

## 실행 계정이 트랜잭션 전송 수수료 지불

여러분은 KAS로 스마트 컨트랙트 함수를 실행(Execute)하거나 호출(Call)할 수 있습니다. 스마트 컨트랙트 함수 **실행**은 스마트 컨트랙트에 데이터를 기록하거나 스마트 컨트랙트에 저장된 데이터를 변경합니다. 스마트 컨트랙트 함수 **호출**은 스마트 컨트랙트에 저장된 데이터를 읽어오기만 합니다. 스마트 컨트랙트 함수 실행과 호출에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/klaytn/design/computation/execution-model#executing-smart-contracts)을 확인하십시오. 스마트 컨트랙트 함수를 실행하려면 Klaytn Node에 스마트 컨트랙트가 배포되어 있어야 합니다. 스마트 컨트랙트 배포에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/getting-started/quick-start/deploy-a-smart-contract)을 확인하십시오.

스마트 컨트랙트 함수를 실행하려면 실행하려는 함수의 바이트코드가 필요합니다. 함수의 바이트코드는 스마트 컨트랙트를 배포할 때 [Solidity 컴파일러](https://solidity-kr.readthedocs.io/ko/latest/installing-solidity.html)로 컨트랙트 코드를 컴파일하여 얻을 수 있습니다. Solidity로 스마트 컨트랙트 작성, 컴파일, 바이트코드를 얻는 방법에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/smart-contract/solidity-smart-contract-language)을 확인하십시오.

KAS로 스마트 컨트랙트를 실행하려면 Klaytn Node에 트랜잭션을 보내야 하며, 트랜잭션을 보내려면 트랜잭션 수수료를 지불해야 합니다. API를 호출하려면 계정 저장소와 계정을 생성하고 사용할 계정을 선택해야 합니다. 이 예시를 따라 스마트 컨트랙트를 실행하면, 실행하는 계정(Account)이 트랜잭션 수수료를 직접 부담합니다.

{% hint style="info" %}
KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 [KAS SDK](https://ground-x.gitbook.io/kas-docs/guide/sdk/kas-sdk#kas-sdk)를 확인하십시오.\
계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 [Getting Started](https://ground-x.gitbook.io/kas-docs/getting-started/get-ready)를 확인하십시오.
{% endhint %}

### API 호출

스마트 컨트랙트 실행 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

{% tabs %}
{% tab title="curl" %}

```json
curl --location --request POST "https://wallet-api.klaytnapi.com/v2/tx/contract/execute" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \
--header "Content-Type: application/json" \
--data-raw "{
  "from": "0x5bb85d4032354E88020595AFAFC081C24098202e",
  "value": "0x0",
  "to": "0x71ca8095264fdf58f1a2007e0f91140d67292736",
  "input": "0xd14e62b80000000000000000000000000000000000000000000000000000000000000005",
  "nonce": 0,
  "gasLimit": 1000000,
  "submit": true
}"
```

{% endtab %}

{% tab title="javascript" %}

```javascript
const tx = {
  from: "0x48c08e034c4c9779800713A9ad5BA768dA196288",
  to: "0x9c44fdb25e96d49731336b0346f09eea501ee895",
  value: 0,
  input:
    "0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000",
  gas: 500000,
  submit: true,
};
const result = await caver.kas.wallet.requestSmartContractExecution(tx);
```

{% endtab %}

{% tab title="java" %}

```java
ContractExecutionTransactionRequest request = new ContractExecutionTransactionRequest();
String input = "0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000";

request.setFrom("0x81bA6c299350719B18dFAEC38ba566fBd5Cd7202");
request.setTo("0x9c44fdb25e96d49731336b0346f09eea501ee895");
request.setInput(input);
request.setSubmit(true);

TransactionResult result = caver.kas.wallet.requestSmartContractExecution(request);
System.out.println(result);
```

{% endtab %}
{% endtabs %}

* `input`: 실행할 스마트 컨트랙트 함수의 바이트코드입니다. Solidity로 작성한 스마트 컨트랙트를 솔리디티 컴파일러로 컴파일하면 얻습니다.
* `submit`: false이면 트랜잭션이 전송되지 않고, 서명된 트랜잭션 RLP와 트랜잭션 정보를 반환합니다.

### API 응답

스마트 컨트랙트 실행 API의 응답은 아래와 같습니다.

{% tabs %}
{% tab title="curl" %}

```json
{
  "from": "0xa4068f0d4e4ffad5945824cddd748ba2dc450330",
  "gasLimit": 1000000,
  "gasPrice": "0x5d21dba00",
  "input": "0xd14e62b80000000000000000000000000000000000000000000000000000000000000005",
  "nonce": 3,
  "rlp": "0x30f8a4038505d21dba00830f4240940a0ca70bd0074160874dc9337ca7ff8049b2e63e8094a4068f0d4e4ffad5945824cddd748ba2dc450330a4d14e62b80000000000000000000000000000000000000000000000000000000000000005f847f8458207f5a002b41abdf77b3d943c3c9000be45144ccc8cd25a75e523705aca3621ffdd4dd8a01bbf357d02e5f4bbc015cf35107e150d50094ffcb8fccbb7db981c739149eadb",
  "signatures": [
    {
      "R": "0x2b41abdf77b3d943c3c9000be45144ccc8cd25a75e523705aca3621ffdd4dd8",
      "S": "0x1bbf357d02e5f4bbc015cf35107e150d50094ffcb8fccbb7db981c739149eadb",
      "V": "0x7f5"
    }
  ],
  "status": "Submitted",
  "to": "0x0a0ca70bd0074160874dc9337ca7ff8049b2e63e",
  "transactionHash": "0x039e174f22e402caae753396d58e68e47062d8d32be1ae988bb1ddea7134afc0",
  "typeInt": 48,
  "value": "0x0"
}
```

{% endtab %}

{% tab title="javascript" %}

```javascript
TransactionResult {
  from: '0x48c08e034c4c9779800713a9ad5ba768da196288',
  gas: 500000,
  gasPrice: '0x5d21dba00',
  nonce: 1,
  rlp: '0x30f90145018505d21dba008307a120949c44fdb25e96d49731336b0346f09eea501ee895809448c08e034c4c9779800713a9ad5ba768da196288b8c4e942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000f847f8458207f5a0211b3d5c28310ca7ab572aab8993ddcce7046232a9c2242402fd7977246d16bea0217d8a7edf9189584e70b1c9e54e4e94044a0c75c96ab0a4cc22403762377fae',
  typeInt: 48,
  input: '0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000',
  signatures: [
    Signature {
      R: '0x211b3d5c28310ca7ab572aab8993ddcce7046232a9c2242402fd7977246d16be',
      S: '0x217d8a7edf9189584e70b1c9e54e4e94044a0c75c96ab0a4cc22403762377fae',
      V: '0x7f5'
    }
  ],
  status: 'Submitted',
  to: '0x9c44fdb25e96d49731336b0346f09eea501ee895',
  transactionHash: '0x52018b7031469ce927b620a0f089ebea6e87b9af938dec2846116547d03db52b',
  value: '0x0'
}
```

{% endtab %}

{% tab title="java" %}

```java
class TransactionResult {
    from: 0x81ba6c299350719b18dfaec38ba566fbd5cd7202
    gas: 100000
    gasPrice: 0x5d21dba00
    input: 0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000
    nonce: 945
    rlp: 0x30f901478203b18505d21dba00830186a0949c44fdb25e96d49731336b0346f09eea501ee895809481ba6c299350719b18dfaec38ba566fbd5cd7202b8c4e942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000f847f8458207f5a086ea20f9cf6eab93045e1ed6c2d851c8c2498566c0a8a22d9d0d9f2af1d0527ea02fe23176eaac90e350d062af5fd8dcf85cbc73bbcb40ed7164e35583808688f8
    signatures: [class Signature {
        R: 0x86ea20f9cf6eab93045e1ed6c2d851c8c2498566c0a8a22d9d0d9f2af1d0527e
        S: 0x2fe23176eaac90e350d062af5fd8dcf85cbc73bbcb40ed7164e35583808688f8
        V: 0x7f5
    }]
    status: Submitted
    to: 0x9c44fdb25e96d49731336b0346f09eea501ee895
    transactionHash: 0x6f41e729d1be031fee875a1ff9e95f60e3db214351911399855130113831f17c
    typeInt: 48
    value: 0x0
    code: null
    message: null
    transactionId: null
    accountKey: null
}
```

{% endtab %}
{% endtabs %}

이 API에 관한 자세한 내용은 [다음](https://refs.klaytnapi.com/ko/wallet/latest#operation/ContractExecutionTransaction)을 확인하십시오.\
이 문서 혹은 KAS에 관한 문의는 [개발자 포럼](https://support.klaytnapi.com/hc/ko/community/topics)을 방문해 도움 받으십시오.

## 대납 계정이 트랜잭션 전송 수수료 지불 <a href="#tutorial-wallet-transaction-contract-execute-fd" id="tutorial-wallet-transaction-contract-execute-fd"></a>

여러분은 스마트 컨트랙트 함수를 실행(Execute)하거나 호출(Call)할 수 있습니다. 스마트 컨트랙트 함수 **실행**은 스마트 컨트랙트에 데이터를 기록하거나 스마트 컨트랙트에 저장된 데이터를 변경합니다. 스마트 컨트랙트 함수 **호출**은 스마트 컨트랙트에 저장된 데이터를 읽어오기만 합니다. 스마트 컨트랙트 함수 실행과 호출에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/klaytn/design/computation/execution-model#executing-smart-contracts)을 확인하십시오. 스마트 컨트랙트 함수를 실행하려면 Klaytn Node에 스마트 컨트랙트가 배포되어 있어야 합니다. 스마트 컨트랙트 배포에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/getting-started/quick-start/deploy-a-smart-contract)을 확인하십시오.

스마트 컨트랙트 함수를 실행하려면 실행하려는 함수의 바이트코드가 필요합니다. 함수의 바이트코드는 스마트 컨트랙트를 배포할 때 [Solidity 컴파일러](https://solidity-kr.readthedocs.io/ko/latest/installing-solidity.html)로 컨트랙트 코드를 컴파일하여 얻을 수 있습니다. Solidity로 스마트 컨트랙트 작성, 컴파일, 바이트코드를 얻는 방법에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/smart-contract/solidity-smart-contract-language)을 확인하십시오.

KAS로 스마트 컨트랙트를 실행하려면 Klaytn Node에 트랜잭션을 보내야 하며, 트랜잭션을 보내려면 트랜잭션 수수료를 지불해야 합니다. API를 호출하려면 계정 저장소, 수수료 대납 계정 저장소에 각각 계정, 수수료 대납 계정을 생성하고 사용할 계정, 수수료 대납 계정을 선택해야 합니다. 이 예시를 따라 스마트 컨트랙트를 실행하면, 실행하는 계정(Account)이 아니라 다른 계정(여러분의 수수료 대납 계정)이 이 트랜잭션 수수료를 대신 부담합니다. KAS에서 제공하는 수수료 대납 방식에 관한 자세한 내용은 [다음](https://ground-x.gitbook.io/kas-docs/references/api#basics-api-fd)을 확인하십시오.

{% hint style="info" %}
KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 [KAS SDK](https://ground-x.gitbook.io/kas-docs/guide/sdk/kas-sdk#kas-sdk)를 확인하십시오.\
계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 [Getting Started](https://ground-x.gitbook.io/kas-docs/getting-started/get-ready)를 확인하십시오.\
수수료 대납 계정 저장소 생성, FeePayerAccount 생성, FeePayerAccount 선택에 관한 자세한 내용은 [Getting Started](https://ground-x.gitbook.io/kas-docs/getting-started/get-ready#getting-started-account-createfp)를 확인하십시오.
{% endhint %}

### API 호출

수수료 대납 스마트 컨트랙트 실행 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

{% tabs %}
{% tab title="curl" %}

```json
curl --location --request POST "https://wallet-api.klaytnapi.com/v2/tx/fd-user/contract/execute" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \
--header "Content-Type: application/json" \
--data-raw "{
  "from": "0x5bb85d4032354E88020595AFAFC081C24098202e",
  "value": "0x0",
  "to": "0x71ca8095264fdf58f1a2007e0f91140d67292736",
  "input": "0xd14e62b80000000000000000000000000000000000000000000000000000000000000005",
  "nonce": 0,
  "gasLimit": 1000000,
  "submit": true,
  "feePayer": "0x85B98485444c89880cD9C48807CEF727C296F2da",
  "feeRatio": 10
}"
```

{% endtab %}

{% tab title="javascript" %}

```javascript
const tx = {
  from: "0x48c08e034c4c9779800713A9ad5BA768dA196288",
  to: "0x9c44fdb25e96d49731336b0346f09eea501ee895",
  value: 0,
  input:
    "0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000",
  gas: 500000,
  feePayer: "0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8",
  submit: true,
};
const result = await caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(
  tx
);
```

{% endtab %}

{% tab title="java" %}

```java
String input = "0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000";

FDUserContractExecutionTransactionRequest request = new FDUserContractExecutionTransactionRequest();
request.setFrom("0x81bA6c299350719B18dFAEC38ba566fBd5Cd7202");
request.setTo("0x9c44fdb25e96d49731336b0346f09eea501ee895");
request.setFeePayer("0x31d845Ac80A0B2a38f6267CabcF34F8fA9DcD2B7");
request.setInput(input);
request.setSubmit(true);

FDTransactionResult result = caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(request);
System.out.println(result);
```

{% endtab %}
{% endtabs %}

* `input`: 실행할 스마트 컨트랙트 함수의 바이트코드입니다. Solidity로 작성한 스마트 컨트랙트를 솔리디티 컴파일러로 컴파일하면 얻습니다.
* `submit`: false이면 트랜잭션이 전송되지 않고, 서명된 트랜잭션 RLP와 트랜잭션 정보를 반환합니다.
* `feePayer`: 사용자가 트랜잭션 수수료를 대납하는 계정을 별도로 사용할 때, 이 계정 주소를 여기에 입력합니다. KAS에서 먼저 수수료를 대납해주는 방식을 사용하려면 feePayer 파라미터 자체를 사용하지 않습니다.
* `feeRatio`: 트랜잭션 수수료 전체에서 `feePayer`가 납부할 비율(1%\~99%)입니다. 나머지 비율은 트랜잭션을 Klaytn에 보내는 `from`이 직접 납부합니다.
  * 사용자 대납 계정으로 납부하거나 KAS에서 수수료를 대납하는 2가지 방식 모두, feeRatio를 사용할 수 있습니다.

### API 응답

수수료 대납 스마트 컨트랙트 실행 API의 응답은 아래와 같습니다.

{% tabs %}
{% tab title="curl" %}

```json
{
  "feePayer": "0xe8ab1729ab614551021cf5cc22c0e037f5a82930",
  "from": "0x9c56b45b7443bc73f47234199982481c64807f78",
  "gasLimit": 1000000,
  "gasPrice": "0x5d21dba00",
  "input": "0xd14e62b80000000000000000000000000000000000000000000000000000000000000005",
  "nonce": 2,
  "rlp": "0x31f90102028505d21dba00830f424094182efef646797698059fb0e6cbb4823687d869d880949c56b45b7443bc73f47234199982481c64807f78a4d14e62b80000000000000000000000000000000000000000000000000000000000000005f847f8458207f5a03a5ff2dfb032a774d84af240a2aeacf4ac4bcf428de4f1f5adc6f4c003a96794a053e39aa65cd1006136be9ade19413e5bfd53c5575b40d5f32aa7e19037003df794e8ab1729ab614551021cf5cc22c0e037f5a82930f847f8458207f5a029cb2ac282e5880ef0ed8bf1bfca08f51ae151757ff50cdf08eccb23600c4ee4a048aedf8ef1415a3a7d32358f0d45d7223fd37532eafb8c4937828b2a284b80e3",
  "signatures": [
    {
      "R": "0x3a5ff2dfb032a774d84af240a2aeacf4ac4bcf428de4f1f5adc6f4c003a96794",
      "S": "0x53e39aa65cd1006136be9ade19413e5bfd53c5575b40d5f32aa7e19037003df7",
      "V": "0x7f5"
    }
  ],
  "status": "Submitted",
  "to": "0x182efef646797698059fb0e6cbb4823687d869d8",
  "transactionHash": "0x4fcb4c06f81676d6b811f5b867f3ab5d166014e6c1dd982fec037eafdf89c88e",
  "typeInt": 49,
  "value": "0x0"
}
```

{% endtab %}

{% tab title="javascript" %}

```javascript
FDTransactionResult {
  feePayer: '0x44ee3906a7a2007762e9d706df6e4ef63fa1eda8',
  from: '0x48c08e034c4c9779800713a9ad5ba768da196288',
  gas: 500000,
  gasPrice: '0x5d21dba00',
  nonce: 3,
  rlp: '0x31f901a3038505d21dba008307a120949c44fdb25e96d49731336b0346f09eea501ee895809448c08e034c4c9779800713a9ad5ba768da196288b8c4e942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000f847f8458207f6a0637130c162fea33672be08919712cbe307af92f28cdb2b5f61477be1990191cca05f219bcaf2e03ca31a0dae2de9c677e19ee66b3b0b0d6f87f92635c0915deaea9444ee3906a7a2007762e9d706df6e4ef63fa1eda8f847f8458207f5a007e921390ff9745431384897c7e43d3815724836832c377a2e3010c41fd5231fa0201471047dd115259f632f27659e44dad4b262703cbdd93caa4d9fa83471086b',
  typeInt: 49,
  input: '0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000',
  signatures: [
    Signature {
      R: '0x637130c162fea33672be08919712cbe307af92f28cdb2b5f61477be1990191cc',
      S: '0x5f219bcaf2e03ca31a0dae2de9c677e19ee66b3b0b0d6f87f92635c0915deaea',
      V: '0x7f6'
    }
  ],
  status: 'Submitted',
  to: '0x9c44fdb25e96d49731336b0346f09eea501ee895',
  transactionHash: '0x3a5b3f1159ac4e9e92400e2f5d597ff92055db5db693f41a4283fdf6aac87739',
  value: '0x0'
}
```

{% endtab %}

{% tab title="java" %}

```java
class FDTransactionResult {
    feePayer: 0x31d845ac80a0b2a38f6267cabcf34f8fa9dcd2b7
    from: 0x81ba6c299350719b18dfaec38ba566fbd5cd7202
    gas: 100000
    gasPrice: 0x5d21dba00
    input: 0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000
    nonce: 946
    rlp: 0x31f901a58203b28505d21dba00830186a0949c44fdb25e96d49731336b0346f09eea501ee895809481ba6c299350719b18dfaec38ba566fbd5cd7202b8c4e942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000f847f8458207f6a036ba607abbfef797efd83cb7d63133ff01e93c97eee9af086c987b27b502c7daa026457a867cb4fac2fa4485e3eeff4f29dcdd7bfe6e182b84a0e4d2cb433f41609431d845ac80a0b2a38f6267cabcf34f8fa9dcd2b7f847f8458207f5a05c5e1d83f93ef39aa2b74777a0018ceec2bb77798a5a41a35aef6eecce71f6b6a02b8d86ecb2acccfed67fedcecbd995c12d3035f573abbc7d32309fc9f3687c2e
    signatures: [class Signature {
        R: 0x36ba607abbfef797efd83cb7d63133ff01e93c97eee9af086c987b27b502c7da
        S: 0x26457a867cb4fac2fa4485e3eeff4f29dcdd7bfe6e182b84a0e4d2cb433f4160
        V: 0x7f6
    }]
    status: Submitted
    to: 0x9c44fdb25e96d49731336b0346f09eea501ee895
    transactionHash: 0x44fd5386497434281de8a6267ab403b4b1872d02670ed83bf86ed9b1afacf144
    typeInt: 49
    value: 0x0
    feeRatio: null
    transactionId: null
    accountKey: null
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`typeInt` 변수는 트랜잭션 종류를 구별하는 값입니다. 트랜잭션의 종류에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/klaytn/design/transactions/basic#txtypelegacytransaction)을 확인하십시오.
{% endhint %}

이 API에 관한 자세한 내용은 [다음](https://refs.klaytnapi.com/ko/wallet/latest#operation/UFDContractExecutionTransaction)을 확인하십시오.\
이 문서 혹은 KAS에 관한 문의는 [개발자 포럼](https://support.klaytnapi.com/hc/ko/community/topics)을 방문해 도움 받으십시오.

## KAS에서 트랜잭션 전송 수수료 지불 <a href="#tutorial-wallet-transaction-contract-execute-fd" id="tutorial-wallet-transaction-contract-execute-fd"></a>

여러분은 스마트 컨트랙트 함수를 실행(Execute)하거나 호출(Call)할 수 있습니다. 스마트 컨트랙트 함수 **실행**은 스마트 컨트랙트에 데이터를 기록하거나 스마트 컨트랙트에 저장된 데이터를 변경합니다. 스마트 컨트랙트 함수 **호출**은 스마트 컨트랙트에 저장된 데이터를 읽어오기만 합니다. 스마트 컨트랙트 함수 실행과 호출에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/klaytn/design/computation/execution-model#executing-smart-contracts)을 확인하십시오. 스마트 컨트랙트 함수를 실행하려면 Klaytn Node에 스마트 컨트랙트가 배포되어 있어야 합니다. 스마트 컨트랙트 배포에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/getting-started/quick-start/deploy-a-smart-contract)을 확인하십시오.

스마트 컨트랙트 함수를 실행하려면 실행하려는 함수의 바이트코드가 필요합니다. 함수의 바이트코드는 스마트 컨트랙트를 배포할 때 [Solidity 컴파일러](https://solidity-kr.readthedocs.io/ko/latest/installing-solidity.html)로 컨트랙트 코드를 컴파일하여 얻을 수 있습니다. Solidity로 스마트 컨트랙트 작성, 컴파일, 바이트코드를 얻는 방법에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/smart-contract/solidity-smart-contract-language)을 확인하십시오.

KAS로 스마트 컨트랙트를 실행하려면 Klaytn Node에 트랜잭션을 보내야 하며, 트랜잭션을 보내려면 트랜잭션 수수료를 지불해야 합니다. API를 호출하려면 계정 저장소에 계정을 생성하고 사용할 계정을 선택해야 합니다. 이 예시를 따라 스마트 컨트랙트를 실행하면, 실행하는 계정(Account)이 아니라 다른 계정(KAS의 글로벌 수수료 대납 계정)이 이 트랜잭션 수수료를 대신 부담합니다. KAS 글로벌 수수료 대납 계정(KAS GlobalFeePayer)이 트랜잭션을 전송하는 Klaytn 계정을 대신해 부담한 수수료는 추후 여러분의 KAS 계정에 청구됩니다. KAS에서 제공하는 수수료 대납 방식에 관한 자세한 내용은 [다음](https://ground-x.gitbook.io/kas-docs/references/api#basics-api-fd)을 확인하십시오.

{% hint style="info" %}
KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 [KAS SDK](https://ground-x.gitbook.io/kas-docs/guide/sdk/kas-sdk#kas-sdk)를 확인하십시오.\
계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 [Getting Started](https://ground-x.gitbook.io/kas-docs/getting-started/get-ready)를 확인하십시오.
{% endhint %}

### API 호출

KAS GlobalFeePayer 수수료 대납 스마트 컨트랙트 실행 API를 호출합니다. API 호출 시 REST API를 사용할 수 있습니다.

{% tabs %}
{% tab title="curl" %}

```json
curl --location --request POST "https://wallet-api.klaytnapi.com/v2/tx/fd/contract/execute" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \
--header "Content-Type: application/json" \
--data-raw "{
  "from": "0x5bb85d4032354E88020595AFAFC081C24098202e",
  "value": "0x0",
  "to": "0x71ca8095264fdf58f1a2007e0f91140d67292736",
  "input": "0xd14e62b80000000000000000000000000000000000000000000000000000000000000005",
  "nonce": 0,
  "gasLimit": 1000000,
  "submit": true,
  "feeRatio": 10
}"
```

{% endtab %}

{% tab title="javascript" %}

```javascript
const tx = {
  from: "0xa3E4f619C1D5d737a72f1df74e14a57Fae5f2867",
  to: "0x24553ed65819df0fc78bb5544c84c8bcff35b89e",
  value: 0,
  input:
    "0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000",
  gas: 500000,
  feeRatio: 99,
  submit: true,
};
const result =
  await caver.kas.wallet.requestFDSmartContractExecutionPaidByGlobalFeePayer(
    tx
  );
```

{% endtab %}

{% tab title="java" %}

```java
String input = "0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000";

FDContractExecutionTransactionRequest request = new FDContractExecutionTransactionRequest();
request.setFrom("0x81bA6c299350719B18dFAEC38ba566fBd5Cd7202");
request.setTo("0x24553ed65819df0fc78bb5544c84c8bcff35b89e");
request.setInput(input);
request.setSubmit(true);

FDTransactionResult result = caver.kas.wallet.requestFDSmartContractExecutionPaidByGlobalFeePayer(request);
System.out.println(result);
```

{% endtab %}
{% endtabs %}

* `input`: 실행할 스마트 컨트랙트 함수의 바이트코드입니다. Solidity로 작성한 스마트 컨트랙트를 솔리디티 컴파일러로 컴파일하면 얻습니다.
* `submit`: false이면 트랜잭션이 전송되지 않고, 서명된 트랜잭션 RLP와 트랜잭션 정보를 반환합니다.
* `feeRatio`: 트랜잭션 수수료 전체에서 `feePayer`가 납부할 비율(1%\~99%)입니다. 나머지 비율은 트랜잭션을 Klaytn에 보내는 `from`이 직접 납부합니다.
  * 사용자 대납 계정으로 납부하거나 KAS에서 수수료를 대납하는 2가지 방식 모두, feeRatio를 사용할 수 있습니다.

### API 응답

KAS GlobalFeePayer 수수료 대납 스마트 컨트랙트 실행 API의 응답은 아래와 같습니다.

{% tabs %}
{% tab title="curl" %}

```json
{
  "feePayer": "0x85b98485444c89880cd9c48807cef727c296f2da",
  "feeRatio": 10,
  "from": "0x9c56b45b7443bc73f47234199982481c64807f78",
  "gasLimit": 1000000,
  "gasPrice": "0x5d21dba00",
  "input": "0xd14e62b80000000000000000000000000000000000000000000000000000000000000005",
  "nonce": 2,
  "rlp": "0x31f90102028505d21dba00830f424094182efef646797698059fb0e6cbb4823687d869d880949c56b45b7443bc73f47234199982481c64807f78a4d14e62b80000000000000000000000000000000000000000000000000000000000000005f847f8458207f5a03a5ff2dfb032a774d84af240a2aeacf4ac4bcf428de4f1f5adc6f4c003a96794a053e39aa65cd1006136be9ade19413e5bfd53c5575b40d5f32aa7e19037003df794e8ab1729ab614551021cf5cc22c0e037f5a82930f847f8458207f5a029cb2ac282e5880ef0ed8bf1bfca08f51ae151757ff50cdf08eccb23600c4ee4a048aedf8ef1415a3a7d32358f0d45d7223fd37532eafb8c4937828b2a284b80e3",
  "signatures": [
    {
      "R": "0x3a5ff2dfb032a774d84af240a2aeacf4ac4bcf428de4f1f5adc6f4c003a96794",
      "S": "0x53e39aa65cd1006136be9ade19413e5bfd53c5575b40d5f32aa7e19037003df7",
      "V": "0x7f5"
    }
  ],
  "status": "Submitted",
  "to": "0x182efef646797698059fb0e6cbb4823687d869d8",
  "transactionHash": "0x4fcb4c06f81676d6b811f5b867f3ab5d166014e6c1dd982fec037eafdf89c88e",
  "typeInt": 49,
  "value": "0x0"
}
```

{% endtab %}

{% tab title="javascript" %}

```javascript
FDTransactionResult {
  feePayer: '0x1b71a63903e35371e2fc41c6012effb99b9a2c0f',
  from: '0xa3e4f619c1d5d737a72f1df74e14a57fae5f2867',
  gas: 500000,
  gasPrice: '0x5d21dba00',
  nonce: 1,
  rlp: '0x32f901a4018505d21dba008307a1209424553ed65819df0fc78bb5544c84c8bcff35b89e8094a3e4f619c1d5d737a72f1df74e14a57fae5f2867b8c4e942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c756500000000000000000000000000000000000000000000000000000063f847f8458207f5a054efb6aebcaa643dd7ddbaad25a8e9f4cb2f4a293f4772bdb1ee40d15d436312a02a5d4579df1411e7dd76894b9225e578b90b913062d401e0d8405b4ce57f36df941b71a63903e35371e2fc41c6012effb99b9a2c0ff847f8458207f5a0957bc59cdf4dffa34609f3d24d122aa89137f594eb4ed581988d9e9f92aab583a0402f8280392f8d44ca78daf5687c0798654e5cbd5766b1a280e31bfd879e60a1',
  typeInt: 50,
  input: '0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000',
  signatures: [
    Signature {
      R: '0x54efb6aebcaa643dd7ddbaad25a8e9f4cb2f4a293f4772bdb1ee40d15d436312',
      S: '0x2a5d4579df1411e7dd76894b9225e578b90b913062d401e0d8405b4ce57f36df',
      V: '0x7f5'
    }
  ],
  status: 'Submitted',
  to: '0x24553ed65819df0fc78bb5544c84c8bcff35b89e',
  transactionHash: '0x000a59fd50fee1a22d31cb73715a5222f78fbbdd2b133c6c15e205c6704b7aa7',
  value: '0x0',
  feeRatio: 99
}
```

{% endtab %}

{% tab title="java" %}

```java
class FDTransactionResult {
    feePayer: 0x1b71a63903e35371e2fc41c6012effb99b9a2c0f
    from: 0x81ba6c299350719b18dfaec38ba566fbd5cd7202
    gas: 100000
    gasPrice: 0x5d21dba00
    input: 0xe942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000
    nonce: 947
    rlp: 0x31f901a58203b38505d21dba00830186a09424553ed65819df0fc78bb5544c84c8bcff35b89e809481ba6c299350719b18dfaec38ba566fbd5cd7202b8c4e942b5160000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000036b65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000f847f8458207f5a0f819b77c66829d6b0f8b38992585fe55554c0239570b501893b5e102c1f4535ca027668fbee0f3c1a6d5f9ac609c793e554784ed29c9c77148c89e57c8b05fd2ee941b71a63903e35371e2fc41c6012effb99b9a2c0ff847f8458207f6a0e44a0b4d675784925616730f32b074e9c238a919facfecf1f45af4373761fec8a031735e243b2aa92455f6ac303c6151e8a4782497cfc0dacabd81075d03eabcde
    signatures: [class Signature {
        R: 0xf819b77c66829d6b0f8b38992585fe55554c0239570b501893b5e102c1f4535c
        S: 0x27668fbee0f3c1a6d5f9ac609c793e554784ed29c9c77148c89e57c8b05fd2ee
        V: 0x7f5
    }]
    status: Submitted
    to: 0x24553ed65819df0fc78bb5544c84c8bcff35b89e
    transactionHash: 0x3228d1259dde89bfeae8f33a2ce0e3b1615c413e07345d6679d134792742df2f
    typeInt: 49
    value: 0x0
    feeRatio: null
    transactionId: null
    accountKey: null
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`typeInt` 변수는 트랜잭션 종류를 구별하는 값입니다. 트랜잭션의 종류에 관한 자세한 내용은 [다음](https://ko.docs.klaytn.foundation/klaytn/design/transactions/basic#txtypelegacytransaction)을 확인하십시오.
{% endhint %}

이 API에 관한 자세한 내용은 [다음](https://refs.klaytnapi.com/ko/wallet/latest#operation/UFDContractExecutionTransaction)을 확인하십시오.\
이 문서 혹은 KAS에 관한 문의는 [개발자 포럼](https://support.klaytnapi.com/hc/ko/community/topics)을 방문해 도움 받으십시오.
