> ## Documentation Index
> Fetch the complete documentation index at: https://daehan-base.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC20 토큰으로 가스 결제

> Base Account에서 ERC20 토큰으로 가스를 결제할 수 있습니다

Base Account에서 ERC20 토큰으로 가스를 결제할 수 있습니다!
앱 페이마스터에서 수락하는 토큰과 USDC와 같이 범용적으로 지원되는 토큰 세트(곧 더 많은 토큰이 추가될 예정)에 더하여 결제를 위해 토큰을 수락할 수 있습니다.

이 가이드는 토큰을 결제로 수락하는 자체 앱 페이마스터를 설정하는 방법을 설명합니다.

### 페이마스터 서비스 제공업체 선택

먼저 페이마스터 서비스 제공업체에서 페이마스터 서비스 URL을 획득해야 합니다. ERC20 페이마스터에는 아래에 설명된 추가 요구사항이 있습니다.

[Coinbase Developer Platform](https://www.coinbase.com/developer-platform) 페이마스터를 권장합니다. Base Account ERC20 토큰 가스 결제와 즉시 호환되도록 완전히 설정되어 있습니다. CDP는 또한 [Base 가스리스 캠페인](/base-account/more/base-gasless-campaign)의 일환으로 최대 \$15,000의 가스 크레딧을 제공합니다.

다른 페이마스터 제공업체를 사용하는 경우 Base Account와 올바르게 작동하려면 [ERC20 호환 페이마스터](#erc20-compatible-paymasters)에 설명된 사양을 준수해야 합니다.

### 커스텀 토큰을 위한 앱 설정

Base Account에서 ERC20 가스 결제와 호환되는 페이마스터가 있으면 토큰에 대한 페이마스터 승인을 포함하기만 하면 됩니다. 일정 임계값에 도달하면 정기적으로 한도를 보충하는 것을 권장합니다.

```js theme={null}

const tokenDecimals = 6
const minTokenThreshold = 1 * 10 ** tokenDecimals // $1
const tokenApprovalTopUp = 20 * 10 ** tokenDecimals // $20
const tokenAddress = "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
const nftContractAddress = "0x66519FCAee1Ed65bc9e0aCc25cCD900668D3eD49"
const paymasterAddress = "0x2FAEB0760D4230Ef2aC21496Bb4F0b47D634FD4c"

const mintTo = {
  abi: abi,
  functionName: "mintTo",
  to: nftContractAddress,
  args: [account.address, 1],
};

calls = [mintTo]

// 한도 확인
const allowance = await client.readContract({
  abi: parseAbi(["function allowance(address owner, address spender) returns (uint256)"]),
  address: tokenAddress,
  functionName: "allowance",
  args: [account.address, paymasterAddress],
})

if (allowance < minTokenThreshold) {
   // 페이마스터가 결제를 수락하기 위해 토큰을 이동할 수 있도록 콜에 $20 승인 포함
   calls.push({
        abi: ["function approve(address,uint)"],
        functionName: "approve",
        to: nftContractAddress,
        args: [paymasterAddress, tokenApprovalTopUp],
    })
}
```

이것으로 완료됩니다! Base Account가 아래에 설명된 대로 호환되는 경우 나머지를 처리합니다.

### ERC20 호환 페이마스터

Coinbase Developer Platform은 즉시 호환되며 다른 팀들과 협력하여 곧 지원을 추가할 예정입니다!

페이마스터는 ERC-7677에서 지정된 `pm_getPaymasterStubData` 및 `pm_getPaymasterData` JSON-RPC 요청과 `pm_getAcceptedPaymentTokens`를 처리해야 합니다. 각 요청과 응답을 단계별로 살펴보겠습니다.

#### pm\_getPaymasterStubData 및 pm\_getPaymasterData

1. 페이마스터는 7677 컨텍스트 필드의 `erc20` 아래에 지정된 경우 결제에 지정된 ERC20을 사용해야 합니다.
2. 거부/실패 시 페이마스터는 JSONRPC 응답의 `data` 필드를 반환해야 합니다. 이 필드는 페이마스터를 승인하는 데 사용될 수 있으며 다음을 포함합니다:

* 토큰 주소를 포함한 구조체인 `acceptedTokens` 배열
* 토큰 전송을 수행할 페이마스터 주소인 `paymasterAddress` 필드

3. 성공 시 페이마스터는 결과에 `tokenPayment` 필드를 반환해야 합니다. 다음을 포함합니다:

* `tokenAddress`: 결제에 사용된 토큰의 주소
* `maxFee`: UI에 표시할 최대 수수료
* `decimals`: UI에서 사용할 소수점 자리
* `name`: 토큰 이름

Base Account는 성공과 정확한 정보를 확인하기 위해 트랜잭션을 시뮬레이션합니다.

##### 요청

이것은 지정된 토큰 사용을 위한 추가 컨텍스트가 있는 표준 V0.6 Entrypoint 요청 예제입니다.

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "pm_getPaymasterData",
  "params": [
    {
      "sender": "0xe62B4aD6A7c079F47D77a9b939D5DC67A0dcdC2B",
      "nonce": "0x4e",
      "initCode": "0x",
      "callData": "0xb61d27f60000000000000000000000007746371e8df1d7099a84c20ed72e3335fb016b23000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000",
      "callGasLimit": "0x113e10",
      "verificationGasLimit": "0x113e10",
      "preVerificationGas": "0x113e10",
      "maxFeePerGas": "0x113e10",
      "maxPriorityFeePerGas": "0x113e10",
      "paymasterAndData": "0x",
      "signature": "0x5ee079a5dec73fe39c1ce323955fb1158fc1b9a6b2ddbec104cd5cfec740fa5531584f098b0ca95331b6e316bd76091e3ab75a7bc17c12488664d27caf19197e1c"
    },
    "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
    "0x2105",
    {
      "erc20": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
    }
  ]
}
```

##### 응답

성공 응답:

```json theme={null}
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "paymasterAndData": "0x2faeb0760d4230ef2ac21496bb4f0b47d634fd4c0000670fdc98000000000000494b3b6e1d074fbca920212019837860000100833589fcd6edb6e08f4c7c32d4f71b54bda029137746371e8df1d7099a84c20ed72e3335fb016b23000000000000000000000000000000000000000000000000000000009b75458400000000697841102cd520d4e0171a58dadc3e6086111a49a90826cb0ad25579f25f1652081f68c17d8652387a33bf8880dc44ecf95be4213e786566d755baa6299f477b0bb21c",
    "tokenPayment": {
      "name": "USDC",
      "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "maxFee": "0xa7c8",
      "decimals": 6
    }
  }
}
```

거부 응답:

```json theme={null}
{
  "id": 1,
  "jsonrpc": "2.0",
  "error": {
    "code": -32002,
    "message": "request denied - no sponsorship and address can not pay with accepted token",
    "data": {
      "acceptedTokens": [
        {
          "name": "USDC",
          "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
        }
      ]
    }
  }
}
```

#### pm\_getAcceptedPaymentTokens

`pm_getAcceptedPaymentTokens`는 페이마스터가 결제로 수락할 토큰 배열을 반환합니다.
요청에는 엔트리포인트와 체인 ID가 포함되며 선택적 컨텍스트가 있습니다.

##### 요청

```json theme={null}
{
  "jsonrpc": "2.0", "id": 1,
  "method": "pm_getAcceptedPaymentTokens",
  "params": [ "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "0x2105", {}]
}
```

##### 응답

```json theme={null}
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "acceptedTokens": [
      {
        "name": "USDC",
        "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
      }
    ]
  }
}
```
