Skip to content

feat: implement intent API for WalletKit#353

Draft
TrueCarry wants to merge 210 commits intomainfrom
dev/tim/sdk-sign-message-updates
Draft

feat: implement intent API for WalletKit#353
TrueCarry wants to merge 210 commits intomainfrom
dev/tim/sdk-sign-message-updates

Conversation

@TrueCarry
Copy link
Copy Markdown
Collaborator

No description provided.

nikdim03 added 30 commits March 13, 2026 05:52
Add intent URL parsing, resolution, and handling pipeline:

Models:
- IntentActionItem: SendTon, SendJetton, SendNft action types
- IntentRequestEvent: Transaction, SignData, Action intent events
- IntentResponse: Transaction, SignData, and error response types
- BatchedIntentEvent: Multiple intents in a single event

Handlers:
- IntentParser: URL parsing, validation, wire-to-model mapping
- IntentResolver: Action items to TransactionRequest conversion,
  action URL fetching with jetton/NFT message building
- IntentHandler: Orchestrator with parse-resolve-emulate-emit flow,
  approval/rejection methods, pending connect request management

Integration:
- TonWalletKit: 10 public intent API methods
- BridgeManager: sendIntentResponse with ephemeral SessionCrypto
- Android bridge: Full intent API surface with event listeners
1. Action URL response parsing: handle { action_type, action } format
   per spec instead of wire intent format. sendTransaction actions
   return standard messages array, signData returns typed payload.

2. Query param: use 'address' instead of 'wallet' when appending
   wallet address to action URL (spec requirement).

3. Wire response format: convert SDK response models to spec format
   before sending via bridge:
   - txIntent/signMsg: { result: '<boc>', id }
   - signIntent: { result: { signature, address, timestamp, domain, payload }, id }
   - error: { error: { code, message }, id }

4. SignData response: add echoed payload field per spec requirement
   (MakeSignDataIntentResponseSuccess = SignDataResponseSuccess).
…ning and adjust related logic in IntentHandler
nikdim03 and others added 21 commits April 3, 2026 05:12
…-371-demo-wallet-intents

# Conflicts:
#	apps/demo-wallet/src/pages/WalletDashboard.tsx
#	demo/wallet-core/src/hooks/useWalletStore.ts
#	demo/wallet-core/src/index.ts
#	demo/wallet-core/src/store/createWalletStore.ts
#	demo/wallet-core/src/types/store.ts
#	pnpm-lock.yaml
@vercel
Copy link
Copy Markdown

vercel bot commented Apr 8, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
kit-demo-wallet Ready Ready Preview, Comment Apr 8, 2026 11:36pm

Request Review


export type StructuredItemType = 'ton' | 'jetton' | 'nft';

export type StructuredItem = TonTransferItem | JettonTransferItem | NftTransferItem;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry discriminator

amount: string;
payload?: string;
stateInit?: string;
extraCurrency?: { [k: number]: string };
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry Lets use ExtraCurrency

address: string;
amount: string;
payload?: string;
stateInit?: string;
Copy link
Copy Markdown
Contributor

@ProudOfZiggy ProudOfZiggy Apr 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry Specify correct types for all fields - this related to all models in this files

export type StructuredItem = TonTransferItem | JettonTransferItem | NftTransferItem;

/** Snake_case wire-format items as received in JSON-RPC payload */
export type RawStructuredItem = RawTonTransferItem | RawJettonTransferItem | RawNftTransferItem;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry I'm not sure that we need raw types in models


// --- Conversion helpers ---

export function parseRawStructuredItem(raw: RawStructuredItem): StructuredItem {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry Remove functions from models layer completely

const hasValueWrapper = type.getTypes().every((variant) => this.getAssociatedValueType(variant) !== null);
if (!hasValueWrapper) {
return false;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry Lets remove this, will add different logic if needed

async getSignedSendTransaction(
input: TransactionRequest,
_options: { fakeSignature: boolean },
options?: { fakeSignature?: boolean; internal?: boolean },
Copy link
Copy Markdown
Contributor

@ProudOfZiggy ProudOfZiggy Apr 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TrueCarry Can we move this to separate model

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants