Skip to content

Commit

Permalink
Add Tangle Addresses Page
Browse files Browse the repository at this point in the history
  • Loading branch information
shekohex committed Jan 2, 2024
1 parent 8aa9c78 commit 11b2b0d
Showing 1 changed file with 81 additions and 0 deletions.
81 changes: 81 additions & 0 deletions pages/docs/tangle-network/learn/addresses.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
title: "Tangle Network Addresses"
---

## Overview

Converting between Substrate and EVM addresses can initially be a bit complicated, but once you understand the basic idea behind it, it becomes easy. Let's define the different scenarios we will be using:

1. Alice only has an account on Tangle EVM using the Metamask wallet.
2. Bob has an account on Tangle using the Polkadot.js wallet, and another account on Tangle EVM using the Metamask wallet.
3. Charlie only has an account on Tangle using the Polkadot.js wallet.

Let's assign the following values:

- Alice's account: `0xa5fAA47a324754354CB0A305941C8cCc6b5de296`
- Bob's accounts: `5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty` and `0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990`
- Charlie's account: `5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y`

## Convert Substrate Address to EVM

```tsx
function substrateToEvm(input: string): string {
// Decode the address to the 32 bytes.
const accountId = decodeAddress(input);
// Truncate it and take first 20 bytes
const res = accountId.subarray(0, 20);
// convert these bytes to hex.
const output = u8aToHex(res);
// The result is our EVM address.
return output;
}
```

## Convert EVM Address to Substrate

```tsx
function evmToSubstrate(input: string): string {
// Convert EVM address to bytes
const addr = hexToU8a(input);
// Add a "evm:" prefix
const data = stringToU8a("evm:");
// concat the address and the prefix and hash them together
// using blake2
const res = blake2AsU8a(u8aConcat(data, addr));
// encode the output and using 42 address prefix (substrate default)
const output = encodeAddress(res, 42);
// The result is our Substrate address.
return output;
}
```

### Case 1: Sending from Substrate to EVM

Bob wants to send 100 TNT to Alice, but he does not have the 100 TNT on his EVM account in Metamask. Therefore, he decided to use his Tangle account in the polkadot.js wallet.

1. Alice's address is `0xa5fAA47a324754354CB0A305941C8cCc6b5de296`.
2. Bob converts Alice's address to a substrate address using the `evmToSubstrate` function:

```tsx
evmToSubstrate("0xa5fAA47a324754354CB0A305941C8cCc6b5de296");
// => 5C9ysBsWKpw3D8MFaEauFgdtMPqboS64YNYHyu1rCynLyKMZ
```
3. Bob sends the 100 TNT to `5C9ysBsWKpw3D8MFaEauFgdtMPqboS64YNYHyu1rCynLyKMZ`.
4. Alice receives the 100 TNT in her Metamask wallet.

### Case 2: Sending from EVM to Substrate

Alice wants to send 50 TNT to Charlie. However, Charlie only has a Substrate account that he controls in his Polkadot.js wallet.

1. Charlie's address is `5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y`.
2. Alice converts Charlie's address to an EVM address using the `substrateToEvm` function.
```tsx
substrateToEvm("5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y");
// => 0x90b5ab205c6974c9ea841be688864633dc9ca8a3
```
3. Alice uses her Metamask and sends 50 TNT to `0x90b5ab205c6974c9ea841be688864633dc9ca8a3`.
4. Charlie's balance on Substrate remains the same!
> The main reason here is that Charlie needs to withdraw the balance from his EVM account.
5. Charlie goes to Polkadot.js (maybe we can make it in our dApp?) and calls `evm.withdraw("0x90b5ab205c6974c9ea841be688864633dc9ca8a3", 50 TNT)`.
6. Charlie sees that he has now received 50 TNT in his account.

0 comments on commit 11b2b0d

Please sign in to comment.