diff --git a/api-reference/get-started.mdx b/api-reference/get-started.mdx deleted file mode 100644 index 2047a2d..0000000 --- a/api-reference/get-started.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: API Reference -description: "Complete API documentation for building on TAC" ---- - -TAC provides comprehensive API access through three complementary sets of endpoints: standard EVM JSON-RPC APIs for full Ethereum compatibility, TAC-specific APIs for cross-chain functionality, and Safe APIs for tracking transactions sent via Safe smart contracts. - -This multi-layered approach ensures that existing Ethereum tools work seamlessly while providing access to TAC's unique hybrid dApp capabilities and Safe transaction monitoring. - -## API Categories - - - - Cross-Chain Functionality: TAC-specific endpoints for asset bridging, - transaction tracking, sequencer status, and hybrid dApp operations. - - - - Standard JSON-RPC: Complete Ethereum JSON-RPC compatibility for accounts, - transactions, contracts, block data, and blockchain info. - - - - Safe Transaction Tracking: APIs to keep track of transactions sent via Safe smart contracts. - - - -## API Usage - -Most developers primarily use **TON Adapter APIs** and **EVM APIs** for building applications on TAC. The **Safe APIs** provide specialized functionality for monitoring Safe smart contract transactions. diff --git a/api-reference/ton-adapter/openapi.yaml b/api-reference/ton-adapter/openapi.yaml deleted file mode 100644 index 4fce482..0000000 --- a/api-reference/ton-adapter/openapi.yaml +++ /dev/null @@ -1,790 +0,0 @@ -openapi: 3.0.1 -info: - title: TON Adapter API - description: TON Adapter API for transaction tracking and simulation on TAC -servers: - - url: https://data.spb.tac.build/ - - url: https://data.tac.build/ -paths: - /status: - post: - tags: - - Status - summary: Get status - description: Get the status of an operation by its Operation ID - requestBody: - description: Request Body - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.OperationIdsParams" - required: true - responses: - "200": - description: Status of the operations - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.GetStatusesResponse" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "404": - description: Operation ID not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - x-codegen-request-body-name: body - - /operation-type: - get: - tags: - - Status - summary: Get operation type - description: Get type of transaction - parameters: - - name: operationId - in: query - description: Operation ID - required: true - schema: - type: string - responses: - "200": - description: Type of the operation - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.GetOperationTypeResponse" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "404": - description: Operation ID not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - - /operation-ids: - get: - tags: - - Operations - summary: Get Operation IDs using filters - description: Returns operation IDs that satisfy certain filters - parameters: - - name: from - in: query - description: Lower time bound of operation (Unix timestamp) - required: true - schema: - type: number - - name: till - in: query - description: Greater time bound of operation (Unix timestamp) - required: true - schema: - type: number - - name: limit - in: query - description: The maximum number of items to return. Default is 100 - schema: - type: number - - name: offset - in: query - description: The number of items to skip before starting to collect the result set. Default is 0. - schema: - type: number - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.ArrayResponse-api_types_OperationIdWithTimestamp" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - - /operation-ids-by-shards-keys: - post: - tags: - - Operations - summary: Get Operation IDs by shardsKeys - description: Returns operation IDs that satisfy certain filters - requestBody: - description: Request body - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.ShardsKeysParams" - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.OperationIdsByShardsKeysResponse" - "400": - description: Invalid body parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "404": - description: Data not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - x-codegen-request-body-name: body - - /stage-profiling: - post: - tags: - - Time profiling - summary: Get stage profiling - description: Retrieves time information for every stage of transaction based on operation ID - requestBody: - description: Request body - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.OperationIdsParams" - required: true - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.StageProfilingResponse" - "400": - description: Invalid body parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "404": - description: Data not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - x-codegen-request-body-name: body - - /tac/observer/is-message-collected: - get: - tags: - - Observer - summary: Check if merkle message is collected - description: Check if the TAC MerkleMsg is collected. - parameters: - - name: operationId - in: query - description: Operation ID - required: true - schema: - type: string - responses: - "200": - description: Message is collected - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.GetStatusResponse" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.StringResponse" - "404": - description: Operation ID not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - - /tac/observer/is-message-executed: - get: - tags: - - Observer - summary: Check if Merkle Message is Executed - description: Check if the Merkle message is executed in the TAC chain. - parameters: - - name: operationId - in: query - description: Operation ID - required: true - schema: - type: string - responses: - "200": - description: Message is executed - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.GetStatusResponse" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "404": - description: Operation ID not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - - /tac/observer/is-message-included-in-consensus: - get: - tags: - - Observer - summary: Check if Merkle Root is Set - description: Check if the Merkle root is set in the TAC chain. - parameters: - - name: operationId - in: query - description: Operation ID - required: true - schema: - type: string - responses: - "200": - description: Merkle root is set - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.GetStatusResponse" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "404": - description: Operation ID not found - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - - /tac/operation-id: - get: - tags: - - Operations - summary: Get Operation ID - description: Returns a unique operationId to track the entire path of a transaction. All parameters are fields of the transactionLinker structure in the SDK, which you set when sending a transaction. - parameters: - - name: transactionHash - in: query - description: TAC transaction hash - required: true - schema: - type: string - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.TACOperationIdResponse" - "400": - description: Invalid query parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - - /tac/simulator/simulate-message: - post: - tags: - - Simulator - summary: Simulate TAC message - description: Simulates execution of an TAC call from TON - requestBody: - description: Simulation parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.SimulateMessageTACParams" - required: true - responses: - "200": - description: TAC simulation response - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.TACSimulationResponse" - "400": - description: Bad request - invalid parameters - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - "500": - description: Internal error - content: - application/json: - schema: - $ref: "#/components/schemas/api_types.Error" - x-codegen-request-body-name: request - -components: - schemas: - api_types.ArrayResponse-api_types_OperationIdWithTimestamp: - type: object - properties: - response: - type: array - items: - $ref: "#/components/schemas/api_types.OperationIdWithTimestamp" - - api_types.BlockchainType: - type: string - enum: - - TAC - - TON - x-enum-varnames: - - TAC - - TON - - api_types.EVMTokenAmountResult: - type: object - properties: - amount: - type: string - tokenAddress: - type: string - - api_types.Error: - type: object - properties: - error: - type: string - - api_types.ExecutionStages: - type: object - properties: - collectedInTAC: - $ref: "#/components/schemas/api_types.ProfilingStageData" - collectedInTON: - $ref: "#/components/schemas/api_types.ProfilingStageData" - executedInTAC: - $ref: "#/components/schemas/api_types.ProfilingStageData" - executedInTON: - $ref: "#/components/schemas/api_types.ProfilingStageData" - includedInTACConsensus: - $ref: "#/components/schemas/api_types.ProfilingStageData" - includedInTONConsensus: - $ref: "#/components/schemas/api_types.ProfilingStageData" - operationType: - $ref: "#/components/schemas/api_types.OperationType" - - api_types.FeeParamsResult: - type: object - properties: - currentBaseFee: - type: string - isEip1559: - type: boolean - suggestedGasPrice: - type: string - suggestedGasTip: - type: string - - api_types.GetOperationTypeResponse: - type: object - properties: - response: - $ref: "#/components/schemas/api_types.OperationType" - - api_types.GetStatusResponse: - type: object - properties: - response: - $ref: "#/components/schemas/api_types.StatusResult" - - api_types.GetStatusesResponse: - type: object - properties: - response: - type: object - additionalProperties: - $ref: "#/components/schemas/api_types.StatusResult" - - api_types.GetTONOperationIdParams: - required: - - caller - - shardsKey - type: object - properties: - caller: - type: string - shardCount: - type: integer - shardsKey: - type: string - timestamp: - type: integer - - api_types.IntResponse: - type: object - properties: - response: - type: integer - - api_types.NoteInfo: - type: object - properties: - content: - type: string - errorName: - type: string - internalBytesError: - type: string - internalMsg: - type: string - - api_types.OperationIdWithLogIndex: - type: object - properties: - logIndex: - type: integer - operationId: - type: string - - api_types.OperationIdWithTimestamp: - type: object - properties: - operationId: - type: string - timestamp: - type: integer - - api_types.OperationIdsByShardsKeysResponse: - type: object - properties: - response: - type: object - additionalProperties: - $ref: "#/components/schemas/api_types.OperationIdsByShardsKeysResult" - - api_types.OperationIdsByShardsKeysResult: - type: object - properties: - operationIds: - type: array - items: - type: string - - api_types.OperationIdsParams: - required: - - operationIds - type: object - properties: - operationIds: - type: array - items: - type: string - - api_types.OperationType: - type: string - enum: - - PENDING - - TON-TAC-TON - - ROLLBACK - - TON-TAC - - TAC-TON - - UNKNOWN - x-enum-varnames: - - PENDING - - TON_TAC_TON - - ROLLBACK - - TON_TAC - - TAC_TON - - UNKNOWN - - api_types.OutMessageResult: - type: object - properties: - callerAddress: - type: string - operationId: - type: string - payload: - type: string - shardsKey: - type: integer - targetAddress: - type: string - tokensBurned: - type: array - items: - $ref: "#/components/schemas/api_types.EVMTokenAmountResult" - tokensLocked: - type: array - items: - $ref: "#/components/schemas/api_types.EVMTokenAmountResult" - - api_types.ProfilingStageData: - type: object - properties: - exists: - type: boolean - stageData: - $ref: "#/components/schemas/api_types.StageData" - - api_types.ShardsKeysParams: - required: - - caller - - shardsKeys - type: object - properties: - caller: - type: string - shardsKeys: - type: array - items: - type: string - - api_types.SimulateMessageTACParams: - required: - - shardsKey - - tacCallParams - - tonAssets - - tonCaller - type: object - properties: - executorAddress: - type: string - extraData: - type: string - feeAssetAddress: - type: string - shardsKey: - type: string - tacCallParams: - $ref: "#/components/schemas/api_types.TACCallParams" - tonAssets: - type: array - items: - $ref: "#/components/schemas/api_types.TVMAssetAmount" - tonCaller: - type: string - - api_types.Stage: - type: string - enum: - - start - - collectedInTAC - - includedInTACConsensus - - executedInTAC - - collectedInTON - - includedInTONConsensus - - executedInTON - x-enum-varnames: - - START - - COLLECTED_IN_TAC - - INCLUDED_IN_TAC_CONSENSUS - - EXECUTED_IN_TAC - - COLLECTED_IN_TON - - INCLUDED_IN_TON_CONSENSUS - - EXECUTED_IN_TON - - api_types.StageData: - type: object - properties: - note: - $ref: "#/components/schemas/api_types.NoteInfo" - success: - type: boolean - timestamp: - type: integer - transactions: - type: array - items: - $ref: "#/components/schemas/api_types.TransactionData" - - api_types.StageProfilingResponse: - type: object - properties: - response: - type: object - additionalProperties: - $ref: "#/components/schemas/api_types.ExecutionStages" - - api_types.StatusResult: - type: object - properties: - note: - $ref: "#/components/schemas/api_types.NoteInfo" - stage: - $ref: "#/components/schemas/api_types.Stage" - success: - type: boolean - timestamp: - type: integer - transactions: - type: array - items: - $ref: "#/components/schemas/api_types.TransactionData" - - api_types.StringResponse: - type: object - properties: - response: - type: string - - api_types.TACCallParams: - required: - - target - type: object - properties: - arguments: - type: string - methodName: - type: string - target: - type: string - - api_types.TACOperationIdResponse: - type: object - properties: - response: - type: array - items: - $ref: "#/components/schemas/api_types.OperationIdWithLogIndex" - - api_types.TACSimulationDebugInfoResult: - type: object - properties: - blockNumber: - type: integer - callData: - type: string - from: - type: string - to: - type: string - - api_types.TACSimulationResponse: - type: object - properties: - response: - $ref: "#/components/schemas/api_types.TACSimulationResult" - - api_types.TACSimulationResult: - type: object - properties: - debugInfo: - $ref: "#/components/schemas/api_types.TACSimulationDebugInfoResult" - estimatedGas: - type: integer - estimatedJettonFeeAmount: - type: string - feeParams: - $ref: "#/components/schemas/api_types.FeeParamsResult" - message: - type: string - outMessages: - type: array - items: - $ref: "#/components/schemas/api_types.OutMessageResult" - simulationError: - type: string - simulationStatus: - type: boolean - - api_types.TVMAssetAmount: - required: - - amount - type: object - properties: - amount: - type: string - tokenAddress: - type: string - - api_types.TransactionData: - type: object - properties: - blockchainType: - $ref: "#/components/schemas/api_types.BlockchainType" - hash: - type: string - - securitySchemes: - BasicAuth: - type: http - scheme: basic - -x-original-swagger-version: "2.0" diff --git a/api/overview.mdx b/api/overview.mdx new file mode 100644 index 0000000..ab872d2 --- /dev/null +++ b/api/overview.mdx @@ -0,0 +1,24 @@ +--- +title: Overview +--- + +Alongside TypeScript SDK and Python SDK +TAC's protocol public API is provided for transaction tracking, stage profiling, simulating EVM calls on the TAC blockchain, and other needs. + +## API Schemas + + + + + + + + diff --git a/apps/overview.mdx b/apps/overview.mdx new file mode 100644 index 0000000..faa507a --- /dev/null +++ b/apps/overview.mdx @@ -0,0 +1,39 @@ +--- +title: Overview +description: Explore existing reference implementations to accelerate your own dApp development +--- + + + + The codebase of famous bluechip dApp. Try it as [Telegram Mini App](https://t.me/CurveAppBot) + + + + The codebase of perpetual trading dApp with gamified UI. Try it [here](https://hooked.tac.build/) + + + + Starter template code to jumpstart your local development + + + + Live hybrid dApps list, not an extensive one, more are popping up! + + + diff --git a/audit/overview.mdx b/audit/overview.mdx new file mode 100644 index 0000000..5767a91 --- /dev/null +++ b/audit/overview.mdx @@ -0,0 +1,58 @@ +--- +title: Overview +description: The TAC ecosystem undergoes security assessments by industry-leading firms to ensure the safety of our infrastructure and user assets. +--- + +## Core Blockchain +These audits cover the foundational TAC blockchain components and the Cosmos EVM integration. + + + + Halborn + + + Halborn + + + +## Bridges +Bridge audits focus on the secure movement of assets between chains, specifically verifying the logic for USDT flow between TON, Ethereum, and TAC. + + + + Quantstamp + + + Quantstamp + + + +## TAC Proxies +These reports evaluate the proxy architecture that allows dApps on TAC to be accessible from the TON blockchain. + + + + Quantstamp + + + Quantstamp + + + Quantstamp + + + Quantstamp + + + Quantstamp + + + +## Smart Accounts +This audit validates the Smart Account primitives, which enable the creation of programmable user wallets on the EVM side. + + + + Quantstamp + + \ No newline at end of file diff --git a/build/proxy/advanced-usage/advanced-testing.mdx b/build/proxy/advanced-usage/advanced-testing.mdx deleted file mode 100644 index 555a0b3..0000000 --- a/build/proxy/advanced-usage/advanced-testing.mdx +++ /dev/null @@ -1,313 +0,0 @@ ---- -title: Advanced Testing -description: "Complex testing patterns for NFTs and multi-asset cross-chain operations" ---- - -This guide covers advanced testing scenarios using the TAC Local Test SDK, including NFT operations, multi-asset bridging, and complex cross-chain workflows. All examples are based on the official TAC engineering test patterns. - - - Advanced testing scenarios combine multiple asset types (tokens + NFTs) and - complex bridging operations to ensure your proxy contracts handle real-world - use cases. - - -## NFT Testing with sendMessageWithNFT - -### NFT Data Structures - -The TAC testing framework provides specialized structures for NFT operations: - -#### NFTInfo - -```typescript -const nftCollectionInfo: NFTInfo = { - tvmAddress: "NftCollectionAddress", // TON NFT collection address - name: "NftCollection1", - symbol: "NFT1", - baseURI: "https://nft1.com/", -}; -``` - -#### NFTMintInfo - -```typescript -const nftMintInfo: NFTMintInfo = { - info: nftCollectionInfo, - tokenId: 1n, // Token ID to mint -}; -``` - -#### NFTUnlockInfo - -```typescript -const nftUnlockInfo: NFTUnlockInfo = { - evmAddress: await existedERC721.getAddress(), - tokenId: lockedTokenId, - amount: 0n, // Amount is ignored for ERC721 -}; -``` - -## Complete NFT Testing Example - -Here's the complete NFT testing setup from the TAC engineering team: - -```typescript -import hre, { ethers } from "hardhat"; -import { - deploy, - TacLocalTestSdk, - NFTInfo, - NFTMintInfo, - NFTUnlockInfo, -} from "@tonappchain/evm-ccl"; -import { Signer } from "ethers"; -import { TestERC721Token, TestNFTProxy } from "../typechain-types"; -import { expect } from "chai"; - -describe("TacLocalTestSDK NFT", () => { - let admin: Signer; - let testSdk: TacLocalTestSdk; - let testNFTProxy: TestNFTProxy; - let existedERC721: TestERC721Token; - - before(async () => { - [admin] = await ethers.getSigners(); - testSdk = new TacLocalTestSdk(); - const crossChainLayerAddress = testSdk.create(ethers.provider); - - existedERC721 = await deploy( - admin, - hre.artifacts.readArtifactSync("TestERC721Token"), - ["ExistedNFT", "NFTE", "https://test-nft.com/"], - undefined, - false - ); - testNFTProxy = await deploy( - admin, - hre.artifacts.readArtifactSync("TestNFTProxy"), - [crossChainLayerAddress], - undefined, - false - ); - }); - - it("Test send message with NFT", async () => { - const shardsKey = 1n; - const operationId = ethers.encodeBytes32String("operationId"); - const extraData = "0x"; - const timestamp = BigInt(Math.floor(Date.now() / 1000)); - const tvmWalletCaller = "TVMCallerAddress"; - - const nftCollectionInfo: NFTInfo = { - tvmAddress: "NftCollectionAddress", - name: "NftCollection1", - symbol: "NFT1", - baseURI: "https://nft1.com/", - }; - - const nftMintInfo: NFTMintInfo = { - info: nftCollectionInfo, - tokenId: 1n, - }; - - // Lock an NFT on the cross-chain layer to simulate bridging from EVM - const lockedTokenId = 1n; - await ( - await existedERC721.mint( - testSdk.getCrossChainLayerAddress(), - lockedTokenId - ) - ).wait(); - - const nftUnlockInfo: NFTUnlockInfo = { - evmAddress: await existedERC721.getAddress(), - tokenId: lockedTokenId, - amount: 0n, // 'amount' is ignored for ERC721 - }; - - // Calculate the deployed NFT collection address - const calculatedNFTAddress = testSdk.getEVMNFTCollectionAddress( - nftCollectionInfo.tvmAddress - ); - const target = await testNFTProxy.getAddress(); - const methodName = "receiveNFT(bytes,bytes)"; - - // Encode two NFTs: - // - One minted (nftMintInfo) with amount 0 (ignored) - // - One unlocked (nftUnlockInfo) with amount 0 - const receivedToken1 = [calculatedNFTAddress, nftMintInfo.tokenId, 0n]; - const receivedToken2 = [ - nftUnlockInfo.evmAddress, - nftUnlockInfo.tokenId, - nftUnlockInfo.amount, - ]; - - const encodedArguments = ethers.AbiCoder.defaultAbiCoder().encode( - ["tuple(address,uint256,uint256)[]"], - [[receivedToken1, receivedToken2]] - ); - - const { receipt, deployedTokens, outMessages } = - await testSdk.sendMessageWithNFT( - shardsKey, - target, - methodName, - encodedArguments, - tvmWalletCaller, - [], - [], - [nftMintInfo], - [nftUnlockInfo], - 0n, - extraData, - operationId, - timestamp - ); - - expect(receipt.status).to.be.eq(1); - expect(deployedTokens.length).to.be.eq(1); - expect(deployedTokens[0].evmAddress).to.be.eq(calculatedNFTAddress); - expect(deployedTokens[0].tvmAddress).to.be.eq(nftCollectionInfo.tvmAddress); - expect(outMessages.length).to.be.eq(1); - const outMessage = outMessages[0]; - expect(outMessage.shardsKey).to.be.eq(shardsKey); - expect(outMessage.operationId).to.be.eq(operationId); - expect(outMessage.callerAddress).to.be.eq(await testNFTProxy.getAddress()); - expect(outMessage.targetAddress).to.be.eq(tvmWalletCaller); - expect(outMessage.payload).to.be.eq(""); - expect(outMessage.tokensBurned.length).to.be.eq(0); - expect(outMessage.tokensLocked.length).to.be.eq(0); - expect(outMessage.nftsBurned.length).to.be.eq(1); - expect(outMessage.nftsBurned[0].evmAddress).to.be.eq(calculatedNFTAddress); - expect(outMessage.nftsBurned[0].tokenId).to.be.eq(nftMintInfo.tokenId); - expect(outMessage.nftsLocked.length).to.be.eq(1); - expect(outMessage.nftsLocked[0].evmAddress).to.be.eq( - nftUnlockInfo.evmAddress - ); - expect(outMessage.nftsLocked[0].tokenId).to.be.eq(nftUnlockInfo.tokenId); - }); -}); -``` - -## Key NFT Testing Patterns - -### 1. NFT Minting vs Unlocking - -**NFT Minting** (TON → EVM): - -```typescript -// Create NFT collection info -const nftCollectionInfo: NFTInfo = { - tvmAddress: "NftCollectionAddress", // TON collection - name: "TestCollection", - symbol: "TC", - baseURI: "https://test.com/", -}; - -// Specify which token to mint -const nftMintInfo: NFTMintInfo = { - info: nftCollectionInfo, - tokenId: 1n, -}; - -// Get the calculated EVM address -const evmNFTAddress = testSdk.getEVMNFTCollectionAddress( - nftCollectionInfo.tvmAddress -); -``` - -**NFT Unlocking** (Existing EVM NFT): - -```typescript -// Pre-mint NFT to CrossChainLayer -const tokenId = 1n; -await existedERC721.mint(testSdk.getCrossChainLayerAddress(), tokenId); - -// Create unlock info -const nftUnlockInfo: NFTUnlockInfo = { - evmAddress: await existedERC721.getAddress(), - tokenId: tokenId, - amount: 0n, // Always 0 for ERC721 -}; -``` - -### 2. sendMessageWithNFT Method Signature - -```typescript -const { receipt, deployedTokens, outMessages } = - await testSdk.sendMessageWithNFT( - shardsKey, // uint64 - Operation identifier - target, // string - Target contract address - methodName, // string - Function signature - encodedArguments, // bytes - ABI-encoded arguments - tvmWalletCaller, // string - Simulated TON caller - [], // TokenMintInfo[] - Regular tokens to mint - [], // TokenUnlockInfo[] - Regular tokens to unlock - [nftMintInfo], // NFTMintInfo[] - NFTs to mint - [nftUnlockInfo], // NFTUnlockInfo[] - NFTs to unlock - tacAmountToBridge, // bigint - Native TAC amount - extraData, // bytes - Extra data - operationId, // bytes32 - Operation ID - timestamp // bigint - Block timestamp - ); -``` - -### 3. NFT Argument Encoding - -```typescript -// Encode NFTAmount[] for proxy function -const receivedNFTs = [ - [calculatedNFTAddress, nftMintInfo.tokenId, 0n], // Minted NFT - [nftUnlockInfo.evmAddress, nftUnlockInfo.tokenId, nftUnlockInfo.amount], // Unlocked NFT -]; - -const encodedArguments = ethers.AbiCoder.defaultAbiCoder().encode( - ["tuple(address,uint256,uint256)[]"], - [receivedNFTs] -); -``` - - -## Testing Result Verification - -### NFT-Specific Assertions - -```typescript -// Verify NFT deployment -expect(deployedTokens.length).to.equal(1); -expect(deployedTokens[0].evmAddress).to.equal(calculatedNFTAddress); -expect(deployedTokens[0].tvmAddress).to.equal(nftCollectionInfo.tvmAddress); - -// Verify NFT operations in outMessages -const outMessage = outMessages[0]; -expect(outMessage.nftsBurned.length).to.equal(1); -expect(outMessage.nftsBurned[0].evmAddress).to.equal(calculatedNFTAddress); -expect(outMessage.nftsBurned[0].tokenId).to.equal(nftMintInfo.tokenId); - -expect(outMessage.nftsLocked.length).to.equal(1); -expect(outMessage.nftsLocked[0].evmAddress).to.equal(nftUnlockInfo.evmAddress); -expect(outMessage.nftsLocked[0].tokenId).to.equal(nftUnlockInfo.tokenId); -``` - - - -## What's Next? - -This completes the NFT testing patterns available in the TAC Local Test SDK. - - - - Back to basic testing framework documentation - - - Learn how to implement NFT proxy contracts - - diff --git a/build/proxy/introduction.mdx b/build/proxy/introduction.mdx deleted file mode 100644 index 695cb69..0000000 --- a/build/proxy/introduction.mdx +++ /dev/null @@ -1,129 +0,0 @@ ---- -title: Overview -description: "TAC Proxy contracts receive cross-chain calls from TON users and execute EVM logic" ---- - -TAC Proxy contracts are Solidity contracts that enable TON users to interact with your EVM applications directly from their TON wallets. Instead of bridging tokens and switching networks, users can call your smart contract functions and receive results in a single transaction. - - - Think of TAC Proxies as API endpoints for TON users. Instead of HTTP requests, - TON users send blockchain transactions that trigger your EVM functions and get - processed results back automatically. - - -## What TAC Proxies Enable - -TAC Proxies solve the cross-chain user experience problem by creating **direct connections** between TON users and EVM applications: - -### Direct Function Calls -TON users can call your EVM contract functions directly from their TON wallets without switching networks or managing multiple wallets. - -```solidity -contract SwapProxy is TacProxyV1 { - function swap(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // TON user's swap request is processed here - // Results automatically sent back to their TON wallet - } -} -``` - -### Seamless Asset Bridging -Tokens are automatically bridged from TON to your contract before your function executes, then bridged back with the results. - -### One Transaction Experience -What used to require multiple transactions across different chains now happens in a single TON transaction: - -**Without TAC Proxies:** -1. Bridge tokens TON → EVM -2. Switch to MetaMask -3. Interact with your dApp -4. Bridge tokens back EVM → TON - -**With TAC Proxies:** -1. Call your function from TON wallet ✨ - -## Real-World Use Cases - -### DeFi Protocols -```solidity -// TON user supplies collateral and borrows in one transaction -function supplyAndBorrow(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer -{ - // Supply collateral to lending protocol - // Borrow against it - // Send borrowed tokens back to TON user -} -``` - -### NFT Marketplaces -```solidity -// TON user buys NFT with their TON assets -function buyNFT(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer -{ - // Process payment - // Transfer NFT to TON user -} -``` - -### Gaming & Rewards -```solidity -// Player completes quest, receives tokens -function completeQuest(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer -{ - // Verify quest completion - // Mint and send reward tokens back to player -} -``` - -## Key Benefits - -**For Users:** -- Keep using familiar TON wallets -- No network switching or gas token management -- Single transaction for complex operations - -**For Developers:** -- Same Solidity development experience -- Access to TON's large user base -- Existing EVM tools and infrastructure - -**For Applications:** -- Tap into TON ecosystem without rebuilding -- Unified liquidity across chains -- Simplified user onboarding - -## Getting Started - -Ready to build your first TAC Proxy? Follow our step-by-step guides: - - - - Install dependencies and configure your development environment - - - Build your first proxy contract with step-by-step examples - - - - - **New to cross-chain development?** TAC Proxies handle all the complexity - behind the scenes. You write standard Solidity contracts with a simple - function signature pattern - everything else is automated. - \ No newline at end of file diff --git a/build/proxy/usage/proxy-functions.mdx b/build/proxy/usage/proxy-functions.mdx deleted file mode 100644 index 73c372d..0000000 --- a/build/proxy/usage/proxy-functions.mdx +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: Proxy Functions -description: "Build the core logic that processes cross-chain calls and arguments" ---- - - Proxy functions are the heart of your TAC contracts - they receive cross-chain calls from TON users and execute your application logic. This guide covers how to implement robust proxy functions that handle different use cases and error conditions. - - ## Function Signature Requirements - - Every proxy function that handles cross-chain calls must follow this exact pattern: - - ```solidity - function (bytes calldata, bytes calldata) external; - ``` - - You can name the function as you wish (e.g. `myProxyFunction`, `invokeWithCallback`, `swap`, etc.), but it must accept two bytes arguments: - - ```solidity - function yourFunctionName(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // Your implementation - } - ``` - - **Required Components:** - - `bytes calldata tacHeader` - Contains verified TON user information - - `bytes calldata arguments` - Your custom encoded parameters - - `external` visibility - Functions must be externally callable - - `_onlyCrossChainLayer` modifier - Security requirement - - **Important:** Only the Cross-Chain Layer (CCL) contract can call these functions. When a user on TON sends a message, the CCL automatically transfers any bridged tokens to your proxy contract before calling your function. - - ## Parameter Encoding and Decoding - - ### Simple Parameters - - For basic data types, use straightforward encoding: - - ```solidity - struct SimpleParams { - address token; - uint256 amount; - address recipient; - } - - function handleSimpleParams(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // Decode parameters - SimpleParams memory params = abi.decode(arguments, (SimpleParams)); - - // Use the parameters - IERC20(params.token).transfer(params.recipient, params.amount); - } - ``` - - ### Complex Parameters - - For complex data with arrays or nested structures: - - ```solidity - struct ComplexParams { - address[] tokens; - uint256[] amounts; - bytes swapData; - uint256 deadline; - } - - function handleComplexParams(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - ComplexParams memory params = abi.decode(arguments, (ComplexParams)); - - // Validate array lengths match - require(params.tokens.length == params.amounts.length, "Array length mismatch"); - - // Process each token - for (uint i = 0; i < params.tokens.length; i++) { - // Your custom logic here - IERC20(params.tokens[i]).transfer(msg.sender, params.amounts[i]); - } - - // Use additional data - if (params.swapData.length > 0) { - // Your custom swap logic here - } - } - ``` - - ## Complete Implementation Walkthrough - - Let's build a complete proxy function step-by-step, showing external Dapp integration - the most common real-world pattern: - - ```solidity - // SPDX-License-Identifier: MIT - pragma solidity ^0.8.28; - - import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - import { TacProxyV1 } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; - import { TokenAmount, OutMessageV1, TacHeaderV1, NFTAmount } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; - - interface IDappContract { - function doSomething(address tokenFrom, address tokenTo, uint256 amount) - external returns (uint256); - } - - contract MyProxy is TacProxyV1 { - IDappContract public dappContract; - - struct MyProxyFunctionArguments { - address tokenFrom; - address tokenTo; - uint256 amount; - } - - constructor(address _dappContract, address _crossChainLayer) - TacProxyV1(_crossChainLayer) - { - dappContract = IDappContract(_dappContract); - } - - function myProxyFunction(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // 1. Decode the custom arguments - MyProxyFunctionArguments memory args = abi.decode(arguments, (MyProxyFunctionArguments)); - - // 2. Approve tokens to your Dapp contract for some action - IERC20(args.tokenFrom).approve(address(dappContract), args.amount); - - // 3. Call the Dapp contract - uint256 tokenToAmount = dappContract.doSomething( - args.tokenFrom, - args.tokenTo, - args.amount - ); - - // 4. Prepare tokens to send back to TON - TokenAmount[] memory tokensToBridge = new TokenAmount[](1); - tokensToBridge[0] = TokenAmount(args.tokenTo, tokenToAmount); - - // 5. Approve the CrossChainLayer to pull them - IERC20(tokensToBridge[0].evmAddress).approve( - _getCrossChainLayerAddress(), - tokensToBridge[0].amount - ); - - // 6. Decode the TAC header - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - - // 7. Form an OutMessage - OutMessageV1 memory outMsg = OutMessageV1({ - shardsKey: header.shardsKey, // Use same key for RoundTrip - tvmTarget: header.tvmCaller, // Send back to caller - tvmPayload: "", // Must be empty - not supported - tvmProtocolFee: 0, // 0 for RoundTrip - already paid on TON - tvmExecutorFee: 0, // 0 for RoundTrip - already paid on TON - tvmValidExecutors: new string[](0), // Empty for RoundTrip - already defined on TON - toBridge: tokensToBridge, // Result tokens - toBridgeNFT: new NFTAmount[](0) // No NFTs - }); - - // 8. Send message back through CrossChainLayer with zero native - _sendMessageV1(outMsg, 0); - } - } - ``` - - **This example shows the complete flow:** - - External Dapp contract integration (lines 11-13, 19-21, 32-38) - - Token approval for external contracts (line 33) - - Processing and getting results (lines 35-38) - - RoundTrip response pattern (lines 48-58) - - Proper fee handling for RoundTrip messages (lines 52-53) - - **Important Notes:** - - Use `_sendMessageV1` for ERC20 token bridging only - - Use `_sendMessageV2` if you need to bridge both NFTs and ERC20 tokens back to TON - - The CCL automatically handles token transfers to your proxy before calling your function - - Always include the `NFTAmount` import when using OutMessageV1 - - ## What's Next? - - Now that you understand how to implement proxy functions, learn about managing fees: - - - - Understand how to handle protocol fees and executor payments - - - Explore advanced patterns for complex proxy implementations - - diff --git a/build/sdk/advanced-usage/simulation-testing.mdx b/build/sdk/advanced-usage/simulation-testing.mdx deleted file mode 100644 index 1b0644e..0000000 --- a/build/sdk/advanced-usage/simulation-testing.mdx +++ /dev/null @@ -1,1085 +0,0 @@ ---- -title: Simulation & Testing -description: "Advanced testing strategies and simulation techniques for robust cross-chain applications" ---- - -Testing cross-chain applications requires sophisticated strategies that account for multi-network interactions, asynchronous execution, and complex failure modes. The TAC SDK provides comprehensive simulation and testing tools to help developers build reliable hybrid dApps. - -## Transaction Simulation - -The SDK's simulation capabilities allow you to test operations before execution, estimate costs, and validate parameters without spending real assets. - -### Basic Transaction Simulation - -```javascript -const simulateTransaction = async (evmProxyMsg, sender, assets) => { - try { - const simulation = await tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - console.log("Simulation Results:"); - console.log( - "- Estimated Gas:", - simulation.simulation.estimatedGas.toString() - ); - console.log("- Protocol Fee:", simulation.feeParams.protocolFee.toString()); - console.log( - "- EVM Executor Fee:", - simulation.feeParams.evmExecutorFee.toString() - ); - console.log( - "- TON Executor Fee:", - simulation.feeParams.tvmExecutorFee.toString() - ); - console.log("- Gas Limit:", simulation.feeParams.gasLimit.toString()); - - console.log("- Is Round Trip:", simulation.feeParams.isRoundTrip); - - return simulation; - } catch (error) { - console.error("Simulation failed:", error); - throw error; - } -}; -``` - -### Advanced EVM Simulation - -For detailed EVM execution simulation: - -```javascript -const simulateEVMExecution = async (evmOperation) => { - try { - const simulationRequest = { - evmTargetAddress: evmOperation.evmTargetAddress, - methodName: evmOperation.methodName, - encodedParameters: evmOperation.encodedParameters, - gasLimit: evmOperation.gasLimit || 500000n, - caller: await sender.getSenderAddress(), - }; - - const result = await tacSdk.simulateTACMessage(simulationRequest); - - console.log("EVM Simulation Results:"); - console.log("- Success:", result.success); - console.log("- Gas Used:", result.gasUsed?.toString()); - console.log("- Return Data:", result.returnData); - console.log("- Logs:", result.logs); - - if (result.revertReason) { - console.log("- Revert Reason:", result.revertReason); - } - - return result; - } catch (error) { - console.error("EVM simulation failed:", error); - throw error; - } -}; -``` - -## Comprehensive Testing Framework - -### Test Environment Setup - -```javascript -class TACTestEnvironment { - constructor() { - this.tacSdk = null; - this.testSenders = []; - this.deployedContracts = new Map(); - this.testAssets = new Map(); - } - - async setup() { - // Initialize SDK for testing - this.tacSdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 500, // Faster for testing - }); - - // Create test senders - await this.createTestSenders(); - - // Deploy test contracts - await this.deployTestContracts(); - - // Prepare test assets - await this.prepareTestAssets(); - - console.log("Test environment initialized"); - } - - async createTestSenders() { - // Create multiple test wallets with different configurations - const testMnemonics = [ - process.env.TEST_MNEMONIC_1, - process.env.TEST_MNEMONIC_2, - process.env.TEST_MNEMONIC_3, - ]; - - for (let i = 0; i < testMnemonics.length; i++) { - if (testMnemonics[i]) { - const sender = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: testMnemonics[i], - }); - - this.testSenders.push({ - id: `test_sender_${i}`, - sender, - address: sender.getSenderAddress(), - }); - } - } - } - - async deployTestContracts() { - // In a real implementation, would deploy actual test contracts - this.deployedContracts.set("testERC20", "0xTestERC20Contract..."); - this.deployedContracts.set("testDEX", "0xTestDEXContract..."); - this.deployedContracts.set("testNFT", "0xTestNFTContract..."); - } - - async prepareTestAssets() { - // Prepare test jettons and assets - this.testAssets.set("testJetton1", { - address: "EQTestJettonMaster1...", - symbol: "TST1", - }); - - this.testAssets.set("testJetton2", { - address: "EQTestJettonMaster2...", - symbol: "TST2", - }); - } - - getTestSender(id = "test_sender_0") { - const testSender = this.testSenders.find((s) => s.id === id); - if (!testSender) { - throw new Error(`Test sender ${id} not found`); - } - return testSender.sender; - } - - getTestContract(name) { - const address = this.deployedContracts.get(name); - if (!address) { - throw new Error(`Test contract ${name} not found`); - } - return address; - } - - getTestAsset(name) { - const asset = this.testAssets.get(name); - if (!asset) { - throw new Error(`Test asset ${name} not found`); - } - return asset; - } - - async cleanup() { - if (this.tacSdk) { - await this.tacSdk.closeConnections(); - } - } -} -``` - -### Unit Testing Cross-Chain Operations - -```javascript -describe("Cross-Chain Transaction Tests", () => { - let testEnv; - let sender; - - beforeAll(async () => { - testEnv = new TACTestEnvironment(); - await testEnv.setup(); - sender = testEnv.getTestSender(); - }); - - afterAll(async () => { - await testEnv.cleanup(); - }); - - describe("Basic Cross-Chain Transactions", () => { - test("should simulate successful token transfer", async () => { - const evmProxyMsg = { - evmTargetAddress: testEnv.getTestContract("testERC20"), - methodName: "transfer(bytes,bytes)", - encodedParameters: ethers.utils.defaultAbiCoder.encode( - ["address", "uint256"], - ["0xRecipientAddress...", ethers.utils.parseEther("100")] - ), - }; - - const assets = [{ amount: 1.0 }]; // 1 TON - - const simulation = await testEnv.tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - expect(simulation.success).toBe(true); - expect(simulation.estimatedGas).toBeGreaterThan(0n); - expect(simulation.protocolFee).toBeGreaterThan(0n); - }); - - test("should handle insufficient balance simulation", async () => { - const largeAssets = [{ amount: 1000000 }]; // Unrealistically large amount - - const evmProxyMsg = { - evmTargetAddress: testEnv.getTestContract("testERC20"), - methodName: "transfer(bytes,bytes)", - encodedParameters: ethers.utils.defaultAbiCoder.encode( - ["address", "uint256"], - ["0xRecipientAddress...", ethers.utils.parseEther("100")] - ), - }; - - await expect( - testEnv.tacSdk.getSimulationInfo(evmProxyMsg, sender, largeAssets) - ).rejects.toThrow(/insufficient balance/i); - }); - - test("should execute and track cross-chain transaction", async () => { - const evmProxyMsg = { - evmTargetAddress: testEnv.getTestContract("testERC20"), - methodName: "transfer(bytes,bytes)", - encodedParameters: ethers.utils.defaultAbiCoder.encode( - ["address", "uint256"], - ["0xRecipientAddress...", ethers.utils.parseEther("10")] - ), - }; - - const assets = [{ amount: 0.1 }]; // Small amount for testing - - const transactionLinker = await testEnv.tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets - ); - - expect(transactionLinker.operationId).toBeDefined(); - expect(transactionLinker.caller).toBe(sender.getSenderAddress()); - - // Wait for and verify completion - const tracker = new OperationTracker(Network.TESTNET); - - // Poll for completion with timeout - let attempts = 0; - const maxAttempts = 30; // 5 minutes max - let finalStatus = "PENDING"; - - while (attempts < maxAttempts && finalStatus === "PENDING") { - await new Promise((resolve) => setTimeout(resolve, 10000)); // Wait 10 seconds - finalStatus = await tracker.getSimplifiedOperationStatus( - transactionLinker - ); - attempts++; - } - - expect(["SUCCESSFUL", "FAILED"]).toContain(finalStatus); - }, 300000); // 5 minute timeout - }); - - describe("Asset Bridging Tests", () => { - test("should bridge jetton tokens", async () => { - const testAsset = testEnv.getTestAsset("testJetton1"); - - const assets = [ - { - address: testAsset.address, - amount: 100.0, - }, - ]; - - const evmProxyMsg = { - evmTargetAddress: testEnv.getTestContract("testDEX"), - methodName: "swap(bytes,bytes)", - encodedParameters: ethers.utils.defaultAbiCoder.encode( - ["uint256"], - [ethers.utils.parseUnits("100", testAsset.decimals)] - ), - }; - - const simulation = await testEnv.tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - expect(simulation.success).toBe(true); - }); - - test("should handle invalid jetton address", async () => { - const invalidAssets = [ - { - address: "EQInvalidAddress...", - amount: 10.0, - }, - ]; - - const evmProxyMsg = { - evmTargetAddress: testEnv.getTestContract("testDEX"), - methodName: "swap(bytes,bytes)", - encodedParameters: "0x", - }; - - await expect( - testEnv.tacSdk.getSimulationInfo(evmProxyMsg, sender, invalidAssets) - ).rejects.toThrow(); - }); - }); - - describe("Error Handling Tests", () => { - test("should handle invalid EVM contract address", async () => { - const evmProxyMsg = { - evmTargetAddress: "0xInvalidContract...", - methodName: "nonexistentMethod(bytes,bytes)", - encodedParameters: "0x", - }; - - const simulation = await testEnv.tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - [] - ); - - expect(simulation.success).toBe(false); - expect(simulation.error).toBeDefined(); - }); - - test("should handle malformed method signatures", async () => { - const evmProxyMsg = { - evmTargetAddress: testEnv.getTestContract("testERC20"), - methodName: "invalidMethod(bytes,bytes)", // Valid parameter type - encodedParameters: "0x", - }; - - await expect( - testEnv.tacSdk.getSimulationInfo(evmProxyMsg, sender, []) - ).rejects.toThrow(); - }); - }); -}); -``` - -### Integration Testing - -```javascript -class CrossChainIntegrationTester { - constructor(tacSdk) { - this.tacSdk = tacSdk; - this.testScenarios = []; - } - - addTestScenario(name, scenario) { - this.testScenarios.push({ name, scenario }); - } - - async runAllTests() { - const results = []; - - for (const { name, scenario } of this.testScenarios) { - console.log(`Running test scenario: ${name}`); - - try { - const startTime = Date.now(); - const result = await this.runTestScenario(scenario); - const duration = Date.now() - startTime; - - results.push({ - name, - success: true, - result, - duration, - }); - - console.log(`✓ ${name} completed in ${duration}ms`); - } catch (error) { - results.push({ - name, - success: false, - error: error.message, - duration: Date.now() - startTime, - }); - - console.log(`✗ ${name} failed: ${error.message}`); - } - } - - return this.generateTestReport(results); - } - - async runTestScenario(scenario) { - const results = []; - - for (const step of scenario.steps) { - const stepResult = await this.executeTestStep(step); - results.push(stepResult); - - // Verify step completion if required - if (step.verifyCompletion) { - await this.verifyStepCompletion(stepResult, step.expectedOutcome); - } - } - - return results; - } - - async executeTestStep(step) { - switch (step.type) { - case "SIMULATE": - return await this.executeSimulationStep(step); - case "EXECUTE": - return await this.executeTransactionStep(step); - case "VERIFY": - return await this.executeVerificationStep(step); - case "WAIT": - return await this.executeWaitStep(step); - default: - throw new Error(`Unknown step type: ${step.type}`); - } - } - - async executeSimulationStep(step) { - const simulation = await this.tacSdk.getSimulationInfo( - step.evmProxyMsg, - step.sender, - step.assets - ); - - return { - type: "SIMULATION", - success: simulation.success, - estimatedGas: simulation.estimatedGas, - fees: { - protocol: simulation.protocolFee, - evmExecutor: simulation.evmExecutorFee, - tvmExecutor: simulation.tvmExecutorFee, - }, - }; - } - - async executeTransactionStep(step) { - const transactionLinker = await this.tacSdk.sendCrossChainTransaction( - step.evmProxyMsg, - step.sender, - step.assets, - step.options - ); - - return { - type: "TRANSACTION", - transactionLinker, - operationId: transactionLinker.operationId, - timestamp: Date.now(), - }; - } - - async executeVerificationStep(step) { - // Verify balances, contract states, etc. - const verifications = []; - - if (step.verifyBalances) { - for (const balance of step.verifyBalances) { - const actualBalance = await this.tacSdk.getUserJettonBalance( - balance.address, - balance.tokenAddress - ); - - verifications.push({ - type: "BALANCE", - expected: balance.expectedAmount, - actual: actualBalance, - match: actualBalance === balance.expectedAmount, - }); - } - } - - return { - type: "VERIFICATION", - verifications, - allPassed: verifications.every((v) => v.match), - }; - } - - async executeWaitStep(step) { - await new Promise((resolve) => setTimeout(resolve, step.duration)); - return { - type: "WAIT", - duration: step.duration, - }; - } - - generateTestReport(results) { - const totalTests = results.length; - const passedTests = results.filter((r) => r.success).length; - const failedTests = totalTests - passedTests; - const totalDuration = results.reduce((sum, r) => sum + r.duration, 0); - - return { - summary: { - total: totalTests, - passed: passedTests, - failed: failedTests, - successRate: (passedTests / totalTests) * 100, - totalDuration, - }, - results, - recommendations: this.generateRecommendations(results), - }; - } - - generateRecommendations(results) { - const recommendations = []; - - const failedTests = results.filter((r) => !r.success); - if (failedTests.length > 0) { - recommendations.push({ - type: "FAILURE_ANALYSIS", - message: `${failedTests.length} tests failed. Review error messages and fix underlying issues.`, - failedTests: failedTests.map((t) => ({ name: t.name, error: t.error })), - }); - } - - const slowTests = results.filter((r) => r.duration > 60000); // > 1 minute - if (slowTests.length > 0) { - recommendations.push({ - type: "PERFORMANCE", - message: `${slowTests.length} tests took longer than 1 minute. Consider optimizing these operations.`, - slowTests: slowTests.map((t) => ({ - name: t.name, - duration: t.duration, - })), - }); - } - - return recommendations; - } -} -``` - -### Load Testing - -```javascript -class CrossChainLoadTester { - constructor(tacSdk) { - this.tacSdk = tacSdk; - this.testResults = []; - } - - async runLoadTest(testConfig) { - const { concurrentUsers, transactionsPerUser, rampUpTime, testDuration } = - testConfig; - - console.log( - `Starting load test: ${concurrentUsers} users, ${transactionsPerUser} tx/user` - ); - - const startTime = Date.now(); - const promises = []; - - // Create concurrent users - for (let i = 0; i < concurrentUsers; i++) { - const userPromise = this.simulateUser(i, transactionsPerUser, rampUpTime); - promises.push(userPromise); - } - - // Wait for all users to complete - const userResults = await Promise.allSettled(promises); - const endTime = Date.now(); - - return this.analyzeLoadTestResults(userResults, startTime, endTime); - } - - async simulateUser(userId, transactionCount, rampUpTime) { - // Stagger user start times - const delay = (userId * rampUpTime) / 1000; - await new Promise((resolve) => setTimeout(resolve, delay)); - - const userResults = []; - const sender = await this.createTestSender(userId); - - for (let txIndex = 0; txIndex < transactionCount; txIndex++) { - try { - const startTime = Date.now(); - - const transaction = this.generateTestTransaction(userId, txIndex); - const result = await this.tacSdk.sendCrossChainTransaction( - transaction.evmProxyMsg, - sender, - transaction.assets - ); - - const endTime = Date.now(); - - userResults.push({ - userId, - transactionIndex: txIndex, - success: true, - duration: endTime - startTime, - operationId: result.operationId, - }); - } catch (error) { - userResults.push({ - userId, - transactionIndex: txIndex, - success: false, - error: error.message, - duration: Date.now() - startTime, - }); - } - - // Brief pause between transactions - await new Promise((resolve) => setTimeout(resolve, 1000)); - } - - return userResults; - } - - async createTestSender(userId) { - // In practice, would create unique test wallets - return await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: process.env[`TEST_MNEMONIC_${userId % 3}`], // Cycle through available mnemonics - }); - } - - generateTestTransaction(userId, txIndex) { - return { - evmProxyMsg: { - evmTargetAddress: "0xTestContract...", - methodName: "testMethod(bytes,bytes)", - encodedParameters: ethers.utils.defaultAbiCoder.encode( - ["uint256"], - [BigInt(userId * 1000 + txIndex)] - ), - }, - assets: [{ amount: 0.01 }], // Small amount for load testing - }; - } - - analyzeLoadTestResults(userResults, startTime, endTime) { - const allTransactions = userResults - .filter((result) => result.status === "fulfilled") - .flatMap((result) => result.value); - - const successfulTx = allTransactions.filter((tx) => tx.success); - const failedTx = allTransactions.filter((tx) => !tx.success); - - const durations = successfulTx.map((tx) => tx.duration); - const totalDuration = endTime - startTime; - - return { - loadTestSummary: { - totalUsers: userResults.length, - totalTransactions: allTransactions.length, - successfulTransactions: successfulTx.length, - failedTransactions: failedTx.length, - successRate: (successfulTx.length / allTransactions.length) * 100, - totalTestDuration: totalDuration, - throughput: (successfulTx.length / totalDuration) * 1000, // tx/second - }, - performanceMetrics: { - averageResponseTime: - durations.reduce((a, b) => a + b, 0) / durations.length, - minResponseTime: Math.min(...durations), - maxResponseTime: Math.max(...durations), - p95ResponseTime: this.calculatePercentile(durations, 0.95), - p99ResponseTime: this.calculatePercentile(durations, 0.99), - }, - errorAnalysis: this.analyzeErrors(failedTx), - recommendations: this.generateLoadTestRecommendations( - successfulTx, - failedTx, - totalDuration - ), - }; - } - - calculatePercentile(arr, percentile) { - const sorted = [...arr].sort((a, b) => a - b); - const index = Math.ceil(sorted.length * percentile) - 1; - return sorted[index]; - } - - analyzeErrors(failedTransactions) { - const errorCounts = {}; - - failedTransactions.forEach((tx) => { - const errorType = this.categorizeError(tx.error); - errorCounts[errorType] = (errorCounts[errorType] || 0) + 1; - }); - - return { - totalErrors: failedTransactions.length, - errorTypes: errorCounts, - mostCommonError: - Object.entries(errorCounts).sort(([, a], [, b]) => b - a)[0]?.[0] || - "None", - }; - } - - categorizeError(errorMessage) { - if (errorMessage.includes("insufficient balance")) - return "INSUFFICIENT_BALANCE"; - if (errorMessage.includes("network")) return "NETWORK_ERROR"; - if (errorMessage.includes("timeout")) return "TIMEOUT"; - if (errorMessage.includes("gas")) return "GAS_ERROR"; - return "OTHER"; - } - - generateLoadTestRecommendations(successful, failed, duration) { - const recommendations = []; - - if (failed.length > successful.length * 0.05) { - // > 5% failure rate - recommendations.push({ - type: "HIGH_FAILURE_RATE", - message: - "Failure rate exceeds 5%. Investigate network stability and error handling.", - priority: "HIGH", - }); - } - - const avgDuration = - successful.reduce((sum, tx) => sum + tx.duration, 0) / successful.length; - if (avgDuration > 30000) { - // > 30 seconds average - recommendations.push({ - type: "SLOW_RESPONSE_TIME", - message: - "Average response time exceeds 30 seconds. Consider optimization.", - priority: "MEDIUM", - }); - } - - return recommendations; - } -} -``` - -## Test Data Management - -### Test Asset Factory - -```javascript -class TestAssetFactory { - constructor(tacSdk) { - this.tacSdk = tacSdk; - this.createdAssets = []; - } - - async createTestJetton(config) { - const jettonConfig = { - name: config.name || "Test Jetton", - symbol: config.symbol || "TEST", - totalSupply: config.totalSupply || 1000000, - description: config.description || "Test jetton for SDK testing", - }; - - // In practice, would deploy actual jetton contract - const mockJettonAddress = `EQTestJetton${Date.now()}...`; - - const asset = { - address: mockJettonAddress, - ...jettonConfig, - createdAt: Date.now(), - }; - - this.createdAssets.push(asset); - return asset; - } - - async createTestNFTCollection(config) { - const nftConfig = { - name: config.name || "Test NFT Collection", - description: config.description || "Test NFT collection for SDK testing", - image: config.image || "https://example.com/test-nft.png", - itemCount: config.itemCount || 10, - }; - - // Mock NFT collection address - const mockCollectionAddress = `EQTestNFT${Date.now()}...`; - - const collection = { - address: mockCollectionAddress, - ...nftConfig, - createdAt: Date.now(), - }; - - this.createdAssets.push(collection); - return collection; - } - - async distributeTestAssets(recipients, assetAddress, amount) { - const distributions = []; - - for (const recipient of recipients) { - // In practice, would send actual tokens - distributions.push({ - recipient, - assetAddress, - amount, - timestamp: Date.now(), - status: "MOCK_DISTRIBUTED", - }); - } - - return distributions; - } - - async cleanup() { - // Clean up any created test assets - console.log(`Cleaning up ${this.createdAssets.length} test assets`); - this.createdAssets = []; - } - - getCreatedAssets() { - return [...this.createdAssets]; - } -} -``` - -### Mock Services for Testing - -```javascript -class MockTACServices { - constructor() { - this.mockResponses = new Map(); - this.callCounts = new Map(); - } - - setMockResponse(method, response) { - this.mockResponses.set(method, response); - } - - getMockResponse(method) { - const count = this.callCounts.get(method) || 0; - this.callCounts.set(method, count + 1); - - return this.mockResponses.get(method); - } - - getCallCount(method) { - return this.callCounts.get(method) || 0; - } - - reset() { - this.mockResponses.clear(); - this.callCounts.clear(); - } - - // Mock specific methods - mockSuccessfulTransaction() { - this.setMockResponse("sendCrossChainTransaction", { - operationId: "mock_op_" + Date.now(), - caller: "EQMockSender...", - shardCount: 1, - shardsKey: "mock_shard_key", - timestamp: Date.now(), - }); - } - - mockFailedTransaction(error = "Mock transaction failure") { - this.setMockResponse("sendCrossChainTransaction", { - error, - success: false, - }); - } - - mockSimulationSuccess(gasEstimate = 250000n) { - this.setMockResponse("getSimulationInfo", { - success: true, - estimatedGas: gasEstimate, - protocolFee: 10000000n, - evmExecutorFee: 50000000n, - tvmExecutorFee: 100000000n, - }); - } - - mockSimulationFailure(error = "Mock simulation failure") { - this.setMockResponse("getSimulationInfo", { - success: false, - error, - }); - } -} -``` - -## Test Reporting and Analytics - -### Test Report Generator - -```javascript -class TestReportGenerator { - constructor() { - this.testResults = []; - } - - addTestResult(result) { - this.testResults.push({ - ...result, - timestamp: Date.now(), - }); - } - - generateReport() { - const report = { - summary: this.generateSummary(), - performance: this.analyzePerformance(), - coverage: this.analyzeCoverage(), - recommendations: this.generateRecommendations(), - generatedAt: new Date().toISOString(), - }; - - return report; - } - - generateSummary() { - const total = this.testResults.length; - const passed = this.testResults.filter((r) => r.success).length; - const failed = total - passed; - - return { - totalTests: total, - passed, - failed, - successRate: total > 0 ? (passed / total) * 100 : 0, - averageDuration: this.calculateAverageDuration(), - }; - } - - analyzePerformance() { - const durations = this.testResults.map((r) => r.duration).filter((d) => d); - - return { - averageExecutionTime: - durations.reduce((a, b) => a + b, 0) / durations.length, - medianExecutionTime: this.calculateMedian(durations), - p95ExecutionTime: this.calculatePercentile(durations, 0.95), - slowestTest: Math.max(...durations), - fastestTest: Math.min(...durations), - }; - } - - analyzeCoverage() { - const testedMethods = new Set(); - const testedAssetTypes = new Set(); - - this.testResults.forEach((result) => { - if (result.methodName) testedMethods.add(result.methodName); - if (result.assetTypes) - result.assetTypes.forEach((type) => testedAssetTypes.add(type)); - }); - - return { - testedMethods: Array.from(testedMethods), - testedAssetTypes: Array.from(testedAssetTypes), - methodCoverage: testedMethods.size, - assetTypeCoverage: testedAssetTypes.size, - }; - } - - generateRecommendations() { - const recommendations = []; - const summary = this.generateSummary(); - - if (summary.successRate < 95) { - recommendations.push({ - type: "RELIABILITY", - message: - "Test success rate is below 95%. Investigate and fix failing tests.", - priority: "HIGH", - }); - } - - const performance = this.analyzePerformance(); - if (performance.averageExecutionTime > 60000) { - recommendations.push({ - type: "PERFORMANCE", - message: - "Average test execution time exceeds 1 minute. Consider optimization.", - priority: "MEDIUM", - }); - } - - return recommendations; - } - - calculateAverageDuration() { - const durations = this.testResults.map((r) => r.duration).filter((d) => d); - return durations.length > 0 - ? durations.reduce((a, b) => a + b, 0) / durations.length - : 0; - } - - calculateMedian(arr) { - const sorted = [...arr].sort((a, b) => a - b); - const mid = Math.floor(sorted.length / 2); - return sorted.length % 2 !== 0 - ? sorted[mid] - : (sorted[mid - 1] + sorted[mid]) / 2; - } - - calculatePercentile(arr, percentile) { - const sorted = [...arr].sort((a, b) => a - b); - const index = Math.ceil(sorted.length * percentile) - 1; - return sorted[index]; - } - - exportReport(format = "json") { - const report = this.generateReport(); - - switch (format) { - case "json": - return JSON.stringify(report, null, 2); - case "csv": - return this.convertToCSV(report); - default: - throw new Error(`Unsupported export format: ${format}`); - } - } - - convertToCSV(report) { - const headers = ["Test Name", "Success", "Duration", "Error"]; - const rows = this.testResults.map((result) => [ - result.name || "Unknown", - result.success || false, - result.duration || 0, - result.error || "", - ]); - - return [headers, ...rows].map((row) => row.join(",")).join("\n"); - } -} -``` - -## What's Next? - -Complete your SDK mastery with the final advanced topics: - - - - Master cross-chain token address resolution and management - - - - - Comprehensive testing is crucial for cross-chain applications. Always test on - testnet first, implement proper error handling, and use simulation to validate - operations before execution. - diff --git a/build/sdk/installation.mdx b/build/sdk/installation.mdx deleted file mode 100644 index bf13b84..0000000 --- a/build/sdk/installation.mdx +++ /dev/null @@ -1,481 +0,0 @@ ---- -title: Installation & Setup -description: "Install and configure the TAC SDK in your JavaScript/TypeScript application" ---- - -Get started with the TAC SDK by installing the package and configuring your development environment. The SDK works in both browser and Node.js environments with full TypeScript support. - -## Installation - -Install the TAC SDK using your preferred package manager: - - - -```bash npm - npm install @tonappchain/sdk -``` - -```bash yarn -yarn add @tonappchain/sdk -``` - -```bash pnpm -pnpm add @tonappchain/sdk -``` - - - -## Basic Import and Setup - -Import the core SDK components you'll need for your application: - -```javascript -import { - TacSdk, - SenderFactory, - OperationTracker, - Network, - AssetType, -} from "@tonappchain/sdk"; -``` - -## Environment Configuration - -### Network Selection - -The SDK supports both testnet and mainnet environments. Always start development on testnet: - -```javascript -// For development and testing -const tacSdk = await TacSdk.create({ - network: Network.TESTNET, -}); - -// For production -const tacSdk = await TacSdk.create({ - network: Network.MAINNET, -}); -``` - - - Always test your integration thoroughly on testnet before deploying to - mainnet. Cross-chain operations are irreversible once confirmed. - - -### Environment Variables - -For security, store sensitive configuration in environment variables: - -```bash -# .env file -TVM_MNEMONICS=your_wallet_mnemonic_here -TAC_NETWORK=testnet -TON_CONNECT_MANIFEST_URL=https://yourapp.com/tonconnect-manifest.json -``` - -Access these in your application: - -```javascript -const network = - process.env.TAC_NETWORK === "mainnet" ? Network.MAINNET : Network.TESTNET; - -const tacSdk = await TacSdk.create({ network }); -``` - -## Framework Integration - -### React Integration - -For React applications, wrap the SDK in a context provider: - -```jsx -// contexts/TacSdkContext.js -import React, { createContext, useContext, useEffect, useState } from "react"; -import { TacSdk, Network } from "@tonappchain/sdk"; - -const TacSdkContext = createContext(null); - -export const TacSdkProvider = ({ children }) => { - const [tacSdk, setTacSdk] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const initializeSdk = async () => { - try { - const sdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 1, - }); - setTacSdk(sdk); - } catch (error) { - console.error("Failed to initialize TAC SDK:", error); - } finally { - setLoading(false); - } - }; - - initializeSdk(); - - return () => { - if (tacSdk) { - tacSdk.closeConnections(); - } - }; - }, []); - - return ( - - {children} - - ); -}; - -export const useTacSdk = () => { - const context = useContext(TacSdkContext); - if (!context) { - throw new Error("useTacSdk must be used within a TacSdkProvider"); - } - return context; -}; -``` - -Use the context in your components: - -```jsx -// components/CrossChainTransaction.js -import { useTacSdk } from "../contexts/TacSdkContext"; - -export const CrossChainTransaction = () => { - const { tacSdk, loading } = useTacSdk(); - - if (loading) return
Initializing TAC SDK...
; - - const handleTransaction = async () => { - // Use tacSdk for cross-chain operations - const result = await tacSdk.sendCrossChainTransaction(/* ... */); - }; - - return ( - - ); -}; -``` - -### Next.js Integration - -For Next.js applications, handle client-side initialization: - -```jsx -// hooks/useTacSdk.js -import { useEffect, useState } from "react"; -import { TacSdk, Network } from "@tonappchain/sdk"; - -export const useTacSdk = () => { - const [tacSdk, setTacSdk] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - // Only initialize on client side - if (typeof window !== "undefined") { - const initializeSdk = async () => { - try { - const sdk = await TacSdk.create({ - network: Network.TESTNET, - }); - setTacSdk(sdk); - } catch (error) { - console.error("SDK initialization failed:", error); - } finally { - setLoading(false); - } - }; - - initializeSdk(); - } - }, []); - - return { tacSdk, loading }; -}; -``` - -### Vue.js Integration - -For Vue applications, create a composable: - -```javascript -// composables/useTacSdk.js -import { ref, onMounted, onUnmounted } from "vue"; -import { TacSdk, Network } from "@tonappchain/sdk"; - -export function useTacSdk() { - const tacSdk = ref(null); - const loading = ref(true); - - onMounted(async () => { - try { - tacSdk.value = await TacSdk.create({ - network: Network.TESTNET, - }); - } catch (error) { - console.error("TAC SDK initialization failed:", error); - } finally { - loading.value = false; - } - }); - - onUnmounted(() => { - if (tacSdk.value) { - tacSdk.value.closeConnections(); - } - }); - - return { tacSdk, loading }; -} -``` - -## TON Connect Integration - -For browser applications, integrate with TON Connect for wallet connectivity: - -### Install TON Connect - -```bash -npm install @tonconnect/ui -``` - -### Configure TON Connect - -```javascript -import { TonConnectUI } from "@tonconnect/ui"; - -// Initialize TON Connect -const tonConnectUI = new TonConnectUI({ - manifestUrl: "https://yourapp.com/tonconnect-manifest.json", - buttonRootId: "ton-connect-button", -}); - -// Create sender from TON Connect -import { SenderFactory } from "@tonappchain/sdk"; - -const sender = await SenderFactory.getSender({ - tonConnect: tonConnectUI, -}); -``` - -### TON Connect Manifest - -Create a manifest file for your application: - -```json -{ - "url": "https://yourapp.com", - "name": "Your dApp Name", - "iconUrl": "https://yourapp.com/icon.png", - "termsOfUseUrl": "https://yourapp.com/terms", - "privacyPolicyUrl": "https://yourapp.com/privacy" -} -``` - -## TypeScript Configuration - -If using TypeScript, ensure your `tsconfig.json` includes proper module resolution: - -```json -{ - "compilerOptions": { - "target": "ES2020", - "module": "ESNext", - "moduleResolution": "node", - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true - } -} -``` - -## SDK Configuration Options - -The SDK accepts several configuration options during initialization: - -```javascript -const tacSdk = await TacSdk.create({ - network: Network.TESTNET, // Network selection - delay: 1000, // Delay between operations (milliseconds) - TONParams: { - // TON-specific configuration - contractOpener: tonClient, // Custom TonClient instance - }, - TACParams: { - // TAC-specific configuration - provider: customProvider, // Custom provider - }, -}); -``` - - - -**Network Options:** - -- `Network.TESTNET` - For development and testing -- `Network.MAINNET` - For production applications - -**Timing Options:** - -- `delay` - Delay between operations in milliseconds (default: 1000) - -**TON Parameters:** - -- `contractOpener` - Custom TonClient instance for TON operations - -**TAC Parameters:** - -- `provider` - Custom provider for TAC operations - - - -## Verification - -Test your installation with a simple initialization: - -```javascript -import { TacSdk, Network } from "@tonappchain/sdk"; - -async function testInstallation() { - try { - const tacSdk = await TacSdk.create({ - network: Network.TESTNET, - }); - - console.log("✅ TAC SDK initialized successfully"); - console.log("Network:", tacSdk.network); - - // Clean up - tacSdk.closeConnections(); - } catch (error) { - console.error("❌ Installation test failed:", error); - } -} - -testInstallation(); -``` - -## Common Issues and Solutions - - - -If you encounter module resolution errors, ensure you're using a modern bundler that supports ES modules: - -**Webpack 5:** - -```javascript -// webpack.config.js -module.exports = { - resolve: { - fallback: { - crypto: require.resolve("crypto-browserify"), - stream: require.resolve("stream-browserify"), - buffer: require.resolve("buffer"), - }, - }, -}; -``` - -**Vite:** - -```javascript -// vite.config.js -export default { - define: { - global: "globalThis", - }, - resolve: { - alias: { - crypto: "crypto-browserify", - stream: "stream-browserify", - buffer: "buffer", - }, - }, -}; -``` - - - - - -If you experience network connection issues: - -1. **Check your network configuration:** - - ```javascript - const tacSdk = await TacSdk.create({ - network: Network.TESTNET, - TONParams: { - contractOpener: TonClient({ - endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", - }), - }, - }); - ``` - -2. **Verify firewall settings** - Ensure your environment can access TON and TAC endpoints - -3. **Use environment-specific configuration** - Different environments may require different endpoints - - - - - -For TypeScript type errors: - -1. **Install type definitions:** - - ```bash - npm install --save-dev @types/node - ``` - -2. **Update your tsconfig.json:** - - ```json - { - "compilerOptions": { - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true - } - } - ``` - -3. **Use explicit imports:** - ```typescript - import type { TacSdk, Network } from "@tonappchain/sdk"; - ``` - - - -## Next Steps - -With the SDK installed and configured, you're ready to start building hybrid dApps: - - - - Learn how to properly initialize and configure the SDK - - - Connect TON wallets and manage user authentication - - - - - Start with the [Quick Start guide](/build/quickstart) to send your first - cross-chain transaction and see the SDK in action. - diff --git a/build/sdk/introduction.mdx b/build/sdk/introduction.mdx deleted file mode 100644 index 985d498..0000000 --- a/build/sdk/introduction.mdx +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: Overview -description: "The comprehensive JavaScript/TypeScript library for building hybrid dApps that seamlessly connect TON and EVM ecosystems" ---- - -The TAC SDK is a powerful JavaScript/TypeScript library that enables frontend developers to build **hybrid dApps** with unprecedented ease. By abstracting the complexities of cross-chain messaging, the SDK allows you to focus on creating exceptional user experiences while handling wallet connections, transaction routing, and asset bridging automatically. - - - The TAC SDK bridges the gap between TON's massive user base and EVM's rich - DeFi ecosystem, enabling developers to create applications that leverage the - best of both worlds. - - -## Core Capabilities - -The TAC SDK provides four essential capabilities that transform how developers approach cross-chain development: - -### Seamless Wallet Integration - -Connect users with their existing TON wallets through the standard TON Connect protocol. No additional software installation or new seed phrases required. - -```javascript -import { TacSdk, SenderFactory, Network, AssetType } from "@tonappchain/sdk"; - -// Initialize SDK and connect wallet -const tacSdk = await TacSdk.create({ network: Network.TESTNET }); -const sender = await SenderFactory.getSender({ tonConnect: tonConnectUI }); -``` - -### Direct EVM Contract Interaction - -Execute complex EVM contract calls directly from TON wallets. The SDK handles all cross-chain message formatting and routing automatically. - -```javascript -// Call an EVM DEX directly from TON -const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - methodName: "swapExactTokensForTokens(bytes,bytes)", - encodedParameters: encodedSwapData, -}; - -const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets -); -``` - -### Automatic Asset Bridging - -Bridge TON, Jettons, and NFTs to EVM seamlessly. The SDK manages locking, minting, and unlocking across chains without manual intervention. - -```javascript -// Bridge multiple assets in a single transaction -const assets: AssetLike[] = [ - { - address: TVMtokenAAddress, - amount: tokenAAmount, - }, - { - address: TVMtokenBAddress, - amount: tokenBAmount, - }, -]; -``` - -### Real-Time Operation Tracking - -Monitor cross-chain transactions with comprehensive status tracking. Get detailed progress updates and handle completion or failure scenarios gracefully. - -```javascript -// Track transaction progress -const tracker = new OperationTracker(Network.TESTNET); -const operationId = await tracker.getOperationId(transactionLinker); -const status = await tracker.getOperationStatus(operationId); -``` - -You can import OperationTracker from `@tonappchain/sdk` - -## How It Works - -The TAC SDK acts as a bridge between your frontend application and TAC's cross-chain infrastructure: - - - - Your application specifies the desired EVM operation using familiar - JavaScript objects. The SDK validates parameters and encodes them for - cross-chain delivery. - - - - The SDK automatically handles asset locking on TON and prepares them for - minting on the EVM side, managing all complex token mechanics. - - - - Messages are routed through TAC's sequencer network, which validates - operations and ensures secure cross-chain delivery. - - - - Your target EVM contracts receive properly formatted calls with bridged - assets, executing exactly as if called from an EVM wallet. - - - - The SDK provides real-time updates throughout the process, allowing your - application to show users exactly what's happening. - - - -## Developer Experience - -The SDK is designed to feel familiar to web developers while providing powerful cross-chain capabilities: - - - - Standard async/await patterns, Promise-based error handling, and conventional configuration objects make the SDK feel like any other JavaScript library. - - ```javascript - try { - const transactionLinker = await tacSdk.sendCrossChainTransaction(message, sender, assets); - const tracker = new OperationTracker(Network.TESTNET); - await tacSdk.startTracking(transactionLinker, Network.TESTNET); - const operationId = await tracker.getOperationId(transactionLinker); - } catch (error) { - handleTransactionError(error); - } - ``` - - - - Comprehensive TypeScript definitions provide excellent IDE support with autocompletion, type checking, and inline documentation. - - ```typescript - interface EvmProxyMsg { - evmTargetAddress: string; - methodName?: string; - encodedParameters?: string; - gasLimit?: bigint; - } - - const evmProxyMsg: EvmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - methodName: "transfer(bytes,bytes)", - encodedParameters: encodedTransferData - }; - ``` - - - - Built-in testing utilities help validate integrations before deployment, including transaction simulation and automated status tracking. - - ```javascript - // Simulate before executing - const simulation = await tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - if (simulation.success) { - // Proceed with actual transaction - const result = await tacSdk.sendCrossChainTransaction(evmProxyMsg, sender, assets); - } - ``` - - - -## Key Components - - -The primary class that handles all cross-chain operations. Initialize once and use throughout your application for sending transactions, querying balances, and managing SDK lifecycle. - -Key methods include `sendCrossChainTransaction()`, `getEVMTokenAddress()`, `getUserJettonBalance()`, and `getSimulationInfo()`. - - - - -Comprehensive tools for tracking cross-chain transaction status and progress. Monitor operations in real-time and provide users with accurate updates about their transactions. - -Supports both simplified status checking and detailed stage-by-stage tracking for advanced use cases. - - - - -Handles transaction signing and submission through different wallet types. Supports TON Connect for web applications and raw private keys for backend services. - -Provides a unified interface regardless of the underlying wallet technology. - - - - -Automatic token management across TON and EVM chains. Handles native TON, Jettons, NFTs, and their EVM equivalents seamlessly. - -Manages locking, minting, burning, and unlocking operations with built-in safety mechanisms. - - - - -Internal components that handle cross-chain transaction execution: - -- **TONTransactionManager**: Handles TON → TAC cross-chain transactions -- **TACTransactionManager**: Handles TAC → TON bridging operations - -These are automatically managed by the SDK and provide the underlying functionality for `sendCrossChainTransaction` and `bridgeTokensToTON` methods. - - - -## What's Next? - -Ready to start building hybrid dApps? The next sections will guide you through installation, configuration, and your first cross-chain transaction. - - - - Install and configure the TAC SDK in your application - - - Send your first cross-chain transaction in minutes - - - - - **New to cross-chain development?** Check out our [Core - Concepts](/core-concepts/overview/what-is-tac) section to understand the - fundamentals of hybrid dApps and how TAC enables seamless cross-chain - interactions. - diff --git a/build/sdk/usage/asset-bridging.mdx b/build/sdk/usage/asset-bridging.mdx deleted file mode 100644 index a68e1f1..0000000 --- a/build/sdk/usage/asset-bridging.mdx +++ /dev/null @@ -1,566 +0,0 @@ ---- -title: Asset Bridging -description: "Deep dive into asset bridging mechanics, strategies, and advanced patterns for cross-chain asset management" ---- - -Asset bridging is the foundation of TAC's hybrid dApp functionality, enabling seamless movement of value between TON and TAC EVM ecosystems. The TAC SDK handles the complex mechanics of locking, minting, burning, and unlocking assets while providing developers with simple, intuitive interfaces. - - - Asset bridging involves irreversible operations. Always validate asset - addresses and amounts carefully, test on testnet first, and implement proper - error handling for production applications. - - -## Understanding Asset Bridging - -Asset bridging in TAC involves sophisticated mechanisms that ensure asset security and maintain proper accounting across both networks: - - - - Original assets are locked in secure contracts on the source chain, ensuring - they cannot be double-spent while bridged versions exist. - - - - Cryptographically verified messages are sent between chains containing asset - transfer information and execution instructions. - - - - Equivalent assets are minted on the destination chain, maintaining 1:1 backing - with the locked originals. - - - - Bridged assets can be used in target chain applications just like native - assets, with full DeFi compatibility. - - - - When assets return, bridged versions are burned and original assets are - unlocked, completing the cycle. - - - -## Asset Types and Support - -The TAC SDK supports comprehensive asset bridging across multiple token standards: - -### Native Tokens - - - - ```javascript - import { AssetType } from "@tonappchain/sdk"; - - // Bridge native TON to TAC - const assets = [ - { - amount: 5.0 - } // Bridge 5 TON - ]; - - const transactionLinker = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets - ); - ``` - - **Characteristics:** - - No address needed (automatically recognized) - - Becomes wrapped TON (wTON) on TAC EVM - - Direct 1:1 conversion rate - - Gas-efficient bridging - - - - ```javascript - // Get TAC token address for bridging back to TON - const tacTokenAddress = await tacSdk.nativeTACAddress(); - - // Bridge TAC back to TON (from TAC to TON direction) - await tacSdk.bridgeTokensToTON( - evmSigner, // Ethereum wallet - ethers.parseEther('2.0'), // 2 TAC - tonRecipientAddress, // TON destination - [] // No additional assets - ); - ``` - - **Characteristics:** - - Requires EVM signer for TAC to TON direction - - Becomes jetton on TON side - - Maintains full value backing - - Supports both directions seamlessly - - - -### Jetton Tokens (TON Fungible Tokens) - -```javascript -// Bridge jetton tokens to TAC -const jettonAssets = [ - { - address: "EQJettonMasterContractAddress...", // Jetton master contract - amount: 1000.0, // Human-readable amount - }, -]; - -// Advanced jetton bridging with raw amounts -const rawJettonAssets = [ - { - // Fungible Token - address: "EQJettonMasterContractAddress...", - rawAmount: 1000000000000n, // Raw amount (1000 tokens with 9 decimals) - }, -]; -``` - -### NFT Collections and Items - -```javascript -// Bridge NFT by collection and item index -const nftCollectionAssets = [ - { - collectionAddress: "0x00728334ad7b0e40968EA09F11cF154302476864...", - itemIndex: 123n, // Specific NFT item index - }, -]; - -// Bridge specific NFT item by direct address -const specificNftAssets = [ - { - address: "EQSpecificNFTItemAddress...", // Direct NFT item address - }, -]; -``` - -## Advanced Asset Configuration - -### Precision and Decimal Handling - -The SDK provides flexible approaches to handle token decimals and precision: - -```javascript -// Automatic decimal detection (recommended) -const autoAssets = [ - { - address: "EQJettonMasterAddress...", - amount: 100.5, // SDK automatically handles decimals - }, -]; - -// Manual decimal specification for precision control -const preciseAssets = [ - { - address: "EQJettonMasterAddress...", - amount: 100.123456789, // High precision amount - }, -]; - -// Raw amount for maximum control -const rawAssets = [ - { - address: "EQJettonMasterAddress...", - rawAmount: 100123456789n, // Exact raw amount - }, -]; -``` - -### Multi-Asset Transactions - -Bridge multiple asset types in a single transaction: - -```javascript -const multiAssetBridging = async () => { - const complexAssets = [ - // Native TON for gas and value - { amount: 2.0 }, - - // Jetton token for DeFi operations - { - address: "EQStablecoinMasterAddress...", - amount: 1000.0, - }, - - // Another jetton for multi-token operations - { - address: "EQLiquidityTokenAddress...", - amount: 50.0, - }, - - // NFT for gaming or collectibles - { - address: "EQGameNFTItemAddress...", // Direct NFT item address - }, - ]; - - const evmProxyMsg = { - evmTargetAddress: complexDeFiContractAddress, - methodName: "multiAssetOperation(bytes,bytes)", - encodedParameters: encodedComplexParams, - gasLimit: 800000n, - }; - - return await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - complexAssets - ); -}; -``` - -## Token Address Mapping - -Understanding and working with cross-chain token addresses: - -### TON to TAC Address Resolution - -```javascript -// Get EVM equivalent of TON token -const getEvmTokenAddress = async (tonTokenAddress) => { - try { - const evmAddress = await tacSdk.getEVMTokenAddress(tonTokenAddress); - console.log(`TON token ${tonTokenAddress} maps to EVM token ${evmAddress}`); - return evmAddress; - } catch (error) { - console.error("Token mapping failed:", error); - return null; - } -}; - -// Reverse mapping: EVM to TON -const getTonTokenAddress = async (evmTokenAddress) => { - try { - const tonAddress = await tacSdk.getTVMTokenAddress(evmTokenAddress); - console.log(`EVM token ${evmTokenAddress} maps to TON token ${tonAddress}`); - return tonAddress; - } catch (error) { - console.error("Reverse token mapping failed:", error); - return null; - } -}; -``` - -### NFT Address Resolution - -```javascript -// Get EVM NFT contract from TON NFT collection -const getEvmNftAddress = async (tonNftCollectionAddress) => { - const evmNftAddress = await tacSdk.getEVMNFTAddress( - tonNftCollectionAddress, - "COLLECTION" // Specify address type - ); - return evmNftAddress; -}; - -// Get specific NFT item mapping -const getEvmNftItemAddress = async (tonNftItemAddress) => { - const evmNftAddress = await tacSdk.getEVMNFTAddress( - tonNftItemAddress, - "ITEM" // Specify this is an item address - ); - return evmNftAddress; -}; - -// Reverse: Get TON NFT address from EVM -const getTonNftAddress = async (evmNftAddress, tokenId = null) => { - const tonNftAddress = await tacSdk.getTVMNFTAddress( - evmNftAddress, - tokenId // Optional: specific token ID - ); - return tonNftAddress; -}; -``` - -## Asset Balance Management - -### Query User Balances - -```javascript -const getUserAssetBalances = async (userAddress) => { - // Get jetton balance (basic) - const jettonBalance = await tacSdk.getUserJettonBalance( - userAddress, - jettonMasterAddress - ); - console.log("Raw jetton balance:", jettonBalance.toString()); - - // Get jetton balance (extended with metadata) - const extendedBalance = await tacSdk.getUserJettonBalanceExtended( - userAddress, - jettonMasterAddress - ); - - console.log("Balance Details:"); - console.log("- Raw amount:", extendedBalance.rawAmount.toString()); - console.log("- Decimals:", extendedBalance.decimals); - console.log("- Human readable:", extendedBalance.amount); - console.log("- Symbol:", extendedBalance.symbol); - console.log("- Name:", extendedBalance.name); - - return extendedBalance; -}; -``` - -### Jetton Wallet Management - -```javascript -const getJettonWalletInfo = async (userAddress, jettonMasterAddress) => { - // Get user's jetton wallet address - const jettonWalletAddress = await tacSdk.getUserJettonWalletAddress( - userAddress, - jettonMasterAddress - ); - - console.log("Jetton wallet address:", jettonWalletAddress); - - // Check if wallet exists and is deployed - const isDeployed = await tacSdk.isContractDeployedOnTVM(jettonWalletAddress); - console.log("Wallet deployed:", isDeployed); - - return { - address: jettonWalletAddress, - deployed: isDeployed, - }; -}; -``` - -## Asset Validation and Safety - -### Pre-Transaction Validation - -```javascript -const validateAssetsBridging = async (assets, senderAddress) => { - const validationResults = []; - - for (const asset of assets) { - const result = { - asset, - valid: true, - issues: [], - }; - - try { - if (asset.address) { - // Validate jetton/NFT contract exists - const contractExists = await tacSdk.isContractDeployedOnTVM( - asset.address - ); - if (!contractExists) { - result.valid = false; - result.issues.push("Contract does not exist or is not deployed"); - } - - // For jettons, check user has sufficient balance - if (asset.type !== "NFT") { - const balance = await tacSdk.getUserJettonBalance( - senderAddress, - asset.address - ); - - const requiredAmount = - typeof asset.amount === "number" - ? BigInt(Math.floor(asset.amount * 10 ** 9)) // Assume 9 decimals - : asset.amount; - - if (balance < requiredAmount) { - result.valid = false; - result.issues.push( - `Insufficient balance: has ${balance}, needs ${requiredAmount}` - ); - } - } - } else { - // Native TON - would need to check wallet balance via other means - console.log("Native TON validation - implement wallet balance check"); - } - } catch (error) { - result.valid = false; - result.issues.push(`Validation error: ${error.message}`); - } - - validationResults.push(result); - } - - return validationResults; -}; - -// Usage -const validationResults = await validateAssetsBridging(assets, senderAddress); -const allValid = validationResults.every((r) => r.valid); - -if (!allValid) { - console.error("Asset validation failed:"); - validationResults.forEach((r) => { - if (!r.valid) { - console.error( - `- ${r.asset.address || "Native TON"}: ${r.issues.join(", ")}` - ); - } - }); -} else { - console.log("All assets validated successfully"); -} -``` - -### Safe Asset Handling - -```javascript -class SafeAssetBridger { - constructor(tacSdk) { - this.tacSdk = tacSdk; - this.maxRetries = 3; - this.confirmationThreshold = 2; // Require 2 confirmations - } - - async safelyBridgeAssets(evmProxyMsg, sender, assets) { - // Step 1: Validate all assets - const validation = await this.validateAssets( - assets, - sender.getSenderAddress() - ); - if (!validation.valid) { - throw new Error( - `Asset validation failed: ${validation.errors.join(", ")}` - ); - } - - // Step 2: Simulate transaction - const simulation = await this.tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - if (!simulation.success) { - throw new Error(`Transaction simulation failed: ${simulation.error}`); - } - - // Step 3: Execute with retry logic - let lastError; - for (let attempt = 1; attempt <= this.maxRetries; attempt++) { - try { - const result = await this.tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets - ); - - // Step 4: Monitor for confirmations - const confirmed = await this.waitForConfirmations( - result, - this.confirmationThreshold - ); - - if (confirmed) { - return result; - } else { - throw new Error( - "Transaction did not receive sufficient confirmations" - ); - } - } catch (error) { - lastError = error; - console.warn(`Attempt ${attempt} failed:`, error.message); - - if (attempt < this.maxRetries) { - await new Promise((resolve) => setTimeout(resolve, 5000 * attempt)); - } - } - } - - throw new Error( - `Failed after ${this.maxRetries} attempts: ${lastError.message}` - ); - } - - async validateAssets(assets, senderAddress) { - // Implementation from previous validation example - const results = await validateAssetsBridging(assets, senderAddress); - - return { - valid: results.every((r) => r.valid), - errors: results.flatMap((r) => r.issues), - }; - } - - async waitForConfirmations(transactionLinker, requiredConfirmations) { - const tracker = new OperationTracker(this.tacSdk.network); - let confirmations = 0; - let attempts = 0; - const maxAttempts = 60; // 10 minutes with 10-second intervals - - while (confirmations < requiredConfirmations && attempts < maxAttempts) { - try { - const status = await tracker.getSimplifiedOperationStatus( - transactionLinker - ); - - if (status === "SUCCESSFUL") { - confirmations++; - console.log(`Confirmation ${confirmations}/${requiredConfirmations}`); - } else if (status === "FAILED") { - return false; - } - - if (confirmations >= requiredConfirmations) { - return true; - } - - await new Promise((resolve) => setTimeout(resolve, 10000)); - attempts++; - } catch (error) { - console.warn("Confirmation check failed:", error.message); - attempts++; - } - } - - return confirmations >= requiredConfirmations; - } -} -``` - -## Return Bridging (TAC to TON) - -For returning assets from TAC back to TON: - -```javascript -const bridgeAssetsBackToTon = async (evmSigner, tonRecipient) => { - // Bridge native TAC back to TON - const tacAmount = ethers.utils.parseEther("1.0"); // 1 TAC - - const txHash = await tacSdk.bridgeTokensToTON( - evmSigner, // Ethereum wallet signer - tacAmount, // Amount to bridge back - tonRecipient, // TON recipient address - [], // Additional assets (empty for simple case) - undefined // Use default executor fee - ); - - console.log("Bridge transaction hash:", txHash); - return txHash; -}; -``` - -## What's Next? - -Master advanced cross-chain operations and error handling: - - - - Explore advanced simulation testing patterns and optimizations - - - Master token address resolution across networks - - diff --git a/build/sdk/usage/sdk-initialization.mdx b/build/sdk/usage/sdk-initialization.mdx deleted file mode 100644 index 269d351..0000000 --- a/build/sdk/usage/sdk-initialization.mdx +++ /dev/null @@ -1,551 +0,0 @@ ---- -title: SDK Initialization -description: "Learn how to properly initialize and configure the TAC SDK for your application" ---- - -The TAC SDK provides flexible initialization options to support different development environments and use cases. This guide covers everything from basic setup to advanced configuration patterns. - -## Basic Initialization - -Initialize the SDK using the static factory method with your target network: - -```javascript -import { TacSdk, Network } from "@tonappchain/sdk"; - -// Initialize for testnet development -const tacSdk = await TacSdk.create({ - network: Network.TESTNET, -}); - -// Initialize for production -const tacSdk = await TacSdk.create({ - network: Network.MAINNET, -}); -``` - - - Always use `Network.TESTNET` during development and testing. Switch to - `Network.MAINNET` only when deploying to production. - - -## Configuration Parameters - -The `TacSdk.create()` method accepts a comprehensive configuration object: - -```javascript -const tacSdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 1000, // Delay between requests (milliseconds) - TONParams: { - // TON blockchain configuration - contractOpener: tonClient, // Custom TonClient instance - }, - TACParams: { - // TAC blockchain configuration - provider: customProvider, // Custom provider - }, -}); -``` - -### Network Configuration - - - - Testnet is the development environment with test tokens and contracts: - - ```javascript - const tacSdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 1000 // Recommended for development - }); - ``` - - **Testnet Features:** - - Free test tokens from faucets - - Identical functionality to mainnet - - Safe environment for experimentation - - Faster confirmation times - - - - Mainnet is the production environment with real assets: - - ```javascript - const tacSdk = await TacSdk.create({ - network: Network.MAINNET, - delay: 500 // Optimized for production - }); - ``` - - **Mainnet Considerations:** - - Real asset transfers - - Production-grade security - - Irreversible transactions - - - -## SDK Logging - -The SDK provides logging functionality for debugging and monitoring. By default, SDK components are silent unless you provide a logger. - -### Logger Types - -```javascript -import { TacSdk, ConsoleLogger, NoopLogger, Network } from "@tonappchain/sdk"; - -// With console logging (for development) -const sdk = await TacSdk.create( - { - network: Network.TESTNET, - }, - new ConsoleLogger() -); - -// Silent operation (default, for production) -const sdk = await TacSdk.create( - { - network: Network.TESTNET, - }, - new NoopLogger() -); - -// Default (silent) - no logger parameter -const sdk = await TacSdk.create({ - network: Network.TESTNET, -}); -``` - -### Logger Output - -**ConsoleLogger** outputs with prefixes: - -``` -[DEBUG] Aggregating tokens -[INFO] Transaction prepared successfully -[WARN] Gas estimation may be inaccurate -[ERROR] Simulation failed: insufficient balance -``` - -**NoopLogger** produces no output (silent operation). - - - Use ConsoleLogger for development and debugging. Use NoopLogger or omit the - logger parameter for production environments. - - -### Advanced Configuration - -#### TON Parameters - -Customize TON blockchain connection settings: - -```javascript -import { TonClient } from "@ton/ton"; - -const tonClient = new TonClient({ - endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", - apiKey: process.env.TON_API_KEY, // For higher rate limits -}); - -const tacSdk = await TacSdk.create({ - network: Network.TESTNET, - TONParams: { - contractOpener: tonClient, // Custom TonClient instance - }, -}); -``` - -#### Custom Sequencer Endpoints - -Provide fallback sequencer endpoints for enhanced reliability: - -```javascript -const tacSdk = await TacSdk.create({ - network: Network.TESTNET, -}); -``` - -## Environment-Specific Configuration - -### Development Environment - -For local development and testing: - -```javascript -// .env.development -TAC_NETWORK = testnet; -TAC_DELAY = 1000; -TON_API_KEY = your - development - api - key; - -// Application code -const tacSdk = await TacSdk.create({ - network: - process.env.TAC_NETWORK === "mainnet" ? Network.MAINNET : Network.TESTNET, - delay: parseInt(process.env.TAC_DELAY) || 1000, -}); -``` - -### Production Environment - -For production deployments: - -```javascript -// .env.production -TAC_NETWORK=mainnet -TAC_DELAY=500 -TON_API_KEY=your-production-api-key -CUSTOM_SEQUENCER_1=https://sequencer-1.tacchain.network -CUSTOM_SEQUENCER_2=https://sequencer-2.tacchain.network - -// Application code -const tacSdk = await TacSdk.create({ - network: Network.MAINNET, - delay: 500, -}); -``` - -## Framework Integration Patterns - -### React Application - -Create a context provider for SDK management: - -```jsx -import React, { createContext, useContext, useEffect, useState } from "react"; -import { TacSdk, Network } from "@tonappchain/sdk"; - -const TacSdkContext = createContext(null); - -export const TacSdkProvider = ({ children }) => { - const [tacSdk, setTacSdk] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - const initializeSdk = async () => { - try { - setLoading(true); - setError(null); - - const sdk = await TacSdk.create({ - network: - process.env.NODE_ENV === "production" - ? Network.MAINNET - : Network.TESTNET, - delay: process.env.NODE_ENV === "production" ? 500 : 1000, - }); - - setTacSdk(sdk); - } catch (err) { - console.error("Failed to initialize TAC SDK:", err); - setError(err); - } finally { - setLoading(false); - } - }; - - initializeSdk(); - - // Cleanup on unmount - return () => { - if (tacSdk) { - tacSdk.closeConnections(); - } - }; - }, []); - - return ( - - {children} - - ); -}; - -export const useTacSdk = () => { - const context = useContext(TacSdkContext); - if (!context) { - throw new Error("useTacSdk must be used within a TacSdkProvider"); - } - return context; -}; -``` - -### Next.js Application - -Handle client-side initialization with proper error boundaries: - -```jsx -// hooks/useTacSdk.js -import { useEffect, useState } from "react"; -import { TacSdk, Network } from "@tonappchain/sdk"; - -export const useTacSdk = () => { - const [tacSdk, setTacSdk] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - // Ensure client-side only - if (typeof window === "undefined") return; - - const initializeSdk = async () => { - try { - const sdk = await TacSdk.create({ - network: - process.env.NODE_ENV === "production" - ? Network.MAINNET - : Network.TESTNET, - delay: process.env.NODE_ENV === "production" ? 500 : 1000, - }); - - setTacSdk(sdk); - setError(null); - } catch (err) { - console.error("SDK initialization failed:", err); - setError(err); - } finally { - setLoading(false); - } - }; - - initializeSdk(); - - return () => { - if (tacSdk) { - tacSdk.closeConnections(); - } - }; - }, []); - - const reinitialize = async () => { - setLoading(true); - setError(null); - - try { - if (tacSdk) { - await tacSdk.closeConnections(); - } - - const sdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 1000, - }); - - setTacSdk(sdk); - } catch (err) { - setError(err); - } finally { - setLoading(false); - } - }; - - return { tacSdk, loading, error, reinitialize }; -}; -``` - -### Vue.js Application - -Create a composable for SDK management: - -```javascript -// composables/useTacSdk.js -import { ref, onMounted, onUnmounted } from "vue"; -import { TacSdk, Network } from "@tonappchain/sdk"; - -export function useTacSdk() { - const tacSdk = ref(null); - const loading = ref(true); - const error = ref(null); - - const initialize = async () => { - try { - loading.value = true; - error.value = null; - - tacSdk.value = await TacSdk.create({ - network: import.meta.env.PROD ? Network.MAINNET : Network.TESTNET, - delay: import.meta.env.PROD ? 500 : 1000, - }); - } catch (err) { - console.error("TAC SDK initialization failed:", err); - error.value = err; - } finally { - loading.value = false; - } - }; - - onMounted(initialize); - - onUnmounted(() => { - if (tacSdk.value) { - tacSdk.value.closeConnections(); - } - }); - - return { - tacSdk: readonly(tacSdk), - loading: readonly(loading), - error: readonly(error), - reinitialize: initialize, - }; -} -``` - -## SDK Properties and Methods - -After initialization, the SDK instance provides several properties and methods: - -### Core Properties - -```javascript -const tacSdk = await TacSdk.create({ network: Network.TESTNET }); - -console.log(tacSdk.network); // Network.TESTNET -console.log(tacSdk.delay); // Configured delay in ms -console.log(tacSdk.artifacts); // Network-specific contract artifacts -``` - -### Address Constants - -```javascript -// Native token addresses -console.log(tacSdk.nativeTONAddress); // "NONE" (represents native TON) -const tacAddress = await tacSdk.nativeTACAddress(); // TAC token address on EVM -``` - -### Trusted Executors - -```javascript -// Get trusted executor addresses -const tacExecutors = tacSdk.getTrustedTACExecutors; // TAC chain executors -const tonExecutors = tacSdk.getTrustedTONExecutors; // TON chain executors - -console.log("TAC Executors:", tacExecutors); -console.log("TON Executors:", tonExecutors); -``` - -## Error Handling During Initialization - -Handle initialization errors gracefully: - -```javascript -async function initializeSdkWithRetry(maxRetries = 3) { - let lastError; - - for (let attempt = 1; attempt <= maxRetries; attempt++) { - try { - const tacSdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 1000 * attempt, // Increase delay on retries - }); - - console.log(`SDK initialized successfully on attempt ${attempt}`); - return tacSdk; - } catch (error) { - console.warn(`Initialization attempt ${attempt} failed:`, error.message); - lastError = error; - - if (attempt < maxRetries) { - // Wait before retrying - await new Promise((resolve) => setTimeout(resolve, 2000 * attempt)); - } - } - } - - throw new Error( - `Failed to initialize SDK after ${maxRetries} attempts: ${lastError.message}` - ); -} - -// Usage -try { - const tacSdk = await initializeSdkWithRetry(); -} catch (error) { - console.error("SDK initialization failed permanently:", error); - // Handle permanent failure (show error UI, etc.) -} -``` - -## Lifecycle Management - -### Proper Cleanup - -Always clean up SDK resources when your application shuts down: - -```javascript -// Single page applications -window.addEventListener("beforeunload", () => { - if (tacSdk) { - tacSdk.closeConnections(); - } -}); - -// React applications -useEffect(() => { - return () => { - if (tacSdk) { - tacSdk.closeConnections(); - } - }; -}, [tacSdk]); - -// Node.js applications -process.on("SIGINT", () => { - if (tacSdk) { - tacSdk.closeConnections(); - } - process.exit(0); -}); -``` - -### Connection Management - -The SDK manages multiple network connections internally. Monitor connection health: - -```javascript -async function checkSdkHealth(tacSdk) { - try { - // Test basic SDK functionality - const nativeTacAddress = await tacSdk.nativeTACAddress(); - console.log("SDK health check passed:", nativeTacAddress); - return true; - } catch (error) { - console.error("SDK health check failed:", error); - return false; - } -} - -// Periodic health checks -setInterval(async () => { - const isHealthy = await checkSdkHealth(tacSdk); - if (!isHealthy) { - // Reinitialize SDK or show connection error - } -}, 30000); // Check every 30 seconds -``` - -## What's Next? - -With the SDK properly initialized, you can proceed to wallet integration and cross-chain transactions: - - - - Connect TON wallets using TonConnect or private keys - - - Execute your first cross-chain transaction - - - - - Remember to always call `tacSdk.closeConnections()` when your application - shuts down to properly clean up network resources and prevent memory leaks. - diff --git a/build/sdk/usage/sending-transactions.mdx b/build/sdk/usage/sending-transactions.mdx deleted file mode 100644 index 7169820..0000000 --- a/build/sdk/usage/sending-transactions.mdx +++ /dev/null @@ -1,679 +0,0 @@ ---- -title: Sending Transactions -description: "Execute cross-chain transactions from TON to TAC EVM using the TAC SDK" ---- - -The TAC SDK's core functionality revolves around `sendCrossChainTransaction()`, which enables seamless execution of EVM contract calls directly from TON wallets. This guide covers everything from basic transactions to advanced batch operations and error handling. - - - Always test transactions on testnet first. Cross-chain transactions are - irreversible once confirmed, and incorrect parameters can result in loss of - funds. - - -## Basic Cross-Chain Transaction - -The fundamental pattern for sending cross-chain transactions involves three components: an EVM target message, a sender, and optional assets to bridge. - -```javascript -import { TacSdk, SenderFactory, Network, AssetType } from "@tonappchain/sdk"; - -// Initialize SDK and sender -const tacSdk = await TacSdk.create({ network: Network.TESTNET }); -const sender = await SenderFactory.getSender({ tonConnect: tonConnectUI }); - -// Define EVM operation -const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", // Target contract address - methodName: "transfer(bytes,bytes)", // Contract method signature - encodedParameters: "0x000000000000000000...", // ABI-encoded parameters -}; - -// Define assets to bridge (optional) -const assets = [ - { - amount: 1.0, - }, // Bridge 1 TON -]; - -// Execute cross-chain transaction -const transactionLinker = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets -); - -console.log("Transaction ID:", transactionLinker.operationId); - -const waitOptions: WaitOptions = { - timeout: 600000, // 10 minutes timeout - maxAttempts: 60, // Up to 60 polling attempts - delay: 10000, // 10 seconds between status checks - successCheck: (opId) => !opId, - onSuccess: (opId) => console.log("Transaction completed successfully!", opId), -}; - -// Execute cross-chain transaction with automatic waiting for completion -const transactionLinkerWithWait = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - { waitOptions: waitOptions } -); - -console.log("Transaction completed:", transactionLinkerWithWait.operationId); -``` - -## EVM Proxy Message Structure - -The `EvmProxyMsg` object defines what contract call to execute on the TAC EVM side: - -### Required Fields - -```javascript -const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - methodName: "methodName(bytes,bytes)", - encodedParameters: "0x00000000000000...", - gasLimit: 500000n, -}; -``` - -### Method Name Formatting - -The SDK accepts flexible method name formats: - - - - ```javascript - const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - methodName: "swapExactTokensForTokens(bytes,bytes)", - encodedParameters: encodedSwapParams - }; - ``` - - - - ```javascript - const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - methodName: "transfer", // SDK will format as "transfer(bytes,bytes)" - encodedParameters: encodedTransferParams - }; - ``` - - - - ```javascript - const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - // No methodName - calls contract directly with encoded data - encodedParameters: "0x..." - }; - ``` - - - -### Parameter Encoding - -Use ethers.js or similar libraries to encode contract parameters: - - - -Make sure the encoded parameters are valid tuples. - -``` -abi.encode(["tuple(uint256,....)"], [1, ...]); -``` - - - -```javascript -import { ethers } from "ethers"; - -// For ERC20 transfer -const abi = new ethers.AbiCoder(); -const transferParams = abi.encode( - ["address", "uint256"], - ["0xRecipientAddress...", ethers.parseEther("100")] -); - -// For Uniswap V2 swap -const swapParams = abi.encode( - ["uint256", "uint256", "address[]", "address", "uint256"], - [ - ethers.parseEther("1"), // amountIn - ethers.parseEther("0.95"), // amountOutMin - [tokenA, tokenB], // path - recipientAddress, // to - Math.floor(Date.now() / 1000) + 1200, // deadline - ] -); - -const evmProxyMsg = { - evmTargetAddress: uniswapRouterAddress, - methodName: "swapExactTokensForTokens", - encodedParameters: swapParams, -}; -``` - -## Asset Bridging - -Assets are automatically bridged from TON to TAC EVM as part of the cross-chain transaction. The SDK supports multiple asset types and formats. - -### Asset Types - - - - ```javascript - const assets = [ - { - amount: 1.5 - } // Bridge 1.5 TON - ]; - ``` - - - - ```javascript - const assets = [ - { - address: "EQJettonMasterAddress...", - amount: 1000.0 // Bridge 1000 jetton tokens - } - ]; - ``` - - - - ```javascript - const assets = [ - { - address: "EQNFTItemAddress..." // Direct NFT item address - } - ]; - ``` - - - - ```javascript - const assets = [ - { - amount: 2.0 - }, // Native TON - { - address: "EQJettonAddress...", - amount: 500.0 - }, // Jetton - { - address: "EQNFTItemAddress..." - } // NFT - ]; - ``` - - - -### Raw Asset Format - -For precise control, use raw asset format: - -```javascript -const rawAssets = [ - { - // Fungible Token - address: "EQJettonMasterAddress...", - rawAmount: 1000000000n, // Raw amount (with decimals) - }, - { - address: "EQNFTItemAddress...", // Direct NFT item address - }, -]; -``` - -## Transaction Options - -Customize transaction behavior with advanced options: - -```javascript -const options = { - allowSimulationError: false, // Allow sending even if simulation fails - isRoundTrip: false, // Whether to return assets to TON after execution - protocolFee: 10000000n, // Custom protocol fee (nanotons) - evmValidExecutors: [ - // List of trusted EVM executor addresses - "0xExecutor1Address...", - "0xExecutor2Address...", - ], - evmExecutorFee: 50000000n, // EVM executor fee (wei) - tvmValidExecutors: [ - // List of trusted TON executor addresses - "EQExecutor1Address...", - "EQExecutor2Address...", - ], - tvmExecutorFee: 100000000n, // TON executor fee (nanotons) - calculateRollbackFee: false, // Calculate and include rollback fee if needed - withoutSimulation: false, // Skip simulation step before sending - validateAssetsBalance: true, // Validate sender's asset balance before sending - waitOperationId: false, // Wait for operationId to be available before returning - waitOptions: undefined, // Optional: pass WaitOptions object -}; - -const transactionLinker = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - options -); -``` - - - Custom executor fees and validator lists are advanced features. Use default - values unless you have specific requirements for execution control. - - -## Wait Options for Automatic Completion - -Both `sendCrossChainTransaction` and `sendCrossChainTransactions` support optional `waitOptions` parameter that automatically waits for transaction completion instead of requiring manual status polling: - -```typescript -interface WaitOptions { - timeout?: number; // Timeout in milliseconds (default: 300000) - maxAttempts?: number; // Maximum number of attempts (default: 30) - delay?: number; // Delay between attempts in milliseconds (default: 10000) - logger?: ILogger; // Logger instance - context?: TContext; // Optional context object for additional parameters - successCheck?: (result: T, context?: TContext) => boolean; // Custom success validation - onSuccess?: (result: T, context?: TContext) => Promise | void; // Success callback -} -``` - -### Common Wait Option Patterns - -```javascript -// Basic waiting with defaults -const defaultWaitOptions = {}; -const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - undefined, // transaction options - { waitOptions: defaultWaitOptions } // use default wait options -); - -// Custom timeout and polling interval -const customTimeoutWaitOptions = { - timeout: 600000, // 10 minutes - delay: 5000, // Check every 5 seconds -}; -const resultWithCustomTiming = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - undefined, - { waitOptions: customTimeoutWaitOptions } -); - -// With custom success validation and callback -const validatedWaitOptions = { - successCheck: (result) => result.success && result.confirmations >= 2, - onSuccess: (result) => { - console.log("Transaction confirmed with sufficient confirmations"); - // Send notification, update UI, etc. - }, -}; -const resultWithValidation = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - undefined, - { waitOptions: validatedWaitOptions } -); - -// With context for additional data -const contextualWaitOptions = { - context: { userId: "user123", transactionType: "swap" }, - onSuccess: (result, context) => { - console.log( - `${context.transactionType} completed for user ${context.userId}` - ); - }, -}; -const resultWithContext = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - undefined, - { waitOptions: contextualWaitOptions } -); - -// Advanced example: Automatic profiling data retrieval with context -const profilingWaitOptions = { - context: { - operationTracker: tacSdk.operationTracker, - enableProfiling: true, - }, - onSuccess: async (result, context) => { - const operationId = result; - if (context?.enableProfiling && context.operationTracker) { - console.log("📊 Retrieving profiling data..."); - - // Get detailed profiling information - const profilingData = await context.operationTracker.getStageProfiling( - operationId - ); - - console.log("📈 OPERATION PROFILING COMPLETE"); - console.log(`🔹 Operation ID: ${operationId}`); - console.log(`🔹 Profiling stages: ${Object.keys(profilingData).length}`); - - // Show stage completion summary - for (const [stageName, stageInfo] of Object.entries(profilingData)) { - if (stageName !== "operationType" && stageName !== "metaInfo") { - console.log( - ` • ${stageName}: ${ - stageInfo.exists ? "✅ Completed" : "⏸️ Not executed" - }` - ); - } - } - - return profilingData; - } - }, -}; -const resultWithProfiling = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets, - undefined, - { waitOptions: profilingWaitOptions } -); -``` - - - Using waitOptions eliminates the need for manual polling but will block the - calling thread until completion or timeout. For applications that need - non-blocking behavior, use the standard approach without waitOptions and - implement manual tracking. - - - - **Advanced Usage**: You can access the SDK's internal `OperationTracker` via - `tacSdk.operationTracker` and pass it through the context parameter to avoid - creating new tracker instances in your callbacks. This is especially useful - for profiling and advanced monitoring scenarios. - - -## Batch Transactions - -Send multiple cross-chain transactions simultaneously: - -```javascript -const batchTransactions = async () => { - // Define multiple transactions - const transactions = [ - { - evmProxyMsg: { - evmTargetAddress: "0xContract1...", - methodName: "method1(bytes,bytes)", - encodedParameters: "0x...", - }, - assets: [{ amount: 1.0 }], - }, - { - evmProxyMsg: { - evmTargetAddress: "0xContract2...", - methodName: "method2(bytes,bytes)", - encodedParameters: "0x...", - }, - assets: [{ address: "EQJetton...", amount: 100 }], - }, - ]; - - // Convert to batch format - const crosschainTxs = transactions.map((tx) => ({ - evmProxyMsg: tx.evmProxyMsg, - assets: tx.assets || [], - })); - - // Send batch - const transactionLinkers = await tacSdk.sendCrossChainTransactions( - sender, - crosschainTxs - ); - - // Send batch with wait options for automatic completion waiting - const transactionLinkers = await tacSdk.sendCrossChainTransactions( - sender, - crosschainTxs - ); - - return transactionLinkers.map((linker) => linker.operationId); -}; -``` - -## Transaction Simulation - -Simulate transactions before execution to estimate fees and validate parameters: - -```javascript -const simulateTransaction = async () => { - try { - const simulation = await tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - console.log("Simulation Results:"); - console.log("Success:", simulation.success); - console.log("Estimated Gas:", simulation.estimatedGas); - console.log("Protocol Fee:", simulation.protocolFee); - console.log("EVM Executor Fee:", simulation.evmExecutorFee); - console.log("TON Executor Fee:", simulation.tvmExecutorFee); - - if (simulation.success) { - // Proceed with actual transaction - const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets - ); - return result; - } else { - console.error("Simulation failed:", simulation.error); - return null; - } - } catch (error) { - console.error("Simulation error:", error); - return null; - } -}; -``` - -### Simulator Component - -The SDK uses an internal `Simulator` component for transaction simulation and fee estimation. The simulator is automatically created when you initialize the SDK: - -```javascript -// Simulator is created automatically with SDK -const sdk = await TacSdk.create({ network: Network.TESTNET }); - -// SDK simulation methods (recommended) -const simulationResult = await sdk.getSimulationInfo( - evmProxyMsg, - sender, - assets, - options -); - -// Batch simulation -const transactions = [ - { evmProxyMsg: msg1, assets: [asset1] }, - { evmProxyMsg: msg2, assets: [asset2] }, -]; -const batchResults = await sdk.simulateTransactions(sender, transactions); -``` - - - The Simulator performs TAC-side simulation to estimate gas costs, validate - transaction logic, and calculate required fees. It's automatically configured - when you create the SDK instance. - - -## Error Handling - -Implement comprehensive error handling for transaction failures: - -```javascript -const sendTransactionWithErrorHandling = async ( - evmProxyMsg, - sender, - assets -) => { - try { - // Pre-flight validation - if (!evmProxyMsg.evmTargetAddress) { - throw new Error("EVM target address is required"); - } - - if (!assets || assets.length === 0) { - console.warn("No assets specified for bridging"); - } - - // Simulate first (optional but recommended) - const simulation = await tacSdk.getSimulationInfo( - evmProxyMsg, - sender, - assets - ); - - if (!simulation.success) { - throw new Error(`Transaction simulation failed: ${simulation.error}`); - } - - // Execute transaction - const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets - ); - - return { - success: true, - operationId: result.operationId, - transactionLinker: result, - }; - } catch (error) { - console.error("Transaction failed:", error); - - // Handle specific error types - if (error.message.includes("insufficient balance")) { - return { - success: false, - error: "Insufficient balance for transaction and fees", - }; - } - - if (error.message.includes("invalid address")) { - return { - success: false, - error: "Invalid contract address specified", - }; - } - - if (error.message.includes("simulation failed")) { - return { - success: false, - error: "Transaction would fail on execution", - }; - } - - return { - success: false, - error: "Transaction failed: " + error.message, - }; - } -}; - -// Usage -const result = await sendTransactionWithErrorHandling( - evmProxyMsg, - sender, - assets -); - -if (result.success) { - console.log("Transaction sent:", result.operationId); -} else { - console.error("Transaction failed:", result.error); -} -``` - -## Transaction Lifecycle - -Understanding the transaction lifecycle helps with proper error handling and user experience: - - - - The SDK validates all parameters including addresses, amounts, and method - signatures before proceeding. - - - - If requested, the SDK simulates the transaction to estimate gas costs and - validate execution. - - - - Assets are prepared for bridging, including balance checks and approval - transactions if needed. - - - - The cross-chain message is constructed with proper encoding and sequencer - routing information. - - - - Transaction is signed and submitted to the TON network via the connected - wallet. - - - - The sequencer network processes the message and routes it to the TAC EVM - layer. - - - - The target contract method is executed on TAC EVM with bridged assets - available. - - - - Transaction completes successfully, or rollback mechanisms are triggered on - failure. - - - -## What's Next? - -With transactions executing successfully, learn to monitor their progress: - - - - Monitor cross-chain transaction status and progress - - - Deep dive into asset bridging mechanics and strategies - - diff --git a/build/sdk/usage/wallet-integration.mdx b/build/sdk/usage/wallet-integration.mdx deleted file mode 100644 index 5e7dc52..0000000 --- a/build/sdk/usage/wallet-integration.mdx +++ /dev/null @@ -1,544 +0,0 @@ ---- -title: Wallet Integration -description: "Connect TON wallets to your application using TonConnect or private key authentication" ---- - -The TAC SDK provides flexible wallet integration options to support different application types and user preferences. Whether you're building a web application with TonConnect or a backend service with private keys, the SDK abstracts wallet complexity through a unified sender interface. - - - Start with TonConnect integration for web applications to provide the best - user experience. Use private key integration only for backend services or - development environments where you control the private keys securely. - - -## SenderFactory Overview - -The `SenderFactory` class creates appropriate sender instances based on your wallet configuration. All senders implement the same `SenderAbstraction` interface, providing consistent transaction handling regardless of the underlying wallet type. - -```javascript -import { SenderFactory, Network, AssetType } from "@tonappchain/sdk"; - -// Create sender from configuration -const sender = await SenderFactory.getSender(configuration); - -// Use sender for transactions -const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets -); -``` - -## TonConnect Integration - -TonConnect is the standard protocol for connecting TON wallets to web applications. It provides a secure, user-friendly way to authenticate and authorize transactions without exposing private keys. - -### Basic TonConnect Setup - -First, install and configure TonConnect UI: - -```bash -npm install @tonconnect/ui -``` - -Create your TonConnect manifest file: - -```json -{ - "url": "https://yourapp.com", - "name": "Your dApp Name", - "iconUrl": "https://yourapp.com/icon-192x192.png", - "termsOfUseUrl": "https://yourapp.com/terms", - "privacyPolicyUrl": "https://yourapp.com/privacy" -} -``` - -### Initialize TonConnect - -```javascript -import { TonConnectUI } from "@tonconnect/ui"; -import { SenderFactory } from "@tonappchain/sdk"; - -// Initialize TonConnect UI -const tonConnectUI = new TonConnectUI({ - manifestUrl: "https://yourapp.com/tonconnect-manifest.json", - buttonRootId: "ton-connect-button", // Optional: for custom button placement -}); - -// Create sender from TonConnect -const sender = await SenderFactory.getSender({ - tonConnect: tonConnectUI, -}); -``` - -### React TonConnect Integration - -Create a comprehensive React integration with connection management: - -```jsx -import React, { createContext, useContext, useEffect, useState } from "react"; -import { TonConnectUI } from "@tonconnect/ui"; -import { SenderFactory } from "@tonappchain/sdk"; - -const TonConnectContext = createContext(null); - -export const TonConnectProvider = ({ children }) => { - const [tonConnectUI, setTonConnectUI] = useState(null); - const [sender, setSender] = useState(null); - const [wallet, setWallet] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const initTonConnect = async () => { - try { - const tonConnect = new TonConnectUI({ - manifestUrl: process.env.REACT_APP_MANIFEST_URL, - buttonRootId: "ton-connect-button", - }); - - setTonConnectUI(tonConnect); - - // Listen for wallet changes - tonConnect.onStatusChange(async (wallet) => { - setWallet(wallet); - - if (wallet) { - try { - const newSender = await SenderFactory.getSender({ - tonConnect: tonConnect, - }); - setSender(newSender); - } catch (error) { - console.error("Failed to create sender:", error); - setSender(null); - } - } else { - setSender(null); - } - }); - - // Check if already connected - if (tonConnect.wallet) { - setWallet(tonConnect.wallet); - const newSender = await SenderFactory.getSender({ - tonConnect: tonConnect, - }); - setSender(newSender); - } - } catch (error) { - console.error("TonConnect initialization failed:", error); - } finally { - setLoading(false); - } - }; - - initTonConnect(); - }, []); - - const connectWallet = async () => { - if (tonConnectUI) { - await tonConnectUI.connectWallet(); - } - }; - - const disconnectWallet = async () => { - if (tonConnectUI) { - await tonConnectUI.disconnect(); - } - }; - - return ( - - {children} - - ); -}; - -export const useTonConnect = () => { - const context = useContext(TonConnectContext); - if (!context) { - throw new Error("useTonConnect must be used within a TonConnectProvider"); - } - return context; -}; -``` - -### Using TonConnect in Components - -```jsx -import { useTonConnect } from "../contexts/TonConnectContext"; -import { useTacSdk } from "../contexts/TacSdkContext"; - -export const WalletConnector = () => { - const { - wallet, - sender, - loading, - connectWallet, - disconnectWallet, - isConnected, - } = useTonConnect(); - - const { tacSdk } = useTacSdk(); - - const handleTransaction = async () => { - if (!tacSdk || !sender) return; - - try { - const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc647332...", - methodName: "transfer(bytes,bytes)", - encodedParameters: "0x000000000000000000000000...", - }; - - const assets = [{ amount: 1.0 }]; // 1 TON - - const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, - assets - ); - - console.log("Transaction sent:", result.operationId); - } catch (error) { - console.error("Transaction failed:", error); - } - }; - - if (loading) { - return
Loading wallet...
; - } - - return ( -
- {isConnected ? ( -
-

Connected: {wallet.device.appName}

-

Address: {wallet.account.address}

- - -
- ) : ( - - )} -
- ); -}; -``` - -## Private Key Integration - -For backend services, automated systems, or development environments, you can create senders directly from mnemonic phrases or private keys. - -### Standard TON Wallets - -The SDK supports all standard TON wallet versions: - -```javascript -import { SenderFactory, Network, AssetType } from "@tonappchain/sdk"; - -// Wallet V4 (most common) -const senderV4 = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: "word1 word2 word3 ... word24", -}); - -// Wallet V5R1 (latest) -const senderV5 = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V5R1", - mnemonic: "word1 word2 word3 ... word24", - options: { - v5r1: { - subwalletNumber: 0, // Optional subwallet number - }, - }, -}); - -// Legacy wallets -const senderV3 = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V3R2", - mnemonic: "word1 word2 word3 ... word24", -}); -``` - -### Highload Wallet V3 - -For applications requiring high transaction throughput: - -```javascript -const highloadSender = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "HIGHLOAD_V3", - mnemonic: "word1 word2 word3 ... word24", - options: { - highloadV3: { - subwalletId: 0, // Subwallet identifier - timeout: 60, // Transaction timeout in seconds - }, - }, -}); -``` - - - Highload wallets are designed for high-volume applications and have different - fee structures. They can process multiple transactions simultaneously but - require careful sequence number management. - - - - **Batch Transaction Limits**: Different wallet versions support different - batch sizes when sending multiple transactions. V5R1 wallets can send up to - 254 transactions per batch, while V4 and other standard wallets support up to - 4 transactions per batch. Highload V3 wallets are optimized for large batch - operations. - - -### Environment Configuration - -Store sensitive information securely: - -```bash -# .env file -WALLET_MNEMONIC="word1 word2 word3 ... word24" -WALLET_VERSION=V4 -TAC_NETWORK=testnet -``` - -```javascript -// Secure wallet initialization -const sender = await SenderFactory.getSender({ - network: - process.env.TAC_NETWORK === "mainnet" ? Network.MAINNET : Network.TESTNET, - version: process.env.WALLET_VERSION || "V4", - mnemonic: process.env.WALLET_MNEMONIC, -}); -``` - -## Sender Interface Methods - -All senders implement the `SenderAbstraction` interface with consistent methods: - -### Core Methods - -```javascript -// Get sender's wallet address -const address = sender.getSenderAddress(); -console.log("Wallet address:", address); - -// Send single transaction -const result = await sender.sendShardTransaction( - shardTransaction, - delay, - network, - contractOpener -); - -// Send multiple transactions (batch) -const results = await sender.sendShardTransactions( - shardTransactions, - delay, - network, - contractOpener -); -``` - -### Transaction Signing - -The SDK handles transaction signing automatically based on the sender type: - -```javascript -// TonConnect sender - prompts user for approval -const tonConnectSender = await SenderFactory.getSender({ - tonConnect: tonConnectUI, -}); - -// Private key sender - signs automatically -const privateSender = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: "your mnemonic here", -}); - -// Both use the same interface -const result = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, - sender, // Works with any sender type - assets -); -``` - -## Advanced Wallet Features - -### Wallet Validation - -Validate wallet configuration before creating senders: - -```javascript -async function validateWalletConfig(config) { - // Network validation - if (!Object.values(Network).includes(config.network)) { - throw new Error(`Invalid network: ${config.network}`); - } - - // Mnemonic validation - if (config.mnemonic) { - const words = config.mnemonic.split(" "); - if (words.length !== 24) { - throw new Error("Mnemonic must contain exactly 24 words"); - } - } - - // Version validation - const validVersions = [ - "V2R1", - "V2R2", - "V3R1", - "V3R2", - "V4", - "V5R1", - "HIGHLOAD_V3", - ]; - if (config.version && !validVersions.includes(config.version)) { - throw new Error(`Invalid wallet version: ${config.version}`); - } - - return true; -} - -// Usage -try { - await validateWalletConfig({ - network: Network.TESTNET, - version: "V4", - mnemonic: "word1 word2 ... word24", - }); - - const sender = await SenderFactory.getSender(config); -} catch (error) { - console.error("Invalid wallet configuration:", error.message); -} -``` - -## Error Handling - -Handle wallet-related errors appropriately: - -```javascript -async function createSenderWithErrorHandling(config) { - try { - const sender = await SenderFactory.getSender(config); - return { sender, error: null }; - } catch (error) { - console.error("Sender creation failed:", error); - - // Handle specific error types - if (error.message.includes("Invalid mnemonic")) { - return { - sender: null, - error: "Invalid wallet mnemonic. Please check your seed phrase.", - }; - } - - if (error.message.includes("TonConnect")) { - return { - sender: null, - error: "Wallet connection failed. Please try connecting again.", - }; - } - - return { - sender: null, - error: "Failed to initialize wallet. Please check your configuration.", - }; - } -} - -// Usage -const { sender, error } = await createSenderWithErrorHandling({ - network: Network.TESTNET, - version: "V4", - mnemonic: process.env.WALLET_MNEMONIC, -}); - -if (error) { - console.error("Wallet error:", error); - // Show error to user -} else { - console.log("Wallet ready:", sender.getSenderAddress()); -} -``` - -## Security Best Practices - - - Never expose private keys or mnemonics in client-side code. Always use - environment variables or secure configuration management for sensitive data. - - -### Client-Side Security - -```javascript -// Good - Use TonConnect for web applications -const sender = await SenderFactory.getSender({ - tonConnect: tonConnectUI, // User controls private keys -}); - -// Bad - Never do this in client-side code -const sender = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: "exposed mnemonic in browser", // Security risk! -}); -``` - -### Server-Side Security - -```javascript -// Good - Use environment variables -const sender = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: process.env.WALLET_MNEMONIC, // Secure -}); - -// Good - Use secure configuration services -const sender = await SenderFactory.getSender({ - network: Network.TESTNET, - version: "V4", - mnemonic: await getSecureConfig("WALLET_MNEMONIC"), // Secure -}); -``` - -## What's Next? - -With wallet integration complete, you can proceed to sending cross-chain transactions: - - - - Execute cross-chain transactions with your connected wallet - - - Monitor transaction progress and handle completion - - diff --git a/build/smart-contracts/deploy-to-tac.mdx b/build/smart-contracts/deploy-to-tac.mdx deleted file mode 100644 index 6054889..0000000 --- a/build/smart-contracts/deploy-to-tac.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Deploy to TAC ---- diff --git a/build/smart-contracts/develop-tac-proxy.mdx b/build/smart-contracts/develop-tac-proxy.mdx deleted file mode 100644 index 0ea65ff..0000000 --- a/build/smart-contracts/develop-tac-proxy.mdx +++ /dev/null @@ -1,963 +0,0 @@ ---- -title: Develop TAC Proxy -description: "Learn how to develop a TAC Proxy - the connectors between TON and EVM applications" ---- - -## Introduction - -A TAC Proxy is a Solidity contract that receives cross-chain messages and tokens bridged from the TON blockchain. When a user on TON initiates a message (and potentially sends tokens), the TAC infrastructure delivers the tokens and data to your EVM-based contract's function. The proxy contract then processes that data—often by calling another Dapp contract or by performing some bridging logic—and optionally sends tokens back to TON using the same TAC infrastructure. - -The guide below shows how to: - -- Install the necessary dependencies. -- Write a simple proxy contract (both non-upgradeable and upgradeable). -- Implement your custom logic in a proxy function that adheres to TAC's required function signature. -- Encode your arguments properly on the frontend. -- Test your proxy contract locally using Hardhat and the @tonappchain/evm-ccl testing utilities. - -## Installation - -Install the @tonappchain/evm-ccl package in your Solidity contract repository. This package includes core functionalities for cross-chain messaging and local test SDKs: - -```bash -npm install --save @tonappchain/evm-ccl@latest -``` - -In most cases, you will be using Hardhat for development. Make sure you have a typical Hardhat setup and the recommended testing libraries. For instance, your package.json may include: - -```json -{ - "devDependencies": { - "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "hardhat": "^2.22.5", - "ethers": "^6.13.2", - "chai": "^4.3.7", - "ts-node": "^10.9.2", - "typescript": "^5.6.3", - "@tonappchain/evm-ccl": "^latest", - "...": "..." - } -} -``` - -If you cannot deploy your Dapp contracts directly for local testing, consider forking another network where the necessary contracts are already deployed. This can simplify local development and testing. - -## Creating the Proxy Contract - -In your contracts folder, create a new .sol file (e.g. MyProxy.sol). Below are two variations: - -### Non-upgradeable Contract - -For a simple, non-upgradeable contract, you can extend TacProxyV1: - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -import { TacProxyV1 } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; -import { IDappContract } from "./IDappContract.sol"; // your Dapp interface (if needed) -import { TokenAmount, NFTAmount, OutMessageV1, TacHeaderV1 } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; - -contract MyProxy is TacProxyV1 { - IDappContract public dappContract; - - constructor(address _dappContract, address _crossChainLayer) - TacProxyV1(_crossChainLayer) - { - dappContract = IDappContract(_dappContract); - } - - // Add your proxy functions here - function myProxyFunction(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // Implementation here - } -} -``` - -**Key Points** - -- We pass `_crossChainLayer` (the CrossChainLayer contract address) to TacProxyV1's constructor. -- `_onlyCrossChainLayer` is a security modifier inherited from TacProxyV1. It ensures that only the recognized cross-chain layer can call this function. -- `IDappContract` is just an example interface for some external logic contract you may want to call. - -### Upgradeable Contract - -If you need to upgrade your contract over time, use OpenZeppelin's upgradeable libraries and the TacProxyV1Upgradeable contract: - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -import { TacProxyV1Upgradeable } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1Upgradeable.sol"; -import { TokenAmount, NFTAmount, OutMessageV1, TacHeaderV1 } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; - -contract MyProxyUpgradeable is - Initializable, - OwnableUpgradeable, - UUPSUpgradeable, - TacProxyV1Upgradeable -{ - function initialize(address owner, address crossChainLayer) public initializer { - __UUPSUpgradeable_init(); - __Ownable_init(owner); - __TacProxyV1Upgradeable_init(crossChainLayer); - } - - function _authorizeUpgrade(address) internal override onlyOwner {} - - // Add your proxy functions here - function myProxyFunction(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // Implementation here - } -} -``` - -**Key Points** - -- Inherits from Initializable, OwnableUpgradeable, UUPSUpgradeable, and TacProxyV1Upgradeable. -- Has an initialize function in place of a constructor. -- `_authorizeUpgrade` ensures only the owner can perform contract upgrades. - -## Defining and Implementing Proxy Functions - -Every proxy function that TAC calls must have the signature: - -```solidity -function (bytes calldata, bytes calldata) external; -``` - -You can name the function as you wish (e.g. `myProxyFunction`, `invokeWithCallback`, etc.), but it must accept two bytes arguments: - -1. The first is always the encoded TAC header. -2. The second is always the encoded arguments that you define. - -### OutMessageV1 - -#### RoundTrip - -Since TAC extends the TON ecosystem, the concept of a RoundTrip message was introduced at the smart contract level in the Cross-Chain Layer (CCL). - -The main interaction scenario with a DApp on TAC is as follows: - -1. A user sends assets from TON to TAC, along with their intended action. -2. After interacting with the DApp on TAC, it is possible — within the same transaction — to send the resulting assets back to the user on TON by calling the `_sendMessageV1` method. -3. The `_sendMessageV1` method can also be used for regular asset bridging from TAC back to TON, without necessarily involving DApp interactions. - -A RoundTrip message specifically refers to the first type of interaction: - -- The message originates from TON, triggers an action on TAC, and then — after the interaction — the resulting assets are sent back to TON within the same flow. - -#### OutMessageV1 Structure - -OutMessageV1 is the main structure used for sending messages from EVM to TVM. - -```solidity -struct OutMessageV1 { - uint64 shardsKey; - string tvmTarget; - string tvmPayload; - uint256 tvmProtocolFee; - uint256 tvmExecutorFee; - string[] tvmValidExecutors; - TokenAmount[] toBridge; - NFTAmount[] toBridgeNFT; -} -``` - -Each field: - -- **shardsKey**: Developer ID. It is recommended to set it from the tacHeader. -- **tvmTarget**: The recipient address on the TON network. -- **tvmPayload**: A custom payload to be executed on the TON side. Currently not supported — must be empty. -- **tvmProtocolFee**: The protocol fee you must pay. For roundTrip messages, this fee is already covered on the TON side, so set this field to 0. -- **tvmExecutorFee**: The fee you offer to the executor on the TON side (in TAC tokens). For roundTrip messages, the fee is already locked on TON, so set this field to 0. -- **tvmValidExecutors**: A list of executors you trust to execute the message on the TON side. For roundTrip messages, this must be an empty array; the trusted executors are already defined in the initial TON message. -- **toBridge**: List of ERC20 tokens you want to bridge to the TON network and transfer to tvmTarget. -- **toBridgeNFT**: List of NFTs you want to bridge to the TON network and transfer to tvmTarget. - -### Example Implementation - -Below is an extended example of how you might implement `myProxyFunction` in a non-upgradeable contract. The logic is the same for an upgradeable contract. - -```solidity -function myProxyFunction(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer -{ - // 1. Decode the custom arguments - MyProxyFunctionArguments memory args = abi.decode(arguments, (MyProxyFunctionArguments)); - - // 2. Approve tokens to your Dapp contract for some action - IERC20(args.tokenFrom).approve(address(dappContract), args.amount); - // 3. Call the Dapp contract - uint256 tokenToAmount = dappContract.doSomething( - args.tokenFrom, - args.tokenTo, - args.amount - ); - - // 4. Prepare tokens to send back to TON, if desired - TokenAmount[] memory tokensToBridge = new TokenAmount[](1); - tokensToBridge[0] = TokenAmount(args.tokenTo, tokenToAmount); - - // 5. Approve the CrossChainLayer to pull them - IERC20(tokensToBridge[0].evmAddress).approve( - _getCrossChainLayerAddress(), - tokensToBridge[0].amount - ); - - // 6. Decode the TAC header - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - - // 7. Form an OutMessage - // This is how you instruct TAC to deliver tokens or data back to TON - OutMessageV1 memory outMsg = OutMessageV1({ - shardsKey: header.shardsKey, - tvmTarget: header.tvmCaller, - tvmPayload: "", - tvmProtocolFee: 0, - tvmExecutorFee: 0, - tvmValidExecutors: new string[](0), - toBridge: tokensToBridge, - toBridgeNFT: new NFTAmount[](0) - }); - - // 8. Send message back through CrossChainLayer with zero native - _sendMessageV1(outMsg, 0); -} -``` - -**Important Notes** - -- `function myProxyFunction(bytes calldata, bytes calldata) external _onlyCrossChainLayer` ensures only the TAC infrastructure can call this function. -- `_decodeTacHeader(...)` is inherited from TacProxyV1 (or TacProxyV1Upgradeable); it transforms the raw bytes into TacHeaderV1 data. -- You typically decode the second argument (`arguments`) using `abi.decode(...)` with a struct you define. - -## How the Cross-Chain Call Works - -When a user on TON sends a message via your Dapp (e.g., using the tac-sdk on the frontend), the CrossChainLayer contract on EVM receives bridged tokens and data from the TON side. Then: - -1. **Tokens (if any) are automatically transferred** from the CrossChainLayer contract to your proxy contract before the function call. -2. **The CrossChainLayer calls** `myProxyFunction(tacHeader, arguments)` on your proxy contract. -3. **tacHeader** is the encoded TacHeaderV1 struct containing the following fields: - - `uint64 shardsKey` - ID for linking sharded messages. - - `uint256 timestamp` - last message's shard block timestamp from TON. - - `bytes32 operationId` - unique ID for the operation. - - `string tvmCaller` - TON user's wallet address. **!!! Important !!!** It is always base64 mainnet bounceable format and starts with EQ. - - `bytes extraData` - For now it's always a zero-bytes array and not used. -4. **arguments** is a bytes array containing data you defined in the Dapp's frontend (encoded via tac-sdk or manually using ethers.AbiCoder). -5. **Your proxy function** processes the tokens, calls external contracts if necessary, and optionally prepares an OutMessageV1 with tokens to be sent back to TON. -6. **The `_sendMessageV1(outMsg, value)` function** sends everything back to the CrossChainLayer so that tokens (including native TAC token) (and an optional message) can be bridged to TON. - -## Fees - -When sending a message, handling the fees depends on the type of the message. - -### RoundTrip Messages - -- No need to specify `tvmProtocolFee` or `tvmExecutorFee` manually. -- These values should be set to **0** because the fees have already been paid and locked on the TON side. - -### Direct TAC -> TON Messages - -When sending a direct message from TAC to TON, you must manually specify the fees: - -1. **Set tvmProtocolFee:** - - - Call the `getProtocolFee` method on the proxy contract to get the current protocol fee. - - Set the `tvmProtocolFee` field in your OutMessageV1 accordingly. - -2. **Set tvmExecutorFee:** - - - Estimate the appropriate executor fee you want to pay. - - If you provide an insufficient amount of TAC for the executor fee, your message will not be executed. - - Currently, there is no official library to calculate the exact executor fee, so it is recommended to: - - Overestimate slightly, or - - Use tacSDK for better fee estimation. - -3. **Specify Valid Executors:** - - List the executors you trust to process your message. - - You can retrieve the list of default trusted executors by calling `settings.getTrustedTVMExecutors()` on the Settings contract. - -Example snippet: - -```solidity -function bridgeTokensToTON(OutMessageV1 calldata outMessage) payable external { - // Approve tokens for bridging - for (uint i = 0; i < outMessage.toBridge.length; i++) { - IERC20(outMessage.toBridge[i].evmAddress).transferFrom(msg.sender, address(this), outMessage.toBridge[i].amount); - IERC20(outMessage.toBridge[i].evmAddress).approve(_getCrossChainLayerAddress(), outMessage.toBridge[i].amount); - } - - uint256 protocolFee = getProtocolFee(); - if (outMessage.tvmProtocolFee < protocolFee) { - revert NotEnoughProtocolFee(outMessage.tvmProtocolFee, protocolFee); - } - - if (outMessage.tvmProtocolFee + outMessage.tvmExecutorFee > msg.value) { - revert NotEnoughValue(msg.value, outMessage.tvmProtocolFee + outMessage.tvmExecutorFee); - } - - // Send the message to TON - _sendMessageV1(outMessage, msg.value); -} -``` - -**Note:** The `msg.value` you send must be greater than or equal to `tvmProtocolFee + tvmExecutorFee`. Any surplus TAC tokens will be bridged to `tvmTarget`. - -## Encoding Arguments on the Frontend - -You typically define a struct that represents the arguments your proxy function expects. For example: - -```solidity -struct MyProxyFunctionArguments { - address tokenFrom; - address tokenTo; - uint256 amount; -} -``` - -You then encode these fields in your frontend code using ethers.js (or another library). - -### Basic Example - -```javascript -import { ethers } from "ethers"; -const abiCoder = ethers.AbiCoder.defaultAbiCoder(); - -const myProxyFunctionArguments = abiCoder.encode( - ["address", "address", "uint256"], - [tokenFromAddress, tokenToAddress, tokenFromAmount] -); -``` - -### Complex Example with Nested Structures - -```solidity -struct AnyExtraInfo { - address feeCollector; - uint256 feeRate; -} - -struct MyProxyFunctionArguments { - AnyExtraInfo extraInfo; - address tokenFrom; - address tokenTo; - uint256 amount; -} -``` - -Encoding: - -```javascript -const extraInfo = [feeCollectorAddress, feeRate]; -const myProxyFunctionArguments = abiCoder.encode( - ["tuple(address,uint256)", "address", "address", "uint256"], - [extraInfo, tokenFromAddress, tokenToAddress, tokenAmount] -); -``` - -### Complex Example with Dynamic Arrays - -```solidity -struct MyProxyFunctionArguments { - address[] path; - uint256 amount; -} -``` - -Encoding: - -```javascript -const path = [tokenFromAddress, tokenToAddress]; -const myProxyFunctionArguments = abiCoder.encode( - ["tuple(address[],uint256)"], - [[path, tokenFromAmount]] -); -``` - -## Specifying the Function Name in tac-sdk - -When using the tac-sdk to create messages for bridging, you must provide: - -- **target**: the address of your Proxy contract. -- **method_name**: the complete function signature, e.g. `"myProxyFunction(bytes,bytes)"`. -- **arguments**: the ABI-encoded arguments (second parameter in your proxy function). -- **gasLimit** (optional): the parameter that will be passed to the TAC side. The executor must allocate at least `gasLimit` gas for executing the transaction on the TAC side. If this parameter is not specified, it will be calculated using the `simulateEVMMessage` method (preferred). - -Example: - -```javascript -const myProxyFunctionName = "myProxyFunction(bytes,bytes)"; - -const userMessage = { - target: MyProxyContractAddress, - method_name: myProxyFunctionName, - arguments: myProxyFunctionArguments, // from the previous encoding step - gasLimit?: *optional* -}; -``` - -## Testing the Proxy Contract - -### Example Minimal Proxy for Testing - -In many cases, you want a stripped-down contract to test basic cross-chain behavior. Below is a minimal TestProxy that: - -- Inherits TacProxyV1. -- Has a single function `invokeWithCallback(...)`. -- Emits an event for logging. -- Demonstrates bridging tokens back to TON. - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { OutMessageV1, TacHeaderV1, TokenAmount, NFTAmount } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; -import { TacProxyV1 } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; - -contract TestProxy is TacProxyV1 { - event InvokeWithCallback( - uint64 shardsKey, - uint256 timestamp, - bytes32 operationId, - string tvmCaller, - bytes extraData, - TokenAmount[] receivedTokens - ); - - constructor(address _crossChainLayer) TacProxyV1(_crossChainLayer) {} - - function invokeWithCallback(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // 1. Decode the header - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - - // 2. Decode the array of TokenAmount structs - TokenAmount[] memory receivedTokens = abi.decode(arguments, (TokenAmount[])); - - // Optional: Here you could call an external Dapp contract with these tokens - - // 3. Log an event for testing - emit InvokeWithCallback( - header.shardsKey, - header.timestamp, - header.operationId, - header.tvmCaller, - header.extraData, - receivedTokens - ); - - // 4. Approve and forward the tokens back via the cross-chain layer - for (uint i = 0; i < receivedTokens.length; i++) { - IERC20(receivedTokens[i].evmAddress).approve( - _getCrossChainLayerAddress(), - receivedTokens[i].amount - ); - } - - // 5. Create and send an OutMessage - _sendMessageV1( - OutMessageV1({ - shardsKey: header.shardsKey, - tvmTarget: header.tvmCaller, - tvmPayload: "", - tvmProtocolFee: 0, - tvmExecutorFee: 0, - tvmValidExecutors: new string[](0), - toBridge: receivedTokens, - toBridgeNFT: new NFTAmount[](0) - }), - 0 - ); - } -} -``` - -Also define the TestToken contract. - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -contract TestToken is ERC20 { - constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} - - function mint(address _to, uint256 _amount) external { - _mint(_to, _amount); - } -} -``` - -### Test Setup Example (Hardhat + @tonappchain/evm-ccl) - -Create a test file such as TestProxy.spec.ts under your test directory. Below is a basic example test: - -```typescript -import hre, { ethers } from "hardhat"; -import { Signer } from "ethers"; -import { expect } from "chai"; - -// The following items come from '@tonappchain/evm-ccl' to help test cross-chain logic locally. -import { - deploy, - TacLocalTestSdk, - JettonInfo, - TokenMintInfo, - TokenUnlockInfo, -} from "@tonappchain/evm-ccl"; - -// Types for your compiled contracts -import { TestProxy, TestToken } from "../typechain-types"; -import { InvokeWithCallbackEvent } from "../typechain-types/contracts/TestProxy"; - -describe("TestProxy with @tonappchain/evm-ccl", () => { - let admin: Signer; - let testSdk: TacLocalTestSdk; - let proxyContract: TestProxy; - let existedToken: TestToken; - - before(async () => { - [admin] = await ethers.getSigners(); - - // 1. Initialize local test SDK - testSdk = new TacLocalTestSdk(); - const crossChainLayerAddress = testSdk.create(ethers.provider); - - // 2. Deploy a sample ERC20 token - existedToken = await deploy( - admin, - hre.artifacts.readArtifactSync("TestToken"), - ["TestToken", "TTK"], - undefined, - false - ); - - // 3. Deploy the proxy contract - proxyContract = await deploy( - admin, - hre.artifacts.readArtifactSync("TestProxy"), - [crossChainLayerAddress], - undefined, - false - ); - }); - - it("Should correctly handle invokeWithCallback", async () => { - // Prepare call parameters - const shardsKey = 1n; - const operationId = ethers.encodeBytes32String("operationId"); - const extraData = "0x"; // untrusted data from the executor - const timestamp = BigInt(Math.floor(Date.now() / 1000)); - const tvmWalletCaller = "TVMCallerAddress"; - - // Example bridging: create a Jetton and specify how many tokens to mint - const jettonInfo: JettonInfo = { - tvmAddress: "JettonMinterAddress", - name: "TestJetton", - symbol: "TJT", - }; - - const tokenMintInfo: TokenMintInfo = { - info: jettonInfo, - amount: 10n ** 9n, - }; - - // Also handle an existing EVM token to simulate bridging - const tokenUnlockInfo: TokenUnlockInfo = { - evmAddress: await existedToken.getAddress(), - amount: 10n ** 18n, - }; - - // Lock existedToken in the cross-chain layer to emulate bridging from EVM - await existedToken.mint( - testSdk.getCrossChainLayerAddress(), - tokenUnlockInfo.amount - ); - - // You can define a native TAC amount to bridge to your proxy, - // but you must first lock this amount on the CrossChainLayer contract - // use the testSdk.lockNativeTacOnCrossChainLayer(nativeTacAmount) function - const tacAmountToBridge = 0n; - - // Determine the EVM address of the bridged Jetton (for minted jettons) - const bridgedJettonAddress = testSdk.getEVMJettonAddress( - jettonInfo.tvmAddress - ); - - // Prepare the method call - const target = await proxyContract.getAddress(); - const methodName = "invokeWithCallback(bytes,bytes)"; - - // Our 'arguments' is an array of TokenAmount: (address, uint256)[] - const receivedTokens = [ - [bridgedJettonAddress, tokenMintInfo.amount], - [tokenUnlockInfo.evmAddress, tokenUnlockInfo.amount], - ]; - - const encodedArguments = ethers.AbiCoder.defaultAbiCoder().encode( - ["tuple(address,uint256)[]"], - [receivedTokens] - ); - - // 4. Use testSdk to simulate a cross-chain message - const { receipt, deployedTokens, outMessages } = await testSdk.sendMessage( - shardsKey, - target, - methodName, - encodedArguments, - tvmWalletCaller, - [tokenMintInfo], // which jettons to mint - [tokenUnlockInfo], // which EVM tokens to unlock - tacAmountToBridge, - extraData, - operationId, - timestamp, - 0, // gasLimit - if 0 - simulate and fill inside sendMessage - false // force send (if simulation failed) - ); - - // 5. Assertions - expect(receipt.status).to.equal(1); - - // - Check if the Jetton was deployed - expect(deployedTokens.length).to.equal(1); - expect(deployedTokens[0].evmAddress).to.equal(bridgedJettonAddress); - - // - Check the outMessages array - expect(outMessages.length).to.equal(1); - const outMessage = outMessages[0]; - expect(outMessage.shardsKey).to.equal(shardsKey); - expect(outMessage.operationId).to.equal(operationId); - expect(outMessage.callerAddress).to.equal(await proxyContract.getAddress()); - expect(outMessage.targetAddress).to.equal(tvmWalletCaller); - - // - The returned tokens should be burned or locked as bridging back to TON - expect(outMessage.tokensBurned.length).to.equal(1); - expect(outMessage.tokensBurned[0].evmAddress).to.equal( - bridgedJettonAddress - ); - expect(outMessage.tokensBurned[0].amount).to.equal(tokenMintInfo.amount); - - expect(outMessage.tokensLocked.length).to.equal(1); - expect(outMessage.tokensLocked[0].evmAddress).to.equal( - tokenUnlockInfo.evmAddress - ); - expect(outMessage.tokensLocked[0].amount).to.equal(tokenUnlockInfo.amount); - - // - Confirm the event was emitted - let eventFound = false; - receipt.logs.forEach((log) => { - const parsed = proxyContract.interface.parseLog(log); - if (parsed && parsed.name === "InvokeWithCallback") { - eventFound = true; - const typedEvent = - parsed as unknown as InvokeWithCallbackEvent.LogDescription; - expect(typedEvent.args.shardsKey).to.equal(shardsKey); - expect(typedEvent.args.timestamp).to.equal(timestamp); - expect(typedEvent.args.operationId).to.equal(operationId); - expect(typedEvent.args.tvmCaller).to.equal(tvmWalletCaller); - expect(typedEvent.args.extraData).to.equal(extraData); - expect(typedEvent.args.receivedTokens.length).to.equal(2); - expect(typedEvent.args.receivedTokens[0].evmAddress).to.equal( - bridgedJettonAddress - ); - expect(typedEvent.args.receivedTokens[1].evmAddress).to.equal( - tokenUnlockInfo.evmAddress - ); - } - }); - expect(eventFound).to.be.true; - }); -}); -``` - -**Test Flow:** - -1. **Initialization** - - - Create a local cross-chain environment (`TacLocalTestSdk`). - - Deploy a test token (`TestToken`). - - Deploy your `TestProxy`. - -2. **Bridging Simulation** - - - Mint or lock tokens on the cross-chain layer. - - Create the parameters (`shardsKey`, `operationId`, etc.). - -3. **Invoke Proxy** - - - Use the `testSdk.sendMessage(...)` to simulate a cross-chain call to your proxy's function. - -4. **Verification** - - Confirm the transaction succeeded. - - Inspect the `deployedTokens` (if you minted new tokens). - - Inspect the `outMessages` for tokens returning to TON. - - Check emitted events for correct data. - -## NFT Proxy Contract Example - -The NFT proxy contract must inherit from `IERC721Receiver` and implement the required `onERC721Received` function to correctly receive ERC‑721 tokens. - -### NFT Proxy Implementation - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import { TacProxyV1 } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; -import { TacHeaderV1, TokenAmount, NFTAmount } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; - -contract TestNFTProxy is TacProxyV1, IERC721Receiver { - - constructor(address crossChainLayer) TacProxyV1(crossChainLayer) {} - - /** - * @dev Handles the receipt of an ERC-721 token. - * - * Returns its Solidity selector to confirm the token transfer. - */ - function onERC721Received( - address, - address, - uint256, - bytes calldata - ) external pure override(IERC721Receiver) returns (bytes4) { - return this.onERC721Received.selector; - } - - /** - * @dev Receives NFTs bridged from TON. - */ - function receiveNFT(bytes calldata tacHeader, bytes calldata arguments) external { - // this arguments just for example, you can define your own - NFTAmount[] memory nfts = abi.decode(arguments, (NFTAmount[])); - - for (uint i = 0; i < nfts.length; i++) { - IERC721(nfts[i].evmAddress).approve(_getCrossChainLayerAddress(), nfts[i].tokenId); - } - - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - // Bridge NFT back by creating an OutMessageV2 - OutMessageV1 memory outMessage = OutMessageV1( - header.shardsKey, - header.tvmCaller, - "", - 0, // roundTripMessages don't require tvmProtocolFee as it's already paid on TON - 0, // roundTripMessages don't require tvmExecutorFee as it's already paid on TON - new string[](0), // no need to specify validExecutors as it's already specified in initital tx on TON - new TokenAmount[](0), // No ERC20 tokens bridged - nfts // NFTs to bridge (the 'amount' field is ignored for ERC721) - ); - _sendMessageV1(outMessage, 0); - } -} -``` - -### Test ERC‑721 Token Contract - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.28; - -import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - -contract TestERC721Token is ERC721 { - - string private __baseURI; - - constructor(string memory _name, string memory _symbol, string memory baseURI) ERC721(_name, _symbol) { - __baseURI = baseURI; - } - - function mint(address _to, uint256 _tokenId) external { - _mint(_to, _tokenId); - } - - function _baseURI() internal view override returns (string memory) { - return __baseURI; - } -} -``` - -### Test Setup Example for NFT Proxy - -Below is an example Hardhat test for NFT bridging using the local test SDK: - -```typescript -import hre, { ethers } from "hardhat"; -import { - deploy, - TacLocalTestSdk, - NFTInfo, - NFTMintInfo, - NFTUnlockInfo, -} from "@tonappchain/evm-ccl"; -import { Signer } from "ethers"; -import { TestERC721Token, TestNFTProxy } from "../typechain-types"; -import { expect } from "chai"; - -describe("TacLocalTestSDK NFT", () => { - let admin: Signer; - let testSdk: TacLocalTestSdk; - let testNFTProxy: TestNFTProxy; - let existedERC721: TestERC721Token; - - before(async () => { - [admin] = await ethers.getSigners(); - testSdk = new TacLocalTestSdk(); - const crossChainLayerAddress = testSdk.create(ethers.provider); - - existedERC721 = await deploy( - admin, - hre.artifacts.readArtifactSync("TestERC721Token"), - ["ExistedNFT", "NFTE", "https://test-nft.com/"], - undefined, - false - ); - testNFTProxy = await deploy( - admin, - hre.artifacts.readArtifactSync("TestNFTProxy"), - [crossChainLayerAddress], - undefined, - false - ); - }); - - it("Test send message with NFT", async () => { - const shardsKey = 1n; - const operationId = ethers.encodeBytes32String("operationId"); - const extraData = "0x"; - const timestamp = BigInt(Math.floor(Date.now() / 1000)); - const tvmWalletCaller = "TVMCallerAddress"; - - const nftCollectionInfo: NFTInfo = { - tvmAddress: "NftCollectionAddress", - name: "NftCollection1", - symbol: "NFT1", - baseURI: "https://nft1.com/", - }; - - const nftMintInfo: NFTMintInfo = { - info: nftCollectionInfo, - tokenId: 1n, - }; - - // Lock an NFT on the cross-chain layer to simulate bridging from EVM - const lockedTokenId = 1n; - await ( - await existedERC721.mint( - testSdk.getCrossChainLayerAddress(), - lockedTokenId - ) - ).wait(); - - const nftUnlockInfo: NFTUnlockInfo = { - evmAddress: await existedERC721.getAddress(), - tokenId: lockedTokenId, - amount: 0n, // 'amount' is ignored for ERC721 - }; - - // Calculate the deployed NFT collection address - const calculatedNFTAddress = testSdk.getEVMNFTCollectionAddress( - nftCollectionInfo.tvmAddress - ); - const target = await testNFTProxy.getAddress(); - const methodName = "receiveNFT(bytes,bytes)"; - - // Encode two NFTs: - // - One minted (nftMintInfo) with amount 0 (ignored) - // - One unlocked (nftUnlockInfo) with amount 0 - const receivedToken1 = [calculatedNFTAddress, nftMintInfo.tokenId, 0n]; - const receivedToken2 = [ - nftUnlockInfo.evmAddress, - nftUnlockInfo.tokenId, - nftUnlockInfo.amount, - ]; - - const encodedArguments = ethers.AbiCoder.defaultAbiCoder().encode( - ["tuple(address,uint256,uint256)[]"], - [[receivedToken1, receivedToken2]] - ); - - const { receipt, deployedTokens, outMessages } = - await testSdk.sendMessageWithNFT( - shardsKey, - target, - methodName, - encodedArguments, - tvmWalletCaller, - [], - [], - [nftMintInfo], - [nftUnlockInfo], - 0n, - extraData, - operationId, - timestamp - ); - - expect(receipt.status).to.be.eq(1); - expect(deployedTokens.length).to.be.eq(1); - expect(deployedTokens[0].evmAddress).to.be.eq(calculatedNFTAddress); - expect(deployedTokens[0].tvmAddress).to.be.eq(nftCollectionInfo.tvmAddress); - expect(outMessages.length).to.be.eq(1); - const outMessage = outMessages[0]; - expect(outMessage.shardsKey).to.be.eq(shardsKey); - expect(outMessage.operationId).to.be.eq(operationId); - expect(outMessage.callerAddress).to.be.eq(await testNFTProxy.getAddress()); - expect(outMessage.targetAddress).to.be.eq(tvmWalletCaller); - expect(outMessage.payload).to.be.eq(""); - expect(outMessage.tokensBurned.length).to.be.eq(0); - expect(outMessage.tokensLocked.length).to.be.eq(0); - expect(outMessage.nftsBurned.length).to.be.eq(1); - expect(outMessage.nftsBurned[0].evmAddress).to.be.eq(calculatedNFTAddress); - expect(outMessage.nftsBurned[0].tokenId).to.be.eq(nftMintInfo.tokenId); - expect(outMessage.nftsLocked.length).to.be.eq(1); - expect(outMessage.nftsLocked[0].evmAddress).to.be.eq( - nftUnlockInfo.evmAddress - ); - expect(outMessage.nftsLocked[0].tokenId).to.be.eq(nftUnlockInfo.tokenId); - }); -}); -``` - -## Running the Tests - -Inside your project directory, simply run: - -```bash -npx hardhat test -``` - -Hardhat will compile all contracts and run the test suite. The `@tonappchain/evm-ccl` local test SDK helps emulate bridging logic, ensuring your proxy behaves as expected in a cross-chain scenario. - -## Conclusion - -By following these steps, you can develop, deploy, and test a TAC Proxy contract that handles cross-chain messages and tokens from TON. Key points include: - -- **Inheritance from TacProxyV1 or TacProxyV1Upgradeable** to gain built-in cross-chain functionality and security modifiers. -- **Function Signatures** must match `functionName(bytes, bytes) external`. -- **Decoding the TAC header and your custom arguments** to implement your Dapp's logic. -- **Use `_sendMessageV1(...)`** to return tokens and a message back to TON. -- **Using `_sendMessageV2(...)`** to bridge both NFTs and ERC‑20 tokens back to TON. -- **Local Testing with `@tonappchain/evm-ccl`** provides an easy way to validate your cross-chain logic without deploying a full cross-chain setup. diff --git a/build/smart-contracts/tools/hardhat.mdx b/build/smart-contracts/tools/hardhat.mdx deleted file mode 100644 index fcbecb9..0000000 --- a/build/smart-contracts/tools/hardhat.mdx +++ /dev/null @@ -1,422 +0,0 @@ ---- -title: Hardhat -description: "Deploy, test, and verify Solidity contracts on TAC using Hardhat - the complete development environment" ---- - -TAC EVM Layer provides full compatibility with Hardhat, Ethereum's most popular development framework. Deploy your existing Solidity contracts without modification, test, and verify contracts on the block explorer. - -## Installation & Setup - -Setting up Hardhat for TAC development requires no special configuration - it works exactly like any other EVM chain. - - - - Create a new Hardhat project or navigate to your existing project: - - ```bash - mkdir my-tac-project && cd my-tac-project - npm init -y - npm install --save-dev hardhat - npx hardhat - ``` - - Select "Create a JavaScript project" or "Create a TypeScript project" based on your preference. - - - - -Install essential dependencies for TAC development: - -```bash Core dependencies - npm install --save-dev @nomicfoundation/hardhat-toolbox - npm install --save-dev @nomicfoundation/hardhat-verify - npm install @openzeppelin/contracts - -``` - - - - - Update `hardhat.config.js` to include TAC networks: - - ```javascript hardhat.config.js - require("@nomicfoundation/hardhat-toolbox"); - require("@nomicfoundation/hardhat-verify"); - - module.exports = { - solidity: { - version: "0.8.19", - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - }, - }, - networks: { - // TAC Saint Petersburg Testnet - tac_testnet: { - url: "https://spb.rpc.tac.build", - chainId: 2391, - accounts: [process.env.PRIVATE_KEY || ""], - gasPrice: 20000000000, // 20 gwei - }, - // TAC Mainnet - tac_mainnet: { - url: "https://rpc.tac.build", - chainId: 239, - accounts: [process.env.PRIVATE_KEY || ""], - gasPrice: 20000000000, // 20 gwei - } - }, - }; - ``` - - - - Create a `.env` file for your private key: - - ```bash - # .env - PRIVATE_KEY=your_private_key_here - ``` - - - Never commit your private key to version control. Add `.env` to your `.gitignore` file. - - - - -## Contract Development - -Develop contracts for TAC exactly as you would for Ethereum - full Solidity compatibility is maintained. - -### Basic Contract Example - -```solidity -// contracts/SimpleStorage.sol -pragma solidity ^0.8.19; - -contract SimpleStorage { - uint256 private storedData; - - event DataStored(uint256 indexed value, address indexed sender); - - constructor(uint256 _initialValue) { - storedData = _initialValue; - } - - function set(uint256 _value) external { - storedData = _value; - emit DataStored(_value, msg.sender); - } - - function get() external view returns (uint256) { - return storedData; - } -} -``` - -### TAC Cross-Chain Proxy Contract - -For contracts that need to receive messages from TON, inherit from the TAC proxy base: - -```solidity -// contracts/TacEnabledContract.sol -pragma solidity ^0.8.19; - -import "@tac/proxy-contracts/TacProxyV1.sol"; - -contract TacEnabledContract is TacProxyV1 { - uint256 public counter; - mapping(address => uint256) public userCounters; - - event CounterIncremented(address indexed user, uint256 newValue); - - constructor(address _crossChainLayer) TacProxyV1(_crossChainLayer) { - counter = 0; - } - - // Function callable from EVM - function incrementCounter() external { - counter++; - userCounters[msg.sender]++; - emit CounterIncremented(msg.sender, counter); - } - - // Function callable from TON via cross-chain message - function incrementFromTON(bytes calldata tacHeader, bytes calldata args) - external - _onlyCrossChainLayer - { - // Decode TAC header to get TON user info - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - - // Increment counter for cross-chain user - counter++; - userCounters[header.sender]++; - - emit CounterIncremented(header.sender, counter); - - // Optionally send result back to TON - OutMessageV1 memory response = OutMessageV1({ - target: header.sender, - methodName: "counterUpdated(bytes,bytes)", - arguments: abi.encode(counter) - }); - - _sendMessageV1(response); - } -} -``` - -## Testing - -### Local Testing - -```javascript -// test/SimpleStorage.test.js -const { expect } = require("chai"); -const { ethers } = require("hardhat"); - -describe("SimpleStorage", function () { - let simpleStorage; - let owner; - let addr1; - - beforeEach(async function () { - [owner, addr1] = await ethers.getSigners(); - - const SimpleStorage = await ethers.getContractFactory("SimpleStorage"); - simpleStorage = await SimpleStorage.deploy(42); - await simpleStorage.deployed(); - }); - - it("Should initialize with correct value", async function () { - expect(await simpleStorage.get()).to.equal(42); - }); - - it("Should store and retrieve values", async function () { - const tx = await simpleStorage.set(100); - await tx.wait(); - - expect(await simpleStorage.get()).to.equal(100); - }); - - it("Should emit DataStored event", async function () { - await expect(simpleStorage.set(200)) - .to.emit(simpleStorage, "DataStored") - .withArgs(200, owner.address); - }); -}); -``` - -### Run Tests - -```bash -# Run tests locally -npx hardhat test - -# Run tests against TAC testnet -npx hardhat test --network tac_testnet -``` - -## Deployment - -Deploy contracts to TAC using standard Hardhat deployment scripts. - -### Deployment Script - -```javascript -// scripts/deploy.js -const { ethers } = require("hardhat"); - -async function main() { - const [deployer] = await ethers.getSigners(); - - console.log("Deploying contracts with account:", deployer.address); - console.log("Account balance:", (await deployer.getBalance()).toString()); - - // Deploy SimpleStorage - const SimpleStorage = await ethers.getContractFactory("SimpleStorage"); - const simpleStorage = await SimpleStorage.deploy(42); - await simpleStorage.deployed(); - - console.log("SimpleStorage deployed to:", simpleStorage.address); - - // Deploy TAC-enabled contract (if you have CrossChainLayer address) - const crossChainLayerAddress = "0x..."; // Get from TAC documentation - - if (crossChainLayerAddress) { - const TacEnabledContract = await ethers.getContractFactory( - "TacEnabledContract" - ); - const tacContract = await TacEnabledContract.deploy(crossChainLayerAddress); - await tacContract.deployed(); - - console.log("TacEnabledContract deployed to:", tacContract.address); - } - - // Save deployment info - const deploymentInfo = { - network: network.name, - simpleStorage: simpleStorage.address, - deployer: deployer.address, - blockNumber: await ethers.provider.getBlockNumber(), - }; - - console.log("Deployment info:", deploymentInfo); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); -``` - -### Deploy Commands - - - - ```bash - # Deploy to TAC Saint Petersburg testnet - npx hardhat run scripts/deploy.js --network tac_testnet - ``` - - Expected output: - ``` - Deploying contracts with account: 0x742d35Cc6473... - Account balance: 1000000000000000000 - SimpleStorage deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3 - ``` - - - - ```bash - # Deploy to TAC mainnet (production) - npx hardhat run scripts/deploy.js --network tac_mainnet - ``` - - Ensure you have sufficient TAC tokens for gas fees before deploying to mainnet. - - - - -## Advanced Configuration - -### Gas Optimization - -```javascript -// hardhat.config.js - Optimized for TAC -module.exports = { - solidity: { - version: "0.8.19", - settings: { - optimizer: { - enabled: true, - runs: 200, // Adjust based on usage frequency - }, - viaIR: true, // Enable for better optimization - }, - }, - networks: { - tac_testnet: { - url: "https://spb.rpc.tac.build", - chainId: 2391, - accounts: [process.env.PRIVATE_KEY], - gas: 20000000, // Block gas limit - gasPrice: 20000000000, // 20 gwei - timeout: 60000, // 1 minute timeout - }, - }, -}; -``` - -### Multiple Environment Setup - -```javascript -// hardhat.config.js -const { PRIVATE_KEY_DEV, PRIVATE_KEY_PROD } = process.env; - -module.exports = { - networks: { - tac_testnet: { - url: "https://spb.rpc.tac.build", - chainId: 2391, - accounts: PRIVATE_KEY_DEV ? [PRIVATE_KEY_DEV] : [], - }, - tac_mainnet: { - url: "https://rpc.tac.build", - chainId: 239, - accounts: PRIVATE_KEY_PROD ? [PRIVATE_KEY_PROD] : [], - }, - }, -}; -``` - -## Common Issues & Solutions - - - - **Problem**: RPC connection failures or timeouts - - **Solutions**: - - Verify RPC URLs are correct - - Check network connectivity - - Increase timeout in network configuration - - Try alternative RPC endpoints if available - - ```javascript - networks: { - tac_testnet: { - url: "https://spb.rpc.tac.build", - timeout: 60000, // Increase timeout - httpHeaders: { - "User-Agent": "hardhat" - } - } - } - ``` - - - - **Problem**: Gas estimation fails for complex transactions - - **Solutions**: - - Set manual gas limit in deployment scripts - - Use gas reporter for optimization - - Test with smaller contract chunks - - ```javascript - const tx = await contract.deploy({ - gasLimit: 5000000, // Manual gas limit - gasPrice: ethers.utils.parseUnits("20", "gwei") - }); - ``` - - - - - -## Next Steps - -With Hardhat configured for TAC, you can now build sophisticated smart contracts that work with both EVM and TON ecosystems. - - - - Alternative development framework with advanced testing features - - - Build contracts that receive cross-chain messages from TON - - diff --git a/build/tooling/block-explorer.mdx b/build/tooling/block-explorer.mdx deleted file mode 100644 index 8cd66ad..0000000 --- a/build/tooling/block-explorer.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Block Explorer -description: "Explore TAC blockchain data with our custom Blockcout explorer featuring cross-chain operation tracking" ---- - -TAC uses a custom version of Blockcout that includes specialized features for tracking cross-chain operations and transactions between TON and TAC EVM. This enhanced explorer provides visibility into both standard EVM transactions and TAC's unique hybrid dApp functionality. - -## Available Explorers - - - - Mainnet Explorer provides live transaction monitoring, smart contract verification, cross-chain operation tracking, and real-time network statistics. - - - - Saint Petersburg Testnet Explorer provides development and testing, contract debugging, cross-chain transaction testing, and testnet activity monitoring. - - - -## Enhanced Features - -Our custom Blockcout implementation includes additional functionality designed specifically for TAC's hybrid dApp ecosystem: - - - - - - Monitor cross-chain transactions as they progress - through the TON Adapter system, including stage progression and completion - status. - - View connections between TON-side - transactions and their corresponding EVM executions. - - Track token movements between TON and TAC EVM with complete audit trails. - - - - - - - Complete transaction information including gas - usage, status, and event logs. - - Contract verification, - source code viewing, and interaction interfaces. - - Real-time network metrics, block information, and validator activity. - - - - -## Quick Links - - - - Verify your smart contracts directly through the explorer interface or use - Hardhat/Foundry verification commands pointing to the explorer's API - endpoints. - - - - Both explorers provide standard Blockcout API endpoints for programmatic - access to blockchain data and contract interactions. - - - - Use the operation tracking features to monitor the progress of cross-chain - transactions and debug hybrid dApp functionality. - - diff --git a/build/tooling/bridge.mdx b/build/tooling/bridge.mdx deleted file mode 100644 index f09b1e6..0000000 --- a/build/tooling/bridge.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Bridge -description: "Bridge assets between TON and TAC EVM using the official TAC bridge interface" ---- - -The TAC bridge allows you to transfer assets between TON and TAC EVM networks. Connect both your EVM and TON wallets to bridge tokens and test cross-chain functionality. - -## Available Bridges - - - - Bridge assets between TON and TAC mainnet with live tokens and real value transfers. - - - - Bridge testnet assets between TON testnet and SPB testnet for development and testing. - - - -## How to Use - - - - **Step 1:** Connect your EVM Wallet - - **Step 2:** Confirm adding TAC Network - - **Step 3:** Choose the asset you want to bridge - - - - **Step 1:** Check if Testnet is selected in your TON Wallet - - **Step 2:** Connect Wallet - - **Step 3:** Choose the asset you want to bridge - - - -## Quick Links - - - - Ensure both your EVM wallet and TON wallet are configured for the correct networks before bridging. - - - - Bridge supports TON native tokens, jettons, and TAC tokens between the - networks. - - - - Monitor your bridge transactions through the block explorers on both networks. - - diff --git a/build/tooling/contract-addresses.mdx b/build/tooling/contract-addresses.mdx deleted file mode 100644 index 77206e7..0000000 --- a/build/tooling/contract-addresses.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Contract Addresses -description: "Contract addresses for TAC Network" ---- - -This page lists all the contract addresses used in TAC for both TVM and EVM networks. - - - These addresses are for TON Adapter V2, which was released on 13th March 2025. - - -## TVM Networks - - - - **TVM Mainnet** - - | Contract Name | Address | - |---------------|---------| - | **CCL** | `EQAgpWmO8nBUrmfOOldIEmRkLEwV-IIfVAlJsphYswnuL80R` | - | **JettonProxy** | `EQAChAswsPNsU2k3A5ZDO_cfhWknCGS6WMG2Jz15USMwxMdw` | - | **Settings** | `EQBpUijPLYC9dcmw8Y-d23E9iX-2HBCupc5oqoYgXnORSRmi` | - | **NFTProxy** | `EQDDqOCQr6EPBmJnFF-dDKuNFLctG-SEYFhz66m17uisfLXh` | - - - - - - **TVM Testnet** - - | Contract Name | Address | - |---------------|---------| - | **CCL** | `EQAVGclLM4b0fb4pYRbS-OUUJiXlaTk8C0D1IueAzx6XgGo0` | - | **JettonProxy** | `EQAgBa6tNOqswtuRggf47BIO809mxHUgkkk5EYmfISDMJ_Zw` | - | **Settings** | `EQAf49rSyJGxh_OjoWJYwzpZCvVQdlYVNVy-DN3awXg8l5ZJ` | - | **NFTProxy** | `EQBfBBdZW4mowc1TRL3gQ07fQ-T3vvqOLa7yExRZmbR75hhJ` | - - - - -## EVM Networks - - - - **EVM Mainnet** - - | Contract Name | Address | - |---------------|---------| - | **CrossChainLayer** | `0x9fee01e948353E0897968A3ea955815aaA49f58d` | - | **Consensus** | `0xAe635dE674cFE4aFD179CDE441aBBE6504A20A98` | - | **MerkleTreeUtils** | `0xE11F57B7C650f9FeAcFCb414ab65F5A19bdFCc44` | - | **Settings** | `0x1278fc68146643D7a05baAb1531618613999828D` | - | **Smart Account Factory** | `0x070820Ed658860f77138d71f74EfbE173775895b` | - | **Smart Account Blueprint** | `0x3913eE8732F9675ACc2a266CbE7FAecc8b86CaCC` | - | **TokenUtils** | `0x6BE421FEf556c41170Cd3F652ee469837409AAF5` | - | **WTAC** | `0xB63B9f0eb4A6E6f191529D71d4D88cc8900Df2C9` | - | **Multicall** | `0xcA11bde05977b3631167028862bE2a173976CA11` | - - - - - - **EVM Testnet (Saint Petersburg)** - - | Contract Name | Address | - |---------------|---------| - | **CrossChainLayer** | `0x4f3b05a601B7103CF8Fc0aBB56d042e04f222ceE` | - | **Consensus** | `0x2BF0030eD6635BCc01aba0D991e1b087877e1cA5` | - | **MerkleTreeUtils** | `0x7c8CDB0Fd5AFD238d8e3782bc3c548859b19BAAb` | - | **Settings** | `0xF52a9A4C747Ce4BED079E54eB074d1C8879021D1` | - | **Smart Account Factory** | `0x510ee99eD721107851D692f761198E3dE4e9310D` | - | **Smart Account Blueprint** | `0xeAB80f5369689a2D142f25E654d9822A7725028B` | - | **TokenUtils** | `0xB9856463dE80753b0717E3d62DA6236c408734Df` | - | **WTAC** | `0xCf61405b7525F09f4E7501fc831fE7cbCc823d4c` | - | **Multicall** | `0xcA11bde05977b3631167028862bE2a173976CA11` | - - - diff --git a/build/tooling/developer-console.mdx b/build/tooling/developer-console.mdx deleted file mode 100644 index d0dfdde..0000000 --- a/build/tooling/developer-console.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Developer Console" -url: "https://console.tac.build" ---- diff --git a/core-concepts/components/proxy-apps.mdx b/core-concepts/components/proxy-apps.mdx deleted file mode 100644 index c258748..0000000 --- a/core-concepts/components/proxy-apps.mdx +++ /dev/null @@ -1,342 +0,0 @@ ---- -title: Proxy Apps -description: "Smart contracts that translate between TON and EVM, making cross-chain applications feel native to both ecosystems" ---- - -Proxy Apps are the interface layer that makes hybrid dApps possible. They consist of smart contracts on both TON and TAC EVM that handle the complexities of cross-chain communication, asset management, and protocol translation. From a user's perspective, proxy apps make EVM applications feel completely native to TON. - -## How Proxy Apps Work - -Proxy apps operate on both sides of the cross-chain bridge, each handling different aspects of the user experience and technical integration. - - - Proxy apps architectural diagram - - -### TON Side: SDK-Managed Proxies - -On the TON side, proxy functionality is handled automatically by the TAC SDK rather than requiring developers to write custom smart contracts. - -- **User Transaction Handling**: When a TON user initiates a transaction with a hybrid dApp, the SDK formats the request appropriately for cross-chain delivery. This includes encoding method parameters and preparing asset transfer instructions. - -- **Asset Locking**: The SDK manages the locking of user assets in the TON Adapter contracts. Users simply approve transactions in their familiar TON wallets, while the SDK handles the technical details of cross-chain asset preparation. - -- **Status Monitoring**: The SDK continuously monitors transaction status and provides real-time updates to the user interface. This allows hybrid dApps to show progress indicators and handle errors gracefully. - -- **Message Formatting**: All the complex message structuring required by the TON Adapter is handled automatically, including proper encoding of target addresses, method signatures, and parameters. - - - Developers don't need to write TON-side proxy contracts - the TAC SDK provides - all necessary functionality through JavaScript/TypeScript libraries. - - -### EVM Side: Custom Solidity Contracts - -On the TAC EVM side, developers create custom proxy contracts that receive and process cross-chain messages from the TON Adapter. - -- **Message Reception**: EVM proxy contracts implement specific function signatures that the TON Adapter calls when delivering cross-chain messages. These functions must accept exactly two `bytes` parameters: the TAC header and the application arguments. - -- **Header Decoding**: The first parameter contains encoded metadata about the cross-chain operation, including the original TON user's address, timestamp information, and unique operation identifiers. - -- **Parameter Processing**: The second parameter contains application-specific data encoded by the frontend. Proxy contracts decode these parameters to understand what operation the user wants to perform. - -- **Target Application Interaction**: After processing the cross-chain message, proxy contracts interact with the actual target applications - DEXes, lending protocols, NFT contracts, or any other EVM smart contracts. - -## EVM Proxy Contract Architecture - -### Required Function Signature - -All EVM proxy contracts must implement functions with this exact signature to receive cross-chain calls: - -```solidity -function myProxyFunction(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer -{ - // Implementation here -} -``` - -The function name can be customized, but the parameter structure is fixed by the TON Adapter protocol. - -### Security Modifiers - - - - - This critical security modifier ensures that only the TON Adapter's - CrossChainLayer contract can call proxy functions. Without this protection, - malicious actors could potentially call proxy functions directly and bypass - cross-chain validation. - - The modifier is inherited from base proxy contract classes and validates that `msg.sender` matches the authorized - CrossChainLayer address. - - - - - - Before proxy functions are called, the TON Adapter automatically transfers - any bridged assets to the proxy contract. Proxy contracts can trust that - these assets are available and properly validated. - - However, proxy contracts should still implement proper checks for expected asset amounts and types to - ensure they match the intended operation. - - - - -### TAC Header Structure - -The TAC header contains essential metadata about every cross-chain operation: - -```solidity -struct TacHeaderV1 { - uint64 shardsKey; // Unique identifier for linked transactions - uint256 timestamp; // Block timestamp from TON - bytes32 operationId; // Unique operation identifier - string tvmCaller; // Original TON user's wallet address - bytes extraData; // Additional data from sequencers -} -``` - -Proxy contracts decode this header to access information about the original user and operation context. - -## Development Patterns - -### Basic Proxy Contract Template - -```solidity -pragma solidity ^0.8.28; - -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { TacProxyV1 } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; -import { TokenAmount, OutMessageV1, TacHeaderV1 } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; - -contract MyDeFiProxy is TacProxyV1 { - IDeFiContract public targetContract; - - constructor(address _targetContract, address _crossChainLayer) - TacProxyV1(_crossChainLayer) - { - targetContract = IDeFiContract(_targetContract); - } - - function executeSwap(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer - { - // Decode the TAC header - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - - // Decode application-specific arguments - SwapParams memory params = abi.decode(arguments, (SwapParams)); - - // Approve tokens for the target contract - IERC20(params.tokenIn).approve(address(targetContract), params.amountIn); - - // Execute the swap - uint256 amountOut = targetContract.swap( - params.tokenIn, - params.tokenOut, - params.amountIn, - params.minAmountOut - ); - - // Prepare return message with result tokens - TokenAmount[] memory returnTokens = new TokenAmount[](1); - returnTokens[0] = TokenAmount(params.tokenOut, amountOut); - - // Approve CrossChainLayer to handle return assets - IERC20(params.tokenOut).approve(_getCrossChainLayerAddress(), amountOut); - - // Send result back to TON - _sendMessageV1(OutMessageV1({ - shardsKey: header.shardsKey, - tvmTarget: header.tvmCaller, - tvmPayload: "", - toBridge: returnTokens - })); - } -} -``` - -### Upgradeable Proxy Contracts - -For applications that need upgrade capabilities, TAC provides upgradeable proxy contract templates: - -```solidity -pragma solidity ^0.8.28; - -import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { TacProxyV1Upgradeable } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1Upgradeable.sol"; - -contract MyUpgradeableProxy is - Initializable, - OwnableUpgradeable, - UUPSUpgradeable, - TacProxyV1Upgradeable -{ - function initialize(address owner, address crossChainLayer) public initializer { - __UUPSUpgradeable_init(); - __Ownable_init(owner); - __TacProxyV1Upgradeable_init(crossChainLayer); - } - - function _authorizeUpgrade(address) internal override onlyOwner {} - - // Proxy functions implement the same patterns as non-upgradeable contracts -} -``` - -## Asset Handling - -Proxy contracts must carefully manage assets as they flow between chains and interact with target applications. - -### Automatic Asset Transfer - -- **Pre-Function Execution**: Before calling proxy functions, the TON Adapter automatically transfers bridged assets to the proxy contract. This includes both newly minted tokens (from TON) and unlocked tokens (from previous EVM operations). - -- **Asset Availability**: Proxy contracts can immediately use these assets without additional transfer operations. The amounts are guaranteed to match what was specified in the original cross-chain message. - -- **Asset Validation**: While the TON Adapter validates assets during message processing, proxy contracts should implement additional checks to ensure received assets match expected parameters. - -### Target Contract Integration - -```solidity -function processLiquidityAddition(bytes calldata tacHeader, bytes calldata arguments) - external - _onlyCrossChainLayer -{ - TacHeaderV1 memory header = _decodeTacHeader(tacHeader); - LiquidityParams memory params = abi.decode(arguments, (LiquidityParams)); - - // Approve both tokens for the liquidity pool - IERC20(params.tokenA).approve(address(liquidityPool), params.amountA); - IERC20(params.tokenB).approve(address(liquidityPool), params.amountB); - - // Add liquidity and receive LP tokens - uint256 lpTokens = liquidityPool.addLiquidity( - params.tokenA, - params.tokenB, - params.amountA, - params.amountB, - params.minAmountA, - params.minAmountB - ); - - // Return LP tokens to user on TON - TokenAmount[] memory returnAssets = new TokenAmount[](1); - returnAssets[0] = TokenAmount(address(liquidityPool), lpTokens); - - IERC20(address(liquidityPool)).approve(_getCrossChainLayerAddress(), lpTokens); - - _sendMessageV1(OutMessageV1({ - shardsKey: header.shardsKey, - tvmTarget: header.tvmCaller, - tvmPayload: "", - toBridge: returnAssets - })); -} -``` - -### Return Message Creation - -When operations complete successfully, proxy contracts can send assets and data back to TON users through return messages. - -- **Asset Preparation**: Any tokens being returned must be approved for the CrossChainLayer contract to handle the bridging process. - -- **Message Structure**: Return messages use the same `OutMessageV1` structure, specifying the target TON address, assets to bridge, and optional payload data. - -- **Automatic Processing**: The TON Adapter handles return messages through the same consensus mechanism, ensuring secure delivery back to TON users. - -## Proxy Generation and Deployment - -For complex applications with unique requirements, developers create custom proxy contracts that implement specific business logic. - -- **Complex State Management**: Applications with sophisticated state transitions or multi-step operations require custom proxy logic to handle the complexity properly. - -- **Integration Requirements**: When integrating with multiple protocols or handling complex asset flows, custom proxies provide the flexibility needed for proper implementation. - -- **Business Logic**: Unique application requirements like custom validation rules, special fee structures, or complex user permissions need custom proxy development. - -## Testing and Development - -### Local Testing Environment - -TAC provides comprehensive testing utilities for proxy contract development: - -```typescript -import { - TacLocalTestSdk, - JettonInfo, - TokenMintInfo, -} from "@tonappchain/evm-ccl"; - -describe("Proxy Contract Tests", () => { - let testSdk: TacLocalTestSdk; - let proxyContract: MyProxy; - - before(async () => { - testSdk = new TacLocalTestSdk(); - const crossChainLayerAddress = testSdk.create(ethers.provider); - - proxyContract = await deployProxy(crossChainLayerAddress); - }); - - it("should handle cross-chain token swap", async () => { - const jettonInfo: JettonInfo = { - tvmAddress: "JettonMinterAddress", - name: "TestToken", - symbol: "TEST", - }; - - const result = await testSdk.sendMessage( - shardsKey, - proxyAddress, - "executeSwap(bytes,bytes)", - encodedArguments, - tvmCaller, - [tokenMintInfo], - [tokenUnlockInfo], - tacAmount, - extraData, - operationId, - timestamp - ); - - expect(result.receipt.status).to.equal(1); - expect(result.outMessages.length).to.equal(1); - }); -}); -``` - -### Integration Testing - -- **Cross-Chain Simulation**: The testing SDK simulates the complete cross-chain flow, including sequencer validation and asset bridging operations. - -- **Asset Management Testing**: Tests verify that assets are properly locked, minted, burned, and unlocked throughout the cross-chain process. - -- **Error Scenario Handling**: Testing includes failure cases to ensure proxy contracts handle errors gracefully and protect user assets. - -## What's Next? - -Understanding proxy apps helps you build the interface layer that makes hybrid dApps possible. Explore related concepts to build more sophisticated applications. - - - - Learn how the SDK handles TON-side proxy functionality - - - Dive deeper into message structure and validation - - diff --git a/core-concepts/components/sequencer-network.mdx b/core-concepts/components/sequencer-network.mdx deleted file mode 100644 index e3c32fe..0000000 --- a/core-concepts/components/sequencer-network.mdx +++ /dev/null @@ -1,312 +0,0 @@ ---- -title: Sequencer Network -description: "The distributed network of nodes that validates and processes cross-chain messages through consensus" ---- - -The Sequencer Network is the operational backbone of the TON Adapter, consisting of distributed nodes that collect, validate, and reach consensus on cross-chain messages. These sequencers ensure that messages between TON and TAC EVM are processed securely and reliably through a multi-layered validation system. - - - **Current Network Status**: The sequencer network is currently distributed but - not decentralized. Full decentralization is on the roadmap as the network - matures. - - -## Core Functions - -Sequencers perform several critical functions that enable secure cross-chain communication: - -- **Transaction Collection**: Sequencers continuously monitor both TON and TAC EVM chains for relevant events. When users initiate cross-chain operations, sequencers detect these events and store them in local databases for processing. - -- **Data Validation**: Before participating in consensus, each sequencer validates transaction data locally. This includes verifying that asset transfers match message parameters and ensuring users have sufficient balances for requested operations. - -- **Merkle Tree Formation**: At regular intervals determined by network parameters, sequencers compile validated transactions into Merkle trees. These trees provide cryptographic proof of transaction inclusion and enable efficient consensus. - -- **Consensus Participation**: Sequencers work together in groups to reach agreement on transaction validity, with each group requiring 3/5 internal consensus before submitting to the broader network. - -## Sequencer Groups - -The network organizes individual sequencers into groups to enhance security through redundancy and distributed validation. - - - Sequencer network group structure - - -### Group Formation and Management - -- **Approval Process**: Sequencer groups are not permissionless - they require approval through DAO voting or multisig processes. This ensures that only trusted entities with proper infrastructure and incentives can participate in securing cross-chain messages. - -- **Group Composition**: Each group contains multiple sequencer nodes owned by a specific entity. This could be a trusted dApp, infrastructure provider, or other stakeholder with strong incentives to maintain network security. - -- **Internal Operations**: Within each group, sequencers operate independently but must coordinate to reach consensus. This internal redundancy protects against individual node failures while maintaining group-level reliability. - -### Economic Requirements - - - - Each sequencer group must maintain approved collateral above a minimum threshold: - - - **Liquid Staking Tokens**: stTON (TON Liquid Staking Tokens) - - **Ethereum LSTs**: wstETH, stETH (when Agglayer integration is live) - - **Other DAO-approved**: Additional liquid staking derivatives as voted by governance - - Minimum threshold set by DAO governance - - Higher collateral demonstrates stronger commitment and earns proportionally higher rewards - - - - Groups can modify their collateral when changing proofs, but there are - protections in place to prevent abuse. If an incorrect proof is submitted, - there's a time window for other groups to issue penalties before collateral - can be withdrawn. This system ensures that groups maintain skin in the game - throughout their participation in the network. - - - - Higher collateral amounts lead to increased profitability, creating natural - incentives for groups to stake substantial amounts. - - This aligns economic incentives with network security requirements. - - - -## Consensus Mechanism - -The sequencer network achieves consensus through a multi-layer validation process that ensures security while maintaining operational efficiency. - -### Network-Level Consensus - -- **Cross-Group Validation**: For a Merkle tree to be accepted by the network, multiple independent groups must submit identical trees. This requirement prevents any single group from manipulating the message flow or processing incorrect transactions. - -- **Consensus Threshold**: The network requires agreement from enough groups to ensure security. This threshold is configurable through DAO governance to balance security requirements with operational efficiency. - -- **Tree Application**: Only when sufficient groups submit matching trees does the CrossChainLayer smart contract accept the tree for transaction execution. - -## Transaction Processing Flow - - - - Sequencers monitor both TON and TAC EVM chains for cross-chain events. When - a user initiates a transaction, multiple sequencers detect it simultaneously - and begin validation processes. - - - - Each sequencer validates the transaction locally, checking asset transfers, - user balances, and message parameters. Only valid transactions proceed to the - next stage. - - - - Validated transactions are stored in each sequencer's local database, creating - a distributed record of all cross-chain activity during the current epoch. - - - - At the end of each epoch, sequencers compile their validated transactions into - Merkle trees and submit root hashes to their respective SequencerGroup - contracts. - - - - Groups work to reach 3/5 internal agreement on their Merkle trees. - Successfully agreed-upon trees are submitted to the network for cross-group - validation. - - - - Multiple groups must submit identical trees for network acceptance. Once - sufficient groups agree, the tree becomes eligible for execution. - - - - Validated transactions are executed on the target chain using cryptographic - proofs from the consensus-approved Merkle trees. - - - -## Economic Security Model - -The sequencer network's security relies on economic incentives that align participant behavior with network health. - -### Reward Structure - -- **Stake-Based Selection**: Executors are chosen for specific transactions based on their collateral amounts. Higher stake increases the probability of selection and larger potential rewards. - -- **Proportional Distribution**: At the end of each execution round, rewards are distributed proportionally to sequencer stakes, regardless of who actually performed the execution. - -- **Performance Incentives**: This system incentivizes sequencers to maintain higher collateral commitments while ensuring rewards are fairly distributed based on economic contribution. - -### Penalty Mechanisms - - - The network includes robust penalty systems to discourage malicious behavior - and maintain security standards. - - -- **Penalty Applications**: Other sequencer groups can submit penalty applications to the Penalty smart contract when they detect incorrect behavior or invalid proofs. - -- **Collateral Locking**: If enough groups agree on a penalty application, partial collateral locking occurs while the penalty is investigated and resolved. - -- **Network Voting**: Penalty resolution happens through network-wide voting, ensuring that punishments are applied fairly and only when warranted. - -## Epoch-Based Processing - -The sequencer network operates on an epoch-based system that provides structure and predictability to cross-chain message processing. - -### Epoch Structure - -- **Time-Based Windows**: Each epoch represents a specific time period during which transactions are collected and processed together. The epoch duration is configurable through DAO governance. - -- **Deterministic Timing**: Epoch boundaries are calculated using the formula: - -``` -EpochId = (currentTime - protocolDeployTime) / epochDuration -``` - -- **Processing Boundaries**: Transactions are processed within specific timeframes: - -``` -[protocolDeployTime + EpochId × epochDuration, - protocolDeployTime + (EpochId + 1) × epochDuration] -``` - -### Benefits of Epoch Processing - -- **Ordered Processing**: The epoch system ensures that all sequencers work with the same set of transactions, preventing timing-based attacks and inconsistencies. - -- **Batch Efficiency**: Processing transactions in batches is more efficient than handling them individually and provides better opportunities for validation and consensus. - -- **Predictable Timing**: Users and applications can understand approximately when their transactions will be processed based on epoch timing. - -## Governance and Elections - -The sequencer network operates under distributed governance that manages participation and network parameters. - -### Election Cycles - -- **Regular Elections**: The system includes regular election cycles every N hours, where N is configurable through DAO voting. This ensures that sequencer participation remains current and responsive to network needs. - -- **Performance Monitoring**: During election cycles, sequencer performance is evaluated based on reliability, accuracy, and participation in consensus. - -- **Dynamic Participation**: The election system allows for adding new groups and removing underperforming ones based on community governance decisions. - -### Parameter Management - - - - **Epoch Duration**: The length of processing windows can be adjusted to - balance security with performance requirements. **Consensus Thresholds**: - The number of groups required for network consensus can be modified based on - security needs and participation levels. **Timing Windows**: Various timeout - and processing windows can be tuned for optimal network performance. - - - - **Minimum Stake**: The required collateral amounts for group participation can - be adjusted based on network security requirements. **Reward Rates**: The - distribution of rewards to sequencers can be modified to maintain proper - incentive alignment. **Penalty Amounts**: The severity of penalties for - malicious behavior can be calibrated to ensure effective deterrence. - - - - **Group Requirements**: The approval criteria for new sequencer groups can - be refined based on network experience. **Validation Rules**: The specific - validation requirements for transactions can be enhanced as new attack - vectors are identified. **Monitoring Systems**: Performance and security - monitoring can be improved through governance-approved updates. - - - -## Executor Mechanism - -TAC employs a separation of responsibilities between cross-chain message sequencing and execution, with designated executors handling the final transaction processing. - -### Executor Selection and Assignment - - - - **Open executor network:** - Any participant can become an executor without - central approval - No collateral requirements for executors (security - through cryptographic proofs) - Executors compete for transaction processing - opportunities - Selection based on assignment specified in cross-chain - messages - - - - **Message-specific executor designation:** - Each cross-chain message - specifies which executor is authorized to process it - For round-trip - operations (TON → TAC → TON), two executors must be specified - - CrossChainLayer contract verifies executor authorization before execution - - Only designated executor can claim rewards for processing - - - -### Executor Responsibilities - - - - **Primary execution duties:** - Submit finalized message batches with Merkle - proofs to CrossChainLayer contract - Verify cryptographic proofs of - consensus approval - Trigger asset minting/unlocking operations before - contract calls - Execute target smart contract methods with validated - parameters - - - - **Reward collection and verification:** - Estimate gas usage before - execution using Merkle proofs - Verify attached fees cover execution costs - (gas + overhead) - Collect executor fees upon successful transaction - completion - Optional subsidization of small fee deficits for UX - preservation - - - - **Future enhancement capabilities:** - Provide oracle data during message - execution (planned feature) - Access to up-to-date market data and external - information - Enhanced execution context for complex cross-chain operations - - - -### Security Through Cryptography - -**No Collateral Required:** - -- Executor security guaranteed through cryptographic proofs rather than economic staking -- Merkle proofs ensure only consensus-approved messages can be executed -- CrossChainLayer contract validates all proofs before allowing execution -- Eliminates need for executor collateral or centralized approval processes - -## Future Evolution - -The modular design of the sequencer network allows for future improvements and adaptations as the network grows and requirements evolve. - -### Planned Enhancements - -- **FROST Consensus Upgrade**: Migration to FROST-Ed25519 threshold signatures with DKG -- **Enhanced Oracle Integration**: Expanded oracle services during execution -- **Scalability Improvements**: Support for more groups, shorter epochs, efficient consensus -- **Additional Blockchain Support**: Potential expansion beyond TON and TAC EVM - -## What's Next? - -Understanding the sequencer network helps you appreciate how TAC maintains security and reliability for cross-chain operations. - - - - Learn how sequencers process and validate messages - - - Understand how sequencers handle token operations - - diff --git a/core-concepts/components/tac-evm-layer.mdx b/core-concepts/components/tac-evm-layer.mdx deleted file mode 100644 index f12c4e7..0000000 --- a/core-concepts/components/tac-evm-layer.mdx +++ /dev/null @@ -1,255 +0,0 @@ ---- -title: TAC EVM Layer -description: "A complete Layer 1 blockchain providing full EVM compatibility built on Cosmos SDK" ---- - -The TAC EVM Layer is a fully-fledged Layer-1 blockchain environment based on Cosmos SDK technology. It provides a secure and scalable execution environment specifically optimized for Ethereum-compatible smart contracts, allowing existing EVM dApps to be deployed without modifications or code rewrites, achieving ≈2-second finality through dPoS. - -## Technical Foundation - -TAC EVM Layer combines proven blockchain technologies to deliver a robust execution environment that feels familiar to Ethereum developers. - - - TAC EVM Layer technical stack - - -### Core Technology Stack - - - - The latest Cosmos SDK provides the modular blockchain framework that powers - TAC EVM Layer. This battle-tested foundation offers built-in modules for - staking, governance, and inter-blockchain communication, while allowing - custom modules for TAC-specific functionality. - - The SDK's modular architecture enables TAC to implement features like the TON Adapter - integration directly at the blockchain level, rather than as external - bolt-on solutions. - - - - -TAC EVM Layer implements native EVM execution directly within the Cosmos SDK -framework. This isn't a compatibility layer or virtual machine running on top -of another VM - it's true EVM execution with modern consensus guarantees. - -Every Ethereum opcode, gas calculation, and state transition rule works -exactly as it does on Ethereum mainnet, ensuring 100% compatibility for -existing Solidity contracts. - - - - - - -## Performance Characteristics - -TAC EVM Layer maintains the security guarantees developers expect from a production blockchain built on Cosmos SDK. - - - - - **≈2-second finality** through Tendermint consensus mechanism provides - deterministic execution and fast block confirmation. Transactions are - irreversibly confirmed with minimal latency. - - **No reorganizations** are possible due to Tendermint's BFT consensus model. This - eliminates edge cases where transactions might be reversed or reordered - after confirmation. - - - - - -**Configurable gas limits** allow the network to adapt to demand through -governance proposals, balancing throughput with -decentralization requirements. - -**Parallel execution potential** exists within the Cosmos SDK framework, enabling future optimizations as the network grows. - - - - - - **EIP-1559 gas management** provides predictable transaction fees with - automatic fee adjustment based on network demand. Users get the same fee - predictability they expect from modern Ethereum. - - **Fee token flexibility** allows transaction fees to be paid in TAC tokens, while still - supporting ETH-denominated gas calculations for contract compatibility. - - - - -## Developer Experience - -TAC EVM Layer maintains complete compatibility with the Ethereum development ecosystem while providing enhanced debugging and development capabilities. - -### Tool Compatibility - -Every tool in the Ethereum ecosystem works seamlessly with TAC EVM Layer: - - - - Hardhat, Truffle, Foundry, and Remix work without configuration changes. - Deploy scripts, test suites, and build processes transfer directly. - - - - MetaMask, WalletConnect, and other Web3 wallets connect by simply adding TAC - as a custom network. No special plugins required. - - - - - - Web3.js, Ethers.js, and Viem work exactly as they do with Ethereum. Contract - ABIs and interaction patterns remain identical. - - - - Block explorers, indexers, and monitoring tools designed for Ethereum can - index TAC EVM Layer with minimal configuration. - - - -## Security Model - -TAC EVM Layer employs a dual-layer security approach that provides both immediate operational security and long-term economic security. - -### Primary Security: Delegated Proof of Stake - -The core security of TAC EVM Layer comes from a delegated Proof of Stake consensus mechanism built on the latest Cosmos SDK. - -- **Validator Selection**: The network supports a configurable number of validators (to be determined before mainnet launch). Anyone can become a validator by staking TAC tokens and maintaining the required infrastructure. - -- **Delegation System**: TAC token holders can delegate their stake to validators, earning rewards while contributing to network security. This allows broader participation in securing the network without requiring users to run validator infrastructure. - -- **Immediate Finality**: The BFT consensus provides immediate finality with a 67% supermajority requirement. This means transactions are final the moment they're included in a block, with no possibility of reversal. - -- **Slashing Protection**: Validators face automatic slashing for provable misbehavior like double-signing or extended downtime. This creates strong economic incentives for reliable, honest participation. - -### Enhanced Security: Babylon Bitcoin Staking - -TAC EVM Layer integrates with Babylon's Bitcoin staking protocol to add an additional layer of economic security. - - - Bitcoin staking provides enhanced security but introduces slight delays in - finality. Most applications can rely on the immediate dPoS finality for - optimal user experience. - - - - - - Bitcoin holders can stake their BTC in a self-custodial manner directly on - the Bitcoin blockchain. They delegate to Babylon validators who then provide - additional signatures on TAC EVM Layer blocks. - - If a Babylon validator double-signs a TAC block, the Babylon protocol automatically slashes the - staked Bitcoin, providing economic security proportional to the amount of - Bitcoin at stake. - - - - - -The Bitcoin staking layer adds massive economic security to TAC EVM Layer. An -attacker would need to overcome both the dPoS validators and the Bitcoin -stakers, making attacks exponentially more expensive. - -This dual security model provides some of the strongest economic guarantees available in the blockchain -space, backed by Bitcoin's security budget. - - - - - - While dPoS provides immediate finality, Bitcoin-secured finality takes - longer due to Bitcoin's block times and the additional validation required. - - Most applications can treat dPoS finality as sufficient for operational - purposes while benefiting from the enhanced long-term security of Bitcoin - staking. - - - - -## Gas and Fee Structure - -TAC EVM Layer implements familiar gas mechanics with improvements for predictability and efficiency. - -### EIP-1559 Implementation - -TAC EVM Layer uses EIP-1559 gas pricing for predictable transaction fees: - -```solidity -// Gas calculations work exactly like Ethereum -uint256 gasUsed = gasLimit - gasleft(); -uint256 effectiveGasPrice = baseFee + min(maxPriorityFee, maxFeePerGas - baseFee); -uint256 totalCost = gasUsed * effectiveGasPrice; -``` - -- **Base Fee**: Automatically adjusts based on network congestion, providing predictable pricing for users. - -- **Priority Fee**: Allows users to pay extra for faster inclusion during high-demand periods. - -- **Fee Burning**: A portion of transaction fees are burned, creating deflationary pressure on TAC tokens. - -## Integration with TON Adapter - -TAC EVM Layer includes native integration points for the TON Adapter system, enabling seamless cross-chain functionality. - -### Cross-Chain Layer Contract - -A system-level contract manages all interactions with the TON Adapter: - -```solidity -interface ICrossChainLayer { - function receiveMessage( - bytes32 messageHash, - bytes calldata merkleProof, - MessageData calldata message - ) external; - - function sendMessage( - OutMessageV1 calldata outMessage - ) external; -} -``` - -This contract is deployed at the genesis block and handles all cross-chain message routing, asset operations, and validation. - -### Asset Management - -TAC EVM Layer includes specialized contracts for managing bridged assets from TON: - -- **Token Factory**: Automatically deploys ERC-20 contracts for TON jettons when they first cross to TAC EVM Layer. - -- **Asset Registry**: Maintains the mapping between TON asset addresses and their TAC EVM equivalents. - -- **Bridge Contracts**: Handle the locking and unlocking of assets as they move between chains. - -## What's Next? - -The TAC EVM Layer provides the execution foundation for hybrid dApps. Understanding how it connects to other TAC components helps you build more effective applications. - - - - Learn how messages flow between TAC EVM Layer and TON - - - Discover how smart contracts receive cross-chain messages - - diff --git a/core-concepts/components/tac-sdk.mdx b/core-concepts/components/tac-sdk.mdx deleted file mode 100644 index 6e832b8..0000000 --- a/core-concepts/components/tac-sdk.mdx +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: TAC SDK -description: "JavaScript library that enables frontend developers to build hybrid dApps connecting TON wallets with EVM applications" ---- - -The TAC SDK is a JavaScript/TypeScript library that makes it simple for frontend developers to create hybrid dApps. It abstracts away the complexities of cross-chain messaging, allowing developers to focus on building great user experiences while the SDK handles wallet connections, transaction routing, and asset bridging automatically. - -## What the SDK Solves - -Building hybrid dApps traditionally requires deep understanding of multiple blockchain protocols, cross-chain messaging systems, and complex asset management. - -The TAC SDK eliminates this complexity by providing a simple JavaScript interface that handles all the technical details behind the scenes. - - - - - - Custom cross-chain message formatting - - Manual asset locking and minting logic - - Complex wallet integration across chains - - Custom transaction status tracking - - Error handling for multiple failure modes - - - - - - - Single method for cross-chain transactions - - Automatic asset bridging - - Built-in TON wallet support - - Real-time status tracking - - Comprehensive error handling - - - - -## Core Capabilities - -The SDK provides four essential capabilities that make hybrid dApp development straightforward: - -### TON Wallet Integration - -The SDK handles all aspects of TON wallet connectivity through the standard TON Connect protocol. Users can connect with popular wallets like Tonkeeper and Tonhub without installing additional software or managing new seed phrases. - -```javascript -// Simple wallet connection -const tacSdk = await TacSdk.create({ network: Network.TESTNET }); -const sender = await SenderFactory.getSender({ tonConnect: tonConnectUI }); -``` - -### Cross-Chain Transaction Routing - -Developers specify what they want to happen on the EVM side, and the SDK handles all the complex message formatting and routing through the TON Adapter. - -```javascript -// Send tokens to an EVM DEX for swapping -const transactionLinker = await tacSdk.sendCrossChainTransaction( - evmProxyMsg, // What to call on EVM - sender, // TON wallet - assets // Tokens to bridge -); -``` - -### Automatic Asset Bridging - -Token transfers between TON and TAC EVM happen automatically. The SDK manages locking tokens on TON, minting them on EVM, and handling the reverse process seamlessly. - -### Real-Time Status Tracking - -The SDK provides comprehensive tools for monitoring cross-chain transactions, allowing applications to show users exactly what's happening and when operations complete. - -## How It Works - - - TAC SDK workflow diagram - - -The SDK acts as a bridge between your frontend application and TAC's cross-chain infrastructure: - - - - Developers integrate the SDK into their frontend applications and specify - EVM operations using familiar JavaScript patterns. - - - - The SDK formats cross-chain messages with proper encoding, handles asset - preparation, and manages wallet interactions. - - - - Messages are routed through the TON Adapter's sequencer network, which - validates and processes them securely. - - - - Target EVM contracts receive properly formatted calls with bridged assets, - executing the requested operations. - - - - The SDK monitors progress and provides real-time updates to the frontend, - handling completion or failure scenarios. - - - -## Key Components - -The SDK is organized into focused components that handle different aspects of hybrid dApp functionality: - - -The primary class that developers interact with for all cross-chain operations. It handles SDK initialization, transaction sending, token address mapping, and balance queries. - -Key features include sending cross-chain transactions, getting token addresses across chains, checking user balances, and managing SDK lifecycle. - - - - -Provides comprehensive tools for tracking cross-chain transaction status and progress. Applications can monitor operations in real-time and provide users with accurate updates. - -Supports both simplified status checking (Pending/Successful/Failed) and detailed stage-by-stage tracking for advanced use cases. - - - - -Handles transaction signing and submission through different wallet types. Supports TON Connect for web applications and raw private keys for backend services. - -Provides a unified interface regardless of the underlying wallet technology, simplifying application development. - - - -## Development Experience - -The SDK is designed to feel familiar to web developers while providing powerful cross-chain capabilities: - -### Familiar Patterns - -```javascript -// Standard async/await patterns -const result = await tacSdk.sendCrossChainTransaction(message, sender, assets); - -// Promise-based error handling -try { - const status = await tracker.getOperationStatus(operationId); -} catch (error) { - handleTransactionError(error); -} - -// Standard configuration objects -const sdk = await TacSdk.create({ - network: Network.TESTNET, - delay: 1, -}); -``` - -### TypeScript Support - -The SDK provides comprehensive TypeScript definitions, enabling better development experience with IDE autocompletion and compile-time error checking. - -### Testing Utilities - -Built-in testing and simulation capabilities help developers validate their integrations before deployment: - -```javascript -// Simulate transactions before sending -const simulation = await tacSdk.getTransactionSimulationInfo(params); - -// Automated status tracking for testing -await startTracking(transactionLinker, Network.TESTNET); -``` - -## Message Structure - -The SDK uses standardized data structures that map naturally to JavaScript objects while handling the complex encoding required for cross-chain operations. - -### EVM Target Messages - -Developers specify EVM operations using a simple structure that the SDK automatically encodes for cross-chain delivery: - -```javascript -const evmProxyMsg = { - evmTargetAddress: "0x742d35Cc6473...", // Contract to call - methodName: "swapTokens(bytes,bytes)", // Method signature - encodedParameters: encodedArgs, // ABI-encoded parameters -}; -``` - -### Asset Bridging - -Token transfers are specified using user-friendly amounts that the SDK automatically converts to the proper formats for each chain: - -```javascript -const assets = [ - { - address: "EQTokenAddress...", // TON token address - amount: 10.5, // User-friendly amount - }, - { - // Native TON (no address needed) - amount: 1.0, - }, -]; -``` - -## Error Handling - -The SDK provides comprehensive error handling that protects user assets and provides meaningful feedback: - - - - The SDK validates parameters, checks balances, and estimates gas costs - before submitting transactions, preventing common failure scenarios. - - - - Built-in retry mechanisms and fallback endpoints ensure operations continue - even when individual network components experience issues. - - - - Failed transactions automatically trigger rollback mechanisms that return - assets to users safely, preventing fund loss. - - - -## Getting Started - - - - Install and configure the TAC SDK in your application - - - Learn how the SDK formats messages for secure delivery - - diff --git a/core-concepts/components/ton-adapter.mdx b/core-concepts/components/ton-adapter.mdx deleted file mode 100644 index d6bd5c9..0000000 --- a/core-concepts/components/ton-adapter.mdx +++ /dev/null @@ -1,285 +0,0 @@ ---- -title: TON Adapter -description: "The distributed messaging system that securely connects TON and TAC EVM through sequencer consensus" ---- - -The TON Adapter is the cross-chain messaging backbone of TAC, enabling secure communication between TON and TAC EVM Layer. Unlike traditional bridges that simply move assets, the TON Adapter is designed specifically for application-level interactions, allowing TON users to execute complex operations on EVM smart contracts seamlessly. - - - **Current Network Status**: The sequencer network is currently distributed but - not decentralized. Full decentralization is on the roadmap as the network - matures. - - -## Core Purpose - -The TON Adapter solves a fundamental challenge in cross-chain interaction: how to securely execute smart contract calls across different blockchain architectures while maintaining user experience that feels native to both sides. - - - TON Adapter message flow diagram - - -## Message Structure - -Every cross-chain operation begins with a structured message that contains all necessary information for secure execution: - -```javascript -{ - timestamp: 1640995200, // TON blockchain timestamp - target: "0x742d35Cc6473...", // Target smart contract address - methodName: "swapTokens(bytes,bytes)", // Method signature - arguments: "0x1234...", // Encoded method parameters - caller: "EQAbc123...", // Original TON caller address - mintTokens: [...], // Tokens to mint on TAC EVM - unlockTokens: [...] // Tokens to unlock from previous locks -} -``` - -This message structure ensures that sequencers have all the information needed to validate the operation and execute it correctly on the target chain. - -## Sequencer Network - -The security and reliability of the TON Adapter depends on a distributed network of sequencers that validate and process cross-chain messages. - -### Individual Sequencer Operations - -Each sequencer in the network operates independently while following the same validation protocols: - -- **Event Monitoring**: Sequencers continuously monitor both TON and TAC EVM for relevant events. When a user initiates a cross-chain transaction, multiple sequencers detect the event simultaneously. - -- **Local Validation**: Before participating in consensus, each sequencer validates the transaction locally. This includes verifying asset transfers match message parameters and ensuring the requesting user has sufficient balances. - -- **Database Storage**: Validated events are stored in each sequencer's local database, creating a distributed record of all cross-chain activity. - -- **Merkle Tree Formation**: At regular intervals determined by network parameters, sequencers compile their validated transactions into Merkle trees, creating cryptographic proofs of transaction inclusion. - -### Sequencer Groups - -The network organizes sequencers into groups to enhance security through redundancy and consensus requirements. - - - - - Sequencer groups are formed through governance processes rather than - permissionless joining. Each group represents a trusted entity that can run - multiple sequencer nodes for redundancy. - - Groups might represent established protocols, infrastructure providers, or other stakeholders with strong - incentives to maintain network security and reliability. - - - - - -Within each group, sequencers must reach 3/5 agreement before submitting their -Merkle tree to the network. This internal consensus requirement prevents -individual sequencer failures or attacks from affecting the group's -participation. - -Groups submit their root hashes to the SequencerGroup smart contract, where the system verifies the submitting wallet's authorization and -tracks the signature count. - - - - - - Each group must maintain collateral above a minimum threshold set by DAO - governance. While collateral size doesn't influence voting power, it affects - profitability and provides economic security. - - Higher collateral demonstrates commitment to network security and increases potential rewards, creating - natural incentives for groups to stake substantial amounts. - - - - -### Network-Wide Consensus - -Cross-chain messages only execute after achieving consensus across multiple sequencer groups: - -- **Cross-Group Validation**: Different groups must submit identical Merkle trees for the same set of transactions. This requirement prevents any single group from manipulating the message flow. - -- **Consensus Threshold**: The network requires agreement from enough groups to ensure security. The exact threshold is configurable through governance to balance security with efficiency. - -- **Execution Triggers**: Once sufficient groups agree on a Merkle tree, the transactions within that tree become eligible for execution on the target chain. - -## Asset Management - -The TON Adapter handles two primary types of asset operations as tokens move between chains. - -### Lock and Mint Operations - -When assets move from TON to TAC EVM, the TON Adapter employs a lock-and-mint mechanism: - -- **Asset Locking**: TON native tokens are locked in the TON Adapter contracts on the TON side. This prevents double-spending while maintaining the original asset's existence. - -- **Metadata Capture**: The system captures essential token information including name, symbol, decimals, and the original TON contract address. - -- **EVM Token Deployment**: If this is the first time a particular TON token crosses to TAC EVM, the system automatically deploys a corresponding ERC-20 contract. - -- **Token Minting**: The equivalent amount of tokens is minted on the TAC EVM side, maintaining supply consistency across both chains. - -### Burn and Release Operations - -The reverse process handles assets moving from TAC EVM back to TON: - -- **Asset Burning**: ERC-20 tokens on TAC EVM are burned, removing them from circulation on that side. - -- **Validation**: Sequencers verify the burn operation and confirm the requesting user's authorization. - -- **Asset Release**: The corresponding locked tokens are released back to the user's TON wallet. - -## Epoch-Based Processing - -The TON Adapter organizes transaction processing into time-based epochs to ensure orderly and secure message handling. - -### Epoch Calculation - -Each epoch is calculated using a deterministic formula: - -```javascript -EpochId = Math.floor((currentTime - protocolDeployTime) / epochDuration); -``` - -This creates predictable time windows during which transactions are collected and processed together. - -### Processing Windows - -Transactions are processed within specific timeframes: - -```javascript -const epochStart = protocolDeployTime + EpochId * epochDuration; -const epochEnd = protocolDeployTime + (EpochId + 1) * epochDuration; -// Messages processed between epochStart and epochEnd -``` - -This time-bounded approach prevents timing attacks and ensures all sequencers are working with the same set of transactions. - -## Security Mechanisms - -The TON Adapter implements multiple layers of security to protect user funds and prevent malicious activity. - -### Message Validation - -- **Asset Verification**: Sequencers must verify that actual token transfers match the amounts specified in cross-chain messages. This prevents attempts to claim false transfer amounts. - -- **Cryptographic Proofs**: All transactions include Merkle proofs that allow independent verification of inclusion in the agreed-upon transaction set. - -- **Consensus Requirements**: Multiple independent groups must agree on transaction validity before execution proceeds. - -### Economic Security - -- **Collateral Requirements**: Sequencer groups must stake significant collateral, creating financial incentives for honest behavior. - -- **Slashing Mechanisms**: Groups that submit incorrect proofs or behave maliciously face penalties including partial collateral forfeiture. - -- **Reward Distribution**: Performance-based rewards encourage reliable operation and continued participation in network security. - -### Failure Protection - - - When cross-chain transactions fail, the TON Adapter automatically protects - user assets through rollback mechanisms. - - -- **Automatic Rollbacks**: If a transaction fails on the target chain, assets are automatically returned to the sender rather than being lost. - -- **Failed Transaction Collection**: Failed transactions are collected into special Merkle trees and processed through the same consensus mechanism to ensure proper resolution. - -- **Timeout Protection**: Transactions that don't complete within specified time windows are automatically rolled back to prevent funds from being permanently locked. - -## Smart Contract Integration - -The TON Adapter interfaces with smart contracts on both chains through standardized protocols. - -### CrossChainLayer Contract - -On TAC EVM, the CrossChainLayer contract serves as the main interface: - -```solidity -interface ICrossChainLayer { - function receiveMessage( - bytes32 messageHash, - bytes calldata merkleProof, - MessageData calldata message - ) external; - - function sendMessage( - OutMessageV1 calldata outMessage - ) external; -} -``` - -This contract validates Merkle proofs, manages asset operations, and routes messages to target applications. - -### Message Execution Process - -When executing cross-chain messages: - -- **Proof Validation**: The CrossChainLayer contract verifies that the message is included in a consensus-approved Merkle tree. - -- **Asset Operations**: Any required token minting or unlocking operations are performed before calling the target contract. - -- **Contract Invocation**: The target smart contract method is called with the decoded parameters from the cross-chain message. - -- **Result Handling**: Any return values or additional cross-chain messages are processed through the same secure routing system. - -## Performance Characteristics - -The TON Adapter is designed to balance security with reasonable performance for application-level interactions. - - - - Cross-chain transactions typically complete within minutes rather than - hours. The exact timing depends on epoch duration settings and the number of - sequencer groups participating in consensus. - - This latency is acceptable for most application use cases. - - - - -The system can handle hundreds of cross-chain messages per epoch, with -throughput scaling based on epoch duration and the complexity of individual -transactions. - -Most hybrid dApp use cases generate relatively low transactionvolumes compared to high-frequency trading, making current -throughput sufficient for expected demand. - - - - - - Cross-chain operations require gas fees on both chains plus sequencer fees - for the messaging service. However, the cost remains reasonable for - meaningful transactions like token swaps or DeFi operations. - - The distributed nature of sequencer operations helps keep fees competitive while maintaining - security guarantees. - - - - -## What's Next? - -Understanding the TON Adapter's role in message routing helps you build more effective hybrid dApps and proxy contracts. - - - - Learn how smart contracts interface with the TON Adapter - - - Dive deeper into message structure and validation - - diff --git a/core-concepts/cross-chain-operations/asset-bridging.mdx b/core-concepts/cross-chain-operations/asset-bridging.mdx deleted file mode 100644 index c4f11d8..0000000 --- a/core-concepts/cross-chain-operations/asset-bridging.mdx +++ /dev/null @@ -1,354 +0,0 @@ ---- -title: Asset Bridging -description: "How tokens and assets move securely between TON and TAC EVM through lock-mint and burn-release mechanisms" ---- - -Asset bridging in TAC enables tokens to move seamlessly between TON and TAC EVM while maintaining supply integrity and user ownership. Unlike traditional bridges that create wrapped tokens, TAC's bridging system is designed specifically for application-level interactions where assets flow naturally based on user intent rather than explicit bridging operations. - -## Core Bridging Principles - -TAC's asset bridging system operates on fundamental principles that ensure security, maintain token economics, and provide seamless user experience. - - - Asset bridging lock-mint and burn-release diagram - - -### Supply Conservation - -- **Total Supply Integrity**: The combined supply of a token across both TON and TAC EVM always equals the original supply. When tokens are locked on one chain, equivalent amounts are minted on the other chain, maintaining perfect balance. - -- **Provable Reserves**: All locked tokens are held in verifiable smart contracts where their existence can be independently confirmed by anyone. - -- **Atomic Operations**: Asset locking, minting, burning, and releasing operations occur atomically within the same cross-chain transaction, preventing inconsistent states. - -### Bidirectional Flow - -Assets can move in both directions depending on user operations and application requirements: - - - - **Lock-and-Mint Process** - - - TON tokens locked in TON Adapter - - Equivalent ERC-20 tokens minted on TAC EVM - - Metadata preserved across chains - - User maintains full ownership - - - - - - **Burn-and-Release Process** - - ERC-20 tokens burned on TAC EVM - - Original tokens released from lock - - User receives back on TON - - Perfect 1:1 correspondence maintained - - - - -## Token Types and Handling - -Different types of assets require specialized handling to ensure proper representation and functionality across both chains. - -### TON Native Assets - - - - - **Jetton Bridging**: TON jettons (fungible tokens) are the most common bridged assets. When first crossing to TAC EVM, the system automatically deploys corresponding ERC-20 contracts. - - - **Metadata Preservation**: Token name, symbol, decimals, and additional metadata are captured from the TON side and replicated in the EVM contract. - - - **Address Mapping**: The system maintains deterministic mapping between TON jetton addresses and their corresponding ERC-20 addresses on TAC EVM. - - ```javascript - // Bridging a TON jetton - const assets = [{ - address: "EQTokenAddress...", // TON jetton address - amount: 100.5, // User-friendly amount - }]; - ``` - - - - - **TON Token Handling**: Native TON tokens receive special treatment as they don't have a traditional contract address on the TON side. - - - **Wrapped Representation**: On TAC EVM, native TON is represented as a wrapped token (similar to WETH on Ethereum) with standard ERC-20 functionality. - - - **Seamless Integration**: Users can bridge native TON without understanding the wrapping mechanism - it appears as a normal token on the EVM side. - - ```javascript - // Bridging native TON - const nativeTONBridge = [{ - // No address needed for native TON - amount: 5.0 - }]; - ``` - - - -### TAC EVM Native Assets - -- **EVM-Origin Tokens**: Tokens originally created on TAC EVM can also be bridged to TON, creating jetton representations on the TON side. - -- **Liquidity Pool Tokens**: LP tokens from DEXes and other DeFi protocols on TAC EVM can be bridged to TON for use in TON-native applications. - -- **Governance Tokens**: TAC-native governance tokens can be bridged to enable participation in governance from TON wallets. - -## Bridging Mechanisms - -### Lock-and-Mint Process - -When assets move from TON to TAC EVM, they undergo a structured locking and minting process: - - - - User tokens are locked in the TON Adapter smart contracts on the TON side. - These contracts serve as verifiable reserves where locked tokens remain - until they're bridged back. - - - - Sequencers validate that the correct amount and type of tokens have been - locked, ensuring the bridging request matches actual asset transfers. - - - - If this is the first time a particular token crosses to TAC EVM, the system - automatically deploys a corresponding ERC-20 contract with matching metadata. - - - - The exact amount of locked tokens is minted on TAC EVM and transferred to - the appropriate address (either the user directly or a proxy contract for - further operations). - - - -### Burn-and-Release Process - -The reverse process handles assets moving from TAC EVM back to TON: - - - - ERC-20 tokens on TAC EVM are burned, permanently removing them from - circulation on that chain. - - - - Sequencers verify the burn operation and confirm that the requesting user has - proper authorization for the operation. - - - - The corresponding amount of originally locked tokens is released from the TON - Adapter contracts. - - - - Released tokens are delivered to the user's TON wallet, completing the - round-trip bridging process. - - - -## Address Calculation and Mapping - -TAC maintains deterministic relationships between token addresses across chains, enabling predictable bridging behavior. - -### Deterministic Address Generation - -- **TON to EVM Mapping**: When a TON jetton first crosses to TAC EVM, its corresponding ERC-20 address is calculated based on the jetton's metadata and TON address. - -- **EVM to TON Mapping**: Similarly, EVM tokens bridging to TON receive deterministic jetton addresses based on their EVM metadata. - -- **Pre-Calculation**: Applications can calculate paired addresses before tokens actually bridge, enabling advanced features like showing expected addresses in user interfaces. - -### Address Registry - - -The TAC system maintains an on-chain registry of all bridged tokens, providing a authoritative source for address mappings. - -- **Automatic Registration**: When tokens first bridge, they're automatically registered with their cross-chain counterparts. - -- **Query Interface**: Applications can query the registry to find corresponding addresses without needing to calculate them. - -- **Metadata Storage**: The registry also stores essential metadata like decimals, symbols, and names for proper display across applications. - - - -## Decimal and Precision Handling - -Different blockchain ecosystems use different decimal standards, requiring careful handling to maintain precision and user experience. - -### Decimal Standards - - -
- **TON Standard**: TON jettons typically use 9 decimals, following the - platform's conventions for token precision. -
- -
- **EVM Standard**: Ethereum and EVM chains commonly use 18 decimals, - providing higher precision for complex DeFi operations. -
-
- -### Precision Management - -- **Preservation**: When TON tokens (9 decimals) bridge to TAC EVM, they maintain their 9 decimal precision rather than being artificially inflated to 18 decimals. - -- **Compatibility**: TAC EVM supports tokens with various decimal counts, ensuring that bridged tokens work correctly with existing DeFi protocols. - -- **User Interface**: Applications display amounts using the appropriate decimal precision for user familiarity while handling the technical differences behind the scenes. - - - While TAC EVM supports 18-decimal tokens, bridging them back to TON may have - limitations due to TON's 9-decimal standard. Consider keeping high-precision - tokens on the EVM side. - - -## Automatic Token Deployment - -The bridging system includes automatic token deployment capabilities that reduce friction for first-time token bridging. - -### Deployment Process - -- **Metadata Extraction**: When a token first crosses chains, the system extracts all necessary metadata including name, symbol, decimals, and description. - -- **Contract Generation**: A standard ERC-20 or jetton contract is automatically deployed with the extracted metadata. - -- **Registry Update**: The new token deployment is registered in the cross-chain address registry for future reference. - -### Deployment Triggers - -- **First Bridge Operation**: Token contracts are deployed automatically when a user first bridges a particular token type. - -- **Batch Deployment**: Multiple token types can be deployed in a single operation when complex transactions involve multiple new tokens. - -- **Permissionless Process**: Anyone can trigger token deployment by bridging assets, making the system fully permissionless. - -## Liquidity Management - -Asset bridging enables sophisticated liquidity management strategies that benefit both ecosystems. - -### Unified Liquidity Pools - -- **Cross-Chain Liquidity**: Tokens can flow between chains based on where liquidity is most needed, optimizing capital efficiency. - -- **Arbitrage Opportunities**: Price differences between chains create natural arbitrage opportunities that help maintain price consistency. - -- **Protocol Integration**: DeFi protocols can access liquidity from both ecosystems, increasing available capital and reducing slippage. - -### Example: DEX Liquidity - -When users provide liquidity to a DEX on TAC EVM using TON-origin tokens: - - - - TON tokens are automatically bridged to TAC EVM as part of the liquidity - provision transaction. - - - - Bridged tokens are added to the DEX liquidity pool, creating trading - opportunities for both TON and EVM users. - - - - Users receive LP tokens representing their share of the pool, which can be - used on either chain. - - - - The same liquidity serves traders from both ecosystems, maximizing - utilization and fee generation. - - - -## Security Considerations - -Asset bridging implements multiple security layers to protect user funds and maintain system integrity. - -### Economic Security - -- **Collateral Requirements**: Sequencers stake significant collateral to participate in bridging validation, creating financial incentives for honest behavior. - -- **Multi-Party Validation**: Multiple independent sequencer groups must agree on bridging operations before execution. - -- **Slashing Mechanisms**: Provably incorrect bridging operations result in automatic collateral slashing. - -### Technical Security - - - - - - **Transfer Validation**: Sequencers verify that claimed asset transfers - actually occurred by checking on-chain transaction data. - - **Amount Verification**: The exact amounts specified in bridging messages must match - actual token transfers. - - **Authorization Checks**: Only authorized token holders can initiate bridging operations for their assets. - - - - - -- **Transparent Reserves**: All locked tokens are held in smart contracts with - publicly verifiable balances. -- **Supply Tracking**: The system maintains precise accounting of total token supplies across both chains. -- **Independent Verification**: Anyone can audit the bridging system by comparing locked reserves with minted supplies. - - - - - - - **Rollback Protection**: Failed bridging operations automatically trigger asset rollback procedures to protect user funds. - - **Circuit Breakers**: The system can halt bridging operations if anomalous activity is detected. - - **Recovery Mechanisms**: Users can recover assets even if individual bridging transactions fail. - - - - -## Integration Patterns - -Developers can integrate asset bridging into their applications using several common patterns. - -### Automatic Bridging - -- **Transparent Operations**: Users specify what they want to do (swap, provide liquidity, etc.) and the system automatically bridges required assets. - -- **Single Transaction**: From the user's perspective, asset bridging and the target operation happen in a single transaction. - -- **Status Updates**: Applications can provide real-time updates on both bridging progress and target operation execution. - -### Manual Bridging - -- **Explicit Control**: Some applications allow users to explicitly bridge assets before performing operations. - -- **Batch Operations**: Users can bridge multiple assets in preparation for complex operations. - -- **Advanced Features**: Manual bridging enables advanced features like pre-positioning assets for better execution. - -## What's Next? - -Understanding asset bridging provides the foundation for exploring how complete transactions flow through TAC's cross-chain system. - - - - Learn how bridging fits into the complete transaction flow - - - Understand how the system ensures bridging security - - diff --git a/core-concepts/cross-chain-operations/message-validation.mdx b/core-concepts/cross-chain-operations/message-validation.mdx deleted file mode 100644 index fb50921..0000000 --- a/core-concepts/cross-chain-operations/message-validation.mdx +++ /dev/null @@ -1,328 +0,0 @@ ---- -title: Message Validation -description: "How TAC ensures security and integrity of cross-chain messages through multi-layer validation and consensus" ---- - -Message validation is the security foundation of TAC's cross-chain system. It ensures that every message crossing between TON and TAC EVM is authentic, authorized, and properly formatted before execution. Understanding validation helps developers build secure applications and troubleshoot validation failures. - -## Validation Philosophy - -TAC's validation system operates on the principle of "trust but verify" - while sequencers are trusted entities, every claim they make is independently verifiable through cryptographic proofs and consensus mechanisms. - - - Message validation layers and processes - - -## Validation Layers - -Message validation occurs at multiple layers, each providing different security guarantees and catching different types of potential issues. - -### Client-Side Pre-Validation - -Before messages even enter the cross-chain system, the TAC SDK performs initial validation to catch obvious errors early. - - -- **Type Checking**: All message parameters are validated against expected types and formats to prevent encoding errors. - -- **Range Validation**: Numeric values are checked against reasonable ranges to prevent overflow or underflow conditions. - -- **Address Validation**: TON and EVM addresses are validated for proper format and checksum correctness. - -- **Method Signature Validation**: EVM method signatures are validated to ensure they follow the required `(bytes,bytes)` parameter pattern. - - - - -- **Sufficient Funds**: User balances are checked against requested transfer amounts to prevent insufficient fund errors. - -- **Asset Existence**: Token contracts are validated to ensure they exist and are accessible for the requested operations. - -- **Authorization Checks**: The SDK verifies that users have proper authorization to transfer the specified assets. - - - -### Sequencer Validation - -Sequencers perform the most comprehensive validation of cross-chain messages before including them in consensus. - -#### Asset Transfer Verification - -- **Onchain Confirmation**: Sequencers verify that claimed asset transfers actually occurred by examining on-chain transaction data. - - ```javascript - // Sequencers validate that actual transfers match message claims - const messageAssets = extractAssetsFromMessage(crossChainMessage); - const actualTransfers = getOnChainTransfers(tonTransaction); - - // Amounts must match exactly - validateAssetAmounts(messageAssets, actualTransfers); - ``` - -- **Transfer Authenticity**: Each asset transfer is verified against the actual TON blockchain state to prevent false claims. - -- **Sender Authorization**: Sequencers confirm that the message sender is the same entity that authorized the asset transfers. - -#### Message Integrity Validation - - - - - - **Internal Consistency**: All message parameters are checked for internal consistency and logical coherence. - - **Target Validation**: Target contract addresses are validated to ensure they exist and are properly configured. - - **Method Existence**: EVM method names are validated against target contracts when possible to prevent call failures. - - - - - -- **Block Timing**: Message timestamps are validated against actual TON block timestamps to prevent replay attacks. -- **Epoch Boundaries**: Messages are validated to ensure they fall within the correct processing epoch. -- **Sequence Validation**: Message ordering is validated to prevent out-of-order execution issues. - - - - - - - **ABI Compliance**: Parameter encoding is validated against Ethereum ABI standards to ensure proper decoding. - - **Size Limits**: Message sizes are validated against network limits to prevent oversized messages. - - **Format Consistency**: All encoded data is validated for proper format and structure. - - - - -### Consensus Validation - -The consensus layer provides the final validation through cryptographic proofs and multi-party agreement. - -#### Group Consensus Requirements - -- **Internal Agreement**: Within each sequencer group, 3/5 of members must agree on message validity before the group can participate in network consensus. - -- **Cross-Validation**: Different sequencer groups independently validate the same messages, providing redundant verification. - -- **Threshold Security**: The high consensus threshold (3/5) ensures that temporary disagreements or individual failures don't prevent legitimate operations. - -#### Cryptographic Validation - - - - - **Inclusion Proofs**: Every executed message includes cryptographic proof of inclusion in a consensus-approved Merkle tree. - - - **Tamper Detection**: Merkle proofs make it cryptographically impossible to modify messages after consensus without detection. - - - **Independent Verification**: Any party can verify message authenticity using publicly available Merkle proofs. - - ```solidity - // Merkle proof validation in CrossChainLayer contract - function validateMerkleProof( - bytes32 messageHash, - bytes32 merkleRoot, - bytes32[] calldata proof - ) internal pure returns (bool) { - return MerkleProof.verify(proof, merkleRoot, messageHash); - } - ``` - - - - - **Sequencer Signatures**: Each sequencer group provides digital signatures on their Merkle tree submissions. - - - **Multi-Signature Requirements**: Multiple independent signatures are required before message execution. - - - **Key Management**: Sequencer public keys are managed through on-chain governance to ensure authenticity. - - - -## Economic Validation - -Beyond technical validation, economic incentives ensure that validators have strong reasons to validate messages correctly. - -### Stake-Based Security - -- **Collateral Requirements**: Sequencers must stake significant collateral to participate in validation, creating financial incentives for honest behavior. - -- **Slashing Mechanisms**: Provably incorrect validation results in automatic collateral slashing, making attacks economically unattractive. - -- **Reward Distribution**: Correct validation is rewarded through fee sharing and protocol incentives. - -### Economic Game Theory - - - - - **High Barriers**: The cost of coordinating attacks across multiple staked sequencer groups is economically prohibitive. - - **Detection Guarantees**: Cryptographic proofs ensure that any attempt to validate false messages is immediately detectable. - - - - - **Ongoing Rewards**: Honest sequencers receive continuous rewards for reliable validation service. - - **Reputation Effects**: Poor validation performance affects future participation and profitability. - - - -## Validation Failure Handling - -When messages fail validation at any stage, the system implements protective measures to prevent asset loss and provide clear feedback. - -### Pre-Consensus Failures - -- **Early Detection**: Messages that fail initial validation are rejected before entering the consensus system, saving time and resources. - -- **Error Reporting**: Detailed error messages help developers understand and fix validation issues quickly. - -- **Asset Protection**: Failed validation prevents asset transfers from occurring, protecting user funds. - -### Consensus-Level Failures - - - If messages fail validation during consensus, automatic rollback procedures - ensure user assets are protected. - - -- **Rollback Triggers**: Consensus failures automatically trigger rollback message creation to return assets safely. - -- **Protected Recovery**: The rollback process uses the same validation and consensus mechanisms to ensure secure asset recovery. - -- **Status Reporting**: Failed validation is clearly reported through the status tracking system with specific error information. - -## Validation Performance - -The validation system is designed to balance security with reasonable performance for application use cases. - -### Validation Efficiency - -- **Parallel Processing**: Multiple sequencers validate messages in parallel, providing redundancy without significantly impacting speed. - -- **Optimized Algorithms**: Validation algorithms are optimized for the specific types of checks required for cross-chain messages. - -- **Batched Validation**: Messages are validated in batches during epoch processing for improved efficiency. - -### Performance Monitoring - - - - - **Stage Tracking**: The validation time for each stage is tracked and can be monitored for performance optimization. - - **Bottleneck Identification**: Performance monitoring helps identify validation bottlenecks and optimization opportunities. - - **Network Health**: Validation performance serves as an indicator of overall network health and capacity. - - - - - **Validation Statistics**: Success and failure rates are tracked to monitor system health and identify issues. - - **Error Classification**: Different types of validation errors are classified to help identify systematic issues. - - **Trend Analysis**: Long-term trends in validation performance help guide system improvements. - - - -## Validation Error Types - -Understanding common validation errors helps developers build more robust applications. - -### Common Client-Side Errors - - - - - **Invalid Addresses**: Malformed TON or EVM addresses that don't pass checksum validation. - - **Type Mismatches**: Parameters that don't match expected types for the target method. - - **Encoding Issues**: Improperly ABI-encoded parameters that can't be decoded correctly. - - - - - **Insufficient Balance**: Attempting to transfer more tokens than the user owns. - - **Invalid Tokens**: Specifying token addresses that don't exist or aren't accessible. - - **Authorization Issues**: Lacking proper permissions to transfer specified assets. - - - -### Sequencer Validation Errors - -- **Asset Mismatch**: Claimed asset transfers don't match actual on-chain transfers. - -- **Timestamp Issues**: Message timestamps don't align with actual TON block timestamps. - -- **Signature Problems**: Invalid or missing signatures on transaction authorizations. - -- **Target Issues**: Target contracts don't exist or don't implement required methods. - -### Consensus Validation Errors - -- **Insufficient Consensus**: Not enough sequencer groups agree on message validity. - -- **Proof Failures**: Merkle proofs don't validate correctly against submitted root hashes. - -- **Economic Violations**: Operations would violate economic security constraints. - -## Best Practices for Developers - -### Preventing Validation Errors - - - - - **Client-Side Checks**: Implement comprehensive client-side validation before submitting cross-chain messages. - - **User Feedback**: Provide clear error messages that help users understand and fix validation issues. - - **Pre-Submission Testing**: Test message parameters against validation rules before final submission. - - - - - **Graceful Degradation**: Handle validation failures gracefully with - appropriate user feedback and recovery options. - **Retry Logic**: Implement - intelligent retry logic for transient validation issues. - **Logging**: Log - validation errors with sufficient detail for debugging and monitoring. - - - - - **Validation Testing**: Test applications with invalid inputs to ensure proper error handling. - - **Edge Cases**: Test edge cases like maximum amounts, minimum values, and boundary conditions. - - **Network Conditions**: Test under various network conditions to ensure robust validation handling. - - - -### Monitoring Validation Health - -- **Error Rate Monitoring**: Track validation error rates to identify systematic issues or degrading conditions. - -- **Performance Tracking**: Monitor validation performance to ensure acceptable user experience. - -- **Success Metrics**: Track successful validation rates as a key health indicator for applications. - -## Validation in Different Contexts - -### Development vs Production - - - - - **Relaxed Constraints**: Development networks may have more relaxed validation for testing purposes. - - **Enhanced Debugging**: Additional validation information and logging for debugging. - - **Simulation Tools**: Validation simulation tools help test message formatting before submission. - - - - - **Strict Requirements**: Production validation enforces all security constraints rigorously. - - **Performance Optimization**: Validation is optimized for speed while maintaining security. - - **Economic Enforcement**: Full economic security measures are active in production. - - - -### Different Message Types - -- **Simple Transfers**: Basic asset transfers have streamlined validation focused on balance and authorization checks. - -- **Complex Operations**: Multi-step operations require additional validation of operation sequencing and parameter consistency. - -- **Return Messages**: Messages returning from EVM to TON have specialized validation for burn-and-release operations. - -## What's Next? - -Understanding message validation provides the security foundation for exploring TAC's token economic models and operational patterns. - - - - Learn how different token types are validated and processed - - - diff --git a/core-concepts/cross-chain-operations/transaction-lifecycle.mdx b/core-concepts/cross-chain-operations/transaction-lifecycle.mdx deleted file mode 100644 index 08715ee..0000000 --- a/core-concepts/cross-chain-operations/transaction-lifecycle.mdx +++ /dev/null @@ -1,417 +0,0 @@ ---- -title: Transaction Lifecycle -description: "Complete journey of cross-chain transactions from user initiation to final execution and confirmation" ---- - -The transaction lifecycle in TAC represents the complete journey of a cross-chain operation from initial user action to final confirmation. Understanding this lifecycle helps developers build better applications, implement proper status tracking, and troubleshoot issues effectively. - -## Lifecycle Overview - -Every cross-chain transaction follows a predictable path through multiple validation and execution stages across different blockchain networks and consensus systems. - - - Transaction lifecycle diagram with all stages - - -The lifecycle involves three main phases: **Initiation** (user action), **Processing** (validation and consensus), and **Execution** (target chain operations). Each phase includes multiple stages that ensure security and reliability. - -## Stage Progression - -Cross-chain transactions progress through specific stages that can be monitored and tracked for status updates. - -### TON-Side Stages - - - - User connects their TON wallet and approves a transaction in a hybrid dApp. - The TAC SDK formats the request and prepares assets for cross-chain - transfer. - - - - User's tokens are locked in the TON Adapter contracts, creating the foundation - for cross-chain asset representation on the target chain. - - - - A structured cross-chain message is created containing all operation details, - target information, and asset specifications. - - - - The TON transaction completes and emits events that sequencers monitor for - cross-chain processing. - - - -### Sequencer Processing Stages - -The sequencer network handles message validation and consensus formation: - - - - **Message Detection**: Sequencers detect the cross-chain event and store transaction details in their local databases for validation. - -- **Initial Validation**: Each sequencer independently validates the transaction parameters, asset transfers, and user authorization. - -- **Database Storage**: Validated transactions are stored and prepared for inclusion in the next Merkle tree formation cycle. - - - - - - **Merkle Tree Formation**: Sequencers compile validated transactions into Merkle trees at the end of each epoch period. - -- **Group Consensus**: Sequencer groups work to achieve 3/5 internal agreement on their Merkle tree root hashes. - -- **Network Submission**: Successfully agreed-upon trees are submitted to the network for cross-group validation and consensus. - - - -### EVM Execution Stages - - - - **Consensus Verification**: The CrossChainLayer contract verifies that sufficient sequencer groups have submitted matching Merkle trees. - -- **Asset Operations**: Required token minting or unlocking operations are performed before contract execution. - -- **Contract Invocation**: The target EVM proxy contract is called with properly formatted parameters and bridged assets. - -- **Result Recording**: Execution results are recorded on-chain, including any return messages or asset operations. - - - -### Return Path Stages (If Applicable) - -For operations that send results back to TON: - - - - **Return Message Creation**: EVM proxy contracts create return messages containing results or assets to send back to TON. - -- **Sequencer Detection**: The same sequencer network detects return messages and begins validation for the reverse journey. - -- **Asset Preparation**: Any assets being returned are prepared for the burn-and-release process back to TON. - - - - -- **Return Consensus**: Return messages go through the same consensus process as forward messages, ensuring security. - -- **Cross-Group Validation**: Multiple sequencer groups must agree on return message validity before execution. - - - - -- **Final Execution**: Return messages are executed on TON, delivering results or assets back to the original user. - -- **Transaction Completion**: The cross-chain operation is fully complete, with all stages successfully executed. - - - -## Operation Types - -Different transaction patterns result in different lifecycle flows, each with distinct characteristics and completion criteria. - - - - - - **One-Way Operations**: Transactions that move assets or data from TON to TAC EVM without requiring a return path. - - **Examples**: Simple token deposits, contract calls that store results on EVM, or operations where users only need confirmation. - - **Completion**: These operations complete at the EXECUTED_IN_TAC stage, making them faster than round-trip operations. - - **Use Cases**: Token bridging for holding, deposits into EVM protocols, or data submissions that don't require responses. - - - - - -- **Round-Trip Operations**: Complete cycles where operations execute on EVM and send results back to the original TON user. -- **Examples**: Token swaps, liquidity operations that return LP tokens, or any interaction where users expect different assets back. -- **Completion**: These operations complete at the EXECUTED_IN_TON stage after the full round trip. -- **Use Cases**: DEX swaps, yield farming, lending operations, or any complex DeFi interaction. - - - - - - - **Automatic Failure Detection**: System automatically detects EVM execution failures, invalid parameters, insufficient gas, or timeout conditions. - - **Rollback Merkle Tree Creation**: Failed messages are grouped into special rollback Merkle trees with same consensus properties as regular transactions. - - **Consensus-Secured Recovery**: Rollback trees submitted through identical sequencer consensus process for transparent and secure approval. - - **Automatic Asset Return**: Upon rollback consensus finalization, locked assets automatically returned to original users without manual intervention. - - **No Manual Recovery Required**: Users always receive either successful execution or secure asset return - no funds lost to failed operations. - - - - -## Timing and Performance - -Understanding transaction timing helps developers set appropriate user expectations and design responsive interfaces. - -### Typical Timeframes - - - - **TON_TAC Operations**: 3-5 minutes Simple one-way operations complete - relatively quickly since they don't require a return path through the - consensus system. - - - - **TON_TAC_TON Operations**: 6-12 minutes Round-trip operations take longer - due to the additional consensus and execution cycles required for the return - path. - - - -### Factors Affecting Speed - -- **Epoch Duration**: The length of sequencer processing windows directly affects how quickly transactions progress through consensus stages. - -- **Network Participation**: Higher sequencer participation generally leads to faster consensus formation and execution. - -- **Target Chain Congestion**: Busy periods on either TON or TAC EVM can slow execution stages. - -- **Operation Complexity**: Simple operations process faster than complex multi-token or multi-contract interactions. - -## Status Tracking - -Applications can monitor transaction progress through various tracking mechanisms that provide different levels of detail. - -### Simplified Status Tracking - -For user-facing interfaces, simplified status provides clear, understandable progress information: - -```javascript -const tracker = new OperationTracker(Network.TESTNET); -const status = await tracker.getSimplifiedOperationStatus(transactionLinker); - -switch (status) { - case "PENDING": - // Transaction is progressing through stages - break; - case "SUCCESSFUL": - // Operation completed successfully - break; - case "FAILED": - // Operation failed and assets were rolled back - break; - case "OPERATION_ID_NOT_FOUND": - // Transaction not yet detected by sequencers - break; -} -``` - -### Detailed Stage Tracking - -For debugging or advanced interfaces, detailed tracking shows exact stage progression: - -```javascript -const operationId = await tracker.getOperationId(transactionLinker); -const detailedStatus = await tracker.getOperationStatus(operationId); - -console.log(`Current stage: ${detailedStatus.stage}`); -console.log(`Success status: ${detailedStatus.success}`); -console.log(`Stage timestamp: ${new Date(detailedStatus.timestamp * 1000)}`); -``` - -### Performance Profiling - -Advanced tracking provides timing information for each stage: - -```javascript -const stageProfile = await tracker.getStageProfiling(operationId); - -// Shows timing for each completed stage -Object.keys(stageProfile).forEach((stageName) => { - if (stageName === "operationType") return; - - const stage = stageProfile[stageName]; - if (stage.exists) { - console.log(`${stageName}: ${stage.stageData.timestamp}`); - } -}); -``` - -## Error Handling Throughout the Lifecycle - -The transaction lifecycle includes comprehensive error handling at every stage to protect user assets and provide clear feedback. - -### Pre-Execution Validation - - - - - **Parameter Checking**: The TAC SDK validates transaction parameters before submission to prevent obvious errors. - - **Balance Verification**: User balances are checked against requested operations to ensure sufficient assets. - - **Gas Estimation**: Automatic gas estimation helps prevent failures due to insufficient gas limits. - - - - - **Asset Verification**: Sequencers verify that claimed asset transfers actually occurred on-chain. - - **Message Integrity**: Transaction parameters are validated against on-chain data to prevent manipulation. - - **Authorization Checks**: Only authorized users can initiate operations for their assets. - - - -### Execution-Time Errors - -- **EVM Execution Failures**: If target contract calls fail on TAC EVM, the system automatically initiates rollback procedures. - -- **Timeout Handling**: Operations that don't complete within expected timeframes trigger timeout procedures. - -- **Network Issues**: Temporary network problems are handled through retry mechanisms and status preservation. - -### Comprehensive Rollback System - - - When transactions fail after assets have been transferred, TAC automatically - protects user funds through secure rollback mechanisms with the same security - guarantees as successful transactions. - - -#### Rollback Merkle Tree Creation - -When execution failures occur on TAC EVM Layer, the system immediately implements a sophisticated recovery process: - - - - **Immediate failure identification:** - Failed messages identified and - tagged during execution monitoring - Failure reasons recorded (gas failure, - contract revert, invalid parameters) - Asset state tracked to determine - required recovery operations - Automatic categorization of reversible vs - non-reversible failures - - - - **Deterministic rollback processing:** - Failed messages grouped into - special rollback Merkle trees - Same deterministic properties as regular - transaction trees - Clear identification of affected users and asset amounts - - Network-wide agreement simplified through structured rollback data - - - - **Secure rollback approval:** - Rollback trees submitted through identical - sequencer consensus process - 3/5 sequencer agreement required for rollback - execution - Same cryptographic security as successful transactions - - Transparent and immutable rollback decisions - - - -#### Automatic Asset Recovery - -Upon finalization of rollback consensus, the recovery process provides comprehensive user protection: - -**Safe Return Mechanisms:** - -- Locked assets on TON blockchain automatically released to original owners -- No manual intervention required from users or developers -- Asset amounts precisely match original transaction parameters -- Recovery transactions include original transaction references for auditability - -**Rollback as Core UX Guarantee:** - -- Users always have clear outcome: successful execution OR safe asset return -- Eliminates fund loss risk from transaction failures -- Maintains user confidence in cross-chain interactions -- Transparent failure communication with detailed error reporting - -## Monitoring and Debugging - -### Real-Time Monitoring - -Applications can implement real-time monitoring to provide users with live updates: - -```javascript -async function monitorTransaction(transactionLinker) { - const tracker = new OperationTracker(Network.TESTNET); - - // Poll for operation ID - let operationId = null; - while (!operationId) { - operationId = await tracker.getOperationId(transactionLinker); - if (!operationId) { - await new Promise((resolve) => setTimeout(resolve, 5000)); - } - } - - // Monitor until completion - let completed = false; - while (!completed) { - const status = await tracker.getOperationStatus(operationId); - - // Update UI with current status - updateUserInterface(status); - - // Check for completion - if (status.stage === "EXECUTED_IN_TON" || !status.success) { - completed = true; - } else { - await new Promise((resolve) => setTimeout(resolve, 10000)); - } - } -} -``` - -### Debugging Failed Transactions - -- **Status Analysis**: Detailed status information helps identify where transactions failed and why. - -- **Stage Timing**: Performance profiling can reveal if transactions are stuck at particular stages. - -- **Error Messages**: When available, error messages provide specific information about failure causes. - -- **Asset Tracking**: Applications can verify that rollback procedures properly returned user assets. - -## Best Practices for Developers - -### User Experience Design - - - - - **Clear Expectations**: Inform users that cross-chain operations take several minutes to complete. - - **Progress Indicators**: Show users which stage their transaction is currently in using progress bars or step indicators. - - **Time Estimates**: Provide realistic time estimates based on current network conditions and operation type. - - - - - **Graceful Failures**: Handle failed transactions gracefully with clear - explanations of what happened. - **Recovery Guidance**: Provide users with - information about asset recovery and next steps after failures. - **Support - Information**: Include transaction IDs and status information that support - teams can use for assistance. - - - - - **Optimistic UI**: Update interfaces optimistically while monitoring actual transaction progress. - - **Efficient Polling**: Use reasonable polling intervals that balance responsiveness with resource usage. - - **Caching**: Cache status information appropriately to reduce unnecessary API calls. - - - -### Integration Patterns - -- **Status Webhooks**: For applications that need server-side monitoring, implement webhook endpoints for status updates. - -- **Background Processing**: Handle long-running transaction monitoring in background processes rather than blocking user interfaces. - -- **Retry Logic**: Implement appropriate retry logic for temporary network issues while avoiding excessive API usage. - -## What's Next? - -Understanding the complete transaction lifecycle prepares you to explore the specific validation mechanisms that ensure security throughout the process. - - - - Learn how transactions are validated at each stage - - - Explore how different token types are handled throughout the lifecycle - - diff --git a/core-concepts/overview/architecture.mdx b/core-concepts/overview/architecture.mdx deleted file mode 100644 index 60a5fe7..0000000 --- a/core-concepts/overview/architecture.mdx +++ /dev/null @@ -1,255 +0,0 @@ ---- -title: Architecture -description: "How TAC's three-layer architecture enables seamless interaction between TON and EVM ecosystems" ---- - -TAC's architecture is designed to support secure and deterministic cross-chain communication while preserving native user experience on the TON side. The protocol relies on off-chain batching, standardized message structures, and on-chain consensus to execute contract-level operations across both networks. - - - Some part of TAC's architecture is still under development and in roadmap. - - - - TAC Architecture showing EVM Layer, TON Adapter, and Proxy Apps - - -## Architecture Overview - - - Full EVM compatibility with Cosmos SDK. Handles all application logic and state. - - - Distributed sequencer network that securely routes messages between TON and - EVM. - - - - Smart contracts that translate between TON and EVM, making apps feel native to both sides. - - - -## TAC EVM Layer - -The foundation of TAC is a complete Layer 1 blockchain that provides full EVM compatibility without compromises. - -## TON Adapter Network - -The TON Adapter is a purpose-built messaging system that securely connects TON and TAC EVM. Unlike traditional bridges, it's designed specifically for application-level interactions. - - - **Current Network Status**: The sequencer network is currently distributed but - not decentralized. Full decentralization is on the roadmap as the network - matures. - - -### Core Functions - -The TON Adapter handles five critical operations: - - - - - Transaction execution coordination - - Cross-chain calls - - Return value routing - - - - - Merkle tree formation - - Multi-group validation - - Economic security enforcement - - - -### Sequencer Network Architecture - - - - Each sequencer monitors both TON and TAC EVM for relevant events, - maintaining local databases of transactions and forming initial Merkle - trees. - - - - Sequencers organize into groups that must reach 3/5 internal consensus. Each - group validates transactions independently and stakes collateral as security. - - - - Multiple groups must submit identical Merkle trees to achieve network-wide - consensus. This creates multiple validation layers for maximum security. - - - - Once consensus is reached, transactions execute on the target chain with - cryptographic proof of validity. - - - -### Economic Security - - -**Every sequencer group must stake collateral:** - -- Minimum stake set by DAO governance -- Higher stakes earn proportionally higher rewards -- Stake must remain above threshold during participation -- Partial stake locking during proof submission - - - - -**Performance-based incentives:** - -- Rewards distributed proportionally to stake size -- Executor selection based on collateral weight -- Commission sharing within groups -- Penalty mechanisms for incorrect operations - - - - -**Democratic group selection:** - -- New groups approved through DAO voting -- Regular election cycles (DAO configurable) -- Performance monitoring and rating systems -- Penalty applications and network-wide voting - - - -## Proxy Contract System - -Proxy contracts are the interface layer that makes cross-chain interaction feel seamless. They handle all the complexity of message formatting, asset management, and protocol translation. - -### How Proxies Work - - - - **Handled automatically by TAC SDK:** When a user initiates a transaction using their TON wallet, the TAC SDK takes care of formatting the request for cross-chain delivery. The user's assets are securely locked within the TON Adapter, and throughout the process, the SDK continuously monitors and reports the transaction status. This seamless integration ensures that users and developers do not need to manage the complexities of cross-chain communication themselves. - - Developers don't need to write TON-side proxy contracts - the TAC SDK - handles everything - - - - - **Custom Solidity contracts:** On the EVM side, developers write custom Solidity contracts that are designed to interact with the TON Adapter. These contracts receive validated cross-chain messages from the TON Adapter, decode the transaction parameters and user intent, and then handle the necessary asset minting or unlocking operations. After processing the transaction, the contract executes the required methods on the target contract. If needed, the contract can also send results or responses back to TON. A typical entry point for these operations is a function such as `processMessage(bytes calldata tacHeader, bytes calldata args) external onlyTONAdapter`, which ensures that only the TON Adapter can invoke cross-chain actions. - - - - - -### Proxy Generation - - - - TAC can automatically generate proxy contracts for many common use cases: - - - Token transfers and swaps - - Liquidity provision and removal - - Standard DeFi interactions - - This reduces development time for standard operations. - - - - For complex applications, developers can create custom proxies: - - - Handle application-specific logic - - Implement custom validation rules - - Manage complex state transitions - - Integrate with multiple contracts - - Custom proxies provide maximum flexibility for unique use cases. - - - -## Complete Transaction Lifecycle - -Here's how all three layers work together for a complete cross-chain transaction: - - - - **User action triggers the process:** - - - User connects TON wallet to hybrid dApp - - Selects action (swap, stake, etc.) and confirms transaction - - TON-side proxy locks assets and creates formatted message - - - - -**Sequencers monitor and collect:** - -- Sequencers detect new events on TON -- Transaction details stored in local databases -- Asset transfers validated against message parameters - - - - - -**Multi-layer validation process:** - -- Individual sequencers form Merkle trees -- Groups reach 3/5 internal consensus (BFT threshold) -- Cross-group validation ensures network agreement -- Cryptographic proofs generated for execution - - - - - -**Target chain processes transaction:** - -- EVM proxy receives validated message -- Assets are minted or unlocked as needed -- Target contract methods executed with parameters -- Results and state changes recorded on-chain - - - - - **Results flow back to user:** - - - Successful transactions update application state - - Return assets/messages sent back through TON Adapter - - User receives confirmation and results in TON wallet - - Failed transactions trigger automatic rollback process - - - -## Security Guarantees - -TAC's architecture provides multiple layers of security across all components: - - - -- Merkle proofs validate transaction inclusion -- Multiple signature requirements prevent fraud -- Asset validation ensures accurate transfers -- Rollback protection for failed transactions - - - -## What's Next? - - - - Learn how this architecture enables truly hybrid applications - - - Explore the cross-chain messaging system in detail - - diff --git a/core-concepts/overview/new.mdx b/core-concepts/overview/new.mdx deleted file mode 100644 index 8b13789..0000000 --- a/core-concepts/overview/new.mdx +++ /dev/null @@ -1 +0,0 @@ - diff --git a/core-concepts/overview/security.mdx b/core-concepts/overview/security.mdx deleted file mode 100644 index 6a51c4b..0000000 --- a/core-concepts/overview/security.mdx +++ /dev/null @@ -1,307 +0,0 @@ ---- -title: Security -description: "TAC's comprehensive security framework including audits, monitoring, and multi-layer protection" ---- - -TAC implements a comprehensive security framework with multiple layers of protection, professional audits, and continuous monitoring to ensure the safety of hybrid dApps and user assets. - -## Security Audits - - - - **EVM Client Security** Comprehensive audit of TAC's EVM implementation by - Halborn, covering blockchain security and client vulnerabilities. - - - - **Cross-Chain Infrastructure** Professional audit of the TON Adapter system - by Trail of Bits, ensuring secure cross-chain messaging and consensus. - - - -## Multi-Layer Security Architecture - -TAC's security model operates across multiple layers to provide comprehensive protection for users and applications. - -### EVM Layer Security - - - - - **Modern EVM Implementation**: TAC EVM is based on the Cancun upgrade, - incorporating the latest Ethereum security improvements and optimizations. - - **Proven Technology**: Built on battle-tested EVM specifications with all - security features and protections of modern Ethereum networks. - - **Standard Compliance**: Full compatibility with Ethereum security models ensures - familiar security guarantees for developers. - - - - - -**TAC Token Security**: Network consensus secured by delegated Proof of Stake -using $TAC tokens as the staking mechanism. - -**Validator Incentives**: Economic incentives align validator behavior with network security through staking -rewards and slashing penalties. - -**Distributed Validation**: Multiple independent validators secure the network through distributed consensus -mechanisms. - - - - - - **Enhanced Economic Security**: Integration with Babylon protocol adds - Bitcoin's economic security to TAC's consensus layer. - - **Bitcoin Staking**: Bitcoin holders can stake their BTC to provide additional economic security - for TAC network operations. - - **Dual Security Model**: Combines dPoS consensus with Bitcoin's proven security model for enhanced protection. - - - - -### TON Adapter Security - -The TON Adapter implements distributed architecture with multiple validation layers: - - - **Current Network Status**: The sequencer network is currently distributed but not decentralized. Full decentralization is on the roadmap as the network matures. - - - - - - **Current State**: TON Adapter operates with distributed sequencer groups - providing redundancy and security validation. - - **Multiple Validators**: Multiple independent sequencer groups validate cross-chain transactions - through consensus mechanisms. - - **Future Decentralization**: Architecture designed for progressive decentralization as the network matures. - - - - - - **Multi-Group Validation**: Cross-chain messages require consensus from - multiple independent sequencer groups. - - **Economic Stakes**: Sequencers stake collateral to participate in validation, creating financial incentives for - honest behavior. - - **Cryptographic Proofs**: All cross-chain operations protected by Merkle proofs and cryptographic verification. - - - - -## Professional Security Auditing - -TAC undergoes comprehensive security audits by industry-leading firms to ensure the highest security standards. - -### Completed Audits - - - - **EVM Client Security** Comprehensive audit of TAC's EVM implementation by - Halborn, covering blockchain security and client vulnerabilities. - - - - **Cross-Chain Infrastructure** Professional audit of the TON Adapter system - by Trail of Bits, ensuring secure cross-chain messaging and consensus. - - - -### Additional Security Reviews - -**Quantstamp (Proxy Apps)**: Smart contract audits for proxy applications ensuring secure cross-chain contract interactions and asset management. - -**Ongoing Reviews**: Regular security assessments and code reviews as the protocol evolves and new features are added. - -## Continuous Security Monitoring - -TAC implements 24/7 security monitoring and incident response capabilities to detect and respond to potential threats. - -### Real-Time Threat Detection - - - - - **24/7 Security Monitoring**: Hypernative provides continuous monitoring of - TAC networks, detecting potential exploits and anomalous behavior. - - **Mempool-Level Detection**: Advanced monitoring capabilities detect - suspicious transactions at the mempool level before they're executed. - - **Real-Time Alerts**: Immediate notifications for potential security threats - enable rapid response and mitigation. - - - - - - **24/7 Security Operations**: Fully dedicated Security Operations Center - (SOC) team monitoring TAC infrastructure around the clock. - - **Incident Response**: Trained security professionals ready to respond to any security - incidents or threats. - - **Proactive Monitoring**: Continuous analysis of network activity and security metrics to identify potential issues before - they become problems. - - - - -### Security Certifications - -**Industry Standards**: TAC maintains compliance with industry security standards and best practices for blockchain networks. - -**Regular Assessments**: Ongoing security assessments ensure continued compliance with evolving security requirements. - -**Documentation**: Comprehensive security documentation and incident response procedures maintain operational readiness. - -## Future Security Enhancements - -TAC has planned significant security upgrades that will provide additional layers of protection and decentralization. - -### Babylon Bitcoin Restaking Integration - -TAC plans integration with Babylon's Bitcoin restaking protocol to add massive economic security: - - - - **Leveraging Bitcoin's Economic Strength:** - - - Bitcoin holders delegate BTC stakes to Babylon validators - - Validators cryptographically verify TAC EVM blocks and Merkle roots - - Self-custodial delegation maintains decentralization without custody risk - - Exponentially increases attack costs through Bitcoin's security budget - - - - **Economic Penalties for Malicious Behavior:** - - - Validators providing conflicting signatures face automatic slashing - - Double-signing detection through Babylon protocol mechanisms - - Direct economic penalties via Bitcoin blockchain enforcement - - Makes attacks economically irrational at Bitcoin-scale security - - - -### FROST Consensus Upgrade - -**Planned migration to FROST-Ed25519 threshold signatures with Distributed Key Generation (DKG):** - - - - **Enhanced Cryptographic Security:** - - - Threshold signature creation requires t+1 out of n participants - - Attackers controlling up to t participants cannot forge signatures - - Ed25519 compatibility with existing verification systems - - Round-optimized design minimizes communication overhead - - - - **Decentralized Key Management:** - - - Dealerless key generation - no single party knows complete secret - - High threshold support (k > n/2) for enhanced security - - Feldman VSS with verifiable encrypted shares - - Complaint handling without secret disclosure - - - - **Long-term Security Maintenance:** - - - Share refreshing capabilities for proactive security - - Dynamic committee composition changes - - Threshold value adaptation to security requirements - - Protection against gradual node compromise - - - -## Community Security Programs - -TAC will launch comprehensive community-driven security programs following mainnet deployment. - -### Upcoming Programs - - - - - **Reward Security Research**: Comprehensive bug bounty program rewarding - security researchers for discovering vulnerabilities. - - **Tiered Rewards**: Structured reward system based on severity and impact of discovered issues. - - - **Responsible Disclosure**: Clear processes for responsible vulnerability disclosure and coordinated fixes. - - - - - - **Community Auditing**: Open audit competitions allowing the broader - security community to review TAC's codebase. - - **Competitive Analysis**: Multiple teams competing to find security issues provides comprehensive - coverage. - - **Transparency**: Public audit processes and results increase confidence in TAC's security posture. - - - - -**Launch Timeline**: Both bug bounty programs and audit competitions will begin shortly after mainnet launch, providing ongoing community-driven security validation. - -## Security Best Practices - -For developers building on TAC, following security best practices ensures application and user safety: - -### Development Guidelines - -**Smart Contract Security**: Follow established smart contract security patterns and undergo professional audits for production applications. - -**Cross-Chain Considerations**: Understand the unique security considerations of cross-chain operations and implement appropriate safeguards. - -**Testing Requirements**: Comprehensive testing including security-focused test scenarios and edge case validation. - -### Operational Security - -**Key Management**: Implement secure key management practices for production deployments and user funds. - -**Monitoring Integration**: Integrate with TAC's monitoring systems and implement application-specific security monitoring. - -**Incident Response**: Develop incident response procedures for potential security issues in your applications. - -## Transparency and Communication - -TAC maintains transparency in security matters while protecting sensitive operational details: - -**Public Audits**: Audit reports are made publicly available for community review and verification. - -**Security Updates**: Regular communication about security improvements, patches, and best practices. - -**Community Engagement**: Active engagement with the security community for ongoing feedback and improvement. diff --git a/core-concepts/overview/what-is-tac.mdx b/core-concepts/overview/what-is-tac.mdx deleted file mode 100644 index e4e9ede..0000000 --- a/core-concepts/overview/what-is-tac.mdx +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: What is TAC -description: "TAC bridges TON's 1 billion users with EVM's application ecosystem" ---- - -TAC is an **EVM for Telegram**: a Layer 1 with a TON-specific CrossChain Layer that connects Ethereum dApps and developers with Telegram's users without exposing users to bridges, extra wallets, or wrapped assets. TAC eliminates the gap between TON's billion-user reach and EVM's programmability through **Hybrid dApps** - EVM dApps natively accessible by any TON wallet holder. - - - TAC Architecture showing connection between TON and EVM - - -## The Problem TAC Solves - - - -
- **Challenge**: Reaching TON's billion users requires rebuilding entire - applications in FunC, TON's native language.

- - **TAC Solution**: Deploy - existing Solidity contracts as-is and make them accessible to TON users -
- - -
- **Challenge**: Limited access to DeFi, gaming, and other EVM applications - that dominate the blockchain space.

- **TAC Solution**: Use any EVM application directly from TON wallets without bridges or multiple wallets -
-
- -## How TAC Works - -TAC operates through three core innovations that work together seamlessly: - - -TAC EVM Layer is a CosmosSDK-based blockchain that runs unmodified Solidity contracts and achieves **≈2-second finality** through dPoS. This means: - -- Deploy existing Solidity contracts without modifications -- Use familiar tools like Hardhat, Remix, and MetaMask -- Built on proven Cosmos SDK with Tendermint consensus -- Secured by delegated Proof of Stake with economic incentives -- **Future Enhancement**: Babylon Bitcoin restaking for additional economic security - -The EVM layer handles all application logic and state, while the TON Adapter manages cross-chain communication. - - - - -A distributed network of **sequencers** that securely routes messages between TON and TAC EVM: - -- **Validation**: Sequencers verify all transactions and asset transfers -- **Consensus**: 3/5 sequencer consensus with BFT guarantees -- **Security**: Multiple validation layers prevent double-spending and fraud -- **Epochs**: Time-based processing ensures orderly message handling - - - **Current Network Status**: The sequencer network is currently distributed but not decentralized. Full decentralization is on the roadmap as the network matures. - - -This isn't a traditional bridge — it's a purpose-built messaging system designed for hybrid applications. - - - - -Specialized contracts that make cross-chain interaction feel native: - -**On TON**: SDK handles proxy logic automatically -**On EVM**: Solidity contracts receive and process cross-chain messages - -When a TON user interacts with an EVM app, proxy contracts handle all the complex routing, asset management, and message formatting behind the scenes. - - - -## Key Benefits - - - - ### Deploy Once, Reach Billions - - - **No code rewrites**: Deploy existing Solidity contracts directly - - **Familiar tooling**: Use Hardhat, Truffle, Remix, and other EVM tools - - **Hybrid dApp conversion**: Every deployment becomes a Hybrid dApp accessible from TON - - **Cross-chain SDK**: Simple JavaScript library handles TON integration - - **Telegram MiniApps**: Bring EVM-powered logic directly inside Telegram - - The world's largest developer community meets the largest user base - - - - ### Native TON Experience - - **One wallet**: Use your TON wallet for everything - - **No bridges**: Assets move automatically behind the scenes - - **Familiar UX**: Apps feel native to TON environment - - **Telegram integration**: Access apps directly through Telegram Mini Apps - - - TON users get access to DeFi, gaming, NFTs, and more without learning new workflows - - - - - ### Unified Liquidity - **Cross-chain composability**: - - TON and EVM applications can interact - - **Shared liquidity**: Tokens flow freely between ecosystems - - **Network effects**: More users attract more developers and vice versa - - **Innovation acceleration**: Best of both worlds drives faster development - - - -## Transaction Flow Example - -Here's what happens when a TON user swaps tokens on an EVM DEX through TAC's hybrid dApp system: - - - - User opens a DEX interface and connects their TON wallet. They select tokens - to swap and approve the transaction. - - - - The TON proxy locks user assets and creates a formatted message containing - swap parameters and destination details. - - - - Sequencer network validates the transaction, forms Merkle trees, and reaches - consensus across multiple groups. - - - - A designated executor submits Merkle proofs to TAC EVM Layer, triggers asset - minting/unlocking, and executes the swap on the target DEX contract via proxy. - - - - Swap completes and new tokens are sent back to the user's TON wallet through - the same secure process. - - - -## What Makes TAC Different - - - TAC is not a cross-chain workaround—it is a native execution path between - two ecosystems that were never meant to connect. By removing barriers instead - of building over them, TAC aligns UX, liquidity, and developer incentives. - - -Unlike traditional bridges that move assets between existing chains, TAC creates **hybrid applications** that natively serve both ecosystems. Users don't "bridge to another chain"—they use applications that happen to run on EVM but feel completely native to TON. - -This fundamental difference enables: - -- **Seamless UX**: No wallet switching or manual bridging -- **Unified liquidity**: Assets flow where they're needed most -- **Developer efficiency**: Build once, serve both ecosystems -- **Network effects**: Growth in one ecosystem benefits the other - -## Ready to Explore? - - - - Understand how TAC's components work together - - - Learn what makes applications "hybrid" and why it matters - - diff --git a/core-concepts/token-economics/token-operations.mdx b/core-concepts/token-economics/token-operations.mdx deleted file mode 100644 index e45ced6..0000000 --- a/core-concepts/token-economics/token-operations.mdx +++ /dev/null @@ -1,262 +0,0 @@ ---- -title: Token Operations -description: "How different token types are handled, deployed, and managed across TON and TAC EVM chains" ---- - -Token operations in TAC encompass the creation, deployment, transfer, and management of digital assets across both TON and TAC EVM chains. The system supports multiple token standards while maintaining compatibility and seamless user experience across both ecosystems. - -## Token Categories - -TAC handles different categories of tokens, each with specific characteristics and operational requirements. - - - Different token types in the TAC ecosystem - - -### TON-Origin Tokens - -- **TON Jettons**: Standard fungible tokens native to the TON blockchain that follow TON's jetton standard with typical 9-decimal precision. - -- **Native TON**: The native currency of the TON blockchain, which receives special handling when bridging to maintain its fundamental properties. - -- **TON-Native Assets**: Specialized tokens created specifically for the TON ecosystem, including governance tokens, utility tokens, and application-specific assets. - -### TAC EVM-Origin Tokens - -- **Native TAC Tokens**: Tokens originally created on the TAC EVM Layer, including the native TAC token used for gas fees and protocol operations. - -- **EVM dApp Tokens**: Tokens created by applications deployed on TAC EVM, such as liquidity provider tokens, governance tokens, and application-specific assets. - -- **Wrapped Assets**: Representations of external assets that have been brought into the TAC EVM ecosystem through various bridging mechanisms. - -## Token Deployment Process - -When tokens first cross between chains, TAC automatically handles the deployment of corresponding token contracts with proper metadata preservation. - -### Automatic Deployment Triggers - - - - When a token type first appears in a cross-chain message, the sequencer - network detects that no corresponding contract exists on the target chain. - - - - The system extracts essential token information including name, symbol, - decimals, description, and original contract address from the source chain. - - - - A standard ERC-20 (for TAC EVM) or jetton (for TON) contract is automatically - deployed using the TokenFactory with the extracted metadata. - - - - The new token deployment is registered in the cross-chain address registry, - creating a permanent mapping between chain-specific addresses. - - - -### Token Implementation Standards - - - - - **Standard Compliance**: All bridged tokens on TAC EVM implement the standard ERC-20 interface for maximum compatibility with existing tools and protocols. - - - **Metadata Extensions**: Additional metadata fields are included to maintain connection with the original TON token, including the `l1Address` field containing the original TON jetton address. - - - **Decimal Preservation**: TON tokens maintain their original 9-decimal precision when deployed on TAC EVM, rather than being converted to the typical 18-decimal EVM standard. - - ```solidity - interface IERC20Extended { - // Standard ERC-20 functions - function name() external view returns (string memory); - function symbol() external view returns (string memory); - function decimals() external view returns (uint8); - - // TAC-specific metadata - function l1Address() external view returns (string memory); - function description() external view returns (string memory); - function image() external view returns (string memory); - } - ``` - - - - - **TON Standard Compliance**: Tokens bridged to TON follow the standard jetton implementation for compatibility with TON wallets and applications. - - - **Metadata Preservation**: Original EVM token metadata is preserved in the TON jetton implementation, including name, symbol, and decimal information. - - - **Decimal Limitations**: EVM tokens with 18 decimals face limitations when bridging to TON due to TON's 9-decimal standard, potentially requiring precision adjustments. - - - -## Asset Synchronization - -The synchronization process ensures that token representations remain consistent across both chains while maintaining proper supply accounting. - -### TON to TAC EVM Synchronization - -- **Automatic Trigger**: When users attempt to execute transactions involving TON-native tokens, sequencers automatically create wrapped versions on TAC EVM if they don't already exist. - -- **Token Creation Operation**: The sequencer creates a token deployment operation that includes all necessary metadata and deployment parameters. - -- **Verification Process**: The token's existence and metadata are verified on the TON blockchain before creating the corresponding EVM representation. - -- **Address Calculation**: The corresponding TAC EVM address is calculated deterministically based on the TON token's metadata and address. - -### TAC EVM to TON Synchronization - -- **Burn Operation Detection**: When EVM tokens are burned for bridging to TON, the system detects whether a corresponding jetton exists on TON. - -- **StateInit Inclusion**: If no corresponding jetton exists, the bridging message includes StateInit data for automatic token deployment on TON. - -- **Metadata Verification**: Token metadata is verified on TAC EVM and used to create the appropriate jetton implementation on TON. - -## Decimal Management - -Different blockchain ecosystems use different decimal standards, requiring careful handling to maintain precision and user experience. - - -- **TON Standard**: TON jettons typically use 9 decimals, following the platform's conventions for token precision and gas efficiency. - -- **EVM Standard**: Ethereum and EVM chains commonly use 18 decimals, providing higher precision for complex DeFi operations and calculations. - -- **Preservation Strategy**: TAC maintains the original decimal precision of tokens when bridging, rather than converting to the target chain's standard. - -- **Compatibility Considerations**: While TAC EVM supports tokens with various decimal counts, applications must handle the precision differences appropriately. - - - - - Bridging 18-decimal TAC tokens back to TON may have limitations due to TON's - 9-decimal standard. Consider keeping high-precision tokens on the EVM side - when possible. - - -## Address Calculation and Pairing - -Token address relationships follow deterministic patterns that enable predictable bridging behavior and address pre-calculation. - -### Deterministic Address Generation - -- **TVM-Origin Tokens**: For tokens originating from TON, the corresponding TAC EVM address is calculated based on the token's TON metadata and contract address. - -- **EVM-Origin Tokens**: For tokens originating from TAC EVM, the corresponding TON jetton address is calculated using the token's EVM metadata and deployment parameters. - -- **Pre-Calculation Capability**: Applications can calculate paired token addresses before tokens actually bridge, enabling advanced features and user interface improvements. - -### Address Registry System - - - - - **Mapping Storage**: The system maintains an on-chain registry of all token address pairs, providing an authoritative source for cross-chain address relationships. - - **Query Interface**: Applications can query the registry to find corresponding addresses without needing to perform calculations or wait for token deployment. - - **Metadata Access**: The registry also stores essential token metadata for proper display and interaction across both chains. - - - - - **Automatic Registration**: When tokens are first deployed through bridging operations, they're automatically registered with their cross-chain counterparts. - - **Verification Process**: Registry updates are validated through the same consensus mechanisms as other cross-chain operations. - - **Immutable Records**: Once registered, address pairs become immutable to prevent confusion and maintain consistency. - - - -## Liquidity Management - -Token operations enable sophisticated liquidity management strategies that benefit both TON and TAC EVM ecosystems. - -### Cross-Chain Liquidity Flow - -- **Dynamic Allocation**: Tokens can flow between chains based on where liquidity is most needed, optimizing capital efficiency across both ecosystems. - -- **Arbitrage Mechanisms**: Price differences between chains create natural arbitrage opportunities that help maintain price consistency and efficient markets. - -- **Protocol Integration**: DeFi protocols can access liquidity from both ecosystems, increasing available capital and reducing slippage for users. - -### Liquidity Pool Examples - - - - - **Unified Pools**: When users provide liquidity to DEXes on TAC EVM using TON-origin tokens, the system handles two separate transactions for TVM tokens that are combined into a single Merkle message. - - **LP Token Creation**: DEX pools create liquidity provider tokens that can be bridged back to TON for use in TON-native applications. - - **Cross-Chain Trading**: The same liquidity serves traders from both ecosystems, maximizing utilization and fee generation for liquidity providers. - - - - - **Collateral Management**: TON tokens can serve as collateral in TAC EVM lending protocols, while borrowed assets can be used across both chains. - - **Interest Optimization**: Users can move assets to the chain offering the best interest rates or borrowing terms. - - **Risk Distribution**: Cross-chain lending enables better risk distribution and capital efficiency. - - - -## Token Lifecycle Management - -### Creation and Minting - -- **Initial Deployment**: New tokens can be created on either chain and automatically gain the ability to bridge to the other chain when first used in cross-chain operations. - -- **Supply Management**: Token creators maintain control over supply on the origin chain, while bridged representations have supplies managed automatically by the bridging system. - -- **Metadata Updates**: While metadata can be modified on the origin chain, changes are not currently reflected in bridged representations, maintaining stability of deployed contracts. - -### Transfer and Trading - -- **Native Transfers**: Tokens can be transferred normally within their native chains using standard blockchain mechanisms. - -- **Cross-Chain Movement**: Token movement between chains occurs through the asset bridging system as part of application interactions. - -*- *Trading Integration\*\*: Bridged tokens integrate seamlessly with existing trading infrastructure on both chains. - -### Burning and Recovery - - - - - **Bridge Burning**: Tokens are burned automatically as part of the bridging process when moving from TAC EVM back to TON. - - **Supply Reduction**: Token creators can implement burning mechanisms on their native chains to reduce total supply. - - - - - **Failed Operation Recovery**: If cross-chain operations fail, the bridging system automatically handles asset recovery and return to users. - - **Emergency Procedures**: The system includes emergency procedures for recovering assets in extreme scenarios. - - - -## Special Token Types - -### Native Gas Tokens - -- **TON Token**: Native TON receives special handling when bridging, including automatic wrapping mechanisms and gas fee considerations. - -- **TAC Token**: The native TAC token used for gas fees on TAC EVM can be bridged to TON for use in TON-native applications. - -- **Gas Fee Management**: Both native tokens can be used for gas fees on their respective chains while maintaining bridging capabilities. - -### Governance Tokens - -- **Cross-Chain Governance**: Governance tokens can be bridged to enable participation in protocol governance from either chain. - -- **Voting Rights**: Bridged governance tokens maintain their voting rights and can participate in governance processes regardless of which chain they're currently on. - -- **Delegation Mechanisms**: Token holders can delegate voting rights across chains while maintaining custody of their tokens. - -## Performance and Scalability - -### Token Operation Efficiency - -- **Batch Processing**: Multiple token operations can be batched together for improved efficiency and reduced transaction costs. - -- **Optimized Deployment**: Token deployment processes are optimized to minimize gas costs and deployment time. - -- **Caching Strategies**: Token metadata and address mappings are cached to improve application performance. - -### Scaling Considerations - -- **Throughput Limits**: Token operations are subject to the same throughput limits as other cross-chain operations in TAC. - -- **Gas Optimization**: Token contracts are optimized for gas efficiency while maintaining full functionality and security. - -- **Network Effects**: As more tokens bridge between chains, network effects improve efficiency and reduce costs for all users. diff --git a/docs.json b/docs.json index 7705ae6..8dd028b 100644 --- a/docs.json +++ b/docs.json @@ -17,152 +17,67 @@ "navigation": { "tabs": [ { - "tab": "Get Started", + "tab": "Intro", "pages": ["index"] }, { - "tab": "Build with TAC", + "tab": "Why TAC", "groups": [ { - "group": "Getting Started", - "icon": "rocket", - "pages": ["build/quickstart"] - }, - { - "group": "Smart Contracts", - "icon": "code", - "pages": [ - { - "group": "Deploy to TAC", - "pages": [ - "build/smart-contracts/tools/hardhat", - "build/smart-contracts/tools/foundry" - ] - } - ] - }, - { - "group": "TAC Proxy (Cross-Chain)", - "icon": "arrow-left-right", + "group": "Overview", "pages": [ - "build/proxy/introduction", - "build/proxy/installation", - { - "group": "Usage", - "pages": [ - "build/proxy/usage/basic-contracts", - "build/proxy/usage/upgradeable-contracts", - "build/proxy/usage/message-flow", - "build/proxy/usage/proxy-functions", - "build/proxy/usage/fee-management" - ] - }, - { - "group": "Advanced Usage", - "pages": [ - "build/proxy/advanced-usage/smart-accounts", - "build/proxy/advanced-usage/nft-support", - "build/proxy/advanced-usage/testing-framework", - "build/proxy/advanced-usage/advanced-testing", - "build/proxy/advanced-usage/argument-encoding" - ] - } + "why-tac/overview/what-is-tac", + "why-tac/overview/architecture", + "why-tac/overview/security" ] }, { - "group": "TAC SDK (Frontend)", - "icon": "blocks", + "group": " Components", "pages": [ - "build/sdk/introduction", - "build/sdk/installation", - { - "group": "Usage", - "pages": [ - "build/sdk/usage/sdk-initialization", - "build/sdk/usage/wallet-integration", - "build/sdk/usage/sending-transactions", - "build/sdk/usage/transaction-tracking", - "build/sdk/usage/asset-bridging" - ] - }, - { - "group": "Advanced Usage", - "pages": [ - "build/sdk/advanced-usage/agnostic-proxy", - "build/sdk/advanced-usage/simulation-testing" - ] - } + "why-tac/components/hybrid-dapps", + "why-tac/components/tac-sdk", + "why-tac/components/ton-adapter", + "why-tac/components/tac-evm-layer", + "why-tac/components/proxy-contracts" ] }, - { - "group": "Tooling & Resources", - "icon": "inbox", + "group": "Cross-Chain", "pages": [ - "build/tooling/contract-addresses", - "build/tooling/block-explorer", - "build/tooling/bridge", - "build/tooling/faucet" + "why-tac/cross-chain-operations/cross-chain-messaging", + "why-tac/cross-chain-operations/asset-bridging", + "why-tac/cross-chain-operations/transaction-lifecycle" ] - }, - { - "group": "Network Information", - "icon": "globe", - "pages": ["build/network-info/index"] } ] }, { - "tab": "Core Concepts", + "tab": "Quickstart", + "pages": ["/quickstart/overview"] + }, + { + "tab": "Ecosystem", "groups": [ { "group": "Overview", - "icon": "info", "pages": [ - "core-concepts/overview/what-is-tac", - "core-concepts/overview/architecture", - "core-concepts/overview/hybrid-dapps", - "core-concepts/overview/security" + "ecosystem/index" ] }, { - "group": " Components", - "icon": "blocks", + "group": "Infrastructure", + "icon": "cpu", "pages": [ - "core-concepts/components/tac-evm-layer", - "core-concepts/components/ton-adapter", - "core-concepts/components/proxy-apps", - "core-concepts/components/sequencer-network", - "core-concepts/components/tac-sdk" + "ecosystem/network-info", + "ecosystem/contract-addresses", + "ecosystem/token-list", + "ecosystem/bridge", + "ecosystem/faucet" ] }, - { - "group": "Cross-Chain Operations", - "icon": "arrow-left-right", - "pages": [ - "core-concepts/cross-chain-operations/cross-chain-messaging", - "core-concepts/cross-chain-operations/asset-bridging", - "core-concepts/cross-chain-operations/transaction-lifecycle", - "core-concepts/cross-chain-operations/message-validation" - ] - }, - - { - "group": "Token Economics", - "icon": "coins", - "pages": ["core-concepts/token-economics/token-operations"] - } - ] - }, - { - "tab": "Ecosystem", - "groups": [ - { - "group": "Overview", - "pages": ["ecosystem/index", "ecosystem/token-list"] - }, { "group": "Oracles", + "icon": "database", "pages": [ "ecosystem/oracles/redstone", "ecosystem/oracles/stork", @@ -172,6 +87,7 @@ }, { "group": "Interoperability", + "icon": "arrow-left-right", "pages": [ "ecosystem/interoperability/layerzero", "ecosystem/interoperability/hyperlane" @@ -179,20 +95,26 @@ }, { "group": "Data and Indexers", + "icon": "chart-line", "pages": [ + "ecosystem/data-indexers/blockscout", "ecosystem/data-indexers/goldsky", "ecosystem/data-indexers/dune" ] }, { "group": "Development Tools", + "icon": "code", "pages": [ + "ecosystem/development-tools/hardhat", + "ecosystem/development-tools/foundry", "ecosystem/development-tools/thirdweb", "ecosystem/development-tools/tenderly" ] }, { - "group": "Multi-Sig Wallets", + "group": "Multisig Wallets", + "icon": "shield", "pages": [ "ecosystem/multi-sig-wallets/safe", "ecosystem/multi-sig-wallets/ton-multisig" @@ -200,41 +122,82 @@ }, { "group": "RPCs", + "icon": "server", "pages": ["ecosystem/rpcs/ankr"] } ] }, - { - "tab": "API Reference", - - "groups": [ + "tab": "SDK", + "pages": [ { "group": "Overview", - "pages": ["api-reference/get-started"] + "pages": [ + "sdk/overview", + "sdk/transaction-tracking", + "sdk/frameworks", + "sdk/ton-connect", + "sdk/ts-sdk", + "sdk/python-sdk" + ] }, { - "group": "TON Adapter APIs", - "openapi": { - "source": "api-reference/ton-adapter/openapi.yaml", - "directory": "api-reference/ton-adapter" - } + "group": "Advanced Usage", + "pages": [ + "sdk/advanced-usage/agnostic-proxy", + "sdk/advanced-usage/batch-send" + ] } ] }, { - "tab": "Release Notes", + "tab": "Proxies", "groups": [ { - "group": "Release Notes", + "group": "Overview", "pages": [ - "release-notes/overview", - "release-notes/sdk", - "release-notes/ton-adapter", - "release-notes/evm" + "proxies/introduction", + { + "group": "Custom Proxy", + "pages": [ + "proxies/custom-proxy/develop", + "proxies/custom-proxy/basic-proxy", + "proxies/custom-proxy/upgradeable-proxy", + "proxies/custom-proxy/message-flow", + "proxies/custom-proxy/proxy-functions", + "proxies/custom-proxy/fee-management" + ] + }, + { + "group": "Advanced Custom Proxy", + "pages": [ + "proxies/advanced-custom-proxy/smart-accounts", + "proxies/advanced-custom-proxy/nft-support", + "proxies/advanced-custom-proxy/testing", + "proxies/advanced-custom-proxy/argument-encoding" + ] + } ] } ] + }, + { + "tab": "API", + "pages": ["api/overview"] + }, + { + "tab": "Explorer", + "pages": ["explorer/overview"] + }, + { + "tab": "Apps", + "pages": ["apps/overview"] + }, + { + "tab": "Audit", + "pages": [ + "audit/overview" + ] } ] }, @@ -246,6 +209,14 @@ { "source": "/build/get-started/introduction", "destination": "/build/quickstart" + }, + { + "source": "/home/get-started/introduction", + "destination": "/build/quickstart" + }, + { + "source": "/home/why-tac/cross-chain-messaging", + "destination": "/why-tac/cross-chain-operations/cross-chain-messaging" } ], "logo": { @@ -256,11 +227,17 @@ "decoration": "windows" }, "navbar": { - "primary": { - "type": "button", - "label": "Discord", - "href": "https://discord.gg/tacbuild" - } + "links": [ + { + "label": "Telegram", + "href": "https://t.me/TACbuild" + }, + { + "type": "button", + "label": "Discord", + "href": "https://discord.gg/tacbuild" + } + ] }, "contextual": { "options": ["copy", "view", "claude", "chatgpt"] diff --git a/ecosystem/bridge.mdx b/ecosystem/bridge.mdx new file mode 100644 index 0000000..519c8a7 --- /dev/null +++ b/ecosystem/bridge.mdx @@ -0,0 +1,69 @@ +--- +title: Bridge +description: "Bridge assets between TON and TAC EVM using the official TAC bridge interface" +--- + +The TAC bridge allows you to transfer assets between TON and TAC EVM networks. Connect both your EVM and TON wallets to bridge tokens and test cross-chain functionality. + +## Available Bridges + + + + Bridge assets between TON and TAC mainnet with live tokens and real value transfers. + + + + Bridge testnet assets between TON testnet and SPB testnet for development and testing. + + + +## How to Use + +First, get tokens from the [Faucet](/ecosystem/faucet). + + + Connecting either of 2 wallets below is sufficient to complete the bridge on both directions + + + + + **Step 1:** Connect your EVM Wallet (MetaMask, Rabby, etc.) + + **Step 2:** Confirm adding [TAC Network](/ecosystem/network-info) + + **Step 3:** Choose the asset you want to bridge + + **Step 4:** Click the button and confirm action in your connected wallet + + + + **Step 1:** Check if Testnet is selected in your TON Wallet (Wallet, Tonkeeper, etc.) + + **Step 2:** Connect Wallet + + **Step 3:** Choose the asset you want to bridge + + **Step 4:** Click the button and confirm action in your connected wallet + + + +### Wrapping + +You can also wrap and unwrap `TAC`\<-\>`WTAC` through this app. + +## Asset Support + +- TON native tokens: `TON` itself, fungible tokens (`Jetton` standard) +- TAC native tokens: `TAC` itself, fungible tokens (`ERC20` standard) + + + Bridging the `WTAC` ERC-20 token to TON will first unwrap it. As a result, `WTAC` and `TAC` represent the same asset on TON. + diff --git a/ecosystem/contract-addresses.mdx b/ecosystem/contract-addresses.mdx new file mode 100644 index 0000000..5e692f8 --- /dev/null +++ b/ecosystem/contract-addresses.mdx @@ -0,0 +1,60 @@ +--- +title: Core Contracts +description: "The page lists the core TAC Protocol's contract addresses used in TON and TAC blockchains while interacting with TON Adapter" +--- + +## TON Adapter addresses + + + + | Contract Name | Address | + |---------------|---------| + | **Cross Chain Layer** | `EQAgpWmO8nBUrmfOOldIEmRkLEwV-IIfVAlJsphYswnuL80R` | + | **Settings** | `EQBpUijPLYC9dcmw8Y-d23E9iX-2HBCupc5oqoYgXnORSRmi` | + | **Jetton Proxy** | `EQAChAswsPNsU2k3A5ZDO_cfhWknCGS6WMG2Jz15USMwxMdw` | + | **NFT Proxy** | `EQDDqOCQr6EPBmJnFF-dDKuNFLctG-SEYFhz66m17uisfLXh` | + + + + | Contract Name | Address | + |---------------|---------| + | **Cross Chain Layer** | `EQAVGclLM4b0fb4pYRbS-OUUJiXlaTk8C0D1IueAzx6XgGo0` | + | **Settings** | `EQAf49rSyJGxh_OjoWJYwzpZCvVQdlYVNVy-DN3awXg8l5ZJ` | + | **Jetton Proxy** | `EQAgBa6tNOqswtuRggf47BIO809mxHUgkkk5EYmfISDMJ_Zw` | + | **NFT Proxy** | `EQAATNVhlCNQLj9a-BFoGQAt5qCJI827frKFjcbGVHyrEUBM` | + + + +## TAC Adapter addresses + + + + | Contract Name | Address | + |---------------|---------| + | **Cross Chain Layer** | `0x9fee01e948353E0897968A3ea955815aaA49f58d` | + | **Settings** | `0x1278fc68146643D7a05baAb1531618613999828D` | + | **Consensus** | `0xAe635dE674cFE4aFD179CDE441aBBE6504A20A98` | + | **Merkle Tree Utils** | `0xE11F57B7C650f9FeAcFCb414ab65F5A19bdFCc44` | + | **Token Utils** | `0x6BE421FEf556c41170Cd3F652ee469837409AAF5` | + | **Smart Account Factory** | `0x070820Ed658860f77138d71f74EfbE173775895b` | + | **Smart Account Blueprint** | `0xEc94C850F17ab72A31CEa784dFD3ffc8789A9bE4` | + | **Agnostic Proxy** | `0x1198EE17A9108733AbB085fba3AEf8E7A5f0B238` | + | **Multicall** | `0xcA11bde05977b3631167028862bE2a173976CA11` | + | **WTAC** | `0xB63B9f0eb4A6E6f191529D71d4D88cc8900Df2C9` | + + + + | Contract Name | Address | + |---------------|---------| + | **Cross Chain Layer** | `0x4f3b05a601B7103CF8Fc0aBB56d042e04f222ceE` | + | **Settings** | `0xF52a9A4C747Ce4BED079E54eB074d1C8879021D1` | + | **Consensus** | `0x2BF0030eD6635BCc01aba0D991e1b087877e1cA5` | + | **Merkle Tree Utils** | `0x7c8CDB0Fd5AFD238d8e3782bc3c548859b19BAAb` | + | **Token Utils** | `0xB9856463dE80753b0717E3d62DA6236c408734Df` | + | **Smart Account Factory** | `0x5919D1D0D1b36F08018d7C9650BF914AEbC6BAd6` | + | **Smart Account Blueprint** | `0xeAB80f5369689a2D142f25E654d9822A7725028B` | + | **Agnostic Proxy** | `0x4619d0Ed01a66D25F7C83E70C8515897D502cDBF` | + | **Multicall** | `0xcA11bde05977b3631167028862bE2a173976CA11` | + | **WTAC** | `0xCf61405b7525F09f4E7501fc831fE7cbCc823d4c` | + + diff --git a/ecosystem/data-indexers/blockscout.mdx b/ecosystem/data-indexers/blockscout.mdx new file mode 100644 index 0000000..fa6d283 --- /dev/null +++ b/ecosystem/data-indexers/blockscout.mdx @@ -0,0 +1,14 @@ +--- +title: Blockscout +--- + +Blockscout API and Pro API provide blockchain data access for 100+ chains including TAC. Pro option offers higher rate limits, custom endpoints, improved performance, and multi-chain support. + + + + + diff --git a/ecosystem/data-indexers/dune.mdx b/ecosystem/data-indexers/dune.mdx index e5ef022..4287142 100644 --- a/ecosystem/data-indexers/dune.mdx +++ b/ecosystem/data-indexers/dune.mdx @@ -1 +1,14 @@ -Coming soon! +--- +title: Dune +--- + +Dune is a leading, community-driven blockchain analytics platform that allows users to query, visualize, and analyze on-chain data from over 100+ networks including TAC. + + + + + diff --git a/ecosystem/data-indexers/goldsky.mdx b/ecosystem/data-indexers/goldsky.mdx index b688bbc..44e2b80 100644 --- a/ecosystem/data-indexers/goldsky.mdx +++ b/ecosystem/data-indexers/goldsky.mdx @@ -2,38 +2,23 @@ title: Goldsky --- -Goldsky is Web3’s realtime data platform, giving TAC developers access to world-class data infrastructure specifically optimized for building powerful onchain applications within the TON ecosystem (powered by TAC). - -Seamlessly access the blockchain data you need with lightning-fast indexing, resilient subgraphs tailored for TAC, and flexible data streaming pipelines. Spend less time dealing with the complexities of infrastructure management and more time creating exceptional user experiences on TAC. - -## Why Goldsky for TAC? - -- **Scalable Infrastructure**: Scalable and resilient infrastructure, ensuring smooth performance as your TAC application grows. -- **TAC Developer-Friendly Tools**: Easily integrate and iterate your apps within the TON ecosystem (powered by TAC) without getting bogged down by complex data engineering. -- **Enterprise Support**: The Goldsky team offers dedicated, 24/7 support specifically tailored for the TAC developer community. +Seamlessly access the blockchain data you need with lightning-fast indexing by Goldsky, resilient subgraphs tailored for TAC, and flexible data streaming pipelines. ## Goldsky Products -### Subgraphs - -**Subgraphs** let you efficiently access blockchain data specific to your TAC application needs. - -- **Fast Queries**: Optimized infrastructure ensures faster query responses, specifically fine-tuned for TAC network data. -- **Flexible Integration**: Customize your queries and indexing strategy to suit your application's unique TAC-specific requirements. -- **Tagging & Organization**: Use tagging for easier data organization and accessibility within TAC projects. - -**Use Cases**: dApps, NFT marketplaces, gaming platforms, DAOs, or any application on TAC that demands reliable, real-time blockchain data. - -### Mirror +Explore data products like **Subgraphs** and **Edge** for TAC: -**Mirror** provides complete control over TAC blockchain data. Beyond just querying, you can stream TAC's onchain data directly into your own database. + -- **Realtime Streaming**: Stream TAC data directly into your existing systems, enabling interactive user experiences. -- **Custom Data Handling**: Integrate and synchronize TAC blockchain data into your internal databases, merging seamlessly with offchain data. -- **Automatic Data Updates**: Goldsky maintains continuous synchronization to ensure accuracy of your TAC blockchain data. + + -**Use Cases**: Complex TAC network queries, database integration, real-time analytics, points systems, leaderboards, user progress tracking, loyalty programs, and custom TAC-specific dashboards. + ## Getting Started -For more details, check out the [Goldsky Documentation](https://docs.goldsky.com/chains/tac/?utm_source=tac&utm_medium=docs). Start building smarter, faster, and deliver a superior experience to your users on TAC. +For detailed instructions check out the [Goldsky Documentation](https://docs.goldsky.com/chains/tac/?utm_source=tac&utm_medium=docs). diff --git a/build/smart-contracts/tools/foundry.mdx b/ecosystem/development-tools/foundry.mdx similarity index 62% rename from build/smart-contracts/tools/foundry.mdx rename to ecosystem/development-tools/foundry.mdx index 097cc5c..5ea291a 100644 --- a/build/smart-contracts/tools/foundry.mdx +++ b/ecosystem/development-tools/foundry.mdx @@ -1,9 +1,18 @@ --- title: Foundry -description: "Build, test, and deploy Solidity contracts on TAC using Foundry - the fast, portable toolkit" --- -TAC EVM Layer provides full compatibility with Foundry, the blazing fast development toolkit for Ethereum. Deploy your contracts with lightning speed, run comprehensive Solidity tests, and leverage advanced debugging features. +TAC EVM Layer provides full compatibility with Foundry, the blazing fast development toolkit for Ethereum. + + + + Official documentation + + ## Installation & Setup @@ -64,8 +73,8 @@ Foundry works seamlessly with TAC - no special configuration required beyond sta optimizer_runs = 200 via_ir = true - # TAC Saint Petersburg Testnet [rpc_endpoints] + # TAC Saint Petersburg Testnet tac_testnet = "https://spb.rpc.tac.build" tac_mainnet = "https://rpc.tac.build" @@ -74,6 +83,10 @@ Foundry works seamlessly with TAC - no special configuration required beyond sta + + Never commit your private key to version control. Add `.env` to your `.gitignore` file. + + Create a `.env` file for your private key: ```bash @@ -84,10 +97,6 @@ Foundry works seamlessly with TAC - no special configuration required beyond sta TAC_TESTNET_RPC=https://spb.rpc.tac.build TAC_MAINNET_RPC=https://rpc.tac.build ``` - - - Never commit your private key to version control. Add `.env` to your `.gitignore` file. - @@ -121,24 +130,26 @@ contract SimpleStorage { } ``` - -### Install Dependencies +## Build & Compilation ```bash -# Install OpenZeppelin contracts -forge install OpenZeppelin/openzeppelin-contracts +# Build contracts +forge build +# Build with specific Solidity version +forge build --use 0.8.19 -# Update dependencies -forge update +# Build with size optimization +forge build --sizes + +# Generate ABI files +forge build --extra-output abi ``` -## Testing +## Testing & Debugging Foundry's Solidity-based testing provides unmatched speed and power for smart contract testing. -### Comprehensive Test Suite - ```solidity // test/SimpleStorage.t.sol pragma solidity ^0.8.19; @@ -148,103 +159,140 @@ import "../src/SimpleStorage.sol"; contract SimpleStorageTest is Test { SimpleStorage public simpleStorage; - + event DataStored(uint256 indexed value, address indexed sender); - + function setUp() public { simpleStorage = new SimpleStorage(42); } - + function testInitialValue() public { assertEq(simpleStorage.get(), 42); } - + function testSetValue() public { simpleStorage.set(100); assertEq(simpleStorage.get(), 100); } - + function testSetValueEmitsEvent() public { vm.expectEmit(true, true, false, true); emit DataStored(200, address(this)); - + simpleStorage.set(200); } - + function testFuzzSetValue(uint256 _value) public { simpleStorage.set(_value); assertEq(simpleStorage.get(), _value); } - + function testMultipleUsers() public { address user1 = makeAddr("user1"); address user2 = makeAddr("user2"); - + vm.prank(user1); simpleStorage.set(100); - + vm.prank(user2); simpleStorage.set(200); - + assertEq(simpleStorage.get(), 200); } } ``` + + Foundry's fuzzing capabilities are excellent for testing edge cases in cross-chain scenarios. + ### Run Tests - - ```bash - # Run all tests - forge test - - # Run tests with verbosity - forge test -vvv - - # Run specific test - forge test --match-test testSetValue - - # Run tests for specific contract - forge test --match-contract SimpleStorageTest - - # Run with gas reporting - forge test --gas-report - ``` - - - - ```bash - # Test against TAC testnet fork - forge test --fork-url https://spb.rpc.tac.build - - # Test at specific block - forge test --fork-url https://spb.rpc.tac.build --fork-block-number 1000000 - - # Test with environment variable - forge test --fork-url $TAC_TESTNET_RPC - ``` - + + ```bash + # Run all tests + forge test + + # Run tests with verbosity + forge test -vvv + + # Run specific test + forge test --match-test testSetValue + + # Run tests for specific contract + forge test --match-contract SimpleStorageTest + + # Run with gas reporting + forge test --gas-report + ``` + + + + ```bash + # Test against TAC testnet fork + forge test --fork-url https://spb.rpc.tac.build + + # Test at specific block + forge test --fork-url https://spb.rpc.tac.build --fork-block-number 1000000 + + # Test with environment variable + forge test --fork-url $TAC_TESTNET_RPC + ``` + - - Foundry's fuzzing capabilities are excellent for testing edge cases in cross-chain scenarios. - + + + ```bash + # Generate coverage report + forge coverage + + # Coverage with specific format + forge coverage --report lcov + + # Coverage for specific test + forge coverage --match-test testSetValue + ``` + + + + ```bash + # Gas report for all tests + forge test --gas-report + + # Gas snapshot (track gas changes) + forge snapshot + + # Compare gas usage + forge snapshot --diff + ``` + + + + ```bash + # Debug specific test + forge test --debug testSetValue + + # Debug with maximum verbosity + forge test -vvvv --match-test testSetValue + + # Trace contract calls + forge test --trace --match-test testSetValue + ``` + + ## Deployment Deploy contracts efficiently using Foundry's built-in deployment scripts and tools. -### Deployment Script - ```solidity // script/Deploy.s.sol pragma solidity ^0.8.19; import "forge-std/Script.sol"; import "../src/SimpleStorage.sol"; -import "../src/TacEnabledContract.sol"; contract DeployScript is Script { function run() external { @@ -255,12 +303,7 @@ contract DeployScript is Script { // Deploy SimpleStorage SimpleStorage simpleStorage = new SimpleStorage(42); console.log("SimpleStorage deployed to:", address(simpleStorage)); - - // Deploy TAC-enabled contract - address crossChainLayer = 0x742d35Cc6473f70c2Be7d64E5f5D09A6FCd067; - TacEnabledContract tacContract = new TacEnabledContract(crossChainLayer); - console.log("TacEnabledContract deployed to:", address(tacContract)); - + vm.stopBroadcast(); // Log deployment info @@ -273,6 +316,10 @@ contract DeployScript is Script { ### Deploy Commands + + Ensure you have sufficient TAC tokens for gas fees before deploying to mainnet. + + ```bash @@ -282,13 +329,6 @@ contract DeployScript is Script { --broadcast \ --verify ``` - - Expected output: - ``` - SimpleStorage deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3 - TacEnabledContract deployed to: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 - Deployment completed on network: 2391 - ``` @@ -299,82 +339,6 @@ contract DeployScript is Script { --broadcast \ --verify ``` - - - Ensure you have sufficient TAC tokens for gas fees before deploying to mainnet. - - - - -### Dry Run Deployment - -```bash -# Simulate deployment without broadcasting -forge script script/Deploy.s.sol:DeployScript --rpc-url tac_testnet - -# Check gas costs -forge script script/Deploy.s.sol:DeployScript --rpc-url tac_testnet --gas-estimate -``` - - -## Advanced Features - -### Build and Compilation - -```bash -# Build contracts -forge build - -# Build with specific Solidity version -forge build --use 0.8.19 - -# Build with size optimization -forge build --sizes - -# Generate ABI files -forge build --extra-output abi -``` - -### Testing and Debugging - - - - ```bash - # Generate coverage report - forge coverage - - # Coverage with specific format - forge coverage --report lcov - - # Coverage for specific test - forge coverage --match-test testSetValue - ``` - - - - ```bash - # Gas report for all tests - forge test --gas-report - - # Gas snapshot (track gas changes) - forge snapshot - - # Compare gas usage - forge snapshot --diff - ``` - - - - ```bash - # Debug specific test - forge test --debug testSetValue - - # Debug with maximum verbosity - forge test -vvvv --match-test testSetValue - - # Trace contract calls - forge test --trace --match-test testSetValue - ``` @@ -400,8 +364,6 @@ cast estimate CONTRACT_ADDRESS "set(uint256)" 100 \ --rpc-url https://spb.rpc.tac.build ``` -## Configuration Optimization - ## Common Issues & Solutions @@ -410,51 +372,26 @@ cast estimate CONTRACT_ADDRESS "set(uint256)" 100 \ **Solutions**: - Update Foundry: `foundryup` - - Clean build artifacts: `forge clean` + - Rebuild artifacts: + ```bash + # Reset and rebuild + forge clean + forge build --force + ``` - Reinstall dependencies: `forge install --no-commit` - Check Solidity version compatibility - - ```bash - # Reset and rebuild - forge clean - forge build --force - ``` **Problem**: Network timeouts or connection failures **Solutions**: - - Verify RPC URLs in foundry.toml + - Verify RPC URLs in `foundry.toml` - Use environment variables for RPC endpoints + ```toml + [rpc_endpoints] + tac_testnet = "${TAC_TESTNET_RPC}" + ``` - Increase timeout settings - - ```toml - [rpc_endpoints] - tac_testnet = "${TAC_TESTNET_RPC}" - ``` - - - -## Next Steps - -With Foundry configured for TAC, you have access to one of the most powerful smart contract development environments available. - - - - Build contracts that receive cross-chain messages from TON - - - Complete guide to deploying contracts on TAC networks - - diff --git a/ecosystem/development-tools/hardhat.mdx b/ecosystem/development-tools/hardhat.mdx new file mode 100644 index 0000000..c9fcf8e --- /dev/null +++ b/ecosystem/development-tools/hardhat.mdx @@ -0,0 +1,67 @@ +--- +title: Hardhat +description: "Deploy, test, and verify Solidity contracts on TAC using Hardhat - the complete development environment" +--- + + + + Official documentation + + + +TAC EVM Layer provides full compatibility with Hardhat, Ethereum's most popular development framework. Deploy your existing Solidity contracts without modification, test, and verify contracts on the [Block Explorer](/explorer/overview). + +## Installation & Setup + +Setting up Hardhat for TAC development requires no special configuration - it works exactly like any other EVM chain. + +Refer to our example app [create-tac-app](/quickstart/overview) to see the relevant hardhat deployment approach. + +## Deployment + +Below you can find the deployment commands used within [create-tac-app](/quickstart/overview) + + + Ensure you have sufficient TAC tokens for gas fees before deploying to mainnet. + + + + + ```bash + # Deploy to TAC Saint Petersburg Testnet + npx hardhat run scripts/deploy.ts --network tacTestnet + ``` + + + + ```bash + # Deploy to TAC Mainnet (production) + npx hardhat run scripts/deploy.ts --network tacMainnet + ``` + + + +## Common Issues & Solutions + + + + **Problem**: RPC connection failures or timeouts + + **Solutions**: + - Verify RPC URLs are correct + - Increase timeout in network configuration + ```javascript + networks: { + tacTestnet: { + url: "https://spb.rpc.tac.build", + timeout: 60000, // Increase timeout + } + } + ``` + - Try alternative RPC endpoints if available + + diff --git a/ecosystem/development-tools/tenderly.mdx b/ecosystem/development-tools/tenderly.mdx index e5ef022..ce2f089 100644 --- a/ecosystem/development-tools/tenderly.mdx +++ b/ecosystem/development-tools/tenderly.mdx @@ -1 +1,9 @@ -Coming soon! +Tenderly is a complete, full-stack Web3 infrastructure solution for the entire dapp lifecycle, from development to on-chain scaling. + + + + + diff --git a/ecosystem/development-tools/thirdweb.mdx b/ecosystem/development-tools/thirdweb.mdx index e5ef022..40387dc 100644 --- a/ecosystem/development-tools/thirdweb.mdx +++ b/ecosystem/development-tools/thirdweb.mdx @@ -1 +1,18 @@ -Coming soon! +Thirdweb is a complete web3 development toolkit, built by developers for web3 developers. With powerful built-in tools, such as wallet infrastructure, web3 payment solutions & authentication methods, thirdweb has everything you need to build powerful web3 apps in no time. + + + + + + + + > + + + \ No newline at end of file diff --git a/build/tooling/faucet.mdx b/ecosystem/faucet.mdx similarity index 50% rename from build/tooling/faucet.mdx rename to ecosystem/faucet.mdx index 2498b3c..b6a539c 100644 --- a/build/tooling/faucet.mdx +++ b/ecosystem/faucet.mdx @@ -1,41 +1,30 @@ --- title: Faucet -description: "Get testnet TAC tokens for development and testing on Saint Petersburg testnet" +description: "Get testnet `TAC` and `TON`" --- The TAC faucet provides free testnet TAC tokens for gas fees and testing your hybrid dApps on the Saint Petersburg testnet. Simple wallet connection and instant token distribution for seamless development. ## Available Faucet - + + Get free testnet `TAC` for gas fees, contract deployment + + + - Get free testnet TAC tokens for gas fees, contract deployment, and testing - your applications on the Saint Petersburg testnet. + Get free testnet `TON` to initiate cross-chain transactions -## How to Use - - - - - Connect your Ethereum wallet (MetaMask, WalletConnect, etc.) - - Ensure you're on the Saint Petersburg testnet (Chain ID: 2391) - - Request testnet TAC tokens for gas fees - - Tokens are delivered instantly to your wallet - - - - - Reasonable rate limits to prevent abuse - - Multiple requests allowed per day for active development - - Fair distribution ensures availability for all developers - - Contact support if you need additional tokens for large projects - - - ## Quick Links @@ -49,6 +38,6 @@ The TAC faucet provides free testnet TAC tokens for gas fees and testing your hy - For large-scale testing or educational purposes, reach out on Discord for additional token allocation. + For large-scale testing or educational purposes, reach out on [Discord](https://discord.gg/tacbuild) for additional token allocation. diff --git a/ecosystem/index.mdx b/ecosystem/index.mdx index 5ba9184..83b1570 100644 --- a/ecosystem/index.mdx +++ b/ecosystem/index.mdx @@ -1,12 +1,28 @@ --- -title: Ecosystem Overview +title: Ecosystem description: "TAC's ecosystem partners providing oracles, interoperability, data indexing, development tools, and infrastructure" --- TAC works with established partners across the blockchain ecosystem to provide developers with proven tools and services for building hybrid dApps. +Find more infrastructure partners on our [main page](https://tac.build/tacnetwork). + +## Infrastructure + +The core TAC-maintained building blocks. + + + + + + + + + ## Oracles +Services that provide smart contracts with access to external, real-world data and off-chain price feeds. + @@ -16,6 +32,8 @@ TAC works with established partners across the blockchain ecosystem to provide d ## Interoperability +Protocols and bridges that enable seamless communication and asset transfers between different blockchain networks. + + - + + + -## Multi-Sig Wallets +## Multisig Wallets - - +Secure digital wallets that require multiple authorized signatures to approve a transaction, enhancing fund safety. + + + + ## RPCs +Infrastructure providers that offer the necessary endpoints to interact with the blockchain. + diff --git a/ecosystem/interoperability/hyperlane.mdx b/ecosystem/interoperability/hyperlane.mdx index e5ef022..be59144 100644 --- a/ecosystem/interoperability/hyperlane.mdx +++ b/ecosystem/interoperability/hyperlane.mdx @@ -1 +1,15 @@ -Coming soon! + +Hyperlane is live on TAC and already onboarded some assets. + +Refer to [Noon](https://app.noon.capital/bridge) with Hyperlane as a provider to bridge to/from TAC. + + + + + + + diff --git a/ecosystem/interoperability/layerzero.mdx b/ecosystem/interoperability/layerzero.mdx index e5ef022..a3b26e8 100644 --- a/ecosystem/interoperability/layerzero.mdx +++ b/ecosystem/interoperability/layerzero.mdx @@ -1 +1,16 @@ -Coming soon! +--- +title: LayerZero +--- + +LayerZero works with asset issuers, chains, and applications to make money more extensible. Issue any asset on chain, extend its reach to new ecosystems, connect fragmented liquidity and more. + + + + + + + diff --git a/ecosystem/multi-sig-wallets/safe.mdx b/ecosystem/multi-sig-wallets/safe.mdx index 0bb36aa..0f1a3f4 100644 --- a/ecosystem/multi-sig-wallets/safe.mdx +++ b/ecosystem/multi-sig-wallets/safe.mdx @@ -5,6 +5,17 @@ description: "Deploy secure multi-signature wallets on TAC with Safe's battle-te Safe (formerly Gnosis Safe) is a multi-signature wallet that requires multiple signatures to execute transactions. Instead of one private key controlling funds, Safe requires M-of-N signatures from designated owners. + + + + + + + ## How it works Safe deploys a smart contract that acts as your wallet. You define: diff --git a/ecosystem/multi-sig-wallets/ton-multisig.mdx b/ecosystem/multi-sig-wallets/ton-multisig.mdx index 9f07782..dde5cc4 100644 --- a/ecosystem/multi-sig-wallets/ton-multisig.mdx +++ b/ecosystem/multi-sig-wallets/ton-multisig.mdx @@ -16,8 +16,8 @@ TON Multisig deploys a smart contract on TON that requires multiple signatures b ## Setup - - Open [multisig.ton.org](https://multisig.ton.org) + + Go to [multisig.ton.org](https://multisig.ton.org) diff --git a/build/network-info/index.mdx b/ecosystem/network-info.mdx similarity index 66% rename from build/network-info/index.mdx rename to ecosystem/network-info.mdx index a85e1bc..b9e053d 100644 --- a/build/network-info/index.mdx +++ b/ecosystem/network-info.mdx @@ -1,17 +1,8 @@ --- title: Network Details -description: "TAC network information including RPC endpoints, explorers, and chain parameters" +description: "The chain parameters for TAC networks" --- -This page is updated regularly as the network information is updated. - -TAC EVM is a standard EVM chain based on Cosmos with native EVM integration. These are the chain parameters for TAC networks: - - - TAC Turin has been deprecated. Please use the Saint Petersburg Testnet for - your nodes and applications. - - ## Network Configuration @@ -26,8 +17,9 @@ TAC EVM is a standard EVM chain based on Cosmos with native EVM integration. The | **Currency Symbol** | TAC | | **Block Explorer** | [https://explorer.tac.build](https://explorer.tac.build) | | **Fee Schema** | EIP-1559 | - - ### Quick Add to Wallet + | **Block Time** | < 2 seconds | + + ### Quick Add to Wallet ```json { @@ -44,8 +36,8 @@ TAC EVM is a standard EVM chain based on Cosmos with native EVM integration. The ``` - - **Saint Petersburg Testnet** - Current recommended testnet for development + + **TAC Saint Petersburg Testnet** - Current recommended testnet for development | Parameter | Value | |-----------|--------| @@ -54,11 +46,11 @@ TAC EVM is a standard EVM chain based on Cosmos with native EVM integration. The | **Chain ID** | `2391` | | **Currency Symbol** | TAC | | **Block Explorer** | [https://spb.explorer.tac.build](https://spb.explorer.tac.build) | - | **Faucet** | [https://spb.faucet.tac.build](https://spb.faucet.tac.build) | | **Fee Schema** | EIP-1559 | - | **Block Time** | 2 seconds | - - ### Quick Add to Wallet + | **Block Time** | < 2 seconds | + | **Faucet** | [https://spb.faucet.tac.build](https://spb.faucet.tac.build) | + + ### Quick Add to Wallet ```json { @@ -78,26 +70,7 @@ TAC EVM is a standard EVM chain based on Cosmos with native EVM integration. The ## Getting Testnet Tokens - - - Go to [https://spb.faucet.tac.build](https://spb.faucet.tac.build) to access - the Saint Petersburg testnet faucet. - - - - Connect your Ethereum wallet (MetaMask, etc.) and ensure you're on the Saint - Petersburg testnet. - - - - Request testnet TAC tokens for gas fees and testing your applications. - - - - Use the tokens to deploy contracts and test your hybrid dApps on the - testnet. - - +Refer to [Faucet page](/ecosystem/faucet) ## Common Integration Issues diff --git a/ecosystem/oracles/apro.mdx b/ecosystem/oracles/apro.mdx index 3477453..3a57e83 100644 --- a/ecosystem/oracles/apro.mdx +++ b/ecosystem/oracles/apro.mdx @@ -1,450 +1,26 @@ --- title: APRO -description: Fast integration of APRO predictor services into TAC chain --- APRO is building a secure platform by combining off-chain processing with on-chain verification, extending both data access and computational capabilities. This forms the foundation of APRO Data Service, improving data accuracy and efficiency while offering the flexibility to create custom solutions tailored to the specific needs of DApp businesses. ## Available Price Feeds -| Feed Name | Network | Address | -| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- | -| BTC/USD | Mainnet | [0xe3C2d89Ef01A06F1d2817036919e0424675290AD](https://explorer.tac.build/address/0xe3C2d89Ef01A06F1d2817036919e0424675290AD) | -| TON/USD | Mainnet | [0x0d72Da0e698D97538759174a66DB8cAA55522313](https://explorer.tac.build/address/0x0d72Da0e698D97538759174a66DB8cAA55522313) | -| ETH/USD | Mainnet | [0xd0E76152Af372D2a85FaF3E4c4E52E6F95e22e53](https://explorer.tac.build/address/0xd0E76152Af372D2a85FaF3E4c4E52E6F95e22e53) | -| USDT/USD | Mainnet | [0xE13FEf4A5940392941B51D0760b81750364F5aC5](https://explorer.tac.build/address/0xE13FEf4A5940392941B51D0760b81750364F5aC5) | -| BTC/USD | Testnet | [0xd0E76152Af372D2a85FaF3E4c4E52E6F95e22e53](https://spb.explorer.tac.build/address/0xd0E76152Af372D2a85FaF3E4c4E52E6F95e22e53) | -| USDT/USD | Testnet | [0xF424cAA15eF7F8524bF55bD838935A25cDf1caae](https://spb.explorer.tac.build/address/0xF424cAA15eF7F8524bF55bD838935A25cDf1caae) | +Up to date price feeds from the official docs: -Data Push: APRO Data Push uses a "Push-Based" data model to deliver Price Feed services. Decentralized independent node operators continuously gather and push data updates to the blockchain when certain price thresholds or time intervals are met. This method improves blockchain scalability, supports various data products, and provides timely updates. - -We continually refine and optimize our platform to deliver enhanced services and experiences, driving forward the development and application of blockchain technology. - -Key Benefits of APRO Data Service - -- Advantages of APRO Combination of Off-Chain Computing and On-Chain Verification - APRO platform integrates off-chain computing with on-chain verification to extend computing capabilities and data access while ensuring system security and reliability. - -- Customization of Secure and Trustworthy Computing Logic - DApp businesses can customize computing logic according to their needs and run it on the APRO platform, achieving personalized business logic processing without concerns about security issues. - -- Enhancement of Oracle Network Security and Stability - We focus on enhancing the security and stability of the Oracle network through various measures to ensure continuous service capability. - -- Hybrid Node Approach - Introducing a Hybrid node approach that combines on-chain and off-chain computing resources to improve computing efficiency and performance. - -- Multi-Network Communication Scheme - Establishing a multi-centralized network communication scheme ensures network stability and reliability while reducing the risk of single-point failures. - -- TVWAP Price Discovery Mechanism - Applying the TVWAP price discovery mechanism ensures fairness and accuracy of data prices, preventing data tampering and malicious manipulation. + + + + ## Data Push -- Data Push: Threshold-Based Data Updates - APRO Data Push offers a "Push-Based" data model, which we use to provide Price Feed services. In this model, decentralized independent node operators continuously aggregate and push data updates to the blockchain when specific price thresholds or heartbeat intervals are reached. This approach enhances blockchain scalability, supports a broader range of data products, and ensures timely updates. - -- Trusted Data for DeFi - APRO Data Push Model is widely utilized in various applications, especially in DeFi protocols and smart contracts, providing highly trusted, real-time, and secure data. - -- Reliable Data Transmission - The APRO Data Push model employs multiple high-quality data transmission methods, leveraging a hybrid node architecture, multi-centralized communication networks, the TVWAP price discovery mechanism, and a self-managed multi-signature framework. This ensures the delivery of accurate, tamper-resistant data, safeguarded against vulnerabilities or oracle-based attacks, ensuring reliability across diverse use cases. +APRO's threshold-based data updates use a "Push-Based" model. In this model, decentralized independent node operators continuously aggregate and push data updates to the blockchain when specific price thresholds or heartbeat intervals are reached. This approach enhances blockchain scalability, supports a broader range of data products, and ensures timely updates. ## Getting Started -You can use APRO Data Push to connect your smart contracts to asset pricing data. These data feeds aggregate information from many independent APRO node operators. Each price feed has an on-chain address and functions that enable contracts to read real-time pricing data directly from that address. - -This section explains the Data Push, where APRO pushes real-time data to your contracts, allowing for immediate access to pricing updates without requiring frequent manual requests. This approach optimizes performance by reducing on-chain calls and enhances efficiency for applications that need continuous updates. - -You'll learn how to read Data Feeds and store the value on-chain using Solidity. The code for reading Data Feeds on Tac or other EVM-compatible blockchains remains consistent across different chains and data feed types. You can choose various types of feeds depending on your use case, but the request and response format stays the same. However, the answer's decimal length and expected value ranges might differ depending on the feed you are using. - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; - -/** - * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED - * VALUES FOR CLARITY. - * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. - * DO NOT USE THIS CODE IN PRODUCTION. - */ - -interface AggregatorV3Interface { - - function decimals() external view returns (uint8); - function description() external view returns (string memory); - function version() external view returns (uint256); - - // getRoundData and latestRoundData should both raise "No data present" - // if they do not have data to report, instead of returning unset values - // which could be misinterpreted as actual reported values. - function getRoundData(uint80 _roundId) - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - function latestRoundData() - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - -} - - -contract DataConsumer { - AggregatorV3Interface internal dataFeed; - - /** - * Network: Tac testnet - * Aggregator: BTC/USD - * Address: 0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD - */ - constructor() { - dataFeed = AggregatorV3Interface( - 0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD - ); - } - - /** - * Returns the latest answer. - */ - function getDataFeedLatestAnswer() public view returns (int) { - // prettier-ignore - ( - /* uint80 roundId */, - int256 answer, - /*uint256 startedAt*/, - /*uint256 timeStamp*/, - /*uint80 answeredInRound*/ - ) = dataFeed.latestRoundData(); - return answer; - } - - /** - * Returns decimals. - */ - function getDecimals() public view returns (uint8) { - uint8 decimals = dataFeed.decimals(); - return decimals; - } -} - -``` - -This example contract obtains the latest price answer from the BTC / USD feed on the Tac testnet. - -## EVM Guides - -This section provides essential guides for integrating APRO Price Feeds on EVM-compatible blockchains. Whether you're working with smart contracts or using APIs to fetch price data, these guides will help you implement APRO's oracle solutions effectively. - -### Using Price Feed - -Learn how to read price feeds on-chain with Solidity and off-chain using Web3.js. This guide walks you through setting up your RPC endpoint, selecting the right Price Feed contract address, and interacting with data feeds for real-time price updates. - -The code for reading Data Push is the same across all EVM-compatible blockchains and price feed types. You choose different types of price feed for different uses, but the request and response format are the same. To read a price feed, specify the following variables: - -- RPC endpoint URL: This determines which network your smart contracts will run on. You can use a node provider service or point to your own client. If you are using a Web3 wallet, it is already configured with the RPC endpoints for several networks and the [Remix IDE](https://remix-project.org/) will automatically detect them for you. - -- Feed contract address: This determines which Price Feed your smart contract will read. Contract addresses are different for each network. You can find the available contract addresses on the following pages: - [Price Feed Contract Addresses](#Price-Feed-Contract) - -The examples in this document indicate these variables, but you can modify the examples to work on different networks and read different feeds. -This guide shows example code that reads Price Feed using the following languages: - -#### Onchain consumer contracts - -These code examples demonstrate how to deploy a consumer contract on-chain that reads a data feed and stores the value. - -##### Solidity - -To consume price data, your smart contract should reference AggregatorV3Interface, which defines the external functions implemented by Data Feeds. - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; - -/** - * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED - * VALUES FOR CLARITY. - * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. - * DO NOT USE THIS CODE IN PRODUCTION. - */ - -interface AggregatorV3Interface { - - function decimals() external view returns (uint8); - function description() external view returns (string memory); - function version() external view returns (uint256); - - // getRoundData and latestRoundData should both raise "No data present" - // if they do not have data to report, instead of returning unset values - // which could be misinterpreted as actual reported values. - function getRoundData(uint80 _roundId) - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - function latestRoundData() - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - -} - - -contract DataConsumer { - AggregatorV3Interface internal dataFeed; - - /** - * Network: Tac testnet - * Aggregator: BTC/USD - * Address: 0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD - */ - constructor() { - dataFeed = AggregatorV3Interface( - 0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD - ); - } - - /** - * Returns the latest answer. - */ - function getDataFeedLatestAnswer() public view returns (int) { - // prettier-ignore - ( - /* uint80 roundId */, - int256 answer, - /*uint256 startedAt*/, - /*uint256 timeStamp*/, - /*uint80 answeredInRound*/ - ) = dataFeed.latestRoundData(); - return answer; - } - - /** - * Returns decimals. - */ - function getDecimals() public view returns (uint8) { - uint8 decimals = dataFeed.decimals(); - return decimals; - } -} -``` - -The latestRoundData function returns five values representing information about the latest price data. See the Price Feed API Reference for more details. - -#### Offchain reads using Web3.js - -These code examples demonstrate how to read data feeds directly off-chain using Web3 packages for each language. - -##### Javascript - -This example uses [web3.js](https://web3js.readthedocs.io/en/v1.10.0/) to retrieve feed data from the BTC / USD feed on the Tac testnet. - -```Javascript -/** - * THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. - * THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. - * DO NOT USE THIS CODE IN PRODUCTION. - */ - -const Web3 = require("web3") // for nodejs only -const web3 = new Web3("https://spb.rpc.tac.build") -const aggregatorV3InterfaceABI = [ - { - inputs: [], - name: "decimals", - outputs: [{ internalType: "uint8", name: "", type: "uint8" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "description", - outputs: [{ internalType: "string", name: "", type: "string" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [{ internalType: "uint80", name: "_roundId", type: "uint80" }], - name: "getRoundData", - outputs: [ - { internalType: "uint80", name: "roundId", type: "uint80" }, - { internalType: "int256", name: "answer", type: "int256" }, - { internalType: "uint256", name: "startedAt", type: "uint256" }, - { internalType: "uint256", name: "updatedAt", type: "uint256" }, - { internalType: "uint80", name: "answeredInRound", type: "uint80" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "latestRoundData", - outputs: [ - { internalType: "uint80", name: "roundId", type: "uint80" }, - { internalType: "int256", name: "answer", type: "int256" }, - { internalType: "uint256", name: "startedAt", type: "uint256" }, - { internalType: "uint256", name: "updatedAt", type: "uint256" }, - { internalType: "uint80", name: "answeredInRound", type: "uint80" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "version", - outputs: [{ internalType: "uint256", name: "", type: "uint256" }], - stateMutability: "view", - type: "function", - }, -] -const addr = "0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD" -const priceFeed = new web3.eth.Contract(aggregatorV3InterfaceABI, addr) -priceFeed.methods - .latestRoundData() - .call() - .then((roundData) => { - // Do something with roundData - console.log("Latest Round Data", roundData) - }) -``` - -### Price Feed API Reference - -A technical reference for using the AggregatorV3Interface to fetch price data. This guide explains how to retrieve feed details like round data, descriptions, and decimal precision, ensuring you can accurately integrate APRO Price Feeds into your dApps. - -When you use price feed, retrieve the feeds through the AggregatorV3Interface and the proxy address. - -#### AggregatorV3Interface - -Import this interface to your contract and use it to run functions in the proxy contract. Create the interface object by pointing to the proxy address. For example, on Tac you could create the interface object in the constructor of your contract using the following example: - -```solidity -/** - * Network: Tac testnet - * Data Feed: BTC/USD - * Address: 0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD - */ -constructor() { - priceFeed = AggregatorV3Interface(0xA840DA91be3f707E8774A04Fc9e346d236F5dbBD); -} -``` - -```solidity -// SPDX-License-Identifier: MIT -pragma solidity >0.8.0; - - -interface AggregatorV3Interface { - - function decimals() external view returns (uint8); - function description() external view returns (string memory); - function version() external view returns (uint256); - - // getRoundData and latestRoundData should both raise "No data present" - // if they do not have data to report, instead of returning unset values - // which could be misinterpreted as actual reported values. - function getRoundData(uint80 _roundId) - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - -} -``` - -#### Functions in AggregatorV3Interface - -| Name | Description | -| -------------- | -------------------------------------------------------------------- | -| `decimals` | The number of decimals in the response. | -| `description` | The description of the aggregator that the proxy points to. | -| `getRoundData` | Get data from a specific round. | -| `version` | The version representing the type of aggregator the proxy points to. | - -##### decimals - -Get the number of decimals present in the response value. - -```solidity -function decimals() external view returns (uint8); -``` - -- `RETURN`: The number of decimals. - -##### description - -Get the description of the underlying aggregator that the proxy points to. - -```solidity -function description() external view returns (string memory); -``` - -- `RETURN`: The description of the underlying aggregator. - -##### getRoundData - -Get data about a specific round, using the roundId. - -```solidity -function getRoundData( - uint80 _roundId -) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); -``` - -Parameters: - -- `_roundId`: The round Id - -Return values: - -- `roundId`: The round Id - -- `answer`: The answer for this round - -- `startedAt`: Timestamp of when the round started - -- `updatedAt`: Timestamp of when the round was updated - -- `answeredInRound`: The round Id of the round in which the answer was computed - -##### version - -The version representing the type of aggregator the proxy points to. - -```solidity -function version() external view returns (uint256) -``` - -- `RETURN`: The version number. - -For inquiries regarding Price Feeds for additional chains, check out the [Price Feed Contract Documentation](https://docs.apro.com/en/data-push/price-feed-contract). +Please refer to the APRO official docs [here](https://docs.apro.com/en/data-push/getting-started). diff --git a/ecosystem/oracles/eo.mdx b/ecosystem/oracles/eo.mdx index b097d8f..7a0e78b 100644 --- a/ecosystem/oracles/eo.mdx +++ b/ecosystem/oracles/eo.mdx @@ -2,7 +2,7 @@ title: EO --- -EO provides Dapps on TAC with secure, real-time data feeds critical for powering safe and capital-efficient lending markets. Built by experts in cybersecurity and risk management, and backed by $6B in staked security with 140 validators globally, EO is the most secure and decentralized oracle network available today. +EO delivers high-stakes data through a decentralized, modular system purpose-built for security and reliability with a network of 140+ validators, backed by over $2M in restaked ETH. Trusted by leading curators and money markets, EO powers price feeds across 25+ chains, enabling liquidity for RWAs, PT tokens, LP tokens, synthetic assets, and novel stablecoins. ## Available Price Feeds @@ -19,26 +19,6 @@ EO provides Dapps on TAC with secure, real-time data feeds critical for powering | rsETH/ETH | Mainnet | [0xC2A8dc68d3F0EFe893FAab3D5414C18CAEDB58F5](https://explorer.tac.build/address/0xC2A8dc68d3F0EFe893FAab3D5414C18CAEDB58F5) | | wstETH/ETH | Mainnet | [0x6a7c5E1453eD56B89ce05aDad746dcE01723E986](https://explorer.tac.build/address/0x6a7c5E1453eD56B89ce05aDad746dcE01723E986) | -## Why EO? - -EO delivers high-stakes data through a decentralized, modular system purpose-built for security and reliability. Our network of 140+ validators, backed by over $2M in restaked ETH, ensures data integrity with real-time performance monitoring and advanced outlier detection. Each price update follows a transparent process: operators submit signed data to our proof-of-stake chain, reach consensus, and cryptographically broadcast the result to target chains. Trusted by leading curators and money markets, EO powers price feeds across 25+ chains, enabling liquidity for RWAs, PT tokens, LP tokens, synthetic assets, and novel stablecoins. - -## ePrice – Modular Oracle for Asset Price Feeds\*\* - -ePrice is built on restaked Ethereum security and combines reliable infrastructure with sophisticated price discovery. It supports permissionless integration, enabling accurate and secure pricing for a wide range of assets, including low-liquidity and emerging markets. - -## PT Token Pricing - -PT tokens offer fixed yield with a known maturity value, making them attractive as collateral. However, they require precise pricing to avoid bad debt and ensure market efficiency. EO provides the Defi Ecosystem with secure PT token feeds that support safer borrowing, more accurate risk-adjusted rates, and better capital utilization—enabling PT-backed markets to scale reliably. - -## RWAfi Feeds - -EO supports real-world asset (RWAfi) markets with verified price feeds for tokenized off-chain financial instruments, such as treasuries. These feeds bridge the gap between traditional finance and DeFi, enabling safe use of RWAs as collateral. Accurate, secure pricing is essential to unlock the full potential of RWA-backed lending—and EO delivers exactly that. - -## Live Data Feeds - -EO’s supported feeds are continuously expanding. For the most up-to-date list of supported chains and feed contract addresses, please visit our [docs](https://docs.eo.app/docs/eprice/feed-addresses) - ## Integration -Please find our Integration guide [here](https://docs.eo.app/docs/eprice/integration-guide) +Find the integration guide in the official docs [here](https://docs.eo.app/docs/eprice/integration-guide). diff --git a/ecosystem/oracles/redstone.mdx b/ecosystem/oracles/redstone.mdx index 281155b..fcd84b4 100644 --- a/ecosystem/oracles/redstone.mdx +++ b/ecosystem/oracles/redstone.mdx @@ -8,33 +8,29 @@ RedStone delivers frequently updated, reliable, and diverse data feeds for your - Unique price feeds (including LSTs, LRTs, RWAs and TAC-native assets) - Modular Oracle Design allows for flexibility towards user needs -RedStone operates in two models Push and Pull both available on TAC. +RedStone operates in two models **Push** and **Pull** both available on TAC. ## Available Price Feeds -| Feed Name | Network | Address | -| --------- | ------- | --------------------------------------------------------------------------------------------------------------------------- | -| ETH/USD | Mainnet | [0xc555c100DB24dF36D406243642C169CC5A937f09](https://explorer.tac.build/address/0xc555c100DB24dF36D406243642C169CC5A937f09) | -| BTC/USD | Mainnet | [0xf0DEbDAE819b354D076b0D162e399BE013A856d3](https://explorer.tac.build/address/0xf0DEbDAE819b354D076b0D162e399BE013A856d3) | -| USDC/USD | Mainnet | [0x4aF6b78d92432D32E3a635E824d3A541866f7a78](https://explorer.tac.build/address/0x4aF6b78d92432D32E3a635E824d3A541866f7a78) | -| TON/USD | Mainnet | [0x26FB59e5562405F42f55661f790fA1Bd2F410A3d](https://explorer.tac.build/address/0x26FB59e5562405F42f55661f790fA1Bd2F410A3d) | -| USDT/USD | Mainnet | [0xb67047eDF6204F4C81333248dA71F8387050790C](https://explorer.tac.build/address/0xb67047eDF6204F4C81333248dA71F8387050790C) | -| tsTON/TON | Mainnet | [0xb9D0073aCb296719C26a8BF156e4b599174fe1d5](https://explorer.tac.build/address/0xb9D0073aCb296719C26a8BF156e4b599174fe1d5) | +Up to date TAC price feeds from the official docs: + + + + + ## How to integrate [RedStone Push](https://docs.redstone.finance/docs/dapps/redstone-push/)? The RedStone Push model ensures that data is pushed into onchain storage via a relayer. Dedicated to protocols designed for the traditional Push Oracles model, that want to have full control of the data source and update conditions (heartbeat and deviation threshold). +Push model is available on both TAC Testnet & Mainnet. -The onchain contracts in Push enable storing prices and getting them through a familiar interface (e.g. the Chainlink Aggregator). Push model is available on both TAC testnet & coming to mainnet in the future. You can find a list of available price feeds [here](https://app.redstone.finance/app/feeds/). - -## How to integrate RedStone [Pull](https://docs.redstone.finance/docs/dapps/redstone-pull/)? +## How to integrate [RedStone Pull](https://docs.redstone.finance/docs/dapps/redstone-pull/)? The RedStone Pull model allows your dApp to utilize data feeds delivered “on-demand”, only when the data is needed. Thanks to the implementation of the EVM-connector library and extending your Ethers.js, your dApp will be able to attach signed data packages with timestamps to call data of your users’ transactions. -In order to implement the Pull model you will need to do two things: - -1. Adjust the Javascript code of your dApp to inject the additional payload with signed data feeds to call data of your users’ transactions (otherwise you will get smart contract errors). -2. Adjust your smart contracts to include the libraries responsible for data extraction from call data and signature verification. - Please see the specific steps and ready code samples in the [Docs](https://docs.redstone.finance/docs/introduction). If you need help with integration join RedStone [Discord](https://discord.com/invite/PVxBZKFr46) and ask their team for help. diff --git a/ecosystem/oracles/stork.mdx b/ecosystem/oracles/stork.mdx index 4291668..b084d07 100644 --- a/ecosystem/oracles/stork.mdx +++ b/ecosystem/oracles/stork.mdx @@ -2,15 +2,16 @@ title: Stork --- -Stork is an oracle protocol that enables sub-second data feeds onchain. The core technical principles of Stork are: +Stork is an oracle protocol that enables sub-second data feeds onchain. Stork's full documentation is available [here](https://docs.stork.network). -- **Modularity** -- **Low Latency** -- **Cost efficiency** -- **Arbitrary Data Support** -- **Transparency, Verifiability, and Security** - -Stork's full documentation is available [here](https://docs.stork.network). + + + + ## How does it work? @@ -37,7 +38,3 @@ For more information on how to use the Stork Chain Pusher, please refer to [Putt Reading from the Stork contract is as simple as calling its `getTemporalNumericValueV1(bytes32 id)` function from your contract. This function takes an encoded asset ID of the relevant asset and returns the latest value for that asset in the form of a `TemporalNumericValue` struct, which contains an integer value (multiplied by 10^18 for precision) and a UNIX nanosecond timestamp. For more information on how to read data from the Stork contract, please refer to the [EVM Contract API](https://docs.stork.network/api-reference/contract-apis/evm). - -## Asset IDs - -Stork supports a wide range of assets and asset classes. For a full list of supported assets and their encoded asset IDs, please refer to [Supported Assets](https://docs.stork.network/resources/asset-id-registry). diff --git a/ecosystem/rpcs/ankr.mdx b/ecosystem/rpcs/ankr.mdx index ae63c9c..c90931a 100644 --- a/ecosystem/rpcs/ankr.mdx +++ b/ecosystem/rpcs/ankr.mdx @@ -1,5 +1,7 @@ Ankr is a leading provider of blockchain infrastructure, offering a range of services including RPC nodes, indexing, and analytics. +https://www.ankr.com/rpc/tac + ## TAC Network RPC Infrastructure TAC offers full EVM compatibility through its Layer 1 blockchain. For reliable development and production environments, we've partnered with Ankr to provide enterprise-grade RPC infrastructure. @@ -35,7 +37,7 @@ For EVM application integration using Ankr's RPC services: import { ethers } from 'ethers'; // Connect via Ankr's RPC endpoint -const provider = new ethers.providers.JsonRpcProvider('https://spb.rpc.tac.build'); +const provider = new ethers.providers.JsonRpcProvider('https://rpc.ankr.com/tac_spb'); // Test connection async function checkConnection() { @@ -47,7 +49,7 @@ async function checkConnection() { Or for deployment on TAC L1 using Foundry ``` -forge create --rpc-url https://spb.rpc.tac.build --private-key YOUR_PRIVATE_KEY_HERE YOUR_CONTRACT --legacy --broadcast +forge create --rpc-url https://rpc.ankr.com/tac_spb --private-key YOUR_PRIVATE_KEY_HERE YOUR_CONTRACT --legacy --broadcast ``` diff --git a/ecosystem/token-list.mdx b/ecosystem/token-list.mdx index 3e7ab3e..69bc4b4 100644 --- a/ecosystem/token-list.mdx +++ b/ecosystem/token-list.mdx @@ -1,9 +1,9 @@ --- title: Token List -description: Official token registry for TAC Mainnet +description: Official (but not extensive) token registry for TAC Mainnet --- -This repository contains the canonical Token List for TAC Mainnet (Chain ID: 239), providing standardized token metadata for wallets, DEXs, and other applications in the TAC ecosystem. +The table below contains the canonical Token List for the TAC Mainnet (Chain ID: 239), providing standardized token metadata for wallets, DEXs, and other applications in the TAC ecosystem. To add/request a new asset, please refer to this [Github Repo](https://github.com/TacBuild/tokenlist) diff --git a/explorer/overview.mdx b/explorer/overview.mdx new file mode 100644 index 0000000..4f61064 --- /dev/null +++ b/explorer/overview.mdx @@ -0,0 +1,72 @@ +--- +title: Block Explorer +description: "Explore TAC blockchain data with our custom Blockcout explorer featuring cross-chain operation tracking" +--- + +TAC uses a custom version of Blockcout that includes specialized features for tracking cross-chain operations and transactions between TON and TAC EVM. +This enhanced explorer provides visibility into both standard EVM transactions and TAC's unique hybrid dApp functionality. + +## Available Explorers + + + + + + + Get your tokens on the [Faucet](https://spb.faucet.tac.build) + + + +## Features + +Our custom Blockcout implementation includes additional functionality designed specifically for TAC's hybrid dApp ecosystem: + + + + + - Monitor cross-chain transactions as they progress + through the TON Adapter system, including stage progression and completion + status (**Operations** section). + - View connections between TON-side + transactions and their corresponding EVM executions. + - Track token movements between TON and TAC EVM. + + + + + + + + + + + + + + + - Complete transaction information including gas + usage, status, and event logs. + - Contract verification, + source code viewing, and interaction interfaces. + - Real-time network metrics, block information, and validator activity. + - Both explorers provide standard Blockcout API endpoints for programmatic + access to blockchain data and contract interactions. + + + diff --git a/index.mdx b/index.mdx index a9d72c0..c13848b 100644 --- a/index.mdx +++ b/index.mdx @@ -58,48 +58,48 @@ export const HeroCard = ({ lightModeImage="https://i.ibb.co/gM5hWq6P/quick.png.png" darkModeImage="https://i.ibb.co/whv2D8qF/quick-dark.png" title="Quickstart" - description="Deploy your first working hybrid dApp in under 5 minutes" - href="/build/quickstart" + description="Spin up a hybrid dApp locally and send your first testnet cross-chain transaction in under 5 minutes!" + href="/quickstart/overview" /> diff --git a/build/proxy/advanced-usage/argument-encoding.mdx b/proxies/advanced-custom-proxy/argument-encoding.mdx similarity index 79% rename from build/proxy/advanced-usage/argument-encoding.mdx rename to proxies/advanced-custom-proxy/argument-encoding.mdx index 60b1a84..24b4735 100644 --- a/build/proxy/advanced-usage/argument-encoding.mdx +++ b/proxies/advanced-custom-proxy/argument-encoding.mdx @@ -1,18 +1,17 @@ --- -title: Argument Encoding Patterns -description: "Advanced patterns for encoding complex data structures for TAC proxy functions" +title: Argument Encoding +description: "Advanced patterns for encoding complex data structures on your frontend" --- -TAC proxy functions receive their parameters as ABI-encoded bytes. This guide shows the exact encoding patterns from the TAC engineering team for different data structure complexities. +TAC proxy functions receive their parameters as ABI-encoded bytes. +This guide shows the encoding patterns for different data structure complexities. All proxy functions must follow the signature `function name(bytes calldata tacHeader, bytes calldata arguments)`. The `arguments` parameter contains your custom ABI-encoded data. -## Basic Encoding Patterns - -### Simple Parameters +## Simple Parameters You typically define a struct that represents the arguments your proxy function expects: @@ -36,9 +35,7 @@ const myProxyFunctionArguments = abiCoder.encode( ); ``` -## Advanced Encoding Patterns - -### Complex Example with Nested Structures +## Advanced Parameters For structs containing other structs: @@ -89,7 +86,7 @@ const myProxyFunctionArguments = abiCoder.encode( ## TAC SDK Integration -When using the tac-sdk to create messages for bridging, you must provide: +When using the TAC SDK to create messages for bridging, you must provide: - **target**: the address of your Proxy contract - **method_name**: the complete function signature, e.g. `"myProxyFunction(bytes,bytes)"` @@ -133,25 +130,19 @@ function executeSwap(bytes calldata tacHeader, bytes calldata arguments) } ``` - ## What's Next? -You now understand all the argument encoding patterns for TAC proxy development: - - - - Learn how to test your encoded arguments with TAC Local Test SDK - - - Back to implementing basic proxy contracts - +Still have questions after reading the guide? +Check out the comprehensive documentation to find the answers you need. + + + + Developer documentation + +Or reach out to our developer community in [Telegram](https://t.me/TACbuild) or [Discord](https://discord.gg/tacbuild). diff --git a/build/proxy/advanced-usage/nft-support.mdx b/proxies/advanced-custom-proxy/nft-support.mdx similarity index 88% rename from build/proxy/advanced-usage/nft-support.mdx rename to proxies/advanced-custom-proxy/nft-support.mdx index 4ca683f..0cce868 100644 --- a/build/proxy/advanced-usage/nft-support.mdx +++ b/proxies/advanced-custom-proxy/nft-support.mdx @@ -3,12 +3,13 @@ title: NFT Support description: "Learn how to handle NFTs in TAC proxy contracts with cross-chain bridging" --- -TAC proxy contracts can receive, process, and bridge NFTs between TON and EVM networks. This guide shows the exact implementation patterns from the TAC engineering team. +TAC proxy contracts can receive, process, and bridge NFTs between TON and EVM networks. +This guide shows the example implementation patterns. - + NFT proxy contracts must inherit from `IERC721Receiver` and implement the required `onERC721Received` function to correctly receive ERC-721 tokens. - + ## NFT Proxy Implementation @@ -64,7 +65,7 @@ contract TestNFTProxy is TacProxyV1, IERC721Receiver { new TokenAmount[](0), // No ERC20 tokens bridged nfts // NFTs to bridge (the 'amount' field is ignored for ERC721) ); - _sendMessageV1(outMessage, 0); + _sendMessageV1(outMessage, 0); // 0 TACs to send back } } ``` @@ -108,7 +109,7 @@ contract TestNFTProxy is TacProxyV1, IERC721Receiver { - Must inherit from both `TacProxyV1` and `IERC721Receiver` - Order of inheritance matters for proper functionality -### 2. onERC721Received Implementation +### 2. `onERC721Received` Implementation ```solidity function onERC721Received( @@ -135,7 +136,7 @@ for (uint i = 0; i < nfts.length; i++) { - Approve each NFT individually by tokenId before cross-chain transfer - Use `_getCrossChainLayerAddress()` to get the correct approval target -### 4. OutMessageV1 Structure for NFTs +### 4. `OutMessageV1` Structure for NFTs ```solidity OutMessageV1 memory outMessage = OutMessageV1( @@ -150,7 +151,7 @@ OutMessageV1 memory outMessage = OutMessageV1( ); ``` -### 5. NFTAmount Structure +### 5. `NFTAmount` Structure The `NFTAmount` struct contains: @@ -175,7 +176,7 @@ You can name the function whatever you want (e.g., `processNFT`, `handleNFT`, et ## Argument Encoding for NFTs -When calling NFT proxy functions from the frontend, encode the NFTAmount array: +When calling NFT proxy functions from the frontend, encode the `NFTAmount` array: ```javascript // Example: Encoding NFTAmount[] @@ -200,25 +201,13 @@ const userMessage = { Now that you understand NFT handling, learn how to test these contracts: - + Learn comprehensive testing with @tonappchain/evm-ccl - - Testing patterns for NFTs and complex cross-chain operations - - - **Important**: NFT proxy contracts must implement `IERC721Receiver` or NFT - transfers will fail. Always test NFT functionality thoroughly before deploying - to mainnet. - diff --git a/build/proxy/advanced-usage/smart-accounts.mdx b/proxies/advanced-custom-proxy/smart-accounts.mdx similarity index 87% rename from build/proxy/advanced-usage/smart-accounts.mdx rename to proxies/advanced-custom-proxy/smart-accounts.mdx index 24ad8cd..fc8081f 100644 --- a/build/proxy/advanced-usage/smart-accounts.mdx +++ b/proxies/advanced-custom-proxy/smart-accounts.mdx @@ -1,27 +1,30 @@ --- title: Smart Accounts -description: "Account abstraction for TAC enabling programmable wallets and advanced transaction patterns" +description: "Smart accounts for TAC enabling programmable wallets and advanced transaction patterns" --- -Smart accounts (account abstraction) enable programmable wallet logic on TAC, allowing developers to create accounts with custom execution rules, gas payment mechanisms, and transaction batching capabilities. TAC provides a **shared factory** that all developers can use, creating **one smart account per user per proxy** for seamless cross-chain interactions. +Smart accounts (also known as _Account abstraction_) are used on TAC to solve two key problems: + +1. **User separation** — without smart accounts, a dApp message sender on the proxy side is effectively always the proxy itself, so it’s hard to distinguish one user from another. +2. **Separate asset storage** — user assets are kept in a dedicated smart account, so funds don’t mix into one proxy balance and can wait there until they’re needed. - **Contract Addresses**: Find the latest TacSAFactory and TacSmartAccount + **Contract Addresses**: Find the latest _Smart Account Factory_ and _Smart Account Blueprint_ addresses for both testnet and mainnet on the [Contract - Addresses](/build/tooling/contract-addresses) page. + Addresses](/ecosystem/contract-addresses) page. ## Core Concept TAC uses a **shared factory approach** where: -- There is **one factory instance** deployed on the chain that everyone can use +- There is **one factory instance** (Smart Account Factory) deployed on the chain that everyone can use - Each user gets **one smart account per proxy contract** - Smart accounts support advanced features like multicall, NFT handling, and hook-based execution - All accounts are upgradeable through the shared beacon pattern - + **Advanced account logic with comprehensive capabilities:** @@ -35,7 +38,7 @@ TAC uses a **shared factory approach** where: - + **Shared factory for all developers:** @@ -48,9 +51,12 @@ TAC uses a **shared factory approach** where: -## TacSmartAccount Implementation +## _Smart Account Blueprint_ Implementation -The latest smart account implementation provides comprehensive account abstraction functionality: +The contract is already deployed on TAC Mainnet and Testnet. + + _Smart Account Blueprint_ is addressed as `TacSmartAccount` in provided code snippets + ```solidity // SPDX-License-Identifier: MIT @@ -199,7 +205,13 @@ contract TacSmartAccount is Initializable, IERC721Receiver { -## TacSAFactory - Shared Factory Contract +## _Smart Account Factory_ Implementation + +The contract is already deployed on TAC Mainnet and Testnet. + + + _Smart Account Factory_ is addressed as `TacSAFactory` in provided code snippets + The shared factory contract that all developers can use for smart account deployment: @@ -358,11 +370,12 @@ contract MyProxy is TacProxyV1 { // Decode operation parameters (address target, bytes memory data, uint256 value) = abi.decode(arguments, (address, bytes, uint256)); - // Create one-time ticket for the smart account to execute - ITacSmartAccount(smartAccount).createOneTimeTicket(address(this)); - // Execute through smart account - ITacSmartAccount(smartAccount).execute(target, value, data); + bytes memory returnData = + ITacSmartAccount(smartAccount).execute(target, value, data); + + // Parse returnData + uint256 tokenId = abi.decode(returnData, (uint256)); } } ``` @@ -450,36 +463,3 @@ The hooks system allows you to define: - **Main call**: Primary operation - **Post-hooks**: Operations after main execution - **Perspective**: Whether calls are from smart account or proxy contract - -### TypeScript SDK for Hooks - -Use the SaHooksBuilder for easy hook creation: - -```typescript -import { SaHooksBuilder } from "@tonappchain/sdk"; - -// Create hooks for a complex DeFi operation -const hooksBuilder = new SaHooksBuilder() - .addContractInterface(tokenAddress, tokenABI) - .addContractInterface(dexAddress, dexABI) - // Pre-hook: Approve tokens from smart account - .addPreHookCallFromSA(tokenAddress, "approve", [dexAddress, amount]) - // Main call: Execute swap from proxy perspective - .setMainCallHookCallFromSelf(dexAddress, "swapTokens", [ - tokenIn, - tokenOut, - amount, - minAmountOut, - ]) - // Post-hook: Check balance from smart account - .addPostHookCallFromSA(tokenAddress, "balanceOf", [smartAccountAddress]); - -const encodedHooks = hooksBuilder.encode(); -``` - - - **System Control**: The smart account abstraction system is currently under - the control of a multisig account managed by the TAC team. This ensures - coordinated upgrades and security oversight during the protocol's early - phases. - diff --git a/build/proxy/advanced-usage/testing-framework.mdx b/proxies/advanced-custom-proxy/testing.mdx similarity index 85% rename from build/proxy/advanced-usage/testing-framework.mdx rename to proxies/advanced-custom-proxy/testing.mdx index 3fef810..bc273b4 100644 --- a/build/proxy/advanced-usage/testing-framework.mdx +++ b/proxies/advanced-custom-proxy/testing.mdx @@ -1,15 +1,23 @@ --- -title: Testing Framework -description: "Comprehensive testing setup for TAC proxy contracts using the local test SDK" +title: Local Testing +description: "Testing setup for **TAC Proxy** contracts using the `TacLocalTestSdk` library" --- -The `@tonappchain/evm-ccl` package includes a local test SDK that helps emulate bridging logic and cross-chain operations, ensuring your proxy behaves as expected without deploying a full cross-chain setup. - - The TAC Local Test SDK provides a complete testing environment that simulates - cross-chain message flows, token bridging, and NFT operations locally. + This page is all about testing using cross-chain _simulation_. + You can also test directly in our [TON + TAC Testnet](/sdk/overview#testnet) setup using SDK. +The `@tonappchain/evm-ccl` package includes a `TacLocalTestSdk` package that helps emulate full bridging logic and cross-chain operations locally, +ensuring your proxy behaves as expected without deploying a full cross-chain setup. + +The `TacLocalTestSdk` provides a complete testing environment that simulates +cross-chain message flows, token bridging, and NFT operations locally. + + + Full cross-chain emulation available within `TacLocalTestSdk` + + ## Installation and Setup The testing utilities come with the `@tonappchain/evm-ccl` package: @@ -34,11 +42,12 @@ Ensure your package.json includes the necessary testing dependencies: } ``` -If you cannot deploy your Dapp contracts directly for local testing, consider forking another network where the necessary contracts are already deployed. This can simplify local development and testing. +If your Dapp contracts are already deployed on another network, +you can fork that network and test against it locally instead of deploying the contracts again. ## Test Proxy Contract -Here's the minimal test proxy from the TAC engineering team: +Here's the minimal test proxy: ```solidity // SPDX-License-Identifier: MIT @@ -127,6 +136,32 @@ contract TestToken is ERC20 { } ``` +## Test Flow Pattern + +### 1. Initialization + +- Create local cross-chain environment (`TacLocalTestSdk`) +- Deploy test tokens and proxy contracts +- Set up initial state + +### 2. Bridging Simulation + +- Mint or lock tokens on the cross-chain layer +- Create test parameters (`shardsKey`, `operationId`, etc.) +- Prepare method call arguments + +### 3. Invoke Proxy + +- Use `testSdk.sendMessage(...)` to simulate cross-chain call +- Pass all required parameters for complete simulation + +### 4. Verification + +- Confirm transaction succeeded (`receipt.status === 1`) +- Inspect `deployedTokens` for newly minted jettons +- Inspect `outMessages` for tokens returning to TON +- Check emitted events for correct data + ## Complete Test Setup Create a test file such as `TestProxy.spec.ts` under your test directory: @@ -312,7 +347,7 @@ describe("TestProxy with @tonappchain/evm-ccl", () => { ## Key Testing Components -### TacLocalTestSdk +### `TacLocalTestSdk` The core testing utility that provides: @@ -332,7 +367,7 @@ testSdk.lockNativeTacOnCrossChainLayer(nativeTacAmount); ### Data Structures -#### JettonInfo +#### `JettonInfo` ```typescript const jettonInfo: JettonInfo = { @@ -342,7 +377,7 @@ const jettonInfo: JettonInfo = { }; ``` -#### TokenMintInfo +#### `TokenMintInfo` ```typescript const tokenMintInfo: TokenMintInfo = { @@ -351,7 +386,7 @@ const tokenMintInfo: TokenMintInfo = { }; ``` -#### TokenUnlockInfo +#### `TokenUnlockInfo` ```typescript const tokenUnlockInfo: TokenUnlockInfo = { @@ -360,7 +395,7 @@ const tokenUnlockInfo: TokenUnlockInfo = { }; ``` -### sendMessage Method +### `sendMessage` Method The main testing method that simulates cross-chain operations: @@ -382,7 +417,7 @@ const { receipt, deployedTokens, outMessages } = await testSdk.sendMessage( ); ``` -### sendMessageWithNFT Method +### `sendMessageWithNFT` Method For testing NFT operations, use the specialized NFT testing method: @@ -405,44 +440,6 @@ const { receipt, deployedTokens, outMessages } = ); ``` -### Return Values - -The `sendMessage` method returns: - -- `receipt` - Transaction receipt with status and logs -- `deployedTokens` - Array of newly deployed jetton contracts -- `outMessages` - Array of messages sent back to TON, containing: - - `shardsKey`, `operationId`, `callerAddress`, `targetAddress` - - `tokensBurned` - Jettons burned (returned to TON) - - `tokensLocked` - EVM tokens locked (returned to TON) - - `nftsBurned`, `nftsLocked` - NFT operations - -## Test Flow Pattern - -### 1. Initialization - -- Create local cross-chain environment (`TacLocalTestSdk`) -- Deploy test tokens and proxy contracts -- Set up initial state - -### 2. Bridging Simulation - -- Mint or lock tokens on the cross-chain layer -- Create test parameters (`shardsKey`, `operationId`, etc.) -- Prepare method call arguments - -### 3. Invoke Proxy - -- Use `testSdk.sendMessage(...)` to simulate cross-chain call -- Pass all required parameters for complete simulation - -### 4. Verification - -- Confirm transaction succeeded (`receipt.status === 1`) -- Inspect `deployedTokens` for newly minted jettons -- Inspect `outMessages` for tokens returning to TON -- Check emitted events for correct data - ## Running Tests Inside your project directory: @@ -450,32 +447,3 @@ Inside your project directory: ```bash npx hardhat test ``` - -The TAC Local Test SDK handles all the complex cross-chain simulation, letting you focus on testing your proxy contract logic. - -## What's Next? - -Now that you understand the testing framework, learn advanced testing patterns: - - - - Complex testing patterns for NFTs and multi-asset operations - - - Learn how to implement and test NFT proxy contracts - - - - - **Testing Best Practice**: Always test both successful operations and edge - cases. The TAC Local Test SDK makes it easy to simulate various bridging - scenarios. - diff --git a/build/proxy/usage/basic-contracts.mdx b/proxies/custom-proxy/basic-proxy.mdx similarity index 58% rename from build/proxy/usage/basic-contracts.mdx rename to proxies/custom-proxy/basic-proxy.mdx index b7845af..5c1b870 100644 --- a/build/proxy/usage/basic-contracts.mdx +++ b/proxies/custom-proxy/basic-proxy.mdx @@ -1,31 +1,16 @@ --- -title: Basic Proxy -description: "Build your first TAC Proxy contract step-by-step" +title: Basic Proxy Example +description: "This guide walks you through creating your first basic proxy contract, explaining each concept as we build." --- -TAC Proxy contracts are Solidity contracts that can receive function calls from TON users. This guide walks you through creating your first basic proxy contract, explaining each concept as we build. - -## Why Proxy Contracts? - -Regular smart contracts can only be called by users on the same blockchain. TAC Proxy contracts solve a different problem: **they let TON users call your EVM functions directly**. - -Without proxies: - -1. TON user bridges tokens to TAC -2. User switches to MetaMask -3. User interacts with your dApp -4. User bridges tokens back to TON - -With proxies: - -1. TON user calls your function directly from TON wallet -2. ✨ Everything else happens automatically - -Think of proxy contracts as **API endpoints that TON users can call with blockchain transactions instead of HTTP requests**. + + In the [`create-tac-app`](/quickstart/overview) quickstart project, the TAC Proxy `MessageProxy.sol` contract is created automatically. + You can also review it + ## Your First Proxy Contract -Let's start with the absolute minimum proxy contract: +Let's start with the absolute minimum proxy contract that can handle TON->TAC transaction: ```solidity // SPDX-License-Identifier: MIT @@ -100,6 +85,7 @@ function sayHello(bytes calldata tacHeader, bytes calldata arguments) - `bytes calldata arguments` - Your custom ABI-encoded parameters - `external` - Must be externally callable - `_onlyCrossChainLayer` - Security modifier that ensures only CrossChainLayer can call this function +(required only for TON->TAC and TON->TAC->TON types) ## Step-by-Step Walkthrough @@ -111,7 +97,7 @@ TacHeaderV1 memory header = _decodeTacHeader(tacHeader); The header tells you: -- `header.tvmCaller` - TON user's address. **!!! Important !!!** It is always base64 mainnet bounceable format and starts with "EQ" (like "EQAbc123...") +- `header.tvmCaller` - TON user's address. **Important!** It is always base64 mainnet bounceable format and starts with "EQ" (like "EQAbc123...") - `header.operationId` - Unique ID for this operation - `header.timestamp` - When the TON transaction happened @@ -143,68 +129,57 @@ This is where you do whatever your contract is supposed to do. In this example, ## Sending Responses Back to TON -Sometimes you want to send tokens back to the TON user. Use the `OutMessageV1` structure: - -```solidity -import { TokenAmount, OutMessageV1 } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; - -// Send back to TON user (no fees for RoundTrip messages) -OutMessageV1 memory outMsg = OutMessageV1({ - shardsKey: header.shardsKey, // Link to original operation - tvmTarget: header.tvmCaller, // Send back to caller - tvmPayload: "", // Must be empty - not supported - tvmProtocolFee: 0, // 0 for RoundTrip - already paid on TON - tvmExecutorFee: 0, // 0 for RoundTrip - already paid on TON - tvmValidExecutors: new string[](0), // Empty for RoundTrip - already defined on TON - toBridge: tokensToSend, // Tokens to send - toBridgeNFT: new NFTAmount[](0) // No NFTs -}); - -_sendMessageV1(outMsg, 0); -``` +You may also want to send arbitrary tokens back to the TON user after an EVM execution (TON->TAC->TON transaction type). +Learn how in the [more advanced example](/proxies/custom-proxy/proxy-functions#complete-implementation-walkthrough). ## Deployment -Deploy your basic proxy like any other contract: +Deploy your basic proxy just like any other contract. You can also use `deploy` from `@tonappchain/evm-ccl` as helper: ```javascript -// scripts/deploy-basic-proxy.js -const { ethers } = require("hardhat"); +import { Signer } from "ethers"; +import { HelloProxy } from "../../typechain-types"; +import { deploy } from '@tonappchain/evm-ccl'; +import hre from 'hardhat'; + +export async function deployHelloProxy( + deployer: Signer, + crossChainLayer: string, +): Promise { + const helloProxy = await deploy( + deployer, + hre.artifacts.readArtifactSync('HelloProxy'), + [crossChainLayer], + undefined, + true // verbose + ); + + await helloProxy.waitForDeployment(); + return helloProxy; +} async function main() { - // Get CrossChainLayer address from TAC documentation or contract addresses page - const crossChainLayerAddress = process.env.CROSS_CHAIN_LAYER_ADDRESS; - - const HelloProxy = await ethers.getContractFactory("HelloProxy"); - const proxy = await HelloProxy.deploy(crossChainLayerAddress); - await proxy.deployed(); - - console.log("HelloProxy deployed to:", proxy.address); + const [deployer] = await hre.ethers.getSigners(); + const crossChainLayer = process.env.CROSS_CHAIN_LAYER_ADDRESS; + const helloProxy = await deployHelloProxy(deployer, crossChainLayer); + console.log("HelloProxy deployed to:", helloProxy.target); } main().catch(console.error); ``` - ## What's Next? You now understand the basics of TAC Proxy contracts. Ready for more complex patterns? - + Learn when and how to build contracts that can be upgraded over time - - Deep dive into how cross-chain messages work under the hood - diff --git a/build/proxy/installation.mdx b/proxies/custom-proxy/develop.mdx similarity index 53% rename from build/proxy/installation.mdx rename to proxies/custom-proxy/develop.mdx index 206a6a0..6f46dbc 100644 --- a/build/proxy/installation.mdx +++ b/proxies/custom-proxy/develop.mdx @@ -1,18 +1,28 @@ --- -title: Installation & Setup -description: "Install dependencies and configure your development environment for TAC Proxy development" +title: Develop Custom Proxy +description: "Guide how to develop a TAC Proxy" --- -Setting up TAC Proxy development requires installing the TAC cross-chain libraries and configuring your Solidity development environment. Currently, TAC Proxy development is supported with **Hardhat only** - Foundry support is coming soon. +## Documentation - - TAC Proxy development currently requires Hardhat. Foundry support is planned - for a future release. - +Contents of this _Custom Proxy_ page block mainly serve informational purpose. +Comprehensive Custom Proxy development details are available in the official docs linked below: + + + + Developer documentation + + ## Installation -Install the TAC cross-chain library that provides all necessary components for proxy development: +Setting up TAC Proxy development requires installing the TAC cross-chain libraries and configuring your Solidity development environment. + +TAC Proxy development currently requires Hardhat. Foundry support is planned in future. @@ -30,12 +40,6 @@ pnpm add @tonappchain/evm-ccl@latest -The `@tonappchain/evm-ccl` package includes: -- Base proxy contracts (`TacProxyV1`, `TacProxyV1Upgradeable`) -- Core data structures and interfaces -- Local testing SDK for development -- Cross-chain message utilities - ## Hardhat Environment Setup Ensure your Hardhat project includes the necessary dependencies: @@ -44,7 +48,6 @@ Ensure your Hardhat project includes the necessary dependencies: { "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", "hardhat": "^2.22.5", "ethers": "^6.13.2", "chai": "^4.3.7", @@ -59,7 +62,6 @@ Configure your `hardhat.config.js` for TAC networks: ```javascript hardhat.config.js require("@nomicfoundation/hardhat-toolbox"); -require("@nomicfoundation/hardhat-verify"); module.exports = { solidity: { @@ -69,7 +71,6 @@ module.exports = { enabled: true, runs: 200, }, - viaIR: true, }, }, networks: { @@ -89,7 +90,6 @@ module.exports = { }; ``` - ## Project Structure Setup Create an organized project structure for proxy development: @@ -184,128 +184,6 @@ npx hardhat compile If compilation succeeds, your environment is properly configured for TAC Proxy development. -## Advanced Configuration Options - -### Custom Network Configuration - -For specific deployment needs, configure additional network settings: - -```javascript -// Advanced Hardhat configuration -module.exports = { - networks: { - tac_testnet: { - url: "https://spb.rpc.tac.build", - chainId: 2391, - accounts: [process.env.PRIVATE_KEY], - gas: 20000000, // Block gas limit - gasPrice: 20000000000, // 20 gwei - timeout: 60000, // 1 minute timeout - httpHeaders: { - "User-Agent": "hardhat-tac-proxy" - } - } - }, - // Enable contract verification - etherscan: { - apiKey: { - tac_testnet: process.env.TAC_EXPLORER_API_KEY, - tac_mainnet: process.env.TAC_EXPLORER_API_KEY - }, - customChains: [ - { - network: "tac_testnet", - chainId: 2391, - urls: { - apiURL: "https://spb.explorer.tac.build/api", - browserURL: "https://spb.explorer.tac.build" - } - } - ] - } -}; -``` - -### TypeScript Configuration - -For TypeScript projects, ensure proper type resolution: - -```json tsconfig.json -{ - "compilerOptions": { - "target": "ES2020", - "module": "commonjs", - "lib": ["ES2020"], - "outDir": "./dist", - "rootDir": "./", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true - }, - "include": ["./scripts", "./test", "./typechain-types"], - "files": ["./hardhat.config.ts"] -} -``` - -### Local Testing Configuration - -Configure the local test SDK for comprehensive testing: - -```javascript test/helpers/tacTestHelpers.js -import { TacLocalTestSdk } from "@tonappchain/evm-ccl"; -import { ethers } from "hardhat"; - -export async function setupLocalTacEnvironment() { - const testSdk = new TacLocalTestSdk(); - const crossChainLayerAddress = testSdk.create(ethers.provider); - - return { - testSdk, - crossChainLayerAddress, - provider: ethers.provider - }; -} - -export function createMockTacHeader(overrides = {}) { - return { - shardsKey: 1n, - timestamp: BigInt(Math.floor(Date.now() / 1000)), - operationId: ethers.encodeBytes32String("test-operation"), - tvmCaller: "EQTestTONAddress123456789...", - extraData: "0x", - ...overrides - }; -} -``` - -## Dependency Management - -### OpenZeppelin Integration - -For upgradeable proxies, install OpenZeppelin upgradeable contracts: - -```bash -npm install --save @openzeppelin/contracts-upgradeable @openzeppelin/contracts -``` - -### Testing Dependencies - -Install additional testing utilities for comprehensive proxy testing: - -```bash -# For enhanced testing capabilities -npm install --save-dev @nomicfoundation/hardhat-chai-matchers -npm install --save-dev @typechain/hardhat @typechain/ethers-v6 - -# For gas reporting -npm install --save-dev hardhat-gas-reporter - -# For coverage -npm install --save-dev solidity-coverage -``` - ## Common Setup Issues @@ -316,17 +194,19 @@ npm install --save-dev solidity-coverage - Ensure `@tonappchain/evm-ccl` is properly installed - Verify Solidity version compatibility (0.8.28+) - Check import paths are correct - - Clean and rebuild: `npx hardhat clean && npx hardhat compile` - - ```bash - # Reset and reinstall - rm -rf node_modules package-lock.json - npm install - ``` + - Reset and reinstall dependencies: + ```bash + rm -rf node_modules package-lock.json + npm install + ``` + - Clean and rebuild: + ```bash + npx hardhat clean && npx hardhat compile + ``` - **Problem**: Unable to connect to TAC networks + **Problem**: Unable to connect to TAC network **Solutions**: - Verify RPC URLs are correct @@ -351,38 +231,6 @@ npm install --save-dev solidity-coverage **Solutions**: - Verify private key is in `.env` file - Ensure private key starts with `0x` if required by your configuration - - Check that the account has sufficient TAC tokens for deployment - - Use different private key formats if needed - - ```bash - # Get testnet tokens - # Visit: https://spb.faucet.tac.build - ``` + - Check that the account has sufficient TAC tokens for deployment. Get them [here](ecosystem/faucet) - -## Next Steps - -With your development environment configured, you're ready to create your first TAC Proxy contract: - - - - Build basic and upgradeable proxy contracts with cross-chain functionality - - - Learn how cross-chain messages work and how to handle them - - - - - Keep your development environment up to date by regularly updating the - `@tonappchain/evm-ccl` package as new features and improvements are released. - \ No newline at end of file diff --git a/build/proxy/usage/fee-management.mdx b/proxies/custom-proxy/fee-management.mdx similarity index 88% rename from build/proxy/usage/fee-management.mdx rename to proxies/custom-proxy/fee-management.mdx index ea60338..7fef1a9 100644 --- a/build/proxy/usage/fee-management.mdx +++ b/proxies/custom-proxy/fee-management.mdx @@ -37,8 +37,10 @@ struct OutMessageV1 { **tvmValidExecutors**: A list of executors you trust to execute the message on the TON side. For roundTrip messages, this must be an empty array; the trusted executors are already defined in the initial TON message. For direct messages, you can get trusted executors using `settings.getTrustedTVMExecutors()` or use an empty array for default executors. **toBridge**: List of ERC20 tokens you want to bridge to the TON network and transfer to tvmTarget. +Learn how to compose them [here](/proxies/custom-proxy/proxy-functions#complete-implementation-walkthrough). **toBridgeNFT**: List of NFTs you want to bridge to the TON network and transfer to tvmTarget. +Learn how to compose them [here](/proxies/advanced-custom-proxy/nft-support). ## Round-Trip Messages (TON → TAC → TON) @@ -65,7 +67,7 @@ function respondToTON(bytes calldata tacHeader, bytes calldata arguments) toBridgeNFT: new NFTAmount[](0) }); - _sendMessageV1(outMsg, 0); + _sendMessageV1(outMsg, 0); // 0 TACs to send back } ``` @@ -95,7 +97,7 @@ function sendDirectMessage() external payable { // It is recommended to: // - Overestimate slightly, or // - Use tacSDK for better fee estimation - uint256 executorFee = msg.value - protocolFee; // Simple example - use tacSDK for production + uint256 executorFee = msg.value - protocolFee; // Rough example - use tacSDK for production OutMessageV1 memory outMsg = OutMessageV1({ shardsKey: generateNewShardsKey(), // New operation @@ -108,7 +110,7 @@ function sendDirectMessage() external payable { toBridgeNFT: new NFTAmount[](0) }); - _sendMessageV1(outMsg, msg.value); + _sendMessageV1(outMsg, 0); // 0 TACs to send back } ``` @@ -122,24 +124,3 @@ function sendDirectMessage() external payable { Executor fees are market-determined based on network conditions and can vary significantly. - -## What's Next? - -You've now covered the core fee management patterns for TAC Proxy development: - - - - Learn complex argument encoding and decoding strategies - - - Comprehensive testing strategies for cross-chain contracts - - diff --git a/build/proxy/usage/message-flow.mdx b/proxies/custom-proxy/message-flow.mdx similarity index 93% rename from build/proxy/usage/message-flow.mdx rename to proxies/custom-proxy/message-flow.mdx index ccebea7..28aea09 100644 --- a/build/proxy/usage/message-flow.mdx +++ b/proxies/custom-proxy/message-flow.mdx @@ -95,19 +95,24 @@ function processMessage(bytes calldata tacHeader, bytes calldata arguments) Tokens are automatically transferred to your contract before your function is called: ```solidity +struct MyTokenStruct { + address evmAddress; + uint256 amount; +} + function handleTokens(bytes calldata tacHeader, bytes calldata arguments) external _onlyCrossChainLayer { // Decode the tokens you're expecting - TokenAmount[] memory expectedTokens = abi.decode(arguments, (TokenAmount[])); + MyTokenStruct[] memory expectedTokens = abi.decode(arguments, (MyTokenStruct[])); // Tokens are already in your contract balance for (uint i = 0; i < expectedTokens.length; i++) { uint256 balance = IERC20(expectedTokens[i].evmAddress).balanceOf(address(this)); require(balance >= expectedTokens[i].amount, "Expected tokens not received"); - // Process each token + // Your implementation how to process the tokens processToken(expectedTokens[i].evmAddress, expectedTokens[i].amount); } } @@ -121,14 +126,14 @@ Now that you understand the message flow, learn how to implement the core proxy Build the core logic that processes cross-chain calls and arguments Understand how to handle protocol fees and executor payments diff --git a/proxies/custom-proxy/proxy-functions.mdx b/proxies/custom-proxy/proxy-functions.mdx new file mode 100644 index 0000000..4e77f1d --- /dev/null +++ b/proxies/custom-proxy/proxy-functions.mdx @@ -0,0 +1,201 @@ +--- +title: Proxy Functions +description: "Build the core logic that processes cross-chain calls and arguments" +--- + +Proxy functions are the heart of your TAC contracts - they receive cross-chain calls from TON users and execute your application logic. This guide covers how to implement robust proxy functions that handle different use cases and error conditions. + +## Function Signature Requirements + +Every proxy function that handles cross-chain calls must follow this exact pattern: + +```solidity +function (bytes calldata, bytes calldata) external _onlyCrossChainLayer; +``` + +The function above also can be `payable`. + +You can name the function as you wish (e.g. `myProxyFunction`, `invokeWithCallback`, `swap`, etc.), but it must accept two bytes arguments: + +```solidity +function yourFunctionName(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer +{ + // Your implementation +} +``` + +**Required Components:** +- `bytes calldata tacHeader` - Contains verified TON user information +- `bytes calldata arguments` - Your custom encoded parameters +- `external` visibility - Functions must be externally callable +- `_onlyCrossChainLayer` modifier - Security requirement + +**Important:** Only the Cross-Chain Layer (CCL) contract can call these functions. When a user on TON sends a message, the CCL automatically transfers any bridged tokens to your proxy contract before calling your function. + +## Parameter Encoding and Decoding + +### Simple Parameters + +For basic data types, use straightforward encoding: + +```solidity +struct SimpleParams { + address token; + uint256 amount; + address recipient; +} + +function handleSimpleParams(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer +{ + // Decode parameters + SimpleParams memory params = abi.decode(arguments, (SimpleParams)); + + // Use the parameters + IERC20(params.token).transfer(params.recipient, params.amount); +} +``` + +### Complex Parameters + +For complex data with arrays or nested structures: + +```solidity +struct ComplexParams { + address[] tokens; + uint256[] amounts; + bytes swapData; + uint256 deadline; +} + +function handleComplexParams(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer +{ + ComplexParams memory params = abi.decode(arguments, (ComplexParams)); + + // Validate array lengths match + require(params.tokens.length == params.amounts.length, "Array length mismatch"); + + // Process each token + for (uint i = 0; i < params.tokens.length; i++) { + // Your custom logic here + IERC20(params.tokens[i]).transfer(msg.sender, params.amounts[i]); + } + + // Use additional data + if (params.swapData.length > 0) { + // Your custom swap logic here + } +} +``` + +## Complete Implementation Walkthrough + +Let's build a complete proxy function step-by-step, +showing external dApp integration - the most common real-world pattern implementing TON->TAC->TON transaction type: + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { TacProxyV1 } from "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; +import { TokenAmount, OutMessageV1, TacHeaderV1, NFTAmount } from "@tonappchain/evm-ccl/contracts/core/Structs.sol"; + +interface IDappContract { + function doSomething(address tokenA, address tokenB, uint256 amount) + external returns (uint256); +} + +contract MyProxy is TacProxyV1 { + IDappContract public dappContract; + + struct MyProxyFunctionArguments { + address tokenA; + address tokenB; + uint256 amount; + } + + constructor(address _dappContract, address _crossChainLayer) + TacProxyV1(_crossChainLayer) + { + dappContract = IDappContract(_dappContract); + } + + function myProxyFunction(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer + { + // 1. Decode the custom arguments + MyProxyFunctionArguments memory args = abi.decode(arguments, (MyProxyFunctionArguments)); + + // 2. Approve tokens to your Dapp contract for some action + IERC20(args.tokenA).approve(address(dappContract), args.amount); + + // 3. Call the Dapp contract + uint256 tokenBAmount = dappContract.doSomething( + args.tokenA, + args.tokenB, + args.amount + ); + + // 4. Prepare tokens to send back to TON + TokenAmount[] memory tokensToBridge = new TokenAmount[](1); + tokensToBridge[0] = TokenAmount(args.tokenB, tokenBAmount); + + // 5. Approve the CrossChainLayer to pull them + IERC20(tokensToBridge[0].evmAddress).approve( + _getCrossChainLayerAddress(), + tokensToBridge[0].amount + ); + + // 6. Decode the TAC header + TacHeaderV1 memory header = _decodeTacHeader(tacHeader); + + // 7. Form an OutMessage + OutMessageV1 memory outMsg = OutMessageV1({ + shardsKey: header.shardsKey, // Use same key for RoundTrip + tvmTarget: header.tvmCaller, // Send back to caller + tvmPayload: "", // Must be empty - not supported + tvmProtocolFee: 0, // 0 for RoundTrip - already paid on TON + tvmExecutorFee: 0, // 0 for RoundTrip - already paid on TON + tvmValidExecutors: new string[](0), // Empty for RoundTrip - already defined on TON + toBridge: tokensToBridge, // Result tokens + toBridgeNFT: new NFTAmount[](0) // No NFTs + }); + + // 8. Send message back through CrossChainLayer with zero native + _sendMessageV1(outMsg, 0); // 0 TACs to send back + } +} +``` + +**This example shows the complete flow:** +- External Dapp contract integration (lines 11-13, 19-21, 32-38) +- Token approval for external contracts (line 33) +- Processing and getting results (lines 35-38) +- RoundTrip response pattern (lines 48-58) +- Proper fee handling for RoundTrip messages (lines 52-53) + +**Important Notes:** +- Use `_sendMessageV1` for ERC20 token bridging only +- The CCL automatically handles token transfers to your proxy before calling your function +- Always include the `NFTAmount` import when using OutMessageV1 + +## What's Next? + +Now that you understand how to implement proxy functions, learn about managing fees: + + + + Understand how to handle protocol fees and executor payments + + diff --git a/build/proxy/usage/upgradeable-contracts.mdx b/proxies/custom-proxy/upgradeable-proxy.mdx similarity index 68% rename from build/proxy/usage/upgradeable-contracts.mdx rename to proxies/custom-proxy/upgradeable-proxy.mdx index a02c301..35e0032 100644 --- a/build/proxy/usage/upgradeable-contracts.mdx +++ b/proxies/custom-proxy/upgradeable-proxy.mdx @@ -1,5 +1,5 @@ --- -title: Upgradeable Proxy +title: Upgradeable Proxy Example description: "Build proxy contracts that can evolve and be upgraded over time" --- @@ -68,9 +68,9 @@ contract MyUpgradeableProxy is } ``` -## Key Differences from Basic Contracts +## Key Difference from Basic Contracts -### 1. Multiple Inheritance (Order Matters!) +The **inheritance order** is critical and must follow OpenZeppelin's recommended pattern. ```solidity contract MyUpgradeableProxy is @@ -80,51 +80,43 @@ contract MyUpgradeableProxy is TacProxyV1Upgradeable // TAC functionality (last) ``` -The inheritance order is critical and must follow OpenZeppelin's recommended pattern. - -### 2. Constructor vs Initialize - -```solidity -// ❌ DON'T use constructor for setup -constructor(address crossChainLayer) { - // This won't work properly with upgradeable contracts! +## Deployment + +Deployment differs from the basic example. UUPS pattern is used in the example below: + +```javascript +import { Signer } from "ethers"; +import { MyUpgradeableProxy } from "../../typechain-types"; +import { deployUpgradable } from '@tonappchain/evm-ccl' +import { DeployProxyOptions } from "@openzeppelin/hardhat-upgrades/dist/utils"; +import hre from 'hardhat'; + +const proxyOptsUUPS: DeployProxyOptions = { + kind: "uups", + unsafeAllow: ["constructor"] +}; + +export async function deployMyUpgradeableProxy( + deployer: Signer, + crossChainLayerAddress: string, + owner?: string, +): Promise { + const myUpgradeableProxy = await deployUpgradable( + deployer, + hre.artifacts.readArtifactSync('MyUpgradeableProxy'), + [owner || await deployer.getAddress(), crossChainLayerAddress], + proxyOptsUUPS, + undefined, + true // verbose + ); + + await myUpgradeableProxy.waitForDeployment(); + return myUpgradeableProxy; } -// ✅ DO use initializer function -function initialize(address owner, address crossChainLayer) - public - initializer -{ - __UUPSUpgradeable_init(); - __Ownable_init(owner); - __TacProxyV1Upgradeable_init(crossChainLayer); -} +main().catch(console.error); ``` -### 3. Constructor Disabling - -```solidity -/// @custom:oz-upgrades-unsafe-allow constructor -constructor() { - _disableInitializers(); // Prevents initialization of implementation -} -``` - -This prevents the implementation contract from being initialized, which could be a security risk. - -### 4. Upgrade Authorization - -```solidity -function _authorizeUpgrade(address newImplementation) - internal - override - onlyOwner -{} -``` - -This function controls who can upgrade the contract. Only the owner can upgrade in this example. - - ## What's Next? You now understand both basic and upgradeable proxy patterns: @@ -133,14 +125,14 @@ You now understand both basic and upgradeable proxy patterns: Understand exactly how cross-chain messages work Learn to implement the core proxy function logic diff --git a/proxies/introduction.mdx b/proxies/introduction.mdx new file mode 100644 index 0000000..7fa6dea --- /dev/null +++ b/proxies/introduction.mdx @@ -0,0 +1,37 @@ +--- +title: TAC Proxies +description: "TAC Proxy contracts receive cross-chain calls and assets from TON users and route them to EVM dApps and vice versa" +--- + +Learn more about TAC Proxies role on [this page](/why-tac/components/proxy-contracts). + +## Proxy Solutions + +When choosing a proxy solution, you currently have two options: + +- **Custom**: Build and deploy a proxy for your EVM dApp using Solidity. +Test locally using `TacLocalTestSdk` library or our joint [TON + TAC Testnet](/sdk/overview#testnet). +This option supports any level of complexity. + +- **Agnostic**: Implement calls to your EVM dApp directly in your frontend or JS-based backend using our SDK. +No deployment needed. +Test on our joint [TON + TAC Testnet](/sdk/overview#testnet). +Has limitations, preferred for relatively simple use cases. + + + + Development guide using Solidity + + + + Introductory page. Only SDK required + + diff --git a/build/quickstart.mdx b/quickstart/overview.mdx similarity index 50% rename from build/quickstart.mdx rename to quickstart/overview.mdx index 31475e3..fcea9ee 100644 --- a/build/quickstart.mdx +++ b/quickstart/overview.mdx @@ -1,5 +1,5 @@ --- -title: Quickstart +title: Overview description: "Get started with TAC development in minutes, building hybrid dApps that connect TON and EVM ecosystems" --- @@ -37,38 +37,46 @@ Get up and running with TAC development quickly by building your first hybrid dA - Node.js v18.0.0 or higher - Blockchain Accounts: - - Ethereum wallet with testnet TAC tokens for deployment - - TON wallet for testing (Tonkeeper or TON Space recommended) - - Get Testnet Tokens: - - TAC tokens: [TAC Testnet Faucet](https://spb.faucet.tac.build) - + - TON wallet (like [Tonkeeper](https://tonkeeper.com/) or [Wallet](https://wallet.tg/)) + - _(Optional)_ EVM wallet (like [Metamask](https://metamask.io/)) with TAC Testnet network added (Use button `Add TAC SPB` in upper right corner [over here](https://spb.explorer.tac.build/)) - - Navigate to the contracts directory and deploy to TAC testnet: + + - Get `TON` on [TON Testnet Faucet](https://t.me/testgiver_ton_bot). For the sake of this demo `TON` tokens are enough. + - _(Optional)_ Get `TAC` on [TAC Testnet Faucet](https://spb.faucet.tac.build). If you choose to deploy your contracts to TAC Testnet. + + + + You can skip this step and use already deployed and pre-set contracts within `my-tac-project` or deploy fresh ones and yours truly. + + Create `.env` file out of `.env.example`. + + For the deployment navigate to the contracts directory and deploy to TAC Testnet: ```bash cd my-tac-project/contracts npm install - npx hardhat run scripts/deploy.js --network tacTestnet + npx hardhat compile + npx hardhat run scripts/deploy.ts --network tacTestnet ``` **Take note of the deployed addresses:** - SimpleMessage contract address - MessageProxy contract address + - MockToken contract address - These will be displayed in your console after successful deployment. + These will be displayed in your console after successful deployment. Also saved to `addresses.json` file. - - Open `lib/contract_addresses.ts` and update with your deployed contract addresses: + + To use the specific addresses from the previous step open `lib/contract_addresses.ts` and update with your deployed contract addresses: ```typescript export const CONTRACT_ADDRESSES = { - simpleMessage: "0xYourSimpleMessageAddress", - messageProxy: "0xYourMessageProxyAddress" + SIMPLE_MESSAGE: "0xYourSimpleMessageAddress", + MESSAGE_PROXY: "0xYourMessageProxyAddress" }; ``` @@ -96,76 +104,87 @@ Get up and running with TAC development quickly by building your first hybrid dA Open your application in the browser and: 1. Click the "Connect Wallet" button - 2. Choose your TON wallet (Tonkeeper, TON Space, etc.) + 2. Choose your TON wallet (Wallet, Tonkeeper, etc.) 3. Approve the connection in your wallet - 4. Verify your wallet address appears in the interface + 4. Verify your wallet address appeared in the interface The starter app includes a messaging example that demonstrates cross-chain communication from TON to your EVM smart contracts. - - + Try the example functionality: - 1. **Send a Message**: Use the message form to send data from TON to your EVM contract + 1. **Send a Message**: Click 'Send Cross-Chain Message' and approve it in you TON wallet to send a data from TON to your EVM contract 2. **Track Status**: Watch the transaction progress through cross-chain stages 3. **View Results**: See the message stored on the EVM side - This demonstrates the complete flow of hybrid dApp interaction. - + This demonstrates the complete flow of hybrid dApp interaction the TON->TAC way. TON->TAC->TON and TAC->TON are also possible with different dApp architectures. - - Now start customizing for your use case: + + Select different `CONTRACT_ADDRESS.MESSAGE_PROXY` in `lib/contracts.ts`, you'll see the related comment. + + Or do it in a more advanced way: + 1. Navigate to `contracts/MessageProxy.sol` and uncomment the related code block. + 2. Deploy a set of contracts with `npx hardhat run scripts/deploy.ts --network tacTestnet` + 3. Update `lib/contracts.ts` with the new contract addresses. + + Open the UI and repeat the previous step. + + + + Now you can start customizing dApp logic for your specific use case. **Smart Contracts** (`contracts/` directory): - Modify `SimpleMessage.sol` for your business logic - Update `MessageProxy.sol` for custom cross-chain handling - Add new contracts as needed - **Frontend** (`pages/` and `components/` directories): + **Frontend** (`components/` directory): - Customize the UI components - Add new pages and functionality - - Integrate additional TAC SDK features **Cross-Chain Features**: - - Asset bridging between TON and EVM + + Integrate additional TAC SDK features like: + - Asset (FT, NFT) bridging between TON and EVM - Multi-step cross-chain workflows - Advanced transaction tracking - + ## Next Steps - - Learn how to deploy and verify Solidity contracts on TAC EVM - - - - Create custom proxy contracts for advanced cross-chain operations - - - - Master the TAC SDK for powerful frontend integrations - - - + Take a closer look into existing hybrid dApp implementations + + + + Create custom proxy contracts for advanced cross-chain operations + + + + Master the TAC SDK for powerful frontend integrations + + + - Set up Hardhat, Foundry, and other development tools - + href="/ecosystem#development-tools" + > + Set up Hardhat, Foundry, and other development tools + + ## Common Issues & Solutions @@ -175,11 +194,8 @@ Get up and running with TAC development quickly by building your first hybrid dA **Check your setup:** - Verify you have testnet TAC tokens in your deployment wallet - Ensure your private key is correctly set in `.env` - - Confirm you're using the correct network configuration - - **Get help:** - - Check the Hardhat logs for specific error messages - - Verify contract addresses on the [TAC Explorer](https://spb.explorer.tac.build) + - Confirm you're using the [correct network configuration](/ecosystem/network-info#testnet) + - Verify contract addresses on the [TAC Testnet explorer](https://spb.explorer.tac.build) @@ -187,10 +203,11 @@ Get up and running with TAC development quickly by building your first hybrid dA **Troubleshooting steps:** -- Make sure you're using a supported TON wallet -- Clear your browser cache and try again +- Sometimes Tonconnect may not show you the send transaction popup. Try several times until success +- Make sure you're using a supported TON wallet in the pop-up TON Connect menu in the UI - Check that your wallet is set to TON testnet -- Verify the TON Connect manifest is accessible +- Clear your browser cache and try again +- Verify the my-tac-project TON Connect [manifest](https://raw.githubusercontent.com/TacBuild/starter-frontend/refs/heads/main/public/tonconnect-manifest.json) is accessible diff --git a/release-notes/evm.mdx b/release-notes/evm.mdx deleted file mode 100644 index f7fc09e..0000000 --- a/release-notes/evm.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: TAC EVM -description: "Track TAC EVM updates, breaking changes, and new features across versions" ---- - - - All the new updates, breaking changes, and new features from TAC EVM will be - documented here. - diff --git a/release-notes/overview.mdx b/release-notes/overview.mdx deleted file mode 100644 index 6e8d74d..0000000 --- a/release-notes/overview.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Overview -description: "Stay updated with the latest changes across TAC's infrastructure, SDK, and development tools" ---- - -Track the latest updates, improvements, and changes across all TAC components. Each section provides detailed changelogs for developers to understand what's new and what might affect their applications. - -## Component Updates - - - - Updates to the TAC SDK including new features, bug - fixes, breaking changes, and API improvements for hybrid dApp development. - - - - Changes to the TON Adapter system including protocol updates, consensus - improvements, and cross-chain messaging enhancements. - - - - TAC EVM Layer updates including network upgrades, new - features, performance improvements, and breaking changes. - - diff --git a/release-notes/sdk.mdx b/release-notes/sdk.mdx deleted file mode 100644 index efe7dcf..0000000 --- a/release-notes/sdk.mdx +++ /dev/null @@ -1,307 +0,0 @@ ---- -title: JavaScript SDK -description: "Track SDK updates, breaking changes, and new features across versions" ---- - -This changelog documents all notable changes to the TAC SDK, including new features, improvements, bug fixes, and breaking changes. - - - -### Added - -- **New Assets Module**: Added classes and utilities for working with FT, NFT, and TON assets, including AssetFactory and AssetCache -- **Logger Components**: ConsoleLogger and NoopLogger for flexible logging configuration - SDK components are silent by default unless logger is provided -- **Simulator Component**: Internal simulation component for TAC-side transaction simulation, gas estimation, and fee calculation -- **Transaction Managers**: TONTransactionManager and TACTransactionManager for handling cross-chain transaction execution -- **TonTxFinalizer**: Utility for verifying transaction tree success on TON blockchain using TON Center API -- **RetryableContractOpener**: Enhanced contract opener for improved SDK stability and reliability -- **Balance Verification**: Automatic balance checking before sending cross-chain transactions -- **Batch Transaction Support**: RawSender can now send transactions in batches (254 for V5R1 wallets, 4 for other wallet versions) -- **Wait Options**: Optional `waitOptions` parameter for OperationTracker methods and `sendCrossChainTransaction(s)` to automatically wait for operation completion -- **AgnosticProxy SDK**: Experimental SDK for building complex DeFi operations with dynamic value replacement (testing only) - -### Changed - -- **Performance Optimizations**: Significantly improved SDK initialization speed by parallelizing blockchain queries and initialization steps -- **Sender Architecture**: Refactored BatchSender, RawSender, and TonConnectSender with improved contractOpener and retryableContractOpener -- **Core Infrastructure**: Updated error handling, structs, utilities, and OperationTracker components -- **Method Signatures**: OperationTracker methods and `sendCrossChainTransaction(s)` now accept optional `waitOptions` for automatic completion waiting - - - - - -### Changed - -- Switched to spb(chain) set of addresses - - - - - -### Added - -- Advanced options to `sendCrossChainTransaction` -- Method to send multiple crosschain transactions at once: `sendCrossChainTransactions` -- Batch sending support for crosschain transactions -- Error handling while sending crosschain transactions - -### Changed - -- TonClient with TAC endpoint as default contract opener - - - - - -### Added - -- `metaInfo` field to the `ExecutionStages` -- LiteSequencerClient to handle lite sequencer requests and its parameters -- Method to calculate tvmExecutorFee: `getTVMExecutorFeeInfo` - -### Changed - -- `getEVMTokenAddress` now automatically normalizes addresses to `EQ` form -- For TAC->TON transactions tvmExecutorFee calculated via lite sequencer - - - - - -### Added - -- Fee support for crosschain transactions -- New methods for requesting execution fees and simulation `getTransactionSimulationInfo` -- Methods to work with NFT items: bridging and getting addresses - -### Changed - -- Switched to v3 sequencer - - - - - -### Changed - -- Changed tvm jetton minter stateInit in `getJettonOpType` - - - - - -### Changed - -- Changed tvm jetton minter stateInit - - - - - -### Changed - -- Fixed bug with crossChainTonAmount in generating jetton payload - - - - - -### Changed - -- Due to an API change, updated the `operationId` retrieval. An empty string will be returned for 404 errors - - - - - -### Changed - -- Fixed bug with V5 wallet - - - - - -### Changed - -- `StageName` value namings -- `startTracking` has been improved. Added optional parameters - -### Removed - -- `ExecutionStagesTableData` type -- `TrackingOperationResult` type - - - - - -### Added - -- `OperationType` type -- `ExecutionStagesTableData` type -- `TrackingOperationResult` type -- `StageName` enum -- `getOperationType` in `OperationTracker` retrieves the `OperationType` for `operationId` - -### Changed - -- The stage names have been changed -- Changed namings in enums -- `OperationType` added in the `ExecutionStages` -- `ExecutionStages` structure -- Added return value in method `sendShardTransaction` in `TonConnectSender` -- Added `forceSend` option in method `sendCrossChainTransaction` in `TacSdk` -- `startTracking` has been improved. Added optional parameters and return values - -### Removed - -- Deleted `isBridgeOperation` (now it can be determined with `getOperationType`) - - - - - -### Changed - -- **Changed package tac-sdk -> @tonappchain/sdk** -- `calculateEVMTokenAddress` function now requires tokenUtils address as deployer and crossChainLayer address as constructor params -- Rename shardedId -> shardsKey -- A `gasLimit` field has been added to `EvmProxyMsg` (defaulting to undefined, which will be set through simulation in this case) -- Renamed json properties in `buildEvmDataCell` -- Renamed urls in `OperationTracker` - -### Added - -- `options` parameter in `getSender` method to modify W5 and Highload V3 wallets -- `customLiteSequencerEndpoints` parameter in `SDKParams` to specify custom lite sequencer endpoints -- `simulateEVMMessage` method in `TacSdk` to simulate EVM message execution on TAC side -- `getOperationStatuses` method in `OperationTracker` retrieves the statuses of multiple operations based on their respective `operationId's` -- `getOperationIdsByShardsKeys` method in `OperationTracker` retrieves the `operationId's` based on their respective `shardsKey's` -- `getStageProfilings` method in `OperationTracker` retrieves the `ExecutionStages's` based on their respective `operationId's` -- `getStageProfiling` method in `OperationTracker` retrieves the `ExecutionStages` for `operationId` -- Added a pre-check before sending to the blockchain to ensure the transaction will execute successfully on the TAC side using the `simulateEVMMessage` method -- Support for highload V3 wallet as a sender - - - - - -### Added - -- Contract opener `orbsOpener4` that uses new version TON endpoints - -### Changed - -- `orbsOpener4` set as default in SDK - - - - - -### Changed - -- `@tonappchain/artifacts` upgraded to `0.0.14` - - - - - -### Added - -- `getUserJettonBalanceExtended` method in `TacSdk` to get user jetton balance extended with decimals info - -### Changed - -- `AssetBridgingData` now supports multiple formats of asset value: with decimals and without decimals. In case decimals are not provided, the SDK will try to extract it from chain - - - - - -### Added - -- Section in readme about TACHeader -- AddLiquidity uniswap_v2 test -- `orbsOpener` method to construct custom contractOpener for TacSDK. It uses Orbs Network and does not have rate limits - -### Changed - -- SDK uses orbsOpener by default -- `address` field in `AssetBridgingData` can be either EVM or TVM address -- Method `SenderFactory.getSender` requires additional parameter `network` when creating wallet wrapper using mnemonic -- Fixed `getContractState` in `liteClientOpener` -- Fixed all tests for TACHeader logic -- Version `@tonappchain/artifacts` upgraded to `0.0.12-addresses` -- Request to `/status` endpoint of Sequencer API changed from `GET` to `POST` with body -- Signature of `getOperationStatus` is changed - -### Removed - -- Deleted test bridgeData - - - - - -### Changed - -- Calculate token addresses through emulation -- Renamed `TransactionStatus` to `OperationTracker` -- Renamed method `OperationTracker.getStatusTransaction()` to `OperationTracker.getOperationStatus()` -- Renamed method `OperationTracker.getSimpifiedTransactionStatus()` to `OperationTracker.getSimplifiedOperationStatus()` -- Renamed `TacSDKTonClientParams` to `SDKParams` -- Changed struct of `SDKParams` -- Changed `ton-lite-client` library to its fork `@tonappchain/ton-lite-client` - -### Added - -- Custom `TONParams` and `TACParams` in `SDKParams` -- `network` and `customLiteSequencerEndpoints` params to `OperationTracker` constructor -- Static async function `create` in `TacSdk` for creating an instance of `TacSdk` -- Custom errors -- Methods that may construct custom contractOpener for TacSDK -- Method `closeConnections` in `TacSdk` for closing all network connections -- Optional method `closeConnections` to `ContractOpener` interface - -### Removed - -- `init` function in `TacSdk` -- Public constructor of `TacSdk` - - - - - -### Added - -- Method to get TVM address based on EVM address -- Tests for SDK methods using contract emulation -- Support for custom contract opener -- SDK uses @tonappchain/artifacts -- Added get methods for native token addresses -- Added support for native token address calculation in _getEVMTokenAddress_ and _getTVMTokenAddress_ methods - -### Removed - -- Support for TON wallet v1 - - - - - -### Added - -- Code formatting - - - - - -### Added - -- Support for all versions of TON wallet (v1 - v5) -- SenderFactory to create AbstractSender - - diff --git a/release-notes/ton-adapter.mdx b/release-notes/ton-adapter.mdx deleted file mode 100644 index 738f2d6..0000000 --- a/release-notes/ton-adapter.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: TON Adapter -description: "Track TON Adapter updates, breaking changes, and new features across versions" ---- - - - All the new updates, breaking changes, and new features from TON Adapter will - be documented here. - diff --git a/build/sdk/advanced-usage/agnostic-proxy.mdx b/sdk/advanced-usage/agnostic-proxy.mdx similarity index 64% rename from build/sdk/advanced-usage/agnostic-proxy.mdx rename to sdk/advanced-usage/agnostic-proxy.mdx index 44a4954..ff3cbdb 100644 --- a/build/sdk/advanced-usage/agnostic-proxy.mdx +++ b/sdk/advanced-usage/agnostic-proxy.mdx @@ -1,15 +1,20 @@ --- -title: AgnosticProxy SDK -description: "Build complex DeFi operations with dynamic value replacement and efficient hook systems" +title: Agnostic Proxy +description: "Build complex DeFi workflows with dynamic value replacement and efficient hook systems. +Eliminate the need for custom [TAC Proxies](/why-tac/compnents/proxy-contracts)." --- - - **⚠️ EXPERIMENTAL FEATURE**: This TAC functionality is not a release version - and will change in future versions. It is recommended to use this only for - testing purposes and not in production environments. - +The Agnostic Proxy enables building complex DeFi operations with dynamic value replacement capabilities. It moves business logic from proxy contracts to your application code, making development more reactive and eliminating the need for custom proxy contract audits. -The AgnosticProxy SDK enables building complex DeFi operations with dynamic value replacement capabilities. It moves business logic from proxy contracts to your application code, making development more reactive and eliminating the need for custom proxy contract audits. + + + Documentation + + ## Overview @@ -28,7 +33,7 @@ The AgnosticProxy SDK allows you to: - **Visualization Tools**: Human-readable chain visualization and debugging - **Type Safety**: Full TypeScript support -## Quick Start +## Quickstart ```javascript import { AgnosticProxySDK, Network } from "@tonappchain/sdk"; @@ -271,123 +276,6 @@ async function executeCompleteStrategy() { } ``` -## ABI Support - -The SDK supports multiple ABI formats: - -### Human-Readable ABI - -```javascript -const abi = [ - "function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts)", -]; - -sdk.addContractInterface(CONTRACT_ADDRESS, abi); -``` - -### JSON ABI - -```javascript -const jsonAbi = [ - { - inputs: [ - { name: "amount", type: "uint256" }, - { name: "recipient", type: "address" }, - ], - name: "stake", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, -]; - -sdk.addContractInterface(CONTRACT_ADDRESS, jsonAbi); -``` - -## Advanced Features - -### Replacement Calculator Tools - -Automatically calculate dynamic value replacement positions: - -```javascript -// Automatic calculation based on function signature -const replacement = sdk.calculateReplacementData( - UNISWAP_ROUTER, - "swapExactTokensForTokens", - "amountIn", // parameter name - TOKENS.USDC, - userAddress -); - -// Interactive replacement builder with validation -const result = sdk.buildReplacementInteractive( - STAKING_CONTRACT, - "stake", - "amount", - TOKENS.COMP, - userAddress, - { - showCalculation: true, - validate: true, - } -); -``` - -### Visualization and Debugging - -```javascript -// Visualize operation chain -sdk.visualizeZapCall(zapCall); - -// Get detailed breakdown -const breakdown = sdk.getZapCallBreakdown(zapCall); - -// Compare strategies -sdk.compareZapCalls(strategyA, strategyB, "Strategy A", "Strategy B"); - -// Debug individual hooks -zapCall.hooks.forEach((hook, i) => { - console.log(`Hook ${i}:`, sdk.decodeHookData(hook)); -}); -``` - -## API Reference - -### Constructor - -```javascript -new AgnosticProxySDK(network: Network, agnosticProxyAddress?: string) -``` - -### Core Methods - -- `addContractInterface(address: string, abi: any[]): this` - Add contract interface -- `createCustomHook(contractAddress, functionName, params, options): Hook` - Create custom hook -- `createFullBalanceApproveHook(token, to, isFromSAPerspective): Hook` - Create approve hook -- `createFullBalanceTransferHook(token, to, isFromSAPerspective): Hook` - Create transfer hook -- `buildZapCall(hooks, bridgeTokens?, bridgeNFTs?): ZapCall` - Build complete ZapCall -- `encodeZapCall(zapCall): string` - Encode ZapCall for execution -- `getAgnosticCallParams(): {evmTargetAddress: string, methodName: string}` - Get call parameters - -### Utility Methods - -- `visualizeZapCall(zapCall): void` - Display operation visualization -- `getZapCallBreakdown(zapCall): object` - Get detailed breakdown -- `createAmountReplacement(paramIndex, token, balanceAddress): AmountChange` - Create replacement -- `calculateReplacementData(contractAddress, functionName, parameterName, token, balanceAddress): AmountChange` - Auto-calculate replacement - -## Error Handling - -```javascript -try { - const zapCall = sdk.createCustomHook("0xinvalidaddress", "someFunction", []); -} catch (error) { - console.error("Error:", error.message); - // Handle contract interface not found, invalid parameters, etc. -} -``` - ## Best Practices 1. **Always add contract interfaces** before creating hooks @@ -396,7 +284,4 @@ try { 4. **Visualize strategies** before execution to verify logic 5. **Test with small amounts** first on testnet - - The AgnosticProxy SDK is experimental and designed for advanced DeFi - strategies. Always test thoroughly on testnet before using with real assets. - +Learn more in the thorough Agnostic Proxy [GitHub page](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/agnostic_proxy_sdk.md). diff --git a/sdk/advanced-usage/batch-send.mdx b/sdk/advanced-usage/batch-send.mdx new file mode 100644 index 0000000..8c0ee20 --- /dev/null +++ b/sdk/advanced-usage/batch-send.mdx @@ -0,0 +1,50 @@ +--- +title: Batch Send +description: "" +--- + +Send multiple cross-chain transactions simultaneously using method `sendCrossChainTransactions`: + +```javascript +const batchTransactions = async () => { + // Define multiple transactions + const transactions = [ + { + evmProxyMsg: { + evmTargetAddress: "0xContract1...", + methodName: "method1(bytes,bytes)", + encodedParameters: "0x...", + }, + assets: [{ amount: 1.0 }], + }, + { + evmProxyMsg: { + evmTargetAddress: "0xContract2...", + methodName: "method2(bytes,bytes)", + encodedParameters: "0x...", + }, + assets: [{ address: "EQJetton...", amount: 100 }], + }, + ]; + + // Convert to batch format + const crosschainTxs = transactions.map((tx) => ({ + evmProxyMsg: tx.evmProxyMsg, + assets: tx.assets || [], + })); + + // Send batch + const transactionLinkers = await tacSdk.sendCrossChainTransactions( + sender, + crosschainTxs + ); + + // Send batch + const transactionLinkers = await tacSdk.sendCrossChainTransactions( + sender, + crosschainTxs + ); + + return transactionLinkers.map((linker) => linker.operationId); +}; +``` diff --git a/sdk/frameworks.mdx b/sdk/frameworks.mdx new file mode 100644 index 0000000..9abdf0b --- /dev/null +++ b/sdk/frameworks.mdx @@ -0,0 +1,270 @@ +--- +title: Framework Integration +--- + +The TAC SDK can be used within different frontend frameworks. Below you can find examples for the popular ones like **React**, **Next.js** and **Vue.js**. + +## Integration Examples + +### React Application + +Create a context provider for SDK management: + +```jsx +import React, { createContext, useContext, useEffect, useState } from "react"; +import { TacSdk, Network } from "@tonappchain/sdk"; + +const TacSdkContext = createContext(null); + +export const TacSdkProvider = ({ children }) => { + const [tacSdk, setTacSdk] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const initializeSdk = async () => { + try { + setLoading(true); + setError(null); + + const sdk = await TacSdk.create({ + network: + process.env.NODE_ENV === "production" + ? Network.MAINNET + : Network.TESTNET, + delay: process.env.NODE_ENV === "production" ? 500 : 1000, + }); + + setTacSdk(sdk); + } catch (err) { + console.error("Failed to initialize TAC SDK:", err); + setError(err); + } finally { + setLoading(false); + } + }; + + initializeSdk(); + + // Cleanup on unmount + return () => { + if (tacSdk) { + tacSdk.closeConnections(); + } + }; + }, []); + + return ( + + {children} + + ); +}; + +export const useTacSdk = () => { + const context = useContext(TacSdkContext); + if (!context) { + throw new Error("useTacSdk must be used within a TacSdkProvider"); + } + return context; +}; +``` + +### Next.js Application + +Handle client-side initialization with proper error boundaries: + +```jsx +// hooks/useTacSdk.js +import { useEffect, useState } from "react"; +import { TacSdk, Network } from "@tonappchain/sdk"; + +export const useTacSdk = () => { + const [tacSdk, setTacSdk] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + // Ensure client-side only + if (typeof window === "undefined") return; + + const initializeSdk = async () => { + try { + const sdk = await TacSdk.create({ + network: + process.env.NODE_ENV === "production" + ? Network.MAINNET + : Network.TESTNET, + delay: process.env.NODE_ENV === "production" ? 500 : 1000, + }); + + setTacSdk(sdk); + setError(null); + } catch (err) { + console.error("SDK initialization failed:", err); + setError(err); + } finally { + setLoading(false); + } + }; + + initializeSdk(); + + return () => { + if (tacSdk) { + tacSdk.closeConnections(); + } + }; + }, []); + + const reinitialize = async () => { + setLoading(true); + setError(null); + + try { + if (tacSdk) { + await tacSdk.closeConnections(); + } + + const sdk = await TacSdk.create({ + network: Network.TESTNET, + delay: 1000, + }); + + setTacSdk(sdk); + } catch (err) { + setError(err); + } finally { + setLoading(false); + } + }; + + return { tacSdk, loading, error, reinitialize }; +}; +``` + +### Vue.js Application + +Create a composable for SDK management: + +```javascript +// composables/useTacSdk.js +import { ref, onMounted, onUnmounted } from "vue"; +import { TacSdk, Network } from "@tonappchain/sdk"; + +export function useTacSdk() { + const tacSdk = ref(null); + const loading = ref(true); + const error = ref(null); + + const initialize = async () => { + try { + loading.value = true; + error.value = null; + + tacSdk.value = await TacSdk.create({ + network: import.meta.env.PROD ? Network.MAINNET : Network.TESTNET, + delay: import.meta.env.PROD ? 500 : 1000, + }); + } catch (err) { + console.error("TAC SDK initialization failed:", err); + error.value = err; + } finally { + loading.value = false; + } + }; + + onMounted(initialize); + + onUnmounted(() => { + if (tacSdk.value) { + tacSdk.value.closeConnections(); + } + }); + + return { + tacSdk: readonly(tacSdk), + loading: readonly(loading), + error: readonly(error), + reinitialize: initialize, + }; +} +``` + +## Common Issues and Solutions + + + + If you encounter module resolution errors, ensure you're using a modern bundler that supports ES modules: + + **Webpack 5:** + + ```javascript + // webpack.config.js + module.exports = { + resolve: { + fallback: { + crypto: require.resolve("crypto-browserify"), + stream: require.resolve("stream-browserify"), + buffer: require.resolve("buffer"), + }, + }, + }; + ``` + + **Vite:** + + ```javascript + // vite.config.js + export default { + define: { + global: "globalThis", + }, + resolve: { + alias: { + crypto: "crypto-browserify", + stream: "stream-browserify", + buffer: "buffer", + }, + }, + }; + ``` + + + + + + If you experience network connection issues: + + **Verify firewall settings** - Ensure your environment can access TON and TAC endpoints + + + + + + For TypeScript type errors: + + 1. **Install type definitions:** + + ```bash + npm install --save-dev @types/node + ``` + + 2. **Update your tsconfig.json:** + + ```json + { + "compilerOptions": { + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true + } + } + ``` + + 3. **Use explicit imports:** + ```typescript + import type { TacSdk, Network } from "@tonappchain/sdk"; + ``` + + diff --git a/sdk/overview.mdx b/sdk/overview.mdx new file mode 100644 index 0000000..983a169 --- /dev/null +++ b/sdk/overview.mdx @@ -0,0 +1,433 @@ +--- +title: TAC SDK +description: Developer's kits to build hybrid dApps. +--- + + + Open the [Quickstart guide](/build/quickstart) to send your first + cross-chain transaction and see the SDK in action. + + + + + Build hybrid dApp using TypeScript with **@tonappchain/sdk** + + + + Build hybrid dApp using Python with **tac-sdk** + + + + +## Installation + +Install the TAC SDK using your preferred package manager: + + + ```bash npm + npm install @tonappchain/sdk + ``` + + ```bash yarn + yarn add @tonappchain/sdk + ``` + + ```bash pnpm + pnpm add @tonappchain/sdk + ``` + + +## Core Capabilities + +The SDK provides four essential capabilities that make hybrid dApp development straightforward: + +Code snippets below are written in TypeScript, but the same features are also available in Python. + +### 1. TON Wallet Integration + +The SDK handles all aspects of TON wallet connectivity through the standard TON Connect protocol (or mnemonic usage). Users can connect with popular wallets like Wallet and Tonkeeper without installing additional software or managing new seed phrases. + +```javascript +// Simple wallet connection +const tacSdk = await TacSdk.create({ network: Network.TESTNET }); +const sender = await SenderFactory.getSender({ tonConnect: tonConnectUI }); +``` + +### 2. Cross-Chain Transaction Routing + +Developers specify what they want to happen on the EVM side, and the SDK handles all the complex message formatting and routing through the TON Adapter. + +```javascript +// Send tokens to an EVM DEX for swapping +const transactionLinker = await tacSdk.sendCrossChainTransaction( + evmProxyMsg, // What to call on EVM + sender, // TON wallet + assets // Tokens to bridge +); +``` + + + Always send transactions on a Testnet first. Cross-chain transactions are + irreversible once confirmed, and incorrect parameters can result in loss of + funds. + + +### 3. Asset Bridging + +Token transfers between TON and TAC EVM happen automatically on behalf on the [TON Adapter](/why-tac/components/ton-adapter). +The SDK manages encoding calldata for locking the specific tokens on TON, and accessing the target EVM dApp method. + +Learn more about working with different types of assets in the [Asset Bridging page](/why-tac/cross-chain-operations/asset-bridging). + +### 4. Real-Time Status Tracking + +The SDK provides comprehensive tools for monitoring cross-chain transactions, allowing applications to show users exactly what's happening and when operations complete. + +```javascript +await tacSdk.startTracking(transactionLinker); +``` + +## How It Works + +The SDK acts as a bridge between your frontend application and TAC's cross-chain infrastructure: + + + + Developers integrate the SDK into their frontend applications and specify + EVM operations using familiar TypeScript/JavaScript patterns. + + + + The SDK formats cross-chain messages with proper encoding, handles asset + preparation, and manages wallet interactions. + + + + Before each send cross-chain transaction call, simulation of the requested operation on TAC EVM is performed automatically, + helping you identify any potential issues before actually sending anything. + + + + Messages are routed through the TON Adapter's sequencer network, which + validates and processes them securely. + + + + Target EVM contracts receive properly formatted calls with bridged assets, + executing the requested operations. + + + + The SDK monitors progress and provides real-time updates to the frontend, + handling completion or failure scenarios. + + + +## Key Components + +The SDK is organized into focused components that handle different aspects of hybrid dApp functionality: + + + The primary class that developers interact with for all cross-chain operations. It handles SDK initialization, transaction sending, token address mapping, and balance queries. + + Key features include sending cross-chain transactions, getting token addresses across chains, checking user balances, and managing SDK lifecycle. + + + + + Provides comprehensive tools for tracking cross-chain transaction status and progress. Applications can monitor operations in real-time and provide users with accurate updates. + + Supports both simplified status checking (Pending/Successful/Failed) and detailed stage-by-stage tracking for advanced use cases. + + + + + Handles transaction signing and submission through different wallet types. Supports TON Connect for web applications and raw private keys for backend services. + + Provides a unified interface regardless of the underlying wallet technology, simplifying application development. + + + +## Development Experience + +The SDK is designed to feel familiar to web developers while providing powerful cross-chain capabilities: + +### Typification + +The SDK provides comprehensive TypeScript definitions and Python type hints, enabling better development experience with IDE autocompletion and compile-time error checking. + +### Simulation + +Built-in simulation capabilities help developers validate their integrations before transfer: + +```javascript +const simulation = await tacSdk.getSimulationInfo( + evmProxyMsg, // What to call on EVM + sender, // TON wallet + assets // Tokens to bridge +); +``` + +### Testnet + +Joint TON Testnet and TAC Testnet environment available for developers 24/7. +Verify your DeFi flow from TON to TAC and vice versa as simply as creating your sdk instance in the Testnet mode: + +```javascript +const tacSdk = await TacSdk.create({ network: Network.TESTNET }); +``` + +### Wait Options + +Many SDK methods support optional wait parameters to control the time it takes for operations to complete: + +```javascript +// Basic waiting with defaults +const defaultWaitOptions = {}; +const result = await tacSdk.sendCrossChainTransaction( + evmProxyMsg, + sender, + assets, + undefined, // transaction options + { waitOptions: defaultWaitOptions } // use default wait options +); + +// Custom timeout and polling interval +const customWaitOptions = { + timeout: 600000, // 10 minutes + delay: 5000, // Check every 5 seconds +}; +const resultWithCustomTiming = await tacSdk.sendCrossChainTransaction( + evmProxyMsg, + sender, + assets, + undefined, + { waitOptions: customWaitOptions } +); +``` + +## Verification + +Test your installation with a simple initialization: + +```javascript +import { TacSdk, Network } from "@tonappchain/sdk"; + +async function testInstallation() { + try { + const tacSdk = await TacSdk.create({ + network: Network.TESTNET, + }); + + console.log("✅ TAC SDK initialized successfully"); + console.log("Network:", tacSdk.network); + + // Clean up + tacSdk.closeConnections(); + } catch (error) { + console.error("❌ Installation test failed:", error); + } +} + +testInstallation(); +``` + + + Remember to always call `await tacSdk.closeConnections()` when your application + shuts down to properly clean up network resources and prevent memory leaks. + + +## Sender Factory + +The SDK supports all standard TON wallet versions: + +```javascript +import { SenderFactory, Network, AssetType } from "@tonappchain/sdk"; + +// Wallet V4 (most common) +const senderV4 = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "V4", + mnemonic: "word1 word2 word3 ... word24", +}); + +// Wallet V5R1 (latest) +const senderV5 = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "V5R1", + mnemonic: "word1 word2 word3 ... word24", + options: { + v5r1: { + subwalletNumber: 0, // Optional subwallet number + }, + }, +}); + +// Legacy wallets +const senderV3 = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "V3R2", + mnemonic: "word1 word2 word3 ... word24", +}); + +// Highload wallet for applications requiring high transaction throughput +const highloadSender = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "HIGHLOAD_V3", + mnemonic: "word1 word2 word3 ... word24", + options: { + highloadV3: { + subwalletId: 0, // Subwallet identifier + timeout: 60, // Transaction timeout in seconds + }, + }, +}); +``` + + + **Batch Transaction Limits**: Different wallet versions support different + batch sizes when sending multiple transactions. V5R1 wallets can send up to + 254 transactions per batch, while V4 and other standard wallets support up to + 4 transactions per batch. Highload V3 wallets are optimized for large batch + operations. + + +## EVM Target Messages + +Developers specify EVM operations using a unified structure for cross-chain delivery: + +```javascript +const evmProxyMsg = { + evmTargetAddress: "0xDappProxyAddr", // Contract to call + methodName: "swapExactTokensForTokens(bytes,bytes)", // Method signature + encodedParameters: new ethers.AbiCoder().encode( + ['tuple(uint256,uint256,address[],address,uint256)'], + [[10n, 5n, ['0xToken1Addr', '0xToken2Addr'], '0xDappProxyAddr', 19010987500]], + ), // Example parameters for Uniswap V2 `swapExactTokensForTokens` method +}; +``` + +Use `ethers.js` or similar libraries to encode contract parameters and +make sure the encoded parameters are valid tuples. + +### Method Name Formatting + +The SDK accepts flexible method name formats: + + + + ```javascript + const evmProxyMsg = { + evmTargetAddress: "0x742d35Cc647332...", + methodName: "swapExactTokensForTokens(bytes,bytes)", + encodedParameters: encodedSwapParams + }; + ``` + + + + ```javascript + const evmProxyMsg = { + evmTargetAddress: "0x742d35Cc647332...", + methodName: "transfer", // SDK will format as "transfer(bytes,bytes)" + encodedParameters: encodedTransferParams + }; + ``` + + + + ```javascript + const evmProxyMsg = { + evmTargetAddress: "0x742d35Cc647332...", + // No methodName - calls contract directly with encoded data + encodedParameters: "0x..." + }; + ``` + + + +## Asset Bridging + +Tokens (native, FTs) and NFTs to transfer are specified using user-friendly amounts that the SDK automatically converts to the proper formats for each chain: + +```javascript +import { TON } from '@tonappchain/sdk'; + +const ft = await tacSdk.getFT('EQtonTokenAddress'); +const ton = new TON(tacSdk.config) +const assets = [ + ft.withAmount(10), // TON jetton (fungible token) + ton.withAmount(20) // Native TON +]; +``` + +## Configuration Options + +The SDK accepts several configuration options during initialization: + +```javascript +const tacSdk = await TacSdk.create({ + network: Network.TESTNET, // Network selection + delay: 1000, // Delay between operations (milliseconds) + TONParams: { + // TON-specific configuration + contractOpener: tonClient, // Custom TonClient instance + }, + TACParams: { + // TAC-specific configuration + provider: customProvider, // Custom provider + }, +}); +``` + +Explore more options in the [docs](https://github.com/TacBuild/tac-sdk/). + +## Error Handling + +The SDK provides comprehensive error handling that protects user assets and provides meaningful feedback: + + + + The SDK validates parameters, checks balances, and estimates gas costs + before submitting transactions, preventing common failure scenarios. + + + + Built-in retry mechanisms and fallback endpoints ensure operations continue + even when individual network components experience issues. + + + + Failed transactions automatically trigger rollback mechanisms that return + assets to users safely, preventing fund loss. + + + + +## Documentation + +Comprehensive documentation with helpful examples is available on the SDK's GitHub repositories: + + + + + + + + diff --git a/sdk/python-sdk.mdx b/sdk/python-sdk.mdx new file mode 100644 index 0000000..5bcbbfa --- /dev/null +++ b/sdk/python-sdk.mdx @@ -0,0 +1,30 @@ +--- +title: Python SDK Changelog +description: Download from PyPI +--- + +Below are listed the notable changes to the tac-sdk, including new features, improvements, bug fixes, and breaking changes. + + + +### Added + +- **New Precheck Helper**: Added helper utilities for bridging WETH and cbBTC through `ETH<->TAC<->TON` routes + + + + + + ### Changed + + - **Dependency management**: Moved to `poetry` + + + + + + ### Initialized + + - Ported all already existing functionality from TypeScript SDK + + \ No newline at end of file diff --git a/sdk/ton-connect.mdx b/sdk/ton-connect.mdx new file mode 100644 index 0000000..d797643 --- /dev/null +++ b/sdk/ton-connect.mdx @@ -0,0 +1,92 @@ +--- +title: TON Connect +description: "For browser applications, integrate with TON Connect for wallet apps (Wallet, Tonkeeper) connectivity" +--- + + + Start with TON Connect integration for web applications to provide the best + user experience. Use private key integration only for backend services or + development environments where you control the private keys securely. + + +### Install + +```bash +npm install @tonconnect/ui +``` + +### TON Connect Manifest + +Create a manifest file for your application: + +```json +{ + "url": "https://yourapp.com", + "name": "Your dApp Name", + "iconUrl": "https://yourapp.com/icon.png", + "termsOfUseUrl": "https://yourapp.com/terms", + "privacyPolicyUrl": "https://yourapp.com/privacy" +} +``` + +### Configure + +```javascript +import { TonConnectUI } from "@tonconnect/ui"; + +// Initialize TON Connect +const tonConnectUI = new TonConnectUI({ + manifestUrl: "https://yourapp.com/tonconnect-manifest.json", + buttonRootId: "ton-connect-button", +}); + +// Create sender from TON Connect +import { SenderFactory } from "@tonappchain/sdk"; + +const sender = await SenderFactory.getSender({ + tonConnect: tonConnectUI, +}); +``` + +An example of using TON Connect with the TAC SDK can be found in our [create-tac-app](/quickstart/overview). + +## Security Best Practices + + + Never expose private keys or mnemonics in client-side code. Always use + environment variables or secure configuration management for sensitive data. + + +### Client-Side Security + +```javascript +// Good - Use TonConnect for web applications +const sender = await SenderFactory.getSender({ + tonConnect: tonConnectUI, // User controls private keys +}); + +// Bad - Never do this in client-side code +const sender = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "V4", + mnemonic: "exposed mnemonic in browser", // Security risk! +}); +``` + +### Server-Side Security + +```javascript +// Good - Use environment variables +const sender = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "V4", + mnemonic: process.env.WALLET_MNEMONIC, // Secure +}); + +// Good - Use secure configuration services +const sender = await SenderFactory.getSender({ + network: Network.TESTNET, + version: "V4", + mnemonic: await getSecureConfig("WALLET_MNEMONIC"), // Secure +}); +``` diff --git a/build/sdk/usage/transaction-tracking.mdx b/sdk/transaction-tracking.mdx similarity index 52% rename from build/sdk/usage/transaction-tracking.mdx rename to sdk/transaction-tracking.mdx index 67e7100..4088c90 100644 --- a/build/sdk/usage/transaction-tracking.mdx +++ b/sdk/transaction-tracking.mdx @@ -3,24 +3,24 @@ title: Transaction Tracking description: "Monitor cross-chain transaction progress and handle completion with comprehensive tracking tools" --- -The TAC SDK provides sophisticated tracking capabilities to monitor cross-chain transactions from initiation to completion. Whether you need simple status updates or detailed execution profiling, the tracking system offers multiple approaches to fit your application's needs. +Whether you need simple status updates or detailed execution profiling, the tracking system offers multiple approaches to fit your application's needs. Transaction tracking is essential for providing good user experience in - cross-chain applications. Always implement appropriate error handling and - retry logic to handle network issues gracefully. + cross-chain applications -## Overview of Transaction Tracking +## Main Classes -Cross-chain transactions go through multiple stages across different blockchain networks. The TAC SDK's tracking system provides real-time visibility into this complex process through several interfaces: +Cross-chain transactions go through multiple stages across different blockchain networks. +The TAC SDK's tracking system provides real-time visibility into this complex process through several types: -- **TransactionLinker**: Initial tracking handle returned from transaction submission -- **OperationTracker**: Comprehensive tracking with detailed status information -- **Simplified Tracking**: Helper functions for common tracking scenarios -- **Stage Profiling**: Detailed execution timeline for advanced monitoring +- `TransactionLinker`: Initial tracking handle returned from transaction submission +- `OperationTracker`: Comprehensive tracking with detailed status information +- `SimplifiedStatuses`: Already successful or still processing? +- `ExecutionStages`: Detailed execution timeline (Stage Profiling) -## Basic Tracking with TransactionLinker +## `TransactionLinker` Every cross-chain transaction returns a `TransactionLinker` object that serves as the primary tracking handle: @@ -39,7 +39,7 @@ console.log("Timestamp:", transactionLinker.timestamp); console.log("Caller:", transactionLinker.caller); ``` -### TransactionLinker Properties +`TransactionLinker` properties: ```javascript interface TransactionLinker { @@ -47,12 +47,14 @@ interface TransactionLinker { shardCount: number; // Number of shards involved shardsKey: string; // Unique shard identifier timestamp: number; // Transaction timestamp - operationId?: string; // Operation ID (available after processing) + operationId?: string; // Operation ID (available after TON Adapter transaction detection) sendTransactionResult?: any; // Raw transaction result } ``` -## OperationTracker Class +`operationId` is your primary identifier for the cross-chain transaction, save it for later use. + +## `OperationTracker` The `OperationTracker` provides comprehensive tracking capabilities with multiple monitoring methods: @@ -72,14 +74,14 @@ const statusWithWait = await tracker.getOperationStatus(operationId, { maxAttempts: 30, // Maximum 30 attempts delay: 10000, // 10 seconds between attempts successCheck: (opId) => !opId, - onSuccess: (opId) => console.log("Transaction completed successfully!", opId), + onSuccess: (opId) => console.log("Operation id received successfully!", opId), }); console.log("Final status:", statusWithWait); ``` -### Simplified Status Tracking +## `SimplifiedStatuses` -For applications that need basic status information: +For applications that need basic status information use method `getSimplifiedOperationStatus`: ```javascript const getSimpleStatus = async (transactionLinker) => { @@ -104,22 +106,11 @@ const getSimpleStatus = async (transactionLinker) => { return status; }; - -const getSimpleStatusWithWaiting = async (transactionLinker) => { - const tracker = new OperationTracker(Network.TESTNET); - - // Wait for final status with custom wait options - const finalStatus = await tracker.getSimplifiedOperationStatus( - transactionLinker - ); - - return finalStatus; -}; ``` ### Detailed Status Information -For applications requiring comprehensive status data: +For applications requiring comprehensive status data use method `getOperationStatus`: ```javascript const getDetailedStatus = async (operationId) => { @@ -130,7 +121,6 @@ const getDetailedStatus = async (operationId) => { console.log("Status Information:"); console.log("- Stage:", statusInfo.stage); console.log("- Success:", statusInfo.success); - console.log("- Success:", statusInfo.success); console.log("- Timestamp:", statusInfo.timestamp); console.log("- Transactions:", statusInfo.transactions); @@ -138,15 +128,43 @@ const getDetailedStatus = async (operationId) => { }; ``` -### Advanced Tracking with Custom Success Callbacks +## `ExecutionStages` + +For detailed execution analysis, use method `getStageProfiling` to understand where time is spent: + +```javascript +const getExecutionProfiling = async (operationId) => { + const tracker = new OperationTracker(Network.TESTNET); + + const stages = await tracker.getStageProfiling(operationId); + + console.log("Execution Timeline:"); + console.log("- Collected in TAC:", stages.collectedInTAC.stageData?.timestamp); + console.log( + "- Included in TAC Consensus:", + stages.includedInTACConsensus.stageData?.timestamp + ); + console.log("- Executed in TAC:", stages.executedInTAC.stageData?.timestamp); + console.log("- Collected in TON:", stages.collectedInTON.stageData?.timestamp); + console.log( + "- Included in TON Consensus:", + stages.includedInTONConsensus.stageData?.timestamp + ); + console.log("- Executed in TON:", stages.executedInTON.stageData?.timestamp); + + return stages; +}; +``` + +## Custom Success Callbacks -For complex applications that need automatic profiling and finalization tracking: +For complex applications that need automatic profiling and finalization tracking `successCheck` and `onSuccess` options can be used: ```javascript const getDetailedStatusWithCallback = async (operationId) => { const tracker = new OperationTracker(Network.TESTNET); - // Advanced tracking with onSuccess callback for profiling + // Advanced tracking with callbacks const statusInfo = await tracker.getOperationStatus(operationId, { timeout: 300000, maxAttempts: 30, @@ -198,144 +216,3 @@ const getDetailedStatusWithCallback = async (operationId) => { return statusInfo; }; ``` - -## Automated Tracking Functions - -The SDK provides utility functions for automated tracking with built-in polling and table display: - -### Single Transaction Tracking - -```javascript -import { startTracking } from "@tonappchain/sdk"; - -// Track with console output (default) -await startTracking(transactionLinker, Network.TESTNET); - -// Track and return results -const executionStages = await startTracking( - transactionLinker, - Network.TESTNET, - { - returnValue: true, - tableView: false, - delay: 5000, // Poll every 5 seconds - maxIterationCount: 60, // Maximum 60 iterations (5 minutes) - } -); - -console.log("Final execution stages:", executionStages); -``` - -### Multiple Transaction Tracking - -```javascript -import { startTrackingMultiple } from "@tonappchain/sdk"; - -// Track multiple transactions simultaneously -const transactionLinkers = [linker1, linker2, linker3]; - -await startTrackingMultiple(transactionLinkers, Network.TESTNET, { - tableView: true, - delay: 10000, // Poll every 10 seconds - maxIterationCount: 30, // Maximum 30 iterations -}); -``` - -## Stage Profiling - -For detailed execution analysis, use stage profiling to understand exactly where time is spent: - -```javascript -const getExecutionProfiling = async (operationId) => { - const tracker = new OperationTracker(Network.TESTNET); - - const stages = await tracker.getStageProfiling(operationId); - - console.log("Execution Timeline:"); - console.log("- Collected in TAC:", stages.collectedInTAC.stageData?.success); - console.log( - "- Included in TAC Consensus:", - stages.includedInTACConsensus.stageData?.success - ); - console.log("- Executed in TAC:", stages.executedInTAC.stageData?.success); - console.log("- Collected in TON:", stages.collectedInTON.stageData?.success); - console.log( - "- Included in TON Consensus:", - stages.includedInTONConsensus.stageData?.success - ); - console.log("- Executed in TON:", stages.executedInTON.stageData?.success); - - return stages; -}; -``` - -## Batch Tracking - -Track multiple transactions efficiently: - -```javascript -const trackMultipleTransactions = async (operationIds) => { - const tracker = new OperationTracker(Network.TESTNET); - - // Get statuses in batch (more efficient than individual calls) - const statuses = await tracker.getOperationStatuses(operationIds); - - const results = {}; - for (const [operationId, statusInfo] of Object.entries(statuses)) { - results[operationId] = { - status: statusInfo.operationType, - success: statusInfo.success, - error: statusInfo.error, - }; - } - - return results; -}; - -// Usage -const operationIds = ["op1", "op2", "op3"]; -const batchResults = await trackMultipleTransactions(operationIds); - -Object.entries(batchResults).forEach(([id, result]) => { - console.log(`Operation ${id}: ${result.status}`); -}); -``` - -## Error Handling in Tracking - -Handle tracking errors gracefully: - -```javascript -const robustTracking = async (transactionLinker, maxRetries = 3) => { - const tracker = new OperationTracker(Network.TESTNET); - let retries = 0; - - while (retries < maxRetries) { - try { - const status = await tracker.getSimplifiedOperationStatus( - transactionLinker - ); - - if (status === "OPERATION_ID_NOT_FOUND" && retries < maxRetries - 1) { - console.log(`Operation not found, retry ${retries + 1}/${maxRetries}`); - await new Promise((resolve) => setTimeout(resolve, 15000)); - retries++; - continue; - } - - return status; - } catch (error) { - console.error(`Tracking attempt ${retries + 1} failed:`, error); - retries++; - - if (retries >= maxRetries) { - throw new Error( - `Tracking failed after ${maxRetries} attempts: ${error.message}` - ); - } - - await new Promise((resolve) => setTimeout(resolve, 10000)); - } - } -}; -``` diff --git a/sdk/ts-sdk.mdx b/sdk/ts-sdk.mdx new file mode 100644 index 0000000..de4a161 --- /dev/null +++ b/sdk/ts-sdk.mdx @@ -0,0 +1,348 @@ +--- +title: TypeScript SDK Changelog +description: Download from NPM +--- + +Below are listed the notable changes to the @tonappchain/sdk, including new features, improvements, bug fixes, and breaking changes. + + + + ### Added + - TEP-526 support for scaled UI in FT tokens with display multiplier functionality (display multiplier caching with 5-minute TTL for FT assets) + - Fee parameter constants and factory functions for transaction fee calculation steps. + - Automatic TON blockchain fee parameters retrieval from network config with fallback to standard values. + - Enhanced transaction tracking with failure case handling and track params. + - TacSdk support for preparing cross-chain payloads. + - New `TacExplorerClient` class for interacting with TAC Explorer API. + - `getTransactions()` method added to `ContractOpener` interface for standardized transaction fetching. + + ### Changed + - `Configuration` class now retrieves and stores TON fee parameters during initialization. + - Refactored transaction finalization logic for improved speed and reliability. + - Refactoring of ContractOpener architecture: + - All openers converted to class-based implementations extending `BaseContractOpener`: + - `TonClientOpener`: TonClient implementation. + - `TonClient4Opener`: TonClient4 implementation. + - `LiteClientOpener`: LiteClient implementation with connection management. + - `SandboxOpener`: Sandbox testing implementation. + - Eliminated code duplication by moving common logic to base class: + - `getTransactionByHash()`: Transaction lookup with retry logic. + - `getAdjacentTransactions()`: Child and parent transaction discovery. + - `trackTransactionTree()`: Full transaction tree validation. + - Each opener now implements only provider-specific methods (`open`, `getContractState`, `getTransactions`, `getAddressInformation`, `getConfig`). + - Removed `helpers.ts` file - functionality integrated into `BaseContractOpener`. + - Shared utility functions in `OpenerUtils.ts`: + - `getHttpEndpointWithRetry()`: Unified HTTP endpoint retrieval with retry logic. + - `getHttpV4EndpointWithRetry()`: Unified HTTP V4 endpoint retrieval with retry logic. + - Transaction tree validation errors now always include transaction hash, `exitCode`, and `resultCode` for better debugging. + + + + + + ### Changed + + - Fixed bug with evm address of `TON` in `normalizeAssets`. + + + + + + ### Added + + - **New Assets Module**: Added classes and utilities for working with FT, NFT, and TON assets, including AssetFactory and AssetCache + - **Logger Components**: ConsoleLogger and NoopLogger for flexible logging configuration - SDK components are silent by default unless logger is provided + - **Simulator Component**: Internal simulation component for TAC-side transaction simulation, gas estimation, and fee calculation + - **Transaction Managers**: TONTransactionManager and TACTransactionManager for handling cross-chain transaction execution + - **TonTxFinalizer**: Utility for verifying transaction tree success on TON blockchain using TON Center API + - **RetryableContractOpener**: Enhanced contract opener for improved SDK stability and reliability + - **Balance Verification**: Automatic balance checking before sending cross-chain transactions + - **Batch Transaction Support**: RawSender can now send transactions in batches (254 for V5R1 wallets, 4 for other wallet versions) + - **Wait Options**: Optional `waitOptions` parameter for OperationTracker methods and `sendCrossChainTransaction(s)` to automatically wait for operation completion + - **AgnosticProxy SDK**: Experimental SDK for building complex DeFi operations with dynamic value replacement (testing only) + + ### Changed + + - **Performance Optimizations**: Significantly improved SDK initialization speed by parallelizing blockchain queries and initialization steps + - **Sender Architecture**: Refactored BatchSender, RawSender, and TonConnectSender with improved contractOpener and retryableContractOpener + - **Core Infrastructure**: Updated error handling, structs, utilities, and OperationTracker components + - **Method Signatures**: OperationTracker methods and `sendCrossChainTransaction(s)` now accept optional `waitOptions` for automatic completion waiting + + + + + + ### Changed + + - Switched to spb(chain) set of addresses + + + + + + ### Added + + - Advanced options to `sendCrossChainTransaction` + - Method to send multiple crosschain transactions at once: `sendCrossChainTransactions` + - Batch sending support for crosschain transactions + - Error handling while sending crosschain transactions + + ### Changed + + - TonClient with TAC endpoint as default contract opener + + + + + + ### Added + + - `metaInfo` field to the `ExecutionStages` + - LiteSequencerClient to handle lite sequencer requests and its parameters + - Method to calculate tvmExecutorFee: `getTVMExecutorFeeInfo` + + ### Changed + + - `getEVMTokenAddress` now automatically normalizes addresses to `EQ` form + - For TAC->TON transactions tvmExecutorFee calculated via lite sequencer + + + + + + ### Added + + - Fee support for crosschain transactions + - New methods for requesting execution fees and simulation `getTransactionSimulationInfo` + - Methods to work with NFT items: bridging and getting addresses + + ### Changed + + - Switched to v3 sequencer + + + + + + ### Changed + + - Changed tvm jetton minter stateInit in `getJettonOpType` + + + + + + ### Changed + + - Changed tvm jetton minter stateInit + + + + + + ### Changed + + - Fixed bug with crossChainTonAmount in generating jetton payload + + + + + + ### Changed + + - Due to an API change, updated the `operationId` retrieval. An empty string will be returned for 404 errors + + + + + + ### Changed + + - Fixed bug with V5 wallet + + + + + + ### Changed + + - `StageName` value namings + - `startTracking` has been improved. Added optional parameters + + ### Removed + + - `ExecutionStagesTableData` type + - `TrackingOperationResult` type + + + + + + ### Added + + - `OperationType` type + - `ExecutionStagesTableData` type + - `TrackingOperationResult` type + - `StageName` enum + - `getOperationType` in `OperationTracker` retrieves the `OperationType` for `operationId` + + ### Changed + + - The stage names have been changed + - Changed namings in enums + - `OperationType` added in the `ExecutionStages` + - `ExecutionStages` structure + - Added return value in method `sendShardTransaction` in `TonConnectSender` + - Added `forceSend` option in method `sendCrossChainTransaction` in `TacSdk` + - `startTracking` has been improved. Added optional parameters and return values + + ### Removed + + - Deleted `isBridgeOperation` (now it can be determined with `getOperationType`) + + + + + + ### Changed + + - **Changed package tac-sdk -> @tonappchain/sdk** + - `calculateEVMTokenAddress` function now requires tokenUtils address as deployer and crossChainLayer address as constructor params + - Rename shardedId -> shardsKey + - A `gasLimit` field has been added to `EvmProxyMsg` (defaulting to undefined, which will be set through simulation in this case) + - Renamed json properties in `buildEvmDataCell` + - Renamed urls in `OperationTracker` + + ### Added + + - `options` parameter in `getSender` method to modify W5 and Highload V3 wallets + - `customLiteSequencerEndpoints` parameter in `SDKParams` to specify custom lite sequencer endpoints + - `simulateEVMMessage` method in `TacSdk` to simulate EVM message execution on TAC side + - `getOperationStatuses` method in `OperationTracker` retrieves the statuses of multiple operations based on their respective `operationId's` + - `getOperationIdsByShardsKeys` method in `OperationTracker` retrieves the `operationId's` based on their respective `shardsKey's` + - `getStageProfilings` method in `OperationTracker` retrieves the `ExecutionStages's` based on their respective `operationId's` + - `getStageProfiling` method in `OperationTracker` retrieves the `ExecutionStages` for `operationId` + - Added a pre-check before sending to the blockchain to ensure the transaction will execute successfully on the TAC side using the `simulateEVMMessage` method + - Support for highload V3 wallet as a sender + + + + + + ### Added + + - Contract opener `orbsOpener4` that uses new version TON endpoints + + ### Changed + + - `orbsOpener4` set as default in SDK + + + + + + ### Changed + + - `@tonappchain/artifacts` upgraded to `0.0.14` + + + + + + ### Added + + - `getUserJettonBalanceExtended` method in `TacSdk` to get user jetton balance extended with decimals info + + ### Changed + + - `AssetBridgingData` now supports multiple formats of asset value: with decimals and without decimals. In case decimals are not provided, the SDK will try to extract it from chain + + + + + + ### Added + + - Section in readme about TACHeader + - AddLiquidity uniswap_v2 test + - `orbsOpener` method to construct custom contractOpener for TacSDK. It uses Orbs Network and does not have rate limits + + ### Changed + + - SDK uses orbsOpener by default + - `address` field in `AssetBridgingData` can be either EVM or TVM address + - Method `SenderFactory.getSender` requires additional parameter `network` when creating wallet wrapper using mnemonic + - Fixed `getContractState` in `liteClientOpener` + - Fixed all tests for TACHeader logic + - Version `@tonappchain/artifacts` upgraded to `0.0.12-addresses` + - Request to `/status` endpoint of Sequencer API changed from `GET` to `POST` with body + - Signature of `getOperationStatus` is changed + + ### Removed + + - Deleted test bridgeData + + + + + + ### Changed + + - Calculate token addresses through emulation + - Renamed `TransactionStatus` to `OperationTracker` + - Renamed method `OperationTracker.getStatusTransaction()` to `OperationTracker.getOperationStatus()` + - Renamed method `OperationTracker.getSimpifiedTransactionStatus()` to `OperationTracker.getSimplifiedOperationStatus()` + - Renamed `TacSDKTonClientParams` to `SDKParams` + - Changed struct of `SDKParams` + - Changed `ton-lite-client` library to its fork `@tonappchain/ton-lite-client` + + ### Added + + - Custom `TONParams` and `TACParams` in `SDKParams` + - `network` and `customLiteSequencerEndpoints` params to `OperationTracker` constructor + - Static async function `create` in `TacSdk` for creating an instance of `TacSdk` + - Custom errors + - Methods that may construct custom contractOpener for TacSDK + - Method `closeConnections` in `TacSdk` for closing all network connections + - Optional method `closeConnections` to `ContractOpener` interface + + ### Removed + + - `init` function in `TacSdk` + - Public constructor of `TacSdk` + + + + + + ### Added + + - Method to get TVM address based on EVM address + - Tests for SDK methods using contract emulation + - Support for custom contract opener + - SDK uses @tonappchain/artifacts + - Added get methods for native token addresses + - Added support for native token address calculation in _getEVMTokenAddress_ and _getTVMTokenAddress_ methods + + ### Removed + + - Support for TON wallet v1 + + + + + + ### Added + + - Code formatting + + + + + + ### Added + + - Support for all versions of TON wallet (v1 - v5) + - SenderFactory to create AbstractSender + + diff --git a/spelling.json b/spelling.json deleted file mode 100644 index f081ceb..0000000 --- a/spelling.json +++ /dev/null @@ -1,26628 +0,0 @@ -{ - "build/network-info/index.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 73, - 79 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 11 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 18 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 19 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 34 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainName'?", - "Severity": "error", - "Match": "chainName", - "Line": 35 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rpcUrls'?", - "Severity": "error", - "Match": "rpcUrls", - "Line": 36 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nativeCurrency'?", - "Severity": "error", - "Match": "nativeCurrency", - "Line": 37 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 24, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 48 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 56, - 62 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 48 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 47, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 52 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 65 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainName'?", - "Severity": "error", - "Match": "chainName", - "Line": 66 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rpcUrls'?", - "Severity": "error", - "Match": "rpcUrls", - "Line": 67 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nativeCurrency'?", - "Severity": "error", - "Match": "nativeCurrency", - "Line": 68 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 84 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 88 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 89 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 61, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 97 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 98 - } - ], - "build/quickstart.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 76, - 80 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 3 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 79, - 82 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'autoPlay'?", - "Severity": "error", - "Match": "autoPlay", - "Line": 10 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'playsInline'?", - "Severity": "error", - "Match": "playsInline", - "Line": 13 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 24 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Blockchain'?", - "Severity": "error", - "Match": "Blockchain", - "Line": 38 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 39 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 39 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 33, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Tonkeeper'?", - "Severity": "error", - "Match": "Tonkeeper", - "Line": 40 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 41 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 42 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 59, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 51 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 52 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 58 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacTestnet'?", - "Severity": "error", - "Match": "tacTestnet", - "Line": 52 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 68 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleMessage'?", - "Severity": "error", - "Match": "simpleMessage", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'messageProxy'?", - "Severity": "error", - "Match": "messageProxy", - "Line": 70 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 82 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 83 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dev'?", - "Severity": "error", - "Match": "dev", - "Line": 83 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Tonkeeper'?", - "Severity": "error", - "Match": "Tonkeeper", - "Line": 98 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 51, - 54 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 113 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 117 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 175 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 191 - } - ], - "build/sdk/advanced-usage/simulation-testing.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 269, - 273 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'SDK's'?", - "Severity": "error", - "Match": "SDK's", - "Line": 10 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 15 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simulateTransaction'?", - "Severity": "error", - "Match": "simulateTransaction", - "Line": 15 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 15 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'estimatedGas'?", - "Severity": "error", - "Match": "estimatedGas", - "Line": 26 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 57, - 67 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'protocolFee'?", - "Severity": "error", - "Match": "protocolFee", - "Line": 28 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 54, - 61 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 37 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 54 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simulateEVMExecution'?", - "Severity": "error", - "Match": "simulateEVMExecution", - "Line": 54 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 54 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmOperation'?", - "Severity": "error", - "Match": "evmOperation", - "Line": 54 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 56 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simulationRequest'?", - "Severity": "error", - "Match": "simulationRequest", - "Line": 56 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 58 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 58 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 59 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 55 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 59 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 91 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 97 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 116 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 118 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testMnemonics'?", - "Severity": "error", - "Match": "testMnemonics", - "Line": 118 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 126 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 141 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettons'?", - "Severity": "error", - "Match": "jettons", - "Line": 149 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 164 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testSender'?", - "Severity": "error", - "Match": "testSender", - "Line": 164 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 172 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 187 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testEnv'?", - "Severity": "error", - "Match": "testEnv", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 202 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testEnv'?", - "Severity": "error", - "Match": "testEnv", - "Line": 203 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 208 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 213 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 214 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 216 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 217 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 223 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 225 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'estimatedGas'?", - "Severity": "error", - "Match": "estimatedGas", - "Line": 232 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 59, - 63 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 236 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 237 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'largeAssets'?", - "Severity": "error", - "Match": "largeAssets", - "Line": 237 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 239 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 241 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 242 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'largeAssets'?", - "Severity": "error", - "Match": "largeAssets", - "Line": 252 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 62, - 66 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 257 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 258 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 260 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 261 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 267 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 269 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 269 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 275 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 275 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 276 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 279 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 283 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 283 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'finalStatus'?", - "Severity": "error", - "Match": "finalStatus", - "Line": 284 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 286 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'finalStatus'?", - "Severity": "error", - "Match": "finalStatus", - "Line": 286 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'finalStatus'?", - "Severity": "error", - "Match": "finalStatus", - "Line": 288 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 289 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 41, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 299 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 300 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testAsset'?", - "Severity": "error", - "Match": "testAsset", - "Line": 300 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 302 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 309 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 311 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 312 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 318 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 50, - 54 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 327 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 328 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'invalidAssets'?", - "Severity": "error", - "Match": "invalidAssets", - "Line": 328 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 335 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 338 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'invalidAssets'?", - "Severity": "error", - "Match": "invalidAssets", - "Line": 345 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 56, - 60 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 352 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 353 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 355 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 356 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 359 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 369 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 370 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 372 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 373 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 397 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 398 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 400 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 404 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 404 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 405 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 406 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 406 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 421 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 431 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 432 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 434 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 435 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'stepResult'?", - "Severity": "error", - "Match": "stepResult", - "Line": 435 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 447 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 462 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 463 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmExecutor'?", - "Severity": "error", - "Match": "evmExecutor", - "Line": 475 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmExecutor'?", - "Severity": "error", - "Match": "tvmExecutor", - "Line": 476 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 481 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 482 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 492 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 492 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 497 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 499 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 502 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 503 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'actualBalance'?", - "Severity": "error", - "Match": "actualBalance", - "Line": 503 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'actualBalance'?", - "Severity": "error", - "Match": "actualBalance", - "Line": 511 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'actualBalance'?", - "Severity": "error", - "Match": "actualBalance", - "Line": 512 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'allPassed'?", - "Severity": "error", - "Match": "allPassed", - "Line": 520 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 524 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 533 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalTests'?", - "Severity": "error", - "Match": "totalTests", - "Line": 533 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 534 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'passedTests'?", - "Severity": "error", - "Match": "passedTests", - "Line": 534 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 535 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTests'?", - "Severity": "error", - "Match": "failedTests", - "Line": 535 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'passedTests'?", - "Severity": "error", - "Match": "passedTests", - "Line": 535 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 536 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalDuration'?", - "Severity": "error", - "Match": "totalDuration", - "Line": 536 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalTests'?", - "Severity": "error", - "Match": "totalTests", - "Line": 540 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'passedTests'?", - "Severity": "error", - "Match": "passedTests", - "Line": 541 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTests'?", - "Severity": "error", - "Match": "failedTests", - "Line": 542 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successRate'?", - "Severity": "error", - "Match": "successRate", - "Line": 543 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'passedTests'?", - "Severity": "error", - "Match": "passedTests", - "Line": 543 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalTests'?", - "Severity": "error", - "Match": "totalTests", - "Line": 543 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalDuration'?", - "Severity": "error", - "Match": "totalDuration", - "Line": 544 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 552 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 554 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTests'?", - "Severity": "error", - "Match": "failedTests", - "Line": 554 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTests'?", - "Severity": "error", - "Match": "failedTests", - "Line": 555 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 563 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'slowTests'?", - "Severity": "error", - "Match": "slowTests", - "Line": 563 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'slowTests'?", - "Severity": "error", - "Match": "slowTests", - "Line": 564 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 589 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testConfig'?", - "Severity": "error", - "Match": "testConfig", - "Line": 589 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 590 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'concurrentUsers'?", - "Severity": "error", - "Match": "concurrentUsers", - "Line": 590 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 63, - 74 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testDuration'?", - "Severity": "error", - "Match": "testDuration", - "Line": 590 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'concurrentUsers'?", - "Severity": "error", - "Match": "concurrentUsers", - "Line": 594 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 77, - 78 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tx'?", - "Severity": "error", - "Match": "tx", - "Line": 594 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 597 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 597 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 598 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 602 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userPromise'?", - "Severity": "error", - "Match": "userPromise", - "Line": 602 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 607 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userResults'?", - "Severity": "error", - "Match": "userResults", - "Line": 607 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 608 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'endTime'?", - "Severity": "error", - "Match": "endTime", - "Line": 608 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userResults'?", - "Severity": "error", - "Match": "userResults", - "Line": 610 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 53, - 61 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 610 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 64, - 70 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'endTime'?", - "Severity": "error", - "Match": "endTime", - "Line": 610 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 613 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userId'?", - "Severity": "error", - "Match": "userId", - "Line": 613 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionCount'?", - "Severity": "error", - "Match": "transactionCount", - "Line": 613 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 615 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userId'?", - "Severity": "error", - "Match": "userId", - "Line": 615 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 618 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userResults'?", - "Severity": "error", - "Match": "userResults", - "Line": 618 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 619 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userId'?", - "Severity": "error", - "Match": "userId", - "Line": 619 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 621 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 621 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionCount'?", - "Severity": "error", - "Match": "transactionCount", - "Line": 621 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 61 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 621 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 623 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 623 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 625 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 66, - 72 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 625 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 626 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 632 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'endTime'?", - "Severity": "error", - "Match": "endTime", - "Line": 632 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userResults'?", - "Severity": "error", - "Match": "userResults", - "Line": 634 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionIndex'?", - "Severity": "error", - "Match": "transactionIndex", - "Line": 636 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 636 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 638 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionIndex'?", - "Severity": "error", - "Match": "transactionIndex", - "Line": 644 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 644 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 647 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 658 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txIndex'?", - "Severity": "error", - "Match": "txIndex", - "Line": 667 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 681 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 50, - 56 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'endTime'?", - "Severity": "error", - "Match": "endTime", - "Line": 681 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 682 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'allTransactions'?", - "Severity": "error", - "Match": "allTransactions", - "Line": 682 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 686 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successfulTx'?", - "Severity": "error", - "Match": "successfulTx", - "Line": 686 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 687 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTx'?", - "Severity": "error", - "Match": "failedTx", - "Line": 687 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 689 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successfulTx'?", - "Severity": "error", - "Match": "successfulTx", - "Line": 689 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 690 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalDuration'?", - "Severity": "error", - "Match": "totalDuration", - "Line": 690 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'endTime'?", - "Severity": "error", - "Match": "endTime", - "Line": 690 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTime'?", - "Severity": "error", - "Match": "startTime", - "Line": 690 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalUsers'?", - "Severity": "error", - "Match": "totalUsers", - "Line": 694 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalTransactions'?", - "Severity": "error", - "Match": "totalTransactions", - "Line": 695 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successfulTransactions'?", - "Severity": "error", - "Match": "successfulTransactions", - "Line": 696 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTransactions'?", - "Severity": "error", - "Match": "failedTransactions", - "Line": 697 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'failedTx'?", - "Severity": "error", - "Match": "failedTx", - "Line": 697 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successRate'?", - "Severity": "error", - "Match": "successRate", - "Line": 698 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalDuration'?", - "Severity": "error", - "Match": "totalDuration", - "Line": 699 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 56 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalDuration'?", - "Severity": "error", - "Match": "totalDuration", - "Line": 700 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'performanceMetrics'?", - "Severity": "error", - "Match": "performanceMetrics", - "Line": 702 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'errorAnalysis'?", - "Severity": "error", - "Match": "errorAnalysis", - "Line": 710 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalDuration'?", - "Severity": "error", - "Match": "totalDuration", - "Line": 714 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 720 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 721 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 726 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'errorCounts'?", - "Severity": "error", - "Match": "errorCounts", - "Line": 726 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 729 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'errorType'?", - "Severity": "error", - "Match": "errorType", - "Line": 729 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'errorCounts'?", - "Severity": "error", - "Match": "errorCounts", - "Line": 730 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalErrors'?", - "Severity": "error", - "Match": "totalErrors", - "Line": 734 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'errorTypes'?", - "Severity": "error", - "Match": "errorTypes", - "Line": 735 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 752 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 764 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'avgDuration'?", - "Severity": "error", - "Match": "avgDuration", - "Line": 764 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'avgDuration'?", - "Severity": "error", - "Match": "avgDuration", - "Line": 766 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 792 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 793 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettonConfig'?", - "Severity": "error", - "Match": "jettonConfig", - "Line": 793 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalSupply'?", - "Severity": "error", - "Match": "totalSupply", - "Line": 797 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 802 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 804 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'createdAt'?", - "Severity": "error", - "Match": "createdAt", - "Line": 807 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 815 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nftConfig'?", - "Severity": "error", - "Match": "nftConfig", - "Line": 815 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'itemCount'?", - "Severity": "error", - "Match": "itemCount", - "Line": 819 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 823 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 825 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'createdAt'?", - "Severity": "error", - "Match": "createdAt", - "Line": 828 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'assetAddress'?", - "Severity": "error", - "Match": "assetAddress", - "Line": 835 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 836 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 838 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'assetAddress'?", - "Severity": "error", - "Match": "assetAddress", - "Line": 842 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 878 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mock_op_'?", - "Severity": "error", - "Match": "mock_op_", - "Line": 896 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardCount'?", - "Severity": "error", - "Match": "shardCount", - "Line": 898 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardsKey'?", - "Severity": "error", - "Match": "shardsKey", - "Line": 899 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mock_shard_key'?", - "Severity": "error", - "Match": "mock_shard_key", - "Line": 899 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasEstimate'?", - "Severity": "error", - "Match": "gasEstimate", - "Line": 911 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 948 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'generatedAt'?", - "Severity": "error", - "Match": "generatedAt", - "Line": 953 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 960 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 961 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 962 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalTests'?", - "Severity": "error", - "Match": "totalTests", - "Line": 965 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successRate'?", - "Severity": "error", - "Match": "successRate", - "Line": 968 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'averageDuration'?", - "Severity": "error", - "Match": "averageDuration", - "Line": 969 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 974 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'slowestTest'?", - "Severity": "error", - "Match": "slowestTest", - "Line": 981 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'fastestTest'?", - "Severity": "error", - "Match": "fastestTest", - "Line": 982 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 987 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testedMethods'?", - "Severity": "error", - "Match": "testedMethods", - "Line": 987 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 988 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testedMethods'?", - "Severity": "error", - "Match": "testedMethods", - "Line": 991 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodCoverage'?", - "Severity": "error", - "Match": "methodCoverage", - "Line": 999 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 1005 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 1006 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 1017 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 1031 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 1038 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'json'?", - "Severity": "error", - "Match": "json", - "Line": 1051 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'json'?", - "Severity": "error", - "Match": "json", - "Line": 1055 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'csv'?", - "Severity": "error", - "Match": "csv", - "Line": 1057 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 1094 - } - ], - "build/sdk/advanced-usage/token-address-mapping.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 85, - 94 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 10 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 109, - 113 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TAC's'?", - "Severity": "error", - "Match": "TAC's", - "Line": 10 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 33, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 33 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 34 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 34 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 54 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 55 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 55 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonAddress'?", - "Severity": "error", - "Match": "tonAddress", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonAddress'?", - "Severity": "error", - "Match": "tonAddress", - "Line": 62 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonAddress'?", - "Severity": "error", - "Match": "tonAddress", - "Line": 63 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 67 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 67 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 67 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 41, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 70 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 71 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 73 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 80 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 80 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 82 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 43, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 83 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 87 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 87 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 63, - 72 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 87 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 100 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 101 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 102 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 102 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalCached'?", - "Severity": "error", - "Match": "totalCached", - "Line": 127 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 145 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'cacheKey'?", - "Severity": "error", - "Match": "cacheKey", - "Line": 145 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'cacheKey'?", - "Severity": "error", - "Match": "cacheKey", - "Line": 147 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'cacheKey'?", - "Severity": "error", - "Match": "cacheKey", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 152 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 157 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonCollection'?", - "Severity": "error", - "Match": "tonCollection", - "Line": 158 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmCollection'?", - "Severity": "error", - "Match": "evmCollection", - "Line": 159 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'cacheKey'?", - "Severity": "error", - "Match": "cacheKey", - "Line": 163 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 171 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 172 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'cacheKey'?", - "Severity": "error", - "Match": "cacheKey", - "Line": 172 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'cacheKey'?", - "Severity": "error", - "Match": "cacheKey", - "Line": 174 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 179 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 184 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonItem'?", - "Severity": "error", - "Match": "tonItem", - "Line": 185 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmNft'?", - "Severity": "error", - "Match": "evmNft", - "Line": 186 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenId'?", - "Severity": "error", - "Match": "tokenId", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenId'?", - "Severity": "error", - "Match": "tokenId", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 208 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenId'?", - "Severity": "error", - "Match": "tokenId", - "Line": 210 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 213 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonNft'?", - "Severity": "error", - "Match": "tonNft", - "Line": 215 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenId'?", - "Severity": "error", - "Match": "tokenId", - "Line": 216 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 228 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 24, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nftAddress'?", - "Severity": "error", - "Match": "nftAddress", - "Line": 228 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'addressType'?", - "Severity": "error", - "Match": "addressType", - "Line": 228 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'addressType'?", - "Severity": "error", - "Match": "addressType", - "Line": 230 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 231 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 59, - 68 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nftAddress'?", - "Severity": "error", - "Match": "nftAddress", - "Line": 231 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 272 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 275 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 276 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonNative'?", - "Severity": "error", - "Match": "tonNative", - "Line": 286 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacNative'?", - "Severity": "error", - "Match": "tacNative", - "Line": 287 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 301 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 302 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 306 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 331 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 332 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'convertedAssets'?", - "Severity": "error", - "Match": "convertedAssets", - "Line": 332 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 334 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'convertedAssets'?", - "Severity": "error", - "Match": "convertedAssets", - "Line": 338 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAddress'?", - "Severity": "error", - "Match": "originalAddress", - "Line": 340 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAddress'?", - "Severity": "error", - "Match": "bridgedAddress", - "Line": 341 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgeType'?", - "Severity": "error", - "Match": "bridgeType", - "Line": 342 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAddress'?", - "Severity": "error", - "Match": "originalAddress", - "Line": 348 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAddress'?", - "Severity": "error", - "Match": "bridgedAddress", - "Line": 349 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgeType'?", - "Severity": "error", - "Match": "bridgeType", - "Line": 350 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 375 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 375 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 376 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAddress'?", - "Severity": "error", - "Match": "originalAddress", - "Line": 384 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 385 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAddress'?", - "Severity": "error", - "Match": "bridgedAddress", - "Line": 386 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'targetChain'?", - "Severity": "error", - "Match": "targetChain", - "Line": 387 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 387 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'assetType'?", - "Severity": "error", - "Match": "assetType", - "Line": 389 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 395 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAddress'?", - "Severity": "error", - "Match": "bridgedAddress", - "Line": 396 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAddress'?", - "Severity": "error", - "Match": "bridgedAddress", - "Line": 399 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 72, - 82 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 404 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 407 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 424 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalSupply'?", - "Severity": "error", - "Match": "totalSupply", - "Line": 431 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 441 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalSupply'?", - "Severity": "error", - "Match": "totalSupply", - "Line": 448 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 458 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Toncoin'?", - "Severity": "error", - "Match": "Toncoin", - "Line": 461 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 43, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 464 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 43, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 472 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 478 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 478 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 479 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 510 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 511 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 512 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'includeMetadata'?", - "Severity": "error", - "Match": "includeMetadata", - "Line": 513 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'skipInvalid'?", - "Severity": "error", - "Match": "skipInvalid", - "Line": 514 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onProgress'?", - "Severity": "error", - "Match": "onProgress", - "Line": 515 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 518 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 519 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 523 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 525 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 526 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chunkPromises'?", - "Severity": "error", - "Match": "chunkPromises", - "Line": 526 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 526 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 528 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'includeMetadata'?", - "Severity": "error", - "Match": "includeMetadata", - "Line": 528 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 64, - 74 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 529 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 56, - 66 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 530 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onProgress'?", - "Severity": "error", - "Match": "onProgress", - "Line": 542 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'successRate'?", - "Severity": "error", - "Match": "successRate", - "Line": 557 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 562 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 49 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 562 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 563 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAddress'?", - "Severity": "error", - "Match": "originalAddress", - "Line": 565 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sourceChain'?", - "Severity": "error", - "Match": "sourceChain", - "Line": 567 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'targetChain'?", - "Severity": "error", - "Match": "targetChain", - "Line": 568 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAddress'?", - "Severity": "error", - "Match": "originalAddress", - "Line": 572 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'targetChain'?", - "Severity": "error", - "Match": "targetChain", - "Line": 575 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chunkSize'?", - "Severity": "error", - "Match": "chunkSize", - "Line": 580 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 581 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chunkSize'?", - "Severity": "error", - "Match": "chunkSize", - "Line": 582 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chunkSize'?", - "Severity": "error", - "Match": "chunkSize", - "Line": 583 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 588 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 588 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 589 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 593 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 597 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 67, - 73 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'backoff'?", - "Severity": "error", - "Match": "backoff", - "Line": 597 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 616 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typeof'?", - "Severity": "error", - "Match": "typeof", - "Line": 619 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 647 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typeof'?", - "Severity": "error", - "Match": "typeof", - "Line": 650 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 677 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 678 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonValidation'?", - "Severity": "error", - "Match": "tonValidation", - "Line": 679 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmValidation'?", - "Severity": "error", - "Match": "evmValidation", - "Line": 680 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mappingValid'?", - "Severity": "error", - "Match": "mappingValid", - "Line": 681 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 693 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'resolvedEvm'?", - "Severity": "error", - "Match": "resolvedEvm", - "Line": 693 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 694 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'resolvedTon'?", - "Severity": "error", - "Match": "resolvedTon", - "Line": 694 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'resolvedTon'?", - "Severity": "error", - "Match": "resolvedTon", - "Line": 697 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 709 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 712 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 736 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 737 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validationResults'?", - "Severity": "error", - "Match": "validationResults", - "Line": 737 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 739 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 740 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 748 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'addressValidation'?", - "Severity": "error", - "Match": "addressValidation", - "Line": 748 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 754 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'existsCheck'?", - "Severity": "error", - "Match": "existsCheck", - "Line": 754 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typeof'?", - "Severity": "error", - "Match": "typeof", - "Line": 764 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validationResults'?", - "Severity": "error", - "Match": "validationResults", - "Line": 776 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'allValid'?", - "Severity": "error", - "Match": "allValid", - "Line": 781 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'invalidCount'?", - "Severity": "error", - "Match": "invalidCount", - "Line": 782 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxSize'?", - "Severity": "error", - "Match": "maxSize", - "Line": 796 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxSize'?", - "Severity": "error", - "Match": "maxSize", - "Line": 796 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ttl'?", - "Severity": "error", - "Match": "ttl", - "Line": 797 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'hitCount'?", - "Severity": "error", - "Match": "hitCount", - "Line": 798 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'missCount'?", - "Severity": "error", - "Match": "missCount", - "Line": 799 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 803 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lastAccessed'?", - "Severity": "error", - "Match": "lastAccessed", - "Line": 818 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 828 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'createdAt'?", - "Severity": "error", - "Match": "createdAt", - "Line": 832 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lruKey'?", - "Severity": "error", - "Match": "lruKey", - "Line": 839 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lruTime'?", - "Severity": "error", - "Match": "lruTime", - "Line": 840 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 842 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lruTime'?", - "Severity": "error", - "Match": "lruTime", - "Line": 843 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lruTime'?", - "Severity": "error", - "Match": "lruTime", - "Line": 844 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lruKey'?", - "Severity": "error", - "Match": "lruKey", - "Line": 845 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lruKey'?", - "Severity": "error", - "Match": "lruKey", - "Line": 849 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 861 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalRequests'?", - "Severity": "error", - "Match": "totalRequests", - "Line": 861 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'hitRate'?", - "Severity": "error", - "Match": "hitRate", - "Line": 867 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalRequests'?", - "Severity": "error", - "Match": "totalRequests", - "Line": 867 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 53, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalRequests'?", - "Severity": "error", - "Match": "totalRequests", - "Line": 867 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalRequests'?", - "Severity": "error", - "Match": "totalRequests", - "Line": 868 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Preload'?", - "Severity": "error", - "Match": "Preload", - "Line": 872 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 873 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 37 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'addressPairs'?", - "Severity": "error", - "Match": "addressPairs", - "Line": 873 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 874 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 882 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 902 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requestPromise'?", - "Severity": "error", - "Match": "requestPromise", - "Line": 917 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requestPromise'?", - "Severity": "error", - "Match": "requestPromise", - "Line": 929 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requestPromise'?", - "Severity": "error", - "Match": "requestPromise", - "Line": 930 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requestPromise'?", - "Severity": "error", - "Match": "requestPromise", - "Line": 948 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requestPromise'?", - "Severity": "error", - "Match": "requestPromise", - "Line": 960 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requestPromise'?", - "Severity": "error", - "Match": "requestPromise", - "Line": 961 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'warmupPromises'?", - "Severity": "error", - "Match": "warmupPromises", - "Line": 967 - } - ], - "build/sdk/installation.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 14 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 2, - 4 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 15 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pnpm'?", - "Severity": "error", - "Match": "pnpm", - "Line": 22 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 4 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pnpm'?", - "Severity": "error", - "Match": "pnpm", - "Line": 23 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sdk'?", - "Severity": "error", - "Match": "sdk", - "Line": 39 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 46 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 46 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 85, - 91 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 46 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 50 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 50 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 55 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 55 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 46, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 61 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 62 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 79 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 80 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 82 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 82 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'createContext'?", - "Severity": "error", - "Match": "createContext", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useContext'?", - "Severity": "error", - "Match": "useContext", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useEffect'?", - "Severity": "error", - "Match": "useEffect", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 62 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useState'?", - "Severity": "error", - "Match": "useState", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 96 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 98 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 99 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 99 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useState'?", - "Severity": "error", - "Match": "useState", - "Line": 99 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 100 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setLoading'?", - "Severity": "error", - "Match": "setLoading", - "Line": 100 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useEffect'?", - "Severity": "error", - "Match": "useEffect", - "Line": 102 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 103 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'initializeSdk'?", - "Severity": "error", - "Match": "initializeSdk", - "Line": 103 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 103 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 105 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setLoading'?", - "Severity": "error", - "Match": "setLoading", - "Line": 113 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'initializeSdk'?", - "Severity": "error", - "Match": "initializeSdk", - "Line": 117 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 120 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 121 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 127 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 133 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 134 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 149 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 149 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 153 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'handleTransaction'?", - "Severity": "error", - "Match": "handleTransaction", - "Line": 153 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 153 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 154 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 155 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 155 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 173 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 174 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 174 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 175 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typeof'?", - "Severity": "error", - "Match": "typeof", - "Line": 179 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 182 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 197 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Vue'?", - "Severity": "error", - "Match": "Vue", - "Line": 201 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'composable'?", - "Severity": "error", - "Match": "composable", - "Line": 203 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onMounted'?", - "Severity": "error", - "Match": "onMounted", - "Line": 207 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onUnmounted'?", - "Severity": "error", - "Match": "onUnmounted", - "Line": 207 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 46, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'vue'?", - "Severity": "error", - "Match": "vue", - "Line": 207 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 211 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 211 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 212 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 214 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 216 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 227 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 243 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 252 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'manifestUrl'?", - "Severity": "error", - "Match": "manifestUrl", - "Line": 253 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 260 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 261 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 271 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 272 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'iconUrl'?", - "Severity": "error", - "Match": "iconUrl", - "Line": 273 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'compilerOptions'?", - "Severity": "error", - "Match": "compilerOptions", - "Line": 285 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ESNext'?", - "Severity": "error", - "Match": "ESNext", - "Line": 287 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'moduleResolution'?", - "Severity": "error", - "Match": "moduleResolution", - "Line": 288 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 303 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TONParams'?", - "Severity": "error", - "Match": "TONParams", - "Line": 306 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'contractOpener'?", - "Severity": "error", - "Match": "contractOpener", - "Line": 308 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonClient'?", - "Severity": "error", - "Match": "tonClient", - "Line": 308 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'settingsAddress'?", - "Severity": "error", - "Match": "settingsAddress", - "Line": 309 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TACParams'?", - "Severity": "error", - "Match": "TACParams", - "Line": 311 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'customProvider'?", - "Severity": "error", - "Match": "customProvider", - "Line": 313 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'settingsAddress'?", - "Severity": "error", - "Match": "settingsAddress", - "Line": 314 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 351 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 73, - 79 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bundler'?", - "Severity": "error", - "Match": "bundler", - "Line": 372 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'crypto'?", - "Severity": "error", - "Match": "crypto", - "Line": 381 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 37 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'crypto'?", - "Severity": "error", - "Match": "crypto", - "Line": 381 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'globalThis'?", - "Severity": "error", - "Match": "globalThis", - "Line": 395 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 8 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 416 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonParams'?", - "Severity": "error", - "Match": "tonParams", - "Line": 418 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 437 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'compilerOptions'?", - "Severity": "error", - "Match": "compilerOptions", - "Line": 444 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'moduleResolution'?", - "Severity": "error", - "Match": "moduleResolution", - "Line": 445 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 78, - 82 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 461 - } - ], - "build/sdk/introduction.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 83, - 87 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 3 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 108, - 112 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 67, - 71 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'EVM's'?", - "Severity": "error", - "Match": "EVM's", - "Line": 9 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 26 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 26 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 27 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 57 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 27 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 36 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 38 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 40 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 43 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Jettons'?", - "Severity": "error", - "Match": "Jettons", - "Line": 52 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'NFTs'?", - "Severity": "error", - "Match": "NFTs", - "Line": 52 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 56 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 75 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 76 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 76 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 77 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 68, - 72 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TAC's'?", - "Severity": "error", - "Match": "TAC's", - "Line": 82 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TAC's'?", - "Severity": "error", - "Match": "TAC's", - "Line": 97 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 122 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 136 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 137 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 138 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bigint'?", - "Severity": "error", - "Match": "bigint", - "Line": 138 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 141 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 143 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 154 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 162 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 75, - 81 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Jettons'?", - "Severity": "error", - "Match": "Jettons", - "Line": 192 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 84, - 87 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'NFTs'?", - "Severity": "error", - "Match": "NFTs", - "Line": 192 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 200 - } - ], - "build/sdk/usage/asset-bridging.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TAC's'?", - "Severity": "error", - "Match": "TAC's", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 50, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 10 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 57 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 81 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 81 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmSigner'?", - "Severity": "error", - "Match": "evmSigner", - "Line": 85 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 85 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettonAssets'?", - "Severity": "error", - "Match": "jettonAssets", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 114 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rawAmount'?", - "Severity": "error", - "Match": "rawAmount", - "Line": 118 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 127 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'collectionAddress'?", - "Severity": "error", - "Match": "collectionAddress", - "Line": 130 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'itemIndex'?", - "Severity": "error", - "Match": "itemIndex", - "Line": 131 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 136 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 152 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'autoAssets'?", - "Severity": "error", - "Match": "autoAssets", - "Line": 152 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 161 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'preciseAssets'?", - "Severity": "error", - "Match": "preciseAssets", - "Line": 161 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 171 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rawAssets'?", - "Severity": "error", - "Match": "rawAssets", - "Line": 171 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rawAmount'?", - "Severity": "error", - "Match": "rawAmount", - "Line": 175 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 185 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 185 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 186 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'complexAssets'?", - "Severity": "error", - "Match": "complexAssets", - "Line": 186 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 211 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 213 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 214 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 215 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'complexAssets'?", - "Severity": "error", - "Match": "complexAssets", - "Line": 221 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 234 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 234 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 236 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 236 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 238 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 246 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 246 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 248 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonAddress'?", - "Severity": "error", - "Match": "tonAddress", - "Line": 248 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonAddress'?", - "Severity": "error", - "Match": "tonAddress", - "Line": 250 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 262 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 262 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 263 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 271 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 271 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 272 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 280 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 280 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 54 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenId'?", - "Severity": "error", - "Match": "tokenId", - "Line": 280 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 281 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenId'?", - "Severity": "error", - "Match": "tokenId", - "Line": 283 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 294 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 294 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userAddress'?", - "Severity": "error", - "Match": "userAddress", - "Line": 294 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 296 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettonBalance'?", - "Severity": "error", - "Match": "jettonBalance", - "Line": 296 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userAddress'?", - "Severity": "error", - "Match": "userAddress", - "Line": 297 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 303 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extendedBalance'?", - "Severity": "error", - "Match": "extendedBalance", - "Line": 303 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userAddress'?", - "Severity": "error", - "Match": "userAddress", - "Line": 304 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extendedBalance'?", - "Severity": "error", - "Match": "extendedBalance", - "Line": 309 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 322 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 322 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userAddress'?", - "Severity": "error", - "Match": "userAddress", - "Line": 322 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 324 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userAddress'?", - "Severity": "error", - "Match": "userAddress", - "Line": 325 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 332 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'isDeployed'?", - "Severity": "error", - "Match": "isDeployed", - "Line": 332 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'isDeployed'?", - "Severity": "error", - "Match": "isDeployed", - "Line": 333 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'isDeployed'?", - "Severity": "error", - "Match": "isDeployed", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 347 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 347 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 47, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'senderAddress'?", - "Severity": "error", - "Match": "senderAddress", - "Line": 347 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 348 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validationResults'?", - "Severity": "error", - "Match": "validationResults", - "Line": 348 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 350 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 351 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 360 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'contractExists'?", - "Severity": "error", - "Match": "contractExists", - "Line": 360 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettons'?", - "Severity": "error", - "Match": "jettons", - "Line": 368 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 370 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'senderAddress'?", - "Severity": "error", - "Match": "senderAddress", - "Line": 371 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 375 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requiredAmount'?", - "Severity": "error", - "Match": "requiredAmount", - "Line": 375 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typeof'?", - "Severity": "error", - "Match": "typeof", - "Line": 376 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requiredAmount'?", - "Severity": "error", - "Match": "requiredAmount", - "Line": 380 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validationResults'?", - "Severity": "error", - "Match": "validationResults", - "Line": 396 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validationResults'?", - "Severity": "error", - "Match": "validationResults", - "Line": 399 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 403 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 64, - 76 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'senderAddress'?", - "Severity": "error", - "Match": "senderAddress", - "Line": 403 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 404 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'allValid'?", - "Severity": "error", - "Match": "allValid", - "Line": 404 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 430 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 432 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 443 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lastError'?", - "Severity": "error", - "Match": "lastError", - "Line": 454 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 457 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 464 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lastError'?", - "Severity": "error", - "Match": "lastError", - "Line": 477 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 491 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'senderAddress'?", - "Severity": "error", - "Match": "senderAddress", - "Line": 491 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 493 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 58, - 70 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'senderAddress'?", - "Severity": "error", - "Match": "senderAddress", - "Line": 493 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 501 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 501 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 69 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requiredConfirmations'?", - "Severity": "error", - "Match": "requiredConfirmations", - "Line": 501 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 502 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 505 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 505 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requiredConfirmations'?", - "Severity": "error", - "Match": "requiredConfirmations", - "Line": 507 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 64, - 74 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxAttempts'?", - "Severity": "error", - "Match": "maxAttempts", - "Line": 507 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 509 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 510 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'requiredConfirmations'?", - "Severity": "error", - "Match": "requiredConfirmations", - "Line": 520 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 542 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 542 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmSigner'?", - "Severity": "error", - "Match": "evmSigner", - "Line": 542 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 60 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonRecipient'?", - "Severity": "error", - "Match": "tonRecipient", - "Line": 542 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 544 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAmount'?", - "Severity": "error", - "Match": "tacAmount", - "Line": 544 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 546 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txHash'?", - "Severity": "error", - "Match": "txHash", - "Line": 546 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmSigner'?", - "Severity": "error", - "Match": "evmSigner", - "Line": 547 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 547 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAmount'?", - "Severity": "error", - "Match": "tacAmount", - "Line": 548 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonRecipient'?", - "Severity": "error", - "Match": "tonRecipient", - "Line": 549 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 43, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txHash'?", - "Severity": "error", - "Match": "txHash", - "Line": 554 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txHash'?", - "Severity": "error", - "Match": "txHash", - "Line": 555 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 559 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 559 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmSigner'?", - "Severity": "error", - "Match": "evmSigner", - "Line": 559 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 53, - 64 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonRecipient'?", - "Severity": "error", - "Match": "tonRecipient", - "Line": 559 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 560 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAmount'?", - "Severity": "error", - "Match": "tacAmount", - "Line": 560 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 563 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'additionalAssets'?", - "Severity": "error", - "Match": "additionalAssets", - "Line": 563 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 578 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txHash'?", - "Severity": "error", - "Match": "txHash", - "Line": 578 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmSigner'?", - "Severity": "error", - "Match": "evmSigner", - "Line": 579 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAmount'?", - "Severity": "error", - "Match": "tacAmount", - "Line": 580 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'additionalAssets'?", - "Severity": "error", - "Match": "additionalAssets", - "Line": 582 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'txHash'?", - "Severity": "error", - "Match": "txHash", - "Line": 585 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 600 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 600 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 61 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAssets'?", - "Severity": "error", - "Match": "originalAssets", - "Line": 600 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 601 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAssets'?", - "Severity": "error", - "Match": "originalAssets", - "Line": 602 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'currentStage'?", - "Severity": "error", - "Match": "currentStage", - "Line": 604 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAmounts'?", - "Severity": "error", - "Match": "bridgedAmounts", - "Line": 605 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 611 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAmounts'?", - "Severity": "error", - "Match": "bridgedAmounts", - "Line": 620 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAssets'?", - "Severity": "error", - "Match": "originalAssets", - "Line": 621 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 633 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'interpretedStages'?", - "Severity": "error", - "Match": "interpretedStages", - "Line": 633 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'interpretedStages'?", - "Severity": "error", - "Match": "interpretedStages", - "Line": 636 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 678 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAssets'?", - "Severity": "error", - "Match": "originalAssets", - "Line": 678 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 679 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'bridgedAmounts'?", - "Severity": "error", - "Match": "bridgedAmounts", - "Line": 679 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 681 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 685 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAmount'?", - "Severity": "error", - "Match": "originalAmount", - "Line": 689 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 690 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAddress'?", - "Severity": "error", - "Match": "tacAddress", - "Line": 695 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAmount'?", - "Severity": "error", - "Match": "originalAmount", - "Line": 697 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAddress'?", - "Severity": "error", - "Match": "tacAddress", - "Line": 698 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'originalAmount'?", - "Severity": "error", - "Match": "originalAmount", - "Line": 704 - } - ], - "build/sdk/usage/sdk-initialization.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 47, - 49 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sdk'?", - "Severity": "error", - "Match": "sdk", - "Line": 13 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 15 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 21 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 21 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 36 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 36 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TONParams'?", - "Severity": "error", - "Match": "TONParams", - "Line": 39 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 40 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'contractOpener'?", - "Severity": "error", - "Match": "contractOpener", - "Line": 41 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonClient'?", - "Severity": "error", - "Match": "tonClient", - "Line": 41 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'settingsAddress'?", - "Severity": "error", - "Match": "settingsAddress", - "Line": 42 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TACParams'?", - "Severity": "error", - "Match": "TACParams", - "Line": 44 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 45 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'customProvider'?", - "Severity": "error", - "Match": "customProvider", - "Line": 46 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'settingsAddress'?", - "Severity": "error", - "Match": "settingsAddress", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 72 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 77 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 81 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 81 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 98 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 103 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonClient'?", - "Severity": "error", - "Match": "tonClient", - "Line": 103 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'api'?", - "Severity": "error", - "Match": "api", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 8 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'apiKey'?", - "Severity": "error", - "Match": "apiKey", - "Line": 105 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 108 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 108 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TONParams'?", - "Severity": "error", - "Match": "TONParams", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'contractOpener'?", - "Severity": "error", - "Match": "contractOpener", - "Line": 111 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonClient'?", - "Severity": "error", - "Match": "tonClient", - "Line": 111 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'settingsAddress'?", - "Severity": "error", - "Match": "settingsAddress", - "Line": 112 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 122 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 122 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 145 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 145 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 147 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonParams'?", - "Severity": "error", - "Match": "tonParams", - "Line": 149 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'apiKey'?", - "Severity": "error", - "Match": "apiKey", - "Line": 150 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 168 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 168 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonParams'?", - "Severity": "error", - "Match": "tonParams", - "Line": 171 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'apiKey'?", - "Severity": "error", - "Match": "apiKey", - "Line": 172 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'createContext'?", - "Severity": "error", - "Match": "createContext", - "Line": 188 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useContext'?", - "Severity": "error", - "Match": "useContext", - "Line": 188 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useEffect'?", - "Severity": "error", - "Match": "useEffect", - "Line": 188 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 62 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useState'?", - "Severity": "error", - "Match": "useState", - "Line": 188 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 47, - 49 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sdk'?", - "Severity": "error", - "Match": "sdk", - "Line": 189 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 191 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 193 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 194 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 194 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useState'?", - "Severity": "error", - "Match": "useState", - "Line": 194 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 195 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setLoading'?", - "Severity": "error", - "Match": "setLoading", - "Line": 195 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 196 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setError'?", - "Severity": "error", - "Match": "setError", - "Line": 196 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useEffect'?", - "Severity": "error", - "Match": "useEffect", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'initializeSdk'?", - "Severity": "error", - "Match": "initializeSdk", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setLoading'?", - "Severity": "error", - "Match": "setLoading", - "Line": 201 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setError'?", - "Severity": "error", - "Match": "setError", - "Line": 202 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 204 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sdk'?", - "Severity": "error", - "Match": "sdk", - "Line": 204 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonParams'?", - "Severity": "error", - "Match": "tonParams", - "Line": 210 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'apiKey'?", - "Severity": "error", - "Match": "apiKey", - "Line": 211 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'initializeSdk'?", - "Severity": "error", - "Match": "initializeSdk", - "Line": 224 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'unmount'?", - "Severity": "error", - "Match": "unmount", - "Line": 226 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 228 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 229 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 235 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 241 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 242 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 259 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 260 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 260 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 261 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 262 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typeof'?", - "Severity": "error", - "Match": "typeof", - "Line": 266 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 268 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 268 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 270 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 291 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 292 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 297 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 24, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 297 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 302 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 303 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 306 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 319 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'composable'?", - "Severity": "error", - "Match": "composable", - "Line": 325 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onMounted'?", - "Severity": "error", - "Match": "onMounted", - "Line": 329 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onUnmounted'?", - "Severity": "error", - "Match": "onUnmounted", - "Line": 329 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 46, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'vue'?", - "Severity": "error", - "Match": "vue", - "Line": 329 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 333 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 333 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 334 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 335 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 342 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonParams'?", - "Severity": "error", - "Match": "tonParams", - "Line": 345 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'apiKey'?", - "Severity": "error", - "Match": "apiKey", - "Line": 346 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 360 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 361 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 366 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 366 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 381 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 381 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 383 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 393 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacAddress'?", - "Severity": "error", - "Match": "tacAddress", - "Line": 393 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 400 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacExecutors'?", - "Severity": "error", - "Match": "tacExecutors", - "Line": 400 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 401 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonExecutors'?", - "Severity": "error", - "Match": "tonExecutors", - "Line": 401 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacExecutors'?", - "Severity": "error", - "Match": "tacExecutors", - "Line": 403 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonExecutors'?", - "Severity": "error", - "Match": "tonExecutors", - "Line": 404 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 412 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxRetries'?", - "Severity": "error", - "Match": "maxRetries", - "Line": 412 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lastError'?", - "Severity": "error", - "Match": "lastError", - "Line": 413 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxRetries'?", - "Severity": "error", - "Match": "maxRetries", - "Line": 415 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 417 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lastError'?", - "Severity": "error", - "Match": "lastError", - "Line": 426 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 442 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 486 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 489 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 500 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'isHealthy'?", - "Severity": "error", - "Match": "isHealthy", - "Line": 500 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'config'?", - "Severity": "error", - "Match": "config", - "Line": 512 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'params'?", - "Severity": "error", - "Match": "params", - "Line": 525 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonParams'?", - "Severity": "error", - "Match": "tonParams", - "Line": 527 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'params'?", - "Severity": "error", - "Match": "params", - "Line": 533 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 545 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'apiKey'?", - "Severity": "error", - "Match": "apiKey", - "Line": 549 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 554 - } - ], - "build/sdk/usage/sending-transactions.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'SDK's'?", - "Severity": "error", - "Match": "SDK's", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 37 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 9 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 22 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 22 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 23 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 57 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 23 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 26 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 28 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 29 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 33 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 41 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 41 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 50, - 60 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 57 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 59 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 59 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 60, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'params'?", - "Severity": "error", - "Match": "params", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 61 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 72 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 74 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 75 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 82 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 84 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 85 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 92 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 95 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 103 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 106 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 109 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'abi'?", - "Severity": "error", - "Match": "abi", - "Line": 109 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transferParams'?", - "Severity": "error", - "Match": "transferParams", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Uniswap'?", - "Severity": "error", - "Match": "Uniswap", - "Line": 115 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 116 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'swapParams'?", - "Severity": "error", - "Match": "swapParams", - "Line": 116 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'amountIn'?", - "Severity": "error", - "Match": "amountIn", - "Line": 119 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'recipientAddress'?", - "Severity": "error", - "Match": "recipientAddress", - "Line": 122 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 127 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 129 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 131 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'swapParams'?", - "Severity": "error", - "Match": "swapParams", - "Line": 131 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 155 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 167 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 178 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 202 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rawAssets'?", - "Severity": "error", - "Match": "rawAssets", - "Line": 202 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rawAmount'?", - "Severity": "error", - "Match": "rawAmount", - "Line": 206 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 220 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'forceSend'?", - "Severity": "error", - "Match": "forceSend", - "Line": 221 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'protocolFee'?", - "Severity": "error", - "Match": "protocolFee", - "Line": 223 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 51, - 58 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nanotons'?", - "Severity": "error", - "Match": "nanotons", - "Line": 223 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 51, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'wei'?", - "Severity": "error", - "Match": "wei", - "Line": 229 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 52, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'nanotons'?", - "Severity": "error", - "Match": "nanotons", - "Line": 235 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 238 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 238 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validator'?", - "Severity": "error", - "Match": "validator", - "Line": 247 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 256 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'batchTransactions'?", - "Severity": "error", - "Match": "batchTransactions", - "Line": 256 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 256 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 258 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 262 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 263 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 271 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'EQJetton'?", - "Severity": "error", - "Match": "EQJetton", - "Line": 273 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 278 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'crosschainTxs'?", - "Severity": "error", - "Match": "crosschainTxs", - "Line": 278 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 284 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinkers'?", - "Severity": "error", - "Match": "transactionLinkers", - "Line": 284 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'crosschainTxs'?", - "Severity": "error", - "Match": "crosschainTxs", - "Line": 286 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 298 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simulateTransaction'?", - "Severity": "error", - "Match": "simulateTransaction", - "Line": 298 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 298 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 300 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 315 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 337 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 353 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 364 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 408 - } - ], - "build/sdk/usage/transaction-tracking.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 70, - 79 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 99, - 103 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'SDK's'?", - "Severity": "error", - "Match": "SDK's", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 29 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 29 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 37 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 45, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardsKey'?", - "Severity": "error", - "Match": "shardsKey", - "Line": 37 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 38 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 24, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 39 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardCount'?", - "Severity": "error", - "Match": "shardCount", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 50 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 63 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 66 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 66 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 75 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 75 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinker'?", - "Severity": "error", - "Match": "transactionLinker", - "Line": 75 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 76 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 78 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 104 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 105 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 107 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'statusInfo'?", - "Severity": "error", - "Match": "statusInfo", - "Line": 107 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 107 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'statusInfo'?", - "Severity": "error", - "Match": "statusInfo", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'statusInfo'?", - "Severity": "error", - "Match": "statusInfo", - "Line": 111 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'startTracking'?", - "Severity": "error", - "Match": "startTracking", - "Line": 127 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 133 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'executionStages'?", - "Severity": "error", - "Match": "executionStages", - "Line": 133 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'returnValue'?", - "Severity": "error", - "Match": "returnValue", - "Line": 137 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tableView'?", - "Severity": "error", - "Match": "tableView", - "Line": 138 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 54 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'executionStages'?", - "Severity": "error", - "Match": "executionStages", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 153 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'transactionLinkers'?", - "Severity": "error", - "Match": "transactionLinkers", - "Line": 153 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tableView'?", - "Severity": "error", - "Match": "tableView", - "Line": 156 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 167 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 31, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 167 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 168 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 170 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 46, - 61 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'messageValidated'?", - "Severity": "error", - "Match": "messageValidated", - "Line": 174 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'assetsLocked'?", - "Severity": "error", - "Match": "assetsLocked", - "Line": 175 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 47, - 63 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'finalConfirmation'?", - "Severity": "error", - "Match": "finalConfirmation", - "Line": 179 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 182 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'totalTime'?", - "Severity": "error", - "Match": "totalTime", - "Line": 182 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 183 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationIds'?", - "Severity": "error", - "Match": "operationIds", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 202 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 66 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationIds'?", - "Severity": "error", - "Match": "operationIds", - "Line": 202 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 204 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 205 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 217 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 218 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'batchResults'?", - "Severity": "error", - "Match": "batchResults", - "Line": 218 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 230 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'robustTracking'?", - "Severity": "error", - "Match": "robustTracking", - "Line": 230 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 24, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 230 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 50, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxRetries'?", - "Severity": "error", - "Match": "maxRetries", - "Line": 230 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 231 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxRetries'?", - "Severity": "error", - "Match": "maxRetries", - "Line": 234 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 236 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'maxRetries'?", - "Severity": "error", - "Match": "maxRetries", - "Line": 252 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 8 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'enum'?", - "Severity": "error", - "Match": "enum", - "Line": 271 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 8 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'enum'?", - "Severity": "error", - "Match": "enum", - "Line": 284 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 49 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tx'?", - "Severity": "error", - "Match": "tx", - "Line": 296 - } - ], - "build/sdk/usage/wallet-integration.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 22 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 25 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacSdk'?", - "Severity": "error", - "Match": "tacSdk", - "Line": 25 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 41 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 48 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 49 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'iconUrl'?", - "Severity": "error", - "Match": "iconUrl", - "Line": 50 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 63 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'manifestUrl'?", - "Severity": "error", - "Match": "manifestUrl", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 70 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'createContext'?", - "Severity": "error", - "Match": "createContext", - "Line": 79 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 41 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useContext'?", - "Severity": "error", - "Match": "useContext", - "Line": 79 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 44, - 52 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useEffect'?", - "Severity": "error", - "Match": "useEffect", - "Line": 79 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 62 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'useState'?", - "Severity": "error", - "Match": "useState", - "Line": 79 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 83 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 85 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 86 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 87 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setSender'?", - "Severity": "error", - "Match": "setSender", - "Line": 87 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 88 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setWallet'?", - "Severity": "error", - "Match": "setWallet", - "Line": 88 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 89 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'setLoading'?", - "Severity": "error", - "Match": "setLoading", - "Line": 89 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 92 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 92 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 94 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 94 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'manifestUrl'?", - "Severity": "error", - "Match": "manifestUrl", - "Line": 95 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 99 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 102 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 102 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 107 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'newSender'?", - "Severity": "error", - "Match": "newSender", - "Line": 107 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tonConnect'?", - "Severity": "error", - "Match": "tonConnect", - "Line": 108 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'newSender'?", - "Severity": "error", - "Match": "newSender", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 123 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 138 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'connectWallet'?", - "Severity": "error", - "Match": "connectWallet", - "Line": 138 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 29 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 138 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'connectWallet'?", - "Severity": "error", - "Match": "connectWallet", - "Line": 140 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'disconnectWallet'?", - "Severity": "error", - "Match": "disconnectWallet", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'connectWallet'?", - "Severity": "error", - "Match": "connectWallet", - "Line": 157 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'disconnectWallet'?", - "Severity": "error", - "Match": "disconnectWallet", - "Line": 158 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'isConnected'?", - "Severity": "error", - "Match": "isConnected", - "Line": 159 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 167 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 168 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 182 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 183 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'disconnectWallet'?", - "Severity": "error", - "Match": "disconnectWallet", - "Line": 188 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'isConnected'?", - "Severity": "error", - "Match": "isConnected", - "Line": 189 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 192 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 194 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'handleTransaction'?", - "Severity": "error", - "Match": "handleTransaction", - "Line": 194 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 194 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 198 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 200 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedParameters'?", - "Severity": "error", - "Match": "encodedParameters", - "Line": 201 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 204 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 206 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 251 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 258 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'subwalletNumber'?", - "Severity": "error", - "Match": "subwalletNumber", - "Line": 264 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'subwallet'?", - "Severity": "error", - "Match": "subwallet", - "Line": 264 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 270 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Highload'?", - "Severity": "error", - "Match": "Highload", - "Line": 277 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 282 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'highloadSender'?", - "Severity": "error", - "Match": "highloadSender", - "Line": 282 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'subwalletId'?", - "Severity": "error", - "Match": "subwalletId", - "Line": 288 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Subwallet'?", - "Severity": "error", - "Match": "Subwallet", - "Line": 288 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Highload'?", - "Severity": "error", - "Match": "Highload", - "Line": 296 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 314 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 316 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 330 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 334 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardTransaction'?", - "Severity": "error", - "Match": "shardTransaction", - "Line": 335 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'contractOpener'?", - "Severity": "error", - "Match": "contractOpener", - "Line": 338 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 342 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardTransactions'?", - "Severity": "error", - "Match": "shardTransactions", - "Line": 343 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'contractOpener'?", - "Severity": "error", - "Match": "contractOpener", - "Line": 346 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 356 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 361 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'privateSender'?", - "Severity": "error", - "Match": "privateSender", - "Line": 361 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 368 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 382 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 390 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 397 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validVersions'?", - "Severity": "error", - "Match": "validVersions", - "Line": 397 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 421 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 434 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 462 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 487 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 492 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 503 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 510 - } - ], - "build/smart-contracts/develop-tac-proxy.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 107, - 116 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 70, - 73 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 8 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 200, - 203 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'SDKs'?", - "Severity": "error", - "Match": "SDKs", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 20 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'devDependencies'?", - "Severity": "error", - "Match": "devDependencies", - "Line": 27 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 30 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chai'?", - "Severity": "error", - "Match": "chai", - "Line": 31 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 39 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 51 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 62, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 56 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 37 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dappContract'?", - "Severity": "error", - "Match": "dappContract", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_dappContract'?", - "Severity": "error", - "Match": "_dappContract", - "Line": 62 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dappContract'?", - "Severity": "error", - "Match": "dappContract", - "Line": 65 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 45, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacHeader'?", - "Severity": "error", - "Match": "tacHeader", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 62, - 69 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 90 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Initializable'?", - "Severity": "error", - "Match": "Initializable", - "Line": 92 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 80, - 92 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Initializable'?", - "Severity": "error", - "Match": "Initializable", - "Line": 92 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'UUPSUpgradeable'?", - "Severity": "error", - "Match": "UUPSUpgradeable", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 82, - 96 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'UUPSUpgradeable'?", - "Severity": "error", - "Match": "UUPSUpgradeable", - "Line": 93 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 72, - 82 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'initializer'?", - "Severity": "error", - "Match": "initializer", - "Line": 105 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 59, - 67 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'onlyOwner'?", - "Severity": "error", - "Match": "onlyOwner", - "Line": 111 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 114 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 45, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacHeader'?", - "Severity": "error", - "Match": "tacHeader", - "Line": 114 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 62, - 69 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 114 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 134 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 55 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 134 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 147 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 41, - 49 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacHeader'?", - "Severity": "error", - "Match": "tacHeader", - "Line": 147 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 58, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 147 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'args'?", - "Severity": "error", - "Match": "args", - "Line": 152 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 34, - 37 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 154 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenFrom'?", - "Severity": "error", - "Match": "tokenFrom", - "Line": 155 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 157 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenFrom'?", - "Severity": "error", - "Match": "tokenFrom", - "Line": 159 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenTo'?", - "Severity": "error", - "Match": "tokenTo", - "Line": 160 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 50, - 58 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacHeader'?", - "Severity": "error", - "Match": "tacHeader", - "Line": 175 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'outMsg'?", - "Severity": "error", - "Match": "outMsg", - "Line": 179 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardsKey'?", - "Severity": "error", - "Match": "shardsKey", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardsKey'?", - "Severity": "error", - "Match": "shardsKey", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmTarget'?", - "Severity": "error", - "Match": "tvmTarget", - "Line": 181 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmCaller'?", - "Severity": "error", - "Match": "tvmCaller", - "Line": 181 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmPayload'?", - "Severity": "error", - "Match": "tvmPayload", - "Line": 182 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'toBridge'?", - "Severity": "error", - "Match": "toBridge", - "Line": 183 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 193 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 51, - 58 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 193 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 45, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 72, - 77 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp's'?", - "Severity": "error", - "Match": "dApp's", - "Line": 204 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 225 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 225 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 226 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'abiCoder'?", - "Severity": "error", - "Match": "abiCoder", - "Line": 226 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 228 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'feeCollector'?", - "Severity": "error", - "Match": "feeCollector", - "Line": 238 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'feeRate'?", - "Severity": "error", - "Match": "feeRate", - "Line": 239 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extraInfo'?", - "Severity": "error", - "Match": "extraInfo", - "Line": 243 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 253 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extraInfo'?", - "Severity": "error", - "Match": "extraInfo", - "Line": 253 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 41, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'feeRate'?", - "Severity": "error", - "Match": "feeRate", - "Line": 253 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 254 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 4, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extraInfo'?", - "Severity": "error", - "Match": "extraInfo", - "Line": 256 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tokenAmount'?", - "Severity": "error", - "Match": "tokenAmount", - "Line": 256 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 272 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 273 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 290 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 292 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userMessage'?", - "Severity": "error", - "Match": "userMessage", - "Line": 292 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'method_name'?", - "Severity": "error", - "Match": "method_name", - "Line": 294 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 296 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 313 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardsKey'?", - "Severity": "error", - "Match": "shardsKey", - "Line": 321 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 323 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extraData'?", - "Severity": "error", - "Match": "extraData", - "Line": 325 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'receivedTokens'?", - "Severity": "error", - "Match": "receivedTokens", - "Line": 326 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 331 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 65, - 72 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 331 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'receivedTokens'?", - "Severity": "error", - "Match": "receivedTokens", - "Line": 339 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 54, - 57 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 341 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'shardsKey'?", - "Severity": "error", - "Match": "shardsKey", - "Line": 345 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'operationId'?", - "Severity": "error", - "Match": "operationId", - "Line": 347 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extraData'?", - "Severity": "error", - "Match": "extraData", - "Line": 349 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'receivedTokens'?", - "Severity": "error", - "Match": "receivedTokens", - "Line": 350 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'uint'?", - "Severity": "error", - "Match": "uint", - "Line": 354 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'receivedTokens'?", - "Severity": "error", - "Match": "receivedTokens", - "Line": 354 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'receivedTokens'?", - "Severity": "error", - "Match": "receivedTokens", - "Line": 355 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'receivedTokens'?", - "Severity": "error", - "Match": "receivedTokens", - "Line": 357 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmTarget'?", - "Severity": "error", - "Match": "tvmTarget", - "Line": 365 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmPayload'?", - "Severity": "error", - "Match": "tvmPayload", - "Line": 366 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'toBridge'?", - "Severity": "error", - "Match": "toBridge", - "Line": 367 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 378 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_name'?", - "Severity": "error", - "Match": "_name", - "Line": 383 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 53, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_symbol'?", - "Severity": "error", - "Match": "_symbol", - "Line": 383 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 75, - 81 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_symbol'?", - "Severity": "error", - "Match": "_symbol", - "Line": 383 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_to'?", - "Severity": "error", - "Match": "_to", - "Line": 385 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 41, - 47 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_amount'?", - "Severity": "error", - "Match": "_amount", - "Line": 385 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_amount'?", - "Severity": "error", - "Match": "_amount", - "Line": 386 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 8, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'hre'?", - "Severity": "error", - "Match": "hre", - "Line": 396 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testSdk'?", - "Severity": "error", - "Match": "testSdk", - "Line": 415 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'proxyContract'?", - "Severity": "error", - "Match": "proxyContract", - "Line": 416 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'existedToken'?", - "Severity": "error", - "Match": "existedToken", - "Line": 417 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 419 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testSdk'?", - "Severity": "error", - "Match": "testSdk", - "Line": 423 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 424 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testSdk'?", - "Severity": "error", - "Match": "testSdk", - "Line": 424 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'existedToken'?", - "Severity": "error", - "Match": "existedToken", - "Line": 427 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'proxyContract'?", - "Severity": "error", - "Match": "proxyContract", - "Line": 436 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 447 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 448 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 449 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'extraData'?", - "Severity": "error", - "Match": "extraData", - "Line": 449 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 32, - 40 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'untrusted'?", - "Severity": "error", - "Match": "untrusted", - "Line": 449 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 450 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 451 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 454 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettonInfo'?", - "Severity": "error", - "Match": "jettonInfo", - "Line": 454 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tvmAddress'?", - "Severity": "error", - "Match": "tvmAddress", - "Line": 455 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 461 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettonInfo'?", - "Severity": "error", - "Match": "jettonInfo", - "Line": 462 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mintAmount'?", - "Severity": "error", - "Match": "mintAmount", - "Line": 463 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 467 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'evmAddress'?", - "Severity": "error", - "Match": "evmAddress", - "Line": 468 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'existedToken'?", - "Severity": "error", - "Match": "existedToken", - "Line": 468 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'unlockAmount'?", - "Severity": "error", - "Match": "unlockAmount", - "Line": 469 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 481 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 68, - 74 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettons'?", - "Severity": "error", - "Match": "jettons", - "Line": 483 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 484 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 489 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 490 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 490 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 493 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 26 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedArguments'?", - "Severity": "error", - "Match": "encodedArguments", - "Line": 498 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'deployedTokens'?", - "Severity": "error", - "Match": "deployedTokens", - "Line": 504 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'outMessages'?", - "Severity": "error", - "Match": "outMessages", - "Line": 504 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 68, - 78 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'sendMessage'?", - "Severity": "error", - "Match": "sendMessage", - "Line": 504 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 507 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'encodedArguments'?", - "Severity": "error", - "Match": "encodedArguments", - "Line": 508 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 33, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettons'?", - "Severity": "error", - "Match": "jettons", - "Line": 510 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 516 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'outMessages'?", - "Severity": "error", - "Match": "outMessages", - "Line": 527 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'outMessage'?", - "Severity": "error", - "Match": "outMessage", - "Line": 529 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'eventFound'?", - "Severity": "error", - "Match": "eventFound", - "Line": 553 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'eventFound'?", - "Severity": "error", - "Match": "eventFound", - "Line": 557 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 24 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'typedEvent'?", - "Severity": "error", - "Match": "typedEvent", - "Line": 558 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 607 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 75, - 80 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp's'?", - "Severity": "error", - "Match": "dApp's", - "Line": 618 - } - ], - "build/smart-contracts/tools/foundry.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 98, - 105 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'foundryup'?", - "Severity": "error", - "Match": "foundryup", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'foundryup'?", - "Severity": "error", - "Match": "foundryup", - "Line": 21 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'src'?", - "Severity": "error", - "Match": "src", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'src'?", - "Severity": "error", - "Match": "src", - "Line": 59 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 8 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'libs'?", - "Severity": "error", - "Match": "libs", - "Line": 61 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 16 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'solc_version'?", - "Severity": "error", - "Match": "solc_version", - "Line": 62 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'optimizer_runs'?", - "Severity": "error", - "Match": "optimizer_runs", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 10 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'via_ir'?", - "Severity": "error", - "Match": "via_ir", - "Line": 65 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 34 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 67 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rpc_endpoints'?", - "Severity": "error", - "Match": "rpc_endpoints", - "Line": 68 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_mainnet'?", - "Severity": "error", - "Match": "tac_mainnet", - "Line": 70 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 102 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 105 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_initialValue'?", - "Severity": "error", - "Match": "_initialValue", - "Line": 109 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_initialValue'?", - "Severity": "error", - "Match": "_initialValue", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_value'?", - "Severity": "error", - "Match": "_value", - "Line": 113 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 114 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_value'?", - "Severity": "error", - "Match": "_value", - "Line": 114 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_value'?", - "Severity": "error", - "Match": "_value", - "Line": 115 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 119 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 144 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 150 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 155 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 159 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_value'?", - "Severity": "error", - "Match": "_value", - "Line": 174 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 24, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 219 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 243 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacContract'?", - "Severity": "error", - "Match": "tacContract", - "Line": 261 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 279 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 281 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 296 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 17, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_mainnet'?", - "Severity": "error", - "Match": "tac_mainnet", - "Line": 298 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 78, - 84 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 304 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 57, - 67 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 313 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'abi'?", - "Severity": "error", - "Match": "abi", - "Line": 335 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'lcov'?", - "Severity": "error", - "Match": "lcov", - "Line": 347 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 6, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'rpc_endpoints'?", - "Severity": "error", - "Match": "rpc_endpoints", - "Line": 433 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 434 - } - ], - "build/smart-contracts/tools/hardhat.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 57, - 66 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum's'?", - "Severity": "error", - "Match": "Ethereum's", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mkdir'?", - "Severity": "error", - "Match": "mkdir", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 18 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 19 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 20 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 2, - 4 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 31 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 2, - 4 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 32 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 2, - 4 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npm'?", - "Severity": "error", - "Match": "npm", - "Line": 33 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 33, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 57 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 58 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 59 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 60 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasPrice'?", - "Severity": "error", - "Match": "gasPrice", - "Line": 62 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gwei'?", - "Severity": "error", - "Match": "gwei", - "Line": 62 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 64 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_mainnet'?", - "Severity": "error", - "Match": "tac_mainnet", - "Line": 65 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 66 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 67 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasPrice'?", - "Severity": "error", - "Match": "gasPrice", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gwei'?", - "Severity": "error", - "Match": "gwei", - "Line": 69 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 52, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 92 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 98 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 101 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_initialValue'?", - "Severity": "error", - "Match": "_initialValue", - "Line": 105 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 106 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_initialValue'?", - "Severity": "error", - "Match": "_initialValue", - "Line": 106 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_value'?", - "Severity": "error", - "Match": "_value", - "Line": 109 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 23, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean '_value'?", - "Severity": "error", - "Match": "_value", - "Line": 110 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'storedData'?", - "Severity": "error", - "Match": "storedData", - "Line": 115 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'pragma'?", - "Severity": "error", - "Match": "pragma", - "Line": 126 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 40, - 51 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'userCounters'?", - "Severity": "error", - "Match": "userCounters", - "Line": 132 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 60, - 67 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'newValue'?", - "Severity": "error", - "Match": "newValue", - "Line": 134 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 37, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 46, - 54 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacHeader'?", - "Severity": "error", - "Match": "tacHeader", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 63, - 70 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'calldata'?", - "Severity": "error", - "Match": "calldata", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 72, - 75 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'args'?", - "Severity": "error", - "Match": "args", - "Line": 148 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'methodName'?", - "Severity": "error", - "Match": "methodName", - "Line": 164 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'counterUpdated'?", - "Severity": "error", - "Match": "counterUpdated", - "Line": 164 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 179 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 180 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 183 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 187 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 28, - 33 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'ethers'?", - "Severity": "error", - "Match": "ethers", - "Line": 188 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 190 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 191 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 23 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 192 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 46, - 50 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 195 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 18, - 30 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'simpleStorage'?", - "Severity": "error", - "Match": "simpleStorage", - "Line": 196 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 42, - 46 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 199 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 200 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tx'?", - "Severity": "error", - "Match": "tx", - "Line": 200 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 12 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tx'?", - "Severity": "error", - "Match": "tx", - "Line": 201 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 42 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'async'?", - "Severity": "error", - "Match": "async", - "Line": 206 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 218 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 25, - 31 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 220 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 221 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 5 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 232 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 235 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 10, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'deployer'?", - "Severity": "error", - "Match": "deployer", - "Line": 235 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 52, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'deployer'?", - "Severity": "error", - "Match": "deployer", - "Line": 237 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 241 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 242 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 248 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 251 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 254 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 11, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tacContract'?", - "Severity": "error", - "Match": "tacContract", - "Line": 254 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'const'?", - "Severity": "error", - "Match": "const", - "Line": 261 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'deploymentInfo'?", - "Severity": "error", - "Match": "deploymentInfo", - "Line": 261 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockNumber'?", - "Severity": "error", - "Match": "blockNumber", - "Line": 265 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 48 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'deploymentInfo'?", - "Severity": "error", - "Match": "deploymentInfo", - "Line": 268 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 284 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 285 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 285 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 21, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 298 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 7 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'npx'?", - "Severity": "error", - "Match": "npx", - "Line": 299 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 49, - 59 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_mainnet'?", - "Severity": "error", - "Match": "tac_mainnet", - "Line": 299 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 78, - 84 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 302 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 325 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 326 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 327 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasPrice'?", - "Severity": "error", - "Match": "gasPrice", - "Line": 330 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 36, - 39 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gwei'?", - "Severity": "error", - "Match": "gwei", - "Line": 330 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 345 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 346 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 347 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 15 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_mainnet'?", - "Severity": "error", - "Match": "tac_mainnet", - "Line": 350 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 9 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 351 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'chainId'?", - "Severity": "error", - "Match": "chainId", - "Line": 352 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 17 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'tac_testnet'?", - "Severity": "error", - "Match": "tac_testnet", - "Line": 373 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 374 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 9, - 19 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'httpHeaders'?", - "Severity": "error", - "Match": "httpHeaders", - "Line": 376 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasLimit'?", - "Severity": "error", - "Match": "gasLimit", - "Line": 394 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 14 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gasPrice'?", - "Severity": "error", - "Match": "gasPrice", - "Line": 395 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 48, - 51 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'gwei'?", - "Severity": "error", - "Match": "gwei", - "Line": 395 - } - ], - "build/tooling/block-explorer.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 27, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 3 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 59, - 67 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Blockcout'?", - "Severity": "error", - "Match": "Blockcout", - "Line": 3 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Blockcout'?", - "Severity": "error", - "Match": "Blockcout", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 236, - 240 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TAC's'?", - "Severity": "error", - "Match": "TAC's", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 256, - 259 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 12 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 5, - 11 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 20 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 22, - 28 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 24 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 130, - 136 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 24 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Blockcout'?", - "Severity": "error", - "Match": "Blockcout", - "Line": 30 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 97, - 101 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'TAC's'?", - "Severity": "error", - "Match": "TAC's", - "Line": 30 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 110, - 113 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 30 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 57, - 65 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'validator'?", - "Severity": "error", - "Match": "validator", - "Line": 50 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 43 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Blockcout'?", - "Severity": "error", - "Match": "Blockcout", - "Line": 65 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 13, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'blockchain'?", - "Severity": "error", - "Match": "blockchain", - "Line": 66 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 35, - 38 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 71 - } - ], - "build/tooling/bridge.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 16, - 22 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Mainnet'?", - "Severity": "error", - "Match": "Mainnet", - "Line": 12 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 20 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 12, - 18 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 24 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 39, - 45 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 24 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 55, - 61 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 24 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 40 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 38, - 44 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'jettons'?", - "Severity": "error", - "Match": "jettons", - "Line": 56 - } - ], - "build/tooling/contract-addresses.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 60, - 66 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 19 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 60, - 66 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'mainnet'?", - "Severity": "error", - "Match": "mainnet", - "Line": 37 - } - ], - "build/tooling/developer-console.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 1, - 3 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'url'?", - "Severity": "error", - "Match": "url", - "Line": 3 - } - ], - "build/tooling/faucet.mdx": [ - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 19, - 25 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 3 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 86, - 92 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 3 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 30, - 36 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 86, - 90 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApps'?", - "Severity": "error", - "Match": "dApps", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 116, - 122 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 6 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 29, - 35 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Testnet'?", - "Severity": "error", - "Match": "Testnet", - "Line": 12 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 14, - 20 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 16 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 47, - 53 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 17 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 20, - 27 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'Ethereum'?", - "Severity": "error", - "Match": "Ethereum", - "Line": 25 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 45, - 51 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 26 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 15, - 21 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 27 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 26, - 32 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 43 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 7, - 13 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'testnet'?", - "Severity": "error", - "Match": "testnet", - "Line": 47 - }, - { - "Action": { - "Name": "", - "Params": null - }, - "Span": [ - 3, - 6 - ], - "Check": "TAC.Spelling", - "Description": "", - "Link": "", - "Message": "Did you really mean 'dApp'?", - "Severity": "error", - "Match": "dApp", - "Line": 48 - } - ] -} diff --git a/core-concepts/overview/hybrid-dapps.mdx b/why-tac/components/hybrid-dapps.mdx similarity index 76% rename from core-concepts/overview/hybrid-dapps.mdx rename to why-tac/components/hybrid-dapps.mdx index 514f8fc..ca418fe 100644 --- a/core-concepts/overview/hybrid-dapps.mdx +++ b/why-tac/components/hybrid-dapps.mdx @@ -10,20 +10,18 @@ Hybrid dApps are applications that run their core logic on TAC's EVM Layer while Traditional dApps exist entirely within one ecosystem. Hybrid dApps span two ecosystems seamlessly: + + - TON wallet integration + - Telegram Mini App interface + - Native asset handling + - Familiar TON user flows + + - Solidity contracts on TAC EVM Layer - Complex DeFi primitives and composability - Mature tooling and battle-tested code - Rich ecosystem of integrations - - - - - - TON wallet integration - - Telegram Mini App interface - - Native asset handling - - Familiar TON user flows - @@ -42,7 +40,7 @@ Hybrid dApps unlock a new paradigm where users and developers enjoy the strength **No learning curve or new tools:** - - Use existing TON wallet (Tonkeeper, Tonhub, etc.) + - Use existing TON wallet (Wallet, Tonkeeper, etc.) - Access through familiar Telegram Mini Apps - Transact with TON tokens directly - No network switching or bridge operations @@ -55,14 +53,13 @@ Hybrid dApps unlock a new paradigm where users and developers enjoy the strength **Access to EVM's rich ecosystem:** - Advanced DeFi protocols (AMMs, lending, derivatives) - - Complex smart contract interactions - - Composable protocols and yield strategies + - Composable protocols and yield strategies - Battle-tested security models - + TON users can now access applications that would be impossible to build natively in FunC - + @@ -109,8 +106,7 @@ Expand your user base without building separate applications. **Focus on application logic, not infrastructure:** - TAC SDK handles all cross-chain complexity - - Automatic proxy contract generation for common patterns - - Standard Ethereum tooling continues to work + - Standard Ethereum tooling continues to work - Rich documentation and developer resources Build sophisticated applications without becoming a cross-chain expert. @@ -118,56 +114,6 @@ Expand your user base without building separate applications. -## Hybrid dApp Architecture - -Here's how the different components work together to create a seamless hybrid experience: - - - - - **Native TON experience:** - - - Telegram Mini App or web interface - - TON wallet connection (TON Connect protocol) - - Familiar TON UX patterns and flows - - Real-time transaction status updates - - - - - -**TAC SDK integration:** - -- JavaScript/TypeScript SDK handles cross-chain messaging -- Automatic transaction routing and status tracking -- Asset bridging management -- Error handling and recovery - - - - - -**TAC infrastructure:** - -- TON Adapter handles secure message routing -- Automatic asset locking/unlocking operations -- Sequencer network validates all transactions -- Proxy contracts translate between ecosystems - - - - - - **EVM smart contracts:** - - - Core business logic runs on TAC EVM Layer - - Complex DeFi operations and state management - - Integration with other EVM protocols - - Standard Solidity development patterns - - - - ## Development Patterns Hybrid dApps on TAC are designed to feel native to both TON and EVM users, blending familiar interfaces with powerful cross-chain capabilities. @@ -212,7 +158,7 @@ EVM-side contracts follow standard patterns with TAC-specific proxy integration: ```solidity pragma solidity ^0.8.0; -import "@tac/proxy-contracts/TacProxyV1.sol"; +import "@tonappchain/evm-ccl/contracts/proxies/TacProxyV1.sol"; contract HybridDeFiProtocol is TacProxyV1 { constructor(address _crossChainLayer) TacProxyV1(_crossChainLayer) {} @@ -248,12 +194,12 @@ Let's follow a TON user interacting with a hybrid DEX: - User connects their TON wallet (Tonkeeper) using standard TON Connect. No new + User connects their TON wallet using standard TON Connect. No new wallets or seed phrases required. - User selects TON tokens to swap. The interface shows familiar token names and + User selects TON tokens to swap (for example). The interface shows familiar token names and balances from their TON wallet. @@ -263,7 +209,7 @@ Let's follow a TON user interacting with a hybrid DEX: - The DEX executes the swap using sophisticated AMM logic on the EVM side. The + The DEX executes the swap on the EVM side. The user sees real-time status updates in the interface. @@ -297,7 +243,6 @@ Let's follow a TON user interacting with a hybrid DEX: **Minimize cross-chain latency:** -- Batch operations when possible to reduce round trips - Use optimistic UI updates where safe - Implement proper caching for frequently accessed data - Pre-validate transactions on the frontend @@ -311,9 +256,8 @@ Let's follow a TON user interacting with a hybrid DEX: - Validate all inputs on both frontend and smart contract - Implement proper slippage protection for DeFi operations -- Use secure proxy contract patterns - Handle failed transactions gracefully -- Audit both frontend and smart contract code +- Audit both proxy and smart contract code on TAC EVM @@ -340,13 +284,15 @@ Let's follow a TON user interacting with a hybrid DEX: **Challenge**: Cross-chain operations take longer than single-chain transactions + **Solution**: Use optimistic UI updates and clear progress indicators to maintain responsive UX **Challenge**: Managing token mappings and decimal differences between - chains + chains + **Solution**: TAC SDK handles token mapping automatically, with helpers for decimal conversion @@ -363,28 +309,7 @@ Let's follow a TON user interacting with a hybrid DEX: **Challenge**: Testing requires simulating both TON and EVM environments - **Solution**: TAC provides testing utilities and local development - environments + **Solution**: TAC provides simulation utilities within both [TAC SDK](/sdk/overview#simulation) and [API](/api/overview). + Joint TON and TAC Testnet environment available for developers 24/7. - -## Ready to Build? - -Hybrid dApps represent the future of cross-chain applications - combining the best of both ecosystems while hiding complexity from users. - - - - Learn how the TAC SDK enables hybrid dApp development - - - Understand how proxy contracts bridge TON and EVM - - diff --git a/why-tac/components/proxy-contracts.mdx b/why-tac/components/proxy-contracts.mdx new file mode 100644 index 0000000..ffce834 --- /dev/null +++ b/why-tac/components/proxy-contracts.mdx @@ -0,0 +1,166 @@ +--- +title: TAC Proxies +description: Proxy smart contracts are the important middleman between the **TON Adapter** and a **Hybrid dApp** +--- + +Proxies are the Solidity contracts that implement the unified interface to access dApp and its methods. +They also ensure integrity and security while cross-chaining anything with the help of the **TON Adapter**. + + + Think of TAC Proxies as API endpoints for TON users. Instead of HTTP requests, + TON users send blockchain transactions that trigger your EVM functions and get + processed results back automatically. + + +## One Transaction Experience +What used to require multiple transactions across different chains now happens in a single TON transaction: + +**Without TAC Proxies:** +1. Bridge tokens TON → EVM +2. Switch to MetaMask +3. Interact with your dApp +4. Bridge tokens back EVM → TON + +**With TAC Proxies:** +1. Call your function from TON wallet ✨ + +## How Proxies Work + + + + - **Custom TAC Proxies:** + On the EVM side, developers write custom Solidity contracts that are designed to interact with the TON Adapter. + These contracts receive validated cross-chain messages from the TON Adapter, + decode the transaction parameters and user intent. + After processing the transaction, the contract executes the required methods on the target contract. + If needed, the contract can also send assets back to TON. + + A typical entry point for these operations is a function such as `processMessage(bytes calldata tacHeader, bytes calldata args) external onlyTONAdapter`, + which ensures that only the TON Adapter can invoke cross-chain actions. + + - **[Agnostic Proxy](/sdk/advanced-custom-proxy/agnostic-proxy) usage:** + This beta feature allows for skipping the writing of Custom TAC Proxies entirely. + Step-by-step EVM execution flow can be directly configured within TAC SDK. + + + + + Developers don't need to write TON-side proxy contracts - the TAC SDK + handles everything + + + **Handled automatically by TAC SDK:** + When a user initiates a transaction using their TON wallet, + the TAC SDK takes care of formatting the request for cross-chain delivery + and continuously monitors and reports the transaction status. + + + +### Proxy Generation + +Proxies are arguibly the most complex topic for Hybrid dApp developers but there are several ways to approach them: + + + + For complex applications, developers should create custom proxies: + + - Handle application-specific logic + - Integrate with multiple contracts + + Custom proxies provide maximum flexibility for unique use cases. + Check out already existing and audited ones [here](/audit/overview#ton-tac-proxies). + + + Latest TAC SDK is equipped with Agnostic Proxy beta feature. + Leverage it to encode the full pipeline of calls and asset flow on the EVM side. + Execution simulation is also available! + Check out the [docs](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/agnostic_proxy_sdk.md). + + + + We are working on a publicly available AI agent which can assist you in developing Custom Proxy for your EVM contracts. + Until then you can check out the [existing](/apps/overview) EVM dApps and their related proxy implementations. + + + +## How Custom Proxies Work + +On the TAC EVM side, developers create custom proxy contracts that receive and process cross-chain messages from the TON Adapter. + +- **Message Reception**: EVM proxy contracts implement specific function signatures that the TON Adapter calls when delivering cross-chain messages. These functions must accept exactly two `bytes` parameters: the **TAC header** and the **application parameters**. + +- **TAC Header**: The first parameter contains encoded metadata about the cross-chain operation, including the original TON user's address, timestamp information, and unique operation identifiers. + +- **Application Parameters**: The second parameter contains application-specific data encoded by the frontend. Proxy contracts decode these parameters to understand what operation the user wants to perform. + +- **Target Application Interaction**: After processing the cross-chain message, proxy contracts interact with the actual target applications - DEXes, lending protocols, NFT contracts, or any other EVM smart contracts. + +Writing Custom Proxy seems tricky? Check out the [Agnostic Proxy](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/agnostic_proxy_sdk.md) approach + +## Real-World Use Cases + +### DeFi Protocols +```solidity +// TON user supplies collateral and borrows in one transaction +function supplyAndBorrow(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer +{ + // Supply collateral to lending protocol + // Borrow against it + // Send borrowed tokens back to TON user +} +``` + +### NFT Marketplaces +```solidity +// TON user buys NFT with their TON assets +function buyNFT(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer +{ + // Process payment + // Transfer NFT to TON user +} +``` + +### Gaming & Rewards +```solidity +// Player completes quest, receives tokens +function completeQuest(bytes calldata tacHeader, bytes calldata arguments) + external + _onlyCrossChainLayer +{ + // Verify quest completion + // Mint and send reward tokens back to player +} +``` + +## Asset Handling + +Proxy contracts must carefully manage assets as they flow between chains and interact with target applications. + +Let's take a look at asset handling on the most popular **TON->TAC->TON** transaction type: + +1. Initial Transfer (**TON->TAC**->TON) + + - **Pre-Function Execution**: Before calling proxy functions, the TON Adapter automatically transfers bridged assets to the proxy contract. This includes both newly minted tokens and unlocked tokens. + + - **Asset Availability**: Proxy contracts can immediately use these assets without additional transfer operations. The amounts are guaranteed to match what was specified in the original cross-chain message. + + - **Asset Validation**: While the TON Adapter validates assets during message processing, proxy contracts should implement additional checks to ensure received assets match expected parameters. + +When operations complete successfully, proxy contracts can send assets and data back to TON users through return messages: + +2. Return Transfer (TON->**TAC->TON**) + + + - **Asset Preparation**: Any tokens being returned must be approved for the CrossChainLayer contract to handle the bridging process. + + - **Message Structure**: Return messages use the same `OutMessageV1` structure, specifying the target TON address, assets to bridge, and optional payload data. + + - **Automatic Processing**: The TON Adapter handles return messages through the same consensus mechanism, ensuring secure delivery back to TON users. + +## Proxy Development + +Ready to build your proxy solution? Learn how in the [related section](/proxies/introduction). diff --git a/why-tac/components/tac-evm-layer.mdx b/why-tac/components/tac-evm-layer.mdx new file mode 100644 index 0000000..24b53d7 --- /dev/null +++ b/why-tac/components/tac-evm-layer.mdx @@ -0,0 +1,127 @@ +--- +title: TAC EVM Layer +description: "A complete Layer 1 blockchain providing full EVM compatibility built on Cosmos SDK" +--- + +The TAC EVM Layer is a fully-fledged Layer-1 blockchain environment based on Cosmos SDK technology. It provides a secure and scalable execution environment specifically optimized for Ethereum-compatible smart contracts, allowing existing EVM dApps to be deployed without modifications or code rewrites, achieving ≈2-second finality through dPoS. + +## Technical Foundation + +TAC EVM Layer combines proven blockchain technologies to deliver a robust execution environment that feels familiar to Ethereum developers. + +### Core Technology Stack + + + + The latest Cosmos SDK provides the modular blockchain framework that powers + TAC EVM Layer. This battle-tested foundation offers built-in modules for + staking, governance, and inter-blockchain communication, while allowing + custom modules for TAC-specific functionality. + + + + +TAC EVM Layer implements native EVM execution directly within the Cosmos SDK +framework. This isn't a compatibility layer or virtual machine running on top +of another VM - it's true EVM execution with modern consensus guarantees. + +Every Ethereum opcode, gas calculation, and state transition rule works +exactly as it does on Ethereum mainnet, ensuring 100% compatibility for +existing Solidity contracts. + + + + + + +## Performance Characteristics + +TAC EVM Layer maintains the security guarantees developers expect from a production blockchain. + + + + + **≈2-second finality** through Tendermint consensus mechanism provides + deterministic execution and fast block confirmation. Transactions are + irreversibly confirmed with minimal latency. + + **No reorganizations** are possible due to Tendermint's BFT consensus model. This + eliminates edge cases where transactions might be reversed or reordered + after confirmation. + + + + + +**Configurable gas limits** allow the network to adapt to demand through +governance proposals, balancing throughput with +decentralization requirements. + +**Parallel execution potential** exists within the Cosmos SDK framework, enabling future optimizations as the network grows. + + + + + + **EIP-1559 gas management** provides predictable transaction fees with + automatic fee adjustment based on network demand. Users get the same fee + predictability they expect from modern Ethereum. + + **Fee token flexibility** allows transaction fees to be paid in TAC tokens, while still + supporting ETH-denominated gas calculations for contract compatibility. + + + + +## Developer Experience + +TAC EVM Layer maintains complete compatibility with the Ethereum development ecosystem while providing enhanced debugging and development capabilities. + +### Tool Compatibility + +Every tool in the Ethereum ecosystem works seamlessly with TAC EVM Layer: + + + + Hardhat, Truffle, Foundry, and Remix work without configuration changes. + Deploy scripts, test suites, and build processes transfer directly. + + + + MetaMask, WalletConnect, and other Web3 wallets connect by simply adding TAC + as a custom network. No special plugins required. + + + + + + Web3.js, Ethers.js, and Viem work exactly as they do with Ethereum. Contract + ABIs and interaction patterns remain identical. + + + + Block explorers, indexers, and monitoring tools designed for Ethereum can + index TAC EVM Layer with minimal configuration. + + + +## Gas and Fee Structure + +TAC EVM Layer implements familiar gas mechanics with improvements for predictability and efficiency. + +### EIP-1559 Implementation + +TAC EVM Layer uses EIP-1559 gas pricing for predictable transaction fees: + +```solidity +// Gas calculations work exactly like Ethereum +uint256 gasUsed = gasLimit - gasleft(); +uint256 effectiveGasPrice = baseFee + min(maxPriorityFee, maxFeePerGas - baseFee); +uint256 totalCost = gasUsed * effectiveGasPrice; +``` + +- **Base Fee**: Automatically adjusts based on network congestion, providing predictable pricing for users. + +- **Priority Fee**: Allows users to pay extra for faster inclusion during high-demand periods. + +- **Fee Burning**: A portion of transaction fees are burned, creating deflationary pressure on TAC tokens. diff --git a/why-tac/components/tac-sdk.mdx b/why-tac/components/tac-sdk.mdx new file mode 100644 index 0000000..fc026ad --- /dev/null +++ b/why-tac/components/tac-sdk.mdx @@ -0,0 +1,42 @@ +--- +title: TAC SDK +description: "TypeScript and Python library that enables frontend (and backend) developers to build **Hybrid dApps** +connecting TON wallets with EVM applications" +--- + +TAC SDK in Python now also available! + +The TAC SDK is a library that makes it simple for developers to create hybrid dApps. +It abstracts away the complexities of cross-chain messaging, allowing developers to focus on building great user experiences while the SDK handles wallet connections, +transaction routing, and asset bridging automatically. + +## What the SDK Solves + +Building hybrid dApps traditionally requires deep understanding of multiple blockchain protocols, cross-chain messaging systems, and complex asset management. + +The TAC SDK eliminates this complexity by providing a simple interface that handles all the technical details behind the scenes. + + + + + - Manual cross-chain message encoding + - Manual asset locking + - Manual transaction status tracking + - Manual error decoding + + + + + + - Single method for cross-chain transactions + - Automatic asset bridging + - Built-in TON wallet support + - Real-time status tracking + - Comprehensive error handling + + + + +## Learn More + +Get familiar with TAC SDK in the [related section](/sdk/overview). diff --git a/why-tac/components/ton-adapter.mdx b/why-tac/components/ton-adapter.mdx new file mode 100644 index 0000000..52a0522 --- /dev/null +++ b/why-tac/components/ton-adapter.mdx @@ -0,0 +1,112 @@ +--- +title: TON Adapter +description: "The distributed messaging system that securely connects TON and TAC EVM blockchains through sequencer consensus" +--- + + + **Current Network Status**: The sequencer network is currently distributed but + not decentralized. Full decentralization is on the roadmap as the network + matures. + + +The TON Adapter is the cross-chain messaging backbone of TAC, enabling secure communication between TON and TAC EVM Layer. +Unlike traditional bridges that simply move assets, the TON Adapter is designed specifically for application-level interactions, +allowing TON users to execute complex operations on EVM smart contracts seamlessly. + +TON Adapter is tied to the specific set of contracts on both TON and TAC EVM chains to perform its duty. + +### Core Functions + +The TON Adapter handles the following operations: + + + + - Transaction execution coordination + - TON and TAC EVM calls + - Value routing + + + + - Merkle tree formation + - Multi-group validation + - Economic security enforcement + + + +### Sequencer Network Architecture + + + + Each sequencer monitors both TON and TAC EVM for relevant events, + maintaining local databases of transactions and forming independent Merkle + trees. + + + + Sequencers organize into groups that must reach 3/5 internal consensus. Each + group validates transactions independently and stakes collateral as security. + + + + Multiple groups must submit identical Merkle trees to achieve network-wide + consensus. This creates multiple validation layers for maximum security. + + + + Once consensus is reached, transactions execute on the target chain with + cryptographic proof of validity. + + + +## Asset Management + +The TON Adapter handles two primary types of asset operations as tokens move between chains. + +### Lock and Mint Operations + +When assets need to be moved from one chain to another, the TON Adapter uses a lock-and-mint mechanism: + +- **Asset Locking**: Tokens are locked on their native chain to prevent double-spending while preserving the original asset. +- **Metadata Capture**: The system records key token details, including the name, symbol, decimals, and the original contract address. +- **Token Deployment**: If the token is crossing chains for the first time, the system automatically deploys the corresponding ERC-20 contract on TAC EVM and Jetton contract on TON. +- **Token Minting**: An equivalent amount of tokens is minted on the destination chain to keep supply consistent across both networks. + +### Burn and Release Operations + +When assets move back, the reverse flow applies: + +- **Asset Burning**: ERC-20/Jetton tokens are burned, removing them from circulation on a particular chain. +- **Validation**: Sequencers verify the burn. +- **Asset Release**: The previously locked tokens are released. + +### Failure Protection + +- **Automatic Rollbacks**: If a transaction fails on the target chain, assets are automatically returned to the sender. + +- **Failed Transaction Collection**: Failed transactions are processed through the same consensus mechanism to ensure proper resolution. + +## Performance Characteristics + +The TON Adapter is designed to balance security with reasonable performance for application-level interactions. + + + + Cross-chain transactions typically complete **within 1-3 minutes**. + The exact timing depends on the number of + sequencer groups participating in consensus and the current cross-chain activity. + + + + The system can handle **hundreds of cross-chain messages per minute**. + Each transaction will be finalized but the delay of up to **10 minutes** may be introduced under the peak cross-chain activity. + + + + Cross-chain operations require gas fees on both chains plus sequencer fees + for the messaging service. However, the cost remains reasonable (about `0.05 - 0.20 TON`) for + transactions like token swaps (TON->TAC->TON type). + + The distributed nature of sequencer operations helps keep fees competitive while maintaining + security guarantees. + + diff --git a/why-tac/cross-chain-operations/asset-bridging.mdx b/why-tac/cross-chain-operations/asset-bridging.mdx new file mode 100644 index 0000000..a3e49a7 --- /dev/null +++ b/why-tac/cross-chain-operations/asset-bridging.mdx @@ -0,0 +1,283 @@ +--- +title: Asset Bridging +description: "How tokens and assets move securely between TON and TAC EVM through lock-mint and burn-release mechanisms" +--- + +Asset bridging in TAC enables tokens to move seamlessly between TON and TAC EVM while preserving supply integrity and user ownership. + +Unlike traditional bridges that mint wrapped tokens, TAC’s bridging system is designed specifically for application-level interactions, where assets effectively remain the same as they move across chains. + +Check out the official **Bridge app** for both Mainnet and Testnet [here](/ecosystem/bridge) + +## Core Bridging Principles + +TAC's asset bridging system operates on fundamental principles that ensure security, maintain token economics, and provide seamless user experience. + +### Supply Conservation + +- **Total Supply Integrity**: The combined supply of a token across both TON and TAC EVM always equals the original supply. When tokens are locked on one chain, equivalent amounts are minted on the other chain, maintaining perfect balance. + +- **Provable Reserves**: All locked tokens are held in verifiable smart contracts where their existence can be independently confirmed by anyone. + +- **Atomic Operations**: Asset locking, minting, burning, and releasing operations occur atomically within the same cross-chain transaction, preventing inconsistent states. + +## Token Types and Handling + +Different types of assets require specialized handling to ensure proper representation and functionality across both chains. + + + Users can even bridge **multiple assets** in a single cross-chain transaction + (e.g., native TON, jettons and NFTs - with no limit!). + + +### TON Native Assets + + + + - **Jetton Bridging**: TON jettons (fungible tokens) like `USDT` are the most common bridged assets. When first crossing to TAC EVM, the system automatically deploys corresponding ERC-20 contracts. + + - **Address Mapping**: Deterministic mapping between ERC-20 addresses and their corresponding TON jettons. + + - **Metadata Preservation**: Token name, symbol, decimals, and additional metadata are captured from the TON side and replicated in the EVM contract. + + + + - **NFT Collection**: A TON NFT collection will be represented as an familiar ERC-721 collection on TAC EVM. + + - **Single NFT**: In TON NFT may not belong to a collection, but its mirrored version on TAC EVM will be part of a collection as EVM nature requires it. + + - **Metadata Preservation**: NFT metadata will be mirrored to TAC EVM. + + + + - **TON Token Handling**: Native TON tokens receive special treatment as they don't have a traditional contract address on the TON side. + + - **Wrapped Representation**: On TAC EVM, native TON is represented as a wrapped token (similar to WETH on Ethereum) with standard ERC-20 functionality. + + + +### TAC EVM Native Assets + + + + - **Token Bridging**: Tokens originally created on TAC EVM can also be bridged to TON, creating jetton representations on the TON side. + + - **Address Mapping**: Deterministic mapping between ERC-20 addresses and their corresponding TON jettons. + + - **Metadata Preservation**: Token name, symbol, decimals, and additional metadata are captured from the EVM side and replicated in the TON contract. + + + + - **NFT Collection**: An EVM NFT collection will be represented as an NFT collection on TON. + + - **Metadata Preservation**: NFT metadata will be mirrored to TON. + + + + - **TAC Token Handling**: Native TAC tokens also don’t have a contract address on the TAC side. + + - **Wrapped Representation**: Native TAC tokens are represented as jettons (fungible tokens) in TON. + + + +Applications can query the token registry to find corresponding addresses without needing to calculate them. +Refer to TAC SDK's methods [`getTVMTokenAddress`](https://gitlab.com/ton-app-chain/tac/tac-sdk/-/blob/develop/docs/sdks/tac_sdk.md#gettvmtokenaddress) +and [`getEVMTokenAddress`](https://gitlab.com/ton-app-chain/tac/tac-sdk/-/blob/develop/docs/sdks/tac_sdk.md#getevmtokenaddress) + +A few common tokens and their counterparts are listed on [this page](/ecosystem/token-list). + +## Token Address Mapping + +Understanding and working with cross-chain token addresses: + + + Code samples below use TypeScript [TAC SDK](/sdk/overview) + + +### FT Address Resolution + +```javascript +// Get EVM equivalent of TON token +const getEvmTokenAddress = async (tonTokenAddress) => { + try { + const evmAddress = await tacSdk.getEVMTokenAddress(tonTokenAddress); + console.log(`TON token ${tonTokenAddress} maps to EVM token ${evmAddress}`); + return evmAddress; + } catch (error) { + console.error("Token mapping failed:", error); + return null; + } +}; + +// Reverse mapping: EVM to TON +const getTonTokenAddress = async (evmTokenAddress) => { + try { + const tonAddress = await tacSdk.getTVMTokenAddress(evmTokenAddress); + console.log(`EVM token ${evmTokenAddress} maps to TON token ${tonAddress}`); + return tonAddress; + } catch (error) { + console.error("Reverse token mapping failed:", error); + return null; + } +}; +``` + +### NFT Address Resolution + + + NFT item is always a part of a collection in EVM + + +```javascript +// Get EVM NFT collection from TON NFT collection +const getEvmNftCollectionAddress = async (tonNftCollectionAddress, tvmNftItemIndex) => { + const NFT = await tacSdk.getNFT( + address: tonNftCollectionAddress, + tokenType: AssetType.NFT, + addressType: NFTAddressType.COLLECTION, + index: tvmNftItemIndex, + ); + return NFT.getEVMAddress(); +}; + +// Reverse +const getTonNftCollectionAddress = async (evmCollectionAddress, evmNftItemIndex) => { + const NFT = await tacSdk.getNFT( + address: evmCollectionAddress, + tokenType: AssetType.NFT, + addressType: NFTAddressType.COLLECTION, + index: evmNftItemIndex, + ); + return NFT.getTVMAddress(); +}; + +// Get EVM NFT collection from TON NFT single item +const getEvmNftItemAddress = async (tonNftItemAddress) => { + const NFT = await tacSdk.getNFT( + address: tonNftItemAddress, + tokenType: AssetType.NFT, + addressType: NFTAddressType.ITEM, + ); + return NFT.getEVMAddress(); +}; +``` + +## FT Balance + +To query user FT balance use `getUserJettonBalance` and `getUserJettonBalanceExtended`: + +```javascript +const getUserAssetBalances = async (userAddress) => { + // Get jetton balance (basic) + const jettonBalance = await tacSdk.getUserJettonBalance( + userAddress, + jettonMasterAddress + ); + console.log("Raw jetton balance:", jettonBalance.toString()); + + // Get jetton balance (extended with metadata) + const extendedBalance = await tacSdk.getUserJettonBalanceExtended( + userAddress, + jettonMasterAddress + ); + + console.log("Balance Details:"); + console.log("- Raw amount:", extendedBalance.rawAmount.toString()); + console.log("- Decimals:", extendedBalance.decimals); + console.log("- Human readable:", extendedBalance.amount); + console.log("- Symbol:", extendedBalance.symbol); + console.log("- Name:", extendedBalance.name); + + return extendedBalance; +}; +``` + +### Jetton Wallet Management + + + Each FT (jetton) in TON has a master address, + and each individual wallet has its own address associated with that master + (`UserJettonWalletAddress`). + The latter is created automatically when an individual wallet is funded with a specific jetton for the first time + + +```javascript +const getJettonWalletInfo = async (userAddress, jettonMasterAddress) => { + // Get user's jetton wallet address + const jettonWalletAddress = await tacSdk.getUserJettonWalletAddress( + userAddress, + jettonMasterAddress + ); + + console.log("Jetton wallet address:", jettonWalletAddress); + + // Check if wallet exists and is deployed + const isDeployed = await tacSdk.isContractDeployedOnTVM(jettonWalletAddress); + console.log("Wallet deployed:", isDeployed); + + return { + address: jettonWalletAddress, + deployed: isDeployed, + }; +}; +``` + +## Decimal and Precision Handling + +Different blockchain ecosystems use different decimal standards, requiring careful handling to maintain precision and user experience. + +### Decimal Standards + + +
+ **TON Standard**: TON jettons typically use 9 decimals, following the + platform's conventions for token precision. +
+ +
+ **EVM Standard**: Ethereum and EVM chains commonly use 18 decimals, + providing higher precision for complex DeFi operations. +
+
+ +### Precision Management + +- **Preservation**: When TON tokens (9 decimals) bridge to TAC EVM, they maintain their 9 decimal precision rather than being artificially inflated to 18 decimals. + +- **Compatibility**: TAC EVM supports tokens with various decimal counts, ensuring that bridged tokens work correctly with existing DeFi protocols. + E.g., the `USDT` has 6 decimal places on both TON and TAC EVM. + +- **Dev Tools**: **TAC SDK** provides [means](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/tac_sdk.md#getuserjettonbalanceextended) to get decimals for a specific token. + +## Liquidity Management + +Asset bridging enables sophisticated liquidity management strategies that benefit both ecosystems. + +### Example: DEX Liquidity + +When users provide liquidity to a DEX on TAC EVM using TON-origin tokens: + + + + TON tokens are automatically bridged to TAC EVM as part of the liquidity + provision transaction. + + + + Bridged tokens are added to the DEX liquidity pool, creating trading + opportunities for both TON and EVM users. + + + + Users receive LP tokens representing their share of the pool, which can be + used on either chain. + + + + The same liquidity serves traders from both ecosystems, maximizing + utilization and fee generation. + + + +Reverse process applies while removing liquidity from the DEX. +LP tokens can be burned to get the initial tokens back from the pool. diff --git a/core-concepts/cross-chain-operations/cross-chain-messaging.mdx b/why-tac/cross-chain-operations/cross-chain-messaging.mdx similarity index 52% rename from core-concepts/cross-chain-operations/cross-chain-messaging.mdx rename to why-tac/cross-chain-operations/cross-chain-messaging.mdx index 5939ef1..d8930e7 100644 --- a/core-concepts/cross-chain-operations/cross-chain-messaging.mdx +++ b/why-tac/cross-chain-operations/cross-chain-messaging.mdx @@ -5,27 +5,14 @@ description: "How messages flow securely between TON and TAC EVM through the TON Cross-chain messaging is the foundation of TAC's hybrid dApp functionality. It enables secure communication between TON users and EVM smart contracts through a structured system of message creation, validation, and execution. Understanding this messaging system helps developers build more effective applications and troubleshoot issues when they arise. - - **Current Network Status**: The sequencer network is currently distributed but - not decentralized. Full decentralization is on the roadmap as the network - matures. - - ## Message Lifecycle Overview Every cross-chain operation in TAC follows a predictable lifecycle that ensures security and reliability while maintaining reasonable performance for application use cases. - - Cross-chain messaging lifecycle diagram - - User initiates an action in a hybrid dApp, triggering the creation of a - structured cross-chain message containing operation details and asset + structured cross-chain message (usually done automatically via TAC SDK) containing operation details and asset information. @@ -56,7 +43,8 @@ Cross-chain messages contain all the information needed for secure validation an ### Core Message Components -Every message includes essential metadata and operation-specific data: +Every message includes essential metadata and operation-specific data. +The json example below is not a comprehensive structure but rather a general idea: ```javascript { @@ -82,10 +70,12 @@ The TON Adapter automatically augments messages with additional metadata that pr - **operationId**: Unique identifier generated by TAC infrastructure for tracking and validation purposes. -- **tvmCaller**: The TON user's wallet address that initiated the cross-chain operation. +- **caller**: The user's wallet address that initiated the cross-chain operation. - **extraData**: Additional data provided by sequencers during execution, typically empty but available for special use cases. +For the detailed header info please refer to the SDK's docs [here](/why-tac/cross-chain-operations/cross-chain-messaging#tac-header-fields). + ### Parameter Encoding @@ -111,8 +101,6 @@ The TON Adapter employs multiple layers of validation to ensure message integrit - **Transfer Validation**: Sequencers verify that actual token transfers match the amounts specified in cross-chain messages. This prevents attempts to claim false transfer amounts or access unauthorized funds. -- **Balance Checking**: User balances are validated against requested operations to ensure sufficient assets are available for the intended operation. - - **Metadata Consistency**: Token information and operation parameters are cross-referenced to ensure consistency throughout the validation process. ### Cryptographic Validation @@ -172,13 +160,19 @@ EpochId = (currentTime - protocolDeployTime) / epochDuration Different types of cross-chain operations follow distinct patterns that affect how messages are structured and processed. -### One-Way Messages (TON → TAC) +### One-Way Messages (TON → TAC and TAC → TON) - **Simple Operations**: Basic token transfers, contract calls that don't require return values, or operations where results remain on the EVM side. -- **Message Flow**: TON user → TON Adapter → Sequencer validation → EVM execution → Completion notification. +- **Message Flow**: TON or TAC EVM user → TON Adapter → Sequencer validation → TON or TAC EVM execution → Completion notification. + +- **Use Cases**: Token bridges and deposits, simple contract interactions, or operations where users only need confirmation of completion. + +- **Usage**: + + TAC → TON: [`bridgeTokensToTON`](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/tac_sdk.md#bridgetokenstoton) in SDK -- **Use Cases**: Token deposits, simple contract interactions, or operations where users only need confirmation of completion. + TON → TAC: [`sendCrossChainTransaction`](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/tac_sdk.md#sendcrosschaintransaction) in SDK ### Round-Trip Messages (TON → TAC → TON) @@ -187,149 +181,17 @@ Different types of cross-chain operations follow distinct patterns that affect h - **Extended Flow**: Includes an additional return path where EVM proxy contracts create new messages to send results back through the TON Adapter. - **Use Cases**: Token swaps, liquidity operations, or any interaction where users expect to receive different assets or data back. +- **Usage**: + + TON → TAC → TON: [`sendCrossChainTransaction`](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/tac_sdk.md#sendcrosschaintransaction) in SDK ### Rollback Operations - + When operations fail on the target chain, TAC automatically initiates rollback procedures to protect user assets. - + - **Automatic Triggers**: Failed executions on either chain automatically trigger rollback message creation to return assets safely. - **Asset Protection**: Rollback messages ensure that locked or transferred assets are returned to users when operations cannot complete successfully. - -- **Special Processing**: Rollback messages receive priority processing to minimize the time users wait for asset recovery. - -## Error Handling and Recovery - -TAC's messaging system includes comprehensive error handling mechanisms that protect user assets and provide clear feedback about operation status. - -### Failure Detection - -**Execution Monitoring**: The system continuously monitors message execution on target chains and detects various types of failures. - -**Timeout Handling**: Messages that don't complete within expected timeframes trigger automatic timeout procedures. - -**Validation Failures**: Messages that fail validation at any stage are rejected before execution to prevent resource waste. - -### Recovery Mechanisms - - - - When transactions fail after asset transfers have occurred, the system - automatically creates rollback messages to return assets to their original - owners. This process uses the same consensus mechanisms as regular messages, - ensuring that rollbacks are secure and verifiable. - - - - Failed transactions are collected into special Merkle trees and processed - through the consensus system to ensure proper resolution. This systematic - approach prevents failed transactions from being lost or forgotten while - maintaining the same security standards. - - - - Comprehensive status reporting allows applications to detect failures - quickly and provide users with clear information about what happened and - what to expect. Status information includes failure reasons when available, - helping users understand issues and potential resolution steps. - - - -## Message Security Guarantees - -The cross-chain messaging system provides strong security guarantees through multiple redundant mechanisms. - -### Economic Security - -- **Stake Requirements**: Sequencers must stake significant collateral to participate in message validation, creating strong financial incentives for honest behavior. - -- **Slashing Mechanisms**: Provably incorrect behavior results in automatic collateral slashing, making attacks economically unattractive. - -- **Reward Alignment**: Performance-based rewards encourage reliable operation and continued network participation. - -### Technical Security - -- **Consensus Thresholds**: High consensus requirements (3/5 within groups, multiple groups for network consensus) make coordination attacks extremely difficult. - -- **Cryptographic Verification**: Merkle proofs and digital signatures provide mathematical guarantees of message integrity and authenticity. - -- **Redundant Validation**: Multiple independent parties validate each message, preventing single points of failure or manipulation. - -## Performance Characteristics - -Understanding the performance characteristics of cross-chain messaging helps developers set appropriate expectations and design better user experiences. - - - - -- **Typical Processing Time**: Most messages complete within minutes rather - than hours, depending on epoch duration and network conditions. - -- **Factors Affecting Speed**: Epoch timing, consensus participation levels, and target - chain congestion all influence processing speed. - - - - - - - **Batch Processing**: The epoch-based system can handle hundreds of messages per processing window. - - - **Scalability**: Throughput scales with shorter epochs and increased sequencer participation. - - - - -## Best Practices for Developers - - - - - - **Keep Parameters Simple**: Complex nested structures increase encoding size - and processing time. Use flat structures when possible. - - **Validate Inputs**: Perform client-side validation before creating cross-chain messages to - prevent obvious failures. - - **Handle Timeouts**: Design applications to handle messages that take longer than expected to process. - - - - - -- **Set Expectations**: Inform users that cross-chain operations take longer - than single-chain transactions. -- **Provide Status Updates**: Use the operation tracking tools to keep users informed about message progress. -- **Handle Failures Gracefully**: Implement proper error handling that explains what happened and what users should expect. - - - - - - **Test Failure Scenarios**: Ensure your application handles various failure - modes appropriately. - - **Validate Rollbacks**: Confirm that failed operations properly return assets to users. - - **Monitor Performance**: Track message processing times and success rates in your applications. - - - - -## What's Next? - -Understanding cross-chain messaging and fee structures provides the foundation for exploring specific operational aspects of TAC's hybrid dApp system. - - - - Learn how tokens and assets move securely between chains - - - Dive deeper into the complete transaction processing flow - - diff --git a/why-tac/cross-chain-operations/transaction-lifecycle.mdx b/why-tac/cross-chain-operations/transaction-lifecycle.mdx new file mode 100644 index 0000000..bd17aec --- /dev/null +++ b/why-tac/cross-chain-operations/transaction-lifecycle.mdx @@ -0,0 +1,136 @@ +--- +title: Transaction Lifecycle +description: "Complete journey of cross-chain transactions from user initiation to final execution and confirmation" +--- + +The transaction lifecycle in TAC represents the complete journey of a cross-chain operation from initial user action to final confirmation. Understanding this lifecycle helps developers build better applications, implement proper status tracking, and troubleshoot issues effectively. + +## Transaction Type + +Three transation types are supported: + + + + Swaps, adding and removing liquidity, + withdrawing from dApp + + + + Depositing to dApp, bridging assets + + + + Bridging assets + + + +## Stage Progression + +Cross-chain transactions progress through specific stages that can be monitored and tracked for status updates. +Below is an example for **TON->TAC** transaction type: + + + + - **Detection**: Sequencers detect the cross-chain event and store transaction details in their local databases for validation. + + - **Validation**: Each sequencer independently validates the transaction parameters, asset transfers, and user authorization. + + + + - **Merkle Tree Formation**: Sequencers compile validated transactions into Merkle trees at the end of each epoch period. + + - **Consensus**: Sequencer groups work to achieve 3/5 internal agreement on their Merkle tree root hashes and executor selection. + + - **Network Submission**: Successfully agreed-upon tree is submitted to TAC EVM. + + + + - **Detection**: Selected executor detects the submitted on-chain Merkle Tree root. + + - **Verification**: Selected executor verifies the root against the transaction info from its internal database. + + - **Asset Operations**: Required token minting or unlocking operations are performed. + + - **Proxy Call**: The EVM proxy contract is called with properly formatted parameters and bridged assets. + + - **Execution**: Proxy forwards formatted parameters and bridged assets to the target EVM dApp contract. + + + +For the **TAC->TON** transaction type, the above stages are mirrored. + +For operations that send results back to TON (**TON->TAC->TON** transaction type) the flow continues: + + + + - **Return Message Creation**: dApp on EVM side creates return messages containing results or assets to send back to TON and sends them back to Proxy. + + - **Proxy Call**: Proxy forwards the message and assets to the EVM Cross-Chain Layer contract. + + - **Detection**: The same sequencer network detects return messages and begins validation for the reverse journey. + + + + - **Consensus**: Return messages go through the same consensus process as initial messages. + + - **Network Submission**: Successfully agreed-upon tree is submitted to TON. + + + + - **Detection**: Selected executor detects the submitted on-chain Merkle Tree root. + + - **Verification**: Selected executor verifies the root against the transaction info from its internal database. + + - **Asset Operations**: Required token minting or unlocking operations are performed. + + - **Execution**: Return messages are executed on TON, delivering results or assets back to the original user. + + + +## Simplified Operation Status + +You don’t need to know the exact flow an operation goes through. +If you only want to know whether it is already executed or still being processed, +use the [simplified statuses](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/operation_tracker.md#getsimplifiedoperationstatus) from the TAC SDK. + + + + The transaction has been sent and is being processed by the TON Adapter (sequencer network). + + + The transaction is in progress. + + + Everything is fine! + + + The transaction on TAC EVM failed, and there were no attached assets to roll back. + + + The transaction on TAC EVM failed, and the assets locked on TON were refunded to the original owner. + + + This usually happens when manually customizing transaction fees using SDK. In most cases, the default fee is enough. + + + +## Monitoring and Debugging + +### Real-Time Monitoring + +Applications can implement real-time monitoring features from **TAC SDK** to provide users with live updates via [`startTracking`](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/utilities.md#starttracking) feature: + +```javascript +const transactionLinker = await tacSdk.sendCrossChainTransaction( + evmProxyMsg, // What to call on EVM + sender, // TON wallet + assets // Tokens to bridge +); +await tacSdk.startTracking(transactionLinker); +``` + +### Debugging Transactions + +- **Status**: Status info and error message if any. Learn more in SDK's docs [related section](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/operation_tracker.md#getsimplifiedoperationstatus). + +- **Stage Profiling**: Detailed info about every stage. Learn more in SDK's docs [related section](https://github.com/TacBuild/tac-sdk/blob/main/docs/sdks/operation_tracker.md#getstageprofiling). diff --git a/why-tac/overview/architecture.mdx b/why-tac/overview/architecture.mdx new file mode 100644 index 0000000..112e8b2 --- /dev/null +++ b/why-tac/overview/architecture.mdx @@ -0,0 +1,39 @@ +--- +title: Architecture +description: "How TAC's three-layer architecture enables seamless interaction between TON and EVM ecosystems" +--- + +TAC's architecture is designed to support secure and deterministic cross-chain communication while preserving native user experience on the TON side. The protocol relies on on-chain consensus to execute contract-level operations across both networks. + + + TAC Architecture showing EVM Layer, TON Adapter, and Proxy Apps + + +## Main Layers + + + + TAC SDK dev tools to prepare and initiate cross-chain transaction in TON + + + + Distributed sequencer network that securely routes messages between TON and EVM. + + + Full EVM compatibility with Cosmos SDK. Handles all application logic and state. + + +## Secondary Layers + + + + Applications that combine EVM smart contract logic with native Telegram user experience + + + + Interface layer to access your EVM dApp from TON + + diff --git a/why-tac/overview/security.mdx b/why-tac/overview/security.mdx new file mode 100644 index 0000000..9a7f189 --- /dev/null +++ b/why-tac/overview/security.mdx @@ -0,0 +1,195 @@ +--- +title: Security +--- + +TAC implements a comprehensive security framework with multiple layers of protection, professional audits, and continuous monitoring to ensure the safety of hybrid dApps and user assets. + +## Multi-Layer Security Architecture + +TAC's security model operates across multiple layers to provide comprehensive protection for users and applications. + +### TON Adapter Security + +The TON Adapter implements distributed architecture with multiple validation layers: + + + + **Current State**: TON Adapter operates with distributed sequencer groups + providing redundancy. + + **Future Decentralization**: Architecture designed for progressive decentralization as the network matures. + + + + **Multi-Group Validation**: Cross-chain messages require consensus from + multiple independent sequencer groups. + + **Economic Stakes**: Sequencers stake collateral to participate in validation, creating financial incentives for + honest behavior. + + **Cryptographic Proofs**: All cross-chain operations protected by Merkle proofs and cryptographic verification. + + + + **Asset refund**: Automatic refund of locked assets if cross-chain transaction fails for any reason. + + + +It also provides economic security: + + + **Every sequencer group must stake collateral:** + + - Minimum stake set by DAO governance + - Higher stakes earn proportionally higher rewards + - Stake must remain above threshold during participation + - Partial stake locking during proof submission + + + + + **Performance-based incentives:** + + - Rewards distributed proportionally to stake size + - Executor selection based on collateral weight + - Commission sharing within groups + - Penalty mechanisms for incorrect operations + + + + + **Democratic group selection:** + + - New groups approved through DAO voting + - Regular election cycles (DAO configurable) + - Performance monitoring and rating systems + - Penalty applications and network-wide voting + + + +### EVM Layer Security + +TAC EVM undergoes comprehensive security audits by industry-leading firms to ensure the highest security standards. +You can review the completed ones on [this page](/audit/overview). +New reports will appear as the protocol evolves and new features are added. + + + + **Modern EVM Implementation**: TAC EVM is based on the Cancun upgrade, + incorporating the latest Ethereum security improvements and optimizations. + + **Proven Technology**: Built on battle-tested EVM specifications with all + security features and protections of modern Ethereum networks. + + **Standard Compliance**: Full compatibility with Ethereum security models ensures + familiar security guarantees for developers. + + + + **TAC Token Security**: Network consensus secured by delegated Proof of Stake + using $TAC tokens as the staking mechanism. + + **Validator Incentives**: Economic incentives align validator behavior with network security through staking + rewards and slashing penalties. + + **Distributed Validation**: Multiple independent validators secure the network through distributed consensus + mechanisms. + + + +## Continuous Monitoring + +TAC implements 24/7 security monitoring and incident response capabilities to detect and respond to potential threats. + +### Real-Time Threat Detection + + + + + **24/7 Security Monitoring**: Hypernative provides continuous monitoring of + TAC networks, detecting potential exploits and anomalous behavior. + + **Mempool-Level Detection**: Advanced monitoring capabilities detect + suspicious transactions at the mempool level before they're executed. + + **Real-Time Alerts**: Immediate notifications for potential security threats + enable rapid response and mitigation. + + + + + + **24/7 Security Operations**: Fully dedicated Security Operations Center + (SOC) team monitoring TAC infrastructure around the clock. + + **Incident Response**: Trained security professionals ready to respond to any security + incidents or threats. + + **Proactive Monitoring**: Continuous analysis of network activity and security metrics to identify potential issues before + they become problems. + + + + +## Future Enhancements + +TAC has planned significant security upgrades that will provide additional layers of protection and decentralization. + +### 1. FROST Consensus Upgrade + +Already live on TAC Testnet! + +Planned migration to **FROST-Ed25519** threshold signatures with Distributed Key Generation (DKG). + + + + **Enhanced Cryptographic Security:** + + - Threshold signature creation requires `t+1` out of `n` participants + - Attackers controlling up to `t` participants cannot forge signatures + - **Ed25519** compatibility with existing verification systems + - Round-optimized design minimizes communication overhead + + + + **Decentralized Key Management:** + + - Dealerless key generation - no single party knows complete secret + - High threshold support `(k > n/2)` for enhanced security + - Feldman VSS with verifiable encrypted shares + - Complaint handling without secret disclosure + + + +### 2. Babylon Bitcoin Restaking Integration + +TAC plans integration with Babylon's Bitcoin restaking protocol to add massive economic security: + + + + **Leveraging Bitcoin's Economic Strength:** + + - Bitcoin holders delegate BTC stakes to Babylon validators + - Validators cryptographically verify TAC EVM blocks and Merkle roots + - Self-custodial delegation maintains decentralization without custody risk + - Exponentially increases attack costs through Bitcoin's security budget + + + + **Economic Penalties for Malicious Behavior:** + + - Validators providing conflicting signatures face automatic slashing + - Double-signing detection through Babylon protocol mechanisms + - Direct economic penalties via Bitcoin blockchain enforcement + - Makes attacks economically irrational at Bitcoin-scale security + + + +## Bug Bounty Program + +Bug bounty program is live! + +**Reward Security Research**: We are ready to reward security researchers for discovering vulnerabilities. +Reach out to our [Discord](https://discord.gg/tacbuild). + +**Responsible Disclosure**: Clear processes for responsible vulnerability disclosure and coordinated fixes. diff --git a/why-tac/overview/what-is-tac.mdx b/why-tac/overview/what-is-tac.mdx new file mode 100644 index 0000000..5aca69b --- /dev/null +++ b/why-tac/overview/what-is-tac.mdx @@ -0,0 +1,161 @@ +--- +title: What is TAC +description: "TAC bridges TON's 1 billion users with EVM's application ecosystem" +--- + +TAC is an **EVM for Telegram**: a Layer 1 with a TON-specific Cross-Chain Layer that connects Ethereum dApps and developers with Telegram's users without exposing users to bridges, extra wallets, or wrapped assets. TAC eliminates the gap between TON's billion-user reach and EVM's programmability through **Hybrid dApps** - EVM dApps natively accessible by any TON wallet holder. + +## The Problem TAC Solves + + + +
+ **Challenge**: Reaching TON's billion users requires rebuilding entire + applications in FunC, TON's native language.

+ + **TAC Solution**: Deploy + existing Solidity contracts as-is and make them accessible to TON users +
+ + +
+ **Challenge**: Limited access to DeFi, gaming, and other EVM applications + that dominate the blockchain space.

+ **TAC Solution**: Use any EVM application directly from TON wallets without bridges or multiple wallets +
+
+ +The world's largest developer community meets the largest user base + +## How TAC Works + +TAC operates through the following elements that work together seamlessly: + + + A frontend that implements **TAC SDK** under the hood and the corresponding set of dApp Solidity contracts deployed on **TAC EVM Layer**. + + + + A handy TypeScript and Python library implemented within **Hybrid dApp** that enables developers to connect TON wallets with EVM applications. + + + +A distributed network of **sequencers** that securely routes messages between TON and TAC EVM: + +- **Validation**: Sequencers verify all transactions and asset transfers +- **Consensus**: 3/5 sequencer consensus with BFT guarantees +- **Security**: Multiple validation layers prevent double-spending and fraud + +This isn't a traditional bridge — it's a purpose-built messaging system designed for hybrid applications. + + + **Current Network Status**: The sequencer network is currently distributed but not decentralized. Full decentralization is on the roadmap as the network matures. + + + + + + TAC EVM Layer 1 is a CosmosSDK-based blockchain that runs unmodified Solidity contracts and achieves **≈2-second finality** through dPoS. This means: + + - Deploy existing Solidity contracts without modifications + - Use familiar tools like Hardhat, Remix, and MetaMask + - Built on proven Cosmos SDK with Tendermint consensus + - Secured by delegated Proof of Stake with economic incentives + + The EVM layer handles all application logic and state, while the TON Adapter manages cross-chain communication. + + + +Specialized Solidity contracts that make cross-chain interaction feel native. +On the TAC EVM they receive, decode and forward cross-chain messages to the target EVM contracts. + +[Agnostic Proxy](/sdk/advanced-custom-proxy/agnostic-proxy) beta feature allowing for skipping TAC Proxies entirely is already available within TAC SDK + + + +## Key Benefits + + + + ### Deploy Once, Reach Billions + + - **No code rewrites**: Deploy existing Solidity contracts directly + - **Familiar tooling**: Use Hardhat, Truffle, Remix, and other EVM tools + - **Hybrid dApp conversion**: Every deployment becomes a Hybrid dApp accessible from TON + - **Cross-chain SDK**: User-friendly TypeScript library handles TON integration + - **Telegram MiniApps**: Bring EVM-powered logic directly inside Telegram. No need for Google Play/App Store installments + + + + + ### Native TON Experience + - **One wallet**: Use your TON wallet for everything + - **No bridges**: Assets move automatically behind the scenes + - **Familiar UX**: Apps feel native to TON environment + - **Telegram integration**: Access apps directly through Telegram Mini Apps without learning new workflows + + + + ### Unified Liquidity - **Cross-chain composability**: + + TON and EVM applications can interact + - **Shared liquidity**: Tokens flow freely between ecosystems + - **Network effects**: More users attract more developers and vice versa + - **Innovation acceleration**: Best of both worlds drives faster development + + + +## Transaction Flow Example + +Here's what happens when a TON user swaps tokens on an EVM DEX through TAC's hybrid dApp system (like [Curve](https://t.me/CurveAppBot)): + + + + User opens a DEX interface, connects his/her TON wallet, and selects token to swap. + + + + The TAC SDK implemented within DEX frontend conveniently encodes required EVM calldata for the upcoming swap on the TAC blockchain + and brings up the prepared transaction for user to approve. + + + + User approves the transaction. + + + + The TON adapter receives user's assets and safely locks them on TON. + + + + Sequencer network finds and validates the transaction, forms Merkle trees, reaches + consensus, and selects the executor. The final decision in set within the TAC blockchain. + + + + A designated executor finds the transaction to execute, validates its Merkle proof, triggers asset + minting/unlocking, and calls the swap on the target DEX contract on TAC. + + + + Swap completes and new tokens are sent back to the user's TON wallet through + the similar secure process. + + + +## What Makes TAC Different + + + TAC is not a cross-chain workaround — it is a native execution path between + two ecosystems that were never meant to connect. By removing barriers instead + of building over them, TAC aligns UX, liquidity, and developer incentives. + + +Unlike traditional bridges that move assets between existing chains, TAC creates **hybrid applications** that natively serve both ecosystems. Users don't "bridge to another chain" — they use applications that happen to run on EVM but feel completely native to TON. + +This fundamental difference enables: + +- **Seamless UX**: No wallet switching or manual bridging +- **Unified liquidity**: Assets flow where they're needed most +- **Developer efficiency**: Build once, serve both ecosystems +- **Network effects**: Growth in one ecosystem benefits the other