Skip to main content

Documentation Index

Fetch the complete documentation index at: https://daehan-base.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

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

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

먼저 페이마스터 서비스 제공업체에서 페이마스터 서비스 URL을 획득해야 합니다. ERC20 페이마스터에는 아래에 설명된 추가 요구사항이 있습니다. Coinbase Developer Platform 페이마스터를 권장합니다. Base Account ERC20 토큰 가스 결제와 즉시 호환되도록 완전히 설정되어 있습니다. CDP는 또한 Base 가스리스 캠페인의 일환으로 최대 $15,000의 가스 크레딧을 제공합니다. 다른 페이마스터 제공업체를 사용하는 경우 Base Account와 올바르게 작동하려면 ERC20 호환 페이마스터에 설명된 사양을 준수해야 합니다.

커스텀 토큰을 위한 앱 설정

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

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_getPaymasterStubDatapm_getPaymasterData JSON-RPC 요청과 pm_getAcceptedPaymentTokens를 처리해야 합니다. 각 요청과 응답을 단계별로 살펴보겠습니다.

pm_getPaymasterStubData 및 pm_getPaymasterData

  1. 페이마스터는 7677 컨텍스트 필드의 erc20 아래에 지정된 경우 결제에 지정된 ERC20을 사용해야 합니다.
  2. 거부/실패 시 페이마스터는 JSONRPC 응답의 data 필드를 반환해야 합니다. 이 필드는 페이마스터를 승인하는 데 사용될 수 있으며 다음을 포함합니다:
  • 토큰 주소를 포함한 구조체인 acceptedTokens 배열
  • 토큰 전송을 수행할 페이마스터 주소인 paymasterAddress 필드
  1. 성공 시 페이마스터는 결과에 tokenPayment 필드를 반환해야 합니다. 다음을 포함합니다:
  • tokenAddress: 결제에 사용된 토큰의 주소
  • maxFee: UI에 표시할 최대 수수료
  • decimals: UI에서 사용할 소수점 자리
  • name: 토큰 이름
Base Account는 성공과 정확한 정보를 확인하기 위해 트랜잭션을 시뮬레이션합니다.
요청
이것은 지정된 토큰 사용을 위한 추가 컨텍스트가 있는 표준 V0.6 Entrypoint 요청 예제입니다.
{
  "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"
    }
  ]
}
응답
성공 응답:
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "paymasterAndData": "0x2faeb0760d4230ef2ac21496bb4f0b47d634fd4c0000670fdc98000000000000494b3b6e1d074fbca920212019837860000100833589fcd6edb6e08f4c7c32d4f71b54bda029137746371e8df1d7099a84c20ed72e3335fb016b23000000000000000000000000000000000000000000000000000000009b75458400000000697841102cd520d4e0171a58dadc3e6086111a49a90826cb0ad25579f25f1652081f68c17d8652387a33bf8880dc44ecf95be4213e786566d755baa6299f477b0bb21c",
    "tokenPayment": {
      "name": "USDC",
      "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "maxFee": "0xa7c8",
      "decimals": 6
    }
  }
}
거부 응답:
{
  "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가 포함되며 선택적 컨텍스트가 있습니다.
요청
{
  "jsonrpc": "2.0", "id": 1,
  "method": "pm_getAcceptedPaymentTokens",
  "params": [ "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "0x2105", {}]
}
응답
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "acceptedTokens": [
      {
        "name": "USDC",
        "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
      }
    ]
  }
}