Home - LudexCS/LudexWeb3Integration GitHub Wiki

ํ•ด๋‹น ํŽ˜์ด์ง€๋Š” Ludex์˜ Web3Integration Library์˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ฌธ์„œํ™”ํ•œ ์œ„ํ‚ค์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€์ด๋‹ค. Ludex ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Ludex ํ”Œ๋žซํผ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์บก์Аํ™”ํ•œ ํƒ€์ž…๋“ค๊ณผ ๊ทธ ์ƒ์„ฑ ํŒจํ„ด์„ ์ œ๊ณตํ•œ๋‹ค.

Quick Example Snippet

๋ฉ”ํƒ€๋งˆ์Šคํฌ/๋ธŒ๋ ˆ์ด๋ธŒ ์ง€๊ฐ‘ ์—ฐ๊ฒฐ

import * as ludex from "ludex";

let chainConfig: ludex.configs.ChainConfig = {
   // .. your configuration
};

async function connectBrowserWallet()
{
   return await ludex.BrowserWalletConnection.create(chainConfig);
}

PriceTable ์ปจํŠธ๋ž™ํŠธ์—์„œ ์•„์ดํ…œ ๊ฐ€๊ฒฉ ์ •๋ณด ํ™•์ธ

import * as ludex from "ludex";
import { ethers } from "ethers";

let chainConfig: ludex.configs.ChainConfig = {
   // .. your configuration
};

let ludexConfig: ludex.configs.LudexConfig = {
   // .. your configuration
};

async function showItemPrice (itemID: bigint)
{
    let facade = ludex.facade.createWeb2UserFacade(chainConfig, ludexConfig);

    let priceTable = facade.readonlyAccessPriceTable();

    let itemPrice: ludex.structs.PriceInfo[] = await priceTable.getPriceInfoList(itemID);

    for (let price of itemPrice)
    {
        console.log(`In token(${price.token}): ${price.tokenAmount}`);
    }
}

Store ์ปจํŠธ๋ž™ํŠธ์—์„œ ์•„์ดํ…œ ๊ตฌ๋งค

Front-end

import * as ludex from "ludex";

let chainConfig: ludex.configs.ChainConfig = {
   // .. your configuration
};

let ludexConfig: ludex.configs.LudexConfig = {
   // .. your configuration
};

let forwarderAddress: ludex.Address = ludex.Address.create("Contract Address of forwarder");
let tokenAddress: ludex.Address = ludex.Address.create("Contract Address of payment token");

async function sendPurchaseItemRequest (itemID: bigint, connection: ludex.BrowserWalletConnection)
{
   let signer = await connection.getSigner();
   let facade = ludex.facade.createWeb3UserFacade(chainConfig, ludexConfig, signer, forwarderAddress);

   let store = facade.metaTXAccessStore();

   let purchaseRequest: ludex.relay.RelayRequest<bigint> = 
      store.purchaseItemRequest(itemID, tokenAddress, BigInt(3600)/*an hour*/);

   let response: any = await (// send purchase request to back-end, and get reponse);
   let tokenID: bigint|null = purchaseRequest.onResponse(response);
}

Back-end

import * as ludex from "ludex";
import { ethers } from "ethers";

let forwarderAddress: ludex.Address = ludex.Address.create("Contract Address of forwarder");
let ludexConfig: ludex.configs.LudexConfig = {
   // .. your configuration
};

let provider = new ethers.JsonRpcProvider("Private Json Rpc Url");
let wallet = new ethers.Wallet("Private Key", provider);

let relayer = ludex.relay.createLudexRelayeMaster(ludexConfig, forwarderAddress, wallet);

async function acceptRelayRequest()
{
   let request: any = await (/* request getter code via API */);

   let sendResponse = async (response: any) => {/* sending response to front-end*/};
   let onError = () => {/* error handling */ };

   await relayer.acceptRequest(request, sendResponse, onError);
}

Type Information

Configurations

  • ChainConfig: ์—ฐ๊ฒฐํ•  ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•˜๋Š” Configuration์„ ์ฑ…์ž„์ง€๋Š” ํƒ€์ž…
  • LudexConfig: Ludex ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•˜๋Š” ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋“ค์˜ ์ฃผ์†Œ๋ฅผ ๋‹ด์€ ํƒ€์ž…

Address

  • Address๋Š” ์ปจํŠธ๋ž™ํŠธ์˜ ์ฃผ์†Œ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋‹ด๋Š” ๋ž˜ํผ ํƒ€์ž…์ด๋‹ค
  • Address์˜ ์ธ์Šคํ„ด์Šค ์•ˆ์— ๋ž˜ํ•‘๋œ ์ฃผ์†Œ ๋ฌธ์ž์—ด ๊ฐ’์€ ์ด๋”๋ฆฌ์›€ ์ฃผ์†Œ ํฌ๋งท์ž„์ด ๋ณด์žฅ๋œ๋‹ค
  • ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ Address.create(stringValue: string)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค

Connection

  • Connection์€ ์›น3 ์ง€๊ฐ‘(๋ฉ”ํƒ€๋งˆ์Šคํฌ/๋ธŒ๋ ˆ์ด๋ธŒ) ์—ฐ๊ฒฐ์„ ์บก์Аํ™”ํ•œ ํƒ€์ž…์ด๋‹ค
  • ๋น„๋™๊ธฐ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ BrowserWalletConnection.create(chaingConfig: ChainConfig)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

Accesses

  • Access๋Š” ๋ธ”๋ก์ฒด์ธ ์ƒ์˜ ํŠน์ • ์ปจํŠธ๋ž™ํŠธ์— ์ ‘๊ทผํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์ œ๊ณตํ•œ๋‹ค
  • Access๋Š” ๋„ค ๊ฐ€์ง€์˜ ์ ‘๊ทผ ํŒจํ„ด์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค
    • Readonly: ๊ฑฐ๋ž˜๋‚˜ ์ •๋ณด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š”, ์ •๋ณด ํ™•์ธ๋งŒ์„ ์œ„ํ•œ ์ ‘๊ทผ ์ธํ„ฐํŽ˜์ด์Šค
    • MetaTX: ๋ฉ”ํƒ€ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•œ ๊ฑฐ๋ž˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”, ์ผ๋ฐ˜ Web3 ์ด์šฉ์ž๋ฅผ ์œ„ํ•œ ์ ‘๊ทผ ์ธํ„ฐํŽ˜์ด์Šค
    • Admin: ๊ด€๋ฆฌ์ž ๊ณ„์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์ ‘ ๊ฐ€์Šค๋ฅผ ์ง€๋ถˆํ•˜๋Š” ์ ‘๊ทผ ์ธํ„ฐํŽ˜์ด์Šค
    • Service: ์„œ๋ฒ„ ์ƒ์—์„œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์บก์Аํ™”ํ•œ, ์ง์ ‘ ๊ฐ€์Šค๋ฅผ ์ง€๋ถˆํ•˜๋Š” ์ ‘๊ทผ ์ธํ„ฐํŽ˜์ด์Šค
  • ๋ชจ๋“  Access๋Š” Readonly์˜ ๊ธฐ๋Šฅ์„ ์ƒ์†ํ•œ๋‹ค
  • Service๋Š” Admin์˜ ๊ธฐ๋Šฅ์„ ์ƒ์†ํ•œ๋‹ค
  • ๊ฐ ์ ‘๊ทผ ํŒจํ„ด ๋ณ„๋กœ, Ludex ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปจํŠธ๋ž™ํŠธ๋“ค์— ๋Œ€ํ•œ Access๊ฐ€ ์กด์žฌํ•œ๋‹ค
  • ์˜ˆ) ILedgerMetaTXAccess๋Š” Ledger ์ปจํŠธ๋ž™ํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ์‹ค์ œ ํ† ํฐ ๊ฒฐ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค
  • ๊ฐ๊ฐ์˜ ์ปจํŠธ๋ž™ํŠธ์— ๋Œ€ํ•œ Access ํƒ€์ž…๋“ค์€ ํ•˜๋‹จ์˜ Contracts ํ•ญ๋ชฉ ํ˜น์€ ๊ฐ Facade์˜ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐ

Facades

  • Facade๋Š” ๋„ค ๊ฐ€์ง€์˜ ์ ‘์† ํŒจํ„ด ๋ณ„๋กœ Access๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ๋งก๋Š” ํƒ€์ž…๋“ค์ด๋‹ค
  • ๊ฐ Facade๋Š” ์ ‘์† ํŒจํ„ด์— ๋Œ€์‘ํ•˜์—ฌ ์ •์˜๋œ Access์˜ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
  • Type ์ผ๋žŒ
    • IReadonlyFacade: Readonly ์ ‘์† ํŒจํ„ด์˜ Access๋“ค์˜ ์ƒ์„ฑ ์ฑ…์ž„์„ ๋งก๋Š”๋‹ค
    • IMetaTXFacade: MetaTX ์ ‘์† ํŒจํ„ด์˜ Access๋“ค์˜ ์ƒ์„ฑ ์ฑ…์ž„์„ ๋งก๋Š”๋‹ค
    • IAdminFacade: Admin ์ ‘์† ํŒจํ„ด์˜ Access๋“ค์˜ ์ƒ์„ฑ ์ฑ…์ž„์„ ๋งก๋Š”๋‹ค
    • IServiceFacade: Service ์ ‘์† ํŒจํ„ด์˜ Access๋“ค์˜ ์ƒ์„ฑ ์ฑ…์ž„์„ ๋งก๋Š”๋‹ค
  • ์˜ˆ) IAdminFacade์˜ adminAccessPriceTable() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด, IPriceTableAdminAccess ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Contracts

โš ๏ธ **GitHub.com Fallback** โš ๏ธ