# EVM에 자금 입금 및 인출하기

### 시작하기 전에

시작하기 전에 다음을 확인하세요:

* [**인프라EVM**](https://docs.infrablockchain.net/infrablockchain-docs/ko/infrablockchain/service-chains/infra-evm-parachain)

### 주소 변환하기

인프라EVM 파라체인은 두 가지의 주소 체계를 사용하고 있습니다.

* SS58 address
* H160 address

SS58 address는 Substrate 레이어에서 사용하고 있으며, H160 address는 EVM 레이어에서 사용하고 있습니다.

#### SS58 Address → H160 Address

![ss58-to-h160](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-1fea4d66114064ad7173ee946668d1951aa83b81%2Fss58-to-h160.png?alt=media)

SS58 address에서 H160 address로의 주소 변환은 위 이미지와 같이 이루어집니다.

SS58 address를 디코딩하여 획득한 32바이트의 버퍼 중, 앞의 20바이트만 H160 address로 사용합니다.

이를 구현해 놓은 자바스크립트 파일이 [레포지토리](https://github.com/InfraBlockchain/infra-evm-parachain)에 포함되어 있습니다.

SS58 address를 H160 address로 변환하는 방법은 아래와 같습니다.

1. 컴퓨터의 터미널 셸을 엽니다.
2. 다음 명령을 실행하여 인프라EVM 파라체인 저장소를 복제합니다:

   ```bash
   git clone https://github.com/InfraBlockchain/infra-evm-parachain
   ```

   이 명령은 `master` 브랜치를 복제합니다.
3. 다음 명령을 실행하여 노드 템플릿 디렉토리의 루트로 이동합니다:

   ```bash
   cd infra-evm-substrate
   ```

   작업을 포함할 새 브랜치를 만듭니다:

   ```bash
   git switch -c my-learning-branch-yyyy-mm-dd
   ```

   `yyyy-mm-dd`를 원하는 식별 정보로 바꾸세요. 숫자로 된 연도-월-일 형식을 권장합니다. 예를 들어:

   ```bash
   git switch -c my-learning-branch-2023-03-01
   ```
4. 다음 명령을 실행하여 주소 변환을 수행합니다:

   ```bash
   node ./utils --evm-address {ss58-address}
   ```

#### H160 Address → SS58 Address

![h160-to-ss58](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-dbcde159f5dcc642d6a19d307a8071dbca3d5506%2Fh160-to-ss58.png?alt=media)

H160 address에서 SS58 address로의 주소 변환은 위 사진과 같이 이루어 집니다.

`"evm:"` 문자열로 구성된 버퍼와 H160 address로 구성된 버퍼를 합쳐 이를 `blake2` 해시함수로 해시값을 획득한 뒤 획득한 해시값을 SS58 형식으로 인코딩하여 SS58 address를 획득할 수 있습니다.

이를 구현해 놓은 자바스크립트 파일이 [레포지토리](https://github.com/InfraBlockchain/infra-evm-parachain)에 포함되어 있습니다.

H160 address를 SS58 address로 변환하는 방법은 아래와 같습니다.

1. 컴퓨터의 터미널 셸을 엽니다.
2. 다음 명령을 실행하여 인프라EVM 파라체인 저장소를 복제합니다:

   ```bash
   git clone https://github.com/InfraBlockchain/infra-evm-parachain
   ```

   이 명령은 `master` 브랜치를 클론합니다.
3. 다음 명령을 실행하여 노드 템플릿 디렉토리의 루트로 이동합니다:

   ```bash
   cd infra-evm-substrate
   ```

   작업을 포함할 새 브랜치를 만듭니다:

   ```bash
   git switch -c my-learning-branch-yyyy-mm-dd
   ```

   `yyyy-mm-dd`를 원하는 식별 정보로 바꾸세요. 숫자로 된 연도-월-일 형식을 권장합니다. 예를 들어:

   ```bash
   git switch -c my-learning-branch-2023-03-01
   ```
4. 다음 명령을 실행하여 주소 변환을 수행합니다:

   ```bash
   node ./utils --ss58-address {evm-address}
   ```

### Substrate에서 EVM으로 자산 이동하기

1. 위에서 설명한 방법을 사용하여 EVM에서 사용할 H160 address에 매핑된 SS58 address를 획득합니다.

   ```bash
   node ./utils --ss58-address {evm-address}
   ```
2. 획득한 SS58 address로 자산을 이동시킵니다.

   ![transfer-asset](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-8b4c157a26efba5d2333f0308877229b9ea1c55e%2Ftransfer-asset.png?alt=media)

   기본적으로 인프라EVM 파라체인에서는 99번 asset을 EVM의 네이티브 토큰으로 사용하도록 연동되어 있습니다.
3. MetaMask 등의 EVM 월렛에 반영되었음을 확인합니다.

   ![metamask-balance](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-83ceba86e0c9eb8727daed6ed9a5bc3370d4d417%2Fmetamask-balance.png?alt=media)

### EVM에서 Substrate로 자산 이동하기

1. 위에서 설명한 방법을 사용하여 Substrate에서 사용할 SS58 address와 매핑된 EVM address를 획득합니다.

   ```bash
   node ./utils --evm-address {ss58-address}
   ```
2. 획득한 EVM address로 자산을 이동시킵니다.

   ![transfer-asset](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-b9c7fd17876b65111cc3366a48711297650f25a4%2Fmetamask-transfer.png?alt=media)
3. [인프라블록체인 익스플로러](https://portal.infrablockspace.net) 에 접속하여 아래 과정을 따릅니다.

* `개발자` - `익스트린식` - `evm` 팔레트의 `withdraw` 익스트린식을 선택합니다.

  아래와 같이 구성하고 익스트린식을 발생시킵니다.

  ![withdraw](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-528f5200bdd303104bd55db59540412950b56f04%2Fwithdraw.png?alt=media)

  1번 과정에서 주소를 변환할 때 사용하였던 SS58 계정이 익스트린식을 실행시켜야 합니다.

4. 이벤트를 확인하여 정상적으로 자산이 입금되었는지 확인합니다.

   ![withdraw-success](https://2690783012-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSAjPxw4oPZa4ydYufEQe%2Fuploads%2Fgit-blob-4235a2c3b055ed410aaf08c2d7cbb76375e4d5bb%2Fwithdraw-success.png?alt=media)

### 다음 단계로 넘어가기

* [ERC20 토큰 컨트랙트 배포하기](https://docs.infrablockchain.net/infrablockchain-docs/ko/infrablockchain/tutorials/service-chains/infra-evm-parachain/deploy-erc20-contract)
