diff --git a/docs/develop/dapps/ton-connect/sign.mdx b/docs/develop/dapps/ton-connect/sign.mdx index 885238487b..2ec9d37a77 100644 --- a/docs/develop/dapps/ton-connect/sign.mdx +++ b/docs/develop/dapps/ton-connect/sign.mdx @@ -154,7 +154,50 @@ export function useBackendAuth() { ## Backend Example +
+Check if Proof Valid (Next.js) +```tsx +'use server' +import {Address, Cell, contractAddress, loadStateInit, TonClient4} from '@ton/ton' + + +export async function isValid(proof, account) { + const payload = { + address: account.address, + public_key: account.publicKey, + proof: { + ...proof, + state_init: account.walletStateInit + } + } + const stateInit = loadStateInit(Cell.fromBase64(payload.proof.state_init).beginParse()) + const client = new TonClient4({ + endpoint: 'https://mainnet-v4.tonhubapi.com' + }) + const masterAt = await client.getLastBlock() + const result = await client.runMethod(masterAt.last.seqno, Address.parse(payload.address), 'get_public_key', []) + const publicKey = Buffer.from(result.reader.readBigNumber().toString(16).padStart(64, '0'), 'hex') + if (!publicKey) { + return false + } + const wantedPublicKey = Buffer.from(payload.public_key, 'hex') + if (!publicKey.equals(wantedPublicKey)) { + return false + } + const wantedAddress = Address.parse(payload.address) + const address = contractAddress(wantedAddress.workChain, stateInit) + if (!address.equals(wantedAddress)) { + return false + } + const now = Math.floor(Date.now() / 1000) + if (now - (60 * 15) > payload.proof.timestamp) { + return false + } + return true + } +``` +
You can review our [example](https://github.com/ton-connect/demo-dapp-with-react-ui/tree/master/src/server) showcasing the key methods: - [generatePayload](https://github.com/ton-connect/demo-dapp-with-react-ui/blob/master/src/server/api/generate-payload.ts): Generates a payload for ton proof - [checkProof](https://github.com/ton-connect/demo-dapp-with-react-ui/blob/master/src/server/api/check-proof.ts): Checks the proof and returns an access token.