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 }
}
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 }
}