Only this pageAll pages
Powered by GitBook
1 of 86

line-mini-dapp

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

LINE's Mini Dapp & Dapp Portal

Introduction

Mini Dapps powered by Kaia Blockchain are lightweight Web3 applications that run inside LINE Messenger with Mini Dapp SDK, without requiring any separate app installation. Mini Dapps span across categories such as Games, DeFi, AI, and more, all accessible through the Dapp Portal. Within the Dapp Portal, users can easily:

  • Discover and access a variety of Mini Dapps

  • Receive rewards for playing Mini Dapp

  • SWAP tokens of Mini Dapp and Trade NFTs

  • Experience seamless Web3 interaction with Mini Dapp Wallet

Kaia Wave Program

Kaia Wave is an onboarding and support program jointly operated by Kaia Foundation and LINE NEXT to help builders successfully launch their Mini Dapps within the LINE ecosystem.

Benefits for Kaia Wave Participants:

  • Technical support for the Mini Dapp SDK

  • Potential investment opportunities

  • Marketing and promotional assistance

Key Features and Benefits of the Mini Dapp

The Mini Dapp SDK enables developers to easily onboard Web3 services into the LINE ecosystem, integrate payment systems, and run marketing campaigns. It comes with a set of powerful features designed to accelerate service growth :

Seamless LINE Integration

  • Frictionless onboarding : Users can log in instantly using their LINE accounts—no additional sign-up required.

  • Leverage LINE's social features : Utilize built-in features like message sharing, LIFF integration to boost user acquisition and retention.

Integrated Wallet & Payment System

  • Mini Dapp Wallet: Easily create a wallet via LINE or other social logins, lowering the entry barrier for Web2 users.

  • External Wallet Support: Seamlessly connect popular Web3 wallets like Kaia, OKX, and Bitget.

  • Multiple Payment Options : Sell in-game items, NFTs, and more with flexible payment options.

    • Crypto payments using KAIA

Promotion & Marketing Support

  • TGE (Token Generation Event) Support : Launch your token with full promotional support through Dapp Portal, including exposure, campaign banners, and user engagement tools.

  • Reach LINE users directly : The Dapp Portal is connected to your LINE Official Account (OA), enabling visibility to millions of LINE users.

  • Campaigns & Events : Run reward campaigns, banners, and event pages to drive user acquisition and engagement.

  • LINE Messaging Integration : Send push notifications, event alerts, and re-engagement messages via LINE OA messaging.

Marketplace & Trading Features

  • NFT Marketplace Integration : Launch and sell your own NFT collections directly within your Mini Dapp.

  • Token Swap & On-ramp Support : Users can swap other tokens to KAIA or USDT, or directly purchase them using a credit card—no external services required.

Contact Us

Contact

If you have any inquiries regarding the Mini Dapp development, please contact us through the following channel.

📧 : [email protected]

📱 :

Join Us

1. 📝 Get Mini Dapp SDK

Mini Dapp SDK

Getting started is simple. Just agree to and submit the Terms & Conditions, and your Mini Dapp SDK will be issued in approximately 3 days. SDK Credentials will be delivered to the email address you've submitted.

WalletProvider, one of the features provided in the Mini Dapp SDK, is available to anyone upon request. You can apply through this link.

Kaia Wave

If you'd like support from the Kaia Wave team along with your Mini Dapp, please submit both the SDK Terms & Conditions and the Kaia Wave application form.

Go to page to submit SDK T&C and Kaia Wave >

2. 🧪 Develop Mini Dapp Demo

Please develop your Mini Dapp according to the provided checklist.

For any technical questions during development, feel free to contact us through the Telegram Tech Support Channel or via email at [email protected].

3. 🧾 Review & Feedback

Demo Submission

Please submit a testable demo for review. When submitting your demo, please include the following information:

  • Submission email address: [email protected]

  • LINE(LIFF) / Web Version URL

  • Desired launch date

Review & Feedback

Your submission will be reviewed and feedback will be provided within 3 business days.

4. 🤝 Onboarding Coordination

Once your demo is approved, the onboarding process for official launch will begin. A dedicated BD(Business Development) manager will be assigned, and you will receive onboarding guidance and next steps through them.

5. 🚀 Launching Mini Dapp

Once onboarding is complete, your Mini Dapp will be scheduled for official launch. We will coordinate with your team to finalize the launch date and ensure all technical and operational checks are complete.

Key launch steps include:

  • Publishing the Mini Dapp on the Dapp Portal with live LINE(LIFF) / Web Version URL

  • Optional promotions via reward events

  • Post-launch monitoring support for stability and performance

Please be ready to respond to any urgent issues during launch week. Our team will be available to support you throughout the process.

Fiat payments via Stripe

Apply for the Mini Dapp SDK

Release Note

Latest Version (v1.4.8)

  • npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.8

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.8.js

v1.2.3

Release Date

January 22nd 2025 01:00 in UTC

Note

https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.3

  • Fixed minor bugs

Integration Guide for Game Engine

Extra Packages

Policy

Policy

How to build successful Mini Dapp

Featured on Dapp Portal

The more the Mini Dapp meets the following requirements during onboarding, the more likely it will be featured in the Dapp Portal and attract more users. Please be sure to adhere to the requirements while developing the Mini Dapp.

Requirements

Provision of services in various environments with Mini Dapp Connect

Clients must build Mini Dapp wtih two types of LINE and Web version.

LINE version

LINE version can be built via LIFF SDK. Users can easily access your Mini Dapp through LINE Messenger without install or download application. Also, Users could invite their friends and create wallet with LINE account logged in.

We strongly recommend providing Wallet Connect only when needed, rather than on the initial screen, to reduce the drop rate of users accessing the LINE version. However, since wallet integration may be essential when offering rewards, it would be advisable to place the wallet integration button where it can be easily found.

User Flow : Access Mini Dapp(LIFF) -> Consent Channel -> Add OA -> Play Mini Dapp -> Wallet Connect (at neccessary steop e.g. payment, reward)

Web version

Mini Dapp must be build in Web version to users who does not familiar with LINE Messenger. Mini Dapp SDK provides integration of web environment including wallet connection via various social account, Kaia Wallet(Mobile App/Extension) and OKX Wallet.

In the case of the web version, Wallet Connect must be provided on the initial screen for account creation. Wallet Connect does not refer to LINE Login; it refers to wallet integration provided through the Mini Dapp SDK.

User Flow : Access Mini Dapp(Web) -> Wallet Connect -> Play Mini Dapp

Compatibility between LINE and Web version

The account system of the two versions of the Mini Dapp should operate based on the Wallet Address to ensure account compatibility between the two versions.

When connecting a wallet in the LIFF and Web version, if connection proceeds with Mini Dapp Wallet(LINE) or OKX Wallet, the Wallet Address will be the same across both versions, ensuring account information compatibility. However, the Web version's Mini Dapp Wallet(Kaia Wallet App/Extension and Social logins excluding LINE) cannot be compatible with LIFF's.

For example, User A has created Mini Dapp Wallet via LINE Account 'a' from Web version, It is same with LIFF's if user logged in LINE Messenger with LINE Account 'a'.

Provision of In-app item store

Mini Dapp SDK provide payment solution both of Crypto($KAIA) and Fait(STRIPE). To create your revenue model, an in-app item store must be established.

Provision of multi-language

Mini Dapp must provide English and Japanese for users as default. Other languages can be optional as your target country. Classification user country can be done in several ways. You can either follow the browser or system language settings set by the user or determine the country based on the accessed IP address, and based on this, you should provide the appropriate language.

Provision of Point Reward

Point rewards can enhance user loyalty. These points can be used as currency within the Mini Dapp and ultimately support exchanges with tokens issued by the Mini Dapp, providing a sense of economic benefit. This can lead to explosive growth for the Mini Dapp.

Provision of information about connected wallet

It is very important to make users aware of the information about the connected wallet on any screen of your Mini Dapp. Users may enjoy many Mini Dapps and want to connect different wallets for each. By providing intuitive information about which wallet is connected and what the balance is, you can enhance the convenience that leads to payments.

  • Wallet Type :

  • Wallet Address :

    • If it does not have connected wallet, use kaia_requestAccounts()

  • Wallet Balance :

Provision of payment status

It is very important to inform users about the payment progress status. After starting the payment using the payment creation API, the payment is processed and completed through communication with the payment gateway (PG). If the payment completion and item distribution notifications are not appropriately provided on the user's screen, they may not be able to confirm whether the payment was completed. Once the payment starts, a UI that shows the payment status should be provided during the payment process, and upon receiving the payment completion webhook, the process of distributing the items should be displayed on the payment screen.

Guide for Mini Dapp based on Landscape Mode

If your Mini Dapp is optimized for landscape mode, please ensure that it operates in landscape mode even when the user's device is set to portrait mode. It should also function in landscape mode when the auto-rotate feature is used.

Add To Home Screen

The Dapp Portal provides users with a shortcut to easily access the Mini Dapp on their mobile home screen.

"Add to Home Screen" feature is provided in two ways:

  1. Available on the Mini Dapp detail screen within the Dapp Portal.

  2. Provided by the Mini Dapp (the shortcut URL is provided by the Dapp Portal, and the Mini Dapp will develop a UI to integrate this URL).

    1. Shortcut URL : https://www.dappportal.io/shortcut.html?dappId=dappId&register=1&&openExternalBrowser=1 *dappId: please find it on your bridge page urls or contact support channel if you don't have. *register=1: required. *openExternalBrowser=1: If opening urls from LIFF, it allow ot open in external browser.

Provision of Maintenance Mode

Please provide a maintenance screen during scheduled or emergency maintenance of the Mini Dapp to enhance user experience. In the absence of any notification during maintenance or inaccessibility, it may cause confusion among users. It would be helpful to include the estimated end time and contact information for detailed updates on the maintenance screen.

Provision of Close Confirmation Dialog

If a user accidentally presses the back button while playing a MIni Dapp, the current progress may not be saved and the Mini Dapp could be closed unexpectedly. Displaying a confirmation popup when the page is about to be closed is recommended.

You can display a confirmation popup using the following code:

Example (React)

Insert the following code in your landing page or layout component:

Example (Vanilla JS - index.html)

LINE Front-end Framework (LIFF)

Mini Dapp should build web application as LINE version with LIFF SDK.

Introduction

Official Document : LINE Front-end Framework (LIFF)

Web app connecting with LINE users

The LINE Front-end Framework (LIFF) is a web application framework provided by LY Corporation. When you integrate the LIFF SDK into your web app, you will be able to access information provided by the LINE Platform or use functionalities provided by the LINE app.

Integration with LINE Login and the LINE Platform

LIFF is integrated with LINE Login. Without having to deal with complicated settings, you can safely access a user's profile information via the LINE Platform's authorization flow.

Share target picket: A powerful tool for sending messages

The share target picker is a tool for sending messages to LINE friends who you can select via LIFF app. Even without opening a chat room the developer can send messages to LINE friends, so you can use this feature to connect users with services, send information, and add social elements.

Cross-browser support

LIFF is cross-browser compatible. Most APIs are compatible with desktop browsers, so they will work both with regular web browsers as well as with LINE apps.

Providing utility

We're providing various convenient utilities to support LIFF developers. You can easily retrieve the LINE app's version or the OS type. We also provide a QR code reader out of the box.

Various screen sizes

For running on the LINE app we're providing three different screen sizes that each have their own advantages.

v1.4.8

Release Date

Nov 17th 2025 06:30 in UTC

Note

  • npm:

  • cdn:

What's improved

  • Bitget Wallet Integration Improvement

    • In the previous version, transactions signed on the mainnet were incorrectly displayed as being on the Kairos (testnet) network.

      This issue has now been fixed, and mainnet signatures will correctly display as “Kaia.”

Cancellation

STRIPE

  • Case.1 : In the case where create API is hosted but SDK's startPayment has not been excuted

    • Max time for cancellation : 2100sec + 180sec

    • Response if payment is excuted after cancellation : Error when hosting SDK's startPayment

  • Case.2 : SDK's startPayment is excuted but users don't approve on STRIPE page

    • Max time for cancellation : 400sec + 180sec

    • Response if payment is excuted after cancellation : Cannot payment excute with expiration

CRYPTO

  • Case1. In the case whare creat API is hosted but SDK's startPayment has not been excuted

    • Max time for cancellation : 2100sec + 180sec

    • Response if payment is excuted after cancellation : Error when hosting SDK' startPayment

  • Case2. SDK's startPayment is excuted but users don't approve transaction

Sample Mini Dapp

Explorer Various Mini Dapps from Dapp Portal

  • LINE Version : https://liff.line.me/2006533014-8gD06D64

  • Web Version : https://dappportal.io

    • Please open the link on LINE Messenger App from Mobile

Mini Dapp Demo

Please refer to below Mini Dapp Demo to build your Mini Dapp.

  • LINE Version:

  • Web Version:

v1.4.4

Release Date

Sep 5th 2025 09:30 in UTC

Note

  • npm:

  • cdn:

What's improved

  • Output error logs when not using the latest version of the Mini Dapp SDK (Note: these error logs do not affect the SDK's functionality).

  • Fixed the error occurring during the reconnect process after calling disconnectWallet(). (Bitget Wallet).

We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

Kaia Wave: Builder Support Program

Kaia Wave Overview

What is Kaia Wave?

Kaia Wave: Bridging Web2 and Web3

Kaia Wave is a builder support program, brought to you by LINE NEXT and the Kaia Foundation - formed by the recent merger of Kakao's Klaytn blockchain and LINE's Finschia blockchain, to onboard new, creative builders on the Kaia ecosystem.

v1.4.6

Release Date

Oct 15th 2025 06:00 in UTC

Note

Overview

Key Features

Mini Dapp is a web application developed based on the LINE messenger and Kaia Blockchain. It leverages the LINE user pool to provide diverse experiences and rewards to about 200 million global users. Unlike LINE MINI Apps, Mini Dapp can offer not only points and cash-like rewards but also Web 3-based rewards. Additionally, Mini Dapps can provide the same services to users who are not LINE users. Using LINE Messenger's Official Account for promotions and friend invites can help gather more LINE-based users.

Also, Mini Dapp should provide various functions including Play, Wallet, Payment and Reward. See the key features below.

Evaluation Criteria

We’ll be evaluating applications per the categories below.

  • Team

    • Team track record and market reputation for other projects

  • Product/Service

Mini Dapp

How to build Mini Dapp?

You can check the development scope required for implementing Mini Dapps in the diagram above.

LIFF version of the Mini Dapp must be implemented through LINE Developers. More details can be found in the LINE Integration menu.

The Mini Dapp SDK supports wallet integration and payment functionality. The wallet that connects may vary depending on the LIFF and web versions. Mini Dapps can sell in-app items through the payment feature.

Additionally, if you register your information through a separate track, you may be featured on the Dapp Portal and also sell NFTs.

Marketing Package

We offfer an all-in-one marketing solution that connects your DApp to over 196 million users through LINE Official Accounts, reward campaigns, and messaging tools.

Maximize Exposure on Dapp Portal

  • Dapp Portal will be the central hub where users can discover, engage with, and earn rewards from your Dapp.

Qualifications and Requirements

Dapp Categories

  • Consumer Dapps with user rewards (Dapp points, NFTs and tokens)

  • No category restrictions (some DeFi Dapps may require regulatory and compliance check prior to onboarding)

v1.4.5

Release Date

Sep 22nd 2025 07:00 in UTC

Note

v1.3.6

Release Date

July 8th 2025 09:00 in UTC

Note

Fixed minor bug of openPaymentHistory() function

v1.2.5

Release Date

February 4th 2025 07:30 in UTC

Note

v1.2.1

Release Date

January 21st, 2025 06:00 in UTC

Backend

v1.4.1

Release Date

August 19th 2025 09:00 in UTC

Note

Fungible Token Information

If you want to expose it in the Dapp Portal Wallet or Kaia Wallet's search list, please submit it.

Token Name

  • English Only

v1.2.4

Release Date

January 23rd 2025 09:30 in UTC

Note

v1.3.0

Release Date

May 27th 2025 06:00 in UTC

Note

Mini Dapp SDK v1.3.0 provide Bitget Wallet as one of walletType.

v1.2.13

Release Date

May 20th 2025 07:00 in UTC

Note

This version has been deployed to improve the Dapp Portal and internal functions.

v1.2.9

Release Date

March 6th 2025 05:00 in UTC

Note

NPM :

v1.2.10

Release Date

April 7th 2025 10:00 in UTC

Note

NPM :

v1.3.4

Release Date

June 12th 2025 06:00 in UTC

Note

This version is deployed for the purpose of improving Dapp Portal's feature.

v1.2.6

Release Date

February 12th 2025 05:30 in UTC

Note

v1.3.8

Release Date

July 11th 2025 07:30 in UTC

Note

Fixed minor bug for Kaia Wallet(App).

How to Get SDK Authorization

To integrate Mini Dapp SDK, you need to get clientId and clientSecret from Dapp Portal team.

1. Sign contracts with Dapp Portal team.

v1.3.5

Release Date

June 16th 2025 05:30 in UTC

Note

A feature has been deployed to provide for the Bitget Wallet.

v1.4.2 & v1.4.3

Release Date

August 21st 2025 09:00 in UTC

Note

This version is deployed for the purpose of improving Dapp Portal's feature.

v1.2.2

Release Date

January 21st 2025 15:00 in UTC

Backend

v1.3.1

Release Date

May 27th 2025 06:00 in UTC

Note

Minor improvement for Bitget Wallet has been released

  • Max time for cancellation : 100sec + 180sec

  • Response if payment is excuted after cancellation : Transaction failed with paying gas fee if approved

  • Case3. SDK's startPayment is excuted and user approved transaction over max time for cancellation

    • Max time for cancellation : 100sec + 180sec

    • Response if payment is excuted after cancellation : Transaction failed with paying gas

  • Kaia Wave builders will access more than 200M+ LINE Messenger users who will soon be able to experience everything from wallet creation to using Dapps, trading FTs/ NFTs, referring Dapps to their LINE friends – all within LINE messenger.

    We’re looking for builders with a novel idea or service that will be able to harness the attention of LINE users and become a crucial part of their everyday lives, so that we can create something that’s more than a point farm.

    Who can Apply?

    Kaia Wave is for web3 builders that aim to contribute in adding value to the Kaia and LINE ecosystem.

    Below are a few required factors we expect from applicants.

    • Projects that develop consumer Dapps with user rewards (required)

    • Projects that plan to issue tokens and/or NFTs native to the Kaia Blockchain (required)

    • Projects that plan to build Kaia-native Dapps (required)

    Below are some points we think are great qualities

    • Projects that are ready to bring in the mass with their killer Dapps

    • Clear KPIs and objectives for long-term growth in the Kaia ecosystem

    • Showcase the uniqueness and innovative nature compared to existing Dapps

    • Able to execute local and/or global marketing for your project

    Kaia Wave Benefits

    Kaia Wave aims to support the onboarding of Dapps by offering multifaceted marketing support to reach both Web2 and Web3 users. This support is powered by channels such as LINE Messenger, Kaia Wave partners and other vertical services provided by LINE NEXT. The following support will be provided to teams who provide FTs only -- if FTs are not provided, the provision of support will be consulted separately between builders and Dapp Portal.

    Marketing Package

    • An all-in-one marketing package that leverages LINE Messenger, Kaia Foundation & LINE NEXT’s Web3 creator alliance and owned channels to reach Web2 and Web3. More information here.

    Platform Support

    • Mini Dapp SDK — All necessary tools for deploying your Mini Dapp that provides a seamless Dapp user experience. Mini Dapp SDK will only be shared with selected applicants only.

    • Gas-less Tx Support — working with bundler partners, and utilizing the gas fee support program(link), we will provide gas-less transactions for Mini Dapp builders, ensuring a seamless UX for users.

    Tokenomics Support

    • support ranging from provision of initial liquidity at TGE to assisting the fast-track token listing reviews on CEXes.

    Connection to VC Partners

    • Introduction to VCs and investors to pitch project/product for token and/or equity investment for select partners.

    Extensive Tech Support

    • On-the-hands tech support from our dedicated team members to assist in smooth Mini Dapp onboarding.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.6

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.6.js

  • What's improved

    • We added a safeguard that rejects payment requests when the connected wallet's chainId does not match the payment environment (mainnet/testnet).

      • Testnet: chainId: 1001, testMode: true

      • Mainnet: chainId: 8217, testMode: false

      • Any other combinations will result in a payment error.

      • When a payment error occurs, the SDK automatically detects the issue and throws an exception to the developer’s code. The following messages may appear in the log:

        • The payment is set to test mode, but DappPortalSDK is initialized with mainnet (8217).

        • The payment is set to non-test mode, but DappPortalSDK is initialized with testnet (1001).

    Mass adoption potential based on service intuitiveness, user accessibility, and overall appeal.

  • Engagement drivers such as social virality, gamification, originality, and trend alignment.

  • Tokenomics

    • Ecosystem / Dapp Tokens

      • Native issuance of the token on the Kaia Blockchain

      • Airdrop plans and roadmap within the Kaia/LINE ecosystem

      • Sustainability, listing potential on DEX/CEX, and contribution to the Kaia ecosystem

    • NFT

      • Roadmap for integration with the Dapp Portal NFT Marketplace

      • Dapp integration and potential to generate meaningful trading volume

  • Marketing Capacity

    • Strategy for integrating LINE-related marketing campaigns

    • Utilize pre-existing owned/collaborative channels for Mini Dapp promotion

  • Your Dapp will be featured across the portal, including banner placements on the Reward and Play tabs.

    LINE OA (Official Account)

    • Your Dapp will be featured on our Global OA Channel, reaching over 2.2 million users worldwide during its launch or other major milestones.

    Social Media Amplification

    • Promote your Dapp and campaigns on Dapp Portal and Kaia Foundation’s X (ex-Twitter) and community channels.

    • Join the AMA panel with partnered Web3 content creators

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.5

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.5.js

  • What's improved

    • OA Promotion Phase 2 Support

      • To further enhance user circulation within the Mini Dapp ecosystem, we are conducting the second phase of the Dapp Portal OA Popup event. This popup promotes USDT rewards and aims to encourage cross-promotion among various Mini Dapps.

      • Partners interested in joining the promotion cycle are welcome to contact @dappportal_official.

    • Resolved an issue where the screen appeared blank when scrolling during MiniDapp Connect.

    • Updated all Payment API processes to run as non-cancellable jobs, ensuring more stable and reliable execution.

  • npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.6

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.6.js

  • If you have not yet completed domain verification for using the Bitget Wallet, please refer to this guide.

    We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.1

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.1.js

  • Added the Dapp Portal’s OA Popup event to support the user circulation loop across the Mini Dapp ecosystem. The popup promotes USDT rewards and encourages cross-promotion among Mini Dapps.

    Partners interested in joining the promotion cycle are welcome to contact @dappportal_official.

    Token Ticker
    • eg) Bitcoin - BTC

    On Kaiascan

    • The contract address where the FT (Fungible Token) has been deployed.

    Token Image

    • Please upload the token image into the box.

    Response from getWalletType() is WalletType.BITGET.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.0

    cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.0.js

    • In order to provide the Bitget Wallet through the Mini Dapp SDK, SDK upgrade is required.

    • No code changes are necessary.

    • Please follow this guide to complete domain verification before upgrading the SDK version, and submit the ProjectId through the Tech Support channel.

    There is no impact on Client's side.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.13

    cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.13.js

  • npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.4

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.4.js

  • We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.8

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.8.js

  • If you have not yet completed domain verification for using the Bitget Wallet, please refer to this guide.

    We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    2. Submit agreement of SDK terms and conditions with Mini Dapp's Information

    3. Get clientId and clientSecret via email which has been submitted on step2

    clientSecret is very important information, so please be careful to avoid any external leakage. If you suspect that it has been compromised, it is recommended to consult with the Dapp Portal team and renew the key.

  • npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.3

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.3.js

  • We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.1

    cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.1.js

    • If client has registered ProejctId with SDK, Bitget Wallet is supported

    • Else, Bitget Wallet is not supported. (Exceptionally, if the Bitget Wallet Extension is installed in the PC environment, Bitget is provided; however, if domain verification and ProjectId registration are not completed, an error will occur.)

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.8
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.8.js
    https://liff.line.me/2006880697-nWPg5LpZ
    https://minidapp-demo.dappportal.io/
    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.4
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.4.js
  • Changed the 408 error that occurs during long polling timeout to response as 202.

  • Enhanced it to explicitly trigger an error when requesting kaia_signLegacy with the OKX wallet.

    • (Optional) To receive the changed responses, you need to update the SDK version to v1.2.5.

  • Resumed testMode: true.

    • An SDK version upgrade is not necessary. You just can use the test environment by setting the testMode as 'true' when requesting the payment create API.

  • https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.5
  • Fixed intermittent iOS Wallet Connection (LIFF) failures and Mini Dapp crashes when attempting Wallet Connect.

  • For STRIPE and CRYPTO payments in a CONFIRMED state where the payment finalize API has not been called, automatically change the status to FINALIZED within 5 minutes (improvement for normal settlement).

    • To prevent issue #1, we strongly recommend upgrading the SDK to version 1.2.1. (No additional code changes are required.)

    • Issue #2 is outside the scope of developer responsibility.

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.1
  • Fixed error while connecting and signing from OKX Wallet.

  • Fixed error for 'Buffer is not defined'

  • https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.4
    CDN : https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.9.js
    • Supported gas fee delegation from OKX Wallet

    To apply gas fee delegation from OKX Wallet, an SDK version upgrade is mandatory.

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.9
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.6.js
    • Updated OKX Wallet version to v1.7.4 @okxconnect/ui sdk.

    • Added the flow to return to LINE after completing the OKX request when using LIFF browser.

    • Fixed error whlie initializing OKX Wallet

    Error in WalletProvider request TypeError: Cannot read properties of null (reading 'request') Uncaught (in promise) {code: -32603, message: 'Internal JSON-RPC error.')

    • Improved connection UI of OKX Wallet to Mini Dapp's name and icon

    To apply the above improvements, an SDK version upgrade is mandatory.

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.6
    Additionally, a bug has been fixed where openPaymentHistory() was not functioning correctly during Bitget Wallet connected.
    • npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.5

    • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.5.js

    If you have not yet completed domain verification for using the Bitget Wallet, please refer to this guide.

    We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    Gas Fee Delegation
  • Fixed intermittent wallet connection failures and Mini Dapp crashes on iOS when calling LIFF Wallet.

  • To resolve this issue, please upgrade Mini Dapp SDK version to v1.2.2. No code changes are required without upgrade.

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.2
    Service Environment

    Mini Dapps need to create web applications utilizing a specific framework.LIFF version for users who access via LINE Messenger and web version for users who access via Non-LINE Messenger.

    • Mini Dapps must be built as two versions to cover broader regions.

      • The reason for developing the Mini Dapp in both LIFF and Web versions are as follows: In certain countries, it may be difficult or impossible to use LINE Messanger. Additionally, Web3 users may prefer not to use LINE version. Therefore, we request the separate development of a web version for these countries and Web3 users.

      • Mini Dapp - LIFF is the version that runs the application within LINE Messenger (for LINE users).

      • Mini Dapp - Web is the version that runs the application on the web browser (for non-LINE users).

    LINE Integration

    Dapps deployed in other chains may also apply, however; extra pointers for Kaia-native Dapps

    Dapp Build

    • Required to have two versions—(1) LINE and (2) Web versions

    Other Requirements

    • Dapps onboarded to the platform are strongly encouraged to issue fungible tokens (FT) on Kaia Chain. If token issuance is not feasible, the Dapp must support in-app item (IAP) sales and select either an IAA or NFT feature. Prior consultation is required if neither IAA nor NFT can be implemented.

    • Dapps that issue fungible tokens (FT) are required to allocate a portion of their Dapp or ecosystem tokens under the Kaia Wave onboarding program.

    • Dapps must submit their FT launch plans and undergo prior consultation before the Token Generation Event (TGE).

    • Only payment and wallet connection methods provided through the Mini Dapp SDK may be used.

    • All Dapps must adhere to the compliance standards outlined in our Review Guidelines.

    • Additional requirements may apply. Please refer to the Review Guidelines for full details

    CDN : https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.10.js
    • UX has been improved for Wallet Connect

    We have improved the user experience for Wallet Connect. By providing options for connecting Wallet Connect on a single screen, we have reduced the number of steps and also offer information about the recently used methods.

    Dapp Portal

    No code changes are needed to use this feature, but upgrading the Mini Dapp SDK is essential.

    Upgrade the Mini Dapp SDK and provide the improved experience.

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.10
    getWalletType()
    kaia_accounts()
    kaia_getBalance()
    create payment API >
    payment status >
    Web3.0 PvsZ | Mini Dapp
    Web3.0 PvsZ | Mini Dapp
    Web3.0 PvsZ | Mini Dapp
    Wizzwoods | Mini Dapp, Midnight Survivors | Mini Dapp
    Dapp Portal
    Bombie | Mini Dapp, Heroicarena | Mini Dapp, SuperZ | Mini Dapp
    Elderglade | Mini Dapp
    Elderglade | Mini Dapp
    Snake Online | Mini Dapp
    Add to Home Screen | Dapp Portal
    Add to Home Screen provided by Mini Dapp
    Maintenance Mode | Sample

    v1.3.7

    Release Date

    July 10th 2025 08:00 in UTC

    Note

    In version 1.3.7, the Mini Dapp SDK has been updated to work properly within the in-app browser of the Kaia Wallet (App).

    • npm:

    • cdn:

    If you have not yet completed domain verification for using the Bitget Wallet, please refer to .

    We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    LINE Developers

    Integrate LINE Platform

    There are 9 steps that need to be taken to build a Dapp via LIFF.

    Sign up LINE Business Developers account using your LINE Account or business account. You can use this account when you integrate LINE services to your Mini Dapp.

    Register Developer name and email to LINE Developers account to create a developer account. When you first log in to the LINE Developers, You need to register name and email address.

    A Provider can be an individual, company or organization that provides services through the LINE Platform.

    A Channel is a communication path between the LINE Platform’s functions and a provider’s services. Channels must have a name, description and icon image. You MUST select LINE Login type when you create Channel to build LINE Mini Dapp. Blockchain Service and LINE MINI App type are not related to Dapp Portal.

    You should create LINE Official Account to use Messaging API which is to be integrated to Channel you’ve created from Step 4.

    Please select "Company or owner's country or region" as the actual country of origin for Mini Dapp publisher.

    If you have created successfully LINE Official Account from Step5, you should enable Messaging API function on LINE Official Account Manager – Setting page. When enabling the use of Messaging API in the LINE Official Account Manager, a Messaging API channel is created on LINE Developer’s console under same Provider automatically.

    07. Integrate Official Account to LINE Developer’s Channel

    Once Messaging API is enabled, you can link Official Account to Channel on Basic setting page.

    To use LIFF SDK, You need to add the Mini Dapp URL to your channel and get LIFF ID. You can set LIFF applications on LINE Developers Console – Channel – LIFF tab.

    If you’ve completed Step 8, You can build Mini Dapp as LIFF version using LIFF SDK.

    Essential Settings

    Setting for data collection from LIFF via Mini Dapp SDK

    • Go to LINE Developers console

    • Click Channel which integrate LIFF

    • Click LIFF app name

    • Edit Scope checked with 'openid'

    To use features such as URL sharing, minimizing the browser, and page refresh within your LIFF Version, you need to enable the action button.

    How to set it up: Go to LIFF settings > Options > Module mode > Disable

    • The action button is only available where Module mode is turn off.

    When playing a Mini Dapp in a chat room, the user may want to perform another action, such as sending a message to the chat room. In this case, minimizing the LIFF browser will suspend playing the Mini Dapp and allow the user to perform the action without disconnetion from Mini Dapp. After performing the action, the user can resume playing the Mini Dapp by maximizing the LIFF browser.

    About Kaia

    About Kaia

    Formed through the merger of the Klaytn and Finschia blockchains initially developed by Kakao and LINE respectively, Kaia brings Web3 to the fingertips of hundreds of millions across Asia.

    Key aspects of Kaia Blockchain:

    • Blazing Fast - Kaia has the lowest transaction latency amongst leading EVM L1s with 1-second block time and immediate finality, enabling snappy user experiences and opening possibilities for use cases that require near-real-time responsiveness.

    • Seamless - Support for account abstraction, gas fee delegation, and integration with the LINE and Kakaotalk messenger apps massively simplifies the user onboarding and usage experience, and gives Kaia builders instant access to over 250 million users.

    • Interoperable - EVM equivalence, planned support for CosmWasm, and integration with industry leading cross-chain bridges gives developers unparalleled flexibility and users a borderless ecosystem that embraces all of Web3.

    More information about Kaia can be found in the official .

    Mini Dapp SDK

    Authorization

    Mini Dapp must get clientId and clientSecret to integrate Mini Dapp SDK. This credentials can be activated once service domain has been registered to clientId.

    Create Project

    To officially open the Mini Dapp, registration of a service domain is mandatory. Be sure to request registration after getting service domain.

    If a service domain for the application has not been built, you can use the local environment path for testing. Please use http://localhost:3000.

    To use the paymentProvider, a clientSecret is required. DO NOT share clientSecret to public. If it has been exposed, please request to issue a new clientSecret.

    Install SDK

    Add Mini Dapp SDK into your project via npm or yarn.

    or

    Initiate SDK

    Mini Dapp MUST call DappPortalSDK.Init() when the user executes Mini Dapp. In case of LIFF version, the must be done after liff.init() is completed.

    At this stage, you only need to implement up to DappPortalSDK.Init() and completing the Mini Dapp Connect is not required at this stage. Mini Dapp Connect(Wallet Integration) within the LIFF environment should only be triggered when necessary (e.g., to receive on-chain rewards, make item purchases), not upon initial LIFF entry.)

    • Background : This approach is necessary to handle data for active user verification in the Mini Dapp. This data is crucial for performance measurement and developing user acquisition strategies.

    • Notice : Following this guide will provide LINE NEXT with the encrypted information of LINE users connected to the Mini Dapp.

    class DappPortalSDK

    1. DappPortalSDK(config: DappPortalSDKClientConfig)

    • Initialize SDK using clientId.

    • The previously provided clientId is used. The SDK only runs on the pre-agreed Host address.

    DappPortalSDKClientConfig

    • clientId: string

    • chainId: string

    • SDK is running on production env basically. If you want to connect testnet, use ‘1001’.

    2. getWalletProvider(): WalletProvider

    • You can get WalletProvider which is compatible with EIP-1193 interface.

    3. getPaymentProvider() : PaymentProvider

    • You can get PaymentProvider which support process and history of payment.

    4. isSupportedBrowser(): boolean

    • It is function to verify compatibility between SDK and Browser.

    5. showUnsupportedBrowserGuide(): Promise

    • It will show a screen how to use an external browser if current browser is not supported.

    Design Guide

    Set Browser Tab Name

    To indicate that it is a family service of the Mini Dapp ecosystem, please set the browser tab name in the format asName | Mini Dapp.

    Set OpenGraph

    The LIFF/Web URL of the Dapp can be utilized across various marketing channels. If Open Graph is not set up, it may reduce the effectiveness of content delivery. Therefore, please ensure that Open Graph is properly configured. Without it, blank spaces or alternative text may appear where the link is displayed.

    Connect Button design

    If Wallet Connect is integrated when initiating specific actions (such as Buy, NFT Airdrop, FT Airdrop, etc.) rather than using a standard button, please ensure that Wallet Connect is triggered when those actions are executed. It is acceptable for Wallet Connect not to be initiated based on the button guidelines provided. However, if you create a button similar to Wallet Connect, please make sure to adhere to the aforementioned guidelines.

    Set z-index for pop-up

    z-index for SDK's pop-up to prevent blocking new windows from Browser set as '999'. Please set your z-index for any pup-up under '999' to avoid conflicting between pop-up's

    Domain Verification via Reown

    How to work Bitget Wallet from Mini Dapp SDK

    Flowchart

    The Mini Dapp SDK provides Bitget Wallet via WalletConnect. To offer Bitget Wallet through the Mini Dapp SDK, the domain verification required by WalletConnect must be completed beforehand.

    Please follow the guide below to complete the domain verification and share the ProjectId generated by Reown with the Dapp Portal team.

    ❗Even if you upgrade to the SDK version that supports Bitget integration, you will not be able to use Bitget Wallet unless the domain registration and ProjectId submission are completed.

    Guide to add your domain via Rewon Dashboard

    References.

    • Domain should be registered entirely including protocol, http:// | https://

    • Please ensure that a slash (/) is notincluded at the end of the domain when registering the record.

    1. Access Reown Dashboard and Initiate Verification

    • Log into your Reown account on the dashboard. ()

    • Go to Domain tab

    • Add domains you wish to add as allowlist

    2. Submit ProjectId to Dapp Portal team

    • Sumit ProjectId after verification to add it to Mini Dapp SDK.

    • Telegram: @dappportal_official

      • If you are using a technical support channel through a different route, you can share ProjectId through that channel.

    Upload NFT Information

    A. Pre-reveal(Optional)

    This feature is used when original content needs to be disclosed at a specific time. It is unnecessary if the NFT at the time of purchase is the same as the one being held.

    Collection Name

    • Please enter one of the issued collections.

    • English Only

    Description

    • List of Supported languages in the Dapp portal

    • All languages are required.

    Pre-reaveal Image

    • Image Size: 600x600

    B. Original Contents(Mandatory)

    Collection Name

    • Please enter one of the issued collections.

    • English Only

    Image

    • Image Size: 600x600

    Meta

    • Please input the NFT's metadata in the specified format and upload it.

    • Meta Data Format

    • Guidelines for Meta data

      • Please write the NFT name within 50 characters.

      • The description can be up to 1,000 characters.

      • You can add up to 30 attributes.

    If you need to set values outside of these specifications, please let us know.

    Revealed date

    • ex) yyyy-mm-dd tt:mm (in UTC)

    Dapp Portal

    Home

    To be listed on the Dapp Portal, registration of information through Ops Support is required. Additionally, the Dapp Portal evaluates the completeness and reward systems of each Mini Dapp comprehensively and places them in prominent positions."

    Trade

    Dapp Portal provides exchange services for FT which is issued by Mini Dapp. Also, Dapp Portal supports on-ramp(Purchase) and off-ramp(Cash Out) to users who are unfamiliar with Web3 assets.

    Market

    The Dapp Portal offers an NFT marketplace that is not provided in the Mini Dapp's in-app item store. If you wish to create and sell NFTs, you must submit the information according to the Ops Support guide. NFTs that are self-issued without following the guide will not be listed on the Dapp Portal.

    My

    In the My tab of the Dapp Portal, you can check your owned assets and view popular Mini Dapps or Mini Dapps you have previously visited.

    v1.2.0

    Green > Mandatory to be applied to Mini Dapp's code

    Blue > Optional to be applied Mini Dapp's code if Mini Dapp need to new function.

    Release Date

    January 20th, 2025

    Back End

    • Wallet

      • Improved response so that clients can clearly aware for the cancellation and closing options of the popup.

    • Payment

    Web

    • Wallet

      • Improved response so that clients can clearly aware for the cancellation and closing options of the popup.

      • Fixed UI bug if Mini Dapp name includes character of '

    Mini Dapp SDK

    • Wallet

      • Improved response so that clients can clearly aware for the cancellation and closing options of the popup.

      • Fixed UI bug if Mini Dapp name includes character of '

      • Fixed z-index onto popup to proceed sign if bocked

    Mobile, Extension

    • Wallet

      • personal_sign() is supported.

    v1.3.3

    Release Date

    June 10th 2025 07:20 in UTC

    Note

    Bugs that may occur in Mini Dapp SDK v1.3.0 and above have been fixed.

    npm:

    cdn:

    [No issue] When there is sufficient interval between initializing SDK and calling methods

    [Issue] Methods are not executed properly. (It occurs when called immediately after initializing SDK)

    If you are experiencing the above issue, please update Mini Dapp SDK version to v1.3.3.

    We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    v1.2.11

    Release Date

    April 10th 2025 06:00 in UTC

    Note

    NPM : https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.11

    CDN :

    The bug has been fixed where requesting kaia_accounts() would show the wallet connection screen when there was no connected wallet, and the Client would respond with [].

    Starting from Mini Dapp SDK v1.2.11, when requesting kaia_accounts() with no connected wallet, the Client can get response with [] without showing the wallet connection screen.

    Developers Resources

    Kaia Docs

    • Overview: Kaia Docs

    • Developer Hub: Developers | Build dApps on Kaia

    • Public RPC Endpoint:

    • Oracles:

    • Indexers

    • Explorers:

    • Bridges

      • Stargate:

      • Wormhole:

    • Others

      • Safe Treasury Management: Available via .

      • Multichain Expansion (EVM): Available via OFT standard from and bridge technology via .

      • Multichain Expansion (EVM + non-EVM): Available via .

    GRAC(South Korea)

    Purpose

    For users accessing from IP based on South Korea, only Mini Dapps that have obtained a reting classification from GRAC(Game Rating and Administration Committee) may be served normally.

    If a Mini Dapp is game-like and lacks a valid rating, Users from Korean IPs will see a "This service is not available in your country" notice and access will be blocked when users execute the Mini Dapps.

    You can find detailed policies on the GRAC website.

    Scope

    • Applies to Mini Dapps with game-like characteristics (core game mechanics such as progression, rewards, competition, chance-based items, etc.).

    • Non-game utilities are generally out of scope, subject to review.

    Effective Date

    • Start Date: From August 22, 2025

    Policy Summary

    • Allow: Korean IP AND approved GRAC Status

    • Block: Korean IP AND no approved GRAC status

    • Exception: Non-game Mini Dapp

    What Developers Must Provide

    • GRAC rating info (rating, decision number, decision date)

    • Evidence (certificate PDF/image and/or official lookup URL)

    Checklist for determining whether it qualifies as a game contents

    Characteristics
    Description

    Collection Information

    Collection Name

    • Displayed in A of the Screen Sample

    • English Only

    Token Symbol

    • Symbol of Collection

    • eg) Collection: Bellygom World Official / Symbol: BELLYGOM

    Collection Description

    • Displayed in B of the Screen Sample

    • The multilingual language support is: EN (English), JA (Japanese), TH (Thai), TW (Traditional Chinese). All the lanuages must be filled.

    Create Earning

    • Create Earning: Fee information received by the Creator in C2C transactions

    • Wallet Address | %(Fee)

      • Create Earning fee can be set between 1% and 10%

    Drops Earning

    • Drops Earning: Fee information received by the Mini Dapp in B2C sales

    • If it is the same as the Wallet Address entered for Create Earning, you may leave it blank

    • Wallet Address

    Collection Main Image

    • Displayed in C of the Screen Sample

    • Please select and upload the main image from the Origin contents (NFT images).

    • Image Size: 408x408

    Collection Background Image

    • Displayed in D of the Screen Sample

    • Image Size: 1125x459

    Reward System Flow

    Reward system flow

    Mini Dapp can list the mission-reward(KAIA/USDt, NFT, point) implemented within their Dapp on the Dapp Portal. Each reward is listed and tracked on the Dapp Portal in the following ways.

    KAIA/USDt Reward

    The Dapp Portal tracks the transactions of the EOA Wallet (for rewards) submitted by the Dapp. When a transaction of a specific amount occurs from that wallet to a specific user's wallet, the portal recognizes that the mission has been completed and the reward has been distributed. Due to this characteristic, a separate wallet must be prepared for each mission if you are running multiple missions. If the same wallet is used for rewards for multiple missions, the Dapp Portal will not be able to recognize which mission was completed.

    *Reward distribution for mission completion must be implemented by the Dapp. For information on sending KAIA or USDt, please refer to .

    NFT Reward

    The Dapp Portal tracks the transactions of the EOA Wallet from which the NFT submitted by the Dapp is distributed and references the contract address. The EOA Wallet must be submitted to the Dapp Portal team when minting the NFT, and the Dapp Portal team will airdrop the NFT to that wallet.

    *Due to the functionality of the Dapp Portal, tracking is only possible when a single NFT is distributed in a single event.

    Point Reward

    The Dapp Portal does not currently track the flow of point rewards. It simply lists a URL to the page where points can be acquired. The policy and features regarding point movement and balance tracking may change in the future.

    Initiate DappPortalSDK

    Initiate SDK

    1. Initialize SDK via init() method

    import DappPortalSDK from '@linenext/dapp-portal-sdk'
    
    const sdk = await DappPortalSDK.init({ clientId: '<CLIENT_ID>', chainId: '1001 });

    Parameters

    Name
    Description

    Response Returns a DappPortalSDK object through which the following methods can be called.

    method name
    description

    We highly recommend executing DappPortalSDK.init() only once and managing it as a singleton object. If you create a new DappPortalSDK object by calling DappPortalSDK.init() every time you make a request to the wallet, it may lead to malfunction. The reason we do not enforce this as a singleton is to support scenarios where multi-configurations are needed. For example, if you want to use both testnet and mainnet in a single app. In such cases, we also recommend managing one singleton DappPortalSDK object for testnet and another singleton for mainnet.

    v1.2.8

    Mini Dapp SDK v1.2.7 has been released as an internal improvement version.

    Release Date

    February 27th 2025 08:30 in UTC

    Note

    Mini Dapp Information

    Mini Dapp Name

    • Displayed in A of the Screen Sample

    • English Only

    v1.2.12

    Release Date

    April 23rd 2025 07:30 in UTC

    Note

    We strongly recommend upgrading to this version of the Mini Dapp SDK.

    Collection & Drops

    1. Submit Information for NFT Collections and Drops

    You should submit information for NFT Collections and Drops if you have plan to launch NFT Drops or NFT Airdrop. You can see the contents what you need to submit.

    • Meta Data Format

    Playbook for Teams

    Ranking & Metrics

    To maximize your score, you must excel at increasing weekly on-chain active accounts, weekly on-chain transactions, and Mini Dapp revenue.

    There are a few points to keep in mind:

    • On-Chain Active Accounts:

    v1.4.0

    Release Date

    July 25th 2025 08:00 in UTC

    Note

    Invite Friends

    Guide

    Invite friends feature is only available in Mini Dapp (LIFF).

    
    useEffect(() => {
        const preventGoBack = () => {
            if(window.location.pathname === '/') {
                const isConfirmed = confirm('Are you sure you want to go back?');
                if (!isConfirmed) {
                    history.pushState(null, '', window.location.pathname)
                }
            }
        };
    
        window.addEventListener('popstate', preventGoBack);
    
        // Remove listener when unmounted
        return () => {
            window.removeEventListener('popstate', preventGoBack);
        };
    }, []);
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8" />
      <title>Back Button Blocker</title>
    </head>
    <body>
      <h1>Home</h1>
    
      <script>
        if (window.location.pathname === '/') {
          history.pushState(null, '', window.location.pathname);
        }
    
        function preventGoBack(event) {
          if (window.location.pathname === '/') {
            const isConfirmed = confirm('Are you sure you want to go back?');
            if (!isConfirmed) {
              history.pushState(null, '', window.location.pathname);
            }
          }
        }
    
        window.addEventListener('popstate', preventGoBack);
    
        window.addEventListener('beforeunload', () => {
          window.removeEventListener('popstate', preventGoBack);
        });
      </script>
    </body>
    </html>

    To achieve a higher score on user metrics, we assign greater weight to users who hold more than a certain amount of KAIA tokens (e.g., 1 KAIA). Additionally, they must continuously maintain a minimum KAIA balance (e.g., 1 KAIA) sufficient to cover multiple transaction fees.

  • Users must send at least one transaction to the Mini Dapp’s smart contract during the week.

  • Given these conditions, builders should focus on the following strategies:

    • Distribute KAIA to as many users as possible.

    • Ensure that smart contracts, including Mini Dapp’s basic contracts for payments, tokens, and NFTs, are optimized for on-chain activity. It’s advantageous to encourage as many on-chain activities as possible, especially transactions related to asset transfers, such as swaps.

    These smart contracts will be tracked based on the smart contract addresses submitted to the Kaia Portal. Therefore, ensure you submit a comprehensive list of contracts via the following link: Kaia Portal - Elevating the Web3 Experience. To check if your submitted contracts are properly tracked on the Growth Competition dashboard, please refer to the following link: https://dune.com/queries/4773070

    If you’ve already submitted contracts, you can send the labels and addresses of new smart contracts to [email protected], and they will be updated within a week.

    • Avoiding Over-Focus on On-Chain Transactions:

      • Overemphasizing on-chain transactions is unnecessary, as they carry less weight.

      • Transactions sent directly by Mini Dapp operators will be filtered out.

    • Prohibited Activities:

      • Do not engage in fraudulent activities such as bot-generated actions.

      • Data will be monitored in real time. If excessive bot activity is detected, the Mini Dapp will be disqualified from the Growth competition.

    • Revenue:

      • Using crypto payments can be advantageous for generating on-chain data, although no extra weight is assigned to crypto payments.

      • To encourage user participation, prioritize stability and make it easy for users to connect their wallets and complete payments.

    Timeline

    To achieve a high score in Phase 2 (March - April) and secure a spot in the Top 10, it’s essential to:

    • Attract users with KAIA holdings starting from March 5 (or distribute KAIA via airdrops).

    • Drive on-chain activity and generate revenue early to maximize weekly scores.

    • The Top 10 Mini DApps will be announced on April 18, based on average weekly scores from March 5 to April 16.

    • To participate in the April Growth Competition, Mini DApps must be active for at least three weeks during this period, meaning they must launch no later than March 25.

    Among these, two Mini DApps will be selected on April 21 to receive Growth Packages, including $0.5M in marketing support and $0.1M in liquidity support.

    FAQ

    • What are the weights of each metric?

      • Currently, active accounts and revenue are given higher weights than other metrics.

    • Is the ranking overall, or are there separate sector rankings?

      • At this stage, rankings are overall rankings. Sector-specific leaderboards may be introduced in future seasons, such as Kaia Wave Season 2.

    • What is the criteria for abuse?

      • Any transaction or account deemed not to be from a real user will be excluded. This includes bot activity or suspicious patterns.

    • Are transactions sent by Dapps themselves included?

      • No, only transactions initiated by users are counted.

    Entertainment Purpose

    Is the primary purpose of the Mini Dapp to provide entertainment or fun?

    Interactivity

    Do different outcomes occur based on user actions?

    Rules System

    Are there clear rules and constraints?

    Progression Structure

    Is there a game-like flow with start, progress and end?

    Challenges and Achievements

    Are there obstacles to overcome and a sense of accomplishment?

    Review Guidelines | LINE's Mini Dapp Docs
    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.7
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.7.js
    this guide
    website

    Each attribute's trait_type should be within 15 characters.

  • Each attribute's value should also be within 15 characters.

  • 1KB
    meta sample.csv
    Open
  • Added payment status change webhook.

    • Docs >

  • Improved parameters of createPayment

    • Disallow whitespace charaters in lockUrl and unlockUrl

      • You need to include lockUrl, unlockUrl as null even if you have no data to this field

    • Added validation check for Urls

    • Added paymentStatusChangeCallbackUrl

      • confirmCallbackUrl can be used up to version 1.2.0.

    • only 'false' can be used for testMode

  • Fixed price bug for payment history page

    • This z-index set as '9999999'. Please set your z-index for any popup under '9999999' to avoid conflicting between popup's.

  • Improved for connecting Mobile App Wallet

  • Improved response time for some iOS.

  • Payment

    • Added OKX wallet option

    • Improved error codes so that the Mini Dapp can clearly aware the payment cancellation/failure.

  • Docs >
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.11.js
    2. Register NFT Collections

    The information you've submitted to Ops Support channel, will be registered to Dapp Portal database. This step can be executed by Dapp Portal team on your behalf.

    (A Mini Dapp can be assigned to multiple contracts of NFT collections.)

    3. Deploy contract for NFT Collections assigned Mini Dapp

    Contract for NFT Collections will be deployed by Dapp Portal's server. If the contract is confirmed, we can assign it with Mini Dapp. (It's not about granting permissions of the contract to Mini Dapp, but rather a step to match the unique contract of Mini Dapp within the Dapp Portal.)

    4. Set Drops

    Dapp Portal team will set Drops as information gathered from step 1. When setting up Drops, the NFT minting limit is required. Within this configured Drop, you can add multiple stages to register a detailed sales plan. Please NOTE that the date of sale for the stages cannot overlap.

    5. Drops

    The configured stages within Drops will be displayed in the Market tab in Dapp Portal. Once the specified time for each stage arrives, users can be able to mint the NFTs of yours.

    5-1. Airdrop stage

    A feature that allows a specific wallet in the Dapp to receive NFTs for Airdrop purposes.

    For more information of Airdrop stage, Please find here >

    5-2. Presale Stage

    This stage is only available for purchase by pre-registered users(Allowlist). If you want to add an allowlist stage, you can contact the Ops Support channel.

    5-3. Public Stage

    This stage is available for purchase by any user of the Dapp Portal. The public stage must be placed at the very end of all stages in the Drops, and you can add stages until the public stage begins.

    1KB
    meta sample.csv
    Open
    https://docs.kaia.io/
    • Good: https://dappportal.io

    • Bad: https://dappportal.io/

    https://dashboard.reown.com/
    https://docs.reown.com/cloud/relay
    https://dashboard.reown.com/
    // index.tsx
    globalSdk = await DappPortalSDK.init()
    
    // login.tsx
    const provider = global.getWalletProvider();
    const accounts = provider.request({method: 'kaia_requestAccounts'})
    const sdk = await DappPortalSdk.init();
    const provider = sdk.getWalletProvider();
    const accounts = provider.request({method: 'kaia_requestAccounts'})
    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.3
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.3.js

    clientId*required string

    the clientId provided when applying for the SDK

    chainId string

    The default value is 1001(testnet). To use the mainnet after development, set the value to 8217(mainnet).

    getWalletProvider function

    Initialize walletProvider

    getPaymentProvider function

    Initialize paymentProvider

    isSupportedBrowser function

    Returns true if the current browser is supported; otherwise, returns false.

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.8

    https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.8.js

    • Added kaia_connectAndSign function

    Request

    • data : data to sign

    Response

    • address : address which is signed to data

    • signature

    Error

    When user did cancel connection.

    To request kaia_connectAndSign, an SDK version upgrade is mandatory.

    [data]
    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.2.12

    cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.2.12.js

    Point#1

    Fixed issue where the Mini Dapp SDK failed to detect account changes in the OKX Wallet

    [Before v1.2.12]

    When the user changes the account in the Extension while the OKX Wallet is connected,

    • SDK returns former account when request kaia_accounts() or kaia_requestAccounts()

    • User cannot sign because the connected wallet is different from the wallet address in the signature data

    [After v1.2.12]

    When the user changes the account in the Extension while the OKX Wallet is connected,

    • SDK returns latter account when request kaia_accounts() or kaia_requestAccounts()

    • User can sign

    Point#2 [Action Requried]

    Fixed issue whre OKX Wallet is not properly disconnected when requested walletProvider.disconnectWallet()

    [Before v1.2.12]

    Since there is no way to await for walletProvider.disconnectWallet() to complete, refreshing immediately after requesting disconnectWallet() results in the OKX Wallet connection not being properly disconnected.

    [After v1.2.12]

    Changed walletProvider.disconnectWallet() as async function

    Point#3 [Action Requried]

    Fixed error when requested walletProvider.disconnectWallet()

    [ASIS]

    After requesting walletProvider.disconnectWallet(), the page must be refreshed or the walletProvider needs to be reassigned to a variable in order to be able to select the wallet type again.

    [TOBE]

    After requesting walletProvider.disconnectWallet(), without any additional implementation, it is possible to select the wallet type again when making a subsequent walletProvider.request({method: "kaia_requestAccounts"}) request.

    npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.0

  • cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.0.js

  • What's new

    • cryptoPaymentInfo filed of Webhook has been added when payment status is CONFIRMED

    • Method to retrieve fungible token balance has been added

    • USDT has been added as currencyCode where pgType: CRYPTO

      • Gas fee delegation is supported for USDT payment

    If you have not yet completed domain verification for using the Bitget Wallet, please refer to this guide.

    We always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    npm install @linenext/dapp-portal-sdk
    yarn add @linenext/dapp-portal-sdk
    DappPortalSDK
    [address, signature]
    REQUEST_REJECTED: -32002
    // ASIS
    walletProvider.disconnectWallet();
    window.location.reload(); // <- Failed to disconnect OKX Wallet
    
    // TOBE
    await walletProvider.disconnectWallet();
    window.location.reload(); // <- Success to disconnect OKX Wallet
    {
        "paymentId": "",
        "status": "CONFIRMED",
        "cryptoPaymentInfo": { // added when status: CONFIRMED
            "paymentTxHash": "0x.."
        }
    }  
    walletProvider.getErc20TokenBalance(contractAddress, walletAddress)

    Data Dashboards and Visualization Tools: Provided by Flipside Crypto and Dune Analytics.

  • Contract Labeling and On-chain Transparency: Enhanced through Kaiascan

  • SDKs and Libraries: SDKs and Libraries | Kaia Docs

  • White Paper: Kaia Blockchain White Paper v1.2 | Kaia Docs

  • Public JSON RPC Endpoints | Kaia Docs
    Oracles | Kaia Docs
    Indexers | Kaia Docs
    Block Explorers | Kaia Docs
    Introduction | Stargate
    Compare Wormhole's Cross-Chain Solutions | Wormhole Docs
    Gnosis Safe
    Layerzero
    stargate
    Wormhole
    Mini Dapp Desciption
    • Displayed in B of the Screen Sample

    • The multilingual language support is: EN (English), JA (Japanese), TH (Thai), TW (Traditional Chinese).

      • All languages are mandatory

    LINE OA URL

    • Displayed in C of the Screen Sample

    • How to check the LINE OA URL

      • Go to LINE Business Mannager > Select Accounts > Navigate to Gain friends > choose "Add friends"

    Mini Dapp Ofiicial Site

    • Displayed in D of the Screen Sample

    Mini Dapp Play URL

    • Displayed in E of the Screen Sample

    • Write URLs for two versions: LIFF and External Web

    SNS URL

    • Displayed in F of the Screen Sample

    • Select the Ofiicial account platform supported by the Dapp Portal

    • Offical account platform: Medium, X (Twitter), Discord

    Category

    • Displayed in G of the Screen Sample

    • Category list: Social, Game, Contents, Etc

    • Please select one from the provided category list and complete the details.

    Genere Tag

    • Displayed in H of the Screen Sample

    • Genre Tags can be written as #Tag (Text) and are limited to a maximum of five.

    Mini Dapp Point Name

    • Displayed in I of the Screen Sample

    Mini Dapp Logo Image

    • Displayed in J of the Screen Sample

    • Displayed in all areas of the Dapp Portal where Mini Dapp information and Mini Dapp Point Rewards are specified

    • Image Size: 420x420 px

    Mini Dapp Featured A Image

    • Displayed in K of the Screen Sample

    • Displayed in the theme-specific Mini Dapp introduction areas.

    • Image Size: 1005x468 px

    Mini Dapp Featured B Image

    • Displayed in L of the Screen Sample

    • Displayed in the theme-specific Mini Dapp introduction areas.

    • Image Size: 1140x900 px

    Mini Dapp Preview Image

    • Displayed in M of the Screen Sample

    • Up to a maximum of 7 registrations allowed

    • Image Size: 600x1296 px

    Dapp Portal, Slime Miner | Mini Dapp
    The most important feature for attracting and activating users to your Mini Dapp (LIFF). It is important to become viral among LINE users through various referrals.
    • To use the Invite Friends feature, refer to the LIFF API URL below.

      • Sending Messages

      • ShareTargetPicket

        • If you want to set it up so that messages are sent only to the user's friends and not to other OA accounts or chat groups, set .

    An example image for Invite a friend looks like this.

    01. On board to LINE Developers via LINE Account
    02. Add an Email for LINE Developers to be registered as Developer.
    03. Create Provider
    04. Create Channel
    05. Create LINE Official Account
    06. Enable Messaging API from Official Account
    08. Set LIFF Environment
    09. Build App via LIFF SDK
    Enabling the Action Button
    Set Minimization for LIFF Browser
    10KB
    Symbol_Green_512x512.png
    Open
    236KB
    Symbol_Green_512x512.svg
    Open

    v1.4.7

    Release Date

    Nov 6th 2025 07:00 in UTC

    Note

    • npm:

    • cdn:

    What's improved

    • OA Promotion Phase 3 Support

    OA Promotion Phase 3 Guide

    Please refer to the following guide and proceed with the additional development and information submission.

    Additional Development

    • Event Provider Callback (DappPortalSDK.getEventProvider())

    • Dapp Server REST API Implementation

    Required Information Submission

    • API URL (required)

    • Custom Header (optional)

    DappPortalSDK.getEventProvider()

    Event Provider Callback for Mini Dapp Mission Completion

    • The purpose of this callback method is to verify mission completion on Dapp Portal side and automatically display a success banner when verification is successful.

    Parameters

    Parameter
    Type
    Description

    Responses

    N/A

    • If verification is successful, a banner will be displayed.

    Dapp Server REST API Implementation Guide

    To enable mission completion on the Dapp Portal charts, the Dapp server must provide an API endpoint that allows the Dapp Portal to verify whether a mission has been completed.

    • Information Required

      • API URL (required)

      • Custom Header (optional)

    • API Overview

    Settlement

    The contents of this document are subject to change based on future circumstances or policy revisions.

    This guide provides an overview of the payment system offered by the Dapp Portal. It includes detailed information on payment policies, refund policies, and settlement policies.

    Cash Flow

    • Product Price: Product sales amount

    • Platform Fee (Service Fee): The fee LINE NEXT receives for providing the platform.

    • Royalty Fee (Contents Fee): The fee that the Dapp receives as royalty for NFT C2C transactions.

    • Payment Solution Fee: Payment fee collected by the payment processor for providing the payment solution.

    Mini Dapp in-app Items

    1-1. Fiat Payment (B2C)

    Payout: Product Price - Platform Fee - Payment Solution Fee - All other costs*

    • All other costs: OTC conversion fee, etc.

    1-2. Fiat Settlement

    a. Settlement Currency

    The settlement funds are paid in USDT based on Kaia blockchain

    b. Settlement Frequency

    Monthly settlement (payment of settlement funds in N+1 for transactions occurring during N)

    c. Settlement Procedure

    • The Payment Processor deducts transaction fees and confirms the settlement amount, then pays it to LINE NEXT (N+1 W1~W2).

    • LINE NEXT deducts platform fees and converts the remaining balance into USDT (N+1 W3).

    • After deducting all related costs, Dapps can see the final settlement amount in the settlement report and claim directly to get paid. (N+1 W4).

    d. Example

    For payments made in March

    • April W1~W2: Payment Processor deducts the payment fee, finalizes the settlement amount, and sends it to LINE NEXT

    • April W3: LINE NEXT deducts the platform fee and converts the remaining difference into crypto.

    • April W4: Dapps can see the final settlement amount in the settlement report and claim directly to get paid.

    e. Fiat Settlement Info

    Information
    Description

    2-1. KAIA Payment (B2C)

    Payout: Product Price - Platform Fee

    2-2. KAIA Settlement

    a. Settlement Currency

    The settlement funds are paid in crypto

    b. Settlement Frequency

    Real-time settlement

    c. Settlement Procedure

    • The smart contract automatically calculates the related fee amounts based on the Product Price and pays the balance to the seller.

    • LINE NEXT provides a quarterly settlement report (N+3)

    NFTs

    1. KAIA Payment (B2C)

    Payout: Product Price - Platform Fee

    • Platform Fee: Discounted fee rates available during promotional periods.

    2. KAIA Payment (C2C)

    Payout: Royalty fee*

    • Rate set directly by the Dapp within the range of 0~10% of the Product Price.

    3. KAIA Settlement for NFTs

    It is instantly settled same as Mini Dapp in-app items.

    Refund

    Refund Policy

    Mini Dapps should establish and communicate a clear and fair non-refund policy to users, considering the following principles.

    Fiat Payment (B2C)

    Principle

    Purchase cancellations, exchanges, returns, and refunds for purchased products are not allowed.

    Background

    • To minimize unnecessary disputes and enhance the stability of service operations, it is necessary to inform users that refunds are not possible due to the nature of digital products such as game items.

    • All refund requests and related disputes regarding transactions between Mini Dapps and users must be handled independently by the Dapp, and LINE NEXT will not mediate or intervene.

    • All refund policies related to transactions are subject to the unique policies of each Mini Dapp, and accordingly, users' refund requests will be processed according to the Dapp's policy.

    $KAIA Payment (B2C)

    Principle

    Purchase cancellations, exchanges, returns, and refunds for purchased products are not allowed.

    Display Purchase Precautions

    Mini Dapp must implement the display of the following text below the Purchase button on the Product Purchase screen according to the requirements below, so that users can clearly understand it. (Note: LINE IAP payment will be available soon)

    Requirements (Minimum)

    "Text that should be displayed" must appear in "Where it should be displayed"

    Text that should be displayed

    • You agree that the product(s) is/are non-refundable.

    • If paid via LINE IAP, you agree to providing encrypted ID info to LY Corporation.

    Where it should be displayed

    Below the Purchase/Payment button (or in another location easily noticeable by the user)

    Requirements (Recommended)

    • "Text that should be displayed" must appear in "Where it should be displayed" in the form of a checkbox.

    • "Information to be provided to the user when clicking View Details" should be available to the user.

    • User must agree to check all checkboxes to activate the Buy/Pay button.

    Text that should be displayed

    • (Checkbox) You agree that the product(s) is/are non-refundable. (View Details)*

      • Provide detailed information on Mini Dapp's purchase and refund policies when clicking (View Details)*

    • (Checkbox) If paid via LINE IAP, you agree to providing encrypted ID info to LY Corporation. (View Details)**

    Where it should be displayed

    • Below the Purchase/Payment button (or in another location easily noticeable by the user)

    Reward

    ※ The distribution of Tokens (KAIA or USDT), NFTs, and Points based on specific condition fulfillment must be implemented directly within the Dapp, and only missions with these features fully implemented can be listed on the Dapp portal. (NFT minting must be carried out exclusively through the Dapp portal)

    1) $Token(KAIA or USDT) Reward

    Mission Name

    • Displayed in A of the Screen Sample

    • The multilingual language support is: EN (English), JA (Japanese), TH (Thai), TW (Traditional Chinese). All the language must be filled.

    • There is a 15-character limit

    Reward Amount per Mission

    • Displayed in B of the Screen Sample

    • $Token(KAIA or USDT) Reward Distribution Amount

    Wallet Address

    • The from Address for the Mini Dapp to airdrop $KAIA.

    • If multiple events are held at the same time, Wallet Address is required for each event.

    • Contract Address are not allowed.

    Reward URL

    • Displayed in C of the Screen Sample

    • Write URLs for two versions: LIFF and External Web

    Opened at/Closed_at

    Please make sure to specify the exact time, including the minute

    • ex) yyyy-mm-dd tt:mm (in UTC)

    2) NFT Reward

    Mission Name

    • Displayed in D of the Screen Sample

    • The multilingual language support is: EN (English), JA (Japanese), TH (Thai), TW (Traditional Chinese). All the language must be filled.

    • There is a 15-character limit.

    Wallet Address

    • The from Address for the Mini Dapp to airdrop NFT.

    Contract Address

    • The Collection contract address(or Collection name) of the NFT to be airdropped

    Reward URL

    • Displayed in C of the Screen Sample

    • Write URLs for two versions: LIFF and External Web

    Opened at/Closed_at

    Please make sure to specify the exact time, including the minute

    • ex) yyyy-mm-dd tt:mm (in UTC)

    3) Point Reward

    Point Name

    • Displayed in F of the Screen Sample

    • English Only

    Point Image

    • Displayed in G of the Screen Sample

    • Image Size: (150x150) * 2px

    API Endpoint

    • https://{dapp_path}

    Reward URL

    • Displayed in H of the Screen Sample

    • Write URLs for two versions: LIFF and External Web

    Opened at/Closed_at

    Please make sure to specify the exact time, including the minute

    • ex) yyyy-mm-dd tt:mm (in UTC)

    Chargeback

    Chargeback Policy

    Overview

    A chargeback is a procedure where a customer or the customer’s bank cancels a transaction following a dispute regarding payment. Dapp Portal continuously monitors all transactions, and when a chargeback occurs, a fee will be applied.

    Chargeback Fee Policy

    • A base fee of $15 will be charged for every chargeback.

    • This fee applies regardless of whether you choose to enter the dispute resolution process.

    • The fee is automatically deducted from your settlement payment.

    • If you proceed with a dispute, additional fees may apply depending on the outcome.

    Dispute Resolution Process

    1. When a chargeback occurs, a notification will be sent to you within Dapp Portal.

    2. If you wish to proceed with dispute resolution, please refer to the table below and send a request email to the contact provided.

    • Contact: [email protected]

    Fee Structure by Case

    Case
    Base Fee
    Additional Fee
    Refund-Related Fee
    Total Fee
    Notes

    Important Notes

    • Even if you do not participate in dispute resolution, a $15 fee is always charged.

    • If you proceed with a dispute:

      • If you win the case, part of the fees will be refunded.

      • If you lose the case, the total fee will be $45.

    Drops Information

    Order of writing: First, Mint Type; second, Airdrop; third, Presale; fourth, Public. If there are no plans for drops, writing is not required. If the Airdrop stage is mandatory in the collection, it must be conducted before the presale and public stages. If the Airdrop stage needs to occur during the presale or public stage, it should be done with a new collection.

    Drops Type offers three options: Airdrop, Presale, and Public.

    a. Mint Type

    Collection Name

    Update Note

    17 November 2025

    has been released (Minor improvement of internal logic)

    6 November 2025

    has been released (Added OA Promotion Phase 3)

    15 October 2025

    Mini Dapp SDK v1.4.6 has been released (Minor improvement of internal logic)

    22 September 2025

    Mini Dapp SDK v1.4.5 has been released (Added OA Promotion Phase 2)

    5 September 2025

    Mini Dapp SDK v1.4.4 has been released (Minor improvement of internal logic)

    21 August 2025

    Mini Dapp SDK v1.4.3 has been released (Minor improvement of internal logic)

    19 August 2025

    Mini Dapp SDK v1.4.1 has been released (Added OA Popup Event)

    1 August 2025

    USDT Payment has been supported from Mini Dapp SDK. (from SDK v1.4.0)

    28 July 2025

    Updated guide to claim USDT for STRIPE Payment

    25 July 2025

    Mini Dapp SDK v1.4.0 has been released

    11 July 2025

    Mini Dapp SDK v1.3.8 has been released (fixed minor bug for Kaia Wallet App)

    10 July 2025

    Mini Dapp SDK v1.3.7 has been released (optimization of Kaia Wallet App IAB)

    8 July 2025

    Mini Dapp SDK v1.3.6 has been released

    16 June 2025

    Mini Dapp SDK v1.3.5 has been released (Supported gas fee delegation for Bitget Wallet)

    12 June 2025

    Mini Dapp SDK v1.3.4 has been released (Minor improvement for Dapp Portal)

    10 June 2025

    Mini Dapp SDK v1.3.3 has been released (fixed a bug)

    30 May 2025

    Mini Dapp SDK v1.3.2 has been released (To echance stability)

    28 May 2025

    Mini Dapp SDK v1.3.1 has been released (Minor improvement for Bitget Wallet)

    27 May 2025

    Mini Dapp SDK v1.3.0 has been released (for integration of Bitget Wallet)

    21 May 2025

    Guide for Domain Authorization via Reown has been updated (for integration of Bitget Wallet)

    20 May 2025

    Guide for Provision of Maintenance Mode has been updated

    Mini Dapp SDK v1.2.13 has been released (No impact on Client's side)

    9 May 2025

    Response of the Get Payment Information API has been updated to include entries for refunds and chargebacks. Status of payment has been updated to include entries for refunds and chargebacks

    23 April 2025

    Mini Dapp SDK v1.2.12 has been released

    10 April 2025

    Mini Dapp SDK v1.2.11 has been released

    7 April 2025

    Mini Dapp SDK v1.2.10 has been released

    2 April 2025

    Dapp Portal's compliance policy has been added to Review Guidelines

    1 April 2025

    Contetns of Growth Competition has been updated

    25 March 2025

    Minimum price policy for KAIA payment has been updated from 1 KAIA to 0.01 KAIA

    18 March 2025

    Guide for Dapp Portal Registeration has been updated

    17 March 2025

    Guide for Add To Home Screen has been added

    6 March 2025

    Mini Dapp SDK v1.2.9 has been released

    5 March 2025

    Guide for Cocos Creator has been added

    Guide for Landscape Mode has been added

    27 February 2025

    Updated getWalletType() > ; WalletType.OKX added

    Mini Dapp SDK v1.2.8 has been released

    Wallet Connect flow added

    26 February 2025

    Updated guide for building Mini Dapp

    • Provision of information about connected wallet >

    • Provision of payment status >

    Mini Dapp SDK v1.4.8
    Mini Dapp SDK v1.4.7

    Currency for Settlement

    USDT (USD pegged stable coin based on Kaia blockchain)

    Payout Cycle

    Monthly (Paid in N -> Claim from N+1)

    Settlement Operator

    Mini Dapps can claim directly

    How to Claim

    Starting from the settlement of STRIPE revenue for April to June, scheduled for the end of July 2025, the following system will be applied. From the July revenue settlement onward, the same monthly settlement structure will continue.

    1. Call the Claim API directly based on the provided guide

      1. Usage instructions for the Claim API will be published in advance on the Mini Dapp Docs.

      2. This will be applied starting with the settlement of April–June Fiat revenue at the end of July, and from August onward, monthly settlements will follow the same process.

      3. A dedicated Claim page will also be provided in the future to allow easy claiming without the need for direct API integration.

    1. USDT will be sent on-chain to the Mini Dapp's designated wallet address for revenue settlement.

    Claimable Address

    Address on onboarding contracts. (Same with address for crypto settlement)

    Withdrawal Deadline

    Mini Dapp can freely withdraw once the withdrawal period begins.

    $30

    Final settlement = Transaction amount - Refund-related fee - Total Fee

    Case 3: Dispute → Lost

    $15

    $30

    -

    $45

    Higher cost if dispute is lost

    Please carefully consider the potential costs before deciding whether to dispute.

    Case 1: No Dispute

    $15

    -

    -

    $15

    No dispute resolution requested

    Case 2: Dispute → Win

    $15

    $30

    $15

    Method: GET

  • Scheme: https

  • Read Timeout: 1s

    • If the Dapp Portal server does not receive a response within 1 second, the mission will be treated as failed.

  • Custom Header (optional)

    • You may include a custom header when the API is called.

    • There are no restrictions on header key/value format.

    • Only one custom header can be used, and it is optional.

    • ex) x-dapp-custom-key: gq8g0Ah1MD98

  • URL Format

    • Base URL: Dapp server URL

    • The $identifier as query parameter must be included.

    • $identifier is a placeholder that will be replaced by the user’s wallet address (in lowercase) by the Dapp Portal server.

    • ex) https://example.dapp.io/api/mission/1111?param=zzzz&identifier=$identifier

  • Response Body

    • Content Type: JSON

    • If the Dapp Portal server receives a successful response, the user is considered to have completed the mission.

      • Mission Complete

      • Mission Fail

  • eventId

    string

    The unique identifier provided by Dapp Portal

    subMissionIndex

    string

    The index of the sub-mission. Indexing starts from 0. For example: - Event item purchase Misson -> use subMissionIndex = "0" - Lv4 achievement Misson -> use subMissionIndex = "1"

    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.4.7
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.4.7.js
    Provide the following detailed information when clicking (View Details)**
    • Consent of Personal Information Provision

    • Receiving Party: LY Corporation

    • Purpose for Provision: Processing product payments

    • Personal Information to be provided: Encrypted Identification Information

    • Retention Period of Receiving Party: Until the purpose of provision is achieved

    • Country of Incorporation: Japan

    • Company URL:

    • Company Privacy Policy:

    • If you limit this provision above, you may not be able to use services.

    Displayed in A of the Screen Sample
  • Please enter the name of the requested collection for issuance.

  • English Only

  • Drops Amount

    • Displayed in B of the Screen Sample

    • It is recommended to issue no more than 100,000.

    • Drops amount is sum of 'Airdrop' and 'Public'

    • The initially determined drops amount cannot be changed. If additional issuance is required, a new collection must be created. Therefore, if a larger quantity is needed, please consult with the operations manager.

    b. Airdrop

    Wallet Address

    • The from Address for the Mini Dapp to airdrop NFT

    Minting Amount

    • Mini Dapp receive these amount from Team Dapp Portal, and Mini Dapp Wallet directly from Mini Dapp Wallet to User Wallet

    Opened at/Closed_at

    • ex) yyyy-mm-dd tt:mm (in UTC)

    c. Presale

    Drops Name

    • Displayed in C of the Screen Sample

    • List of Supported languages in the Dapp Portal

    • All languages are required

    Drops Image

    • Displayed in D of the Screen Sample

    • Image Size: 1005x1005

    Drops Price

    • Displayed in E of the Screen Sample

    • Only $KAIA

    Limit the mint amount per wallet

    • Displayed in F of the Screen Sample

    • If you wish to restrict the mint amount per wallet, please enter the desired value

    Allowlist(Whitelist)

    • Please upload the list of wallet addresses of the users you want to allow to purchase

    Opened at/Closed_at

    Please make sure to specify the exact time, including the minute

    • ex) yyyy-mm-dd tt:mm (in UTC)

    d. Public

    Drops Name

    • Displayed in C of the Screen Sample

    • List of Supported languages in the Dapp Portal

    • All languages are required

    Drops Image

    • Displayed in D of the Screen Sample

    • Image Size: 1005x1005

    Drops Price

    • Displayed in E of the Screen Sample

    • Only $KAIA

    Limit the mint amount per wallet

    • Displayed in F of the Screen Sample

    • If you wish to restrict the mint amount per wallet, please enter the desired value.

    Opened at/Closed_at

    Please make sure to specify the exact time, including the minute.

    • ex) yyyy-mm-dd tt:mm (in UTC)

    options.isMultiple as false

    Growth Competition

    Overview

    The Mini Dapp Growth Competition aims to foster rapid user growth, reward top-performing projects, and drive meaningful market traction. Our goal is to identify and support standout Mini Dapps that achieve significant monthly active user (MAU) milestones and notable on-chain token holder counts.

    Competition Summary

    The objective is to help Mini Dapps rapidly achieve millions of MAU and on-chain token holders.

    • In February and March–April (final timeline to be decided in February 2025), competitions based on key metrics will select the top Mini Dapps for marketing and liquidity support.

    • A ranking dashboard will go live in February 7.

    • The top 10 Mini Dapps will be selected in Mid February and March-April(final timeline to be decided in February 2025) based on key metrics.

    • Among the Top 10, 2 teams will be selected for growth packages based on growth potential evaluations by the foundation and LINE NEXT. They will receive:

    *The exact timeline may change depending on the launch status of the Kaia Wave Mini Dapp.

    Participation Eligibility

    • All Mini Dapps built on Kaia’s ecosystem are automatically enrolled.

    • However, for metric tracking, Mini Dapp-related information and the smart contract address must be submitted through .

      • Please also submit the NFT, token, and payment smart contracts together.

      • If you’ve already submitted contracts, you can send the labels and addresses of new smart contracts to

    Ranking & Metrics

    Leaderboard Metrics

    • Weekly On-chain Active Accounts(High weight): Tracked on-chain. Accounts that hold a minimum amount of KAIA(e.g. at least 1 KAIA) and have submitted at least one transaction to the Mini Dapp’s contract will receive a higher weight to encourage on-chain asset ownership.

    • Weekly On-chain Transactions(Low weight): The number of transactions submitted to the Mini Dapp’s contract. Transactions from accounts that hold a minimum amount of KAIA(e.g. at least 1 KAIA) and have submitted at least one transaction to the Mini Dapp’s contract will receive a higher weight to encourage on-chain asset ownership.

    • Mini Dapp Revenue(High weight): Revenue activities conducted within the LINE platform (crypto and cash payments), based on LINE’s data.

    Ranking Details

    • User and on-chain metrics are displayed as absolute numbers.

    • Revenue metrics are shown as top rankings or percentages.

    • Rankings are standardized across user, wallet, and revenue data. The final ranking is determined by calculating a weighted score of these metrics.

    • The Top 10 will be highlighted separately on the ranking board.

    Any project found engaging in fraudulent activities will be disqualified.

    Evaluation & Selection

    • The Top 10 Mini Dapps will be granted eligibility to qualify for the growth package.

    • In February, the Top 10 Mini Dapps will be selected based on the average score from three weeks of metrics. This includes the average scores for the periods of January 22–29, January 29–February 5, and February 5–12. The results will be announced in a separate article by LINE NEXT and the Kaia Foundation.

    • In April, the Top 10 Mini DApps will be selected based on the average score from three weeks of metrics, covering the period from March 5 to April 16. The results will be announced in a separate article by LINE NEXT and the Kaia Foundation.

    Notes

    • Minimum thresholds or additional requirements for receiving growth package may be introduced over time.

    • For teams that are not selected, alternative marketing support may be provided, such as prioritized exposure on the Dapp portal.

    Growth Support Package

    The two teams selected as growth package recipients will receive the following benefits.

    • Up to $0.5M Marketing/User Rewards:

      • Mini Dapps must submit marketing plans.

      • Allocation between marketing and user rewards decided jointly with the foundation and LINE NEXT team.

      • Note: Post-TGE, additional token airdrops to ecosystem users are mandatory.

    Timeline

    Phase 1: February

    • February 7

      • Official Ranking Dashboard goes live.

    • February 14

      • The Top 10 Mini Dapps announced based on performance metrics, calculated as the average scores for the periods of January 22–29, January 29–February 5, and February 5–12.

    Phase 2: March-Apr

    • March 5

      • Phase 2 Growth Competition scoring begins.

    • April 18

      • The Top 10 Mini Dapps announced based on performance metrics, calculated as the average weekly scores for the periods of March 5 to April 16.

    Contact & Support

    For any questions or guidance on the Growth Competition rules, eligibility, or resource utilization, please contact the Kaia Foundation or LINE NEXT teams for assistance.

    Payment

    Payment Methods

    • Mini Dapps must provide both fiat and crypto payment options on the product purchase screen, with each payment button offered separately.

    Dapp Starter

    When you're new to Dapp development, it can be difficult to know where to begin. In such cases, the Dapp Starter can serve as a helpful starting point.

    The Dapp Starter is a template that includes the essential features needed for building a Dapp. You can customize and build your own Dapp based on this template. This guide walks you through the Dapp Starter in the following steps:

    How to mint NFT

    Drops Flow

    Airdrop Stage

    Airdrop which is a one of the stage from Drops should be deployed from Dapp Portal side with signer address.

    const eventProvider = DappPortalSDK.getEventProvider();
    
    // When the mission is completed
    const eventId: string = "eventId";          // Unique event ID provided by Dapp Portal
    const subMissionIndex: string = "1";        // Sub-mission index, starting from 0
    
    await eventProvider.callback(eventId, subMissionIndex); // If verification is successful, a banner will be displayed automatically.
    https://www.lycorp.co.jp/
    https://www.lycorp.co.jp/en/company/privacypolicy/
  • up to $0.5M in marketing support and top exposure on the Dapp portal

  • up to $0.1M in liquidity support

  • Minimum criteria for receiving the growth package may be added later.

  • All Mini Dapps built on Kaia will automatically participate. Token airdrops to users at the TGE stage (including pre-distributed points) will be mandatory.

  • , and they will be updated within a week.
  • To check if your submitted contracts are properly tracked on the Growth Competition dashboard, please refer to the following link: https://dune.com/queries/4773070

  • Teams that haven’t issued tokens yet must airdrop tokens at TGE. Teams that have already issued tokens are also eligible to participate.

  • They are updated weekly and made publicly visible on Kaia Square: https://square.kaia.io/Competition

    To participate in the April Growth Competition, Mini DApps must be active for at least three weeks during this period, meaning they must launch no later than March 25.
  • Mini Dapps need to present a detailed Marketing plan. After, LINE NEXT and the Kaia Foundation will review the plans and select 2 Mini Dapps from the Top 10 based on leaderboard data and growth potential.

  • Up to $0.1M Liquidity Support:

    • Provided post-TGE.

    • Deployed as $KAIA liquidity in DEX pools.

    • Note: Mini Dapps benefiting from liquidity support must contribute a portion of their own tokens to the DEX pool.

  • Feb 17~21*

    • Among these, 2 Mini Dapps win Growth Packages, including $0.5M in marketing support and $0.1M in liquidity support.

  • To participate in the April Growth Competition, Mini DApps must be active for at least three weeks during this period, meaning they must launch no later than March 25.

  • April 21~

    • Among these, 2 Mini Dapps win Growth Packages, including $0.5M in marketing support and $0.1M in liquidity support.

  • this link
    [email protected]

    Environment setup

  • Downloading and running the source code

  • Deploying to a server

  • Key features of the Dapp Starter

    • Connect/disconnect wallet

    • Crypto/fiat payment

    • KAIA/STRIPE conversion ratio

    • LIFF integration

  • What is the Dapp Starter?

    The Dapp Starter is a template project designed to help you easily integrate the dapp-portal-sdk. While you can always start your Dapp project from scratch, using this starter allows for a faster and smoother development experience.

    It also follows a predefined design guide, which can help maintain consistency in UI/UX.

    The project is built with Next.js. Even if you're planning to use a different framework, this repository can still serve as a useful reference for integrating the dapp-portal-sdk.

    How to get started with the Dapp Starter

    Environment

    The Dapp Starter requires Node.js to run. It uses pnpm as the package manager (compatible with npm).

    • Recommended Node.js version: >= 20.0.0

    • The version specified in .nvmrc: v20.18.0

    • Older versions may work partially, but for compatibility with Netlify deployment tools, Node.js >= 20.0.0 is required.

    *Tip: Use nvm to manage Node versions easily.

    Downloading and running the source code

    You can clone or fork the repository from GitHub: https://github.com/techreadiness/dapp-starter

    To run the project locally, follow the instructions in the repository’s README.md.

    Deploying to a server

    Once you’ve run the Dapp Starter locally and verified that it's working, you can deploy it to a live server using Netlify:

    A netlify account is required

    Netlify (opens new window)is a hosting service for static sites, open an account before deploying to Netlify. The content on this page can be run on Netlify's free plan.

    .env.production file should be saved in Netlify setting.

    Go to Project > Project Configuration > Environment Variables and save .env.production variables.

    The official published version is available at https://dapp-starter.netlify.app.

    Key features of the Dapp starter

    The Dapp Starter comes with several basic features implemented out of the box. These demonstrate how to use core functionalities from dapp-portal-sdk, but should be treated as reference code, not a final solution.

    Connect/Disconnect wallet

    Connecting and disconnecting a wallet is the most fundamental feature when using the SDK. In the code, you’ll find how to use walletProvider and its methods.

    reference code functions related to wallet connect and disconnect

    Wallet Session Persistence

    You can first check whether a login session exists by calling walletProvider.request({ method: 'kaia_accounts' }), so that the wallet session remains active after a user logs in once for convenience.

    reference code maintaining session using kaia_accounts

    Crypto/Fiat payment

    The template shows how to handle both crypto and fiat payments using paymentProvider.

    You can see examples of:

    • Creating paymentId

    • Checking the payment status

    • Finalizing the payment

    reference code

    functions related to payment

    KAIA/STRIPE ratio

    To support payments, your Dapp needs to apply proper price conversion logic between crypto (KAIA) and fiat (STRIPE). The starter includes a usd-to-kaia function as a reference.

    reference code usd to kaia conversion

    KAIA/USDT balance

    The template shows how to get balance of both kaia and erc20 based token. reference code kaia balance erc20token balance

    LIFF integration

    If you're planning to integrate with LINE Front-end Framework (LIFF), this project includes useful examples such as:

    • When to initialize LIFF

    • How to use methods like shareTargetPicker

    reference code

    liff initialization shareTargetPicker method

    What is the Dapp Starter?
    How to get started with the Dapp Starter.
    HTTP/1.1 200 OK
    {
      "result": true
    }
    HTTP/1.1 200 OK
    {
      "result": false
    }
    # Go to the root directory
    cd ./
    # Build the project
    npm build 
    # Install netlify cli
    npm install -g netlify-cli
    # Login Nåetlify and connect repository with your netlify account
    netlify login
    # Deploy to a draft (preview) environment
    netlify deploy
    # Once verified, deploy to production
    netlify deploy --prod 
    a. Fiat

    Payment methods support credit/debit cards (major brands such as VISA, MasterCard, AMEX, JCB, etc.), Apple Pay, Google Play, Naver Pay (KRW only), and Kakao Pay (KRW only).

    • Payment methods dynamically and automatically change depending on the OS and payment currency of the connected device.

    • Payment method may change in the future depending on the payment processor's policy.

    • LINE IAP payment will be available soon.

    Fiat payments are supported in both the LIFF and Web versions of Mini Dapp.

    b. Crypto

    KAIA and USDT are supported as a payment method.

    Crypto payments are supported in both the LIFF and Web versions of Mini Dapp.

    Supported Currencies

    Type
    Currency
    Decimal(Max)
    Charge(Max)
    Charge(Min)

    Fiat

    USD

    2

    999,999

    0.50

    KRW

    0

    999,999

    750

    Product Price

    • The prices of products sold through the Mini Dapp SDK must be presented to users in both fiat currency and cryptocurrency with a certain level of stability.

      • This aims to provide a stable purchasing experience for both Web2 and Web3 users, prevent confusion caused by excessive price fluctuations, and balance the needs of Web2 and Web3 users. By doing so, it seeks to create a purchasing environment that is understandable, trustworthy, and reliable for all users.

    • USD is the default payment currency.

    • Each Mini Dapp may optionally support additional local currencies (JPY, TWD, THB, KRW) based on user's country information of needed.

    User County (based on browser language)
    Product price currencies shown to users

    Japan

    • Default : USD, KAIA, USDT

    • Optional : JPY, KAIA, USDT

    Thailand

    • Default : USD, KAIA, USDT

    • Optional : THB, KAIA, USDT

    Taiwan

    • Default : USD, KAIA, USDT

    • Optional : TWD, KAIA, USDT

    South Korea

    • Default : USD, KAIA, USDT

    • Optional : KRW, KAIA, USDT

    Others

    • Default : USD, KAIA, USDT

    Product price to enter when requesting payment

    • When a user selects Fiat payment, Mini Dapp operator must enter a fixed amount based USD to request payment.

    • When a user selects Crypto payment, Mini Dapp operator must enter a fixed amount based on $KAIA to request payment.

    Provide Clear Notifications

    • To minimize errors such as duplicate payments or incorrect payments, the Dapp must provide appropriate notification messages to the user immediately so that the user can recognize the results of successful and failed/canceled purchases in a "clear" and "intuitive" manner

    Event
    Description
    Information to notify users (Example)

    Successful purchase

    Fiat/Crypto payment successful and item delivered

    Successful purchase

    Purchase failed/canceled

    User requested to process Fiat/Crypto payment but payment failed

    Purchase failed

    User clicked the "Back" button on the Fiat/Crypto payment screen or exited the screen

    Purchase canceled

    User clicks the Decline Signature button on the Crypto payment screen

    Payment History

    Refer to SDK document and provide payment history to the user in the appropriate location.

    Mini Dapps who want to airdrop NFT must request to register Drops via Ops Support channel.

    Please NOTE that the execution times of the airdrop stage and other stages within Drops MUST NOT overlap because the airdrop execution is implemented as one of the stages within Drops. Please ensure the minting process is completed as below guied before Drops begins.

    Minting Process

    How to mint

    • Signer of airdrop stage can transfer transction with directly hosting 'mintSigned' for the contract.

    • You can mint NFT if the transaction is confirmed.

    function mintSigned()

    You can create signature following below function.

    Parameter for function mintSigned

    • nftContract - contract adress for NFT collection

    • minterIfNotPyer - wallet address to be received NFT for mint. It can be same with signer address or another address

    • quantity - NFT amount to mint

    • MintParams - It is related in information of airdrop stage, refer to below. - - This parameter can be delivered from Ops team after setting airdrop stage.

    • Details (It will be delivered from Ops support channel if you submit information for Airdrop stage)

      • maxTotalMintableByWallet

      • startTime

      • endTime

      • dropStageIndex

      • maxTokenSuppyForStage

      • Price

        • token

        • amount

        • fees

    • salt - You need to it create signature for next step. It must be recreated with each function call because it's a value for just one-time.

    • signature - EIP signature with the parameters above.

    How to create signature

    • primaryType - 'SignedMint'.

    • minter - wallet address to be received NFT for mint. It can be same with signer address or another address

    • Set parameter for EIP712Domain

      • name- "Next Drop"

      • version - "1"

      • chainId - Production : 8217 | Testnet : 1001

      • verifyingContract - contract address deployed as 'drop router' already

    contract

    • 'mintSigned' function is for 'drop router's contract.

    Value

    • Set quantity * price(in kei) for value when you create transaction

    Sample Transactions

    • Transaction (on Kairos) >

      • collection - 0xf8f22bb6a6dbb2219f762162c1dbd4e917816ef1

      • drop router contract - 0x7a766037653d055821fecd501c5c40a02cfffe57

      • signer - 0xc92aca8530b5e3c9d1819ebe94367b7444026fc1

      • minter - 0x340a32ef7263836adf87dc8941621a78443973f5

    Appendix

    How to host Meta/ImageUri?

    You can choose one of the ways below.

    • Submit 'csv' flie for airdrop information with Meta data if you have imageURI server to upload NFT images.

    • Submit image files with Meta data without file_name column to Ops Support channel. Dapp Partal can upload the images you've submitted to internal server and host them when mint NFT.

    Non-Airdrop Stage

    Please follow Collection & Drios guide >

    NFT Specification

    Gas Fee Delegation

    Kaia Fee Delegation Program for Kaia Wave Builders

    1. Introduction

    The fee delegation of kaia network is a feature that allows another account to pay for the transaction gas fee. This allows users to perform transactions without spending their own $KAIA for the gas fee of a transaction.

    2. Concept

    1. kaia fee delegation consist of three main compenents:

    1. Sender: The account submitting the transaction (from)

    2. Dapp: The relayer that relay the user signed transaction to the fee payer server

    3. Fee payer server: Sign as fee payer and send the signed transaction to the network and return the receipt to the caller

    2. The operations of kaia fee delegation is as follows:

    1. The sender creates the transaction.

    2. The sender specifies the fee payer's address in the transaction.

    3. The sender signs the transaction.

    4. The sender sends the signed transaction to backend of dapp.

    3. Code Samples

    1. Prequisite

    1. SDK

      1. ethers-ext that is one of kaia-sdk should be installed.

      2. ethers-ext

    2. Wallet

    2. code snippet in web application

    frontend (React) - getting a user signed transaction

    fee-delegated value transfer example

    fee-delegated smart contract execution example

    backend - request 'sign' to feePayer server

    1. input : userSignedTx - RLP encoded transaction

    2. return : transaction receipt

    3. feePayer server URL

      1. (mainnet)

    1. balance check

    v1.3.2

    Release Date

    May 30th 2025 07:30 in UTC

    Note

    To enchance the stability of the Mini Dapp SDK.

    npm:

    cdn:

    • It has no impact on the Mini Dapp.

    • However, we always recommend using the latest version of the Mini Dapp SDK to ensure security and compatibility.

    Wallet

    The WalletProvider follows the standard and supports the EventEmitter interface defined in it.

    sdk.getWalletProvider()

    Initializes the walletProvider, allowing developers to use various wallet features.

    Parameters N/A

    Responses

    Review Guidelines

    The Kaia Wave team reviews the Mini Dapp demo version based on the criteria below.

    Self-Checklist

    mintSigned(address,address,uint32,((address,uint96,(address,uint96)[]),uint48,uint40,uint40,uint16,uint32),bytes32,bytes)
    #method sig : 'c45f2655'
    function mintSigned(
      address nftContract,
      address minterIfNotPayer,
      uint32 quantity,
      MintParams calldata mintParams,
      bytes32 salt,
      bytes calldata signature
    )
    struct MintParams {
        Price mintPrice;
        uint48 maxTotalMintableByWallet;
        uint40 startTime;
        uint40 endTime;
        uint16 dropStageIndex;
        uint32 maxTokenSupplyForStage;
    }
      
    struct Price {
        address token;
        uint96 amount;
        Fee[] fees;
    }
      
    struct Fee {
        address recipient;
        uint96 amount;
    }
    EIP712Domain(
      string name,
      string version,
      uint256 chainId,
      address verifyingContract
    )
    SignedMint(
      address nftContract,
      address minter,
      MintParams mintParams,
     bytes32 salt
    )
    Fee(
      address recipient,
      uint96 amount
    )
    MintParams(
      Price mintPrice,
      uint48 maxTotalMintableByWallet,
      uint40 startTime,
      uint40 endTime,
      uint16 dropStageIndex,
      uint32 maxTokenSupplyForStage
    )
    Price(
      address token,
      uint96 amount,
      Fee[] fees
    )
    tokenID,name,description,file_name,attributes|Color,attributes|Level,attributes|Birthday
    1,title1,description1,https://{imageUrl_path}/{sub_path}/1.png,Green,5 level,2024.12.5
    2,title2,description2,https://{imageUrl_path}/{sub_path}/2.png,Red,3 level,2024.12.6
    3,title3,description3,https://{imageUrl_path}/{sub_path}/4.png,Brown,5 level,2024.12.7
    4,title4,description4,https://{imageUrl_path}/{sub_path}/3.png,Red,4 level,2024.12.8
    5,title5,description5,https://{imageUrl_path}/{sub_path}/5.png,Red,5 level,2024.12.9
    6,title6,description6,https://{imageUrl_path}/{sub_path}/6.png,Green,5 level,2024.12.10
    7,title7,description7,https://{imageUrl_path}/{sub_path}/7.png,Blue,1 level,2024.12.11
    8,title8,description8,https://{imageUrl_path}/{sub_path}/8.png,Brown,5 level,2024.12.12
    9,title9,description9,https://{imageUrl_path}/{sub_path}/9.png,Green,5 level,2024.12.13
    10,title10,description10,https://{imageUrl_path}/{sub_path}/10.png,Green,5 level,2024.12.14
    https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.3.2
    https://static.kaiawallet.io/js/dapp-portal-sdk-1.3.2.js
    The backend requests a transaction sign to the fee payer server.
  • The fee payer server signs the transaction as a fee payer, sends it to the network, gets a receipt of the transaction and returns the transaction receipt.

  • fee-delegation is only supported by

    1. kaia-wallet mobile/extension, dapp-portal-wallet liff/web

  • dapp frontend should get a user signed transaction via the wallets

  • Contract or sender should be registered

  • https://fee-delegation-kairos.kaia.io (testnet)

  • Apply Form >
    getting-started
    https://fee-delegation.kaia.io
    import { Web3Provider } from "@kaiachain/ethers-ext";
    import { TxType, parseKaia } from "@kaiachain/js-ext-core";
    import DappPortalSDK from "@linenext/dapp-portal-sdk";
    import { useEffect, useState } from "react";
    
    // testnet
    const feePayer = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
    // mainnet
    const feePayer = "0x22a4ebd6c88882f7c5907ec5a2ee269fecb5ed7a";
    
    const clientId = "30e…b89";
    const chainId = "1001";
    
    export default function home() {
     const [provider, setProvider] = useState<any>(null);
     const [accounts, setAccounts] = useState<string[]>([]);
    
     const initProvider = async () => {
       const sdk = await DappPortalSDK.init({
         clientId,
         chainId,
       });
       const provider = new Web3Provider(sdk.getWalletProvider());
       const accounts = await provider.send("kaia_requestAccounts", []);
       setProvider(provider);
       setAccounts(accounts);
     };
    
     const sign = async () => {
       const tx = {
         typeInt: TxType.FeeDelegatedValueTransfer,
         from: accounts[0],
         to: accounts[0],
         value: parseKaia("0.1").toHexString(),
         feePayer,
       };
       const signedTx = await provider.send("kaia_signTransaction", [tx]);
    
       // send the signed tx to backend
       console.log(signedTx);
     };
    
     useEffect(() => {
       initProvider();
     }, []);
    
     return (
       <div>
         <button onClick={sign}>Get user signed tx</button>
       </div>
     );
    }
    import { Web3Provider } from "@kaiachain/ethers-ext";
    import { TxType, parseKaia } from "@kaiachain/js-ext-core";
    import DappPortalSDK from "@linenext/dapp-portal-sdk";
    import { useEffect, useState } from "react";
    
    const feePayer = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
    const clientId = "30e…b89";
    const chainId = "1001";
    const contractAddr = "0x95Be48607498109030592C08aDC9577c7C2dD505";
    const abi = '[...]' //copy from https://docs.kaia.io/ko/references/sdk/ethers-ext/v6/smart-contract/write/
    
    export default function home() {
    const [provider, setProvider] = useState<any>(null);
    const [accounts, setAccounts] = useState<string[]>([]);
    
    const initProvider = async () => {
      const sdk = await DappPortalSDK.init({
        clientId,
        chainId,
      });
      const provider = new Web3Provider(sdk.getWalletProvider());
      const accounts = await provider.send("kaia_requestAccounts", []);
      setProvider(provider);
      setAccounts(accounts);
    };
    
    const sign = async () => {
      const contract = new ethers.Contract(contractAddr, abi, provider);
      const contractCallData = await contract.increment.populateTransaction();
      const tx = {
        typeInt: TxType.FeeDelegatedSmartContractExecution, // fee delegated smart contract execution
        from: accountAddress,
        to: contractCallData.to,
        input: contractCallData.data,
        value: "0x0",
        feePayer: feePayer,
      };
      const signedTx = await provider.send("kaia_signTransaction", [tx]);
      // send the signed tx to backend
      console.log(signedTx);
    };
    
    useEffect(() => {
      initProvider();
    }, []);
    
    return (
      <div>
        <button onClick={sign}>Get user signed tx</button>
      </div>
    );
    }
    const { Wallet } = require("@kaiachain/ethers-ext/v6");
    const ethers = require("ethers");
    
    //testnet
    const feePayerServer = "https://fee-delegation-kairos.kaia.io";
    const provider = new ethers.JsonRpcProvider("https://public-en-kairos.node.kaia.io");
    
    async function main() {
    /* signed tx from user on frontend side */
    const signedTxRLPEncoded = {
       raw: RLP encoded signed TX hex string
    }
    const response = await fetch(`${feePayerServer}/api/signAsFeePayer`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ userSignedTx:signedTxRLPEncoded }),
    });
    const data = await response.json();
    console.log(data);
    }
    
    main();
    const checkBalance = async () => {
     // It's an address of contracts or senders you registered for fee delegation
     const address = "0x63d4f17d2a8a729fd050f7679d961b1dfbb1e3af";
     const result = await fetch(`${feePayerServer}/api/balance?address=${address}`);
     const isEnough = (await result.json()).data;
     console.log(isEnough ? "enough balance" : "not enough balance");
    };
    walletProvider.getWalletType()

    Returns the type of the currently connected wallet.

    Parameters N/A Responses

    walletProvider.request()

    This function provides JSON-RPC API format on request. You can send request to retrieve healthy status of chain and sign transaction with wallet. If you send it before wallet connection, user will see a screen to select wallet type to connect.

    You can find the available KAIA-related methods, their parameters, and corresponding responses in the table below. RPC methods that are not included in the table will be requested directly to the chain node and please refer to Kaia docs' RPC API Reference.

    Parameters RequestArguments *required · object - method *required · string

    - params unknown[] Responses

    method
    params
    Responses

    kaia_accounts

    Returns the list of addresses currently connected to the wallet. If no wallet is connected, an empty array is returned.

    null

    kaia_requestAccounts Initiates wallet connection. During the process, a window is displayed for the user to select a wallet provider. Returns a list of addresses associated with the selected wallet.

    null

    personal_sign ()

    Initiate sign procedure. We recommend to use personal_sign to get compatibility with various wallets including OKX Wallet.

    [message: string, account: string]

    signature

    kaia_connectAndSign () recommended Iniitiates wallet connection and signing. Prompts the user to select a wallet provider, then signs the provided message. Returns [account, signature] as an array.

    [message: string]

    account and signature as Array

    Error

    Code
    Description

    -32001

    -32004

    Invalid from address (Please retry methohs after executing walletProvider.disconnectWallet())

    -32005

    User logged out due to incorrect password input (Please retry methohs after executing walletProvider.disconnectWallet())

    -32006

    Wallet is not connected yet (If an error occurs while the wallet in connected, Please retry methods after executing walletProvider.disconnectWallet(). If an error occurs while the wallet is not connected, please connect wallet first)

    walletProvider.disconnectWallet()

    Disconnects the wallet. When this function is called, a confirmation window will appear to confirm the disconnection.

    Parameters N/A Responses N/A

    walletProvider.getErc20TokenBalance()

    Parameters

    contactAddress *required · string account *required · string

    Responses

    64-byte hexadecimal string. The returned value includes the token’s decimal scaling according to its decimals specification.

    For example, USDT uses a decimal scale of 10⁶, while DELABS uses a decimal scale of 10¹⁸.

    Compatible Libraries

    • https://docs.kaia.io/ko/references/sdk/ethers-ext/getting-started/

    • https://docs.kaia.io/ko/references/sdk/web3js-ext/getting-started/

    • https://docs.kaia.io/ko/references/sdk/caver-js/

    EIP-1193

    Wallet Connect Flow

    • Does the follow the Wallet Connect flow below? Access Mini Dapp (LIFF) → Consent to Channel → Add Official Account → Launch Dapp → Wallet Connect (e.g. at payment or reward step)

    • Does the follow the Wallet Connect flow below? Access Mini Dapp (Web) → Wallet Connect → Launch Dapp

    • Is the clearly shown to the user?

    Payment Features

    • Is payment supported via the SDK? (Both Crypto and Stripe must be supported)

    • Are shown before payment?

    • Are (UI/UX) properly provided?

    • Is the openPaymentHistory()

    LINE Integration

    • Are LINE Login, Messaging API channels, and a Published LIFF created via ?

    • Is the Official Account (OA) properly linked and aggressive set? Go to LINE Developers > LINE Login Channel > LIFF > Add friend option, and set it to On (aggressive)

    • Is the OA Rich Menu configured according to the ?

    Invite Friends

    • In the , is ShareTargetPicker implemented for inviting friends?

    • In the Web version, is a “copy invite link” feature available?

    UX/UI

    • Is the implemeted based on user's browser settings or IP? (English and Japanese must be supported)

    • Is the in the format {Mini Dapp Name} | Mini Dapp?

    • Is properly set for the Mini Dapp’s URL?

    Security

    • Never expose wallet private keys, clientSecret, or other sensitive credentials in frontend code, version control, or unsecured environments. These credentials must be securely stored on the backend or in a protected secrets management system.

    Game Content Determination

    • Please review the Game Content Determination Checklist.

      • Is the primary purpose of the Mini Dapp to provide entertainment or fun?

      • Do different outcomes occur based on user actions?

      • Are there clear rules and constraints?

    Compliance

    Gambling-related

    • Specifications that provide cash or virtual assets as rewards based on probability using items purchased through payment are not permitted.

    • Specifications that provide gacha mechanisms that can offer substantial value based on probability using in-app currency or virtual assets are not permitted.

    • Specifications that allow participants to receive cash rewards through prize lotteries or slot games by paying a fee are not permitted.

    Violence

    • Games or content that contain extreme violent elements are not permitted.

    Crime and Drug

    • Content that promotes crime, drug use, abusive behavior, or inappropriately depicts alcohol and tobacco use is not permitted.

    Discrimination and Hate

    • Content that contains derogatory remarks or statements regarding race, gender, or sexual orientation is not permitted.

    Explicitness

    • Any content that is sexually explicit or contains sexual depictions is not permitted.

    Securities

    • Services that have securities are not permitted (where there is an expectation of profit, investment of assets, the invested assets are in a joint enterprise, and profits come from a third party).

    Platform Support

    • Are both LIFF(LINE) and Web versions supported?

    SDK

    • Is the applied?

    • Has the been generated via Reown and the domain successfully verified?

    JPY

    0

    999,999

    80

    TWD(NTD)

    2

    999,999

    17

    THB

    2

    999,999

    18

    Crypto

    KAIA

    4

    999,999

    0.01

    USDT

    2

    999,999

    0.01

    Purchase canceled

    User's Crypto balance is insufficient

    Insufficient balance

    Other errors

    Please try again later

    Update NFT Information

    NFT API

    update NFT metadata

    put https://api.dappportal.io/api/b2b-v1/nfts/{chain}/{contract_address}/{token_id}/metadata To ensure the security of your secret key, this API should be called from a secure server environment rather than directly than from webpage(FrontEnd).

    Parameters

    Name
    Description

    HMAC Signature Generation Example (Node.js)

    Example code to generate X-Auth-Signature header for secure API calls.

    Request Body

    Example Value
    Schema

    Responses

    HTTP Status Code
    description

    Code Example (python)

    Request Timeout

    Read Timeout: Must be at least 10 seconds

    • The server may take several seconds to respond depending on load and metadata processing time.

    • Please ensure your HTTP client is configured to wait at least 10 seconds for a response.

    const walletProvider = sdk.getWalletProvider();
    WalletProvider
    const walletType = walletProvider.getWalletType();
    enum WalletType {
        Web = "Web",
        Liff = "Liff",
        Extension = "Extension",
        Mobile = "Mobile",
        OKX = "OKX",
        BITGET = "BITGET"
    }
    const getAccount = async() => {
       const accounts = await walletProvider.request({ method: 'kaia_accounts' }) as string[]; 
       return accounts[0]; 
    } 
    
    const requestAccount = async () => {
       const addresses = await walletProvider.request({ method: 'kaia_requestAccounts' }) as string[];
       return accounts[0];
    }
    
    const connectAndSign = async (msg:string) => {
       const [account, signature] = await walletProvider.request({ method: 'kaia_connectAndSign', params: [msg]}) as string[];
       return [account, signature];
    }
    
    const getBalance = async(params: [account:string,blockNumberOrHash:'latest' | 'earliest'])=>{
       return await walletProvider.request({ method: 'kaia_getBalance', params: params });
    }
    
    const transaction = {
      from: 0xYourWalletAddress, //The currently connected wallet account can be retrieved using the kaia_accounts method.
      to: '0xRecipientAddress', //Please replace it with a valid wallet address.
      value: '0x10',
      gas: '0x5208', //general gas usage for Kaia transaction
    };
    
    const sendTransaction = async(transaction) => {
        const transactionHash = await walletProvider.request({ method: 'kaia_sendTransaction', params: [transaction]});
        return transactionHash;
    };
    Promise<unknown>
    {code: -32001, message: 'User canceled'}
     const disconnectWallet = async ()=>{
        await walletProvider.disconnectWallet();
        window.location.reload();
    }
    const getErc20TokenBalance = async(contractAddress:string,account:string)=> {
        return await walletProvider.getErc20TokenBalance(contractAddress,account);
    }
    
    const USDTContractAddress = '0xd077a400968890eacc75cdc901f0356c943e4fdb';
    const account = 'my_account_address';
    getErc20TokenBalance(USDTContractAddress, account).then(balance => {
        const formattedUSDTBalance = Number(microUSDTHexToUSDTDecimal(balance as string)).toFixed(2);
        //microUSDTHexToUSDTDecimal is format function to transform hexadecimal string to decimal string
        //https://github.com/techreadiness/dapp-starter/blob/main/src/utils/format.ts
        console.log(formattedUSDTBalance);
        //0.00
    })
    string

    Is the disconnectWallet feature available?

    feature available?
  • Are fiat/crypto prices displayed based on real-time rates? (e.g., CMC, Kaia Open API)

  • Does the Connect button comply with the Dapp Portal design guideline?
  • Is a Close Confirmation Dialog provided?

  • Is there a game-like flow with start, progress, and end?

  • Are there obstacles to overcome and a sense of accomplishment?

  • If the Mini Dapp is determined to qualify as a game, make sure to refer to the GRAC guideline document.

  • Intellectual Property

    • Services that use intellectual property that is not owned for commercial purposes are not permitted.

    Prize Contest Law

    • In the case of rewards that are contingent upon payment, the following criteria must be met.

      • Paid below 1,000 YEN ; Max reward 200 YEN

      • Paid equal to/over 1,000 YEN ; Max reward 20% of paid volume

    Comprehensive regulatory compliance

    • Additionally, services that are generally difficult to reference based on societal norms may not be permitted depending on the review by the Dapp Portal team.

    latest version of the Mini Dapp SDK
    ProjectId
    LINE version
    Web version
    connected wallet address
    in-app item
    purchase precautions
    payment status notifications
    LINE Developers
    design guide
    LIFF version
    language localization
    browser tab title
    OpenGraph

    kaia_getBalance Returns the kaia balance.

    [account: string, blockNumberOrHash: string] blockNumberOrHash can be set as latest or earliest

    • latest: the most recent block

    • earliest: the genesis block (block 0)

    the balance value in kei, the smallest unit of the KAIA blockchain. 1 KAIA = 10^18 kei

    kaia_sendTransaction Constructs a transaction with given parameters

    [{ from: string, to: string, value: string, gas: string }] from field should be the account that achieved from 'kaia_accounts','kaia_requestAccounts' or 'kaia_connectAndSign'

    transactionHash

    EIP-191
    EIP-191
    "0x00000000000000000"
    "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d059210"26d1527331
    ['Account1']
    ['Account1']
    "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
    ["account","0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"]
    {
      "code": -32001,
      "message": "User canceled" 
    }
    //When the user dismissed the wallet connection popup.
    {code: -32001, message: 'User closed popup', data: null}
    //When the user clicks the dismiss button on the signature popup
    {
      "code": -32001,
      "message": "User denied message signature"
    }
    //When the user clicks the dismiss button on the transaction popup
    {
      "code": -32001,
      "message": "User denied transaction send."
    }

    X-Auth-Salt *required string (header)

    Salt used in the X-Auth-Signature (a unique random value provided by the client for each request) (Length: 36 characters, UUID v4 format)

    500

    chain *required string (path)

    chain name : "kairos", "kaia"

    contract_address *required string (path)

    contract address of NFT

    token_id *required string (path)

    token id of NFT

    X-Auth-Signature *required string (header)

    HMAC (clientId + method + path + timestamp + salt) key={secret} You can find the code example below.

    X-Auth-ClientId *required string (header)

    client id obtained from support team

    X-Auth-Timestamp *required string (header)

    Timestamp used in the X-Auth-Signature (request time) This parameter is included to protect against replay attacks.

    200

    null

    400

    400

    400

    429

    500

    How to Claim USDT for STRIPE transaction

    Claim Process

    The settlement of Stripe payment revenue follows the policy .

    1. Retrieve an information for creating transaction for the claim from the Dapp Portal.

    Official Account

    Guide

    See the for detail information.

    Create OA as Unverified and Integrate it to Mini Dapp

    const crypto = require('crypto');
    /**
     * Generates an HMAC signature for API authentication.
     * @param {string} secret - Shared secret key used for HMAC.
     * @param {string} clientId - Public client identifier.
     * @param {string} method - HTTP method (e.g., GET, POST).
     * @param {string} path - Request path (e.g., /api/v1/resource).
     * @param {string} timestamp - UNIX timestamp (in seconds).
     * @param {string} salt - Random value (e.g., UUID or random bytes).
     * @returns {string} - Base64-encoded HMAC signature.
     */
    function generateHmacSignature(secret, clientId, method, path, timestamp, salt) {
      const message = `${clientId}|${method.toUpperCase()}|${path}|${timestamp}|${salt}`;
      const hmac = crypto.createHmac('sha256', secret);
      hmac.update(message);
      return hmac.digest('base64');
    }
     
    const secret = 'your-secret-key';
    const clientId = 'client-abc-123';
    const method = 'POST';
    const path = '/api/v1/order';
    const timestamp = Math.floor(Date.now() / 1000).toString();
    const salt = crypto.randomUUID(); 
    const signature = generateHmacSignature(secret, clientId, method, path, timestamp, salt);
     
    // debug code
    console.log('X-Client-Id:', clientId);
    console.log('X-Timestamp:', timestamp);
    console.log('X-Salt:', salt);
    console.log('X-Auth-Signature:', signature);
    {
      "name": "title1",
      "image": "https://data.dappportal.io/nft/N6788dcf821089d16387aac02/e9856c3c-7a74-4545-b75b-2df5b49fd41f/image/1.png",
      "cached_image": "https://obs.line-scdn.net:443/0h5TZGDWSkantnPnuVeJwVLD1rZAoLT3NuHgh4Axp7YBdUXHYsHiRMeh9sQg4BXltRECdTXBxsViABb0tsHSd9dkNfUkoWW0gsEjN6fhxtfxZKZUskEApubQRFaBFCcl0",
      "description": "description1",
      "attributes": [
        {
          "trait_type": "Color",
          "value": "Green"
        },
        {
          "trait_type": "Level",
          "value": "5 level"
        },
        {
          "trait_type": "Birthday",
          "value": "2024.12.5"
        }
      ]
    }
    {
      name: string,
      description: string,
      image: string,
      attributes: [Atribute {
                  trait_type: string,
                  value: string
                  }]
    }
    {
        "code": "UNAUTHENTICATED"
    }
    {
        "code": "INVALID_PARAMS"
    }
    {
        "code": "NOT_MODIFIABLE_COLLECTION"
    }
    {
        "code": "TOO_MANY_REQUESTS"
    }
    {
        "code": "LOCK_ACQUISITION_FAILED"
    }
    import datetime
    import hmac
    import uuid
    import base64
    import json
     
    import requests
     
    secret_key = "your-secret-key"
    client_id = "your-client-id"
    method = "PUT"
    chain = "kairos" //test chain
    contract_address = "contract-address"
    token_id = "1"
    path = f"/api/b2b-v1/nfts/{chain}/{contract_address}/{token_id}/metadata"
    timestamp = str(int(datetime.datetime.now().timestamp()))
    salt = str(uuid.uuid4())
    plain_text = f"{client_id}|{method.upper()}|{path}|{timestamp}|{salt}"
    print(f"plain_text: {plain_text}")
     
    # Generate HMAC SHA256 Signature
    hmac_obj = hmac.new(secret_key.encode('utf-8'), plain_text.encode('utf-8'), digestmod='sha256')
    signature = base64.b64encode(hmac_obj.digest()).decode('utf-8')
     
    host="https://api-dapp-portal.line-apps-beta.com"
    url = f"{host}{path}"
    headers = {
        "Content-Type": "application/json",
        "X-Auth-Client-Id": client_id,
        "X-Auth-Signature": f"{signature}",
        "X-Auth-Timestamp": timestamp,
        "X-Auth-Salt": f"{salt}",
    }
    body = {
        "name": "Hello",
        "uploadImageUrl": "https://line-objects-dev.com/dapp-portal-item/nft/N687e0c575d1ae92019138c5f/5734cbaa-5d49-4702-abaa-a3074808373f/image/9.jpg",
        "attributes": [
            {
                "trait_type": "color",
                "value": "red"
            },
            {
                "trait_type": "level",
                "value": "11 level"
            }
        ],
    }
     
    print("=====[request]=====")
    print(f"request_url: {url}")
    print(f"request_header: {headers}")
    print(f"request_body: {body}")
    response = requests.put(url, headers=headers, data=json.dumps(body))
    print(f"HTTP Status: {response.status_code}")
    print(f"Response Body: {response.text}")
    {
        "code": "UNKNOWN_ERROR"
    }

    Sign the transaction using the address currently receiving Kaia-based settlements.

  • Broadcast signed transaction.

    1. If fee delegation is enabled, transfer the signed transaction to the Fee Payer Server.

    2. If fee delegation is not used, broadcast the signed transaction directly to a Kaia node.

  • API to retrieve information to create unsigned transaction

    Request API to receive STRIPE payment revenue in USDT

    API Path

    get /api/b2b-v1/dapp-settlements/{client_id}/signed-receivable

    Domain

    https://api.dappportal.io

    Path

    /api/b2b-v1/dapp-settlements/{client_id}/signed-receivable

    Authentication Information

    This API requires Dapp Portal authentication.

    Please include the following information in the request headers for authentication

    Name
    Description

    client_id *required string (path)

    Client identifier string (36 bytes) obtained from support team

    X-Auth-Client-Id *required string (header)

    Client identifier string (36 bytes) obtained from support team

    X-Auth-Timestamp *required string (header)

    Current time in Unix epoch format

    X-Auth-Salt *required string (header)

    Randomly generated UUID string (36 bytes)

    X-Auth-Signature *required string (header)

    (*) HMAC-based signature proving request authenticity

    (*) base64encode(hmac("{clientId}|GET|/api/b2b-v1/dapp-settlements/{clientId}/signed-receivable|{timestamp}|{salt}"))

    Response

    field
    type
    description
    example

    transaction

    • to

    String

    contract address to call

    "0xdce5..."

    • value

    String

    native token's amount to send

    Sample Code

    Retrieve transaction executing load() function from Dapp Portal

    Create and Sign Transaction

    1. Create transaction with response from Dapp Portal.

      1. to, value, data

    2. Sign the transaction using the address currently receiving Kaia-based settlements.

    3. Broadcast signed transaction.

      1. If fee delegation is enabled, transfer the signed transaction to the Fee Payer Server.

        1. Domain:

        2. Path: /api/signAsFeePayer

        3. POST (application/json) { userSignedTx: {rawSignedTx} }

      2. If fee delegation is not used, broadcast the signed transaction directly to a Kaia node.

    Sample Code

    ⚠️ This sample code applies to cases where the Kaia Wallet (Web Extension) is used.

    If you choose to sign the unsigned transaction (obtained via API) using a different method, please make sure to use the signing method appropriate for your chosen approach.

    Complete Example: From Claim to Broadcast

    ⚠️ The example code provided is for illustrative purposes only. You should review and modify it appropriately to ensure it fits securely within your production environment. We do not take any responsibility for issues or damages caused by using this code as-is.

    here

    OA with unverified : It's an OA that does not need to get approval from separate LINE local entity.

  • OA with verified : It's an OA approved from LINE local entities in Japan, hailand, and Taiwan.

    • To create OA with verified, you should get approval from local legal entities, and the approval process is very long (it can take about 3 months or more

  • OA Profile (Required)

    Use same concepts as the one of your Mini Dapp.

    Contents for OA

    Welcome Message (Text)

    Language

    • Default: English (Since the OA channel is a public channel accessible to users from all countries, we request the messages to be set in English by default.)

    • Optional: Japanese, Thai, Taiwanese

    • You can send Welcome Message with various languange as one chat

    Welcome Message (Rich)

    You can use Images or Videos with general text message. (CTA URL is required)

    Rich Menu

    Default language is English

    Template

    • Please create the rich menu images and set the URLs according to the template guide below. This template is the optimal flow to encourage users to transition to Dapp. When creating the rich menu image, a clean and conversion-driven design is required.

    • A

      • URL: Mini Dapp URL (LIFF)

    • B & C

      • URL: Mini Dapp Social Channels, Website URL, etc.

    • D

      • (Required) As an official LINE Mini Dapp, this section provides a path to the Dapp Portal and encourages cross-selling between Dapps.

      • Image: Mini Dapp Icon + Portal Wordmark (attached)

      • URL: (Dapp Portal LIFF)

    • Image Files

    Message

    • If you want to send messages to specific users, use BOTs, or integrate OA with external services, you need to use the Messages API. In this case, please see the attached Message API URL for reference.

    Recommendation) Operate Welcome Messages in Multiple Languages (Requires Additional Development)

    • By implementing additional development, you can send welcome messages tailored to the user's language setting when they follow the OA channel. (Refer to the guide below for details.)

    Step
    Details

    1

    Create an OA channel on LINE Developers.

    2

    • Implement an API to receive Webhook events for the OA channel (used in Step 8).

    • method : POST

    • URL: Flexible

    • Refer to the .

    3

    When a is received via the Webhook, retrieve the userId from the request body.

    4

    • Use the retrieved userId to fetch the user’s language setting on LINE.

    • Use the channel access token issued from the Messaging API tab in LINE Developers.

    • Utilize the to retrieve the user’s language.

    5

    • Create templates for OA messaging. Configure the necessary content in multiple languages for each locale and store the templates locally or in the cloud. Refer to the for template formatting.

    • Example: For Korean and English support, save the templates as:

      • oa_ko.json

    6

    Load the appropriate template based on the user's language retrieved in Step 4, and call the .

    OA consent must be set right after Mini Dapp(LIFF) channel consent

    • When a user connects to Mini Dapp(LIFF) for the first time, User must agree to the channel of Mini Dapp(LIFF). Channel consent is not created separately, it is created by default when the Mini Dapp is created as LIFF, and the consent process is shown to the user.

      • You can attach the Add OA Friends popup right after channel consent. Therefore, please refer to the following document to learn how to set up OA consent after channel consent. It is necessary to select the AGGRESIVE VERSION.

      • How to set up OA Aggressive mode

        • Go to LINE Developers > LINE Login Channel > LIFF > Add friend option, and set it to On (aggressive).

    Official Account Subscription Plans

    Note that this is the cost of operating one OA, and the cost of multiple OAs will adds up.

    LINE OpenChat

    Openchat can be utilized for two-way communication outside of OA.

    • OpenChat is only available to users in Japan, Thailand, and Taiwan.

    • To create Open Chats in Japan, Thailand, and Taiwan, you'll need a LINE account for each country. For example, a Japanese account is required to create a Japanese Openchat.

    • You can add a translation bot to OpenChat. You can only add one language and it is recommended to use a translation bot for your target country.

      • Example) When adding a Korean<>English bot, if a user posts a chat in Korean, the translation bot will automatically translate it to English. If the user posts in English, it will be automatically translated to Korean.

    Create an Account | LINE for Business
    80KB
    Portal.png
    Open
    55KB
    Portal_white.png
    Open
    5KB
    (Dapp) Portal.png
    Open

    FAQ

    SDK Issuance & Environment Setup

    Q. When will the SDK be issued?

    A. The SDK will be issued within 3 business days from the date of submitting the SDK T&C. The clientId and clientSecret will be sent to your registered email.

    Q. Do we need to develop both Web and LINE(LIFF) versions?

    A. Yes, that’s correct. The LINE(LIFF) version is designed for LINE users and allows seamless access within the LINE mobile app. On the other hand, the Web version is accessible via mobile browsers or PC environments, and it's intended for non-LINE users who do not use LINE Login.

    Q. Do we need to configure chainId for the SDK?

    A. Yes. The chainId is used to distinguish between the testnet and mainnet environments. By default, it is set to testnet(chainId: 1001). During development, please use the testnet to test wallet integration and payment flows. For real payment testing or official launch, you must switch to the mainnet(chainId: 8217).

    Q. Where can I get updates about SDK version changes?

    A. SDK version updates are announced through the official Telegram channel. 📢 Once you join, you’ll receive the latest updates and announcements related to the SDK.

    Q. Can I integrate the Mini Dapp SDK with Unity or Cocos engine?

    A. Yes, you can. By porting your Unity or Cocos project to WebGL, you can integrate it as a web application using the Mini Dapp SDK. For detailed instructions, please refer to the integration guide.

    Q. Do you provide sample code?

    A. Sample code is provided in the following document.

    • Sample code by method:

    • Full integration sample code:

    Wallet Provider

    Q. Why does an “Invalid Origin” error occur and wallet connection fail?

    A. The SDK only works properly on domains registered in the whitelist. Please share your test domain via the Tech Support Channel or email, and we will assist you in registering it to the domain whitelist.

    Q. Why is the wallet connection window not opening?

    A. If DappPortalSDK.init() is repeatedly called on every request in the Web/LIFF version, it may cause malfunction. Therefore, we strongly recommend calling DappPortalSDK.init() only once during app startup and managing it as a singleton instance. In addition, for the LIFF version, make sure to call DappPortalSDK.init() after liff.init() has been successfully completed.

    Q. Why does OKX Wallet fail to connect or require re-entry to the Mini Dapp on certain devices when using kaia_requestAccounts and personal_sign?

    A. This issue is typically caused by timing conflicts during the signature step after wallet connection. To ensure a more stable experience, we recommend using kaia_connectAndSign instead.

    Q. How can I persist the Wallet Connect session when re-entering or refreshing the Mini Dapp after wallet connection?

    A. First, call kaia_accounts to check if there is an existing connected wallet.

    • If a connected wallet is found, you can use that wallet information directly.

    Q. Why is it necessary to implement disconnectWallet()?

    A. You need to implement disconnectWallet() in the following cases:

    • When the user has lost the password for the previously connected wallet,

    Q. Can I provide external wallets such as MetaMask instead of using the Mini Dapp SDK wallet integration?

    A. No, it is not allowed. To launch a Mini Dapp, you must use the wallet integration method provided by the Mini Dapp SDK. External wallet integrations such as MetaMask are not supported.

    Q. How are user accounts identified?

    A. In both Web and LINE(LIFF) versions, user accounts should be distinguished by their wallet address. However, in the LINE version, users can enter the Mini Dapp without connecting a wallet. In such cases, you should temporarily create an account based on the user's LINE ID upon first entry, and map the Wallet Address to that account once the wallet connection is completed.

    Q. Should accounts be compatible between Web and LINE(LIFF) versions?

    A. Yes. Both Web and LINE(LIFF) versions support wallet types such as LINE, OKX, and Bitget Wallet. If the same wallet address is used in both environments, it is recommended to maintain compatibility between the accounts for a seamless user experience and consistent login and asset information.

    Q. Can I retrieve LINE ID or profile info via LINE Login in the Web version?

    A. No, the Web version does not support LINE Login. If implemented, it must be removed. The Web version is intended for non-LINE users, including PC users, and should not include features that require LINE authentication. LINE-related features should be provided only in the LIFF version.

    Q. Is there a way to distinguish between LIFF and Web browser environments?

    A. Yes. You can use the liff.isInClient() method to detect the environment.

    • If liff.isInClient() returns true: This indicates the LIFF environment. In this case, run liff.init() first, then call DappPortalSDK.init()

    Q. Why is Bitget Wallet not shown in the wallet selection list?

    A. To display Bitget Wallet in the wallet list, you must register a projectId. Please follow the to create a projectId, then submit it through the Tech Support channel for registration.

    Q. What causes unknown errors when signing a transaction with a connected wallet?

    A. This may occur if the Wallet Address requesting the signature differs from the actual signing Wallet Address. Please check that the Wallet Address connected via:

    • Web:

    • LIFF:

    Payment Provider

    Q. Do we need to support both Crypto and Stripe payments?

    A. Yes, both payment methods must be supported. However, if adjustments are required due to specific service structures or policies, you may selectively support one method after consultation with the BD or Tech Support channel.

    Q. Why does an error occur during payment testing?

    A. Please first check whether the parameters you provided match the in the documentation. Even if the code seems correct, errors may still occur during testing. If the issue persists, please contact the Tech Support channel for assistance.

    Q. What are lockUrl and unlockUrl?

    A. These are useful features when selling products with limited stock. They temporarily “lock” the quantity while a user is attempting to purchase the product, preventing other users from buying the same item simultaneously. This mechanism helps avoid duplicate purchases during the payment process and enables more accurate inventory management.

    ⚠️ Note: If the product has no quantity limit, set both lockUrl and unlockUrl to null.

    Q. Crypto payment works, but why does Stripe payment fail? (An error code 500 is returned when startPayment() is called)

    A. This usually happens when the imageUrl parameter is invalid or not accessible from outside. Please make sure the product image URL is valid and publicly accessible.

    Q. Why isn’t the webhook being received?

    A. The paymentStatusChangeCallbackUrl must be accessible over the public network. You should either:

    • Make the URL publicly accessible, or

    • Whitelist the Dapp Portal server IPs.

    Q. Why does createPayment succeed but startPayment return an error? (An error code 400 is returned when startPayment() is called)

    A. This indicates that something went wrong during the startPayment phase. Please check the paymentId and the returned error code used in the test. For root cause analysis and further assistance, share the details via the Tech Support channel.

    Q. What causes an "Internal JSON-RPC error" or a blank payment screen to appear?

    A. This issue typically occurs when the configured chainId and testMode values do not match.

    • Testnet: chainId: 1001, testMode: true

    Q. How can I perform real payment testing?

    A. Real payment testing is only available after your settlement information has been updated. This update is completed after your team submits the Due Diligence (DD) form.

    Once your launch schedule is confirmed, the Kaia Wave team will request your DD submission. In general, real payment testing becomes available three business days before the official launch.

    If you need to test earlier, please contact the Tech Support channel to request an exception.

    ⚠️ Note: Real payment tests are non-refundable, so please proceed with caution.

    Q. Is there a minimum payment amount for products?

    A. Yes, there is a minimum payment threshold:

    • USD: Minimum of $0.5

    • KAIA: Minimum of 0.01 KAIA

    For more details, please refer to the

    Q. Is it mandatory to apply exchange rates for Crypto payment products?

    A. Yes, you must provide a converted price based on the current market rate. This ensures transparency for users and accuracy in payment processing.

    While the SDK does not provide exchange rate conversion, you can use external services such as:

    • CoinMarketCap(CMC)

    Q. Why is it necessary to provide a payment history feature?

    A. Users must be able to view their own payment history, which:

    • Increases user trust

    • Helps customer support(CS) by referencing paymentId and other data

    LINE Integration

    Q. How do I create a LINE Developers account?

    A. Developers must use their personal LINE account to create a LINE Business ID (Provider).

    • Shared or team accounts are not supported in Dapp Portal.

    If you're unable to create the account, please contact the Tech Support channel for assistance.

    Q. What should I do if I can't create a LINE MINI App?

    A. Mini Dapp do not support LINE MINI App. Instead, use a combination of the LINE Login channel and Messaging API channel to build your LIFF version.

    Please build your LIFF app based on the LINE Login channel, not LINE MINI App.

    Q. How should I set the "Region to provide the service" when creating a LINE Login channel?

    A. This setting should reflect the primary target country of your service, not the country where your company is incorporated.

    Regardless of the selected region:

    • All LINE-available countries can access your service

    Q. How do I link an OA (Official Account) to a LINE Login channel?

    A. Follow these steps:

    1. Create the OA: Under the same Provider, create a Messaging API channel and generate an OA.

    1. Enable Messaging API: Go to → Settings → Enable Messaging API → Select Provider → Agree

    Q. How do I create a LIFF URL?

    A. Follow these steps:

    LINE Login Channel → LIFF → Add → Fill in LIFF Details

    • LIFF app name: Your dApp service name

    • Size: Full

    Q. How do I enable OA Aggressive Add Friend mode?

    A. Follow these steps:

    LINE Login Channel → LIFF → LIFF Detail → Add Friend Option → On (aggressive)

    Q. Why am I getting a 403 error when accessing the LINE(LIFF) version?

    A. LIFF URLs are inaccessible if the LINE Login channel is not in Published status. Please switch to Published mode when submitting your Demo or performing tests.

    Q. Is it okay to publish the LINE(LIFF) version before launch?

    A. Yes. As long as you do not share the LIFF URL or test domain externally, general users won’t have access.

    Publishing early can help streamline Demo submission and testing. If you must test without publishing, you can add the reviewer’s email as an admin to the LINE Login channel.

    Web3 Provider

    Q. What causes the error: “Sending transaction was failed after ~ try, network is busy”?

    A. This is a temporary error caused by high network traffic. If this occurs, simply retry the transaction — it should eventually succeed.

    {
      "receivable": {
        "claimer_id": "",
        "sequence_begin": "",
        "sequence_end": "",
        "vault_address": "",
        "recipient_address": "",
        "token_address": "",
        "amount": "",
        "deadline": ""
      },
      "signature": "",
      "transaction": {
        "to": "",
        "data": "",
        "value": ""
      }
    }
    function toBase64(buffer) {
        const bytes = new Uint8Array(buffer);
        let binary = '';
        for (let b of bytes) {
            binary += String.fromCharCode(b);
        }
        return btoa(binary);
    }
     
    async function calcHmac(clientSecret, clientId, method, path, timestamp, salt) {
        const msg = `${clientId}|${method.toUpperCase()}|${path}|${timestamp}|${salt}`;
        const enc = new TextEncoder();
        const key = await crypto.subtle.importKey(
            'raw',
            enc.encode(clientSecret),
            {name: 'HMAC', hash: {name: 'SHA-256'}},
            false,
            ['sign'],
        );
        const sig = await crypto.subtle.sign('HMAC', key, enc.encode(msg));
        return toBase64(sig);
    }
     
    async function load(domain, clientId, clientSecret) {
        const request = {
            method: 'GET',
            path: `/api/b2b-v1/dapp-settlements/${clientId}/signed-receivable`,
            timestamp: Math.floor(Date.now() / 1000).toString(),
            salt: crypto.randomUUID()
        };
     
        // prepare the hmac
        const signature = await calcHmac(
            clientSecret,
            clientId,
            request.method,
            request.path,
            request.timestamp,
            request.salt,
        );
     
        // load the transaction
        const response = await fetch(
            `${domain}${request.path}`, {
                method: request.method,
                headers: {
                    'X-Auth-Client-Id': clientId,
                    'X-Auth-Timestamp': request.timestamp,
                    'X-Auth-Salt': request.salt,
                    'X-Auth-Signature': signature,
                },
            });
        return await response.json();
    }
    async function connect() {
        const provider = window.klaytn;
        await provider.request({
            method: 'klay_requestAccounts',
            params: [],
        });
    }
    
    #In case of broadcasting signed tx directly
    async function claim(transaction) {
        // sign the transaction
        const provider = window.klaytn;
        const gasPrice = await provider.send('klay_gasPrice', []);
        const sufficientGas = '0x40000';
        const tx = {
            from: provider.selectedAddress,
            to: transaction.to,
            data: transaction.data,
            value: transaction.value,
            gasPrice: gasPrice.result,
            gas: sufficientGas,
        };
        return await provider.send('klay_sendTransaction', [tx]);
    }
     
    #In case of broadcasting signed tx wih fee delegation server
    async function claimFeeDelegated(domain, transaction) {
        // sign the transaction
        const provider = window.klaytn;
        const gasPrice = await provider.send('klay_gasPrice', []);
        const sufficientGas = '0x40000';
        const tx = {
            type: 49,
            from: provider.selectedAddress,
            to: transaction.to,
            data: transaction.data,
            value: transaction.value,
            gasPrice: gasPrice.result,
            gas: sufficientGas,
        };
        const signedTx = await provider.send('klay_signTransaction', [tx]);
     
        // send the signed transaction to the fee delegation server
        const response = await fetch(`${domain}/api/signAsFeePayer`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                userSignedTx: {raw: signedTx.result.rawTransaction},
            }),
        });
        return await response.json();
    }
    function toBase64(buffer) {
        const bytes = new Uint8Array(buffer);
        let binary = '';
        for (let b of bytes) {
            binary += String.fromCharCode(b);
        }
        return btoa(binary);
    }
     
    async function calcHmac(clientSecret, clientId, method, path, timestamp, salt) {
        const msg = `${clientId}|${method.toUpperCase()}|${path}|${timestamp}|${salt}`;
        const enc = new TextEncoder();
        const key = await crypto.subtle.importKey(
            'raw',
            enc.encode(clientSecret),
            {name: 'HMAC', hash: {name: 'SHA-256'}},
            false,
            ['sign'],
        );
        const sig = await crypto.subtle.sign('HMAC', key, enc.encode(msg));
        return toBase64(sig);
    }
     
    async function connect() {
        const provider = window.klaytn;
        await provider.request({
            method: 'klay_requestAccounts',
            params: [],
        });
    }
     
    async function load(domain, clientId, clientSecret) {
        const request = {
            method: 'GET',
            path: `/api/b2b-v1/dapp-settlements/${clientId}/signed-receivable`,
            timestamp: Math.floor(Date.now() / 1000).toString(),
            salt: crypto.randomUUID()
        };
     
        // prepare the hmac
        const signature = await calcHmac(
            clientSecret,
            clientId,
            request.method,
            request.path,
            request.timestamp,
            request.salt,
        );
     
        // load the transaction
        const response = await fetch(
            `${domain}${request.path}`, {
                method: request.method,
                headers: {
                    'X-Auth-Client-Id': clientId,
                    'X-Auth-Timestamp': request.timestamp,
                    'X-Auth-Salt': request.salt,
                    'X-Auth-Signature': signature,
                },
            });
        return await response.json();
    }
     
    async function claim(transaction) {
        // sign the transaction
        const provider = window.klaytn;
        const gasPrice = await provider.send('klay_gasPrice', []);
        const sufficientGas = '0x40000';
        const tx = {
            from: provider.selectedAddress,
            to: transaction.to,
            data: transaction.data,
            value: transaction.value,
            gasPrice: gasPrice.result,
            gas: sufficientGas,
        };
        return await provider.send('klay_sendTransaction', [tx]);
    }
     
    async function claimFeeDelegated(domain, transaction) {
        // sign the transaction
        const provider = window.klaytn;
        const gasPrice = await provider.send('klay_gasPrice', []);
        const sufficientGas = '0x40000';
        const tx = {
            type: 49,
            from: provider.selectedAddress,
            to: transaction.to,
            data: transaction.data,
            value: transaction.value,
            gasPrice: gasPrice.result,
            gas: sufficientGas,
        };
        const signedTx = await provider.send('klay_signTransaction', [tx]);
     
        // send the signed transaction to the fee delegation server
        const response = await fetch(`${domain}/api/signAsFeePayer`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                userSignedTx: {raw: signedTx.result.rawTransaction},
            }),
        });
        return await response.json();
    }
    Add type: 49 while creating transaction to use fee delegation

    "0x0"

    • data

    String

    data of smart contract

    "0x...."

    https://fee-delegation.kaia.io
    If no connected wallet is found, proceed with wallet reconnection using
    kaia_requestAccounts
    or
    kaia_connectAndSign
    .
    When the wallet connected via wallet.dappportal.io differs from the one connected in the Mini Dapp,
  • Or when the user wants to switch to a different wallet.

  • In such cases, access to the Mini Dapp may be restricted. Implementing disconnectWallet() allows users to disconnect the current wallet and connect a new one.

    .
  • If liff.isInClient() returns false: This indicates a standard web environment. Only call DappPortalSDK.init().

  • is the same Wallet Address being used for signing.
    Additionally, the callback must return an HTTP 200 OK response to ensure successful webhook delivery.

    Mainnet: chainId: 8217, testMode: false

    Please ensure that these values are correctly configured according to the environment and try testing again.

    .
    Kaiascan Open API

    to fetch real-time price data and apply it accordingly.

    The SDK provides an openPaymentHistory() function, so please implement this in:
    • The In-App Store page, or

    • Any other screen that users frequently visit.

    There are no functional differences based on the selected region

    Link the OA: LINE Login Channel → Basic Settings → Add Friend Option → Linked LINE Official Account → Select OA

    Endpoint URL: Your service domain

  • Scopes: openid (required), profile (optional), chat_message.write (unchecked)

  • Add friend option: On (aggressive)

  • Module mode: Disabled

  • Join the official Telegram channel
    https://minidapp-demo.dappportal.io/
    https://docs.dappportal.io/mini-dapp/overview/dapp-starter
    guide documentation
    https://wallet.dappportal.io/
    https://liff.line.me/2006533014-r4jJyjy2
    example request code
    https://manager.line.biz/account
    guide documentation

    It is recommended to verify the Webhook signature.

    oa_en.json

    7

    Access the Messaging API tab in LINE Developers.

    8

    • Set the API endpoint developed in Steps 1–6 as the Webhook URL.

    • Turn the Use Webhook option to ON.

    9

    From now on, whenever a user follows the OA, a welcome message will automatically be sent in the user’s language.

    (*Please make sure to turn OFF the welcome message setting in the existing Official Account Manager.)

    https://liff.line.me/2006533014-8gD06D64
    Webhook specifications
    Follow Event
    Get Profile API
    Message Objects API
    OA Send API

    Payment

    01. Payment Flow

    Flowchart

    Polling

    Webhook

    1. Triggering createPayment API from Mini Dapp

    When a user requests a purchase, the Mini Dapp Client sends the item information to the Mini Dapp Server. The Mini Dapp Server then calls the createPayment API on the Dapp Portal Payment Server. The createPayment API responds with a payment ID in the format: { id: <payment_id> }.

    Request

    Response

    2. Get paymentProvider from sdk instance.

    The Mini Dapp Client retrieves the PaymentProvider instance from sdk with getPaymentProvider method.

    3. Start payment process via paymentProvider.

    Then, call the startPayment method of the paymentProvider, passing the paymentId received from step 1 as a parameter.

    4. Check payment status and finalize payment.

    There are two ways to check the payment status:

    Client-side: Wait for the promise returned by the startPayment method to resolve. When the promise resolves, the payment status is updated to FINALIZED

    Server-side: Handle the payment status via a webhook event on the server. When using webhooks, the Dapp Portal Payment Server sends an update to the paymentStatusChangeCallbackUrl specified in the parameters of the createPayment API whenever the payment status changes. The update request is sent as an HTTP POST , and the body includes the updated payment status in the following format:

    If the received status is CONFIRMED, the Mini Dapp Server should send a request to finalize the payment by calling the following API:

    5. In case of payment canceled by system.

    If an HTTP 200 OK status is not returned in response to the webhook event, the event will be retried up to four times at exponential intervals: 1, 2, 4, and 8 seconds.

    After all retry attempts have failed, if a lockUrl was specified when the payment was created, the Dapp Portal Payment Server will send an unlock request as an HTTP POST . The body includes the paymentId and itemIdentifiers.

    This ensures that any reserved resources (e.g., NFT items, inventory) are released properly in case the payment status could not be confirmed via webhook.

    6. You can open payment history page via paymentProvider. Promise will be completed if payment history page opens successfully.

    02. Payment API

    baseUrl for Payment API: https://payment.dappportal.io

    1. create payment

    post /api/payment-v1/payment/create Parameters

    Name
    Description

    Request Body

    Example Value
    Schema
    field
    limitation

    Items(*)

    field
    limitation

    Responses

    HTTP Status Code
    description

    Request Example

    2. get payment information

    get /api/payment-v1/payment/info

    Parameters

    Name
    Description

    responses

    HTTP Status Code
    Description
    field
    limitation

    Items(*)

    field
    limitation

    Request Example

    3. get payment status

    get /api/payment-v1/payment/status Parameters

    Name
    Description

    Responses

    HTTP Status Code
    Description
    field
    limitation

    Request Example

    4. finalized payment

    It will be ready to be settlement after requesting finalize payment API.

    You can't get settlement for STRIPE transaction if you did not request finalize payment API. For CRYPTO, We recomment to request finalize payment API too. Parameters N/A

    Request Body

    Example Value
    Schema

    Responses

    HTTP Status Code
    Description

    Request Example

    03. PaymentProvider

    sdk.getPaymentProvider()

    Initializes the paymentProvider, allowing developers to use various payment features.

    Parameters

    N/A

    Responses

    paymentProvider.startPayment()

    Calling paymentProvider.startPayment() displays a transaction window to the user and begins the payment process.

    Parameters

    payment_id *required · string

    Responses

    Error

    Code
    Description

    paymentProvider.openPaymentHistory()

    This method opens a payment history window. In order to complete the operation, a signature from the user is required.

    Parameters

    N/A

    Responses

    04. Payment Webhook

    Each Webhook's callback URL should be set differently.

    If lockUrl and unlockUr is not needed, please enter null.

    1. lock event

    lockUrl is a server endpoint that is called to temporarily lock or reserve the item being purchased. This is typically required for items with limited quantity or NFTs, to prevent overselling and ensure that no other user can purchase the item while the current payment is in progress.

    If the lockUrl parameter is included in the create payment request, a POST method request for the lock webhook event will be made.

    When the payment is initiated using the SDK’s startPayment function, the webhook event is requested just before starting the user’s payment flow if it is determined that the payment can proceed normally.

    If a request is made with the lockUrl but a 200 response is not received, the payment will be immediately canceled and marked as failed automatically.

    2. unlock event

    unlockUrl is a server endpoint that is called when a payment fails, is canceled, or times out, in order to release the previously locked item and make it available for others to purchase again.

    If the unlockUrl parameter is included in the create payment request, a POST request will be sent to this endpoint when a payment failure-related event is triggered.

    If the payment is successfully completed (status === CONFIRMED), the unlockUrl will not be called. Instead, the item is typically finalized via a separate process (finalize API or internal logic).

    If a request is made with the unlockUrl but a 200 response is not received, it will be retried up to 5 times at intervals of 1, 2, 4 and 8 seconds. To avoid that the item remains locked, implementing background job to attempt unlocking again is recommended.

    3. payment status change event

    When creating a payment request, a payment status change webhook event will be sent to the paymentStatusChangeCallbackUrl you've provided.

    An event occurs whenever the payment status changes, except when the status is CREATED.

    If the status of the received webhook is CONFIRMED, you can call the finalize payment API.

    If a request to the paymentStatusChangeCallbackUrl does not receive a 200 response, a maximum of 5 retries will be made at intervals of 1, 2, 4, and 8 seconds. Even if a 200 response is not received after 5 retries, the payment cancellation will not proceed.

    Status
    Description

    (*) This status can only be queried through the get payment information API.

    unlockUrl

    Max length : 512

    items(*)

    Only the purchase of single item is supported under current version

    testMode

    The payment methods according to testMode are as follows. - testMode : false stripe : realmode crypto : kaia - testMode : true stripe : testmode crypto : kairos

    usdExchangeRate

    Fx rate at the completion of payment. It is only returned where pgType is STRIPE and status is CONFIRMED or FINALIZED.

    usdExchangePrice

    USD Price applied fx rate at the completion of payment. It is only returned where pgType is STRIPE and status is CONFIRMED or FINALIZED.

    items(*)

    Only the purchase of single item is supported under current version

    testMode

    The payment methos according to testMode are as follows. - testMode : false stripe : realmode crypto : kaia - testMode : true stripe : testmode crypto : kairos

    refund

    refund.type

    • CHARGEBACK

    • REFUND

    refund.amount

    Price policy follows .

    refund.chargebackStatus

    • NEEDS_RESPONSE: A CHARGEBACK has occurred, but it is in the state before contesting or challenging it.

    • UNDER_REVIEW: The dispute has been filed and is currently under review by STRIPE.

    • WON: If the dispute is accepted.

    • LOST: If the dispute result is not accepted

    FINALIZED

    Payment process is done with paymet approval and payment finialization from Mini Dapp - In case of pgType is CRYPTO, transactions will be automatically finalized after 5 minutes once it reachs the CONFIRMED status if the finalize payment API is not hosted.

    CANCELED

    Payment is cancelled as Policy for payment cancellation

    REFUNDED

    Payment has been refunded

    CHARGEBACK

    Users has claimed chargeback directly.

    This Webhook message will be sent at each stage of the process, including the occurrence of a CHARGEBACK.

    X-Client-Id *required string (header)

    client id obtained from support team

    X-Client-Secret *required string (header)

    client secret obtained from support team

    buyerDappPortalAddress

    Max length : 42

    pgType

    • STRIPE

    • CRYPTO

    currencyCode

    • USD

    • KRW

    • JPY

    • TWD

    • THB

    • KAIA

    • USDT

    It should be equal to Item's currencyCode

    price

    • STRIPE

      • Put minimum unit following here

        • 100(cent) should be put if price is $1

      • Case1. Minumum unit equals to price unit

        • 10,000 KRW = 10000

        • 10,000 JPY = 10000

      • Case2. Minimum unit no equals to price unit

        • 10,000 USD = 1000000 (10,000 * 100)

        • 10,000 THB = 1000000 (10,000 * 100)

        • 10,000 TWD = 1000000 (10,000 * 100)

    • CRYPTO

      • KAIA

        • Put price as KAIA unit

        • 1 KAIA = 1.0

    It should be equal to sum of each price of Items. - Decimal Policy STRIPE : no

    paymentStatusChangeCallbackUrl for more detail

    Max length : 512 You can receive webhook whenever payment status was changed if you set paymentStatusChangerCallbackUrl.

    Please use port 443 for entire connection. Webhooks cannot be received if a port other than 443 is used.

    lockUrl for more detail

    Max length : 512

    itemIdentifier

    Max length : 256

    name

    Max length : 256

    imageUrl

    Max length : 512

    price

    Put minimum unit following here

    For example, put 100(cent) if price is 1 Dollar.

    currencyCode

    • USD

    • KRW

    • JPY

    • TWD

    • THB

    • KAIA

    • USDT

    200

    Example Value

    Schema

    400

    Example Value

    Schema

    401

    Example Value

    Schema

    403

    Example Value

    Schema

    500

    Example Value

    Schema

    X-Client-Id *required string (header)

    client id obtained from support team

    X-Client-Secret *required string (header)

    client secret obtained from support team

    id *required

    string (query)

    payment id

    200

    Example Value

    Schema

    404

    Example Value

    Schema

    401

    Example Value

    Schema

    403

    Example Value

    Schema

    500

    Example Value

    Schema

    id

    buyerDappPortalAddress

    Max length : 42

    pgType

    • STRIPE

    • CRYPTO

    status

    Payment status >

    • CREATED

    • STARTED

    • REGISTERED_ON_PG

    • CAPTURED

    • CONFIRMED

    • CONFIRM_FAILED

    • FINALIZED

    • CANCELED

    • REFUNDED

    • CHARGEBACK

    currencyCode

    • USD

    • KRW

    • JPY

    • TWD

    • THB

    • KAIA

    • USDT

    It should be equal to Item's currencyCode

    price

    Put minimum unit as here. For example, put 100(cent) if price is 1 Dollar. It should be equal to sum of each price of Items. - Decimal Policy STRIPE : no CRYPTO : Up to 4 decimal places

    itemIdentifier

    Max length : 256

    name

    Max length : 256

    imageUrl

    Max length : 512

    price

    For example, put 100(cent) if price is 1 Dollar.

    currencyCode

    • USD

    • KRW

    • JPY

    • TWD

    • THB

    • KAIA

    • USDT

    id *required

    string (query)

    payment id

    200

    Example Value

    Schema

    403

    Example Value

    Schema

    404

    Example Value

    Schema

    500

    Example Value

    Schema

    status

    Payment status >

    • CREATED

    • STARTED

    • REGISTERED_ON_PG

    • CAPTURED

    • CONFIRMED

    • CONFIRMED_FAILED

    • FINALIZED

    • CANCELED

    • REFUNDED

    • CHARGEBACK

    200

    N/A

    403

    Example Value

    Schema

    403

    Example Value

    Schema

    404

    Example Value

    Schema

    500

    Example Value

    Schema

    -31001

    This error is triggered when a STRIPE payment gets canceled.

    -31002

    -32001

    This error is triggered when a CRYPTO payment gets canceled.

    CREATED

    Hosted create payment API but not host startPayment of SDK

    STARTED

    Hosted startPayment but await payment approval from user (STRIPE/CRYPTO)

    REGISTERED_ON_PG

    (Only for pgType = CRYPTO) Transaction has been approved but await for enough block confirmation to prevent chain re-organization. - at least after 10 block confirmation from user's request for KAIA

    CAPTURED

    (Only for pgType = CRYPTO) Checking validity of the transaction after 10 blocks have confirmed from the user's transaction request

    CONFIRMED

    Payment approval is completed and await payment finalization from Mini Dapp

    CONFIRM_FAILED

    (Only for pgTye = CRYPTO) Failed to check validity of the transaction after 10 blocks have confirmed from user's transaction request

    curl --location 'https://payment.dappportal.io/api/payment-v1/payment/create' \
    --header 'X-Client-Id: {your_client_id}' \
    --header 'X-Client-Secret: {your_client_secret}' \
    --header 'Content-Type: application/json' \
    --data '{
        "buyerDappPortalAddress": "{user_wallet_address}", // user_wallet_address should be achieved through walletProvider.
        "pgType": "{pg_type}",
        "currencyCode": "{currency_code}",
        "price": "{price}",
        "paymentStatusChangeCallbackUrl": "{url_to_get_confirm_callback}",
        "lockUrl": "{url_to_get_item_lock_callback}",
        "unlockUrl": "{url_to_get_item_unlock_callback}",
        "items": [
            {
                "itemIdentifier": "{your_item_identifier}",
                "name": "{your_item_name}",
                "imageUrl": "{your_item_image_url}",
                "price": "{price}",
                "currencyCode": "{currencyCode}"
            }
        ],
        "testMode": {true | false}
    }'
    {
        "id": {payment_id}
    }
    const paymentProvider = sdk.getPaymentProvider()
    await paymentProvider.startPayment(paymentId)
    {
      "paymentId": "{payment_id}",
      "status": "CONFIRMED"
    }
    curl --location --request 
    POST 'https://payment.dappportal.io/api/payment-v1/payment/finalize' \
    --header 'Content-Type: application/json' \
    --data '{
        "id": "{payment_id}"
    }'
    {
        "paymentId": "{payment_id}",
        "itemIdentifiers": ["{your_item_identifier}"]
    }
    await paymentProvider.openPaymentHistory()
    {
        "buyerDappPortalAddress": "{user_wallet_address}",
        "pgType": "{pg_type}",
        "currencyCode": "{currency_code}",
        "price": "{price}",
        "paymentStatusChangeCallbackUrl": "{url_to_get_status_change_callback_using_webhook}",
        "lockUrl": "{url_to_get_item_lock_callback}",
        "unlockUrl": "{url_to_get_item_unlock_callback}",
        "items": [
            {
                "itemIdentifier": "{your_item_identifier}",
                "name": "{your_item_name}",
                "imageUrl": "{your_item_image_url}",
                "price": "{price}",
                "currencyCode": "{currencyCode}"
            }
        ],
        "testMode": {true | false}
    }
    {
        buyerDappPortalAddress*: String,
        pgType*: String(Enum: [STRIPE,CRYPTO]),
        currencyCode*: String(Enum: [USD,KRW,JPY,TWD,THB,KAIA,USDT]),
        price*: String,
        paymentStatusChangeCallbackUrl*: String,
        lockUrl: String,
        unlockUrl: String,
        items*: [Item {
               itemIdentifier: String,
               name: String,
               imageUrl: String,
               price: String,
               currencyCode: String(Enum: [USD,KRW,JPY,TWD,THB,KAIA,USDT]),
            }],
        testMode*: Boolean,
    }
    {
        "payment_id": "{payment_id}"
    }
    {
        payment_id*: String
    }
    {
        "code": 1001,
        "detail": "Invalid argument",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 1007,
        "detail": "Invalid X-Client-Id or X-Client-Secret",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 1007,
        "detail": "Access denied due to country restrictions.",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 500,
        "detail": "Internal server error",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    
    curl --location 'https://payment.dappportal.io/api/payment-v1/payment/create' \
    --header 'X-Client-Id: {your_client_id}' \
    --header 'X-Client-Secret: {your_client_secret}' \
    --header 'Content-Type: application/json' \
    --data '{
        "buyerDappPortalAddress": "{user_wallet_address}",
        "pgType": "{pg_type}",
        "currencyCode": "{currency_code}",
        "price": "{price}",
        "paymentStatusChangeCallbackUrl": "{url_to_get_confirm_callback}",
        "lockUrl": "{url_to_get_item_lock_callback}",
        "unlockUrl": "{url_to_get_item_unlock_callback}",
        "items": [
            {
                "itemIdentifier": "{your_item_identifier}",
                "name": "{your_item_name}",
                "imageUrl": "{your_item_image_url}",
                "price": "{price}",
                "currencyCode": "{currencyCode}"
            }
        ],
        "testMode": {true | false}
    }'
    {
        "id":"{payment id}",
        "buyerDappPortalAddress": "{user_wallet_address}",
        "pgType": "{pg_type}",
        "status": "{status}",
        "currencyCode": "{currency_code}",
        "price": "{price}",
        "usdExchangeRate":"{Fx rate at the completion of payment. It is only returned where pgType is STRIPE and status is CONFIRMED or FINALIZED.}",
        "usdExchangePrice":"{USD Price applied fx rate at the completion of payment. It is only returned where pgType is STRIPE and status is CONFIRMED or FINALIZED."}
        "items": [
            {
                "itemIdentifier": "{your_item_identifier}",
                "name": "{your_item_name}",
                "imageUrl": "{your_item_image_url}",
                "price": "{price}",
                "currencyCode": "{currencyCode}"
            }
        ],
        "testMode": {true | false},
        "refund": {
          type: "REFUND",
          amount: "1000.0000000000000000000000000000", //Price policy follows . 
        }
    }
    {
        id*: String,     
        buyerDappPortalAddress*: string(maxLength: 42),
        pgType*: string(Enum: [STRIPE,CRYPTO]),
        status*: string(Enum: [CREATED,STARTED,REGISTERED_ON_PG,CAPTURED,CONFIRMED,CONFIRM_FAILED,FINALIZED,CANCELED])
        currencyCode*: string(Enum: [USD,KRW,JPY,TWD,THB,KAIA,USDT]),
        price*: string,
        usdExchangeRate: string,
        usdExchangePrice: string,
        items*: [Item {
               itemIdentifier: string(maxLength: 256),
               name: string(maxLength: 256),
               imageUrl: string(maxLength: 512),
               price: string,
               currencyCode: string(Enum: [USD,KRW,JPY,TWD,THB,KAIA,UDST]),
            }]    
        testMode*: Boolean,
        refund: {
               type*: string(Enum:[CHARGEBACK, REFUND]),
               amount*: string,
               chargebackStatus: string(Enum:[NEEDS_RESPONSE, UNDER_REVIEW, WON, LOSE]), 
        }
    }
    {
        "code": 1002,
        "detail": "Not found payment",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 1007,
        "detail": "Invalid X-Client-Id or X-Client-Secret Header is not included when payment status is CONFIRMED or FINALIZED.",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 4030,
        "detail": "Access denied due to country restrictions.",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 500,
        "detail": "Internal server error",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    curl --location 'https://payment.dappportal.io/api/payment-v1/payment/info?id={payment_id}' \
    --header 'X-Client-Id: {your_client_id}' \
    --header 'X-Client-Secret: {your_client_secret}'
    {
        "status": "{status}"
    }
    {
        status*: String (Enum:[CREATED, STARTED, REGISTERED_ON_PG, CAPTURED, CONFIRMED_FAILED,FINALIZED,CANCELED]
    }
    {
        "code": 4030,
        "detail": "Access denied due to country restrictions.",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 1002,
        "detail": "Not found payment",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 500,
        "detail": "Internal server error",
        "cause": null
    }
    {
        code*: number,
        detail*: String,
        cause: String
    }
    curl --location 'https://payment.dappportal.io/api/payment-v1/payment/status?id={payment_id}'
    {
        id: "{payment_id}" 
    }
    {
        id*: String
    }
    {
        "code": 1004,
        "detail": "Invalid payment status.",//Current payment status cannot complete payment finalization
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 4030,
        "detail": "Access denied due to country restrictions.",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 1002,
        "detail": "Not found payment",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    }
    {
        "code": 500,
        "detail": "Internal server error",
        "cause": null
    }
    {    
        code*: number,
        detail*: String,
        cause: String
    
    curl --location 'https://payment.dappportal.io/api/payment-v1/payment/finalize
    --header 'Content-Type: application/json' \
      --data '{
        "id": "{payment_id}"
      }
    const walletProvider = sdk.getWalletProvider();
    PaymentProvider
    Promise<unknown>
    {
    code: -31001,
    message:'Payment is canceled by user or timeout'
    }
    {
    code: -31002,
    message:'Payment is failed'
    }
    {
    code: -32001,
    message:'User denied transaction send.'
    }
    Promise<void>
    {
        "paymentId": "{payment_id}",
        "itemIdentifiers": [
            {
                "{your_item_identifier}"
            }
        ]
    }
    {
        "paymentId": "{payment_id}",
        "itemIdentifiers": [
            {
                "{your_item_identifier}"
            }
        ]
    }
    {
        "paymentId": "{payment_id}"
        "status": "STARTED|REGISTERED_ON_PG|CAPTURED_CONFIRMED_CONFIRM_FAILED|FINALIZED|CANCELED|REFUNDED|CHARGEBACK"
        "cryptoPaymentInfo": { // added when "status" is CONFIRMED
            "paymentTxHash": "0x.."
            }
    }

    Up to 4 demcimal places

  • USDT

    • 1 USDT = 1.0

    • Up to 2 decimal places

  • for more detail
    here