took! WaaS Developer

Android Integration

기존 앱에 took WaaS 통합하기

took WaaS는 기관이 운영 중인 고객용 앱 안에 브랜드가 적용된 비수탁 지갑을 삽입할 수 있도록 제공합니다. 앱의 탐색 구조와 고객 접점은 그대로 유지하면서, 지갑 화면과 기능은 호스팅된 WebView 영역에서 실행됩니다.

현재 지원 범위

Integration Preview는 Android 네이티브 앱 환경을 지원합니다. 기관은 별도 검증 앱이나 기존 앱의 개발 환경에 took WaaS를 삽입해 브랜드 설정, 로그인 복귀, 지갑 화면 전환, 송금과 KYT 정책을 확인할 수 있습니다. 이 패키지는 실제 도입 범위와 보안·운영 요건을 확정하기 위한 기술 검증 환경이며, 상용 배포용 통합 패키지는 아닙니다.

앱과 took WaaS의 역할

01

기관 앱

앱의 헤더, 탭, 고객 세션과 진입 경로를 관리하고 지갑이 표시될 콘텐츠 영역을 제공합니다.

02

Android Integration Kit

허용된 지갑 URL을 WebView에 열고, 앱 생명주기와 OAuth 복귀, 제한된 브리지 통신을 연결합니다.

03

took WaaS

기관별 설정이 적용된 지갑 UI, 로그인, 멀티체인 지갑 기능과 KYT 정책 화면을 제공합니다.

전체 연동 흐름

기관 앱지갑 화면 진입
TookWaasWebView기관 지갑 로드
Hosted Wallet로그인 · 지갑 기능
Bridge Event안전한 상태 전달

Studio에서 기관별로 만드는 설정 단위를 지갑 프로젝트라고 부릅니다. 로고, 색상, 노출 기능과 KYT 정책이 여기에 저장됩니다. 연동 코드에서는 지갑 프로젝트를 tenantSlug라는 기술 값으로 식별합니다.

핵심 원칙

  • 기관 앱에는 지갑 콘텐츠 영역만 삽입합니다. 샘플 앱의 조작 버튼은 연동 결과를 확인하기 위한 도구입니다.
  • 지갑 키, SAR share와 서명 데이터는 URL이나 WebView 브리지를 통해 기관 앱으로 전달하지 않습니다.
  • 지갑 설정 API 키는 기관 서버에서만 사용합니다. 모바일 앱 번들에는 포함하지 않습니다.
  • Studio와 Wallet Configuration API는 동일한 기관 지갑 설정을 읽고 수정합니다.

Android Integration

Integrate took WaaS into your existing app

took WaaS lets an institution embed a branded, non-custodial wallet inside its customer-facing app. The host app keeps its navigation and customer relationship, while wallet screens and capabilities run in a hosted WebView surface.

Current support scope

The Integration Preview supports Android native apps. Institutions can use a standalone validation app or an existing development build to review branding, login return, wallet navigation, transfers, and KYT policy behavior. This package is a technical validation environment for defining the final integration, security, and operating requirements; it is not the production deployment package.

Integration responsibilities

01

Institution app

Owns the header, tabs, customer session, entry points, and the content region that contains the wallet.

02

Android Integration Kit

Loads an allowlisted wallet URL and connects lifecycle handling, OAuth return, and the restricted bridge.

03

took WaaS

Provides institution-configured wallet UI, login, multichain wallet capabilities, and KYT policy screens.

End-to-end flow

Institution appOpens wallet
TookWaasWebViewLoads wallet project
Hosted WalletLogin · wallet actions
Bridge eventSafe state only

Studio stores each institution's logo, colors, enabled features, and KYT policy in a dedicated wallet project. Integration code identifies that project through the technical field tenantSlug.

Core principles

  • Embed only the wallet content surface. Controls in the sample app are a validation harness, not part of the integration UI.
  • Wallet keys, SAR shares, and raw signature data never cross the URL or WebView bridge into the host app.
  • Wallet Configuration API keys are server-side credentials and must not be bundled into a mobile app.
  • Studio and the Wallet Configuration API read and update the same wallet project.

Getting started

Android 빠른 시작

제공된 Android 래퍼를 앱 모듈에 추가하고 지갑 프로젝트 slug를 열면 took WaaS 지갑 화면을 바로 확인할 수 있습니다.

준비 사항

  • Android Studio와 Android API 26 이상의 앱 프로젝트
  • 인터넷 권한과 외부 브라우저를 열 수 있는 앱 환경
  • Studio에서 생성한 지갑 프로젝트 slug(tenantSlug)
  • 로그인 결과를 받을 앱 callback 등록
제공 샘플은 Java 17, compileSdk/targetSdk 36으로 구성되어 있습니다. TookWaasWebView는 Java 클래스로 제공되며 Java·Kotlin 앱에서 모두 사용할 수 있습니다.

설치 순서

  1. 래퍼 소스 추가

    waas/sdk/android/src/main/java/kr/traverse/took/waas/TookWaasWebView.java를 앱의 내부 Android 모듈에 포함합니다.

  2. 인터넷 권한 확인

    AndroidManifest.xmlandroid.permission.INTERNET이 선언되어 있어야 합니다.

  3. 지갑 영역 생성

    지갑을 표시할 Activity 또는 Fragment의 콘텐츠 영역에 TookWaasWebView를 배치합니다.

  4. 이벤트 리스너 연결

    지갑 준비 상태와 차단된 외부 이동을 기관 앱의 UI 정책에 맞게 처리합니다.

  5. 지갑 프로젝트 열기

    Studio에서 확인한 프로젝트 slug를 open()에 전달합니다.

최소 연동 코드

walletView = new TookWaasWebView(this);
walletView.listener = new TookWaasWebView.Listener() {
  @Override
  public void onEvent(JSONObject event) {
    String type = event.optString("type");
    // 지갑 준비 상태를 기관 앱 UI에 반영합니다.
  }

  @Override
  public void onBlockedNavigation(Uri url) {
    // 기관 앱의 외부 링크 정책에 따라 처리합니다.
  }
};

walletContainer.addView(walletView);
walletView.open("partner-wallet");

partner-wallet은 예시입니다. 실제 값은 기관 지갑 프로젝트에 발급된 tenantSlug로 바꿉니다.

샘플 앱으로 먼저 확인하기

waas/sdk/android/sample 프로젝트를 Android Studio에서 열어 실제 기기에서 실행할 수 있습니다. 상단 Wallet·Send 버튼은 open()openScreen("send") 호출을 확인하기 위한 테스트 조작부입니다. 기관 앱에 이 버튼이나 샘플 레이아웃을 그대로 넣을 필요는 없습니다.

Getting started

Android quickstart

Add the provided Android wrapper to your app module and open a wallet project slug to render the took WaaS wallet surface.

Prerequisites

  • Android Studio and an app targeting Android API 26 or later
  • Internet permission and access to the device browser
  • A wallet project slug (tenantSlug) created in Studio
  • An app callback registered for login return
The sample uses Java 17 with compileSdk and targetSdk 36. TookWaasWebView is provided as a Java class and can be used from either a Java or Kotlin app.

Installation

  1. Add the wrapper source

    Include waas/sdk/android/src/main/java/kr/traverse/took/waas/TookWaasWebView.java in your internal Android module.

  2. Confirm internet permission

    Your AndroidManifest.xml must declare android.permission.INTERNET.

  3. Create the wallet region

    Add TookWaasWebView to the Activity or Fragment content region reserved for the wallet.

  4. Attach the listener

    Map wallet readiness and blocked navigation to your app's UI and link policies.

  5. Open the wallet project

    Pass the project slug issued in Studio to open().

Minimum integration

walletView = new TookWaasWebView(this);
walletView.listener = new TookWaasWebView.Listener() {
  @Override
  public void onEvent(JSONObject event) {
    String type = event.optString("type");
    // Reflect safe wallet state in the host app UI.
  }

  @Override
  public void onBlockedNavigation(Uri url) {
    // Apply the host app's external-link policy.
  }
};

walletContainer.addView(walletView);
walletView.open("partner-wallet");

partner-wallet is an example. Replace it with the tenantSlug assigned to your institution's wallet project.

Run the sample first

Open waas/sdk/android/sample in Android Studio and run it on a physical device. The Wallet and Send controls are a test harness for open() and openScreen("send"). They are not required in the institution app or in its final wallet layout.

Native container

지갑 화면 삽입

기관 앱이 화면의 바깥 구조를 소유하고, took WaaS는 지정된 콘텐츠 영역만 사용합니다. 따라서 기존 앱의 헤더, 탭 바, 메뉴와 화면 전환 방식을 유지할 수 있습니다.

권장 화면 구성

기관 앱 헤더기관 로고 · 뒤로가기
+
took WaaS 영역지갑 콘텐츠만 표시
+
기관 앱 탐색탭 · 메뉴 · 고객 지원

WebView 바깥에 기관 앱의 탐색 UI를 둘 수 있습니다. took 지갑 내부에서 제공하는 화면 간 이동은 브리지 명령으로 제어합니다.

앱 생명주기 연결

@Override
protected void onResume() {
  super.onResume();
  walletView.onHostResume();
}

@Override
protected void onPause() {
  walletView.onHostPause();
  super.onPause();
}

@Override
protected void onDestroy() {
  walletView.destroy();
  super.onDestroy();
}

앱이 백그라운드로 이동할 때 WebView 타이머를 멈추고, Activity가 종료될 때 브리지와 WebView 리소스를 함께 해제합니다.

지갑 화면 열기

walletView.openScreen("send");
walletView.closeWalletSurface();
screen표시되는 기능
wallet지갑 홈과 자산 목록
send / receive보내기와 받기
activity지갑 활동 내역
swap지원 자산 간 스왑
investment투자·수익 상품 화면
messaging지갑 메시징
recovery복구 관리 화면

지갑 프로젝트에서 꺼 둔 기능은 화면에서도 노출되지 않습니다. 허용 목록에 없는 screen 값은 Android 래퍼에서 거부됩니다.

외부 URL 처리

WebView는 https://tookwallet.com의 지갑 URL만 내부에서 엽니다. 다른 URL은 WebView 밖으로 분리되고 onBlockedNavigation()으로 전달된 뒤 시스템의 외부 이동 정책을 따릅니다.

Native container

Embed the wallet surface

The institution app owns the surrounding screen while took WaaS uses only the assigned content region. Existing headers, tab bars, menus, and navigation patterns can remain unchanged.

Recommended layout

App headerBrand · back navigation
+
took WaaS regionWallet content only
+
App navigationTabs · menu · support

The host app may keep navigation outside the WebView. Use bridge commands when the host needs to open a specific screen within the wallet.

Connect app lifecycle

@Override
protected void onResume() {
  super.onResume();
  walletView.onHostResume();
}

@Override
protected void onPause() {
  walletView.onHostPause();
  super.onPause();
}

@Override
protected void onDestroy() {
  walletView.destroy();
  super.onDestroy();
}

This pauses WebView timers while the app is backgrounded and releases both the bridge and WebView resources when the Activity is destroyed.

Open a wallet screen

walletView.openScreen("send");
walletView.closeWalletSurface();
screenCapability
walletWallet home and asset list
send / receiveSend and receive
activityWallet activity
swapSwap supported assets
investmentInvestment and yield screens
messagingWallet messaging
recoveryRecovery management

Features disabled in the wallet project remain hidden. The Android wrapper rejects screen values outside its explicit allowlist.

External URL handling

The WebView renders only wallet URLs on https://tookwallet.com. Other URLs leave the WebView, are reported through onBlockedNavigation(), and follow the device's external navigation policy.

Authentication

로그인과 앱 복귀

지갑 로그인 화면은 took WaaS 안에서 시작되고, Google 계정 선택은 기기의 시스템 브라우저에서 진행됩니다. 인증이 끝나면 앱 callback을 통해 원래 지갑 화면으로 돌아옵니다.

로그인 흐름

Hosted Walletthirdweb 로그인 시작
시스템 브라우저Google 계정 인증
앱 Callback인증 결과 수신
Hosted Wallet세션 복원

이 방식은 사용자가 브라우저에 이미 로그인해 둔 Google 계정을 선택할 수 있게 하며, OAuth 화면을 WebView 안에 가두지 않습니다.

Callback 등록

샘플 앱은 took-waas-poc://auth callback을 사용합니다. Activity는 singleTop으로 실행하고 아래 intent filter를 등록합니다.

<activity
  android:name=".MainActivity"
  android:exported="true"
  android:launchMode="singleTop">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
      android:scheme="took-waas-poc"
      android:host="auth" />
  </intent-filter>
</activity>

복귀 처리

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  setIntent(intent);

  Uri callback = intent.getData();
  if (callback != null) {
    walletView.resumeOAuthRedirect(callback);
  }
}

resumeOAuthRedirect()는 등록된 scheme과 host가 일치하고 열려 있는 지갑 프로젝트가 있을 때만 callback을 지갑 URL로 복원합니다. 복원이 끝나고 지갑 주소가 준비되면 took-waas:wallet-ready 이벤트가 전달됩니다.

Callback URI를 WebView 입력값이나 URL 파라미터로 임의 지정하지 마세요. 네이티브 앱에 등록된 정확한 scheme·host만 받고, OAuth code·token·사용자 식별값은 로그에 기록하지 않습니다.

Authentication

Login and app return

Wallet login starts inside took WaaS, while Google account selection runs in the device browser. When authentication completes, the app callback returns the result to the original wallet surface.

Login flow

Hosted WalletStarts thirdweb login
System browserGoogle authentication
App callbackReceives result
Hosted WalletRestores session

This lets customers use Google accounts already available in the browser instead of containing the OAuth provider inside the WebView.

Register the callback

The sample app uses took-waas-poc://auth. Configure the Activity as singleTop and register the following intent filter.

<activity
  android:name=".MainActivity"
  android:exported="true"
  android:launchMode="singleTop">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
      android:scheme="took-waas-poc"
      android:host="auth" />
  </intent-filter>
</activity>

Handle the return

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  setIntent(intent);

  Uri callback = intent.getData();
  if (callback != null) {
    walletView.resumeOAuthRedirect(callback);
  }
}

resumeOAuthRedirect() restores the callback only when the registered scheme and host match and a wallet project is open. After the wallet session and address are ready, the bridge emits took-waas:wallet-ready.

Do not accept a callback URI supplied through WebView input or URL parameters. Accept only the exact native scheme and host, and never log OAuth codes, tokens, or customer identity values.

WebView bridge

이벤트와 명령

브리지는 기관 앱과 지갑 화면 사이의 최소한의 상태·탐색 채널입니다. 지갑 제어권이나 서명 권한을 전달하는 API가 아닙니다.

Wallet → 기관 앱

이벤트Payload사용 목적
took-waas:readytenantSlug, version기관 지갑 설정과 화면 로드 완료
took-waas:auth-requiredtenantSlug사용자 로그인이 필요한 상태
took-waas:wallet-readytenantSlug, 공개 address로그인과 지갑 주소 준비 완료
took-waas:screen-changedtenantSlug, screen현재 지갑 화면 동기화
took-waas:errortenantSlug, code호스트에서 표시할 수 있는 오류 상태

기관 앱 → Wallet

명령설명
took-waas:open허용된 screen으로 지갑 내부 화면을 전환합니다.
took-waas:close지갑 surface에 닫기 요청을 전달합니다.
{ "type": "took-waas:open", "screen": "send" }
{ "type": "took-waas:close" }

이벤트 처리 예시

@Override
public void onEvent(JSONObject event) {
  switch (event.optString("type")) {
    case "took-waas:wallet-ready":
      showWalletReady(event.optString("address"));
      break;
    case "took-waas:screen-changed":
      updateHostNavigation(event.optString("screen"));
      break;
    case "took-waas:error":
      showWalletError(event.optString("code"));
      break;
  }
}
공개 지갑 주소는 화면 상태 표시를 위해 전달될 수 있습니다. private key, 니모닉, SAR share, OAuth token, 원문 서명은 브리지 payload에 포함되지 않습니다.

WebView bridge

Events and commands

The bridge is a minimal state and navigation channel between the institution app and wallet surface. It is not an API for wallet control or signing authority.

Wallet → institution app

EventPayloadPurpose
took-waas:readytenantSlug, versionWallet project configuration and UI are loaded
took-waas:auth-requiredtenantSlugThe customer needs to sign in
took-waas:wallet-readytenantSlug, public addressLogin and wallet address are ready
took-waas:screen-changedtenantSlug, screenSynchronize the current wallet screen
took-waas:errortenantSlug, codeHost-safe wallet error state

Institution app → wallet

CommandDescription
took-waas:openNavigate the wallet to an allowlisted screen.
took-waas:closeRequest that the wallet surface close.
{ "type": "took-waas:open", "screen": "send" }
{ "type": "took-waas:close" }

Event handling example

@Override
public void onEvent(JSONObject event) {
  switch (event.optString("type")) {
    case "took-waas:wallet-ready":
      showWalletReady(event.optString("address"));
      break;
    case "took-waas:screen-changed":
      updateHostNavigation(event.optString("screen"));
      break;
    case "took-waas:error":
      showWalletError(event.optString("code"));
      break;
  }
}
A public wallet address may cross the bridge for display state. Private keys, mnemonics, SAR shares, OAuth tokens, and raw signatures are never included in a bridge payload.

Wallet project configuration

기관 지갑 설정 API

기관은 Studio에서 구성한 브랜드, 기능과 KYT 정책을 서버 API로도 관리할 수 있습니다. Studio와 API는 동일한 지갑 프로젝트를 읽고 수정합니다.

지갑 프로젝트와 기본 설정

Studio에서 기관별 지갑 프로젝트를 생성하면 브랜드와 기능의 초기 설정이 함께 저장됩니다. 여기서 “기본값”은 took 원본 앱의 전역값이 아니라 해당 지갑 프로젝트에 저장된 초기 설정을 뜻합니다. API 요청에서 보내지 않은 필드는 기존 값을 유지합니다.

설정 영역지원 필드
브랜드companyName, walletName, logoDataUrl, primaryColor, accentColor
기능swap, investment, messaging, exchangeConnect, gasless, kytPolicy
KYT 정책enabled, blockRaCode2

API 인증

Studio의 지갑 프로젝트 관리자가 API 키를 발급합니다. 원문 키는 발급 시 한 번만 표시되고, 서버에는 hash와 prefix, scope, 만료·폐기 상태만 저장됩니다.

GET /functions/v1/waas-config
x-took-waas-key: took_poc_<prefix>_<secret>
  • config:readconfig:write scope를 분리해 발급할 수 있습니다.
  • 키는 기관 백엔드 또는 CI secret manager에 저장합니다.
  • 유출되었거나 더 이상 쓰지 않는 키는 Studio에서 폐기하고 새로 발급합니다.

설정 변경

PATCH /functions/v1/waas-config
content-type: application/json
x-took-waas-key: took_poc_<prefix>_<secret>

{
  "walletName": "My Wallet",
  "primaryColor": "#1769FF",
  "features": ["swap", "gasless", "kytPolicy"],
  "compliancePolicy": {
    "kyt": {
      "enabled": true,
      "blockRaCode2": ["EXAMPLE_CODE"]
    }
  }
}

저장이 완료되면 같은 프로젝트 slug로 열린 지갑에 변경된 설정이 적용됩니다. Wallet Configuration API는 지갑을 생성하거나 거래에 서명하는 API가 아닙니다.

API 키를 Android 코드, WebView URL, JavaScript, 앱 설정 파일에 넣지 마세요. 모바일 앱은 프로젝트 식별값인 tenantSlug만 알고, 설정 변경은 기관 서버가 수행합니다.

Wallet project configuration

Wallet Configuration API

Institutions can manage the same branding, feature, and KYT settings available in Studio through a server-side API. Studio and the API operate on the same wallet project.

Wallet project defaults

Studio creates a separate wallet project for each institution and stores its initial branding and feature settings. A “default” is not inherited from the original took app; it is the initial configuration stored on that wallet project. Fields omitted from a PATCH request retain their existing values.

AreaSupported fields
BrandingcompanyName, walletName, logoDataUrl, primaryColor, accentColor
Featuresswap, investment, messaging, exchangeConnect, gasless, kytPolicy
KYT policyenabled, blockRaCode2

API authentication

A wallet project administrator issues API keys from Studio. The raw key is displayed only once; the server retains only its hash, prefix, scopes, expiry, and revocation status.

GET /functions/v1/waas-config
x-took-waas-key: took_poc_<prefix>_<secret>
  • Keys can use separate config:read and config:write scopes.
  • Store keys in the institution backend or CI secret manager.
  • Revoke exposed or unused keys in Studio and issue replacements.

Update configuration

PATCH /functions/v1/waas-config
content-type: application/json
x-took-waas-key: took_poc_<prefix>_<secret>

{
  "walletName": "My Wallet",
  "primaryColor": "#1769FF",
  "features": ["swap", "gasless", "kytPolicy"],
  "compliancePolicy": {
    "kyt": {
      "enabled": true,
      "blockRaCode2": ["EXAMPLE_CODE"]
    }
  }
}

After the update, the new configuration is applied to wallets opened with the same project slug. The Wallet Configuration API does not create wallets or sign transactions.

Never place a configuration API key in Android source, a WebView URL, JavaScript, or an app configuration file. The mobile app needs only the project identifier tenantSlug; configuration updates belong on the institution server.

Risk policy

KYT · RA-2 정책

기관은 위험주소 차단 기능을 켜고, 차단할 RA-2 카테고리를 직접 선택할 수 있습니다. took가 임의로 강제하는 카테고리는 없습니다.

주소 검사 방식

  1. 기관이 정책 선택

    Studio 또는 Config API에서 kytPolicy를 켜고 blockRaCode2에 차단할 카테고리를 저장합니다.

  2. 사용자가 수신 주소 입력

    보내기·스왑 등 상대 주소가 필요한 흐름에서 주소를 확인합니다.

  3. 위험주소 데이터 조회

    현재 환경은 took 서버의 Transight 유래 deny_list와 주소를 대조합니다.

  4. 기관 정책 적용

    주소의 ra_code2가 기관이 선택한 카테고리에 포함되면 완료 전에 거래를 차단하고 분류 정보를 표시합니다.

RA-2 카테고리 조회

전체 카테고리와 한글·영문 설명은 공개 페이지에 고정하지 않습니다. 로그인한 Studio 또는 인증된 Config API에서 조회합니다.

GET /functions/v1/waas-config?action=ra-code2-catalog
x-took-waas-key: took_poc_<prefix>_<secret>

설정 요청에 알 수 없는 RA-2 코드를 보내면 API가 거부합니다. 공개 예제의 EXAMPLE_CODE는 형식을 보여주기 위한 자리표시자이며 실제 카탈로그 값으로 바꿔야 합니다.

정책 검증 항목

  • KYT를 끈 지갑 프로젝트에서는 주소 분류가 거래를 차단하지 않는지 확인합니다.
  • 선택하지 않은 RA-2 카테고리는 차단되지 않는지 확인합니다.
  • 선택한 카테고리의 테스트 주소는 거래 완료 전에 차단되는지 확인합니다.
  • 차단 화면에 기술 코드만 노출하지 않고 사용자가 이해할 수 있는 분류 설명이 표시되는지 확인합니다.
현재 took WaaS의 정책 항목에는 트래블룰이 포함되어 있지 않습니다. 지갑 내 거래 확인과 위험주소 정책은 별개의 기능으로 다룹니다.

Risk policy

KYT · RA-2 policy

Each institution can enable risky-address blocking and choose its own RA-2 categories. took does not impose a mandatory category set.

How address checks work

  1. The institution selects policy

    Enable kytPolicy and store selected categories in blockRaCode2 through Studio or the Config API.

  2. The customer enters a destination

    took checks addresses in flows such as send and swap where a counterparty address is required.

  3. Risk data is queried

    The current environment compares the address against took's server-side, Transight-derived deny_list.

  4. Institution policy is applied

    If the address ra_code2 belongs to a selected category, the transaction is stopped before completion and the classification is shown.

Retrieve the RA-2 catalog

The full category catalog and its Korean and English descriptions are not hard-coded into the public page. Retrieve them from an authenticated Studio session or Config API request.

GET /functions/v1/waas-config?action=ra-code2-catalog
x-took-waas-key: took_poc_<prefix>_<secret>

The API rejects unknown RA-2 values. EXAMPLE_CODE in public examples is a placeholder and must be replaced by a value returned from the authenticated catalog.

Policy validation

  • Confirm that classifications do not block transactions when KYT is disabled.
  • Confirm that categories not selected by the institution are not blocked.
  • Confirm that a controlled address in a selected category is blocked before completion.
  • Confirm that the blocked state includes a customer-readable classification, not only a technical code.
Travel Rule configuration is not part of the current took WaaS policy model. Wallet transaction records and risky-address policy are handled as separate capabilities.

Integration validation

연동 검증

화면이 열리는 것만 확인하지 말고, 로그인 복귀부터 기능 설정과 앱 생명주기까지 하나의 사용자 흐름으로 검증합니다.

테스트 준비

  • 배포 상태인 지갑 프로젝트와 기관 브랜드 설정
  • 지갑 프로젝트에서 사용할 기능 목록
  • Android application ID와 등록된 callback intent filter
  • 로그인에 사용할 테스트 계정과 테스트 자산
  • KYT 차단·비차단을 확인할 통제된 주소와 RA-2 카테고리
  • Config API를 사용할 경우 서버 전용 API 키

필수 완료 기준

  • 기관 앱의 지정된 콘텐츠 영역 안에서 지갑이 잘림 없이 표시됩니다.
  • took-waas:readyauth-required 상태가 중복 오류 없이 전달됩니다.
  • Google 로그인이 시스템 브라우저에서 끝난 뒤 원래 앱과 지갑 화면으로 복귀합니다.
  • 로그인 후 wallet-ready 이벤트의 공개 주소가 현재 지갑과 일치합니다.
  • 기관 앱 명령으로 send·receive 등 허용된 화면이 열립니다.
  • 지갑 프로젝트에서 끈 기능은 노출되지 않고, 켠 기능은 정상 진입합니다.
  • 선택한 RA-2 정책은 통제된 테스트 주소에서 기대한 차단 결과를 냅니다.

함께 확인할 예외 흐름

상황확인할 동작
로그인 취소빈 화면에 머물지 않고 다시 로그인하거나 지갑을 닫을 수 있어야 합니다.
앱 백그라운드 전환복귀 후 WebView와 지갑 세션이 정상적으로 다시 동작해야 합니다.
네트워크 끊김기관 앱의 전체 화면을 막지 않고 지갑 영역에서 복구 가능한 오류를 보여야 합니다.
잘못된 프로젝트 slug임의 URL로 이동하지 않고 명확한 초기화 오류로 처리해야 합니다.
허용되지 않은 URLWebView 내부에서 열지 않고 기관 앱의 외부 링크 정책으로 넘겨야 합니다.

Integration validation

Integration testing

Validate the complete customer journey—from login return through feature configuration and app lifecycle—instead of checking only that the first wallet screen renders.

Test setup

  • A published wallet project with institution branding
  • A wallet project feature set containing the capabilities under test
  • The Android application ID and registered callback intent filter
  • A test login and test assets
  • Controlled blocked and non-blocked addresses with RA-2 categories
  • A server-only API key when validating the Config API

Required acceptance criteria

  • The wallet fits the assigned host app content region without clipping.
  • took-waas:ready and auth-required arrive without duplicate error states.
  • Google login completes in the system browser and returns to the original app and wallet surface.
  • The public address in wallet-ready matches the active wallet after login.
  • Host commands open allowlisted screens such as send and receive.
  • Features disabled in the wallet project remain hidden and enabled features open normally.
  • Selected RA-2 policy produces the expected result for controlled test addresses.

Edge cases to include

ScenarioExpected behavior
Login cancelledThe customer can retry or close the wallet instead of remaining on a blank screen.
App backgroundedThe WebView and wallet session resume correctly when the app returns.
Network unavailableA recoverable error stays within the wallet region without blocking the entire host app.
Invalid project slugInitialization fails clearly without navigating to an arbitrary URL.
Disallowed URLThe URL does not open inside the WebView and is passed to the host app's link policy.

Security boundary

보안 경계

기관 앱은 지갑을 표시하고 제한된 상태를 받지만, 지갑 키와 복구·서명 권한을 소유하지 않습니다. 연동 코드는 이 경계를 넓히지 않아야 합니다.

주체별 책임

주체담당 범위전달받지 않는 값
사용자로그인, 지갑 행위 확인과 승인다른 사용자 정보, 기관 설정 키
기관 앱지갑 영역 호스팅, callback 수신, 안전한 상태 표시private key, SAR share, 원문 서명, Config API key
기관 서버Wallet Configuration API 호출과 기관 측 접근 통제사용자 지갑 키와 서명 권한
took WaaS호스팅 지갑 UI, 기관별 설정 적용, 지갑 기능과 정책 흐름기관의 내부 고객 인증 비밀정보
thirdweb현재 지갑 로그인과 MPC 계층기관 앱 운영 권한

필수 구현 규칙

  • WebView 내부 허용 호스트를 https://tookwallet.com으로 제한합니다.
  • 파일·콘텐츠 접근과 mixed content를 허용하지 않습니다.
  • 브리지에서는 took-waas:로 시작하는 알려진 이벤트만 파싱합니다.
  • 화면 이동 값은 래퍼의 allowlist와 대조합니다.
  • callback의 scheme과 host를 네이티브 코드에서 다시 검증합니다.
  • OAuth code, access token, 지갑 비밀정보와 Config API key를 로그에 남기지 않습니다.

WebView·브리지 금지 사항

URL query, DOM, JavaScript interface, postMessage payload에 private key, 니모닉, SAR share, 원문 서명, 기관 access token, Config API key를 넣지 않습니다. 디버그를 위해 임시로 추가한 로그도 배포 전에 제거합니다.

Security boundary

Security boundary

The institution app renders the wallet and receives limited state, but it does not own wallet keys or recovery and signing authority. Integration code must preserve that boundary.

Responsibilities by actor

ActorResponsibilityDoes not receive
CustomerLogin and approval of wallet actionsOther customer data or institution config keys
Institution appHost wallet region, receive callback, render safe statePrivate key, SAR share, raw signature, Config API key
Institution serverWallet Configuration API calls and institution access controlCustomer wallet keys and signing authority
took WaaSHosted wallet UI, project configuration, wallet and policy flowsInstitution internal customer-authentication secrets
thirdwebCurrent wallet login and MPC layerAuthority over institution app operations

Required implementation controls

  • Restrict internal WebView navigation to https://tookwallet.com.
  • Disable file access, content access, and mixed content.
  • Parse only known bridge events beginning with took-waas:.
  • Validate every requested screen against the wrapper allowlist.
  • Revalidate callback scheme and host in native code.
  • Never log OAuth codes, access tokens, wallet secrets, or Config API keys.

Prohibited WebView and bridge data

Never place private keys, mnemonics, SAR shares, raw signatures, institution access tokens, or Config API keys in URL queries, the DOM, a JavaScript interface, or postMessage payloads. Remove temporary debug logs before distributing a build.

Production roadmap

상용 통합으로 확장하기

Integration Preview에서 사용자 경험과 기술 접점을 검증한 뒤, 기관의 인증 체계·보안 정책·규제 범위에 맞춰 상용 통합 구조를 확정합니다.

예상 전환 단계

  1. 기관별 통합 계약 확정

    대상 앱, 지갑 프로젝트, 지원 체인과 기능, 데이터 처리 범위, SLA와 장애 대응 책임을 확정합니다.

  2. 앱·도메인 신뢰 설정

    기관이 소유한 Android App Link와 callback allowlist, 서명 인증서, 배포 환경별 도메인을 등록합니다.

  3. 고객 인증 연계

    기관 SSO를 사용할 경우 issuer·audience·token exchange·만료·폐기 규칙을 설계하고, took 로그인과의 연결 방식을 결정합니다.

  4. 지갑·SAR 보안 구조 확정

    기기 보안영역, 생체인증, 복구 factor, SAR share와 signer 경계를 기관 보안 심사에 맞춰 네이티브 구조로 구체화합니다.

  5. Compliance와 운영 연결

    실시간 Transight 연동 범위, 정책 변경 권한, 감사로그, 모니터링, 비용·relayer 정산과 고객 지원 절차를 운영 체계에 연결합니다.

  6. 플랫폼 확대와 출시 검증

    필요한 경우 iOS 통합을 추가하고, 침투 테스트·장애 복구·스토어 배포·단계적 출시 기준을 통과한 뒤 상용 트래픽을 엽니다.

예상 목표 구조

A

Verified App Trust

기관 소유 App Link, 환경별 callback과 등록된 지갑 프로젝트로 앱 복귀 경로를 고정합니다.

B

Institution Identity

기관 고객 세션과 지갑 인증 사이에 짧은 수명의 검증 가능한 교환 계층을 둡니다.

C

Native Security

SAR와 signer를 기기 보안영역·복구 정책과 결합하고 WebView 밖의 네이티브 신뢰경계를 강화합니다.

최종 구조는 기관별 요구사항과 보안 심사 결과에 따라 달라질 수 있습니다. Preview 단계에서 수집한 검증 결과가 상용 통합 명세와 일정 산정의 기준이 됩니다.

Production roadmap

Extend into a production integration

After validating the customer experience and technical touchpoints in the Integration Preview, the production architecture is defined around the institution's identity system, security policy, and regulatory scope.

Expected transition stages

  1. Confirm the institution integration contract

    Define target apps, wallet projects, chains and features, data processing boundaries, SLA, and incident ownership.

  2. Establish app and domain trust

    Register institution-owned Android App Links, callback allowlists, signing certificates, and environment-specific domains.

  3. Connect customer identity

    If institution SSO is required, define issuer, audience, token exchange, expiry, and revocation rules and decide how they connect to took wallet login.

  4. Finalize wallet and SAR security

    Map secure device storage, biometrics, recovery factors, SAR shares, and signer boundaries to the institution security review.

  5. Connect compliance and operations

    Integrate live Transight scope, policy ownership, audit logs, monitoring, cost and relayer settlement, and customer-support procedures.

  6. Expand platforms and approve release

    Add iOS integration when required, then pass penetration testing, disaster recovery, store distribution, and staged rollout gates before enabling production traffic.

Expected target architecture

A

Verified App Trust

Institution-owned App Links, environment callbacks, and registered wallet projects create a fixed app-return path.

B

Institution Identity

A short-lived, verifiable exchange layer connects the institution customer session to wallet authentication.

C

Native Security

SAR and signer boundaries are combined with device security and recovery policy outside the WebView trust boundary.

The final design may vary by institution and security review. Results from the Preview become the input for the production specification, implementation scope, and delivery plan.