Skip to content

Instantly share code, notes, and snippets.

@ilyar
Last active March 18, 2025 07:07
Show Gist options
  • Save ilyar/021273fc04c57b51d3b0586140798bbd to your computer and use it in GitHub Desktop.
Save ilyar/021273fc04c57b51d3b0586140798bbd to your computer and use it in GitHub Desktop.
Sample parsing a payload via TL-B

Sample parsing a payload via TL-B

Short

Create schema.tlb

a a: int256 = A;
b b: MsgAddressInt = B;

Generate code by schema

npx @ton-community/[email protected] -o schema.ts schema.tlb

Write code sample.ts use types from schema.ts and run

npx ts-node sample.ts 42 EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c
{
  bocA: 'te6cckEBAQEAJgAASAYovqEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKu1DVIw=',
  payloadA: { kind: 'A', a: 42n },
  bocB: 'te6cckEBAQEAKAAAS25ndrKf5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZwvzU+eg==',
  payloadB: { kind: 'B', b: EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c }
}

Step by step

Setup project

npm init -y
npm i -D typescript ts-node @ton/core @ton-community/[email protected]

Create tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist"
  },
  "lib": ["es2015"]
}

Create schema.tlb

// from block.tlb
anycast_info$_ depth:(#<= 30) { depth >= 1 } rewrite_pfx:(bits depth) = Anycast;
nothing$0 {X:Type} = Maybe X;
addr_std$10 anycast:(Maybe Anycast) workchain_id:int8 address:bits256  = MsgAddressInt;
addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9) workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
// project schema
a a: int256 = A;
b b: MsgAddressInt = B;

Generate code by schema

npx tlb -o schema.ts schema.tlb

Write code sample.ts use types from schema.ts

import {Address, Builder, Cell} from "@ton/core"
import {A, B, storeA, loadA, storeB, loadB} from './schema'

function payloadToBoc(payload: A | B) {
  let store : (builder: Builder) => void
  if (payload.kind == 'A') {
    store = storeA(payload)
  } else if (payload.kind == 'B') {
    store = storeB(payload)
  }
  const builder = new Builder()
  store(builder)
  return builder.asCell().toBoc().toString('base64')
}

function loadPayload(boc: string) {
  const s = Cell.fromBase64(boc).asSlice()
  try {
    return loadA(s)
  } catch (_) {
  }
  try {
    return loadB(s)
  } catch (_) {
  }
  throw new Error('Expected of "A" or "B", but data does not satisfy any constructor')
}

const a = process.argv[2] || '42'
const b = process.argv[3] || 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c'
const bocA = payloadToBoc({
  kind: 'A',
  a: BigInt(a),
})
const bocB = payloadToBoc({
  kind: 'B',
  b: Address.parse(b),
})
const payloadA = loadPayload(bocA)
const payloadB = loadPayload(bocB)
console.log({bocA, payloadA, bocB, payloadB})

Run sample.ts

npx ts-node sample.ts 42 EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c
{
  bocA: 'te6cckEBAQEAJgAASAYovqEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKu1DVIw=',
  payloadA: { kind: 'A', a: 42n },
  bocB: 'te6cckEBAQEAKAAAS25ndrKf5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZwvzU+eg==',
  payloadB: { kind: 'B', b: EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment