How to Swap MT to ST

루니버스 메인넷 토큰을 사이드 토큰으로 전환하는 방법을 알려드립니다.

1. Swap 전용 Address 발급

하나의 User Address에 대해 메인넷 토큰을 사이드 토큰으로 변경해주는 Swap 전용 Address를 발급합니다. 발급된 Swap Address에 메인넷 토큰이 전송되면 Swap Address 발급 시 입력한 User Address로 패깅시 설정한 변환 비율을 계산하여 사이드 토큰으로 전송합니다.

curl -X POST 'https://api.luniverse.io/mx/v2.0/swap/<USER_ADDRESS>' \
--header 'Authorization: Bearer <YOUR_API_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
  "mainEnvironmentId": "<YOUR_MAIN_ENVIRONMENT_ID>",
  "sideEnvironmentId": "<YOUR_SIDE_ENVIRONMENT_ID>",
  "mainTokenSymbol": "<YOUR_MAIN_TOKEN_SYMBOL>",
  "sideTokenSymbol": "<YOUR_SIDE_TOKEN_SYMBOL>"
}'

2. 변환할 메인넷 토큰을 Swap 전용 계정 주소(Address)에 전송

Swap 전용 주소에 메인넷 토큰이 전송되면 사이드 토큰으로의 Swap이 일어납니다. Swap 전용 계정에 입금된 메인넷 토큰 수량을 기준으로 MT-ST간 전환 비율에 따라 사이드 체인에서 사용 가능한 토큰 잔고가 생성됩니다.

메인넷 토큰은 아래 두가지 방법으로 전송이 가능합니다.

❗️

메인넷 토큰을 전송하기에 앞서

메인넷 토큰 전송에 필요한 Gas 수수료 지불을 위해, from계정을 LUK 대납 컨트랙트(Delegation Contract)에 먼저 등록해야합니다. 대납 컨트랙트란 무엇이며 어떻게 등록할 수 있는지는 여기의 API 문서를 참고해주세요.


(1) 콘솔을 통한 메인토큰 전송

1. 루니버스 콘솔(console.luniverse.io)에 접속하여 메인넷 토큰 전송 페이지로 이동합니다.

  • 콘솔 화면의 사이드 메뉴에서 Token > Overview 화면으로 이동합니다.

  • 목록에 있는 토큰 중 전송할 토큰을 선택하여 해당 토큰의 상세 화면으로 이동합니다.

  • 상단 Transfer 탭을 눌러 Token Transfer 화면으로 이동합니다.

  • 우측의 [Transfer Token] 버튼을 눌러 Transfer Token 기능 화면으로 이동합니다.

2. 메인넷 토큰 전송 정보를 입력합니다.

  • To Address :토큰을 전송 받을 Swap 전용 주소를 입력합니다.
  • Amount Sent :전송할 메인넷 토큰 수량을 입력합니다. 전송 토큰 수량은 하단 Balance in Wallet(계좌 잔고) 수량을 초과할 수 없습니다.
  • Commnet :Transfer에 대한 상세 설명을 추가할 수 있습니다.(선택 사항)

3. 인증 및 전송 완료

  • [Transfer]버튼을 누르면 Private Authentication 창이 표시됩니다.

  • 사용할 인증 방법을 선택하고 from 계정에 대한 인증을 진행한 뒤 [Confirm]버튼을 누르면 토큰 전송 트랜잭션이 제출되어 전송이 시작됩니다.

(2) API를 통한 메인 토큰 전송

1. 메인넷 토큰 전송을 위한 Raw 트랜잭션을 생성합니다.


2. Raw 트랜잭션 전송을 위해 Nonce를 추가합니다.

  • Nonce를 개별로 관리하지 않는 경우, getNextNonce API 를 호출하여 유효한 다음 Nonce를 확인할 수 있습니다.

  • 아래 예시와 같이 Nonce 값을 Raw 트랜잭션에 추가해야 합니다. (예시의 Nonce는 0x0입니다.)
    {
        "from": "0xa477c5efd0db9076aada98fda41ac017d3702dc1",
        "data": "0xa9059cbb000000000000000000000000fb2b14428b7c36cf6c1142d79a9cef8daac925d60000000000000000000000000000000000000000000000000de0b6b3a764000011110000111195c498f246be383cb420141a23d1b6a66d5d44ba",
        "gasLimit": "0x30d400",
        "gasPrice": "0x15a7b2979400",
         "chainId": 256,
         "to": "0x6dacff06788e36f02de8fac798a52d99b11c78c6",
         "nonce": "0x0"
    }
    

3. Raw 트랜잭션 서명

3-1. 토큰 전송의 from 계정이 루니버스 DEOA인 경우

Remote Sign API를 통해 Signed 트랜잭션을 만들 수 있습니다. Nonce까지 추가된 Raw 트랜잭션 객체를 요청으로 전달합니다.

curl -X POST 'https://api.luniverse.io/mx/v2.0/wallets/{address}/sign' \
--header 'Authorization: Bearer <YOUR_API_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
  "rawTx": "<RAW_TX>"
}'

3-2. 토큰 전송의 from 계정이 EOA인 경우

지갑 또는 별도의 저장소에 보관하고 있는 EOA Private Key로 직접 Raw 트랜잭션을 서명합니다. 아래 예시는 Javascript를 활용한 서명 과정 예시이며, 이 외의 다양한 방법으로 서명이 가능합니다.

const EthereumTx = require('ethereumjs-tx');
const privateKey = Buffer.from('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex');

// const apiResponse = {
//   "result": true,
//   "data": {
//     "from": "0x6f183183a0701df756b1579ee7341759375cd57d",
//     "rawTx": {
//       "from": "0x6f183183a0701df756b1579ee7341759375cd57f",
//       "to": "0x8a77685767f58cf6912bc5978213fd1d1de76864",
//       "data": "0xa9059cbb00000000000000000000000062c1e49382823d33272cb161a625658d3adc07b70000000000000000000000000000000000000000000000000000000000000064",
//       "chainId": 533162, 
//       "gasLimit": "0x30d400",
//       "gasPrice": "0x1388"
//       "nonce": "0x1",
//     }
//   }
// }

const tx = new EthereumTx(apiResponse.data.rawTx);
tx.sign(privateKey);

const signedTx = tx.serialize().toString('hex');

4. 트랜잭션 전송

서명이 완료된 트랜잭션 데이터를 API 또는 RPC endpoint 호출을 통해 최종 Submit하여 토큰 전송을 요청합니다.

submitSignedTransaction API 명세

curl -X POST 'https://api.luniverse.io/mx/v2.0/transaction/send/signed-tx' \
--header 'Authorization: Bearer <YOUR_API_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
  "signedTx": "<SIGNED_TX>"
}'