메인 콘텐츠로 건너뛰기
@injectivelabs/wallet-strategy의 주요 목적은 개발자에게 Injective에서 다양한 지갑 구현을 사용할 수 있는 방법을 제공하는 것입니다. 이러한 모든 지갑 구현은 동일한 ConcreteStrategy 인터페이스를 노출하므로 사용자는 특정 지갑의 기본 구현을 알 필요 없이 이러한 메서드를 사용할 수 있습니다. 시작하려면 WalletStrategy 클래스의 인스턴스를 만들어야 합니다. 이를 통해 다양한 지갑을 바로 사용할 수 있습니다. walletStrategy 인스턴스에서 setWallet 메서드를 사용하여 현재 사용 중인 지갑을 전환할 수 있습니다(참고: setWallet은 비동기이며 await가 필요합니다). WalletStrategy 전략이 노출하는 메서드와 그 의미를 살펴보겠습니다: Ethereum 및 Cosmos 네이티브 지갑 모두:
  • getAddresses는 연결된 지갑 전략에서 주소를 가져옵니다. 이 메서드는 Ethereum 네이티브 지갑(전략)의 경우 Ethereum 주소를 반환하고 Cosmos 네이티브 지갑(전략)의 경우 Injective 주소를 반환합니다.
  • signTransaction은 해당 지갑 유형 메서드를 사용하여 트랜잭션에 서명합니다(Cosmos 네이티브 지갑의 경우 signCosmosTransaction, Ethereum 네이티브 지갑의 경우 signEip712TypedData)
  • sendTransaction은 해당 지갑 유형 메서드를 사용하여 트랜잭션에 서명합니다(Ethereum 네이티브 지갑에서 사용하려면 옵션에 sentryEndpoint를 전달해야 합니다 - 아래에서 설명)
  • getWalletDeviceType은 지갑 연결 유형(모바일, 브라우저, 하드웨어)을 반환합니다.
Cosmos 네이티브 지갑:
  • signCosmosTransaction은 연결된 지갑 전략을 사용하여 Injective 트랜잭션에 서명합니다.
  • getPublicKey는 Cosmos 네이티브 지갑 전략의 공개키를 가져옵니다.
Ethereum 네이티브 지갑:
  • getEthereumChainId는 Ethereum 네이티브 지갑 전략의 체인 ID를 가져옵니다.
  • signEip712TypedData는 연결된 지갑 전략을 사용하여 EIP712 타입 데이터에 서명합니다.
  • sendEvmTransaction은 연결된 지갑 전략을 사용하여 Ethereum Web3 트랜잭션을 전송합니다.
  • signEvmTransaction은 연결된 지갑 전략을 사용하여 Ethereum Web3 트랜잭션에 서명합니다.
  • getEvmTransactionReceipt는 지갑 전략에 대한 Ethereum 네이티브 트랜잭션의 트랜잭션 영수증을 가져옵니다.

인자

WalletStrategy에 전달되는 인자는 다음 인터페이스를 가집니다:
export interface WalletStrategyEvmOptions {
  rpcUrl: string; // 전략의 Ethereum 네이티브 메서드에만 필요한 rpc url
  evmChainId: EvmChainId; // Wallet Strategies를 사용하여 EIP712 타입 데이터에 서명하는 경우 필요
}

export interface EthereumWalletStrategyArgs {
  chainId: ChainId; // Injective 체인 ID
  evmOptions?: WalletStrategyEvmOptions; // 선택사항, Ethereum 네이티브 지갑을 사용하는 경우에만 필요
  disabledWallets?: Wallet[]; // 선택사항, 일부 지갑의 인스턴스화를 비활성화하려는 경우 필요
  wallet?: Wallet; // 선택사항, 처음 선택된 지갑(`evmOptions`가 전달되면 Metamask가 기본값, 그렇지 않으면 Keplr)
}
참고: Ethereum 네이티브 지갑에서 sendTransaction을 다른 옵션(chainId 및 address)과 함께 사용하려면 트랜잭션을 브로드캐스트하기 위해 sentry에 대한 gRPC 엔드포인트도 전달해야 합니다. Ethereum 네이티브 지갑에서는 Keplr이나 Leap에서처럼 지갑의 추상화를 사용하여 트랜잭션을 브로드캐스트하는 broadcastTx 메서드에 접근할 수 없으므로 클라이언트 측에서 직접 체인에 브로드캐스트해야 하기 때문입니다.

사용 예시

import { TxRaw } from '@injectivelabs/sdk-ts/types'
import { Web3Exception } from '@injectivelabs/exceptions'
import { ChainId, EvmChainId } from '@injectivelabs/ts-types'
import { WalletStrategy } from '@injectivelabs/wallet-strategy'

const chainId = ChainId.Testnet // Injective Testnet 체인 ID
const evmChainId = EvmChainId.TestnetEvm // Injective Evm Testnet 체인 ID

export const evmRpcEndpoint = `https://eth-sepolia.g.alchemy.com/v2/${process.env.APP_EVM_RPC_KEY}`

export const walletStrategy = new WalletStrategy({
  chainId,
  evmOptions: {
    evmChainId,
    rpcUrl: evmRpcEndpoint,
  },
})

// 지갑 주소 가져오기
export const getAddresses = async (): Promise<string[]> => {
  const addresses = await walletStrategy.getAddresses()

  if (addresses.length === 0) {
    throw new Web3Exception(new Error('이 지갑에 연결된 주소가 없습니다.'))
  }

  return addresses
}

// Injective 트랜잭션 서명
export const signTransaction = async (tx: TxRaw): Promise<string[]> => {
  const response = await walletStrategy.signCosmosTransaction(
    /*transaction:*/ { txRaw: tx, accountNumber: /* */, chainId: 'injective-1' },
    /*address: */ 'inj1...',
  )

  return response
}

// Injective 트랜잭션 전송
export const sendTransaction = async (tx: TxRaw): Promise<string[]> => {
  const response = await walletStrategy.sendTransaction(
    tx,
    // Ethereum 지갑을 사용하는 경우 `sentryEndpoint` 필요
    {address: 'inj1...', chainId: 'injective-1', sentryEndpoint: 'https://grpc.injective.network' }
  )

  return response
}