예제

Token/Wallet/Block API를 사용한 예제를 보여줍니다.

모든 API는 HTTP POST 방식을 사용하여 JSON 데이터를 주고 받습니다.

계좌

계좌 생성하기

사용자는 은행에서 돈을 넣기 위해서 본인의 계좌가 필요하듯이 토큰을 저장하기 위한 계좌를 먼저 생성해야 합니다. 계좌를 생성하려면 다음과 같이 실행합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "createAddress",
    "params": {
        "addInfo": "My first address"
    }
}
  • "jsonrpc"는 반드시 "2.0"이어야 합니다.

  • "id"는 클라이언트에서 생성하는 구분자이며 반드시 스트링이어야 합니다.

  • "method"는 실행할 명령입니다. 계좌를 생성하기 위해서는 "createAddress"를 사용합니다.

  • "params"에는 명령을 실행할 때 필요한 인자를 저장합니다. 계좌를 생성할 때는 "addInfo" 인자가 필요합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "1234",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
            "mnemonic": "miracle anchor zebra brush talent broom pig broom news hammer suit brick",
            "secretKey": "d0c48b4d6972bf8d4110f81d5dd8ac1c"
        }
    }
}
  • "id"는 요청했을 때 값과 동일합니다.

  • 계좌 "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64"이 생성되었습니다.

  • "mnemonic"은 계좌의 비밀키를 복구할 때 사용하는 키워드 목록입니다. 사용자는 menemonic을 어딘가 메모해 두어야 합니다.

계좌가 생성되었는지 확인하려면,

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "1235",
    "method": "getAddressInfo",
    "params": {
        "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "1235",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
            "addInfo": "My first address"
        }
    }
}

ERC20

ERC20 토큰 이체

각 토큰은 contract address로 구분합니다. 토큰 생성은 클라이언트에서 처리하지 않고 서버에서만 처리합니다. 다음 토큰이 이미 정의되어 있습니다.

토큰 심볼Contract address설명

MST

0x5f748cff221bf63bdadf33cd2678093930e7fb2a

Medical service token

MDT

0x3ff720bf49f69a61fd2c9a19a5b9a33ed5a59555

Medical DAO token

토큰 이체는 4단계로 진행됩니다.

첫째, 안전한 이체를 위한 임시키를 발급받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "transfer"
    }
}
  • "address"는 사용자 계정입니다.

  • "keyType"은 반드시 "transfer" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "1234",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "c3b915aba82d31aa7f505739ee323db0"
        }
    }
}
  • "tempKey"를 발급받았습니다.

둘째, 메시지를 서명을 받아야 합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "signData",
    "params": {
        "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
        "data": "0ef6b88023386ac2691ebc50e6ab8c651326524ac7932b2c88c8349cc0b5d21f",
        "tempKey": "c3b915aba82d31aa7f505739ee323db0",
        "hashKey": "5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619"
    }
}
  • "address"는 사용자 계정입니다.

  • "tempKey"는 이전 단계에서 받은 임시키입니다.

  • "hashKey"는 임시키와 계좌의 비밀키로 생성되는 해시값입니다. 예를 들어, hash(['c3b915aba82d31aa7f505739ee323db0', 'd0c48b4d6972bf8d4110f81d5dd8ac1c']) => '5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619'. 해시 함수는 dart로 다음과 같이 구현할 수 있습니다. 이 함수는 반복적으로 사용될 것입니다.

/// Dart
import 'package:crypto/crypto.dart';
String hash(List<String> v) => sha256.convert(utf8.encode(v.join('|'))).toString();
  • "data"는 토큰 contract address, 사용자 계좌, 수신자 계좌, 금액, 임시키, 해시를 사용해서 만든 해시 값 입니다. 예를 들어, hash(['0x1a007ca3d881c14269f956c6e4b734095bf450a7', '0x841dd0a424ba0ab63950a4c8ad11b33f34deac64', '0x191f06333602d2f5296e1aa83e3166454032adab', "1", "c3b915aba82d31aa7f505739ee323db0", "5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619"]) => '0ef6b88023386ac2691ebc50e6ab8c651326524ac7932b2c88c8349cc0b5d21f'

Response:

{
    "jsonrpc": "2.0",
    "id": "1234",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "304502203ee4b7410b058c718ae52423cde25f4df68b4ce49255c4a6f34ae368c3f0a3690221009332445fcb1717588063a098882bc6ff17e887b76f6fac46ca0cfdec0e1e2595"
        }
    }
}
  • "signedData"는 메시지 서명입니다.

셋째, 이체합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "erc20_transfer",
    "params": {
        "contractAddress": "0x1a007ca3d881c14269f956c6e4b734095bf450a7",
        "sender": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
        "toAddress": "0x191f06333602d2f5296e1aa83e3166454032adab",
        "amount": "1",
        "tempKey": "c3b915aba82d31aa7f505739ee323db0",
        "hashKey": "5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619",
        "signature": "3044022036d634a588a4582539465d8c4849303ed5acee11ba6e3772649ba6e442c1d25c022016902d4dd83bcedca25ef7e4e530d19f08afba77a1c2d10fe25d225ae2eb7f79",
        "comment": "Transfer"
    }
}
  • "signature"는 이전 단계에서 생성된 메시지 서명입니다.

  • "comment"는 메모로 서명 시 포함되지 않습니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "57096",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0x50d0b07cd332b08b15ec071c9bf00cd6b926f43b2ffd1bc62e7f3254033e94ee"
        }
    }
}
  • "transactionId" 를 받습니다.

넷째, 토큰 이체가 블록체인에 쓰여지는데 시간이 걸립니다. 완료될 때까지 기다려야 합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "57266",
    "method": "net_getTransactionStatus",
    "params": {
        "transactionId": "0x50d0b07cd332b08b15ec071c9bf00cd6b926f43b2ffd1bc62e7f3254033e94ee"
    }
j

Response:

{
    "jsonrpc": "2.0",
    "id": "57266",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": -1,
            "revertReason": ""
        }
    }
}

또는

{
    "jsonrpc": "2.0",
    "id": "59336",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}
  • "status"가 -1은 아직 진행 중이란 의미입니다. 완료가 되면 0이나 1을 돌려줍니다. 1은 성공, 0은 에러가 발생한 경우입니다.

주기적으로 net_getTransactionStatus를 호출하여 status가 -1이 아닐 때까지, 즉 완료될 때가지 기다립니다.

ERC20 잔액 구하기

특정 계좌의 특정 토큰의 잔액을 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "37026",
    "method": "erc20_getBalance",
    "params": {
        "contractAddress": "0x1a007ca3d881c14269f956c6e4b734095bf450a7"
        "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "37026",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "balance": "99"
        }
    }
}

ERC721 (NFT)

ERC721 (NFT) 토큰 이체하기

ERC721 토큰의 생성, mint, 이체는 서버에서 관리됩니다. 클라이언트는 오직 토큰 권한을 서버로 승인해 주는 역할만 합니다. 다음의 토큰이 이미 정의되어 있습니다.

토큰 심볼Contract address설명

NFMS

0x17e8b326d80b286dc11761add1a24a18493f6b85

NFT for medical service

서버를 통해 NFT를 mint 할 경우 (별도의 api 제공됨) 사용자는 contract address와 토큰 ID를 돌려받게 됩니다.

NFT 마켓에 상품을 올리기 위해서는 상품 소유자는 소유권 관리를 마켓에서 처리할 수 있도록 승인을 해 주어야 합니다. 승인 처리는 이체와 유사하게 동작합니다.

첫째, 임시키를 발급받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "53494",
    "method": "net_getTempKey",
    "params": {
        "address": "0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9",
        "keyType": "approve"
    }
}
  • 계좌는 사용자의 NFT가 저장된 계좌입니다.

  • "keyType"은 항상 "approve" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "53494",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "ae1b64e6a1a29d9b91ef7515dfe74c4d"
        }
    }
}

둘째, 메시지 서명을 생성합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "54079",
    "method": "signData",
    "params": {
        "hashKey": "02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11",
        "address": "0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9",
        "data": "5b69d60a7fec498b9f3d24ef06b4cb323c7d0606e4606edad19065c3c024f578",
        "tempKey": "ae1b64e6a1a29d9b91ef7515dfe74c4d"
    }
}
  • "hashKey"는 임시키와 계좌 비밀키의 해시 값입니다. 예를 들어, hash(['ae1b64e6a1a29d9b91ef7515dfe74c4d', 'b5dc981ece0925ecf56e490727bce577']) => '02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11'. "b5dc981ece0925ecf56e490727bce577"는 계좌의 비밀키입니다.

  • "data"는 contract address, 계좌 주소, 마켓의 계좌 주소, 토큰 ID, 임시키, 해시키를 가지고 해시 값을 구합니다. 예를 들어, hash(['0xa408c647676f01c1463174019ddacdc49837097b', '0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9', '0x6a39630bd5986e73fe181938c6097958127c16c4', "2", "ae1b64e6a1a29d9b91ef7515dfe74c4d", "02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11"]) => '5b69d60a7fec498b9f3d24ef06b4cb323c7d0606e4606edad19065c3c024f578'. "0x6a39630bd5986e73fe181938c6097958127c16c4" is the market address.

Response:

{
    "jsonrpc": "2.0",
    "id": "54079",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3046022100c21b658831e1d8955fd92fb937c0c5d39ceb2f72522a0667fdff685764920478022100fa38a36d9e2b6cac80e39723ac79af4386ad466e1afd019a50149588c3a78de2"
        }
    }
}

셋째, NFT 마켓에 상품 권한을 위임합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "54157",
    "method": "erc721_approve",
    "params": {
        "hashKey": "02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11",
        "tokenId": "2",
        "sender": "0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9",
        "spender": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "signature": "3046022100c21b658831e1d8955fd92fb937c0c5d39ceb2f72522a0667fdff685764920478022100fa38a36d9e2b6cac80e39723ac79af4386ad466e1afd019a50149588c3a78de2",
        "contractAddress": "0xa408c647676f01c1463174019ddacdc49837097b",
        "comment": "Put on the market",
        "tempKey": "ae1b64e6a1a29d9b91ef7515dfe74c4d"
    }
}
  • "sender"는 NFT가 저장된 계좌주소입니다.

  • "spender" 는 마켓의 계좌 주소입니.

Response:

{
    "jsonrpc": "2.0",
    "id": "54157",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xf9348011be7423261ca2c74208f876a1a4a3cd6dcd3038414a131bd247d6b783"
        }
    }
}

넷재, 완료될 때까지 기다립니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "54238",
    "method": "net_getTransactionStatus",
    "params": {
        "transactionId": "0xf9348011be7423261ca2c74208f876a1a4a3cd6dcd3038414a131bd247d6b783"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "56316",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}
  • -1은 현재 진행 중이란 의미입니다. 0나 1이 응답될 때까지 기다려야 합니다.

Swap

Swap 목록 구하기

Swap 가능한 목록을 구하기 위해서는 swap_getPairList를 호출해야 합니다. swap 목록은 서버에서 관리됩니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0"
    "id": "85551",
    "method": "swap_getPairList",
}

Response:

{
    "jsonrpc": "2.0",
    "id": "85551",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": [
            {
                "pairAddress": "0x294e47341f7da34a6d8187ecbc4ff206d6ca212f",
                "token0": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
                "token1": "0x4883c1d966d103485f97f548a0cb1fb117388af0",
                "symbol0": "TOK1",
                "symbol1": "TOK2",
                "amount0": "1",
                "amount1": "10"
            }
        ]
    }
}
  • TOK1과 TOK2 간에 swap이 가능합니다.

Swap 시 예상 금액 구하기

Swap 후 예상되는 금액을 구할 수 있습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "86197",
    "method": "swap_getAmountOut",
    "params": {
        "tokenIn": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
        "tokenOut": "0x4883c1d966d103485f97f548a0cb1fb117388af0",
        "amountIn": "0.1",
        "sender": "0x6a39630bd5986e73fe181938c6097958127c16c4"
    }
}
  • "tokenIn"와 "tokenOut"은 토큰 contract address입니다.

  • "tokenIn" 토큰 "amountIn" 금액을 "tokenOut" 토큰으로 전환하려고 합니다.

  • "sender"는 "tokenIn"을 저장하고 있는 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "86197",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "amountIn": "0.1",
            "amountOut": "0.405288228265375695"
        }
    }
}
  • "tokenOut" 토큰 0.405288228265375695을 받을 수 있습니다.

토큰 Swap

토큰을 swap 하려면 2단계로 진행됩니다.

첫째, 토큰 금액을 서버에서 처리할 수 있도록 승인해 줘야 합니다.

첫째, 임시 키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "86255",
    "method": "net_getTempKey",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "keyType": "approve"
    }
}
  • "address"는 당신의 계좌입니다.

  • "keyType"은 "approve"입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "86255",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "b215f78617e0e5559042971c8e284133"
        }
    }
}

둘째, 메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "86287",
    "method": "signData",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "tempKey": "b215f78617e0e5559042971c8e284133",
        "hashKey": "33f82dc02a98428690b41820970bfeefff7294fcb432408ed8ad924baf874fe1",
        "data": "d62cd64946e2522dc7963a7bcabf5d927998bbeea10d96732b79aa793ecf9b8a"
    }
}
  • "hashKey"는 hash(temp key, your address's secret key) 입니다.

  • "data"는 hash(tokenIn contract address, your address, amount, "tempKey", "hashKey") 입니다.

Resonse:

{
    "jsonrpc": "2.0",
    "id": "86287",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "304602210088ae728b0bc33b7416d73c4b4e04be59bf9da45ad1037799f1b7e4b49a1a16a4022100da66160775e9a99dbd8e02aae98ad7b0eb45a0c0ab55c9fbe6d604c320a0aa31"
        }
    }
}

토큰 금액을 승인합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "86354",
    "method": "swap_approve",
    "params": {
        "contractAddress": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
        "sender": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "amount": "0.1",
        "comment": "Approve to swap",
        "tempKey": "b215f78617e0e5559042971c8e284133",
        "hashKey": "33f82dc02a98428690b41820970bfeefff7294fcb432408ed8ad924baf874fe1",
        "signature": "304602210088ae728b0bc33b7416d73c4b4e04be59bf9da45ad1037799f1b7e4b49a1a16a4022100da66160775e9a99dbd8e02aae98ad7b0eb45a0c0ab55c9fbe6d604c320a0aa31"
    }
}
  • "contractAddress"는 토큰 contract address입니다.

  • "sender" 는 사용 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "86354",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0x0a32339b56022e31aa1f3a5162d4e4a581a3d28505ac7c84b05fdd5c347bb61f"
        }
    }
}

끝날 때까지 기다립니다.

Request: https://test-api.protx.io/token

{
    "method": "net_getTransactionStatus",
    "id": "86420",
    "jsonrpc": "2.0",
    "params": {
        "transactionId": "0x0a32339b56022e31aa1f3a5162d4e4a581a3d28505ac7c84b05fdd5c347bb61f"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "89531",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}

둘째, 토큰을 swap합니다.

임시키를 발급받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "89561",
    "method": "net_getTempKey",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "keyType": "swap"
    }
}
  • "address"는 사용자 계정입니다.

  • "keyType"은 "swap"이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "89561",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "57a2b588f8b9634f53a322cdf1edfb05"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "89597",
    "method": "signData",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "hashKey": "829f93bc755e5928a13edb69d9bf81130db4f6d4637c59c2aa9923af9ac1a93e",
        "tempKey": "57a2b588f8b9634f53a322cdf1edfb05",
        "data": "0758e1bd89b0cb38b38ca6f74e601a3eb258f33eeedcf0ba3531c1d624f6968a"
    }
}
  • "hashKey"는 hash(temp key, your address's secret key) 입니다.

  • "data"는 hash(tokenIn amount, tokenOut amount, tokenIn contract address, your address, "tempKey", "hashKey") 입니다.

Resonse:

{
    "jsonrpc": "2.0",
    "id": "89597",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3045022100946bd7860fe667b247692d50449135864428c17e0d50e42175a8b701ac8ed11702205a69e0f03684842906aed52b1c030dc686030806926ad1a7c3aa3c80291c37ff"
        }
    }
}

토큰을 swap 합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "89626",
    "method": "swap_tokenToToken",
    "params": {
        "amountIn": "0.1",
        "tokenIn": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
        "tokenOut": "0x4883c1d966d103485f97f548a0cb1fb117388af0",
        "sender": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "comment": "Swap",
        "tempKey": "57a2b588f8b9634f53a322cdf1edfb05",
        "hashKey": "829f93bc755e5928a13edb69d9bf81130db4f6d4637c59c2aa9923af9ac1a93e",
        "signature": "3045022100946bd7860fe667b247692d50449135864428c17e0d50e42175a8b701ac8ed11702205a69e0f03684842906aed52b1c030dc686030806926ad1a7c3aa3c80291c37ff"
    }
}
  • "tokenIn", "tokenOut"은 토큰 contract address 입니다.

  • "sender"는 사용자 계정입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "89626",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xc0a11b0b743d060672f00bb7c8386af252d793162b6aee233109c2daaf054173"
        }
    }
}

완료될 때까지 기다립니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "91789",
    "method": "net_getTransactionStatus",
    "params": {
        "transactionId": "0xc0a11b0b743d060672f00bb7c8386af252d793162b6aee233109c2daaf054173"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "91789",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}

Staking

Staking 목록 구하기

Request: https://test-api.protx.io/block

{
    "jsonrpc": "2.0",
    "id": "55900",
    "method": "getStakingV1List",
    "params": {
        "pageNumber": 1,
        "pageSize": 10,
        "order": 1,
        "stakingTimeFilter": 1666000700819,
    }
}
  • "order"가 1이면 오름차순, 그렇지 않으면 내림차순.

  • "stakingTimeFilter"에 timestamp를 지정하면 해당 timestamp 시점에 유효한 staking 목록만을 구할 수 있습니다.

/// In dart
var stakingTimeFilter = DateTime.now().millisecondsSinceEpoch;

Response:

{
    "jsonrpc": "2.0",
    "id": "55900",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "pageNumber": 1,
            "pageSize": 10,
            "totalPages": 1,
            "totalElements": 1,
            "list": [
                {
                    "contractAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
                    "owner": "0x5f619702528e9de7f5a4a233cd1896902385e705",
                    "stakingToken": "0x5f748cff221bf63bdadf33cd2678093930e7fb2a",
                    "rewardToken": "0x3ff720bf49f69a61fd2c9a19a5b9a33ed5a59555",
                    "rewardRate": 100,
                    "limitStakingTime": 1666427295713,
                    "limitRewardTime": 1666427295713,
                    "txId": "0x81c0ae9709ea292d4546adb991fe13be4d06f3190c35641e9870e9adea493150",
                    "blockNumber": 3621918,
                    "txTime": "2022-10-17T17:28:38"
                }
            ]
        }
    }
}
  • "contractAddress"는 staking을 나타내는 contract address 입니다. 이후 우리는 이 contract address는 "stakingAddress"라고 지칭하겠습니다.

  • "stackingToken"와 "rewardToken"은 토큰 contract addresses. UI에서는 이에 대응하는 토큰 심볼을 보여주도록 합니다.

  • "limitStakingtime"와 "limitRewardTime"은 1970년 1월 1일 UTC에서부터 시작한 초 시간입니다.

  • "rewardRate"는 초당 이자입니다. 단위는 0.0000000000000000001 입니다.

Staking 시작

첫째, staking을 하기 위해서는 사용자가 가진 토큰을 시스템에서 사용할 수 있도록 승인을 해 줘야 합니다..

임시키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "10029",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "approve"
    }
}
  • "keyType"은 "approve" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "10029",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "a694f888d7e45aea7773948de35437ef"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "10722",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "a694f888d7e45aea7773948de35437ef",
        "hashKey": "4a935c6b118b3e1a432147d88f7bd29fce5c976fd02c28870274664d10c6167d",
        "data": "57a4ad402f7abc6f93bfafd5623ac68545df82e12686d9adb6b11e1e0d9cf4cf"
    }
}
  • "hashKey"는 hash(temp key, your address's secret key) 입니다.

  • "data"는s hash(contract address of the token to be entrusted to the staking address, your address, staking address, amount, "tempKey", "hashKey") 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "10722",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "304402205007a96f671808d1c09daad726621be5fac7e04e83d75abace1aa7301677d9bc022046c43cf4853a7f38dce3345a7a132a3b73c3a4aa05b656003d583af5af166de0"
        }
    }
}

Staking 계좌에 승인합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "10788",
    "method": "erc20_approve",
    "params": {
        "contractAddress": "0x5f748cff221bf63bdadf33cd2678093930e7fb2a",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "spender": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "amount": "1",
        "comment": "Approve",
        "tempKey": "a694f888d7e45aea7773948de35437ef",
        "hashKey": "4a935c6b118b3e1a432147d88f7bd29fce5c976fd02c28870274664d10c6167d",
        "signature": "304402205007a96f671808d1c09daad726621be5fac7e04e83d75abace1aa7301677d9bc022046c43cf4853a7f38dce3345a7a132a3b73c3a4aa05b656003d583af5af166de0"
    }
}
  • "contractAddress"는 staking contract address 입니다..

  • "sender"는 사용자 계좌입니다.

  • "spender"는 staking 계좌입니다..

  • "amount"는 staking 계좌에 맡길 금액입니다. 이 금액은 현재 사용자가 가진 금액보다 클 수는 없습니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "10788",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xecc5fc9aba68fe4c04964505213359d6c9edd5cc5d471f2caca94cbfec1c274a"
        }
    }
}

완료될 때까지 기다립니다.

둘째, staking을 시작합니다.

임시키를 발급받습니다.

Request: https://test-api.protx.io/token ****

{
    "jsonrpc": "2.0",
    "id": "95866",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "stake"
    }
}
  • "keyType"은 "stake" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "95866",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "52f6f4b228b38b0602e659ceee45e784"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "96450",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "52f6f4b228b38b0602e659ceee45e784",
        "hashKey": "2c6219ee0ba6889bca7767ad686fedc12a48d364590ad3c14e34574ac18ce23e",
        "data": "ed3747837d66d5f003548abdea104b2a81170b68a859080ec440054d5366f989"
    }
}
  • "hashKey"는 hash(temp key, address's secret key) 입니다.

  • "dataKey"는 hash(staking address, your address, amount, "tempKey", "hashKey") 입니.

Response:

{
    "jsonrpc": "2.0",
    "id": "96450",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3045022100bd4a0fefdde88497f67271eaa9c828b139e1a5df3845faf2d7bea70f381123e40220668a2bfcee0a160b74ea975e57529f826cb7d59ce284232383506152a9212575"
        }
    }
}

Staking을 시작합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "24225",
    "method": "stakingV1_stake",
    "params": {
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "amount": "1",
        "comment": "Stake",
        "tempKey": "52f6f4b228b38b0602e659ceee45e784",
        "hashKey": "2c6219ee0ba6889bca7767ad686fedc12a48d364590ad3c14e34574ac18ce23e",
        "signature": "3045022100bd4a0fefdde88497f67271eaa9c828b139e1a5df3845faf2d7bea70f381123e40220668a2bfcee0a160b74ea975e57529f826cb7d59ce284232383506152a9212575"
    }
}
  • "stakingAddress"는 staking contract address 입니다.

  • "sender"는 사용자 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "24225",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xe559e76068b177747a512c0fa82800cc184c76f57603a9ffd7768e50383146e8"
        }
    }
}

net_getTransactionStatus을 사용하여 완료될때까지 기다립니다.

현재 staking 상태 구하기

Staking 계좌에 맡겨진 금액을 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "36392",
    "method": "stakingV1_getStaked",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920"
    }
}
  • "stakingAddress"는 staking address 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36392",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "balance": "1"
        }
    }
}

지금까지 쌓 적립금을 확인할 수 있습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "36465",
    "method": "stakingV1_getEarned",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920"
    }
}
  • "stakingAddress"는 staking 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36465",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "balance": "0.0000000000000012"
        }
    }
}
  • 받을 수 있는 적립금은 0.0000000000000012 입니다.

인출

첫째, 해지는 staking 계좌에 맡겨놓은 금액을 인출합니다.

임시키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "36492",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "withdraw"
    }
}
  • "keyType"는 "withdraw" 이어야 합니다.

Response:

{
    "resultCode": "200",
    "resultMessage": "Success",
    "resultData": {
        "tempKey": "464317e9051c036bae5d55879420ec59"
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "36525",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "464317e9051c036bae5d55879420ec59",
        "hashKey": "17c48c9425c19bcb659f943921f7ec150e10f85bb0ff2e733c438560c5f74898",
        "data": "ba2c07102047695df0c352d1a43bc277ed88ac27b5eafcdb2c027c13c9df475e"
    }
}
  • "tempKey"는 hash(temp key, address's secret key) 입니다.

  • "data"는 hash(staking address, your address, amount, "tempKey", "hashKey") 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36525",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3046022100c52683d4b2318a1380f002da07de67e0fc3d8bcb6e39ccc15b29b1df533c68af022100ef3fcd0c1d11614e06c77f280202f0fc87c1dff8be5ef499a85b8c4256398895"
        }
    }
}

금액을 인출합니다.

Request: https://test-api.protx.io/token****

{
    "method": "stakingV1_withdraw",
    "id": "36552",
    "jsonrpc": "2.0",
    "params": {
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "amount": "1",
        "comment": "Withdraw",
        "tempKey": "464317e9051c036bae5d55879420ec59",
        "hashKey": "17c48c9425c19bcb659f943921f7ec150e10f85bb0ff2e733c438560c5f74898",
        "signature": "3046022100c52683d4b2318a1380f002da07de67e0fc3d8bcb6e39ccc15b29b1df533c68af022100ef3fcd0c1d11614e06c77f280202f0fc87c1dff8be5ef499a85b8c4256398895"
    }
}
  • "stakingAddress"는 staking contract address 입니다.

  • "sender"는 사용자 계좌 주소입니다.

  • "amount"는 staking 계좌에 맡긴 금액입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36552",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xc9920e01b32f7bc52a12c6342d2b8f8ad39ec72d9c0728a57552e0ca8857c8b9"
        }
    }
}

완료될 때까지 기다립니다.

둘째, 적립금을 받습니다.

임시키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "38723",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "claimReward"
    }
}
  • "keyType"은 "claimReward" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "38723",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "effeba77d6c04223d4a381a1dffa7d3f"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "38757",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "effeba77d6c04223d4a381a1dffa7d3f",
        "hashKey": "0e6f8b6c0f89cd1427bd7cdcd69b337a50a535f70f0a8580c4f1484ae267129d",
        "data": "05eadc9b44605d6ef54ff3d62bb909e29ba4f32eaea02e2128472cb5ecd0d7cf"
    }
}
  • "address"는 사용자 계좌입니다.

  • "hashKey"는 hash(temp key, address's secret key) 입니다.

  • "data"는 hash(staking address, your address, "tempKey", "hashKey") 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "38757",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "30440220230f62ac0d2700ce8af8be2fb29fcc8e9337f8c64b3df20c9b0df1192324cb660220632c491f2c105856961dfd571dd191a9a678758275c251f48c56b7cfae37b228"
        }
    }
}

적립금을 받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "38788",
    "method": "stakingV1_claimReward",
    "params": {
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "comment": "Claim reward",
        "tempKey": "effeba77d6c04223d4a381a1dffa7d3f",
        "hashKey": "0e6f8b6c0f89cd1427bd7cdcd69b337a50a535f70f0a8580c4f1484ae267129d",
        "signature": "30440220230f62ac0d2700ce8af8be2fb29fcc8e9337f8c64b3df20c9b0df1192324cb660220632c491f2c105856961dfd571dd191a9a678758275c251f48c56b7cfae37b228"
    }
}
  • "stakingAddress"는 staking contract address 입니다.

  • "sender"는 사용자 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "38788",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0x1e3539d4de4b6ebe9e15e03898e0759fed71d68c35804c29523eb1b1031f6860"
        }
    }
}

완료될 때까지 기다립니다.

DID (Decentralized Identifier)

DID 생성하기

Request: https://test-auth.protx.io/v2/did/create-did****

{
    "alias": "4700634FB09E0019",
    "address": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
    "secretKey": "********"
}
  • "alias"는 DID를 구분하는 별칭입니다.

  • "address"와 "secretKey"는 token API를 통해 생성한 사용자 계좌 정보입니다.

Response:

{
  "controllerKeyId": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
  "provider": "did:ethr",
  "keys": [
    {
      "kid": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
      "kms": "protx-kms",
      "type": "Secp256k1",
      "publicKeyHex": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
      "privateKeyHex": "",
      "meta": {
        "algorithms": [
          "ES256K",
          "ES256K-R",
          "eth_signTransaction",
          "eth_signTypedData",
          "eth_signMessage"
        ],
        "secretKey": "********"
      }
    }
  ],
  "alias": "4700634FB09E0019",
  "services": [],
  "did": "did:ethr:0x38b45217e81548733f9fd7443ecfe4ea6b5725cf"
}
  • 응답 본문은 DID 본문입니다.

VC (Verifiable Credential) 생성하기

이 VC는 본 인증 시스템에서 인증하기 위한 정보를 포함하게 됩니다. 이를 위해 /auth/auth-user를 통해 발급받은 JWT를 API에 호출 시 헤더에 첨부해야 합니다.

Request: https://test-auth.protx.io/v2/did/create-vc****

curl -X 'POST' \
  'https://test-auth.protx.io/v2/did/create-vc' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0Iiwicm9sZSI6IlJPTEVfVVNFUiIsImV4cCI6MTY2ODkyMzY5MSwidXNlciI6IjQ3MDA2MDM2NDRCNzAwMDQiLCJpYXQiOjE2NjYzMzE2OTF9.c2BMNGbTUNV6HQAIBy9nHOTEK8nZOex1r-ntO3KLlNY' \
  -H 'Content-Type: application/json' \
  -d '{
  "holder": "did:ethr:0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
  "issuer": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4",
  "userInfo": {
     "name": "Hong"
  }
}'
  • "holder"는 사용자 DID 입니다.

  • "issuer"는 본 인증 시스템에서 제공하는 발급자 DID 입니다.

  • "userInfo"에는 키/값 형태로 추가적인 정보를 제공할 수 잇습니다.

Response:

{
  "credentialSubject": {
    "name": "Hong",
    "sub": "test",
    "id": "did:ethr:0x38b45217e81548733f9fd7443ecfe4ea6b5725cf"
  },
  "issuanceDate": "2022-10-21T05:56:06.000Z",
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiUHJvZmlsZSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiSG9uZyIsInN1YiI6InRlc3QifX0sInN1YiI6ImRpZDpldGhyOjB4MzhiNDUyMTdlODE1NDg3MzNmOWZkNzQ0M2VjZmU0ZWE2YjU3MjVjZiIsIm5iZiI6MTY2NjMzMTc2NiwiaXNzIjoiZGlkOmV0aHI6MHhkMjg0Y2RjOTY0YWY4YTAxZDgyZDBjYWE3ZGVlYmE4Mjc4NWI1NGY0In0.IvrseTkX-lnadHg7TrPcBaTC5utYIr72nbQRgdNS_jwSPy4fypUxu7_2xaJw1IqHy71-uTp1B52hAz7ZeRb89g"
  },
  "type": [
    "VerifiableCredential",