Skip to content

Latest commit

 

History

History
173 lines (142 loc) · 5.48 KB

File metadata and controls

173 lines (142 loc) · 5.48 KB

Get Balance

{% hint style="info" %} Node.js와 NPM 설치에 대한 튜토리얼이 필요하다면 상위 탭을 확인해주세요. {% endhint %}

필요한 패키지들을 모두 설치하고 환경 설정을 완료하였으므로 사용자의 Keplr지갑에서 Osmo 잔액을 불러오는 기능을 수행하는 코드를 작성해봅시다. 먼저 src 폴더 아래에 functions라는 폴더를 만들고 그 아래에 getBalance.js 파일을 만든 후 아래와 같은 코드를 작성합니다.

import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate";
import { SigningCosmosClient, GasPrice } from "@cosmjs/stargate";
import ChainInfo from "../data/chainInfo";

let accounts, CosmWasmClient, queryHandler, gasPrice;

const getBalance = async () => {
  if (window["keplr"]) {
    if (window.keplr["experimentalSuggestChain"]) {
      await window.keplr.experimentalSuggestChain(ChainInfo);
      await window.keplr.enable(ChainInfo.chainId);
      const offlineSigner = await window.getOfflineSigner(ChainInfo.chainId);
      CosmWasmClient = await SigningCosmWasmClient.connectWithSigner(
        ChainInfo.rpc,
        offlineSigner
      );

      // This async waits for the user to authorize your dApp
      // it returns their account address only after permissions
      // to read that address are granted
      accounts = await offlineSigner.getAccounts();

      queryHandler = CosmWasmClient.queryClient.wasm.queryContractSmart;
      // Gas price
      gasPrice = GasPrice.fromString("0.002uconst");

      console.log("Wallet connected", {
        offlineSigner: offlineSigner,
        CosmWasmClient: CosmWasmClient,
        accounts: accounts,
        chain: ChainInfo,
        queryHandler: queryHandler,
        gasPrice: gasPrice,
      });

      async function getAddressBalance(address) {
        try {
          let balance = await CosmWasmClient.getBalance(
            address,
            ChainInfo.currencies[0].coinMinimalDenom
          );
          console.log("Account balance", {
            user: address,
            balance: balance,
          });
          console.log(balance.amount);
        } catch (e) {
          console.warn("Error reading account balance", [e, address]);
        }
      }

      getAddressBalance(accounts[0].address);
    } else {
      console.warn(
        "Error accessing experimental features, please update Keplr"
      );
    }
  } else {
    console.warn("Error accessing Keplr, please install Keplr");
  }
};

export default getBalance;

src/functions/getBalance.js

위의 코드에서 osmo 잔액을 불러오기 위해 OSMOSIS chain 정보를 불러오는데 해당 파일은 아래와 같습니다. 파일 위치는 src/data/chainInfo.js입니다.

import { Bech32Address } from "@keplr-wallet/cosmos";

const ChainInfo = {
  rpc: "https://rpc-osmosis.blockapsis.com",
  rest: "https://lcd-osmosis.blockapsis.com",
  chainId: "osmosis-1",
  chainName: "Osmosis",
  stakeCurrency: {
    coinDenom: "OSMO",
    coinMinimalDenom: "uosmo",
    coinDecimals: 6,
    coinGeckoId: "osmosis",
    coinImageUrl: window.location.origin + "/public/assets/tokens/osmosis.svg",
  },
  bip44: {
    coinType: 118,
  },
  bech32Config: Bech32Address.defaultBech32Config("osmo"),
  currencies: [
    {
      coinDenom: "OSMO",
      coinMinimalDenom: "uosmo",
      coinDecimals: 6,
      coinGeckoId: "osmosis",
      coinImageUrl:
        window.location.origin + "/public/assets/tokens/osmosis.svg",
    },
    {
      coinDenom: "ION",
      coinMinimalDenom: "uion",
      coinDecimals: 6,
      coinGeckoId: "ion",
      coinImageUrl: window.location.origin + "/public/assets/tokens/ion.png",
    },
  ],
  feeCurrencies: [
    {
      coinDenom: "OSMO",
      coinMinimalDenom: "uosmo",
      coinDecimals: 6,
      coinGeckoId: "osmosis",
      coinImageUrl:
        window.location.origin + "/public/assets/tokens/osmosis.svg",
    },
  ],
  features: ["stargate", "ibc-transfer", "no-legacy-stdTx", "ibc-go"],
  explorerUrlToTx: "https://www.mintscan.io/osmosis/txs/{txHash}",
};

export default ChainInfo;

src/data/chaininfo.js

그리고 누르면 해당 작업을 수행하는 버튼을 생성해봅시다. src 폴더 아래에 components 폴더를 만들고 그 안에 getBalanceButton.js를 생성한 후 아래와 같은 코드를 작성합니다.

import React from "react";
import getBalance from "../functions/getBalance";

const GetBalanceButton = () => {
  return <button onClick={getBalance}>Get Balance</button>;
};

export default GetBalanceButton;

준비가 다 되었습니다. 이제 프로젝트 생성시 자동으로 만들어졌던 App.js를 조금 수정하여 npm start 명령어 실행시 브라우저에서 해당 버튼이 뜨도록 코드를 작성해봅시다.

import logo from "./logo.svg";
import "./App.css";
import GetBalanceButton from "./components/getBalanceButton";

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <GetBalanceButton />
      </header>
    </div>
  );
}

export default App;

위와 같이 코드를 수정해준 뒤 npm start 명령어를 실행시키면 브라우저에서 다음과 같은 화면이 출력되는 것을 확인할 수 있고 버튼을 눌러 지갑과 네트워크 연결까지 성공적으로 완료하면 개발자 도구 콘솔에 다음과 같이 osmo 잔액 정보가 출력되는 것을 확인할 수 있다.