Receiving Faucet

What is Faucet?

Faucet이란 직역하면 수도꼭지라는 의미로 블록체인 생태계에서는 트랜잭션을 실행하기 위해 소량의 Native Token을 지원받는 행위를 의미합니다. Aptos에서는 Faucet 한 번에 최대 1 APT를 받을 수 있으며 Devnet의 경우 IP당 하루 100회, Testnet의 경우 IP당 하루 10회로 제한되어 있습니다.

📘

이 튜토리얼을 통해 아래 내용을 배울 수 있습니다!

  • 사용자의 계정에 Faucet을 받을 수 있습니다.
  • 사용자의 계정에 있는 APT coin의 잔고를 확인할 수 있습니다.
  • 전체 튜토리얼 코드는 아래 링크를 통해 확인할 수 있습니다.

Get faucet using SDK

Step 1. 보유한 Account의 address를 이용하여 Faucet을 받고 잔고 확인하기

fundAccount 메서드를 이용하여 Account에 Faucet을 받는 함수를 작성합니다. 만약 Account가 없다면 Nodit에서 제공하는 튜토리얼을 진행해 Account 생성 방법을 배울 수 있습니다.

아래와 같이 작성 후 해당 파일을 실행하여 결과를 확인합니다.

// faucet.ts
import {
  Aptos,
  AptosConfig,
} from "@aptos-labs/ts-sdk";

const config = new AptosConfig({
  fullnode: "your_Nodit_Aptos_testnet_node_endpoint",
  indexer: "your_Nodit_Aptos_indexer_endpoint",
  faucet: "https://faucet.testnet.aptoslabs.com",
});
const aptos = new Aptos(config);
const address = "input_your_account_address";

(async (address : string) => {
  try {
    const getFaucet = await aptos.fundAccount({
      accountAddress: address,
      amount: 100_000_000,
    });
    console.log(getFaucet);
  } catch (error) {
    console.error(error);
  }
})(address);

$ ts-node faucet.ts

정상적으로 실행이 되었다면 아래와 같은 트랜잭션 데이터를 확인할 수 있어야 합니다.

{
  version: '5448867634',
  hash: '0xf65552c190db9e4783a0de0f3e7410992f42dfe65d21973e229912bb662b1080',
  state_change_hash: '0xffc3432d6781ce8d08296563a87a4a52d640270a2372b663da45686c704e3730',
  event_root_hash: '0xafdb74074e9a021dff5e66edc00e608b9d47d55b609dec960234f5575a671dbc',
  state_checkpoint_hash: null,
  gas_used: '13',
  success: true,
  vm_status: 'Executed successfully',
  accumulator_root_hash: '0x28a0d5048cbeccae2c04941a3573bd6b2b226c7eb433e938b7d648694a6c91d3',
  changes: [
    {
      address: '0x1caef4f995a3d7f545d0d246562be15f73b8cace9dca0aea7e610afa947cb3a3',
      state_key_hash: '0xf8a1df6b644e81ee241ed29dbb82b456b897daef76239d37a8390ecf48ae881d',
      data: [Object],
      type: 'write_resource'
    },
...
    {
      state_key_hash: '0x6e4b28d40f98a106a65163530924c0dcb40c1349d3aa915d108b4d6cfc1ddb19',
      handle: '0x1b854694ae746cdbd8d44186ca4929b2b337df21d1c74633be19b2710552fdca',
      key: '0x0619dc29a0aac8fa146714058e8dd6d2d0f3bdf5f6331907bf91f3acd81e6935',
      value: '0x30df2ed89f88a7940100000000000000',
      data: null,
      type: 'write_table_item'
    }
  ],
  sender: '0x1caef4f995a3d7f545d0d246562be15f73b8cace9dca0aea7e610afa947cb3a3',
  sequence_number: '1270787',
  max_gas_amount: '500000',
  gas_unit_price: '100',
  expiration_timestamp_secs: '1721120484',
  payload: {
    code: {
      bytecode: '0xa11ceb0b0500000008010008020804030c150421020523100733500883012006a30114000000010002000301050800030403010002060105010001070002000008000200010403060c050301050001060c01080001030d6170746f735f6163636f756e740a6170746f735f636f696e04636f696e067369676e65720a616464726573735f6f66094170746f73436f696e0762616c616e6365046d696e74087472616e7366657200000000000000000000000000000000000000000000000000000000000000010308a0860100000000000308ffffffffffffffff000001170a0011000c030a03380007010a02170700172304120a000b030a0207001611020b000b010b02110302',
      abi: [Object]
    },
    type_arguments: [],
    arguments: [
      '0x3a8e4a6d4e3d38329012d48f1703b62314070285ee85c06e5a1e29fcce7d8cab',
      '100000000'
    ],
    type: 'script_payload'
  },
  signature: {
    public_key: '0xdcefb58cbf71a655cc7f92f5f0a0d4023d1373f448ea0a69a57e7a303e75df6e',
    signature: '0x90ed08b1621ba2067d8c25c510a241672f34541aca4e9147d26bcf7061aab95239d47b5daba97a3e4292adb5d8be8dced2a8a363445659572c7982b06e02aa0b',
    type: 'ed25519_signature'
  },
  events: [
    {
      guid: [Object],
      sequence_number: '1270787',
      type: '0x1::coin::DepositEvent',
      data: [Object]
    },
...
    {
      guid: [Object],
      sequence_number: '0',
      type: '0x1::transaction_fee::FeeStatement',
      data: [Object]
    }
  ],
  timestamp: '1721120469466436',
  type: 'user_transaction'
}

기존의 코드에 getAccountAPTAmount 메서드를 추가하여 해당 계정의 APT 잔고를 확인할 수 있습니다.

import {
  Aptos,
  AptosConfig,
} from "@aptos-labs/ts-sdk";

const config = new AptosConfig({
  fullnode: "your_Nodit_Aptos_testnet_node_endpoint",
  indexer: "your_Nodit_Aptos_indexer_endpoint",
  faucet: "https://faucet.testnet.aptoslabs.com",
});
const aptos = new Aptos(config);
const address = "input_your_account_address";

(async (address : string) => {
  try {
    const getFaucet = await aptos.fundAccount({
      accountAddress: address,
      amount: 100_000_000,
    });
    console.log(getFaucet);

    const getBalance = await aptos.getAccountAPTAmount({
      accountAddress: address,
    });
    console.log("My APT Balance :", getBalance);
  } catch (error) {
    console.error(error);
  }
})(address);

My APT Balance : 100000000

Get faucet using Aptos faucet client

Step 2. 보유한 Account의 address를 이용하여 Faucet 받기 (aptos-faucet-client)

Aptos에서는 Faucet을 위한 클라이언트를 별도로 제공하고 있습니다. 이를 이용하기 위해 AptosFaucetClient 인스턴스를 생성한 후 fund 메서드를 이용하여 faucet을 요청합니다.

import {
  AptosFaucetClient,
  FundRequest,
  FundResponse,
} from "@aptos-labs/aptos-faucet-client";

const faucetClient = new AptosFaucetClient({
BASE: "https://faucet.testnet.aptoslabs.com",
});
const address = "input_your_account_address";

(async (address : string) => {
  const request: FundRequest = {
    amount : 100_000_000,
    address,
  };
  const getFaucet = await faucetClient.fund.fund({ requestBody: request });
  console.log(getFaucet);
})(address);

해당 코드를 실행하면 txn_hashes 라는 이름의 필드와 트랜잭션 해시를 확인할 수 있습니다.

{
  txn_hashes: [
    '<Your_Transaction_Hash>'
  ],
  ...
}

Step 1에서 작성한 APT 잔고 확인 코드를 이용하여 faucet을 받은 후 잔고를 확인하는 기능을 추가합니다.

import {
  AptosFaucetClient,
  FundRequest,
  FundResponse,
} from "@aptos-labs/aptos-faucet-client";

const faucetClient = new AptosFaucetClient({
BASE: "https://faucet.testnet.aptoslabs.com",
});

const address = "input_your_account_address"

(async (address : string) => {
  const request: FundRequest = {
    amount : 100_000_000,
		address,
  };
  const [getFaucet] = await faucetClient.fund.fund({ requestBody: request }).txn_hashes;
  console.log(getFaucet);
  
  const getBalance = await aptos.getAccountAPTAmount({
  accountAddress: address,
  });
  console.log("My APT Balance :", getBalance);
})(address);

fund 메서드의 응답 반환 시점은 네트워크에서 트랜잭션이 처리된 이후가 아닌 트랜잭션 실행 시점입니다. 그렇기 때문에 위와 같이 작성 후 잔고를 확인할 경우 faucet을 받기 전 계정이 보유한 잔고가 반환될 수 있습니다.


이를 해결하기 위해 네트워크의 트랜잭션이 처리 될 때 까지 대기한 후 응답을 반환하는waitForTransaction 메서드를 추가해야 합니다.

//faucet.ts
import { Aptos, AptosConfig } from "@aptos-labs/ts-sdk";
import {
  AptosFaucetClient,
  FundRequest,
  FundResponse,
} from "@aptos-labs/aptos-faucet-client";

const config = new AptosConfig({
  fullnode: "your_Nodit_Aptos_testnet_node_endpoint",
  indexer: "your_Nodit_Aptos_indexer_endpoint",
});
const aptos = new Aptos(config);
const faucetClient = new AptosFaucetClient({
BASE: "https://faucet.testnet.aptoslabs.com",
});

const address = "your_account_address";

(async (address: string) => {
  try {
    const request: FundRequest = {
      amount: 100_000_000,
      address,
    };
    const [getFaucet] = (await faucetClient.fund.fund({ requestBody: request }))
      .txn_hashes;

    await aptos.waitForTransaction({
      transactionHash: getFaucet,
    });

    const getBalance = await aptos.getAccountAPTAmount({
      accountAddress: address,
    });
    console.log("My APT Balance :", getBalance);
  } catch (error) {
    console.error(error);
  }
})(address);

$ ts-node faucet.ts

faucet.ts 파일을 실행하면 터미널에서 My APT Balance 잔고가 추가되는 것을 확인할 수 있습니다. 이렇게 받은 APT를 이용하여 다른 주소로 APT를 전송하거나 트랜잭션 실행 시 Gas Fee로 이용할 수 있습니다.

My APT Balance : 100000000
  • 확인이 되지 않는다면 위의 코드와 다른 부분이 있는지 확인해 보세요.
  • 위의 코드와 차이가 없는데 되지 않나요? 여기[QnA 링크]를 클릭하여 QnA로 남겨주세요!

📘

Aptos는 매우 빠르게 업데이트 되고 있습니다!

Aptos 재단에서 배포한 SDK 버전에 따라 변경되는 점이 있을 수 있습니다. Nodit은 항상 이를 확인하고 있으나 시점에 따라 코드 변경으로 인한 오류가 발생할 수 있습니다.