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

# Hardhat으로 스마트 컨트랙트 상호작용

## 사전 요구 사항

Hardhat 프로젝트가 이미 설정되어 있고 스마트 컨트랙트가 성공적으로 배포되어 있어야 합니다.
방법은 [Hardhat으로 스마트 컨트랙트 배포](./deploy-hardhat/) 튜토리얼을 참조하세요.

선택 사항이지만 강력히 권장: 스마트 컨트랙트를 성공적으로 검증했어야 합니다.
방법은 [Hardhat으로 스마트 컨트랙트 검증](./verify-hardhat/) 튜토리얼을 참조하세요.

## Hardhat 콘솔 시작

다음 명령을 사용하여 대화형 Javascript REPL을 시작합니다.

```shell theme={null}
npx hardhat console --network inj_testnet
```

이제 셸은 일반 셸(bash, zsh 등) 대신 NodeJs REPL이 됩니다.
이 REPL에서 `Counter` 스마트 컨트랙트의 인스턴스를 생성합니다.
이를 위해 `ethers.getContractFactory(...)`와 `contract.attach('0x...');`를 사용합니다.
예를 들어 스마트 컨트랙트가 `0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b`에 배포된 경우 명령은 다음과 같습니다:

```js theme={null}
const Counter = await ethers.getContractFactory('Counter');
const counter = await Counter.attach('0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b');
```

이 REPL에서는 `> `가 셸 프롬프트로 표시됩니다.
각 프롬프트의 결과는 이 접두사 없이 출력됩니다.
따라서 터미널의 내용은 다음과 유사하게 보일 것입니다:

```js theme={null}
> const Counter = await ethers.getContractFactory('Counter');
undefined
> const counter = await Counter.attach('0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b');
undefined
```

이제 `counter`를 사용하여 스마트 컨트랙트와 상호 작용할 수 있습니다.

## 함수 호출 - 쿼리

쿼리는 읽기 전용 작업입니다.
따라서 스마트 컨트랙트 상태는 **업데이트되지 않습니다**.
*상태 변경*이 필요하지 않으므로 지갑, 서명 또는 트랜잭션 수수료(가스)가 필요하지 않습니다.

다음 명령을 사용하여 `value()` 함수를 쿼리합니다.

```js theme={null}
await counter.value();
```

다음이 출력됩니다.

```js theme={null}
0n
```

<Callout icon="info" color="#07C1FF" iconType="regular">
  `0n`은 `0`을 의미하며 `n` 접미사는
  [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)가 아닌
  [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)임을 나타냅니다.

  Solidity의 `uint256`(스마트 컨트랙트의 `value()` 함수의 반환 유형)은
  `Number`로 표현할 수 없기 때문입니다.
  가장 큰 정수 값이 `2^53 - 1`이기 때문입니다.
  따라서 `BigInt`를 대신 사용해야 합니다.
</Callout>

## 함수 호출 - 트랜잭션

트랜잭션은 쓰기 작업입니다.
따라서 스마트 컨트랙트 **상태가 업데이트됩니다**.
*상태 변경*이 발생할 수 있으므로 트랜잭션은 지갑으로 서명해야 하며 트랜잭션 수수료(가스)를 지불해야 합니다.

다음 명령을 사용하여 `increment(num)` 함수를 트랜잭션합니다.

```js theme={null}
await counter.increment(1, { gasPrice: 160e6, gasLimit: 2e6 });
```

<Callout icon="info" color="#07C1FF" iconType="regular">
  가스 가격은 *wei*로 표시됩니다.
  1 wei = 10^-18 INJ.
</Callout>

성공하면 다음과 유사한 결과가 생성됩니다:

```js theme={null}
ContractTransactionResponse { ...
```

상태를 업데이트한 후 새 상태를 쿼리할 수 있습니다.
결과는 상태 변경을 반영합니다.

```js theme={null}
await counter.value();
```

이번에는 `0 + 1 = 1`이므로 결과가 `1n`이어야 합니다.

```js theme={null}
1n
```

## Hardhat 콘솔 중지

`Ctrl+C`를 연속으로 두 번 누르거나 `.exit` 명령을 입력합니다.

## 다음 단계

축하합니다. Hardhat을 사용하여 Injective에서 EVM 스마트 컨트랙트를 개발하는 전체 가이드를 완료했습니다!

스마트 컨트랙트는 비기술 사용자에게 사용자 경험을 제공하지 않습니다.
이들을 위해 탈중앙화 애플리케이션을 구축해야 합니다.
이를 위해 [첫 번째 dApp](../dapps/) 가이드를 확인하세요!
