@layerzerolabs/ton-sdk-tools 3.0.18-ton.2 → 3.0.19-ton.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -46
- package/dist/index.cjs +116 -374
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +11 -28
- package/dist/index.d.ts +11 -28
- package/dist/index.mjs +112 -370
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -8
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/sdk-tools.ts","../src/base-wrapper.ts","../src/test-tools.ts","../src/externalWrappers/Multisig-Constants.ts","../src/externalWrappers/Multisig.ts","../src/externalWrappers/Order.ts","../src/externalWrappers/multisig-utils.ts","../src/externalWrappers/jetton-helpers.ts","../src/externalWrappers/jetton-minter.ts","../src/externalWrappers/jetton-wallet.ts","../src/printTransactionTrace.ts"],"names":["Cell","crc32","beginCell","Address","toBigIntBE","toBufferBE","str","fs","path","key","name","SendMode","Dictionary","contractAddress","toNano","arrayToCell","cellToArray","randomAddress","compareTransaction","flattenTransaction","extractEvents","Sha256","fs3"],"mappings":"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AA,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.cjs","sourcesContent":["import { Address, Builder, Cell, ContractProvider, Sender, SenderArguments, beginCell } from '@ton/core'\nimport { toBigIntBE, toBufferBE } from 'bigint-buffer'\nimport * as crc32 from 'crc-32'\n\n/**\n * Wraps a blueprint-like artifact in a `Cell`. The constrains on the input type are loosened\n * and only the `hex` property is made required.\n *\n * @param artifact Blueprint JSON artifact object\n * @returns {Cell}\n */\nexport const cellFromArtifact = ({ hex }: { hex: string; hash?: string; hashBase64?: string }): Cell =>\n Cell.fromHex(hex)\n\n// ------------- Testing utils for Lz Ton Packet encoding/decoding -----------\n\nexport function getOpcodeCRC(input: string): bigint {\n return BigInt(crc32.str(input) >>> 0) // Ensure the result is unsigned and convert to bigint\n}\n\nexport const MASTER_CHAIN_ID = -1\nexport const BASE_CHAIN_ID = 0\nexport const MASTER_CHAIN_SHARD = '8000000000000000'\n\n// TODO optimize by using ncl?\nexport function randomQueryId(): number {\n return Math.floor(Math.random() * 100000000000)\n}\n\nexport function beginMessage(opcode: number | bigint, queryId?: number | bigint): Builder {\n return beginCell()\n .storeUint(opcode, 32)\n .storeUint(queryId ?? randomQueryId(), 64)\n}\n\nexport async function sendRequest(provider: ContractProvider, via: Sender, request: SenderArguments): Promise<void> {\n return provider.internal(via, {\n value: request.value,\n sendMode: request.sendMode ?? undefined,\n body: request.body,\n bounce: request.bounce,\n })\n}\n\nexport function bigintToAddress(value: bigint): Address {\n const buf = to32ByteBuffer(value)\n return Address.parse(`0:${buf.toString('hex')}`)\n}\n\nexport const addressToBigInt = (address: Address): bigint => {\n return BigInt('0x' + address.hash.toString('hex'))\n}\n\n/**\n * Convert a value to a 32 byte buffer, if the value is a string, it can only be a hex string\n * @param value\n * @param maxIntermediateBufferSize\n */\nexport function to32ByteBuffer(value: bigint | number | string | Uint8Array, maxIntermediateBufferSize = 66): Buffer {\n if (typeof value === 'string') {\n if (!isValidHex(value)) {\n throw new Error('only hex string is supported')\n }\n let hex = trim0x(value)\n if (hex.length % 2 !== 0) {\n hex = '0' + hex\n }\n value = toBigIntBE(Buffer.from(hex, 'hex'))\n }\n if (value instanceof Uint8Array) {\n value = toBigIntBE(Buffer.from(value))\n }\n const bf = toBufferBE(BigInt(value), maxIntermediateBufferSize)\n // trim from the left, keep the right 32 bytes\n return bf.subarray(-32)\n}\n\nfunction trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\nfunction isValidHex(str: string): boolean {\n const hexRegex = /^(0x)?[0-9A-Fa-f]+$/\n return hexRegex.test(str)\n}\n\nexport function findDeepestCell(cell: Cell): { subTreeCells: number } {\n // Get all references from the current cell\n const refs = Array.from({ length: cell.refs.length }, (_, i) => cell.refs.at(i))\n\n // Base case: if no references, return current cell with depth 0\n if (refs.length === 0) {\n return { subTreeCells: 1 }\n }\n\n let size = 0\n\n // Check all references\n for (const ref of refs) {\n if (!ref) continue\n\n size += findDeepestCell(ref).subTreeCells\n }\n\n return { subTreeCells: size }\n}\n","import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { getOpcodeCRC } from './utils'\n\nexport interface ConstructorArgs {\n [key: string]: string\n}\n\nexport type MetaType = 'const' | 'inputArg' | 'constClass' | 'classWithArgs'\n\n// requirements:\n// 1. each attribute can have only one dependency (one constructor call)\n// 2. The name of the inputArg which is a class should be the same as the class name\nexport interface Attribute {\n name: string\n type: string\n value: string\n metaType: MetaType\n dependencyName: string\n dependencyConstructorCallGenerator?: ConstructorCallGenerator\n}\n\nexport type ConstructorCallGenerator = (args: ConstructorArgs, _: unknown) => string\n\nexport interface FieldMap {\n [key: number]: string\n}\nexport interface InverseFieldMap {\n [key: string]: number\n}\n\nexport interface TonObject {\n constructorName: string\n constructorInputArgs: ConstructorArgs\n // the order of these attributes need to be preserved\n attributes: Attribute[]\n // whether it's possible to generate the constructor code\n constructorIncomplete: boolean\n dependencies: string[]\n // the inside ::NAME of the object\n tonName: string\n // infer the implicit map of orders of the objects at declaration and the fields\n fieldMap: FieldMap\n inverseFieldMap: InverseFieldMap\n // You need to have generated everything to be able to resolve the dependencies to generate the codes.\n constructorCode?: string\n constructorCodeCallGenerator?: ConstructorCallGenerator\n flatConstructorArgs?: ConstructorArgs\n nonClassConstructorArgs?: ConstructorArgs\n fromScratchConstructorCode?: string\n fromScratchConstructorName?: string\n scratchConstructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for types\n tsTypeName?: string\n tsTypeCode?: string\n // stuff for deconstructor\n deconstructorName?: string\n deconstructorIncomplete?: boolean\n deconstructorCode?: string\n deconstructorCodeCallGenerator?: ConstructorCallGenerator\n // cell -only constructor\n cellConstructorCode?: string\n cellConstructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for deconstructing md's\n is_md?: boolean\n}\n\n// maps the name of the ton object to the object\nexport interface TonObjectsDict {\n [name: string]: TonObject\n}\n\nexport interface TonViewFunction {\n name: string\n args: { [key: string]: string }\n returnType: string[]\n code: string\n}\n\n// maps the name of the contract to a list of view functions\nexport interface TonViewFunctionsDict {\n [name: string]: TonViewFunction[]\n}\n\nconst file_signature_header = `////// Generated by sdk/sdk-generator.ts`\nconst ERRORCODE_MASK = 0x7ffn\n\nfunction tonTypeToTStype(tonType: string, addr_type = 'Slice', force_cell = false): string {\n switch (tonType) {\n case 'int':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n case 'address':\n return 'bigint'\n\n case 'slice':\n return addr_type\n\n case 'cell':\n case 'cellRef':\n return 'Cell'\n\n case 'tuple':\n return 'Tuple'\n\n case 'objRef':\n if (force_cell) {\n return 'Cell'\n } else {\n return 'Tuple'\n }\n\n case 'dict256':\n case 'dictionary':\n return 'LzDict'\n\n default:\n return 'unknown'\n }\n}\n\nfunction tonTypeToReadTupleFunction(tonType: string): string {\n switch (tonType) {\n case 'int':\n return 'readBigNumber()'\n\n case 'slice':\n case 'address':\n return 'readAddress()'\n\n case 'cell':\n return 'readCell()'\n\n case 'tuple':\n return 'readTuple().pop() as Tuple'\n\n default:\n return 'pop()'\n }\n}\n\nfunction tonTypeToTonGetterName(tonType: string): string {\n switch (tonType) {\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n return 'cl::get<' + tonType + '>'\n\n case 'slice':\n case 'address':\n return 'cl::get<address>'\n\n case 'cell':\n case 'cell_ref':\n return 'cl::get<cellRef>'\n\n case 'tuple':\n case 'obj_ref':\n return 'cl::get<objRef>'\n\n case 'dict256':\n case 'dictionary':\n return 'cl::get<dict256>'\n\n default:\n return 'unknown'\n }\n}\n\nfunction tsTypeToTSGetterName(tsType: string, wrapperName = 'platonic'): string {\n switch (tsType) {\n case 'bigint':\n return `${wrapperName}.getClInt`\n\n case 'Slice':\n case 'Address':\n return `${wrapperName}.getClAddress`\n\n case 'Cell':\n return `${wrapperName}.getClCell`\n\n case 'Tuple':\n return `${wrapperName}.getClObj`\n\n // TODO: this will definitely bite me in the future\n case 'LzDict':\n return 'getLzDict'\n\n default:\n return 'unknown'\n }\n}\n\nfunction tonTypeToTupleType(tonType: string): string {\n switch (tonType) {\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n return 'int'\n\n case 'address':\n case 'slice':\n return 'slice'\n\n case 'cell_ref':\n case 'dict256':\n return 'cell'\n\n case 'obj_ref':\n return 'tuple'\n\n default:\n return tonType\n }\n}\n\nfunction tonTypeToTupleValueName(tonType: string): string {\n switch (tonType) {\n case 'coins':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n return 'value'\n\n case 'address':\n case 'slice':\n case 'cell':\n case 'dictionary':\n case 'dict256':\n case 'ref':\n return 'cell'\n\n case 'tuple':\n return 'items'\n\n default:\n return 'value'\n }\n}\n\nfunction tonTypeToTupleValue(value: string, tonType: string): string {\n // this is an special case where we need to remove the args. prefix\n if (value.includes('INSIDE_FLAGGED')) {\n value = value.replace('INSIDE_FLAGGED', '').replace(/args\\./g, '')\n }\n switch (tonType) {\n case 'address':\n case 'slice':\n return `beginCell().storeAddress(${value}).endCell()`\n\n case 'tuple':\n return `${value}.items`\n\n default:\n return value\n }\n}\n\nexport function mergeConstructorDicts(result: TonObjectsDict, added: TonObjectsDict): TonObjectsDict {\n Object.entries(added).forEach(\n ([\n name,\n {\n constructorInputArgs: inputArgs,\n attributes,\n constructorIncomplete: incomplete,\n dependencies,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n },\n ]) => {\n result[name] = {\n constructorInputArgs: inputArgs,\n attributes,\n constructorIncomplete: incomplete,\n dependencies,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n }\n }\n )\n return result\n}\n\nfunction mergeInputArgs(result: ConstructorArgs, added: ConstructorArgs): ConstructorArgs {\n Object.entries(added).forEach(([name, type]) => {\n result[name] = type\n })\n return result\n}\n\nexport function parseDirectory(directoryPath: string): TonObjectsDict {\n let result: TonObjectsDict = {}\n\n const items = fs.readdirSync(directoryPath)\n\n items.forEach((item) => {\n const itemPath = path.join(directoryPath, item)\n const stats = fs.statSync(itemPath)\n\n if (itemPath.includes('base_storage')) {\n const a = 1\n }\n\n if (stats.isDirectory()) {\n result = mergeConstructorDicts(result, parseDirectory(itemPath))\n } else if (stats.isFile() && path.extname(item) === '.fc' && !itemPath.includes('@ston-fi')) {\n const content = fs.readFileSync(itemPath, 'utf8')\n result = mergeConstructorDicts(result, parseClasses(content))\n }\n })\n\n return result\n}\n\nfunction snakeToCamelCase(str: string): string {\n return str\n .replace(/::/g, '_') // Replace \"::\" with \"_\"\n .replace(/(_\\w)/g, (match) => match[1].toUpperCase()) // Convert snake_case to camelCase\n}\n\nfunction parseClSetLines(\n input: string,\n inputArgs: ConstructorArgs,\n fieldMap: FieldMap\n): [Attribute[], boolean, string[]] {\n const psResult: Attribute[] = []\n let incomplete = false\n const setRegex = /\\[\\s*([a-zA-Z_][\\w:]*),\\s*((?:[^,\\]]|\\([^)]*\\))*)\\]/g\n\n const dependencies: string[] = []\n\n let key = 0\n\n let match\n while ((match = setRegex.exec(input)) !== null && key < Object.keys(fieldMap).length) {\n const [, argType, assignedValue] = match\n let depName = ''\n\n const value = assignedValue.trim()\n let which: MetaType = 'const'\n if (value.includes('::New')) {\n incomplete = true\n depName = value.slice(0, value.lastIndexOf('::New'))\n dependencies.push(depName)\n }\n if (value.includes('::New()')) {\n which = 'constClass'\n } else if (value.includes('::New')) {\n which = 'classWithArgs'\n } else if (/^\\d+$/.test(value)) {\n which = 'const'\n } else {\n switch (value) {\n case 'true':\n case 'false':\n case 'addr_none()':\n case 'new_dict()':\n which = 'const'\n break\n default:\n which = value in inputArgs && inputArgs[value].length > 0 ? 'inputArg' : 'const'\n }\n }\n\n psResult.push({\n name: key in fieldMap ? fieldMap[key].trim() : '',\n type: argType.trim().split('::').pop() ?? 'int',\n value,\n metaType: which,\n dependencyName: depName,\n })\n\n key += 1\n }\n\n return [psResult, incomplete, dependencies]\n}\n\nfunction parseFieldNames(name: string, input: string): [FieldMap, InverseFieldMap] {\n const fieldMap: FieldMap = {}\n const inverseFieldMap: InverseFieldMap = {}\n const regex = /^const\\s+int\\s+(?:[A-Za-z]+::)?[A-Za-z]\\w+::(\\w+)\\s*=\\s*(\\d+);/gm\n let match\n\n while ((match = regex.exec(input)) !== null) {\n const [, fieldName, fieldIndexStr] = match\n const fieldIndex = parseInt(fieldIndexStr, 10)\n fieldMap[fieldIndex] = fieldName\n inverseFieldMap[fieldName] = fieldIndex\n }\n\n return [fieldMap, inverseFieldMap]\n}\n\nfunction parseClasses(input: string): TonObjectsDict {\n const functionRegex =\n /(\\w+(?:::\\w+)*::New\\w*)\\s*\\(([\\w\\s,$·]*)\\)\\s*·?\\s*(impure)?\\s*(inline\\s*)?method_id\\s*\\{([^}]*)\\}/g\n\n const results: TonObjectsDict = {}\n\n let match\n while ((match = functionRegex.exec(input)) !== null) {\n const [, rawName, argsString, , , body] = match\n const args: { [key: string]: string } = {}\n\n if (rawName.includes('OFTSend')) {\n const a = 1\n }\n\n // Parse arguments\n const argPairs = argsString.split(',').map((arg) => arg.trim())\n for (const argPair of argPairs) {\n const [argType, argName] = argPair.split(/\\s+/) as [string, string?]\n if (argName !== undefined) {\n args[argName.replace('$', '')] = argType\n }\n }\n\n const name = rawName.replace(/::New$/, '')\n const functionName = snakeToCamelCase('get' + 'new_' + name)\n\n const [fieldMap, inverseFieldMap] = parseFieldNames(name, input)\n\n console.log(`Parsing ${name}...`)\n\n const tonNameRegex = /const int\\s+(?:md::)?[\\w:]+::NAME = \"(.*?)\"u;/\n const tonNameMatch = input.match(tonNameRegex)\n const tonName = tonNameMatch ? tonNameMatch[1] : name\n\n const [attributes, incomplete, dependencies] = parseClSetLines(body, args, fieldMap)\n results[name] = {\n constructorInputArgs: args,\n attributes,\n constructorIncomplete: incomplete,\n dependencies,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n }\n }\n\n return results\n}\n\nexport function saveTonContractWrapper(tonObjects: TonObjectsDict, directory: string): void {\n const generatedMethods = Object.entries(tonObjects)\n .map(([_, tonObject]) => tonObject.cellConstructorCode ?? '')\n .join('\\n')\n const savedCode = `${file_signature_header}\n\nimport {\n Address,\n Cell,\n ContractProvider,\n ContractState,\n Sender,\n SenderArguments,\n TupleItem,\n TupleReader,\n contractAddress,\n} from '@ton/core'\n\nimport { BaseWrapper, SendRequestOptions } from './base-wrapper'\nimport { beginMessage } from './utils'\n\nexport type GetIntFnNames =\n | 'cl::get<uint8>'\n | 'cl::get<uint16>'\n | 'cl::get<uint32>'\n | 'cl::get<uint64>'\n | 'cl::get<uint256>'\n | 'cl::get<coins>'\n | 'cl::get<bool>'\n | 'cl::get<address>'\n\nexport class TonContractWrapper extends BaseWrapper {\n static create(code: Cell, data: Cell, workchain = 0): TonContractWrapper {\n const init = { code, data }\n return new TonContractWrapper(contractAddress(workchain, init), init)\n }\n\n async getFieldStack(\n provider: ContractProvider,\n method: string,\n cell: Cell,\n fieldName: bigint\n ): Promise<TupleReader> {\n const args: TupleItem[] = [\n { type: 'cell', cell: cell },\n { type: 'int', value: fieldName },\n ]\n const ret = await provider.get(method, args)\n return ret.stack\n }\n\n async getState(provider: ContractProvider): Promise<ContractState> {\n return provider.getState()\n }\n\n async getCurrentStorage(provider: ContractProvider): Promise<TupleReader> {\n const ret = await provider.get('getContractStorage', [])\n return ret.stack\n }\n\n async getCurrentStorageCell(provider: ContractProvider): Promise<Cell> {\n const getResult = await provider.get('getContractStorage', [])\n return getResult.stack.readCell()\n }\n\n async getViewFunction(provider: ContractProvider, method: string, args: TupleItem[]): Promise<TupleReader> {\n const ret = await provider.get(method, args)\n return ret.stack\n }\n\n async getClInt(provider: ContractProvider, method: GetIntFnNames, cell: Cell, fieldName: bigint): Promise<bigint> {\n return (await this.getFieldStack(provider, method, cell, fieldName)).readBigNumber()\n }\n\n async getClAddress(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Address> {\n return (await this.getFieldStack(provider, 'cl::get<address>', cell, fieldName)).readAddress()\n }\n\n async getClCell(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Cell> {\n return (await this.getFieldStack(provider, 'cl::get<cellRef>', cell, fieldName)).readCell()\n }\n\n async getClObj(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Cell> {\n return (await this.getFieldStack(provider, 'cl::get<objRef>', cell, fieldName)).readCell()\n }\n\n async getClDict(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Cell> {\n return (await this.getFieldStack(provider, 'cl::get<dict256>', cell, fieldName)).readCell()\n }\n\n async getObject(provider: ContractProvider, method: string, args: TupleItem[]): Promise<Cell> {\n const ret = await provider.get(method, args)\n return ret.stack.readCell()\n }\n\n async getDictCellItem(provider: ContractProvider, dict_cell: Cell, key: bigint): Promise<Cell> {\n const args: TupleItem[] = [\n { type: 'cell', cell: dict_cell },\n { type: 'int', value: key },\n ]\n const ret = await provider.get('cl::dict256::get<cellRef>', args)\n return ret.stack.readCell()\n }\n\n async getDictUint256Item(provider: ContractProvider, dict_cell: Cell, key: bigint): Promise<bigint> {\n const args: TupleItem[] = [\n { type: 'cell', cell: dict_cell },\n { type: 'int', value: key },\n ]\n const ret = await provider.get('cl::dict256::get<uint256>', args)\n return ret.stack.readBigNumber()\n }\n\n async getSetDictItem(provider: ContractProvider, dict_cell: Cell, key: bigint, value: Cell): Promise<Cell> {\n const args: TupleItem[] = [\n { type: 'cell', cell: dict_cell },\n { type: 'int', value: key },\n { type: 'cell', cell: value },\n ]\n const ret = await provider.get('cl::dict256::setRef', args)\n return ret.stack.readCell()\n }\n\n buildRequest(\n opCode: bigint,\n data: Cell,\n opts: SendRequestOptions,\n balanceRefill = 0n,\n queryId?: number | bigint\n ): SenderArguments {\n const body = beginMessage(opCode, queryId).storeCoins(balanceRefill).storeRef(data).endCell()\n return this.buildSenderArguments(body, opts)\n }\n\n async sendInternalMessage(\n provider: ContractProvider,\n via: Sender,\n opCode: bigint,\n md: Cell,\n opts: SendRequestOptions,\n balanceRefill = 0n,\n queryId?: number | bigint\n ): Promise<void> {\n if (via.address === undefined) {\n throw new Error('Sender address is not defined')\n }\n const request = this.buildRequest(opCode, md, opts, balanceRefill, queryId)\n return this.sendRequest(provider, via, request)\n }\n\n${generatedMethods}\n}\n`\n\n fs.writeFileSync(path.join(directory, 'TonContractWrapper.ts'), savedCode)\n}\n\nexport function saveAllTypes(tonObjects: TonObjectsDict, directory: string): void {\n const generatedTypes = Object.entries(tonObjects)\n .filter(([_, tonObject]) => tonObject.attributes.length > 0)\n .map(([_, tonObject]) => 'export ' + (tonObject.tsTypeCode ?? ''))\n .join('')\n\n const mapping: { [key: string]: string[] } = {}\n Object.values(tonObjects).forEach((item) => {\n if (item.tsTypeName === undefined) {\n return\n }\n if (!(item.tonName in mapping)) {\n mapping[item.tonName] = []\n }\n mapping[item.tonName].push(item.tsTypeName)\n })\n const generatedNameMap = `export const nameMap: { [key: string]: string } = {\n${Object.entries(mapping)\n .map(([key, val]) => \" '\" + key + \"': '\" + val[0] + \"',\")\n .join('\\n')}\n}`\n\n const savedCode = `${file_signature_header}\n/* eslint-disable @typescript-eslint/no-empty-interface */\n\nimport { Cell, OpenedContract, beginCell } from '@ton/core'\nimport { SandboxContract } from '@ton/sandbox'\n\nimport { TonContractWrapper } from './TonContractWrapper'\n\nexport type ExtendedContract<T> = SandboxContract<T> | OpenedContract<T>\n\nexport class LzDict {\n _cell: Cell\n\n constructor(data: Cell) {\n this._cell = data\n }\n\n static empty(): LzDict {\n return new LzDict(beginCell().endCell())\n }\n\n async getCell(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<Cell> {\n return wrapper.getDictCellItem(this._cell, key)\n }\n\n async getBigInt(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<bigint> {\n return wrapper.getDictUint256Item(this._cell, key)\n }\n\n async set(key: bigint, value: Cell, wrapper: ExtendedContract<TonContractWrapper>): Promise<void> {\n this._cell = await wrapper.getSetDictItem(this._cell, key, value)\n }\n\n asCell(): Cell {\n return this._cell\n }\n}\n\nexport interface Md {}\n\n${generatedTypes}\n\n${generatedNameMap}\n`\n\n fs.writeFileSync(path.join(directory, 'allTypes.ts'), savedCode)\n}\n\nexport function saveTonObjectUnwrapper(tonObjects: TonObjectsDict, directory: string): void {\n const allTypes = [\n ...(Object.values(tonObjects)\n .map((obj) => obj.tsTypeName)\n .filter((name) => name !== undefined) as string[]),\n 'ExtendedContract',\n 'LzDict',\n 'Md',\n 'nameMap',\n ].sort()\n const savedCode = `${file_signature_header}\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { Cell, Transaction, TransactionComputeVm, TransactionDescriptionGeneric, beginCell } from '@ton/core'\nimport { BlockchainTransaction, EventMessageSent, SendMessageResult } from '@ton/sandbox'\nimport { flattenTransaction } from '@ton/test-utils'\n\nimport { OPCODES } from '../constants'\n\nimport {\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from './allTypes'\nimport { TonContractWrapper } from './TonContractWrapper'\n\nfunction bigintToAsciiString(num: bigint): string {\n let result = ''\n while (num > 0n) {\n const charCode = Number(num & 255n)\n result = String.fromCharCode(charCode) + result\n num = num >> 8n\n }\n return result\n}\n\nexport class LzEvent {\n private _eventPromise: Promise<ActionEvent>\n private _event: ActionEvent | null\n public topic: string\n public body: Md\n public bodyName: string\n public initialStorage: Cell\n public initialized: boolean\n\n constructor(wrapper: ExtendedContract<TonContractWrapper>, cell: Cell) {\n this._eventPromise = TonObjectUnwrapper.getActionEventToTS(wrapper, cell)\n this._event = null\n this.topic = ''\n this.body = {}\n this.initialStorage = beginCell().endCell()\n this.initialized = false\n this.bodyName = ''\n }\n\n async load(wrapper: ExtendedContract<TonContractWrapper>): Promise<boolean> {\n this._event = await this._eventPromise\n this.topic = bigintToAsciiString(this._event.topic)\n this.bodyName = await TonObjectUnwrapper.getTypeOf(wrapper, this._event.body)\n const tsCasterName = 'get' + nameMap[this.bodyName] + 'ToTS'\n\n const method = TonObjectUnwrapper[tsCasterName as keyof typeof TonObjectUnwrapper]\n if (typeof method === 'function') {\n this.body = await method(wrapper, this._event.body)\n } else {\n console.log('Method' + tsCasterName + 'does not exist.')\n }\n\n this.initialStorage = this._event.initialStorage\n this.initialized = true\n return this.initialized\n }\n}\n\nexport class LzEventHandler {\n public allFailures = {\n txList: [] as BlockchainTransaction[],\n events: [] as EventMessageSent[],\n }\n public allVictories = {\n txList: [] as BlockchainTransaction[],\n eventObjects: [] as LzEvent[],\n packetsSent: [] as MdPacketSent[],\n } \n async addCurrentEventsToAllEvents(results: SendMessageResult, contract: ExtendedContract<TonContractWrapper>): Promise<void> {\n for (let i = 0; i < results.transactions.length; i++) {\n const tx: BlockchainTransaction & Transaction = results.transactions[i]\n const desc = tx.description\n if (desc.type !== 'generic' || desc.computePhase.type !== 'skipped') continue\n \n const eventBody = tx.inMessage?.body\n if (eventBody === undefined) continue\n const eventBodySlice = eventBody.beginParse()\n // the event body is empty if we are sending a payment with no corresponding payload\n if (eventBodySlice.remainingBits < 32) continue\n const opCode = eventBodySlice.loadUint(32)\n if (opCode === Number(OPCODES.BaseInterface_OP_EVENT)) {\n if (eventBody.refs.length > 0) {\n const eventInnerCell = eventBody.refs[0]\n const newLzEvent = new LzEvent(contract, eventInnerCell)\n await newLzEvent.load(contract)\n this.allVictories.txList.push(tx)\n this.allVictories.eventObjects.push(newLzEvent)\n if (newLzEvent.topic === 'Channel::event::PACKET_SENT' && this.isMdPacketSent(newLzEvent.body)) {\n this.allVictories.packetsSent.push(newLzEvent.body)\n // getMdLzSendToTS(contract, newLzEvent.body.lzSend)\n }\n }\n } else {\n this.allFailures.txList.push(tx)\n this.allFailures.events.push(results.events[i] as EventMessageSent)\n }\n }\n }\n isMdPacketSent(md: Md): md is MdPacketSent {\n return 'nativeFee' in md && 'zroFee' in md && 'extraOptions' in md && 'enforcedOptions' in md && 'packetEncoded' in md && 'nonce' in md\n }\n}\n\ninterface GasStructure {\n actionFee: bigint\n forwardFee: bigint\n computeFee: bigint\n storageFee: bigint\n messageSizeCells: bigint\n messageSizeBits: bigint\n}\n\nexport class LzGasTracker {\n private codeOp: Map<bigint, string>\n public gasCosts: Map<string, GasStructure[]>\n\n constructor() {\n this.codeOp = LzGasTracker.invertMapping(OPCODES)\n this.gasCosts = new Map()\n }\n\n static invertMapping(obj: { [key: string]: bigint }): Map<bigint, string> {\n const invertedObj = new Map<bigint, string>()\n\n for (const key in obj) {\n const value = obj[key]\n invertedObj.set(value, key)\n }\n\n return invertedObj\n }\n\n calculateGas(results: SendMessageResult): void {\n for (const transaction of results.transactions) {\n const tx: BlockchainTransaction & Transaction = transaction\n const flatTx = flattenTransaction(tx)\n\n if (flatTx.op !== undefined) {\n const desc = tx.description as TransactionDescriptionGeneric\n\n const op = BigInt(flatTx.op)\n const opName = this.codeOp.get(op)\n if (opName === undefined) continue\n\n const msgSize = desc.actionPhase?.totalMessageSize ?? { cells: 0n, bits: 0n }\n\n const newGasStructure: GasStructure = {\n actionFee: desc.actionPhase?.totalActionFees ?? 0n,\n forwardFee: desc.actionPhase?.totalFwdFees ?? 0n,\n computeFee: BigInt((desc.computePhase as TransactionComputeVm)?.gasFees ?? 0),\n storageFee: desc.storagePhase?.storageFeesCollected ?? 0n,\n messageSizeCells: msgSize.cells,\n messageSizeBits: msgSize.bits,\n }\n\n const gasCost = this.gasCosts.get(opName)\n if (gasCost !== undefined) {\n gasCost.push(newGasStructure)\n } else {\n this.gasCosts.set(opName, [newGasStructure])\n }\n }\n }\n }\n\n asTable(): string {\n const headers = [\n 'Operation',\n 'Action Fee',\n 'Forward Fee',\n 'Compute Fee',\n 'Storage Fee',\n 'Msg Size (Cells)',\n 'Msg Size (Bits)',\n ]\n const columnWidths = headers.map((header) => header.length)\n let tableString = ''\n\n // Calculate column widths\n for (const [opName, structures] of this.gasCosts) {\n columnWidths[0] = Math.max(columnWidths[0], opName.length)\n for (const structure of structures) {\n columnWidths[1] = Math.max(columnWidths[1], structure.actionFee.toString().length)\n columnWidths[2] = Math.max(columnWidths[2], structure.forwardFee.toString().length)\n columnWidths[3] = Math.max(columnWidths[3], structure.computeFee.toString().length)\n columnWidths[4] = Math.max(columnWidths[4], structure.storageFee.toString().length)\n columnWidths[5] = Math.max(columnWidths[5], structure.messageSizeCells.toString().length)\n columnWidths[6] = Math.max(columnWidths[6], structure.messageSizeBits.toString().length)\n }\n }\n\n // Add header to table string\n tableString += headers.map((header, i) => header.padEnd(columnWidths[i])).join(' | ') + '\\\\n'\n tableString += columnWidths.map((width) => '-'.repeat(width)).join('-+-') + '\\\\n'\n\n // Add data to table string\n for (const [opName, structures] of this.gasCosts) {\n for (let i = 0; i < structures.length; i++) {\n const structure = structures[i]\n const row = [\n i === 0 ? opName : '',\n structure.actionFee.toString(),\n structure.forwardFee.toString(),\n structure.computeFee.toString(),\n structure.storageFee.toString(),\n structure.messageSizeCells.toString(),\n structure.messageSizeBits.toString(),\n ]\n tableString += row.map((cell, i) => cell.padEnd(columnWidths[i])).join(' | ') + '\\\\n'\n }\n tableString += columnWidths.map((width) => '-'.repeat(width)).join('-+-') + '\\\\n'\n }\n\n // Remove the last newline character\n tableString = tableString.slice(0, -1)\n\n // Log the entire table\n return tableString\n }\n}\n\nasync function getLzDict(obj: Cell, fieldName: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<LzDict> {\n const dictCell = await wrapper.getClDict(obj, fieldName)\n return new LzDict(dictCell)\n}\n\nexport class TonObjectUnwrapper {\n static async getTypeOf(provider: ExtendedContract<TonContractWrapper>, obj_cell: Cell): Promise<string> {\n const ret = await provider.getViewFunction('cl::typeof', [{ type: 'cell', cell: obj_cell }])\n return bigintToAsciiString(ret.readBigNumber())\n }\n${Object.entries(tonObjects)\n .map(([_, constructor]) => constructor.deconstructorCode ?? '')\n .join('\\n')}\n}\n`\n\n fs.writeFileSync(path.join(directory, 'TonObjectUnwrapper.ts'), savedCode)\n}\n\nfunction findClass(tonClasses: TonObjectsDict, name: string): TonObject | undefined {\n if (name in tonClasses) return tonClasses[name]\n\n const lzName = 'lz::' + name\n if (lzName in tonClasses) return tonClasses[lzName]\n\n const mdName = 'md::' + name\n if (mdName in tonClasses) return tonClasses[mdName]\n\n const clName = 'cl::' + name\n if (clName in tonClasses) return tonClasses[clName]\n\n const packetV1Key = 'lz::' + name.replace('packet', 'packet_v1')\n if (packetV1Key in tonClasses) return tonClasses[packetV1Key]\n\n const packetV1UnderscoreKey = 'lz::' + name.replace('packet', 'packet_v1_')\n if (packetV1UnderscoreKey in tonClasses) return tonClasses[packetV1UnderscoreKey]\n\n const packetV2Key = 'lz::' + name.replace('packet', 'packet_v2')\n if (packetV2Key in tonClasses) return tonClasses[packetV2Key]\n\n const packetV2UnderscoreKey = 'lz::' + name.replace('packet', 'packet_v2_')\n if (packetV2UnderscoreKey in tonClasses) return tonClasses[packetV2UnderscoreKey]\n\n return undefined\n}\n\nfunction findClassKey(tonClasses: TonObjectsDict, name: string): string | undefined {\n if (name in tonClasses) return name\n\n const lzName = 'lz::' + name\n if (lzName in tonClasses) return lzName\n\n const mdName = 'md::' + name\n if (mdName in tonClasses) return mdName\n\n const clName = 'cl::' + name\n if (clName in tonClasses) return clName\n\n const packetV1Key = 'lz::' + name.replace('packet', 'packet_v1')\n if (packetV1Key in tonClasses) return packetV1Key\n\n const packetV1UnderscoreKey = 'lz::' + name.replace('packet', 'packet_v1_')\n if (packetV1UnderscoreKey in tonClasses) return packetV1UnderscoreKey\n\n const packetV2Key = 'lz::' + name.replace('packet', 'packet_v2')\n if (packetV2Key in tonClasses) return packetV2Key\n\n const packetV2UnderscoreKey = 'lz::' + name.replace('packet', 'packet_v2_')\n if (packetV2UnderscoreKey in tonClasses) return packetV2UnderscoreKey\n\n return undefined\n}\n\n// only comes here if the class is not incomplete\nfunction generateConstructorCodes(className: string, tonClasses: TonObjectsDict): TonObjectsDict {\n if (!(className in tonClasses)) {\n return tonClasses\n }\n\n const tonClass = tonClasses[className]\n const { constructorInputArgs: inputArgs } = tonClass\n // 'get' is because of blueprint\n const fnName = snakeToCamelCase(`getNew_${className}`)\n const scratchFnName = snakeToCamelCase(`getNew_${className}FromScratch`)\n\n let methodIdName = `${className}::New`\n if (className.includes('::New')) {\n methodIdName = className\n }\n\n tonClass.constructorName = fnName\n tonClass.fromScratchConstructorName = scratchFnName\n tonClass.nonClassConstructorArgs = {}\n\n tonClass.constructorCode = `\n async ${fnName}(provider: ContractProvider${\n Object.keys(inputArgs).length > 0\n ? `, args: {\n ${Object.entries(inputArgs)\n .map(([argName, argType]) => `${argName}: ${tonTypeToTStype(argType)}`)\n .join(',\\n ')}\n }`\n : ''\n }): Promise<Cell> {\n const getResult = await provider.get('${methodIdName}', [\n ${Object.entries(inputArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(inputArgs).length > 0 ? `args.${argName}` : argName, argType)} }`\n )\n .join(',\\n ')}\n ]);\n return getResult.stack.readCell()\n }`\n\n // make a copy of inputArgs where all the tuple types are changed to cell\n const cellArgs: ConstructorArgs = {}\n Object.entries(inputArgs).forEach(([argName, argType]) => {\n cellArgs[argName] = argType === 'tuple' ? 'cell' : argType\n })\n\n tonClass.cellConstructorCode = `\n async ${fnName}Cell(provider: ContractProvider${\n Object.keys(inputArgs).length > 0\n ? `, args: {\n ${Object.entries(cellArgs)\n .map(([argName, argType]) => `${argName}: ${tonTypeToTStype(argType, 'Slice', true)}`)\n .join(',\\n ')}\n }`\n : ''\n }): Promise<Cell> {\n const getResult = await provider.get('${methodIdName}', [\n ${Object.entries(cellArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(inputArgs).length > 0 ? `args.${argName}` : argName, argType)} }`\n )\n .join(',\\n ')}\n ]);\n return getResult.stack.readCell()\n }`\n\n tonClass.constructorCodeCallGenerator = (callerArgs: ConstructorArgs, _): string => {\n // Check for arguments not passed by the parent\n const missingArgs = Object.keys(inputArgs).filter((key) => !(key in callerArgs))\n if (missingArgs.length > 0) {\n console.warn(\n `Argument(s) not provided: ${missingArgs.join(', ')}, make sure the TON constructor has default values for these arguments`\n )\n }\n\n const filteredArgs = Object.entries(inputArgs).filter(([key, value]) => key in callerArgs)\n\n return `await ${fnName}(provider.getSender()${\n filteredArgs.length > 0\n ? `, { ${filteredArgs.map(([argName, argType]) => `${argName}: ${argName}`).join(', ')} }`\n : ''\n })`\n }\n\n // tonClass.cellConstructorCodeCallGenerator = (callerArgs: ConstructorArgs, _) => {\n\n // the name of the tuple dependency should be the same as its class name\n tonClass.flatConstructorArgs = { ...inputArgs }\n Object.entries(tonClass.constructorInputArgs).map(([argName, argType]) => {\n if (argType === 'tuple') {\n // if the implicit dependency is not generated yet, we need to generate it first\n const tupleClass = findClass(tonClasses, argName)\n if (tupleClass?.scratchConstructorCodeCallGenerator === undefined) {\n const implicitDepName = findClassKey(tonClasses, argName)\n if (implicitDepName !== undefined) {\n generateConstructorCodes(implicitDepName, tonClasses)\n }\n }\n tonClass.flatConstructorArgs = mergeInputArgs(\n tonClass.flatConstructorArgs ?? {},\n tupleClass?.flatConstructorArgs ?? {}\n )\n }\n })\n\n const classArgs: ConstructorArgs = {}\n Object.entries(tonClass.flatConstructorArgs ?? {}).forEach(([argName, argType]) => {\n // if it is a tuple and it is a class, we need to remove it from the flattenedArgs\n // if it's a non-class tuple, we need to get it from the caller\n if (argType === 'tuple' && findClass(tonClasses, argName) !== undefined) {\n classArgs[argName] = tonClass.flatConstructorArgs?.[argName] ?? ''\n } else {\n ;(tonClass.nonClassConstructorArgs ??= {})[argName] = argType\n }\n })\n\n tonClass.scratchConstructorCodeCallGenerator = (parentArgs: ConstructorArgs, _): string => {\n // Check for arguments not passed by the parent\n const missingArgs = Object.keys(tonClass.nonClassConstructorArgs ?? {}).filter((key) => !(key in parentArgs))\n if (missingArgs.length > 0) {\n console.warn(\n `Argument(s) not provided: ${missingArgs.join(', ')}, make sure the TON constructor has default values for these arguments`\n )\n }\n const filteredArgs = Object.entries(tonClass.nonClassConstructorArgs ?? {}).filter(\n ([key, value]) => key in parentArgs\n )\n\n return `await ${scratchFnName}(provider${\n filteredArgs.length > 0\n ? `, { ${filteredArgs.map(([argName, argType]) => `${argName}: args.${argName}`).join(', ')} }`\n : ''\n })`\n }\n\n const finalScratchArgs: ConstructorArgs = { ...tonClass.nonClassConstructorArgs }\n\n const insideTupleGenerationCode = Object.entries(classArgs)\n .map(([argName, argType]) => {\n const tupleInstanceName = argName\n const tupleClass = findClass(tonClasses, argName)\n\n if (tupleClass !== undefined) {\n // if it is supposed to be generated as an intermediate value inside our function call,\n // we need to flag it so that we can remove the args. prefix\n finalScratchArgs[`${argName}INSIDE_FLAGGED`] = argType\n }\n\n return `const ${tupleInstanceName} = ${tupleClass?.scratchConstructorCodeCallGenerator?.(tonClass.nonClassConstructorArgs ?? {}, '') ?? ''};`.replace(\n 'getNew',\n 'this.getNew'\n )\n })\n .join('\\n')\n\n tonClass.fromScratchConstructorCode = `\n async ${scratchFnName}(provider: ContractProvider${\n Object.keys(tonClass.nonClassConstructorArgs ?? {}).length > 0\n ? `, args: {\n ${Object.entries(tonClass.nonClassConstructorArgs ?? {})\n .map(([argName, argType]) => `${argName}: ${tonTypeToTStype(argType)}`)\n .join(',\\n ')}\n }`\n : ''\n }): Promise<Tuple> {\n ${insideTupleGenerationCode}\n const getResult = await provider.get('${className.toLowerCase()}::New', [\n ${Object.entries(finalScratchArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(tonClass.nonClassConstructorArgs ?? {}).length > 0 ? `args.${argName}` : argName, argType)} }`\n )\n .join(',\\n ')}\n ])\n return LzTuple(getResult.stack)\n }`\n\n tonClass.constructorIncomplete = false\n tonClasses[className] = tonClass\n return tonClasses\n}\n\nexport function recursiveGenConstructorCode(classConstructors: TonObjectsDict, key = ''): TonObjectsDict {\n if (key != '') {\n if (!(key in classConstructors)) {\n return classConstructors\n }\n const current = classConstructors[key]\n // if the class is incomplete, we need to resolve the dependencies first\n if (current.constructorIncomplete) {\n current.dependencies.forEach((item) => {\n // to avoid repeating for the same class\n if (item in classConstructors) {\n if (classConstructors[item].constructorCode === undefined) {\n classConstructors = recursiveGenConstructorCode(classConstructors, item)\n }\n }\n })\n }\n // then, we can generate the constructor code for the desired class [base case]\n classConstructors = generateConstructorCodes(key, classConstructors)\n } else {\n for (const [key, value] of Object.entries(classConstructors)) {\n if (value.constructorCode === undefined) {\n classConstructors = recursiveGenConstructorCode(classConstructors, key)\n }\n }\n }\n return classConstructors\n}\n\nexport function recursiveGenTSTypes(classConstructors: TonObjectsDict, key = ''): TonObjectsDict {\n if (key != '') {\n if (!(key in classConstructors)) {\n return classConstructors\n }\n const current = classConstructors[key]\n // if the class is incomplete, we need to resolve the dependencies first\n if (current.dependencies.length > 0) {\n current.dependencies.forEach((item) => {\n // to avoid repeating for the same class\n if (item in classConstructors) {\n if (classConstructors[item].tsTypeCode === undefined) {\n classConstructors = recursiveGenTSTypes(classConstructors, item)\n }\n }\n })\n }\n // then, we can generate the constructor code for the desired class [base case]\n classConstructors = generateTonClassTypes(key, classConstructors)\n } else {\n for (const [key, value] of Object.entries(classConstructors)) {\n if (value.tsTypeCode === undefined) {\n classConstructors = recursiveGenTSTypes(classConstructors, key)\n }\n }\n }\n return classConstructors\n}\n\nfunction getTsAttributeName(name: string): string {\n let modifiedName = name.replace(/::/g, '_')\n const fIndex = modifiedName.indexOf('_f_')\n if (fIndex !== -1) {\n modifiedName = modifiedName.substring(fIndex + 3)\n }\n return modifiedName\n}\n\nfunction generateTonClassTypes(name: string, tonClasses: TonObjectsDict): TonObjectsDict {\n if (!(name in tonClasses)) {\n return tonClasses\n }\n const tonClass = tonClasses[name]\n const capitalizedName = snakeToCamelCase(name).replace(/^./, (c) => c.toUpperCase())\n tonClass.is_md = name.toLowerCase().startsWith('md')\n const typeName = tonClass.is_md ? 'interface' : 'type'\n const extension = tonClass.is_md ? 'extends Md' : '='\n tonClass.tsTypeCode =\n `${typeName} ${capitalizedName} ${extension} {\n ${tonClass.attributes\n .map(({ name, type, dependencyName }) => {\n const modifiedName = getTsAttributeName(name)\n // check implicit dependencies and explicit ones all at once\n // convert slices to addresses in the types\n let attributeType = tonTypeToTStype(type, 'Address', true)\n if (type === 'obj_ref') {\n // we \"infer\" the type of the attribute from either its inputArg name (eg tuple path) or its dependency (which is its constant intial value in the constructor)\n const dependantClass = findClass(tonClasses, modifiedName) ?? findClass(tonClasses, dependencyName)\n // NOTE: janky janky janky\n if (dependantClass) {\n attributeType = dependantClass.constructorName.replace('getNew', '')\n }\n }\n\n return `${modifiedName}: ${attributeType};`\n })\n .join('\\n')}\n }` + '\\n\\n'\n\n tonClass.tsTypeName = capitalizedName\n tonClasses[name] = tonClass\n return tonClasses\n}\n\nfunction generateDeconstructorCodes(className: string, tonClasses: TonObjectsDict): TonObjectsDict {\n if (!(className in tonClasses)) {\n return tonClasses\n }\n const tonClass = tonClasses[className]\n const { attributes, tsTypeName, inverseFieldMap } = tonClass\n const fnName = snakeToCamelCase('get_' + className + 'ToTS')\n\n tonClass.deconstructorName = fnName\n tonClass.deconstructorCode = `\n static async ${fnName}(wrapper: ExtendedContract<TonContractWrapper>, cell: Cell): Promise<${tsTypeName}> {\n ${attributes\n .map(({ name, type, dependencyName }) => {\n const fieldTSName = getTsAttributeName(name)\n const tsGetterName = tsTypeToTSGetterName(tonTypeToTStype(type, 'Slice', false), 'wrapper')\n const fieldIndex = inverseFieldMap[name]\n\n if (type === 'obj_ref') {\n const dependencyClassType = (\n findClass(tonClasses, dependencyName) ?? findClass(tonClasses, fieldTSName)\n )?.tsTypeName\n if (dependencyClassType !== undefined) {\n const depDeconstructorName = snakeToCamelCase(`get_${dependencyClassType}ToTS`)\n return `const ${fieldTSName}_obj = await ${tsGetterName}(cell, ${fieldIndex}n);\n const ${fieldTSName} = await TonObjectUnwrapper.${depDeconstructorName}(wrapper, ${fieldTSName}_obj)`\n }\n }\n\n const tonGetterName = tonTypeToTonGetterName(type)\n if (tsGetterName === 'getLzDict') {\n return `const ${fieldTSName} = await getLzDict(cell, ${fieldIndex}n, wrapper)`\n } else if (tsGetterName === 'wrapper.getClInt') {\n return `const ${fieldTSName} = await ${tsGetterName}('${tonGetterName}', cell, ${fieldIndex}n)`\n } else {\n return `const ${fieldTSName} = await ${tsGetterName}(cell, ${fieldIndex}n)`\n }\n })\n .join('\\n')}\n return {\n ${attributes.map(({ name }) => `${getTsAttributeName(name)},`).join('\\n ')}\n }\n }`\n\n // don't generate deconstructor code for classes with no attributes [no attributes means something broke the type inference algorithm]\n if (attributes.length === 0) {\n tonClass.deconstructorCode = ''\n }\n\n tonClass.deconstructorCodeCallGenerator = (callerArgs: ConstructorArgs, _): string => {\n return `await ${fnName}(provider, obj)`\n }\n\n tonClass.deconstructorIncomplete = false\n tonClasses[className] = tonClass\n return tonClasses\n}\n\nexport function recursiveGenDeconstructorCode(classConstructors: TonObjectsDict, key = ''): TonObjectsDict {\n if (key != '') {\n if (!(key in classConstructors)) {\n return classConstructors\n }\n const current = classConstructors[key]\n // if the class is incomplete, we need to resolve the dependencies first\n if (current.deconstructorIncomplete === undefined || current.deconstructorIncomplete) {\n current.dependencies.forEach((item) => {\n // to avoid repeating for the same class\n if (item in classConstructors) {\n if (classConstructors[item].deconstructorCode === undefined) {\n classConstructors = recursiveGenDeconstructorCode(classConstructors, item)\n }\n }\n })\n }\n // then, we can generate the constructor code for the desired class [base case]\n classConstructors = generateDeconstructorCodes(key, classConstructors)\n } else {\n for (const [key, value] of Object.entries(classConstructors)) {\n if (value.deconstructorCode === undefined) {\n classConstructors = recursiveGenDeconstructorCode(classConstructors, key)\n }\n }\n }\n return classConstructors\n}\n\nexport function getSpecificFiles(dirPath: string, includeName: string): string[] {\n const files: string[] = []\n\n function traverseDir(currentPath: string): void {\n const entries = fs.readdirSync(currentPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(currentPath, entry.name)\n\n if (entry.isDirectory()) {\n traverseDir(fullPath)\n } else if (\n entry.isFile() &&\n entry.name.toLowerCase().includes(includeName) &&\n (path.extname(entry.name) === '.fc' || path.extname(entry.name) === '.func')\n ) {\n files.push(fullPath)\n }\n }\n }\n\n traverseDir(dirPath)\n return files\n}\n\nexport function saveObjectsAsTS(tonObjects: TonObjectsDict, filePath: string, fileName: string): void {\n let tsCode = `${file_signature_header}\\n\\nexport const tonObjects = {\\n`\n\n for (const [key, value] of Object.entries(tonObjects)) {\n // Skip entries that include 'action::'\n if (key.includes('action::')) {\n continue\n }\n\n tsCode += ` '${key}': {\\n name: '${value.tonName}',\\n`\n\n for (const attribute of value.attributes) {\n const intKey = value.inverseFieldMap[attribute.name]\n tsCode += ` ${intKey}: {\\n`\n tsCode += ` fieldName: '${key}::${attribute.name}',\\n`\n tsCode += ` fieldType: 'cl::t::${attribute.type}',\\n`\n tsCode += ` },\\n`\n }\n\n tsCode += ` },\\n`\n }\n\n tsCode += `} as const\\n`\n\n // Write the TypeScript code to the specified file\n fs.writeFileSync(path.resolve(filePath, fileName), tsCode, 'utf8')\n}\n\nfunction tonConstNameToTSName(name: string): string {\n return name.replace(/::/g, '_')\n}\n\nexport function extractConstants(fileNames: string[], constType: 'opcode' | 'error'): Map<string, bigint> {\n let firstFormat = /const int\\s+([\\w:]+::(?:OP|op)::\\w+)\\s*=\\s*\"([\\w:]+::(?:OP|op)::\\w+)\"c;/\n let secondFormat = /const\\s+(?:int\\s+)?([\\w:]+::[a-zA-Z]+::(?:op|OP)::\\w+)\\s*=\\s*(0x[\\da-fA-F]+);/\n let thirdFormat = /const\\s+(int\\s+)?(op::(\\w+))\\s*=\\s*(0x[0-9a-fA-F]+);/\n let fourthFormat = /^\\s*int\\s+(op::(\\w+))\\(\\)\\s+asm\\s+\"((?:0x)?[0-9a-fA-F]+)\\s+([A-Z]+)\"\\s*;$/\n let fifthFormat = /^\\s*const\\s+int\\s+(OP::[A-Z][a-zA-Z]+)\\s*=\\s*\"(OP::[A-Z][a-zA-Z]+)\"c\\s*;$/\n if (constType !== 'opcode') {\n firstFormat =\n /^const\\s+int\\s+((?:[A-Za-z_]+::)*[A-Za-z_]+)\\s*=\\s*(\"(?:[A-Za-z_]+::)*[A-Za-z_]+\")\\s*c\\s*&\\s*ERRORCODE_MASK;$/\n secondFormat = /^const\\s+(?:int\\s+)?(error::\\w+)\\s*=\\s*((?:0x[\\da-fA-F]+|\\d+));$/\n // we don't have a third, fourth or fifth format for errors\n thirdFormat = /(?!)/\n fourthFormat = /(?!)/\n fifthFormat = /(?!)/\n }\n const result = new Map<string, bigint>()\n for (const fileName of fileNames) {\n const fileContent = fs.readFileSync(fileName, 'utf-8')\n const lines = fileContent.split('\\n')\n for (const line of lines) {\n const trimmedLine = line.trim()\n let rawVariableName = ''\n let rawValue = ''\n let value = 0n\n\n const firstFormatMatch = trimmedLine.match(firstFormat)\n const secondFormatMatch = trimmedLine.match(secondFormat)\n const thirdFormatMatch = trimmedLine.match(thirdFormat)\n const fourthFormatMatch = trimmedLine.match(fourthFormat)\n const fifthFormatMatch = trimmedLine.match(fifthFormat)\n if (firstFormatMatch) {\n ;[, rawVariableName, rawValue] = firstFormatMatch as [string, string, string]\n value = getOpcodeCRC(rawValue)\n } else if (secondFormatMatch) {\n // Handle the new formats with direct hex values and flexible namespaces\n // value here is the hex value\n ;[, rawVariableName, rawValue] = secondFormatMatch as [string, string, string]\n value = BigInt(rawValue)\n } else if (thirdFormatMatch) {\n ;[, , rawVariableName, , rawValue] = thirdFormatMatch as [string, string, string, string, string]\n value = BigInt(rawValue)\n } else if (fourthFormatMatch) {\n ;[, rawVariableName, , rawValue] = fourthFormatMatch as [string, string, string, string]\n value = BigInt(rawValue)\n } else if (fifthFormatMatch) {\n ;[, rawVariableName, rawValue] = fifthFormatMatch as [string, string, string]\n value = getOpcodeCRC(rawValue)\n }\n\n if (constType !== 'opcode') {\n value = value & ERRORCODE_MASK\n }\n if (rawVariableName !== '' && rawValue !== '') {\n result.set(tonConstNameToTSName(rawVariableName), value)\n }\n }\n }\n return result\n}\n\nfunction asciiStringToBigint(str: string): bigint {\n let result = 0n\n for (let i = 0; i < str.length; i++) {\n result = (result << 8n) | BigInt(str.charCodeAt(i))\n }\n return result\n}\n\nexport function extractEvents(fileNames: string[]): Map<string, [string, bigint]> {\n const eventRegex = /^const\\s+(?:int\\s+)?([\\w:]+::[eE][vV][eE][nN][tT]::[\\w:]+)\\s*=\\s*\"([\\w:]+)\"[uc];$/\n\n const result = new Map<string, [string, bigint]>()\n for (const fileName of fileNames) {\n const fileContent = fs.readFileSync(fileName, 'utf-8')\n const lines = fileContent.split('\\n')\n for (const line of lines) {\n const trimmedLine = line.trim()\n let eventName = ''\n let eventString = ''\n const eventFormatMatch = trimmedLine.match(eventRegex)\n if (eventFormatMatch) {\n ;[, eventName, eventString] = eventFormatMatch as [string, string, string]\n result.set(tonConstNameToTSName(eventName), [eventString, asciiStringToBigint(eventString)])\n }\n }\n }\n return result\n}\n\nexport function saveEventsFile(\n events: Map<string, [string, bigint]>,\n directory: string,\n variableName: string,\n filename: string\n): void {\n const savedCode = `${file_signature_header}\nexport const ${variableName} = {\n${Array.from(events.entries())\n .map(([key, [rawValue, intValue]]) => ` ${key}: {stringValue: \"${rawValue}\", intValue: ${intValue}n},`)\n .join('\\n')}\n} as const\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function saveConstantsFile(\n constants: Map<string, bigint>,\n directory: string,\n variableName: string,\n filename: string\n): void {\n const savedCode = `${file_signature_header}\nexport const ${variableName} = {\n${Array.from(constants.entries())\n .map(([key, value]) => ` ${key}: ${value}n,`)\n .join('\\n')}\n} as const\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function generateAllViewFunctions(\n rootDir: string,\n nameWhitelist: string[],\n blacklist: string[]\n): TonViewFunctionsDict {\n const contractDirs: string[] = []\n const viewFunctions: TonViewFunctionsDict = {}\n\n // Step 1 & 2: Iterate through subfolders and create contractDirs list\n function findContractDirs(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n\n const isAContractFolder = entries.some((entry) => !entry.isDirectory() && nameWhitelist.includes(entry.name))\n\n if (isAContractFolder && !blacklist.some((word) => dir.includes(word))) {\n contractDirs.push(dir)\n }\n\n entries.forEach((entry) => {\n if (entry.isDirectory()) {\n findContractDirs(path.join(dir, entry.name))\n }\n })\n }\n\n findContractDirs(rootDir)\n\n // Step 3: Analyze *.fc and *.func files in contractDirs\n contractDirs.forEach((dir) => {\n const files = fs.readdirSync(dir).filter((file) => file.endsWith('.fc') || file.endsWith('.func'))\n\n files.forEach((file) => {\n const filePath = path.join(dir, file)\n const contractName = snakeToCamelCase(path.basename(path.dirname(dir)) + '_' + path.basename(dir))\n const content = fs.readFileSync(filePath, 'utf-8')\n\n const functionRegex =\n /(\\((?:[^()]+,\\s*)*[^()]+\\)|[\\w:]+)\\s+(\\w+(?:::\\w+)*)\\s*\\(([\\w\\s,$·]*)\\)\\s*·?\\s*(impure)?\\s*(inline\\s*)?method_id\\s*\\{([^}]*)\\}/g\n let match\n\n while ((match = functionRegex.exec(content)) !== null) {\n const [, returnType, name, argsString, , _body] = match\n // skip the constructors\n if (name.includes('::New')) {\n continue\n }\n const tonArgs: { [key: string]: string } = {}\n const tsArgs: { [key: string]: string } = {}\n\n const argPairs = argsString.split(',').map((arg) => arg.trim())\n for (const argPair of argPairs) {\n const [argType, argName] = argPair.split(/\\s+/) as [string, string?]\n if (argName !== undefined) {\n tonArgs[argName.replace('$', '')] = argType\n tsArgs[argName.replace('$', '')] = tonTypeToTStype(argType, 'Address', true)\n }\n }\n\n // parse the return type\n const tonReturnTypes = returnType\n .split(',')\n .map((type) => type.replace(/\\(/g, '').replace(/\\)/g, '').trim())\n const tsReturnTypes = tonReturnTypes.map((type) => tonTypeToTStype(type, 'Address', false))\n\n if (!(contractName in viewFunctions)) {\n viewFunctions[contractName] = []\n }\n\n const fnName = snakeToCamelCase('get_' + name)\n\n const code = `\n static async ${fnName}(\n contract: ExtendedContract<TonContractWrapper>, \n ${Object.entries(tsArgs)\n .map(([argName, argType]) => `${argName}: ${argType}`)\n .join(', ')}\n ): Promise<[${tsReturnTypes.join(', ')}]> {\n const args: TupleItem[] = [\n ${Object.entries(tonArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(tonArgs).length > 0 ? argName : argName, argType)} }`\n )\n .join(',\\n ')}\n ]\n const stack = await contract.getViewFunction('${name}', args)\n return [\n ${tonReturnTypes\n .map((_, index) => `stack.${tonTypeToReadTupleFunction(tonReturnTypes[index])}`)\n .join(',\\n')}\n ]\n }\n `\n viewFunctions[contractName].push({\n name: fnName,\n args: tonArgs,\n returnType: tonReturnTypes,\n code,\n })\n }\n })\n })\n return viewFunctions\n}\n\nexport function saveViewFunctions(viewFunctions: TonViewFunctionsDict, directory: string, filename: string): void {\n const generatedFunctions = Object.entries(viewFunctions)\n .map(\n ([contractName, functions]) => `export class ${contractName} {\n ${functions.map((fn) => fn.code).join('\\n\\n')}\n }`\n )\n .join('\\n\\n')\n\n const savedCode = `${file_signature_header}\nimport { Address, Cell, Tuple, TupleItem, beginCell } from '@ton/core'\n\nimport { ExtendedContract, TonContractWrapper } from '../wrappers'\n\n${generatedFunctions}\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n","import { Address, Cell, Contract, ContractProvider, SendMode, Sender, SenderArguments, beginCell } from '@ton/core'\n\nimport { beginMessage, randomQueryId, sendRequest } from './utils'\n\nexport interface SendRequestOptions {\n value: number | bigint | string\n bounce?: boolean\n sendMode?: SendMode\n queryId?: number | bigint\n withInit?: boolean\n}\n\nexport abstract class BaseWrapper implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint | string): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n buildSenderArguments(body: Cell, opts: SendRequestOptions): SenderArguments {\n return {\n value: BigInt(opts.value),\n to: this.address,\n bounce: opts.bounce ?? true,\n body,\n init: opts.withInit === true ? this.init : undefined,\n sendMode: opts.sendMode ?? SendMode.PAY_GAS_SEPARATELY,\n } satisfies SenderArguments\n }\n\n async sendRequest(provider: ContractProvider, via: Sender, request: SenderArguments): Promise<void> {\n return sendRequest(provider, via, request)\n }\n\n async sendArbitraryOp(\n provider: ContractProvider,\n via: Sender,\n op_code: number,\n opts: { value: bigint | string; queryId?: number | bigint }\n ): Promise<void> {\n await provider.internal(via, {\n value: opts.value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginMessage(op_code, opts.queryId ?? randomQueryId()).endCell(),\n })\n }\n\n async getDeployed(provider: ContractProvider): Promise<boolean> {\n const state = await provider.getState()\n return state.state.type !== 'uninit'\n }\n}\n","import fs from 'fs'\nimport path from 'path'\n\nexport function generateTestUtilsCode(directory: string, filename: string): void {\n const savedCode = `import fs from 'fs'\n\nimport { Address, Cell, Dictionary, SendMode, TupleItemCell, TupleItemInt, beginCell, toNano } from '@ton/core'\nimport {\n Blockchain,\n BlockchainTransaction,\n SandboxContract,\n SendMessageResult,\n Treasury,\n TreasuryContract,\n} from '@ton/sandbox'\nimport { FlatTransactionComparable } from '@ton/test-utils'\n\nimport ChannelArtifact from '@layerzerolabs/layerzero-v2-ton/build/Channel.compiled.json'\nimport ControllerArtifact from '@layerzerolabs/layerzero-v2-ton/build/Controller.compiled.json'\nimport EndpointArtifact from '@layerzerolabs/layerzero-v2-ton/build/Endpoint.compiled.json'\nimport MultiSigArtifact from '@layerzerolabs/layerzero-v2-ton/src/multisig/bocs/MultiSig.compiled.json'\nimport MultiSigOrderArtifact from '@layerzerolabs/layerzero-v2-ton/src/multisig/bocs/MultiSigOrder.compiled.json'\nimport SmlConnectionArtifact from '@layerzerolabs/layerzero-v2-ton/build/SmlConnection.compiled.json'\nimport SmlManagerArtifact from '@layerzerolabs/layerzero-v2-ton/build/SmlManager.compiled.json'\nimport ZroMinterArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroMinter.compiled.json'\nimport ZroWalletArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroWallet.compiled.json'\n\nimport {\n JettonMinter,\n JettonWallet,\n MultiSigOpCodes,\n Multisig,\n Order,\n Profile,\n TransferRequest,\n buildOnchainMetadata,\n cellFromArtifact,\n getRandomInt,\n printTransactionTrace,\n} from '@layerzerolabs/ton-sdk-tools'\n\nimport {\n LzDict,\n LzEventHandler,\n MdPacketSent,\n OPCODES,\n TonContractWrapper,\n TonObjectUnwrapper,\n addressToBigInt,\n beginMessage,\n} from '../src'\n\nconst invertedOpcodes = Object.fromEntries(Object.entries(OPCODES).map(([key, value]) => [value.toString(), key]))\nconst SML_MANAGER_DEFAULT_VERSION = BigInt(1)\nconst SML_MANAGER_CUSTOM_VERSION = BigInt(2)\nexport const zroOnchainMetaData = {\n name: 'LayerZero',\n symbol: 'ZRO',\n decimals: '9',\n}\n\n// ==============================PROTOCOL SETUP GAS==============================\n\n// todo update these to be accurate when ready. To fragile now during development\nexport const protocolSetupGas = {\n 'AllStorages.INITIALIZE': toNano('10'), // 0.149082\n 'Controller.INITIALIZE': toNano('10'), // 0.30265\n 'Controller.OP_DEPLOY_ENDPOINT': toNano('10'), // 0.176136\n 'MsgLib.INITIALIZE': toNano('10'), // 0.024\n 'Controller.OP_ADD_MSGLIB': toNano('10'), // 0.072949\n 'Controller.SET_EP_CONFIG_DEFAULTS': toNano('10'), // 0.053516\n 'Msglib.SET_MSGLIB_CONFIG': toNano('10'), // 0.023659\n}\n\n// ==========================OAPP SETUP GAS==============================\n\n// todo update these to be accurate when ready. To fragile now during development\nexport const oAppSetupGas = {\n 'OApp.INITIALIZE': toNano('10'), // 0.366814\n 'OApp.DEPLOY_CHANNEL': toNano('10'), // '0.356408'\n 'OApp.SET_PEER': toNano('10'), // 0.1701124\n}\n\n// ==========================OAPP FLOW GAS==============================\n\nexport const OAppFlowGas = {\n 'Msglib.VERIFY': toNano('10'), // 0.024811\n 'Msglib.COMMIT_PACKET': toNano('10'), // 0.128602\n 'Channel.LZ_RECEIVE_PREPARE': toNano('10'), // 0.117495\n 'Channel.LZ_RECEIVE_PREPARE_ABA': toNano('10'), // 0.342103 + 0.235917 = 0.57802\n}\n\nexport const emptyObject = beginCell().storeUint(0, 1).endCell()\n\n// ============================== INTEGRATION HELPER FUNCTIONS==============================\n\nexport function logAddresses(\n multiSigOwner1: SandboxContract<TreasuryContract>,\n multiSigOwner2: SandboxContract<TreasuryContract>,\n multiSigOwner3: SandboxContract<TreasuryContract>,\n srcFixture: OAppFixture,\n dstFixture?: OAppFixture,\n additionalLogData?: LogData, // Optional additional data\n printBigInt = false\n): void {\n const formatAddress = (address: Address, printBigInt = false): string | bigint => {\n if (printBigInt) {\n return BigInt('0x' + address.hash.toString('hex'))\n }\n return address.toString()\n }\n\n const collectAddresses: (\n prefix: string,\n protocolHeader: string,\n oappHeader: string,\n fixture: OAppFixture\n ) => {\n [p: string]: string | bigint | null\n } = function (prefix: string, protocolHeader: string, oappHeader: string, fixture: OAppFixture) {\n return {\n [\\`--- $\\{protocolHeader} ---\\`]: '', // Custom separator\n [\\`$\\{prefix}.multisig.address\\`]: formatAddress(fixture.multisig.address),\n [\\`$\\{prefix}.controller.address\\`]: formatAddress(fixture.controller.address),\n [\\`$\\{prefix}.endpoint.address\\`]: formatAddress(fixture.endpoint.address),\n [\\`$\\{prefix}.smlManagerDefault.address\\`]: formatAddress(fixture.msglibManagerDefault.address),\n [\\`$\\{prefix}.smlManagerCustom.address\\`]: formatAddress(fixture.msglibManagerCustom.address),\n [\\`--- $\\{oappHeader} ---\\`]: '', // Custom separator\n [\\`$\\{prefix}.owner.address\\`]: formatAddress(fixture.owner.address),\n [\\`$\\{prefix}.OApp.address\\`]: formatAddress(fixture.oApp.address),\n [\\`$\\{prefix}.channel.address\\`]: formatAddress(fixture.channel.address),\n [\\`$\\{prefix}.smlConnectionDefault.address\\`]: formatAddress(fixture.msglibConnectionDefault.address),\n [\\`$\\{prefix}.smlConnectionCustom.address\\`]: formatAddress(fixture.msglibConnectionCustom.address),\n }\n }\n\n // Collect log data from the deployer and fixtures\n const logData: LogData = {\n '--- Protocol Multisig Signers ---': '', // Separator\n 'multiSigOwner1.address': formatAddress(multiSigOwner1.address),\n 'multiSigOwner2.address': formatAddress(multiSigOwner2.address),\n 'multiSigOwner3.address': formatAddress(multiSigOwner3.address),\n ...collectAddresses('srcFixture', 'Source Protocol Addresses', 'Source OApp Addresses', srcFixture),\n ...(dstFixture ? collectAddresses('dstFixture', 'Destination Protocol Addresses', 'Destination OApp Addresses', dstFixture) : {}),\n }\n\n // Format addresses in additionalLogData if printBigInt is enabled\n const formattedAdditionalLogData = additionalLogData\n ? Object.fromEntries(\n Object.entries(additionalLogData).map(([key, value]) => [\n key,\n Address.isAddress(value) ? formatAddress(value) : value,\n ])\n )\n : {}\n\n // Merge all log data and print\n const combinedLogData = { ...logData, ...formattedAdditionalLogData }\n console.log(combinedLogData)\n}\n\nexport function setToOneAndRemoveLeadingOnes(arr: number[], index: number): bigint {\n if (index >= 0 && index < arr.length) {\n arr[index] = 1\n\n let count = BigInt(0)\n while (arr[0] === 1) {\n count++\n arr.shift() // Remove the first element (leading 1)\n arr.push(0) // Add a 0 at the end to maintain array length\n }\n return count\n } else {\n console.error('Index out of bounds')\n return 0n\n }\n}\n\nexport function randomizeNonces(firstUncommittedNonceBefore: bigint, firstUncommittedNonce: bigint): bigint[] {\n const nonces: bigint[] = []\n for (let nonce = firstUncommittedNonceBefore; nonce < firstUncommittedNonce; nonce++) {\n nonces.push(nonce)\n }\n\n // Shuffle the array (Fisher-Yates shuffle algorithm)\n for (let i = nonces.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[nonces[i], nonces[j]] = [nonces[j], nonces[i]] // Swap elements\n }\n\n return nonces\n}\n\nexport async function createLzPacketFromPacketEncoded(\n encodedPacket: Cell,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('BytesDecoder::decode<PacketV1>', [{ type: 'cell', cell: encodedPacket }])\n ).pop() as TupleItemCell\n ).cell\n}\n\nexport async function createLzPacketFromPacketEncodedOverrideNonce(\n encodedPacket: Cell,\n newNonce: bigint,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('BytesDecoder::decodeAndOverrideNonce<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\n\n// ===============================INTERFACES===============================\n\nexport interface LogData {\n [key: string]: string | bigint\n}\n\nexport interface SendInternalMessageAndExpectArgs {\n sender: Treasury\n contract: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n opCode: bigint\n md: Cell\n value: bigint\n balanceRefill?: bigint\n queryId?: bigint\n profile?: Profile\n}\n\ninterface sendMessageViaMultisigAndExpectArgs {\n blockchain: Blockchain\n multiSigContract: SandboxContract<Multisig>\n messageBody: Cell\n signers: SandboxContract<TreasuryContract>[]\n targetContract: SandboxContract<TonContractWrapper | JettonMinter>\n deploy: boolean\n expectedTransactions: FlatTransactionComparable[]\n}\n\nexport interface OutOfOrder {\n actions: Action[]\n}\n\nexport interface Action {\n actionType: string\n fromEid: bigint\n toEid: bigint\n}\n\nexport interface ProtocolFixture {\n multisig: SandboxContract<Multisig>\n eid: bigint\n controller: SandboxContract<TonContractWrapper>\n endpoint: SandboxContract<TonContractWrapper>\n msglibManagerDefault: SandboxContract<TonContractWrapper>\n msglibManagerCustom: SandboxContract<TonContractWrapper>\n}\n\nexport interface OAppFixture extends ProtocolFixture {\n owner: SandboxContract<TreasuryContract>\n oApp: SandboxContract<TonContractWrapper>\n path: Cell\n channel: SandboxContract<TonContractWrapper>\n msglibConnectionDefault: SandboxContract<TonContractWrapper>\n msglibConnectionCustom: SandboxContract<TonContractWrapper>\n}\n\nexport const ActionTypes: { [key: string]: bigint } = {\n increment: BigInt(1),\n aba: BigInt(2),\n}\n\nexport interface PacketsInFlight {\n fromEid: bigint\n toEid: bigint\n nonce: bigint\n lzPacket: Cell\n}\n\nexport interface SendOptions {\n dstEid: bigint\n incrementType: bigint\n extraOptions: Cell\n nativeFee: bigint\n zroFee: bigint\n}\n\n// ==============================INTEGRATION HELPER FUNCTIONS==============================\n\n// subtract percent from value\nexport function getOutOfGasValue(value: string, percent: number): bigint {\n const num = parseFloat(value)\n return toNano(num - num * percent)\n}\n\nexport function readJsonFile(filePath: string): any {\n // Check if the file exists\n if (!fs.existsSync(filePath)) {\n throw new Error(\\`File does not exist: $\\{filePath}\\`)\n }\n\n // Read the file content as a string\n const fileContent = fs.readFileSync(filePath, 'utf8')\n\n try {\n // Parse the string into a JSON object\n return JSON.parse(fileContent)\n } catch (error) {\n throw new Error(\\`Error parsing JSON from file: $\\{filePath}\\`)\n }\n}\n\nexport async function buildNonceMd(nonce: bigint, allStorages: SandboxContract<TonContractWrapper>): Promise<Cell> {\n return allStorages.getObject('md::Nonce::New', [{ type: 'int', value: nonce }])\n}\n\nexport async function buildLzReceivePrepareMd(nonce: bigint, nanotons: bigint, allStorages: SandboxContract<TonContractWrapper>): Promise<Cell> {\n return allStorages.getObject('md::LzReceivePrepare::New', [{ type: 'int', value: nonce }, { type: 'int', value: nanotons }])\n}\n\nexport function buildMessageBody(donationNanos: number, origin: Address, opcode: number, md: Cell): Cell {\n return beginMessage(opcode)\n .storeUint(donationNanos, 64)\n .storeUint(addressToBigInt(origin), 256)\n .storeRef(md)\n .endCell()\n}\n\nexport async function sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody,\n signers,\n targetContract,\n deploy,\n expectedTransactions = [],\n}: sendMessageViaMultisigAndExpectArgs): Promise<SendMessageResult> {\n const curTime = (): number => blockchain.now ?? Math.floor(Date.now() / 1000)\n\n const initialSeqno = (await multiSigContract.getMultisigData()).nextOrderSeqno\n const orderAddress = await multiSigContract.getOrderAddress(initialSeqno)\n\n const rawMessageBuilder = beginCell().storeUint(0x18, 6).storeAddress(targetContract.address).storeCoins(0)\n\n let rawMessageCell: Cell\n\n if (deploy) {\n const targetContractStateInit = beginCell()\n .storeUint(6, 5)\n .storeRef(targetContract.init!.code)\n .storeRef(targetContract.init!.data)\n .endCell()\n\n rawMessageCell = rawMessageBuilder\n .storeUint(7, 108)\n .storeRef(targetContractStateInit)\n .storeRef(messageBody)\n .endCell()\n } else {\n rawMessageCell = rawMessageBuilder.storeUint(1, 107).storeRef(messageBody).endCell()\n }\n\n const orderMsg: TransferRequest = {\n type: 'transfer',\n sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE,\n message: rawMessageCell,\n }\n\n // one of the signers proposes deploying the controller\n let internalMsgResults = await multiSigContract.sendNewOrder(signers[0].getSender(), [orderMsg], curTime() + 100)\n\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: orderAddress,\n deploy: true,\n success: true,\n })\n\n const orderContract = blockchain.openContract(Order.createFromAddress(orderAddress))\n const orderDataBefore = await orderContract.getOrderData()\n\n // proposal by a signer is considered automatically approved\n expect(orderDataBefore.approvals_num).toBe(1)\n expect(orderDataBefore.executed).toBe(false)\n\n // approve it by the other 2 signers\n internalMsgResults = await orderContract.sendApprove(signers[1].getSender(), 1)\n internalMsgResults = await orderContract.sendApprove(signers[2].getSender(), 2)\n\n // the order should send tell the multisig to execute the order\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: orderAddress,\n to: multiSigContract.address,\n op: MultiSigOpCodes.multisig.execute,\n success: true,\n })\n\n // the multisig should deliver the message to the target contract\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: targetContract.address,\n // deploy,\n success: true,\n })\n\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n\n return internalMsgResults\n}\n\nexport async function sendInternalMessageAndExpect({\n sender,\n contract,\n opCode,\n md,\n expectedTransactions,\n value,\n balanceRefill = BigInt(0),\n queryId = BigInt(1),\n profile,\n}: SendInternalMessageAndExpectArgs): Promise<SendMessageResult> {\n const internalMsgResults = await contract.sendInternalMessage(sender, opCode, md, { value }, balanceRefill, queryId)\n\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n if (profile?.profileGas ?? false) {\n const { stack } = new Error()\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n printTransactionTrace(internalMsgResults.transactions, invertedOpcodes, stack, profile)\n }\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n return internalMsgResults\n}\n\nexport function toHaveTransactions(\n actualTransactions: BlockchainTransaction[],\n expectedTransactions: FlatTransactionComparable[]\n): void {\n expectedTransactions.forEach((tx) => {\n expect(actualTransactions).toHaveTransaction(tx)\n })\n}\n\nasync function checkZroDeploymentStatus(\n toZroWallet: SandboxContract<JettonWallet>\n): Promise<{ deployFlag: boolean; initialZroBalance: bigint }> {\n let deployFlag = false\n let initialZroBalance = 0n\n\n try {\n initialZroBalance = await toZroWallet.getBalance()\n } catch (e) {\n deployFlag = true\n }\n\n return { deployFlag, initialZroBalance }\n}\n\nexport async function mintZro(\n zroOwner: SandboxContract<TreasuryContract>,\n zroMinter: SandboxContract<JettonMinter>,\n toAddress: Address,\n toZroWallet: SandboxContract<JettonWallet>,\n zroAmount: bigint,\n tonAmount: bigint,\n fwdTonAmount: bigint\n): Promise<void> {\n const initialTotalSupply = await zroMinter.getTotalSupply()\n const { deployFlag, initialZroBalance } = await checkZroDeploymentStatus(toZroWallet)\n const mintResult = await zroMinter.sendMint(zroOwner.getSender(), toAddress, zroAmount, tonAmount, fwdTonAmount)\n toHaveTransactions(mintResult.transactions, [\n {\n from: zroOwner.address,\n to: zroMinter.address,\n success: true,\n op: Number(OPCODES.op_mint), // int op::mint() asm \"21 PUSHINT\";\n },\n {\n from: zroMinter.address,\n to: toZroWallet.address,\n op: Number(OPCODES.op_internal_transfer), // op::internal_transfer = 0x178d4519\n success: true,\n deploy: deployFlag,\n },\n {\n from: toZroWallet.address,\n to: toAddress,\n op: Number(OPCODES.op_transfer_notification), // OP_TRANSFER_NOTIFICATION = 0x7362d09c\n success: true,\n },\n {\n from: toZroWallet.address,\n to: zroMinter.address,\n op: Number(OPCODES.op_excesses_copy), // op::excesses = 0xd53276db;\n success: false, // this is suppose to fail because minter contract cant handle excess op code\n },\n ])\n expect(await toZroWallet.getBalance()).toEqual(initialZroBalance + zroAmount)\n expect(await zroMinter.getTotalSupply()).toEqual(initialTotalSupply + zroAmount)\n}\n\nexport async function mintZroViaMultisig(\n blockchain: Blockchain,\n multiSigContract: SandboxContract<Multisig>,\n zroMinter: SandboxContract<JettonMinter>,\n toAddress: Address,\n toZroWallet: SandboxContract<JettonWallet>,\n zroAmount: bigint,\n tonAmount: bigint,\n fwdTonAmount: bigint,\n signers: SandboxContract<TreasuryContract>[]\n): Promise<void> {\n const initialTotalSupply = await zroMinter.getTotalSupply()\n const { deployFlag, initialZroBalance } = await checkZroDeploymentStatus(toZroWallet)\n\n const mintResult = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: JettonMinter.mintMessage(\n zroMinter.address,\n toAddress,\n zroAmount,\n tonAmount + toNano('0.015'),\n fwdTonAmount\n ),\n signers,\n targetContract: zroMinter,\n deploy: deployFlag,\n expectedTransactions: [],\n })\n\n toHaveTransactions(mintResult.transactions, [\n {\n from: multiSigContract.address,\n to: zroMinter.address,\n success: true,\n op: Number(OPCODES.op_mint), // int op::mint() asm \"21 PUSHINT\";\n },\n {\n from: zroMinter.address,\n to: toZroWallet.address,\n op: Number(OPCODES.op_internal_transfer), // op::internal_transfer = 0x178d4519\n success: true,\n deploy: deployFlag,\n },\n {\n from: toZroWallet.address,\n to: toAddress,\n op: Number(OPCODES.op_transfer_notification), // OP_TRANSFER_NOTIFICATION = 0x7362d09c\n success: true,\n },\n {\n from: toZroWallet.address,\n to: zroMinter.address,\n op: Number(OPCODES.op_excesses_copy), // op::excesses = 0xd53276db;\n success: false, // this is suppose to fail because minter contract cant handle excess op code\n },\n ])\n expect(await toZroWallet.getBalance()).toEqual(initialZroBalance + zroAmount)\n expect(await zroMinter.getTotalSupply()).toEqual(initialTotalSupply + zroAmount)\n}\n\nexport async function depositZro(\n from: SandboxContract<TreasuryContract>,\n fromZroWallet: SandboxContract<JettonWallet>,\n multsig: SandboxContract<Multisig>,\n multsigZroWallet: SandboxContract<JettonWallet>,\n controller: SandboxContract<TonContractWrapper>,\n channel: SandboxContract<TonContractWrapper>,\n path: Cell,\n zroAmount: bigint,\n tonAmount: bigint,\n fwdTonAmount: bigint\n): Promise<void> {\n const { deployFlag, initialZroBalance } = await checkZroDeploymentStatus(multsigZroWallet)\n const transferResult = await fromZroWallet.sendTransfer(\n from.getSender(),\n tonAmount,\n zroAmount,\n multsig.address,\n controller.address,\n beginCell().endCell(),\n fwdTonAmount,\n path\n )\n toHaveTransactions(transferResult.transactions, [\n {\n from: from.address,\n to: fromZroWallet.address,\n success: true,\n op: Number(OPCODES.op_transfer), // TRANSFER: 0xf8a7ea5\n },\n {\n from: fromZroWallet.address,\n to: multsigZroWallet.address,\n op: Number(OPCODES.op_internal_transfer), // op::internal_transfer = 0x178d4519\n success: true,\n deploy: deployFlag,\n },\n {\n from: multsigZroWallet.address,\n to: multsig.address,\n op: Number(OPCODES.op_transfer_notification), // OP_TRANSFER_NOTIFICATION = 0x7362d09c\n success: true,\n },\n {\n from: multsigZroWallet.address,\n to: controller.address,\n op: Number(OPCODES.op_excesses_copy), // op::excesses = 0xd53276db;\n success: true,\n },\n {\n from: controller.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_DEPOSIT_ZRO),\n success: true,\n },\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT), // Channel::event::ZRO_DEPOSITED\n success: false, // events are supposed to fail\n },\n ])\n expect(await multsigZroWallet.getBalance()).toEqual(initialZroBalance + zroAmount)\n}\n\nexport async function commitVerificationAndExpect(\n lzPacketCell: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n {\n endpoint,\n channel,\n msglibManagerDefault: smlManager,\n msglibConnectionDefault: smlConnection,\n controller,\n }: OAppFixture,\n profile?: Profile\n): Promise<void> {\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Msglib.COMMIT_PACKET'],\n sender: deployer.getSender(),\n contract: smlManager,\n opCode: OPCODES.SmlManager_OP_SML_MANAGER_COMMIT_PACKET,\n md: await smlManager.getNewMdMdAddressCell({\n md: lzPacketCell,\n address: addressToBigInt(endpoint.address),\n }),\n expectedTransactions: [\n {\n from: deployer.address,\n to: smlManager.address,\n op: Number(OPCODES.SmlManager_OP_SML_MANAGER_COMMIT_PACKET),\n success: true,\n },\n {\n from: smlManager.address,\n to: smlConnection.address,\n op: Number(OPCODES.SmlConnection_OP_SML_CONNECTION_COMMIT_PACKET),\n success: true,\n },\n {\n from: smlConnection.address,\n to: endpoint.address,\n op: Number(OPCODES.Endpoint_OP_ENDPOINT_COMMIT_PACKET),\n success: true,\n },\n {\n from: endpoint.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_CHANNEL_COMMIT_PACKET),\n success: true,\n },\n // emit event channel::EVENT::MESSAGE_COMMITTED\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n {\n from: channel.address,\n to: smlConnection.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_COMMIT_PACKET_CALLBACK),\n success: true,\n },\n {\n from: smlConnection.address,\n to: smlManager.address,\n op: Number(OPCODES.SmlManager_OP_SML_MANAGER_COMMIT_PACKET_CALLBACK),\n success: true,\n },\n // refund excess ton\n {\n from: smlManager.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, smlManager)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\nexport async function lzReceiveAndExpect(\n nonceMd: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n { oApp, channel, controller }: OAppFixture,\n profile?: Profile\n): Promise<void> {\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Channel.LZ_RECEIVE_PREPARE'],\n sender: deployer.getSender(),\n contract: channel,\n opCode: OPCODES.Channel_OP_LZ_RECEIVE_PREPARE,\n md: nonceMd,\n expectedTransactions: [\n {\n from: deployer.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_LOCK),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_EXECUTE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_EXECUTE_CALLBACK),\n success: true,\n },\n // emit event channel::EVENT::PACKET_DELIVERED\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n // refund excess ton\n {\n from: channel.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, channel)\n // expect last event to be packet delivered\n expect(eventHandler.allVictories.eventObjects[eventHandler.allVictories.eventObjects.length - 1].topic).toBe(\n 'Channel::event::DELIVERED'\n )\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\nexport async function lzReceiveAbaAndExpect(\n nonceMd: Cell,\n oApp: SandboxContract<TonContractWrapper>,\n deployer: SandboxContract<TreasuryContract>,\n channel: SandboxContract<TonContractWrapper>,\n controller: SandboxContract<TonContractWrapper>,\n endpoint: SandboxContract<TonContractWrapper>,\n smlManager: SandboxContract<TonContractWrapper>,\n smlConnection: SandboxContract<TonContractWrapper>,\n eventHandler: LzEventHandler,\n profile?: Profile\n): Promise<MdPacketSent> {\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Channel.LZ_RECEIVE_PREPARE_ABA'],\n sender: deployer.getSender(),\n contract: channel,\n opCode: OPCODES.Channel_OP_LZ_RECEIVE_PREPARE,\n md: nonceMd,\n expectedTransactions: [\n {\n from: deployer.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_LOCK),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_EXECUTE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_EXECUTE_CALLBACK),\n success: true,\n },\n // emit event channel::EVENT::PACKET_DELIVERED\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n // // refund excess ton\n {\n from: oApp.address,\n to: channel.address,\n success: true,\n },\n {\n from: oApp.address,\n to: endpoint.address,\n op: Number(OPCODES.Endpoint_OP_ENDPOINT_SEND),\n success: true,\n },\n {\n from: endpoint.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_CHANNEL_SEND),\n success: true,\n },\n {\n from: channel.address,\n to: smlConnection.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_SEND),\n success: true,\n },\n {\n from: smlConnection.address,\n to: smlManager.address,\n op: Number(OPCODES.SmlManager_OP_SML_MANAGER_SEND),\n success: true,\n },\n {\n from: smlManager.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_MSGLIB_SEND_CALLBACK),\n success: true,\n },\n // emit event channel::event::SEND_SUCCESS\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_CHANNEL_SEND_CALLBACK),\n success: true,\n },\n // refund excess ton\n {\n from: oApp.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, channel)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n // expect two packet sents (A->B) and (B->A)\n expect(eventHandler.allVictories.packetsSent.length).toBe(2)\n // return the most recent packet sent\n return eventHandler.allVictories.packetsSent[eventHandler.allVictories.packetsSent.length - 1]\n}\n\n// ===============================HELPER ASSERTS===============================\n\nexport async function assertFirstUncommitedNonce(\n channel: SandboxContract<TonContractWrapper>,\n expectedValue: bigint\n): Promise<void> {\n const firstUncommittedNonce = (await channel.getViewFunction('_viewInboundNonce', [])).pop() as TupleItemInt\n expect(firstUncommittedNonce.value).toEqual(expectedValue - BigInt(1)) // _viewInboundNonce subtracts 1 from actual value\n}\n\nexport async function assertZroBalance(\n channel: SandboxContract<TonContractWrapper>,\n expectedValue: bigint\n): Promise<void> {\n const channelTS = await TonObjectUnwrapper.getChannelToTS(channel, await channel.getCurrentStorageCell())\n expect(channelTS.zroBalance).toEqual(expectedValue)\n}\n\nexport async function getFromDict(\n dict: LzDict,\n key: bigint,\n contract: SandboxContract<TonContractWrapper>,\n is_bigint: boolean\n): Promise<number | bigint> {\n let value: bigint | number = -1\n try {\n if (is_bigint) {\n value = (await dict.get(key, contract)).beginParse().loadUintBig(256)\n } else {\n value = (await dict.get(key, contract)).beginParse().loadUint(256)\n }\n } catch (error: any) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n if (error.toString() == 'Error: Not a cell: null') {\n return 0\n } else {\n throw error\n }\n }\n return value\n}\n\nexport async function getZroWallet(\n blockchain: Blockchain,\n ownerAddress: Address,\n toAddress: Address\n): Promise<SandboxContract<JettonWallet>> {\n const zroMinter: SandboxContract<JettonMinter> = blockchain.openContract(\n JettonMinter.createFromConfig(\n {\n admin: ownerAddress,\n content: buildOnchainMetadata(zroOnchainMetaData),\n wallet_code: cellFromArtifact(ZroWalletArtifact),\n },\n cellFromArtifact(ZroMinterArtifact)\n )\n )\n\n return blockchain.openContract(JettonWallet.createFromAddress(await zroMinter.getWalletAddress(toAddress)))\n}\n\nexport function addLibToBlockchain(blockchain: Blockchain, newLib: Cell): void {\n let libsDict: Dictionary<bigint, Cell>\n if (blockchain.libs) {\n libsDict = blockchain.libs.beginParse().loadDictDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n } else {\n libsDict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n }\n libsDict.set(BigInt(\\`0x\\${newLib.hash().toString('hex')}\\`), newLib)\n blockchain.libs = beginCell().storeDictDirect(libsDict).endCell()\n}\n\nexport async function openAndDeployControllerViaMultiSig(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigContract: SandboxContract<Multisig>,\n multiSigners: SandboxContract<TreasuryContract>[],\n eid: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const controller: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ControllerArtifact),\n await allStorages.getNewControllerCell({\n owner: addressToBigInt(multiSigContract.address),\n eid,\n endpointCode: cellFromArtifact(EndpointArtifact),\n channelCode: cellFromArtifact(ChannelArtifact),\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: controller.buildRequest(\n OPCODES.BaseInterface_OP_INITIALIZE,\n emptyObject,\n { value: protocolSetupGas['Controller.INITIALIZE'] },\n toNano('1')\n ).body!,\n signers: multiSigners,\n targetContract: controller,\n deploy: true,\n expectedTransactions: [\n {\n from: multiSigContract.address,\n to: controller.address,\n success: true,\n },\n ],\n })\n\n return [controller, internalMsgResults]\n}\n\nexport async function setControllerZroWalletViaMultisig(\n blockchain: Blockchain,\n multiSigContract: SandboxContract<Multisig>,\n controller: SandboxContract<TonContractWrapper>,\n zroMinter: SandboxContract<JettonMinter>,\n multiSigners: SandboxContract<TreasuryContract>[]\n): Promise<SendMessageResult> {\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: controller.buildRequest(\n OPCODES.Controller_OP_SET_ZRO_WALLET,\n await controller.getNewMdSetAddressCell({\n address: addressToBigInt(await zroMinter.getWalletAddress(multiSigContract.address)),\n }),\n { value: toNano('1') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: controller,\n deploy: false,\n expectedTransactions: [\n {\n from: multiSigContract.address,\n to: controller.address,\n op: Number(OPCODES.Controller_OP_SET_ZRO_WALLET),\n success: true,\n },\n // emit event Controller::EVENT::ZRO_WALLET_SET\n {\n from: controller.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ],\n })\n}\n\nexport async function openAndDeployEndpoint(\n blockchain: Blockchain,\n multiSigContract: SandboxContract<Multisig>,\n multiSigners: SandboxContract<TreasuryContract>[],\n controller: SandboxContract<TonContractWrapper>,\n srcEid: bigint,\n dstEid: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const endpoint: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(EndpointArtifact),\n await controller.getNewEndpointCell({\n eid: srcEid,\n dstEid: dstEid,\n owner: addressToBigInt(controller.address),\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: controller.buildRequest(\n OPCODES.Controller_OP_DEPLOY_ENDPOINT,\n await controller.getNewMdDeployCell({\n dstEid: dstEid,\n initialDeposit: toNano('1.0'),\n dstOApp: BigInt(0), // the dstOApp is unused inside of the endpoint deploy call\n }),\n { value: protocolSetupGas['Controller.OP_DEPLOY_ENDPOINT'] },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: controller,\n deploy: true,\n expectedTransactions: [\n {\n from: multiSigContract.address,\n to: controller.address,\n op: Number(OPCODES.Controller_OP_DEPLOY_ENDPOINT),\n success: true,\n },\n {\n from: controller.address,\n to: endpoint.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [endpoint, internalMsgResults]\n}\n\nexport async function openAndDeployChannel(\n blockchain: Blockchain,\n deployer: SandboxContract<TreasuryContract>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const channel: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ChannelArtifact),\n await srcFixture.controller.getNewChannelCell({\n owner: addressToBigInt(srcFixture.controller.address),\n path: srcFixture.path,\n endpointAddress: addressToBigInt(srcFixture.endpoint.address),\n })\n )\n )\n\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: oAppSetupGas['OApp.DEPLOY_CHANNEL'],\n sender: deployer.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_DeployChannel,\n md: await srcFixture.controller.getNewMdDeployCell({\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n initialDeposit: toNano('1'),\n }),\n expectedTransactions: [\n {\n from: deployer.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_DeployChannel),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.Controller_OP_DEPLOY_CHANNEL),\n success: true,\n },\n {\n from: srcFixture.controller.address,\n to: channel.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [channel, internalMsgResults]\n}\n\nexport async function openAndDeploySmlManager(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n fixture: OAppFixture,\n version: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const smlManager: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(SmlManagerArtifact),\n await allStorages.getNewSmlManagerCell({\n owner: addressToBigInt(fixture.owner.address),\n eid: fixture.eid,\n version,\n controllerAddress: addressToBigInt(fixture.controller.address),\n endpointCode: cellFromArtifact(EndpointArtifact),\n channelCode: cellFromArtifact(ChannelArtifact),\n smlConnectionCode: cellFromArtifact(SmlConnectionArtifact),\n })\n )\n )\n\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: fixture.owner.getSender(),\n contract: smlManager,\n expectedTransactions: [\n {\n from: fixture.owner.address,\n to: smlManager.address,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n return [smlManager, internalMsgResults]\n}\n\nexport async function openAndDeploySmlConnection(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n smlManager: SandboxContract<TonContractWrapper>\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const smlConnection: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(SmlConnectionArtifact),\n await allStorages.getNewSmlConnectionCell({\n owner: addressToBigInt(smlManager.address),\n path: srcFixture.path,\n })\n )\n )\n\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: toNano('10'),\n sender: srcFixture.owner.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_DeployConnection,\n md: await allStorages.getNewMdMdAddressCell({\n md: await allStorages.getNewMdDeployCell({\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n initialDeposit: toNano('1'),\n }),\n address: addressToBigInt(smlManager.address),\n }),\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_DeployConnection),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: smlManager.address,\n op: Number(OPCODES.MsglibManager_OP_DEPLOY_CONNECTION),\n success: true,\n },\n {\n from: smlManager.address,\n to: smlConnection.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [smlConnection, internalMsgResults]\n}\n\nexport async function setDefaultEndpointConfig(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n sendMsglibManager: SandboxContract<TonContractWrapper>,\n receiveMsglibManager: SandboxContract<TonContractWrapper>,\n srcFixture: ProtocolFixture,\n dstFixture: ProtocolFixture\n): Promise<SendMessageResult> {\n const set_ep_config_md = await allStorages.getNewMdSetEpConfigCell({\n useDefaults: BigInt(-1), // true\n sendMsglibManager: addressToBigInt(sendMsglibManager.address),\n receiveMsglibManager: addressToBigInt(receiveMsglibManager.address),\n timeoutReceiveMsglibManager: BigInt(0),\n timeoutReceiveMsglibExpiry: BigInt(0),\n })\n\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.Controller_OP_SET_EP_CONFIG_DEFAULTS,\n await srcFixture.controller.getNewMdMdEidCell({\n md: set_ep_config_md,\n eid: dstFixture.eid,\n }),\n { value: protocolSetupGas['Controller.SET_EP_CONFIG_DEFAULTS'] },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.controller,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.Controller_OP_SET_EP_CONFIG_DEFAULTS),\n success: true,\n },\n {\n from: srcFixture.controller.address,\n to: srcFixture.endpoint.address,\n op: Number(OPCODES.Endpoint_OP_SET_EP_CONFIG_DEFAULTS),\n success: true,\n },\n // emit event Endpoint::event::EP_CONFIG_DEFAULTS_SET\n {\n from: srcFixture.endpoint.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ],\n })\n}\n\nexport async function addMsgLibToController(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: ProtocolFixture,\n dstFixture: ProtocolFixture,\n msglibManager: SandboxContract<TonContractWrapper>\n): Promise<SendMessageResult> {\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.Controller_OP_ADD_MSGLIB,\n await srcFixture.controller.getNewMdAddMsglibCell({\n msglibManagerAddress: addressToBigInt(msglibManager.address),\n dstEid: dstFixture.eid,\n }),\n { value: protocolSetupGas['Controller.OP_ADD_MSGLIB'] },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.controller,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.Controller_OP_ADD_MSGLIB),\n success: true,\n },\n {\n from: srcFixture.controller.address,\n to: srcFixture.endpoint.address,\n op: Number(OPCODES.Endpoint_OP_ADD_MSGLIB),\n success: true,\n },\n {\n from: srcFixture.endpoint.address,\n to: msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_GET_MSGLIB_INFO),\n success: true,\n },\n {\n from: msglibManager.address,\n to: srcFixture.endpoint.address,\n op: Number(OPCODES.Endpoint_OP_GET_MSGLIB_INFO_CALLBACK),\n success: true,\n },\n ],\n })\n}\n\n// ===============================SETUP FIXTURE===============================\n\nexport async function setupFixture(\n srcEid: bigint,\n dstEid: bigint,\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigOwner1: SandboxContract<TreasuryContract>,\n multiSigOwner2: SandboxContract<TreasuryContract>,\n multiSigOwner3: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler\n): Promise<Partial<ProtocolFixture>> {\n let internalMsgResults: SendMessageResult\n\n // =============================set up 3/3 multi-sig as the controller owner================================\n\n addLibToBlockchain(blockchain, cellFromArtifact(MultiSigOrderArtifact))\n\n const multiSigners = [multiSigOwner1, multiSigOwner2, multiSigOwner3]\n const proposers = await blockchain.createWallets(getRandomInt(10, 20))\n\n const multiSigConfig = {\n threshold: multiSigners.length,\n signers: multiSigners.map((s) => s.address),\n proposers: proposers.map((s) => s.address),\n allowArbitrarySeqno: false,\n }\n\n const multiSigContract = blockchain.openContract(\n Multisig.createFromConfig(multiSigConfig, cellFromArtifact(MultiSigArtifact))\n )\n\n // deploy the multisig contract\n internalMsgResults = await multiSigContract.sendDeploy(multiSigners[0].getSender(), toNano('1'))\n expect(internalMsgResults.transactions).toHaveTransaction({\n to: multiSigContract.address,\n deploy: true,\n success: true,\n })\n\n // ===================================open and deploy local controller=====================================\n\n let controller: SandboxContract<TonContractWrapper>\n // eslint-disable-next-line prefer-const\n ;[controller, internalMsgResults] = await openAndDeployControllerViaMultiSig(\n blockchain,\n allStorages,\n multiSigContract,\n multiSigners,\n srcEid\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controller)\n\n // ===================================open and deploy remote controlle via multisig=====================================\n\n let controllerRemote: SandboxContract<TonContractWrapper>\n // eslint-disable-next-line prefer-const\n ;[controllerRemote, internalMsgResults] = await openAndDeployControllerViaMultiSig(\n blockchain,\n allStorages,\n multiSigContract,\n multiSigners,\n dstEid\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controllerRemote)\n\n // ===================================open and deploy zro minter=====================================\n\n const zroMinter: SandboxContract<JettonMinter> = blockchain.openContract(\n JettonMinter.createFromConfig(\n {\n admin: multiSigOwner1.address,\n content: buildOnchainMetadata(zroOnchainMetaData),\n wallet_code: cellFromArtifact(ZroWalletArtifact),\n },\n cellFromArtifact(ZroMinterArtifact)\n )\n )\n\n await zroMinter.sendDeploy(multiSigOwner1.getSender(), toNano('100'))\n\n // =========================function to get someone's zro wallet=============================\n\n const getZroWalletAddress = async (address: Address): Promise<SandboxContract<JettonWallet>> => {\n return blockchain.openContract(JettonWallet.createFromAddress(await zroMinter.getWalletAddress(address)))\n }\n\n // =============================mint zro to multiSigOwner1================================\n\n const zroAmount = toNano('1000')\n const tonAmount = toNano('0.05')\n const fwdTonAmount = toNano('0.1')\n await mintZro(\n multiSigOwner1,\n zroMinter,\n multiSigOwner1.address,\n await getZroWalletAddress(multiSigOwner1.address),\n zroAmount,\n tonAmount,\n fwdTonAmount\n )\n\n // ===================================set zro wallet on source controller=====================================\n\n internalMsgResults = await setControllerZroWalletViaMultisig(\n blockchain,\n multiSigContract,\n controller,\n zroMinter,\n multiSigners\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controller)\n\n // ===================================set zro wallet on destination controller=====================================\n\n internalMsgResults = await setControllerZroWalletViaMultisig(\n blockchain,\n multiSigContract,\n controllerRemote,\n zroMinter,\n multiSigners\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controllerRemote)\n\n // ===================================open and deploy endpoint via multisig=====================================\n\n let endpoint: SandboxContract<TonContractWrapper>\n // eslint-disable-next-line prefer-const\n ;[endpoint, internalMsgResults] = await openAndDeployEndpoint(\n blockchain,\n multiSigContract,\n multiSigners,\n controller,\n srcEid,\n dstEid\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controller)\n\n // =============================expect no failures================================\n\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n\n return {\n multisig: multiSigContract,\n eid: srcEid,\n endpoint,\n controller,\n }\n}\n\nexport async function wireChannels(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n eventHandler: LzEventHandler\n): Promise<void> {\n let internalMsgResults: SendMessageResult\n\n // ===================================generate path==================================================\n\n srcFixture.path = await allStorages.getNewLzPathCell({\n srcEid: srcFixture.eid,\n srcOApp: addressToBigInt(srcFixture.oApp.address),\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n })\n\n dstFixture.path = await allStorages.getNewLzPathCell({\n srcEid: dstFixture.eid,\n srcOApp: addressToBigInt(dstFixture.oApp.address),\n dstEid: srcFixture.eid,\n dstOApp: addressToBigInt(srcFixture.oApp.address),\n })\n\n // ===================================open and deploy channel=====================================\n ;[srcFixture.channel, internalMsgResults] = await openAndDeployChannel(\n blockchain,\n srcFixture.owner,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.oApp)\n}\n\nexport async function deployConfigAndRegisterSml(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n version: bigint,\n nativeFee: bigint,\n zroFee: bigint,\n eventHandler: LzEventHandler\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>]> {\n // ===================================open and deploy sml manager =====================================\n const [msglibManager, internalMsgResults_1] = await openAndDeploySmlManager(\n blockchain,\n allStorages,\n srcFixture,\n version\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults_1, msglibManager)\n\n // ===================================open and deploy sml connection =====================================\n const [msglibConnection, internalMsgResults_2] = await openAndDeploySmlConnection(\n blockchain,\n allStorages,\n srcFixture,\n dstFixture,\n msglibManager\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults_2, srcFixture.oApp)\n\n // ===================================configure sml =====================================\n\n const set_sml_config_md = await msglibManager.getNewMdSetSmlManagerConfigCell({\n nativeFee,\n zroFee,\n })\n\n const set_sml_config_extended_md = await msglibManager.getNewMdExtendedMdCell({\n md: set_sml_config_md,\n obj: emptyObject,\n forwardingAddress: BigInt(0),\n })\n\n let internalMsgResults: SendMessageResult = await msglibManager.sendInternalMessage(\n srcFixture.owner.getSender(),\n OPCODES.SmlManager_OP_SET_MSGLIB_CONFIG,\n set_sml_config_extended_md,\n { value: protocolSetupGas['Msglib.SET_MSGLIB_CONFIG'] }\n )\n\n // emits 1 event\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, msglibManager)\n\n internalMsgResults = await addMsgLibToController(blockchain, multiSigners, srcFixture, dstFixture, msglibManager)\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n return [msglibManager, msglibConnection]\n}\n\nexport async function wireFixtureWithSML(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n customNativeFee: bigint = toNano('0'),\n customZroFee: bigint = toNano('0.000000050'),\n defaultNativeFee: bigint = toNano('0.000000100'),\n defaultZroFee: bigint = toNano('0'),\n eventHandler: LzEventHandler\n): Promise<void> {\n // ===================================wire channels=====================================\n\n await wireChannels(blockchain, allStorages, srcFixture, dstFixture, eventHandler)\n\n // ===================================deploy and configure sml custom=====================================\n ;[srcFixture.msglibManagerCustom, srcFixture.msglibConnectionCustom] = await deployConfigAndRegisterSml(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n SML_MANAGER_CUSTOM_VERSION,\n customNativeFee,\n customZroFee,\n eventHandler\n )\n\n // ===================================deploy and configure sml default=====================================\n ;[srcFixture.msglibManagerDefault, srcFixture.msglibConnectionDefault] = await deployConfigAndRegisterSml(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n SML_MANAGER_DEFAULT_VERSION,\n defaultNativeFee,\n defaultZroFee,\n eventHandler\n )\n\n // ===================================set default endpoint config=====================================\n\n const internalMsgResults = await setDefaultEndpointConfig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture.msglibManagerDefault,\n srcFixture.msglibManagerDefault,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\nexport async function wireFixturesTogetherWithSML(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n customNativeFee: bigint = toNano('0'),\n customZroFee: bigint = toNano('0.000000050'),\n defaultNativeFee: bigint = toNano('0.000000100'),\n defaultZroFee: bigint = toNano('0'),\n eventHandler: LzEventHandler\n): Promise<void> {\n await wireFixtureWithSML(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture,\n dstFixture,\n customNativeFee,\n customZroFee,\n defaultNativeFee,\n defaultZroFee,\n eventHandler\n )\n await wireFixtureWithSML(\n blockchain,\n allStorages,\n multiSigners,\n dstFixture,\n srcFixture,\n customNativeFee,\n customZroFee,\n defaultNativeFee,\n defaultZroFee,\n eventHandler\n )\n}\n`\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n","export abstract class MultiSigOpCodes {\n static readonly multisig = {\n new_order: 0xf718510f,\n execute: 0x75097f5d,\n execute_internal: 0xa32c59bf,\n }\n static readonly order = {\n approve: 0xa762230f,\n expired: 0x6,\n approve_rejected: 0xafaf283e,\n approved: 0x82609bf6,\n init: 0x9c73fba2,\n }\n static readonly actions = {\n send_message: 0xf1381e5b,\n update_multisig_params: 0x1d0cfbd3,\n }\n}\n\nexport abstract class MultiSigErrors {\n static readonly multisig = {\n unauthorized_new_order: 1007,\n invalid_new_order: 1008,\n not_enough_ton: 100,\n unauthorized_execute: 101,\n singers_outdated: 102,\n invalid_dictionary_sequence: 103,\n expired: 111,\n }\n static readonly order = {\n unauthorized_init: 104,\n already_approved: 107,\n already_inited: 105,\n unauthorized_sign: 106,\n expired: 111,\n unknown_op: 0xffff,\n already_executed: 112,\n }\n}\n\nexport abstract class MultiSigParams {\n static readonly bitsize = {\n op: 32,\n queryId: 64,\n orderSeqno: 256,\n signerIndex: 8,\n actionIndex: 8,\n time: 48,\n }\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n Dictionary,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nimport { MultiSigOpCodes, MultiSigParams } from './Multisig-Constants'\n\nexport interface Module {\n address: Address\n module: Cell\n}\n\nexport interface MultisigConfig {\n threshold: number\n signers: Address[]\n proposers: Address[]\n allowArbitrarySeqno: boolean\n}\n\nexport interface MultisigData {\n nextOrderSeqno: bigint\n threshold: bigint\n signers: Address[]\n proposers: Address[]\n}\n\nexport interface TransferRequest {\n type: 'transfer'\n sendMode: SendMode\n message: Cell\n}\nexport interface UpdateRequest {\n type: 'update'\n threshold: number\n signers: Address[]\n proposers: Address[]\n}\n\nexport type Action = TransferRequest | UpdateRequest\n// this should not be exported, it will cause a collision with the Order class\ntype Order = Action[]\n\nfunction arrayToCell(arr: Address[]): Dictionary<number, Address> {\n const dict = Dictionary.empty(Dictionary.Keys.Uint(8), Dictionary.Values.Address())\n for (let i = 0; i < arr.length; i++) {\n dict.set(i, arr[i])\n }\n return dict\n}\n\nfunction cellToArray(addrDict: Cell | null): Address[] {\n let resArr: Address[] = []\n if (addrDict !== null) {\n const dict = Dictionary.loadDirect(Dictionary.Keys.Uint(8), Dictionary.Values.Address(), addrDict)\n resArr = dict.values()\n }\n return resArr\n}\n\nexport function multisigConfigToCell(config: MultisigConfig): Cell {\n return beginCell()\n .storeUint(0, MultiSigParams.bitsize.orderSeqno)\n .storeUint(config.threshold, MultiSigParams.bitsize.signerIndex)\n .storeRef(beginCell().storeDictDirect(arrayToCell(config.signers)))\n .storeUint(config.signers.length, MultiSigParams.bitsize.signerIndex)\n .storeDict(arrayToCell(config.proposers))\n .storeBit(config.allowArbitrarySeqno)\n .endCell()\n}\n\nexport class Multisig implements Contract {\n public orderSeqno: number\n\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell },\n readonly configuration?: MultisigConfig\n ) {\n this.orderSeqno = 0\n }\n\n static createFromAddress(address: Address): Multisig {\n const multisig = new Multisig(address)\n multisig.orderSeqno = 0\n return multisig\n }\n\n static createFromConfig(config: MultisigConfig, code: Cell, workchain = 0): Multisig {\n const data = multisigConfigToCell(config)\n const init = { code, data }\n return new Multisig(contractAddress(workchain, init), init, config)\n }\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell()\n .storeUint(0, MultiSigParams.bitsize.op)\n .storeUint(0, MultiSigParams.bitsize.queryId)\n .endCell(),\n })\n }\n\n static packTransferRequest(transfer: TransferRequest): Cell {\n return beginCell()\n .storeUint(MultiSigOpCodes.actions.send_message, MultiSigParams.bitsize.op)\n .storeUint(transfer.sendMode, 8)\n .storeRef(transfer.message)\n .endCell()\n }\n\n static packUpdateRequest(update: UpdateRequest): Cell {\n return beginCell()\n .storeUint(MultiSigOpCodes.actions.update_multisig_params, MultiSigParams.bitsize.op)\n .storeUint(update.threshold, MultiSigParams.bitsize.signerIndex)\n .storeRef(beginCell().storeDictDirect(arrayToCell(update.signers)))\n .storeDict(arrayToCell(update.proposers))\n .endCell()\n }\n\n static packOrder(actions: Action[]): Cell {\n const order_dict = Dictionary.empty(Dictionary.Keys.Uint(8), Dictionary.Values.Cell())\n if (actions.length > 255) {\n throw new Error('For action chains above 255, use packLarge method')\n } else {\n // pack transfers to the order_body cell\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n const actionCell =\n action.type === 'transfer'\n ? Multisig.packTransferRequest(action)\n : Multisig.packUpdateRequest(action)\n order_dict.set(i, actionCell)\n }\n return beginCell().storeDictDirect(order_dict).endCell()\n }\n }\n\n static newOrderMessage(\n actions: Order | Cell,\n expirationDate: number,\n isSigner: boolean,\n addrIdx: number,\n order_id = 115792089237316195423570985008687907853269984665640564039457584007913129639935n,\n query_id: number | bigint = 0\n ): Cell {\n const msgBody = beginCell()\n .storeUint(MultiSigOpCodes.multisig.new_order, MultiSigParams.bitsize.op)\n .storeUint(query_id, MultiSigParams.bitsize.queryId)\n .storeUint(order_id, MultiSigParams.bitsize.orderSeqno)\n .storeBit(isSigner)\n .storeUint(addrIdx, MultiSigParams.bitsize.signerIndex)\n .storeUint(expirationDate, MultiSigParams.bitsize.time)\n\n if (actions instanceof Cell) {\n return msgBody.storeRef(actions).endCell()\n }\n\n if (actions.length == 0) {\n throw new Error(\"Order list can't be empty!\")\n }\n const order_cell = Multisig.packOrder(actions)\n return msgBody.storeRef(order_cell).endCell()\n }\n\n async sendNewOrder(\n provider: ContractProvider,\n via: Sender,\n actions: Order | Cell,\n expirationDate: number,\n value: bigint = toNano('1'),\n addrIdx?: number,\n isSigner?: boolean,\n seqno?: bigint\n ): Promise<void> {\n if (seqno == undefined) {\n seqno = 115792089237316195423570985008687907853269984665640564039457584007913129639935n\n }\n if (this.configuration === undefined) {\n throw new Error('Configuration is not set: use createFromConfig or loadConfiguration')\n }\n // check that via.address is in signers\n // We can only check in advance when address is known. Otherwise we have to trust isSigner flag\n if (via.address !== undefined) {\n const addrCmp = (x: Address): boolean => via.address !== undefined && x.equals(via.address)\n addrIdx = this.configuration.signers.findIndex(addrCmp)\n if (addrIdx >= 0) {\n isSigner = true\n } else {\n addrIdx = this.configuration.proposers.findIndex(addrCmp)\n if (addrIdx < 0) {\n throw new Error('Sender is not a signer or proposer')\n }\n isSigner = false\n }\n } else if (isSigner === undefined || addrIdx == undefined) {\n throw new Error('If sender address is not known, addrIdx and isSigner parameters required')\n }\n\n let newActions: Cell | Order\n\n if (actions instanceof Cell) {\n newActions = actions\n } else {\n newActions = Multisig.packOrder(actions)\n }\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n value,\n body: Multisig.newOrderMessage(newActions, expirationDate, isSigner, addrIdx, seqno),\n })\n //console.log(await provider.get(\"get_order_address\", []));\n }\n\n async getOrderAddress(provider: ContractProvider, orderSeqno: bigint): Promise<Address> {\n const { stack } = await provider.get('get_order_address', [{ type: 'int', value: orderSeqno }])\n return stack.readAddress()\n }\n\n async getOrderEstimate(provider: ContractProvider, order: Order, expiration_date: bigint): Promise<bigint> {\n const orderCell = Multisig.packOrder(order)\n const { stack } = await provider.get('get_order_estimate', [\n { type: 'cell', cell: orderCell },\n { type: 'int', value: expiration_date },\n ])\n return stack.readBigNumber()\n }\n\n async getMultisigData(provider: ContractProvider): Promise<MultisigData> {\n const { stack } = await provider.get('get_multisig_data', [])\n const nextOrderSeqno = stack.readBigNumber()\n const threshold = stack.readBigNumber()\n const signers = cellToArray(stack.readCellOpt())\n const proposers = cellToArray(stack.readCellOpt())\n return { nextOrderSeqno, threshold, signers, proposers }\n }\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n Dictionary,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nimport { MultiSigOpCodes, MultiSigParams } from './Multisig-Constants'\n\nexport interface OrderInitConfig {\n multisig: Address\n orderSeqno: number\n}\n\nexport interface OrderFullConfig {\n inited: boolean\n multisig: Address\n order_seqno: bigint\n threshold: number | null\n executed: boolean | null\n signers: Address[]\n approvals: boolean[]\n approvals_num: number | null\n _approvals: bigint | null\n expiration_date: bigint | null\n order: Cell | null\n}\n\nfunction arrayToCell(arr: Address[]): Dictionary<number, Address> {\n const dict = Dictionary.empty(Dictionary.Keys.Uint(8), Dictionary.Values.Address())\n for (let i = 0; i < arr.length; i++) {\n dict.set(i, arr[i])\n }\n return dict\n}\n\nfunction cellToArray(addrDict: Cell | null): Address[] {\n let resArr: Address[] = []\n if (addrDict !== null) {\n const dict = Dictionary.loadDirect(Dictionary.Keys.Uint(8), Dictionary.Values.Address(), addrDict)\n resArr = dict.values()\n }\n return resArr\n}\n\nexport function orderConfigToCell(config: OrderInitConfig): Cell {\n return beginCell()\n .storeAddress(config.multisig)\n .storeUint(config.orderSeqno, MultiSigParams.bitsize.orderSeqno)\n .endCell()\n}\n\nexport class Order implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell },\n readonly configuration?: OrderInitConfig\n ) {}\n\n static createFromAddress(address: Address): Order {\n return new Order(address)\n }\n\n static createFromConfig(config: OrderInitConfig, code: Cell, workchain = 0): Order {\n const data = orderConfigToCell(config)\n const init = { code, data }\n\n return new Order(contractAddress(workchain, init), init, config)\n }\n\n static initMessage(\n signers: Address[],\n expiration_date: number,\n order: Cell,\n threshold = 1,\n approve_on_init = false,\n signer_idx = 0,\n query_id: number | bigint = 0\n ): Cell {\n const msgBody = beginCell()\n .storeUint(MultiSigOpCodes.order.init, MultiSigParams.bitsize.op)\n .storeUint(query_id, MultiSigParams.bitsize.queryId)\n .storeUint(threshold, MultiSigParams.bitsize.signerIndex)\n .storeRef(beginCell().storeDictDirect(arrayToCell(signers)))\n .storeUint(expiration_date, MultiSigParams.bitsize.time)\n .storeRef(order)\n .storeBit(approve_on_init)\n\n if (approve_on_init) {\n msgBody.storeUint(signer_idx, MultiSigParams.bitsize.signerIndex)\n }\n\n return msgBody.endCell()\n }\n\n async sendDeploy(\n provider: ContractProvider,\n via: Sender,\n value: bigint,\n signers: Address[],\n expiration_date: number,\n order: Cell,\n threshold = 1,\n approve_on_init = false,\n signer_idx = 0,\n query_id: number | bigint = 0\n ): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: Order.initMessage(signers, expiration_date, order, threshold, approve_on_init, signer_idx, query_id),\n })\n }\n\n async sendApprove(\n provider: ContractProvider,\n via: Sender,\n signer_idx: number,\n value: bigint = toNano('1'),\n query_id: number | bigint = 0\n ): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell()\n .storeUint(MultiSigOpCodes.order.approve, MultiSigParams.bitsize.op)\n .storeUint(query_id, MultiSigParams.bitsize.queryId)\n .storeUint(signer_idx, MultiSigParams.bitsize.signerIndex)\n .endCell(),\n })\n }\n\n async getOrderData(provider: ContractProvider): Promise<OrderFullConfig> {\n /*\n (slice multisig, int order_seqno, int threshold,\n int sent_for_execution?, cell signers,\n int approvals, int approvals_num, int expiration_date,\n cell order)\n */\n const { stack } = await provider.get('get_order_data', [])\n const multisig = stack.readAddress()\n const order_seqno = stack.readBigNumber()\n const threshold = stack.readNumberOpt()\n const executed = stack.readBooleanOpt()\n const signers = cellToArray(stack.readCellOpt())\n const approvals = stack.readBigNumberOpt()\n const approvals_num = stack.readNumberOpt()\n const expiration_date = stack.readBigNumberOpt()\n const order = stack.readCellOpt()\n let approvalsArray: boolean[]\n if (approvals !== null) {\n approvalsArray = new Array<boolean>(256) // Explicitly type the array as boolean[]\n for (let i = 0; i < 256; i++) {\n approvalsArray[i] = Boolean((1n << BigInt(i)) & approvals)\n }\n } else {\n approvalsArray = []\n }\n\n return {\n inited: threshold !== null,\n multisig,\n order_seqno,\n threshold,\n executed,\n signers,\n approvals: approvalsArray,\n approvals_num: approvals_num,\n _approvals: approvals,\n expiration_date,\n order,\n }\n }\n}\n","import { Address, Cell, Dictionary, Message, Transaction, TransactionComputeVm } from '@ton/core'\nimport { Blockchain, BlockchainTransaction } from '@ton/sandbox'\nimport { extractEvents } from '@ton/sandbox/dist/event/Event'\nimport { FlatTransactionComparable, compareTransaction, flattenTransaction, randomAddress } from '@ton/test-utils'\n\nexport const differentAddress = (oldAddr: Address): Address => {\n let newAddr: Address\n\n do {\n newAddr = randomAddress(oldAddr.workChain)\n } while (newAddr.equals(oldAddr))\n\n return newAddr\n}\n\nexport const getRandom = (min: number, max: number): number => {\n return Math.random() * (max - min) + min\n}\n\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.round(getRandom(min, max))\n}\n\nexport const findTransaction = <T extends Transaction>(txs: T[], match: FlatTransactionComparable): T | undefined => {\n return txs.find((x) => compareTransaction(flattenTransaction(x), match))\n}\n\nexport const getMsgPrices = (\n configRaw: Cell,\n workchain: 0 | -1\n): {\n lumpPrice: bigint\n bitPrice: bigint\n cellPrice: bigint\n ihrPriceFactor: bigint\n firstFrac: bigint\n nextFrac: bigint\n} => {\n const config = configRaw.beginParse().loadDictDirect(Dictionary.Keys.Int(32), Dictionary.Values.Cell())\n\n const prices = config.get(25 + workchain)\n\n if (prices === undefined) {\n throw Error('No prices defined in config')\n }\n\n const sc = prices.beginParse()\n const magic = sc.loadUint(8)\n\n if (magic != 0xea) {\n throw Error('Invalid message prices magic number!')\n }\n return {\n lumpPrice: sc.loadUintBig(64),\n bitPrice: sc.loadUintBig(64),\n cellPrice: sc.loadUintBig(64),\n ihrPriceFactor: sc.loadUintBig(32),\n firstFrac: sc.loadUintBig(16),\n nextFrac: sc.loadUintBig(16),\n }\n}\n\nexport const storageCollected = (trans: Transaction): bigint => {\n if (trans.description.type !== 'generic') throw new Error('Expected generic transaction')\n return trans.description.storagePhase ? trans.description.storagePhase.storageFeesCollected : 0n\n}\nexport const computedGeneric = (trans: Transaction): TransactionComputeVm => {\n if (trans.description.type !== 'generic') throw new Error('Expected generic transaction')\n if (trans.description.computePhase.type !== 'vm') throw new Error('Compute phase expected')\n return trans.description.computePhase\n}\n\ninterface MsgQueued {\n msg: Message\n parent?: BlockchainTransaction\n}\n\nexport class Txiterator implements AsyncIterator<BlockchainTransaction> {\n private msqQueue: MsgQueued[]\n private blockchain: Blockchain\n\n constructor(bc: Blockchain, msg: Message) {\n this.msqQueue = [{ msg }]\n this.blockchain = bc\n }\n\n public async next(): Promise<IteratorResult<BlockchainTransaction>> {\n if (this.msqQueue.length == 0) {\n return { done: true, value: undefined }\n }\n const curMsg: MsgQueued | undefined = this.msqQueue.shift()\n if (curMsg === undefined) {\n throw new Error('MsgQueued is undefined')\n }\n const inMsg = curMsg.msg\n if (inMsg.info.type !== 'internal') throw new Error('Internal only')\n const smc = await this.blockchain.getContract(inMsg.info.dest)\n const res = await smc.receiveMessage(inMsg, { now: this.blockchain.now })\n const bcRes = {\n ...res,\n events: extractEvents(res),\n parent: curMsg.parent,\n children: [],\n externals: [],\n }\n for (let i = 0; i < res.outMessagesCount; i++) {\n const outMsg: Message | undefined = res.outMessages.get(i)\n if (outMsg === undefined) {\n throw new Error('Message is undefined')\n }\n // Only add internal for now\n if (outMsg.info.type === 'internal') {\n this.msqQueue.push({ msg: outMsg, parent: bcRes })\n }\n }\n return { done: false, value: bcRes }\n }\n}\n\nexport const executeTill = async (\n txs: AsyncIterable<BlockchainTransaction> | AsyncIterator<BlockchainTransaction>,\n match: FlatTransactionComparable\n): Promise<BlockchainTransaction[]> => {\n const executed: BlockchainTransaction[] = []\n const txIterable = txs as AsyncIterable<BlockchainTransaction>\n const txIterator = txs as AsyncIterator<BlockchainTransaction>\n if (Symbol.asyncIterator in txIterable) {\n for await (const tx of txIterable) {\n executed.push(tx)\n if (compareTransaction(flattenTransaction(tx), match)) {\n return executed\n }\n }\n } else {\n let iterResult = await txIterator.next()\n while (!(iterResult.done ?? false)) {\n const tx = iterResult.value\n executed.push(tx)\n if (compareTransaction(flattenTransaction(tx), match)) {\n return executed\n }\n iterResult = await txIterator.next()\n }\n }\n // Will fail with common error message format\n // commented this out because we're not going to use jest in our sdk-tools package\n // expect(executed).toHaveTransaction(match)\n return executed\n}\n\nexport const executeFrom = async (txs: AsyncIterator<BlockchainTransaction>): Promise<BlockchainTransaction[]> => {\n const executed: BlockchainTransaction[] = []\n let iterResult = await txs.next()\n while (!(iterResult.done ?? false)) {\n executed.push(iterResult.value)\n iterResult = await txs.next()\n }\n return executed\n}\n","import { Sha256 } from '@aws-crypto/sha256-js'\nimport { Cell, Dictionary, beginCell } from '@ton/core'\n\nconst ONCHAIN_CONTENT_PREFIX = 0x00\nconst SNAKE_PREFIX = 0x00\nconst CELL_MAX_SIZE_BYTES = Math.floor((1023 - 8) / 8)\n\nconst sha256 = (str: string): Buffer => {\n const sha = new Sha256()\n sha.update(str)\n return Buffer.from(sha.digestSync())\n}\n\nconst toKey = (key: string): bigint => {\n return BigInt(`0x${sha256(key).toString('hex')}`)\n}\n\nexport function buildOnchainMetadata(data: { name: string; symbol: string }): Cell {\n const dict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n\n // Store the on-chain metadata in the dictionary\n Object.entries(data).forEach(([key, value]) => {\n dict.set(toKey(key), makeSnakeCell(Buffer.from(value, 'utf8')))\n })\n\n return beginCell().storeInt(ONCHAIN_CONTENT_PREFIX, 8).storeDict(dict).endCell()\n}\n\nexport function makeSnakeCell(data: Buffer): Cell {\n // Create a cell that package the data\n const chunks = bufferToChunks(data, CELL_MAX_SIZE_BYTES)\n\n const b = chunks.reduceRight((curCell, chunk, index) => {\n if (index === 0) {\n curCell.storeInt(SNAKE_PREFIX, 8)\n }\n curCell.storeBuffer(chunk)\n if (index > 0) {\n const cell = curCell.endCell()\n return beginCell().storeRef(cell)\n } else {\n return curCell\n }\n }, beginCell())\n return b.endCell()\n}\n\nfunction bufferToChunks(buff: Buffer, chunkSize: number): Buffer[] {\n const chunks: Buffer[] = []\n while (buff.byteLength > 0) {\n chunks.push(buff.slice(0, chunkSize))\n buff = buff.slice(chunkSize)\n }\n return chunks\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nexport abstract class Op {\n static transfer = 0xf8a7ea5\n static transfer_notification = 0x7362d09c\n static internal_transfer = 0x178d4519\n static excesses = 0xd53276db\n static burn = 0x595f07bc\n static burn_notification = 0x7bdd97de\n\n static provide_wallet_address = 0x2c76b973\n static take_wallet_address = 0xd1735400\n static mint = 0x642b7d07\n static change_admin = 3\n static change_content = 4\n}\n\nexport abstract class Errors {\n static invalid_op = 709\n static not_admin = 73\n static unouthorized_burn = 74\n static discovery_fee_not_matched = 75\n static wrong_op = 0xffff\n static not_owner = 705\n static not_enough_ton = 709\n static not_enough_gas = 707\n static not_valid_wallet = 707\n static wrong_workchain = 333\n static balance_error = 706\n}\n\nexport interface JettonMinterContent {\n type: 0 | 1\n uri: string\n}\n\nexport interface JettonMinterConfig {\n admin: Address\n content: Cell\n wallet_code: Cell\n}\n\nexport function jettonMinterConfigToCell(config: JettonMinterConfig): Cell {\n return beginCell()\n .storeCoins(0)\n .storeAddress(config.admin)\n .storeRef(config.content)\n .storeRef(config.wallet_code)\n .endCell()\n}\n\nexport function jettonContentToCell(content: JettonMinterContent): Cell {\n return beginCell()\n .storeUint(content.type, 8)\n .storeStringTail(content.uri) //Snake logic under the hood\n .endCell()\n}\n\nexport class JettonMinter implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n static createFromAddress(address: Address): JettonMinter {\n return new JettonMinter(address)\n }\n\n static createFromConfig(config: JettonMinterConfig, code: Cell, workchain = 0): JettonMinter {\n const data = jettonMinterConfigToCell(config)\n const init = { code, data }\n return new JettonMinter(contractAddress(workchain, init), init)\n }\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n protected static jettonInternalTransfer(\n jetton_amount: bigint,\n forward_ton_amount: bigint,\n response_addr?: Address,\n query_id: number | bigint = 0\n ): Cell {\n return beginCell()\n .storeUint(Op.internal_transfer, 32)\n .storeUint(query_id, 64)\n .storeCoins(jetton_amount)\n .storeAddress(null)\n .storeAddress(response_addr)\n .storeCoins(forward_ton_amount)\n .storeBit(false)\n .endCell()\n }\n static mintMessage(\n from: Address,\n to: Address,\n jetton_amount: bigint,\n forward_ton_amount: bigint,\n total_ton_amount: bigint,\n query_id: number | bigint = 0\n ): Cell {\n const mintMsg = beginCell()\n .storeUint(Op.internal_transfer, 32) // opcode\n .storeUint(0, 64) // query id\n .storeCoins(jetton_amount)\n .storeAddress(null)\n .storeAddress(from) // Response addr\n .storeCoins(forward_ton_amount)\n .storeMaybeRef(null)\n .endCell()\n\n return beginCell()\n .storeUint(Op.mint, 32)\n .storeUint(query_id, 64) // op, queryId\n .storeAddress(to)\n .storeCoins(total_ton_amount)\n .storeCoins(jetton_amount)\n .storeRef(mintMsg)\n .endCell()\n }\n async sendMint(\n provider: ContractProvider,\n via: Sender,\n to: Address,\n jetton_amount: bigint,\n forward_ton_amount: bigint,\n total_ton_amount: bigint\n ): Promise<void> {\n if (total_ton_amount <= forward_ton_amount) {\n throw new Error('Total ton amount should be > forward amount')\n }\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.mintMessage(this.address, to, jetton_amount, forward_ton_amount, total_ton_amount),\n value: total_ton_amount + toNano('0.015'),\n })\n }\n\n /* provide_wallet_address#2c76b973 query_id:uint64 owner_address:MsgAddress include_address:Bool = InternalMsgBody;\n */\n static discoveryMessage(owner: Address, include_address: boolean): Cell {\n return beginCell()\n .storeUint(0x2c76b973, 32)\n .storeUint(0, 64) // op, queryId\n .storeAddress(owner)\n .storeBit(include_address)\n .endCell()\n }\n\n async sendDiscovery(\n provider: ContractProvider,\n via: Sender,\n owner: Address,\n include_address: boolean,\n value: bigint = toNano('0.1')\n ): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.discoveryMessage(owner, include_address),\n value: value,\n })\n }\n\n static changeAdminMessage(newOwner: Address): Cell {\n return beginCell()\n .storeUint(Op.change_admin, 32)\n .storeUint(0, 64) // op, queryId\n .storeAddress(newOwner)\n .endCell()\n }\n\n async sendChangeAdmin(provider: ContractProvider, via: Sender, newOwner: Address): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.changeAdminMessage(newOwner),\n value: toNano('0.05'),\n })\n }\n static changeContentMessage(content: Cell): Cell {\n return beginCell()\n .storeUint(Op.change_content, 32)\n .storeUint(0, 64) // op, queryId\n .storeRef(content)\n .endCell()\n }\n\n async sendChangeContent(provider: ContractProvider, via: Sender, content: Cell): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.changeContentMessage(content),\n value: toNano('0.05'),\n })\n }\n async getWalletAddress(provider: ContractProvider, owner: Address): Promise<Address> {\n const res = await provider.get('get_wallet_address', [\n { type: 'slice', cell: beginCell().storeAddress(owner).endCell() },\n ])\n return res.stack.readAddress()\n }\n\n async getJettonData(\n provider: ContractProvider\n ): Promise<{ totalSupply: bigint; mintable: boolean; adminAddress: Address; content: Cell; walletCode: Cell }> {\n const res = await provider.get('get_jetton_data', [])\n const totalSupply = res.stack.readBigNumber()\n const mintable = res.stack.readBoolean()\n const adminAddress = res.stack.readAddress()\n const content = res.stack.readCell()\n const walletCode = res.stack.readCell()\n return {\n totalSupply,\n mintable,\n adminAddress,\n content,\n walletCode,\n }\n }\n\n async getTotalSupply(provider: ContractProvider): Promise<bigint> {\n const res = await this.getJettonData(provider)\n return res.totalSupply\n }\n async getAdminAddress(provider: ContractProvider): Promise<Address> {\n const res = await this.getJettonData(provider)\n return res.adminAddress\n }\n async getContent(provider: ContractProvider): Promise<Cell> {\n const res = await this.getJettonData(provider)\n return res.content\n }\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nexport interface JettonWalletConfig {\n owner_address: Address\n jetton_master_address: Address\n jetton_wallet_code: Cell\n}\n\nexport function jettonWalletConfigToCell(config: JettonWalletConfig): Cell {\n return beginCell()\n .storeCoins(0)\n .storeAddress(config.owner_address)\n .storeAddress(config.jetton_master_address)\n .storeRef(config.jetton_wallet_code)\n .endCell()\n}\n\nexport class JettonWallet implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n static createFromAddress(address: Address): JettonWallet {\n return new JettonWallet(address)\n }\n\n static createFromConfig(config: JettonWalletConfig, code: Cell, workchain = 0): JettonWallet {\n const data = jettonWalletConfigToCell(config)\n const init = { code, data }\n return new JettonWallet(contractAddress(workchain, init), init)\n }\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n async getJettonBalance(provider: ContractProvider): Promise<bigint> {\n const state = await provider.getState()\n if (state.state.type !== 'active') {\n return 0n\n }\n const res = await provider.get('get_wallet_data', [])\n return res.stack.readBigNumber()\n }\n static transferMessage(\n jetton_amount: bigint,\n to: Address,\n responseAddress: Address,\n customPayload: Cell | null,\n forward_ton_amount: bigint,\n forwardPayload: Cell | null\n ): Cell {\n return beginCell()\n .storeUint(0xf8a7ea5, 32)\n .storeUint(0, 64) // op, queryId\n .storeCoins(jetton_amount)\n .storeAddress(to)\n .storeAddress(responseAddress)\n .storeMaybeRef(customPayload)\n .storeCoins(forward_ton_amount)\n .storeMaybeRef(forwardPayload)\n .endCell()\n }\n async sendTransfer(\n provider: ContractProvider,\n via: Sender,\n value: bigint,\n jetton_amount: bigint,\n to: Address,\n responseAddress: Address,\n customPayload: Cell,\n forward_ton_amount: bigint,\n forwardPayload: Cell\n ): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.transferMessage(\n jetton_amount,\n to,\n responseAddress,\n customPayload,\n forward_ton_amount,\n forwardPayload\n ),\n value: value,\n })\n }\n /*\n burn#595f07bc query_id:uint64 amount:(VarUInteger 16)\n response_destination:MsgAddress custom_payload:(Maybe ^Cell)\n = InternalMsgBody;\n */\n static burnMessage(jetton_amount: bigint, responseAddress: Address, customPayload: Cell | null): Cell {\n return beginCell()\n .storeUint(0x595f07bc, 32)\n .storeUint(0, 64) // op, queryId\n .storeCoins(jetton_amount)\n .storeAddress(responseAddress)\n .storeMaybeRef(customPayload)\n .endCell()\n }\n\n async sendBurn(\n provider: ContractProvider,\n via: Sender,\n value: bigint,\n jetton_amount: bigint,\n responseAddress: Address,\n customPayload: Cell\n ): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.burnMessage(jetton_amount, responseAddress, customPayload),\n value: value,\n })\n }\n /*\n withdraw_tons#107c49ef query_id:uint64 = InternalMsgBody;\n */\n static withdrawTonsMessage(): Cell {\n return beginCell()\n .storeUint(0x6d8e5e3c, 32)\n .storeUint(0, 64) // op, queryId\n .endCell()\n }\n\n async sendWithdrawTons(provider: ContractProvider, via: Sender): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.withdrawTonsMessage(),\n value: toNano('0.1'),\n })\n }\n /*\n withdraw_jettons#10 query_id:uint64 wallet:MsgAddressInt amount:Coins = InternalMsgBody;\n */\n static withdrawJettonsMessage(from: Address, amount: bigint): Cell {\n return beginCell()\n .storeUint(0x768a50b2, 32)\n .storeUint(0, 64) // op, queryId\n .storeAddress(from)\n .storeCoins(amount)\n .storeMaybeRef(null)\n .endCell()\n }\n\n async sendWithdrawJettons(provider: ContractProvider, via: Sender, from: Address, amount: bigint): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.withdrawJettonsMessage(from, amount),\n value: toNano('0.1'),\n })\n }\n\n async getData(\n provider: ContractProvider\n ): Promise<{ balance: bigint; owner_address: Address; jetton_master_address: Address; wallet_code: Cell }> {\n const { stack } = await provider.get('get_wallet_data', [])\n return {\n balance: stack.readBigNumber(),\n owner_address: stack.readAddress(),\n jetton_master_address: stack.readAddress(),\n wallet_code: stack.readCell(),\n }\n }\n\n async getBalance(provider: ContractProvider): Promise<bigint> {\n const res = await this.getData(provider)\n return res.balance\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\nimport * as fs from 'fs'\nimport path from 'path'\n\nimport { Address, Transaction } from '@ton/core'\n\nconst decimalCount = 9\nconst decimal = pow10(decimalCount)\nconst defaultPath = 'gasInfo'\n\nexport interface GasInfo {\n [key: string]: string\n}\n\nexport interface Profile {\n profileGas: boolean\n fileName: string\n filePath?: string\n}\n\nfunction createDirectoryIfNotExist(directoryPath: string): void {\n if (!fs.existsSync(directoryPath)) {\n fs.mkdirSync(directoryPath, { recursive: true })\n }\n}\n\nfunction sortAndSave(filePath: string, gasInfo: GasInfo): void {\n const entries = Object.entries(gasInfo)\n const sortedEntries = entries.sort(([, valueA], [, valueB]) => parseFloat(valueA) - parseFloat(valueB))\n const jsonData = JSON.stringify(Object.fromEntries(sortedEntries), null, 2)\n fs.writeFileSync(filePath, `${jsonData}\\n`, 'utf8')\n}\n\nfunction readOrCreateJsonFile(filePath: string): GasInfo {\n if (fs.existsSync(filePath)) {\n const fileContent: string = fs.readFileSync(filePath, 'utf8')\n return JSON.parse(fileContent) as GasInfo\n } else {\n return {}\n }\n}\n\nfunction pow10(n: number): bigint {\n let v = 1n\n for (let i = 0; i < n; i++) {\n v *= 10n\n }\n return v\n}\n\nexport function formatCoinsPure(value: bigint, precision = 6): string {\n let whole = value / decimal\n\n let frac = value % decimal\n const precisionDecimal = pow10(decimalCount - precision)\n if (frac % precisionDecimal > 0n) {\n // round up\n frac += precisionDecimal\n if (frac >= decimal) {\n frac -= decimal\n whole += 1n\n }\n }\n frac /= precisionDecimal\n\n return `${whole.toString()}${frac !== 0n ? '.' + frac.toString().padStart(precision, '0').replace(/0+$/, '') : ''}`\n}\n\nfunction formatCoins(value: bigint | undefined, precision = 6): string {\n if (value === undefined) return 'N/A'\n\n return formatCoinsPure(value, precision)\n}\n/**\n * Prints transaction fees.\n * Example output:\n * ```\n * ┌─────────┬───────────────────┬──────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────┬────────────────┬──────────┬────────────┐\n * │ (index) │ address │ op │ valueIn │ valueOut │ totalFees │ inForwardFee │ outForwardFee │ outActions │ computeFee │ exitCode │ actionCode │\n * ├─────────┼───────────────────┼──────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────┼────────────────┼──────────┼────────────┤\n * │ 0 │ 'lzDeployer' │ 'N/A' │ 'N/A' │ '1 TON' │ '0.002118 TON' │ 'N/A' │ '0.000818 TON' │ 1 │ '0.000775 TON' │ 0 │ 0 │\n * │ 1 │ 'counter' │ '0x14da9f4f' │ '1 TON' │ '0.994674 TON' │ '0.004814 TON' │ '0.000546 TON' │ '0.00077 TON' │ 1 │ '0.004558 TON' │ 0 │ 0 │\n * │ 2 │ 'endpointChannel' │ '0x24f8afd1' │ '0.994674 TON' │ '0.988235 TON' │ '0.005944 TON' │ '0.000513 TON' │ '0.000744 TON' │ 1 │ '0.005696 TON' │ 0 │ 0 │\n * │ 3 │ 'payload' │ '0x1b8fba43' │ '0.988235 TON' │ '0.983208 TON' │ '0.004437 TON' │ '0.000496 TON' │ '0.000885 TON' │ 1 │ '0.004142 TON' │ 0 │ 0 │\n * │ 4 │ 'counter' │ '0x507674bc' │ '0.983208 TON' │ '1.023606 TON' │ '0.00899 TON' │ '0.00059 TON' │ '0.000919 TON' │ 2 │ '0.008684 TON' │ 0 │ 0 │\n * │ 5 │ 'payload' │ '0x648a33b0' │ '0.049522 TON' │ '1.021254 TON' │ '0.002702 TON' │ '0.00032 TON' │ '0.00044 TON' │ 1 │ '0.002556 TON' │ 0 │ 0 │\n * │ 6 │ 'lzDeployer' │ 'no body' │ '0.974085 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * │ 7 │ 'lzDeployer' │ 'no body' │ '1.021254 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * └─────────┴───────────────────┴──────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────┴────────────────┴──────────┴────────────┘\n * ```\n */\n\nexport function printTransactionTrace(\n transactions: Transaction[],\n opcodeInfo: { [p: string]: string },\n callerStack?: string,\n profile?: Profile\n): void {\n const { stack } = new Error()\n callerStack ??= stack\n console.info(callerStack?.split('\\n')[2].trim())\n let cumulativeFees = 0n\n let gasInfo: GasInfo = {}\n let filePath = profile?.filePath ?? defaultPath\n if (profile?.profileGas) {\n createDirectoryIfNotExist(filePath)\n filePath = path.join(filePath, `${profile.fileName}.json`)\n gasInfo = readOrCreateJsonFile(filePath)\n }\n console.table(\n transactions\n .map((tx) => {\n if (tx.description.type !== 'generic') return undefined\n\n const body = tx.inMessage?.info.type === 'internal' ? tx.inMessage.body.beginParse() : undefined\n const op = body === undefined ? 0n : body.remainingBits >= 32 ? body.preloadUint(32) : 0n\n\n const totalFees = formatCoins(tx.totalFees.coins)\n\n const computeFees = formatCoins(\n tx.description.computePhase.type === 'vm' ? tx.description.computePhase.gasFees : undefined\n )\n\n const totalFwdFees = formatCoins(tx.description.actionPhase?.totalFwdFees ?? undefined)\n\n const valueIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.value.coins : undefined\n )\n\n const valueOut = formatCoins(\n tx.outMessages\n .values()\n .reduce(\n (total, message) =>\n total + (message.info.type === 'internal' ? message.info.value.coins : 0n),\n 0n\n )\n )\n\n const forwardIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.forwardFee : undefined\n )\n\n // remove 11 bits from front of tx.address\n const addressString =\n tx.address.toString(16).length != 64 ? 'UNKNOWN' : Address.parseRaw('1:' + tx.address.toString(16))\n const opString = op.toString() in opcodeInfo ? opcodeInfo[op.toString()] : op.toString()\n cumulativeFees += tx.totalFees.coins + (tx.description.actionPhase?.totalFwdFees ?? 0n)\n\n if (profile?.profileGas) gasInfo[opString] = formatCoins(cumulativeFees)\n\n return {\n address: addressString,\n op: opString,\n // valueIn,\n // valueOut,\n totalFees: totalFees,\n inForwardFee: forwardIn,\n outForwardFee: totalFwdFees,\n // outActions: tx.description.actionPhase?.totalActions ?? 'N/A',\n computeFee: computeFees,\n // exitCode: tx.description.computePhase.type === 'vm' ? tx.description.computePhase.exitCode : 'N/A',\n // actionCode: tx.description.actionPhase?.resultCode ?? 'N/A',\n cumulativeFee: formatCoins(cumulativeFees),\n }\n })\n .filter((v) => v !== undefined)\n )\n if (profile?.profileGas) sortAndSave(filePath, gasInfo)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/sdk-tools.ts","../src/base-wrapper.ts","../src/test-tools.ts","../src/externalWrappers/Multisig-Constants.ts","../src/externalWrappers/Multisig.ts","../src/externalWrappers/Order.ts","../src/externalWrappers/multisig-utils.ts","../src/externalWrappers/jetton-helpers.ts","../src/externalWrappers/jetton-minter.ts","../src/externalWrappers/jetton-wallet.ts","../src/print-tx-trace.ts"],"names":["Cell","crc32","Address","toBigIntBE","toBufferBE","str","fs","path","name","SendMode","beginCell","Dictionary","contractAddress","toNano","arrayToCell","cellToArray","randomAddress","compareTransaction","flattenTransaction","extractEvents","Sha256","fs3"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"index.cjs","sourcesContent":["import { Address, Cell } from '@ton/core'\nimport { toBigIntBE, toBufferBE } from 'bigint-buffer'\nimport * as crc32 from 'crc-32'\n\n/**\n * Wraps a blueprint-like artifact in a `Cell`. The constrains on the input type are loosened\n * and only the `hex` property is made required.\n *\n * @param artifact Blueprint JSON artifact object\n * @returns {Cell}\n */\nexport const cellFromArtifact = ({ hex }: { hex: string; hash?: string; hashBase64?: string }): Cell =>\n Cell.fromHex(hex)\n\n// ------------- Testing utils for Lz Ton Packet encoding/decoding -----------\n\nexport function getOpcodeCRC(input: string): bigint {\n return BigInt(crc32.str(input) >>> 0) // Ensure the result is unsigned and convert to bigint\n}\n\nexport const MASTER_CHAIN_ID = -1\nexport const BASE_CHAIN_ID = 0\nexport const MASTER_CHAIN_SHARD = '8000000000000000'\n\nexport function bigintToAddress(value: bigint): Address {\n const buf = to32ByteBuffer(value)\n return Address.parse(`0:${buf.toString('hex')}`)\n}\n\nexport const addressToBigInt = (address: Address): bigint => {\n return BigInt('0x' + address.hash.toString('hex'))\n}\n\n/**\n * Convert a value to a 32 byte buffer, if the value is a string, it can only be a hex string\n * @param value\n * @param maxIntermediateBufferSize\n */\nexport function to32ByteBuffer(value: bigint | number | string | Uint8Array, maxIntermediateBufferSize = 66): Buffer {\n if (typeof value === 'string') {\n if (!isValidHex(value)) {\n throw new Error('only hex string is supported')\n }\n let hex = trim0x(value)\n if (hex.length % 2 !== 0) {\n hex = '0' + hex\n }\n value = toBigIntBE(Buffer.from(hex, 'hex'))\n }\n if (value instanceof Uint8Array) {\n value = toBigIntBE(Buffer.from(value))\n }\n const bf = toBufferBE(BigInt(value), maxIntermediateBufferSize)\n // trim from the left, keep the right 32 bytes\n return bf.subarray(-32)\n}\n\nfunction trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\nfunction isValidHex(str: string): boolean {\n const hexRegex = /^(0x)?[0-9A-Fa-f]+$/\n return hexRegex.test(str)\n}\n\nexport function findDeepestCell(cell: Cell): { subTreeCells: number } {\n // Get all references from the current cell\n const refs = Array.from({ length: cell.refs.length }, (_, i) => cell.refs.at(i))\n\n // Base case: if no references, return current cell with depth 0\n if (refs.length === 0) {\n return { subTreeCells: 1 }\n }\n\n let size = 0\n\n // Check all references\n for (const ref of refs) {\n if (!ref) continue\n\n size += findDeepestCell(ref).subTreeCells\n }\n\n return { subTreeCells: size }\n}\n","import * as fs from 'fs'\nimport * as path from 'path'\n\nimport { getOpcodeCRC } from './utils'\n\nexport interface ConstructorArgs {\n [key: string]: string\n}\n\n// requirements:\n// 1. each attribute can have only one dependency (one constructor call)\n// 2. The name of the inputArg which is a class should be the same as the class name\nexport interface Attribute {\n name: string\n type: string\n value: string\n}\n\nexport type ConstructorCallGenerator = (args: ConstructorArgs, _: unknown) => string\n\nexport interface FieldMap {\n [key: number]: string\n}\nexport interface InverseFieldMap {\n [key: string]: number\n}\n\nexport interface TonObject {\n constructorName: string\n constructorInputArgs: ConstructorArgs\n // the order of these attributes need to be preserved\n attributes: Attribute[]\n // the inside ::NAME of the object\n tonName: string\n // infer the implicit map of orders of the objects at declaration and the fields\n fieldMap: FieldMap\n inverseFieldMap: InverseFieldMap\n // You need to have generated everything to be able to resolve the dependencies to generate the codes.\n constructorCode?: string\n constructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for types\n tsTypeName?: string\n tsTypeCode?: string\n // stuff for deconstructor\n deconstructorName?: string\n deconstructorCode?: string\n deconstructorCodeCallGenerator?: ConstructorCallGenerator\n // stuff for deconstructing md's\n is_md?: boolean\n}\n\n// maps the name of the ton object to the object\nexport interface TonObjectsDict {\n [name: string]: TonObject\n}\n\nexport interface TonViewFunction {\n name: string\n args: { [key: string]: string }\n returnType: string[]\n code: string\n}\n\n// maps the name of the contract to a list of view functions\nexport interface TonViewFunctionsDict {\n [name: string]: TonViewFunction[]\n}\n\nconst file_signature_header = `////// Generated by sdk/sdk-generator.ts`\nconst ERRORCODE_MASK = 0x7ffn\n\nfunction tonTypeToTStype(tonType: string): string {\n switch (tonType) {\n case 'int':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n case 'address':\n return 'bigint'\n\n case 'cell':\n case 'cellRef':\n return 'Cell'\n\n case 'tuple':\n return 'Tuple'\n\n case 'objRef':\n return 'Cell'\n\n case 'slice':\n return 'Address'\n\n case 'dict256':\n case 'dictionary':\n return 'LzDict'\n\n default:\n return 'unknown'\n }\n}\n\nfunction tonTypeToReadTupleFunction(tonType: string): string {\n switch (tonType) {\n case 'int':\n return 'readBigNumber()'\n\n case 'slice':\n case 'address':\n return 'readAddress()'\n\n case 'cell':\n return 'readCell()'\n\n case 'tuple':\n return 'readTuple().pop() as Tuple'\n\n default:\n return 'pop()'\n }\n}\n\nfunction tonTypeToTonGetterName(tonType: string): string {\n switch (tonType) {\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n return 'cl::get<' + tonType + '>'\n\n case 'slice':\n case 'address':\n return 'cl::get<address>'\n\n case 'cell':\n case 'cell_ref':\n return 'cl::get<cellRef>'\n\n case 'tuple':\n case 'obj_ref':\n return 'cl::get<objRef>'\n\n case 'dict256':\n case 'dictionary':\n return 'cl::get<dict256>'\n\n default:\n return 'unknown'\n }\n}\n\nfunction tsTypeToTSGetterName(tsType: string, wrapperName = 'platonic'): string {\n switch (tsType) {\n case 'bigint':\n return `${wrapperName}.getClInt`\n\n case 'Slice':\n case 'Address':\n return `${wrapperName}.getClAddress`\n\n case 'Cell':\n return `${wrapperName}.getClCell`\n\n case 'Tuple':\n return `${wrapperName}.getClObj`\n\n // TODO: this will definitely bite me in the future\n case 'LzDict':\n return 'getLzDict'\n\n default:\n return 'unknown'\n }\n}\n\nfunction tonTypeToTupleType(tonType: string): string {\n switch (tonType) {\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n case 'coins':\n case 'bool':\n return 'int'\n\n case 'address':\n case 'slice':\n return 'slice'\n\n case 'cell_ref':\n case 'dict256':\n return 'cell'\n\n case 'obj_ref':\n return 'tuple'\n\n default:\n return tonType\n }\n}\n\nfunction tonTypeToTupleValueName(tonType: string): string {\n switch (tonType) {\n case 'coins':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'uint64':\n case 'uint256':\n return 'value'\n\n case 'address':\n case 'slice':\n case 'cell':\n case 'dictionary':\n case 'dict256':\n case 'ref':\n return 'cell'\n\n case 'tuple':\n return 'items'\n\n default:\n return 'value'\n }\n}\n\nfunction tonTypeToTupleValue(value: string, tonType: string): string {\n // this is an special case where we need to remove the args. prefix\n if (value.includes('INSIDE_FLAGGED')) {\n value = value.replace('INSIDE_FLAGGED', '').replace(/args\\./g, '')\n }\n switch (tonType) {\n case 'address':\n case 'slice':\n return `beginCell().storeAddress(${value}).endCell()`\n\n case 'tuple':\n return `${value}.items`\n\n default:\n return value\n }\n}\n\nexport function mergeConstructorDicts(result: TonObjectsDict, added: TonObjectsDict): TonObjectsDict {\n Object.entries(added).forEach(\n ([\n name,\n {\n constructorInputArgs: inputArgs,\n attributes,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n },\n ]) => {\n result[name] = {\n constructorInputArgs: inputArgs,\n attributes,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n }\n }\n )\n return result\n}\n\nexport function parseDirectory(directoryPath: string): TonObjectsDict {\n let result: TonObjectsDict = {}\n\n const items = fs.readdirSync(directoryPath)\n\n items.forEach((item) => {\n const itemPath = path.join(directoryPath, item)\n const stats = fs.statSync(itemPath)\n\n if (itemPath.includes('base_storage')) {\n const a = 1\n }\n\n if (stats.isDirectory()) {\n result = mergeConstructorDicts(result, parseDirectory(itemPath))\n } else if (stats.isFile() && path.extname(item) === '.fc' && !itemPath.includes('@ston-fi')) {\n const content = fs.readFileSync(itemPath, 'utf8')\n result = mergeConstructorDicts(result, parseClasses(content))\n }\n })\n\n return result\n}\n\nfunction snakeToCamelCase(str: string): string {\n return str\n .replace(/::/g, '_') // Replace \"::\" with \"_\"\n .replace(/(_\\w)/g, (match) => match[1].toUpperCase()) // Convert snake_case to camelCase\n}\n\nfunction parseDeclareLines(input: string, fieldMap: FieldMap): Attribute[] {\n const psResult: Attribute[] = []\n const declareLineRegex = /\\[\\s*([a-zA-Z_][\\w:]*),\\s*((?:[^,\\]]|\\([^)]*\\))*)\\]/g\n\n let key = 0\n\n let match\n while ((match = declareLineRegex.exec(input)) !== null && key < Object.keys(fieldMap).length) {\n const [, argType, assignedValue] = match\n\n psResult.push({\n name: key in fieldMap ? fieldMap[key].trim() : '',\n type: argType.trim().split('::').pop() ?? 'int',\n value: assignedValue.trim(),\n })\n\n key += 1\n }\n\n return psResult\n}\n\nfunction parseFieldNames(strInput: string): [FieldMap, InverseFieldMap] {\n const fieldMap: FieldMap = {}\n const inverseFieldMap: InverseFieldMap = {}\n const regex = /^const\\s+int\\s+(?:[A-Za-z]+::)?[A-Za-z]\\w+::(\\w+)\\s*=\\s*(\\d+);/gm\n let match\n\n while ((match = regex.exec(strInput)) !== null) {\n const [, fieldName, fieldIndexStr] = match\n const fieldIndex = parseInt(fieldIndexStr, 10)\n fieldMap[fieldIndex] = fieldName\n inverseFieldMap[fieldName] = fieldIndex\n }\n\n return [fieldMap, inverseFieldMap]\n}\n\nfunction parseClasses(strInput: string): TonObjectsDict {\n const functionRegex =\n /(\\w+(?:::\\w+)*::New\\w*)\\s*\\(([\\w\\s,$·]*)\\)\\s*·?\\s*(impure)?\\s*(inline\\s*)?method_id\\s*\\{([^}]*)\\}/g\n\n const results: TonObjectsDict = {}\n\n let match\n while ((match = functionRegex.exec(strInput)) !== null) {\n const [, rawName, argsString, , , body] = match\n const args: { [key: string]: string } = {}\n\n // Parse arguments\n const argPairs = argsString.split(',').map((arg) => arg.trim())\n for (const argPair of argPairs) {\n const [argType, argName] = argPair.split(/\\s+/) as [string, string?]\n if (argName !== undefined) {\n args[argName.replace('$', '')] = argType\n }\n }\n\n const name = rawName.replace(/::New$/, '')\n const functionName = snakeToCamelCase('get' + 'new_' + name)\n\n const [fieldMap, inverseFieldMap] = parseFieldNames(strInput)\n\n console.log(`Parsing ${name}...`)\n\n const tonNameRegex = /const int\\s+(?:md::)?[\\w:]+::NAME = \"(.*?)\"u;/\n const tonNameMatch = strInput.match(tonNameRegex)\n const tonName = tonNameMatch ? tonNameMatch[1] : name\n\n const attributes = parseDeclareLines(body, fieldMap)\n results[name] = {\n constructorInputArgs: args,\n attributes,\n constructorName: functionName,\n tonName,\n fieldMap,\n inverseFieldMap,\n }\n }\n\n return results\n}\n\nexport function saveTonContractWrapper(tonObjects: TonObjectsDict, directory: string, baseWrapper?: string): void {\n const generatedMethods = Object.entries(tonObjects)\n .map(([_, tonObject]) => tonObject.constructorCode ?? '')\n .join('\\n')\n if (baseWrapper === undefined) {\n baseWrapper = `import { BaseWrapper, SendRequestOptions } from '@layerzerolabs/ton-sdk-tools'`\n }\n const savedCode = `${file_signature_header}\n\nimport {\n Address,\n Cell,\n ContractProvider,\n ContractState,\n Sender,\n SenderArguments,\n TupleItem,\n TupleReader,\n contractAddress,\n} from '@ton/core'\n\n${baseWrapper}\n\nexport type GetIntFnNames =\n | 'cl::get<uint8>'\n | 'cl::get<uint16>'\n | 'cl::get<uint32>'\n | 'cl::get<uint64>'\n | 'cl::get<uint256>'\n | 'cl::get<coins>'\n | 'cl::get<bool>'\n | 'cl::get<address>'\n\nexport class TonContractWrapper extends BaseWrapper {\n static create(code: Cell, data: Cell, workchain = 0): TonContractWrapper {\n const init = { code, data }\n return new TonContractWrapper(contractAddress(workchain, init), init)\n }\n\n buildRequest(\n opCode: bigint,\n data: Cell,\n opts: SendRequestOptions,\n balanceRefill = 0n,\n queryId?: number | bigint\n ): SenderArguments {\n const body = this.beginMessage(opCode, queryId).storeCoins(balanceRefill).storeRef(data).endCell()\n return this.buildSenderArguments(body, opts)\n } \n\n async sendInternalMessage(\n provider: ContractProvider,\n via: Sender,\n opCode: bigint,\n md: Cell,\n opts: SendRequestOptions,\n balanceRefill = 0n,\n queryId?: number | bigint\n ): Promise<void> {\n if (via.address === undefined) {\n throw new Error('Sender address is not defined')\n }\n const request = this.buildRequest(opCode, md, opts, balanceRefill, queryId)\n return this.sendRequest(provider, via, request)\n }\n\n async getFieldStack(\n provider: ContractProvider,\n method: string,\n cell: Cell,\n fieldName: bigint\n ): Promise<TupleReader> {\n const args: TupleItem[] = [\n { type: 'cell', cell: cell },\n { type: 'int', value: fieldName },\n ]\n const ret = await provider.get(method, args)\n return ret.stack\n }\n\n async getState(provider: ContractProvider): Promise<ContractState> {\n return provider.getState()\n }\n\n async getCurrentStorageCell(provider: ContractProvider): Promise<Cell> {\n const getResult = await provider.get('getContractStorage', [])\n return getResult.stack.readCell()\n }\n\n async getViewFunction(provider: ContractProvider, method: string, args: TupleItem[]): Promise<TupleReader> {\n const ret = await provider.get(method, args)\n return ret.stack\n }\n\n async getClInt(provider: ContractProvider, method: GetIntFnNames, cell: Cell, fieldName: bigint): Promise<bigint> {\n return (await this.getFieldStack(provider, method, cell, fieldName)).readBigNumber()\n }\n\n async getClAddress(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Address> {\n return (await this.getFieldStack(provider, 'cl::get<address>', cell, fieldName)).readAddress()\n }\n\n async getClCell(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Cell> {\n return (await this.getFieldStack(provider, 'cl::get<cellRef>', cell, fieldName)).readCell()\n }\n\n async getClObj(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Cell> {\n return (await this.getFieldStack(provider, 'cl::get<objRef>', cell, fieldName)).readCell()\n }\n\n async getClDict(provider: ContractProvider, cell: Cell, fieldName: bigint): Promise<Cell> {\n return (await this.getFieldStack(provider, 'cl::get<dict256>', cell, fieldName)).readCell()\n }\n\n async getObject(provider: ContractProvider, method: string, args: TupleItem[]): Promise<Cell> {\n const ret = await provider.get(method, args)\n return ret.stack.readCell()\n }\n\n async getDictCellItem(provider: ContractProvider, dict_cell: Cell, key: bigint): Promise<Cell> {\n const args: TupleItem[] = [\n { type: 'cell', cell: dict_cell },\n { type: 'int', value: key },\n ]\n const ret = await provider.get('cl::dict256::get<cellRef>', args)\n return ret.stack.readCell()\n }\n\n async getDictUint256Item(provider: ContractProvider, dict_cell: Cell, key: bigint): Promise<bigint> {\n const args: TupleItem[] = [\n { type: 'cell', cell: dict_cell },\n { type: 'int', value: key },\n ]\n const ret = await provider.get('cl::dict256::get<uint256>', args)\n return ret.stack.readBigNumber()\n }\n\n async getSetDictItem(provider: ContractProvider, dict_cell: Cell, key: bigint, value: Cell): Promise<Cell> {\n const args: TupleItem[] = [\n { type: 'cell', cell: dict_cell },\n { type: 'int', value: key },\n { type: 'cell', cell: value },\n ]\n const ret = await provider.get('cl::dict256::setRef', args)\n return ret.stack.readCell()\n }\n\n${generatedMethods}\n}\n`\n\n fs.writeFileSync(path.join(directory, 'TonContractWrapper.ts'), savedCode)\n}\n\nexport function saveAllTypes(tonObjects: TonObjectsDict, directory: string): void {\n const generatedTypes = Object.entries(tonObjects)\n .filter(([_, tonObject]) => tonObject.attributes.length > 0)\n .map(([_, tonObject]) => 'export ' + (tonObject.tsTypeCode ?? ''))\n .join('')\n\n const mapping: { [key: string]: string[] } = {}\n Object.values(tonObjects).forEach((item) => {\n if (item.tsTypeName === undefined) {\n return\n }\n if (!(item.tonName in mapping)) {\n mapping[item.tonName] = []\n }\n mapping[item.tonName].push(item.tsTypeName)\n })\n const generatedNameMap = `export const nameMap: { [key: string]: string } = {\n${Object.entries(mapping)\n .map(([key, val]) => \" '\" + key + \"': '\" + val[0] + \"',\")\n .join('\\n')}\n}`\n\n const savedCode = `${file_signature_header}\n/* eslint-disable @typescript-eslint/no-empty-interface */\n\nimport { Cell, OpenedContract, beginCell } from '@ton/core'\nimport { SandboxContract } from '@ton/sandbox'\n\nimport { TonContractWrapper } from './TonContractWrapper'\n\nexport type ExtendedContract<T> = SandboxContract<T> | OpenedContract<T>\n\nexport class LzDict {\n _cell: Cell\n\n constructor(data: Cell) {\n this._cell = data\n }\n\n static empty(): LzDict {\n return new LzDict(beginCell().endCell())\n }\n\n async getCell(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<Cell> {\n return wrapper.getDictCellItem(this._cell, key)\n }\n\n async getBigInt(key: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<bigint> {\n return wrapper.getDictUint256Item(this._cell, key)\n }\n\n async set(key: bigint, value: Cell, wrapper: ExtendedContract<TonContractWrapper>): Promise<void> {\n this._cell = await wrapper.getSetDictItem(this._cell, key, value)\n }\n\n asCell(): Cell {\n return this._cell\n }\n}\n\nexport interface Md {}\n\n${generatedTypes}\n\n${generatedNameMap}\n`\n\n fs.writeFileSync(path.join(directory, 'allTypes.ts'), savedCode)\n}\n\nexport function saveTonObjectUnwrapper(tonObjects: TonObjectsDict, directory: string): void {\n const allTypes = [\n ...(Object.values(tonObjects)\n .map((obj) => obj.tsTypeName)\n .filter((name) => name !== undefined) as string[]),\n 'ExtendedContract',\n 'LzDict',\n 'Md',\n 'nameMap',\n ].sort()\n const savedCode = `${file_signature_header}\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n\nimport { Cell, Transaction, TransactionComputeVm, TransactionDescriptionGeneric, beginCell } from '@ton/core'\nimport { BlockchainTransaction, EventMessageSent, SendMessageResult } from '@ton/sandbox'\nimport { flattenTransaction } from '@ton/test-utils'\n\nimport { OPCODES } from '../constants'\n\nimport {\n${allTypes.map((type) => ' ' + type + ',\\n').join('')}} from './allTypes'\nimport { TonContractWrapper } from './TonContractWrapper'\n\nfunction bigintToAsciiString(num: bigint): string {\n let result = ''\n while (num > 0n) {\n const charCode = Number(num & 255n)\n result = String.fromCharCode(charCode) + result\n num = num >> 8n\n }\n return result\n}\n\nexport class LzEvent {\n private _eventPromise: Promise<ActionEvent>\n private _event: ActionEvent | null\n public topic: string\n public body: Md\n public bodyName: string\n public initialStorage: Cell\n public initialized: boolean\n\n constructor(wrapper: ExtendedContract<TonContractWrapper>, cell: Cell) {\n this._eventPromise = TonObjectUnwrapper.getActionEventToTS(wrapper, cell)\n this._event = null\n this.topic = ''\n this.body = {}\n this.initialStorage = beginCell().endCell()\n this.initialized = false\n this.bodyName = ''\n }\n\n async load(wrapper: ExtendedContract<TonContractWrapper>): Promise<boolean> {\n this._event = await this._eventPromise\n this.topic = bigintToAsciiString(this._event.topic)\n this.bodyName = await TonObjectUnwrapper.getTypeOf(wrapper, this._event.body)\n const tsCasterName = 'get' + nameMap[this.bodyName] + 'ToTS'\n\n const method = TonObjectUnwrapper[tsCasterName as keyof typeof TonObjectUnwrapper]\n if (typeof method === 'function') {\n this.body = await method(wrapper, this._event.body)\n } else {\n console.log('Method' + tsCasterName + 'does not exist.')\n }\n\n this.initialStorage = this._event.initialStorage\n this.initialized = true\n return this.initialized\n }\n}\n\nexport class LzEventHandler {\n public allFailures = {\n txList: [] as BlockchainTransaction[],\n events: [] as EventMessageSent[],\n }\n public allVictories = {\n txList: [] as BlockchainTransaction[],\n eventObjects: [] as LzEvent[],\n packetsSent: [] as MdPacketSent[],\n } \n async addCurrentEventsToAllEvents(results: SendMessageResult, contract: ExtendedContract<TonContractWrapper>): Promise<void> {\n for (let i = 0; i < results.transactions.length; i++) {\n const tx: BlockchainTransaction & Transaction = results.transactions[i]\n const desc = tx.description\n if (desc.type !== 'generic' || desc.computePhase.type !== 'skipped') continue\n \n const eventBody = tx.inMessage?.body\n if (eventBody === undefined) continue\n const eventBodySlice = eventBody.beginParse()\n // the event body is empty if we are sending a payment with no corresponding payload\n if (eventBodySlice.remainingBits < 32) continue\n const opCode = eventBodySlice.loadUint(32)\n if (opCode === Number(OPCODES.BaseInterface_OP_EVENT)) {\n if (eventBody.refs.length > 0) {\n const eventInnerCell = eventBody.refs[0]\n const newLzEvent = new LzEvent(contract, eventInnerCell)\n await newLzEvent.load(contract)\n this.allVictories.txList.push(tx)\n this.allVictories.eventObjects.push(newLzEvent)\n if (newLzEvent.topic === 'Channel::event::PACKET_SENT' && this.isMdPacketSent(newLzEvent.body)) {\n this.allVictories.packetsSent.push(newLzEvent.body)\n // getMdLzSendToTS(contract, newLzEvent.body.lzSend)\n }\n }\n } else {\n this.allFailures.txList.push(tx)\n this.allFailures.events.push(results.events[i] as EventMessageSent)\n }\n }\n }\n isMdPacketSent(md: Md): md is MdPacketSent {\n return 'nativeFee' in md && 'zroFee' in md && 'extraOptions' in md && 'enforcedOptions' in md && 'packetEncoded' in md && 'nonce' in md\n }\n}\n\ninterface GasStructure {\n actionFee: bigint\n forwardFee: bigint\n computeFee: bigint\n storageFee: bigint\n messageSizeCells: bigint\n messageSizeBits: bigint\n}\n\nexport class LzGasTracker {\n private codeOp: Map<bigint, string>\n public gasCosts: Map<string, GasStructure[]>\n\n constructor() {\n this.codeOp = LzGasTracker.invertMapping(OPCODES)\n this.gasCosts = new Map()\n }\n\n static invertMapping(obj: { [key: string]: bigint }): Map<bigint, string> {\n const invertedObj = new Map<bigint, string>()\n\n for (const key in obj) {\n const value = obj[key]\n invertedObj.set(value, key)\n }\n\n return invertedObj\n }\n\n calculateGas(results: SendMessageResult): void {\n for (const transaction of results.transactions) {\n const tx: BlockchainTransaction & Transaction = transaction\n const flatTx = flattenTransaction(tx)\n\n if (flatTx.op !== undefined) {\n const desc = tx.description as TransactionDescriptionGeneric\n\n const op = BigInt(flatTx.op)\n const opName = this.codeOp.get(op)\n if (opName === undefined) continue\n\n const msgSize = desc.actionPhase?.totalMessageSize ?? { cells: 0n, bits: 0n }\n\n const newGasStructure: GasStructure = {\n actionFee: desc.actionPhase?.totalActionFees ?? 0n,\n forwardFee: desc.actionPhase?.totalFwdFees ?? 0n,\n computeFee: BigInt((desc.computePhase as TransactionComputeVm)?.gasFees ?? 0),\n storageFee: desc.storagePhase?.storageFeesCollected ?? 0n,\n messageSizeCells: msgSize.cells,\n messageSizeBits: msgSize.bits,\n }\n\n const gasCost = this.gasCosts.get(opName)\n if (gasCost !== undefined) {\n gasCost.push(newGasStructure)\n } else {\n this.gasCosts.set(opName, [newGasStructure])\n }\n }\n }\n }\n\n asTable(): string {\n const headers = [\n 'Operation',\n 'Action Fee',\n 'Forward Fee',\n 'Compute Fee',\n 'Storage Fee',\n 'Msg Size (Cells)',\n 'Msg Size (Bits)',\n ]\n const columnWidths = headers.map((header) => header.length)\n let tableString = ''\n\n // Calculate column widths\n for (const [opName, structures] of this.gasCosts) {\n columnWidths[0] = Math.max(columnWidths[0], opName.length)\n for (const structure of structures) {\n columnWidths[1] = Math.max(columnWidths[1], structure.actionFee.toString().length)\n columnWidths[2] = Math.max(columnWidths[2], structure.forwardFee.toString().length)\n columnWidths[3] = Math.max(columnWidths[3], structure.computeFee.toString().length)\n columnWidths[4] = Math.max(columnWidths[4], structure.storageFee.toString().length)\n columnWidths[5] = Math.max(columnWidths[5], structure.messageSizeCells.toString().length)\n columnWidths[6] = Math.max(columnWidths[6], structure.messageSizeBits.toString().length)\n }\n }\n\n // Add header to table string\n tableString += headers.map((header, i) => header.padEnd(columnWidths[i])).join(' | ') + '\\\\n'\n tableString += columnWidths.map((width) => '-'.repeat(width)).join('-+-') + '\\\\n'\n\n // Add data to table string\n for (const [opName, structures] of this.gasCosts) {\n for (let i = 0; i < structures.length; i++) {\n const structure = structures[i]\n const row = [\n i === 0 ? opName : '',\n structure.actionFee.toString(),\n structure.forwardFee.toString(),\n structure.computeFee.toString(),\n structure.storageFee.toString(),\n structure.messageSizeCells.toString(),\n structure.messageSizeBits.toString(),\n ]\n tableString += row.map((cell, i) => cell.padEnd(columnWidths[i])).join(' | ') + '\\\\n'\n }\n tableString += columnWidths.map((width) => '-'.repeat(width)).join('-+-') + '\\\\n'\n }\n\n // Remove the last newline character\n tableString = tableString.slice(0, -1)\n\n // Log the entire table\n return tableString\n }\n}\n\nasync function getLzDict(obj: Cell, fieldName: bigint, wrapper: ExtendedContract<TonContractWrapper>): Promise<LzDict> {\n const dictCell = await wrapper.getClDict(obj, fieldName)\n return new LzDict(dictCell)\n}\n\nexport class TonObjectUnwrapper {\n static async getTypeOf(provider: ExtendedContract<TonContractWrapper>, obj_cell: Cell): Promise<string> {\n const ret = await provider.getViewFunction('cl::typeof', [{ type: 'cell', cell: obj_cell }])\n return bigintToAsciiString(ret.readBigNumber())\n }\n${Object.entries(tonObjects)\n .map(([_, constructor]) => constructor.deconstructorCode ?? '')\n .join('\\n')}\n}\n`\n\n fs.writeFileSync(path.join(directory, 'TonObjectUnwrapper.ts'), savedCode)\n}\n\nexport function generateConstructorCode(className: string, tonClasses: TonObjectsDict): TonObjectsDict {\n if (!(className in tonClasses)) {\n return tonClasses\n }\n\n const tonClass = tonClasses[className]\n const { constructorInputArgs: inputArgs } = tonClass\n // 'get' is because of blueprint\n const fnName = snakeToCamelCase(`getNew_${className}`)\n\n let methodIdName = `${className}::New`\n if (className.includes('::New')) {\n methodIdName = className\n }\n\n tonClass.constructorName = fnName\n\n tonClass.constructorCode = `\n async ${fnName}(provider: ContractProvider${\n Object.keys(inputArgs).length > 0\n ? `, args: {\n ${Object.entries(inputArgs)\n .map(([argName, argType]) => `${argName}: ${tonTypeToTStype(argType)}`)\n .join(',\\n ')}\n }`\n : ''\n }): Promise<Cell> {\n const getResult = await provider.get('${methodIdName}', [\n ${Object.entries(inputArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(inputArgs).length > 0 ? `args.${argName}` : argName, argType)} }`\n )\n .join(',\\n ')}\n ]);\n return getResult.stack.readCell()\n }`\n\n tonClass.constructorCodeCallGenerator = (callerArgs: ConstructorArgs, _): string => {\n // Check for arguments not passed by the parent\n const missingArgs = Object.keys(inputArgs).filter((key) => !(key in callerArgs))\n if (missingArgs.length > 0) {\n console.warn(\n `Argument(s) not provided: ${missingArgs.join(', ')}, make sure the TON constructor has default values for these arguments`\n )\n }\n\n const filteredArgs = Object.entries(inputArgs).filter(([key, value]) => key in callerArgs)\n\n return `await ${fnName}(provider.getSender()${\n filteredArgs.length > 0\n ? `, { ${filteredArgs.map(([argName, argType]) => `${argName}: ${argName}`).join(', ')} }`\n : ''\n })`\n }\n\n tonClasses[className] = tonClass\n return tonClasses\n}\n\nexport function generateAllConstructorCodes(tonClasses: TonObjectsDict): TonObjectsDict {\n for (const [className, tonClass] of Object.entries(tonClasses)) {\n generateConstructorCode(className, tonClasses)\n }\n return tonClasses\n}\n\nfunction getTsAttributeName(name: string): string {\n let modifiedName = name.replace(/::/g, '_')\n const fIndex = modifiedName.indexOf('_f_')\n if (fIndex !== -1) {\n modifiedName = modifiedName.substring(fIndex + 3)\n }\n return modifiedName\n}\n\nexport function generateTonClassType(name: string, tonClasses: TonObjectsDict): TonObjectsDict {\n if (!(name in tonClasses)) {\n return tonClasses\n }\n const tonClass = tonClasses[name]\n const capitalizedName = snakeToCamelCase(name).replace(/^./, (c) => c.toUpperCase())\n tonClass.is_md = name.toLowerCase().startsWith('md')\n const typeName = tonClass.is_md ? 'interface' : 'type'\n const extension = tonClass.is_md ? 'extends Md' : '='\n tonClass.tsTypeCode =\n `${typeName} ${capitalizedName} ${extension} {\n ${tonClass.attributes\n .map(({ name, type }) => {\n return `${getTsAttributeName(name)}: ${tonTypeToTStype(type)};`\n })\n .join('\\n')}\n }` + '\\n\\n'\n\n tonClass.tsTypeName = capitalizedName\n tonClasses[name] = tonClass\n return tonClasses\n}\n\nexport function generateAllTonClassTypes(tonClasses: TonObjectsDict): TonObjectsDict {\n for (const [className, tonClass] of Object.entries(tonClasses)) {\n generateTonClassType(className, tonClasses)\n }\n return tonClasses\n}\n\nexport function generateDeconstructorCode(className: string, tonClasses: TonObjectsDict): TonObjectsDict {\n if (!(className in tonClasses)) {\n return tonClasses\n }\n const tonClass = tonClasses[className]\n const { attributes, tsTypeName, inverseFieldMap } = tonClass\n const fnName = snakeToCamelCase('get_' + className + 'ToTS')\n\n tonClass.deconstructorName = fnName\n tonClass.deconstructorCode = `\n static async ${fnName}(wrapper: ExtendedContract<TonContractWrapper>, cell: Cell): Promise<${tsTypeName}> {\n ${attributes\n .map(({ name, type }) => {\n const fieldTSName = getTsAttributeName(name)\n const tsGetterName = tsTypeToTSGetterName(tonTypeToTStype(type), 'wrapper')\n const fieldIndex = inverseFieldMap[name]\n\n const tonGetterName = tonTypeToTonGetterName(type)\n if (tsGetterName === 'getLzDict') {\n return `const ${fieldTSName} = await getLzDict(cell, ${fieldIndex}n, wrapper)`\n } else if (tsGetterName === 'wrapper.getClInt') {\n return `const ${fieldTSName} = await ${tsGetterName}('${tonGetterName}', cell, ${fieldIndex}n)`\n } else {\n return `const ${fieldTSName} = await ${tsGetterName}(cell, ${fieldIndex}n)`\n }\n })\n .join('\\n')}\n return {\n ${attributes.map(({ name }) => `${getTsAttributeName(name)},`).join('\\n ')}\n }\n }`\n\n // don't generate deconstructor code for classes with no attributes [no attributes means something broke the type inference algorithm]\n if (attributes.length === 0) {\n tonClass.deconstructorCode = ''\n }\n\n tonClass.deconstructorCodeCallGenerator = (callerArgs: ConstructorArgs, _): string => {\n return `await ${fnName}(provider, obj)`\n }\n\n tonClasses[className] = tonClass\n return tonClasses\n}\n\nexport function generateAllDeconstructorCodes(tonClasses: TonObjectsDict): TonObjectsDict {\n for (const [className, tonClass] of Object.entries(tonClasses)) {\n generateDeconstructorCode(className, tonClasses)\n }\n return tonClasses\n}\n\nexport function getSpecificFiles(dirPath: string, includeName: string): string[] {\n const files: string[] = []\n\n function traverseDir(currentPath: string): void {\n const entries = fs.readdirSync(currentPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(currentPath, entry.name)\n\n if (entry.isDirectory()) {\n traverseDir(fullPath)\n } else if (\n entry.isFile() &&\n entry.name.toLowerCase().includes(includeName) &&\n (path.extname(entry.name) === '.fc' || path.extname(entry.name) === '.func')\n ) {\n files.push(fullPath)\n }\n }\n }\n\n traverseDir(dirPath)\n return files\n}\n\nexport function saveObjectsAsTS(tonObjects: TonObjectsDict, filePath: string, fileName: string): void {\n let tsCode = `${file_signature_header}\\n\\nexport const tonObjects = {\\n`\n\n for (const [key, value] of Object.entries(tonObjects)) {\n // Skip entries that include 'action::'\n if (key.includes('action::')) {\n continue\n }\n\n tsCode += ` '${key}': {\\n name: '${value.tonName}',\\n`\n\n for (const attribute of value.attributes) {\n const intKey = value.inverseFieldMap[attribute.name]\n tsCode += ` ${intKey}: {\\n`\n tsCode += ` fieldName: '${key}::${attribute.name}',\\n`\n tsCode += ` fieldType: 'cl::t::${attribute.type}',\\n`\n tsCode += ` },\\n`\n }\n\n tsCode += ` },\\n`\n }\n\n tsCode += `} as const\\n`\n\n // Write the TypeScript code to the specified file\n fs.writeFileSync(path.resolve(filePath, fileName), tsCode, 'utf8')\n}\n\nfunction tonConstNameToTSName(name: string): string {\n return name.replace(/::/g, '_')\n}\n\nexport function extractConstants(fileNames: string[], constType: 'opcode' | 'error'): Map<string, bigint> {\n let firstFormat = /const int\\s+([\\w:]+::(?:OP|op)::\\w+)\\s*=\\s*\"([\\w:]+::(?:OP|op)::\\w+)\"c;/\n let secondFormat = /const\\s+(?:int\\s+)?([\\w:]+::[a-zA-Z]+::(?:op|OP)::\\w+)\\s*=\\s*(0x[\\da-fA-F]+);/\n let thirdFormat = /const\\s+(int\\s+)?(op::(\\w+))\\s*=\\s*(0x[0-9a-fA-F]+);/\n let fourthFormat = /^\\s*int\\s+(op::(\\w+))\\(\\)\\s+asm\\s+\"((?:0x)?[0-9a-fA-F]+)\\s+([A-Z]+)\"\\s*;$/\n let fifthFormat = /^\\s*const\\s+int\\s+(OP::[A-Z][a-zA-Z]+)\\s*=\\s*\"(OP::[A-Z][a-zA-Z]+)\"c\\s*;$/\n if (constType !== 'opcode') {\n firstFormat =\n /^const\\s+int\\s+((?:[A-Za-z_]+::)*[A-Za-z_]+)\\s*=\\s*(\"(?:[A-Za-z_]+::)*[A-Za-z_]+\")\\s*c\\s*&\\s*ERRORCODE_MASK;$/\n secondFormat = /^const\\s+(?:int\\s+)?(error::\\w+)\\s*=\\s*((?:0x[\\da-fA-F]+|\\d+));$/\n // we don't have a third, fourth or fifth format for errors\n thirdFormat = /(?!)/\n fourthFormat = /(?!)/\n fifthFormat = /(?!)/\n }\n const result = new Map<string, bigint>()\n for (const fileName of fileNames) {\n const fileContent = fs.readFileSync(fileName, 'utf-8')\n const lines = fileContent.split('\\n')\n for (const line of lines) {\n const trimmedLine = line.trim()\n let rawVariableName = ''\n let rawValue = ''\n let value = 0n\n\n const firstFormatMatch = trimmedLine.match(firstFormat)\n const secondFormatMatch = trimmedLine.match(secondFormat)\n const thirdFormatMatch = trimmedLine.match(thirdFormat)\n const fourthFormatMatch = trimmedLine.match(fourthFormat)\n const fifthFormatMatch = trimmedLine.match(fifthFormat)\n if (firstFormatMatch) {\n ;[, rawVariableName, rawValue] = firstFormatMatch as [string, string, string]\n value = getOpcodeCRC(rawValue)\n } else if (secondFormatMatch) {\n // Handle the new formats with direct hex values and flexible namespaces\n // value here is the hex value\n ;[, rawVariableName, rawValue] = secondFormatMatch as [string, string, string]\n value = BigInt(rawValue)\n } else if (thirdFormatMatch) {\n ;[, , rawVariableName, , rawValue] = thirdFormatMatch as [string, string, string, string, string]\n value = BigInt(rawValue)\n } else if (fourthFormatMatch) {\n ;[, rawVariableName, , rawValue] = fourthFormatMatch as [string, string, string, string]\n value = BigInt(rawValue)\n } else if (fifthFormatMatch) {\n ;[, rawVariableName, rawValue] = fifthFormatMatch as [string, string, string]\n value = getOpcodeCRC(rawValue)\n }\n\n if (constType !== 'opcode') {\n value = value & ERRORCODE_MASK\n }\n if (rawVariableName !== '' && rawValue !== '') {\n result.set(tonConstNameToTSName(rawVariableName), value)\n }\n }\n }\n return result\n}\n\nfunction asciiStringToBigint(str: string): bigint {\n let result = 0n\n for (let i = 0; i < str.length; i++) {\n result = (result << 8n) | BigInt(str.charCodeAt(i))\n }\n return result\n}\n\nexport function extractEvents(fileNames: string[]): Map<string, [string, bigint]> {\n const eventRegex = /^const\\s+(?:int\\s+)?([\\w:]+::[eE][vV][eE][nN][tT]::[\\w:]+)\\s*=\\s*\"([\\w:]+)\"[uc];$/\n\n const result = new Map<string, [string, bigint]>()\n for (const fileName of fileNames) {\n const fileContent = fs.readFileSync(fileName, 'utf-8')\n const lines = fileContent.split('\\n')\n for (const line of lines) {\n const trimmedLine = line.trim()\n let eventName = ''\n let eventString = ''\n const eventFormatMatch = trimmedLine.match(eventRegex)\n if (eventFormatMatch) {\n ;[, eventName, eventString] = eventFormatMatch as [string, string, string]\n result.set(tonConstNameToTSName(eventName), [eventString, asciiStringToBigint(eventString)])\n }\n }\n }\n return result\n}\n\nexport function saveEventsFile(\n events: Map<string, [string, bigint]>,\n directory: string,\n variableName: string,\n filename: string\n): void {\n const savedCode = `${file_signature_header}\nexport const ${variableName} = {\n${Array.from(events.entries())\n .map(([key, [rawValue, intValue]]) => ` ${key}: {stringValue: \"${rawValue}\", intValue: ${intValue}n},`)\n .join('\\n')}\n} as const\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function saveConstantsFile(\n constants: Map<string, bigint>,\n directory: string,\n variableName: string,\n filename: string\n): void {\n const savedCode = `${file_signature_header}\nexport const ${variableName} = {\n${Array.from(constants.entries())\n .map(([key, value]) => ` ${key}: ${value}n,`)\n .join('\\n')}\n} as const\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n\nexport function generateAllViewFunctions(\n rootDir: string,\n nameWhitelist: string[],\n blacklist: string[]\n): TonViewFunctionsDict {\n const contractDirs: string[] = []\n const viewFunctions: TonViewFunctionsDict = {}\n\n // Step 1 & 2: Iterate through subfolders and create contractDirs list\n function findContractDirs(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n\n const isAContractFolder = entries.some((entry) => !entry.isDirectory() && nameWhitelist.includes(entry.name))\n\n if (isAContractFolder && !blacklist.some((word) => dir.includes(word))) {\n contractDirs.push(dir)\n }\n\n entries.forEach((entry) => {\n if (entry.isDirectory()) {\n findContractDirs(path.join(dir, entry.name))\n }\n })\n }\n\n findContractDirs(rootDir)\n\n // Step 3: Analyze *.fc and *.func files in contractDirs\n contractDirs.forEach((dir) => {\n const files = fs.readdirSync(dir).filter((file) => file.endsWith('.fc') || file.endsWith('.func'))\n\n files.forEach((file) => {\n const filePath = path.join(dir, file)\n const contractName = snakeToCamelCase(path.basename(path.dirname(dir)) + '_' + path.basename(dir))\n const content = fs.readFileSync(filePath, 'utf-8')\n\n const functionRegex =\n /(\\((?:[^()]+,\\s*)*[^()]+\\)|[\\w:]+)\\s+(\\w+(?:::\\w+)*)\\s*\\(([\\w\\s,$·]*)\\)\\s*·?\\s*(impure)?\\s*(inline\\s*)?method_id\\s*\\{([^}]*)\\}/g\n let match\n\n while ((match = functionRegex.exec(content)) !== null) {\n const [, returnType, name, argsString, , _body] = match\n // skip the constructors\n if (name.includes('::New')) {\n continue\n }\n const tonArgs: { [key: string]: string } = {}\n const tsArgs: { [key: string]: string } = {}\n\n const argPairs = argsString.split(',').map((arg) => arg.trim())\n for (const argPair of argPairs) {\n const [argType, argName] = argPair.split(/\\s+/) as [string, string?]\n if (argName !== undefined) {\n tonArgs[argName.replace('$', '')] = argType\n tsArgs[argName.replace('$', '')] = tonTypeToTStype(argType)\n }\n }\n\n // parse the return type\n const tonReturnTypes = returnType\n .split(',')\n .map((type) => type.replace(/\\(/g, '').replace(/\\)/g, '').trim())\n const tsReturnTypes = tonReturnTypes.map((type) => tonTypeToTStype(type))\n\n if (!(contractName in viewFunctions)) {\n viewFunctions[contractName] = []\n }\n\n const fnName = snakeToCamelCase('get_' + name)\n\n const code = `\n static async ${fnName}(\n contract: ExtendedContract<TonContractWrapper>, \n ${Object.entries(tsArgs)\n .map(([argName, argType]) => `${argName}: ${argType}`)\n .join(', ')}\n ): Promise<[${tsReturnTypes.join(', ')}]> {\n const args: TupleItem[] = [\n ${Object.entries(tonArgs)\n .map(\n ([argName, argType]) =>\n `{ type: '${tonTypeToTupleType(argType)}', ${tonTypeToTupleValueName(argType)}: ${tonTypeToTupleValue(Object.keys(tonArgs).length > 0 ? argName : argName, argType)} }`\n )\n .join(',\\n ')}\n ]\n const stack = await contract.getViewFunction('${name}', args)\n return [\n ${tonReturnTypes\n .map((_, index) => `stack.${tonTypeToReadTupleFunction(tonReturnTypes[index])}`)\n .join(',\\n')}\n ]\n }\n `\n viewFunctions[contractName].push({\n name: fnName,\n args: tonArgs,\n returnType: tonReturnTypes,\n code,\n })\n }\n })\n })\n return viewFunctions\n}\n\nexport function saveViewFunctions(viewFunctions: TonViewFunctionsDict, directory: string, filename: string): void {\n const generatedFunctions = Object.entries(viewFunctions)\n .map(\n ([contractName, functions]) => `export class ${contractName} {\n ${functions.map((fn) => fn.code).join('\\n\\n')}\n }`\n )\n .join('\\n\\n')\n\n const savedCode = `${file_signature_header}\nimport { Address, Cell, Tuple, TupleItem, beginCell } from '@ton/core'\n\nimport { ExtendedContract, TonContractWrapper } from '../wrappers'\n\n${generatedFunctions}\n`\n\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n","import {\n Address,\n Builder,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n SenderArguments,\n beginCell,\n} from '@ton/core'\n\nexport interface SendRequestOptions {\n value: number | bigint | string\n bounce?: boolean\n sendMode?: SendMode\n queryId?: number | bigint\n withInit?: boolean\n}\n\nexport abstract class BaseWrapper implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint | string): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n async sendRequest(provider: ContractProvider, via: Sender, request: SenderArguments): Promise<void> {\n return provider.internal(via, {\n value: request.value,\n sendMode: request.sendMode ?? undefined,\n body: request.body,\n bounce: request.bounce,\n })\n }\n\n async getDeployed(provider: ContractProvider): Promise<boolean> {\n const state = await provider.getState()\n return state.state.type !== 'uninit'\n }\n\n buildSenderArguments(body: Cell, opts: SendRequestOptions): SenderArguments {\n return {\n value: BigInt(opts.value),\n to: this.address,\n bounce: opts.bounce ?? true,\n body,\n init: opts.withInit === true ? this.init : undefined,\n sendMode: opts.sendMode ?? SendMode.PAY_GAS_SEPARATELY,\n } satisfies SenderArguments\n }\n\n beginMessage(opcode: number | bigint, queryId?: number | bigint): Builder {\n const randomQueryId = Math.floor(Math.random() * 100000000000)\n return beginCell()\n .storeUint(opcode, 32)\n .storeUint(queryId ?? randomQueryId, 64)\n }\n}\n","import fs from 'fs'\nimport path from 'path'\n\nexport function generateTestUtilsCode(directory: string, filename: string): void {\n const savedCode = `import fs from 'fs'\n\nimport { Address, Cell, Dictionary, SendMode, TupleItemCell, TupleItemInt, beginCell, toNano } from '@ton/core'\nimport {\n Blockchain,\n BlockchainTransaction,\n SandboxContract,\n SendMessageResult,\n Treasury,\n TreasuryContract,\n} from '@ton/sandbox'\nimport { FlatTransactionComparable } from '@ton/test-utils'\n\nimport ChannelArtifact from '@layerzerolabs/layerzero-v2-ton/build/Channel.compiled.json'\nimport ControllerArtifact from '@layerzerolabs/layerzero-v2-ton/build/Controller.compiled.json'\nimport EndpointArtifact from '@layerzerolabs/layerzero-v2-ton/build/Endpoint.compiled.json'\nimport MultiSigArtifact from '@layerzerolabs/layerzero-v2-ton/src/multisig/bocs/MultiSig.compiled.json'\nimport MultiSigOrderArtifact from '@layerzerolabs/layerzero-v2-ton/src/multisig/bocs/MultiSigOrder.compiled.json'\nimport SmlConnectionArtifact from '@layerzerolabs/layerzero-v2-ton/build/SmlConnection.compiled.json'\nimport SmlManagerArtifact from '@layerzerolabs/layerzero-v2-ton/build/SmlManager.compiled.json'\nimport ZroMinterArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroMinter.compiled.json'\nimport ZroWalletArtifact from '@layerzerolabs/layerzero-v2-ton/build/ZroWallet.compiled.json'\n\nimport {\n JettonMinter,\n JettonWallet,\n MultiSigOpCodes,\n Multisig,\n Order,\n Profile,\n TransferRequest,\n addressToBigInt,\n beginMessage,\n buildOnchainMetadata,\n cellFromArtifact,\n getRandomInt,\n printTransactionTrace,\n} from '@layerzerolabs/ton-sdk-tools'\n\nimport { LzDict, LzEventHandler, MdPacketSent, OPCODES, TonContractWrapper, TonObjectUnwrapper } from '../src'\n\nconst invertedOpcodes = Object.fromEntries(Object.entries(OPCODES).map(([key, value]) => [value.toString(), key]))\nconst SML_MANAGER_DEFAULT_VERSION = BigInt(1)\nconst SML_MANAGER_CUSTOM_VERSION = BigInt(2)\nexport const zroOnchainMetaData = {\n name: 'LayerZero',\n symbol: 'ZRO',\n decimals: '9',\n}\n\n// ==============================PROTOCOL SETUP GAS==============================\n\n// todo update these to be accurate when ready. To fragile now during development\nexport const protocolSetupGas = {\n 'AllStorages.INITIALIZE': toNano('10'), // 0.149082\n 'Controller.INITIALIZE': toNano('10'), // 0.30265\n 'Controller.OP_DEPLOY_ENDPOINT': toNano('10'), // 0.176136\n 'MsgLib.INITIALIZE': toNano('10'), // 0.024\n 'Controller.OP_ADD_MSGLIB': toNano('10'), // 0.072949\n 'Controller.SET_EP_CONFIG_DEFAULTS': toNano('10'), // 0.053516\n 'Msglib.SET_MSGLIB_CONFIG': toNano('10'), // 0.023659\n}\n\n// ==========================OAPP SETUP GAS==============================\n\n// todo update these to be accurate when ready. To fragile now during development\nexport const oAppSetupGas = {\n 'OApp.INITIALIZE': toNano('10'), // 0.366814\n 'OApp.DEPLOY_CHANNEL': toNano('10'), // '0.356408'\n 'OApp.SET_PEER': toNano('10'), // 0.1701124\n}\n\n// ==========================OAPP FLOW GAS==============================\n\nexport const OAppFlowGas = {\n 'Msglib.VERIFY': toNano('10'), // 0.024811\n 'Msglib.COMMIT_PACKET': toNano('10'), // 0.128602\n 'Channel.LZ_RECEIVE_PREPARE': toNano('10'), // 0.117495\n 'Channel.LZ_RECEIVE_PREPARE_ABA': toNano('10'), // 0.342103 + 0.235917 = 0.57802\n}\n\nexport const emptyObject = beginCell().storeUint(0, 1).endCell()\n\n// ============================== INTEGRATION HELPER FUNCTIONS==============================\n\nexport function logAddresses(\n multiSigOwner1: SandboxContract<TreasuryContract>,\n multiSigOwner2: SandboxContract<TreasuryContract>,\n multiSigOwner3: SandboxContract<TreasuryContract>,\n srcFixture: OAppFixture,\n dstFixture?: OAppFixture,\n additionalLogData?: LogData, // Optional additional data\n printBigInt = false\n): void {\n const formatAddress = (address: Address, printBigInt = false): string | bigint => {\n if (printBigInt) {\n return BigInt('0x' + address.hash.toString('hex'))\n }\n return address.toString()\n }\n\n const collectAddresses: (\n prefix: string,\n protocolHeader: string,\n oappHeader: string,\n fixture: OAppFixture\n ) => {\n [p: string]: string | bigint | null\n } = function (prefix: string, protocolHeader: string, oappHeader: string, fixture: OAppFixture) {\n return {\n [\\`--- $\\{protocolHeader} ---\\`]: '', // Custom separator\n [\\`$\\{prefix}.multisig.address\\`]: formatAddress(fixture.multisig.address),\n [\\`$\\{prefix}.controller.address\\`]: formatAddress(fixture.controller.address),\n [\\`$\\{prefix}.endpoint.address\\`]: formatAddress(fixture.endpoint.address),\n [\\`$\\{prefix}.smlManagerDefault.address\\`]: formatAddress(fixture.msglibManagerDefault.address),\n [\\`$\\{prefix}.smlManagerCustom.address\\`]: formatAddress(fixture.msglibManagerCustom.address),\n [\\`--- $\\{oappHeader} ---\\`]: '', // Custom separator\n [\\`$\\{prefix}.owner.address\\`]: formatAddress(fixture.owner.address),\n [\\`$\\{prefix}.OApp.address\\`]: formatAddress(fixture.oApp.address),\n [\\`$\\{prefix}.channel.address\\`]: formatAddress(fixture.channel.address),\n [\\`$\\{prefix}.smlConnectionDefault.address\\`]: formatAddress(fixture.msglibConnectionDefault.address),\n [\\`$\\{prefix}.smlConnectionCustom.address\\`]: formatAddress(fixture.msglibConnectionCustom.address),\n }\n }\n\n // Collect log data from the deployer and fixtures\n const logData: LogData = {\n '--- Protocol Multisig Signers ---': '', // Separator\n 'multiSigOwner1.address': formatAddress(multiSigOwner1.address),\n 'multiSigOwner2.address': formatAddress(multiSigOwner2.address),\n 'multiSigOwner3.address': formatAddress(multiSigOwner3.address),\n ...collectAddresses('srcFixture', 'Source Protocol Addresses', 'Source OApp Addresses', srcFixture),\n ...(dstFixture ? collectAddresses('dstFixture', 'Destination Protocol Addresses', 'Destination OApp Addresses', dstFixture) : {}),\n }\n\n // Format addresses in additionalLogData if printBigInt is enabled\n const formattedAdditionalLogData = additionalLogData\n ? Object.fromEntries(\n Object.entries(additionalLogData).map(([key, value]) => [\n key,\n Address.isAddress(value) ? formatAddress(value) : value,\n ])\n )\n : {}\n\n // Merge all log data and print\n const combinedLogData = { ...logData, ...formattedAdditionalLogData }\n console.log(combinedLogData)\n}\n\nexport function setToOneAndRemoveLeadingOnes(arr: number[], index: number): bigint {\n if (index >= 0 && index < arr.length) {\n arr[index] = 1\n\n let count = BigInt(0)\n while (arr[0] === 1) {\n count++\n arr.shift() // Remove the first element (leading 1)\n arr.push(0) // Add a 0 at the end to maintain array length\n }\n return count\n } else {\n console.error('Index out of bounds')\n return 0n\n }\n}\n\nexport function randomizeNonces(firstUncommittedNonceBefore: bigint, firstUncommittedNonce: bigint): bigint[] {\n const nonces: bigint[] = []\n for (let nonce = firstUncommittedNonceBefore; nonce < firstUncommittedNonce; nonce++) {\n nonces.push(nonce)\n }\n\n // Shuffle the array (Fisher-Yates shuffle algorithm)\n for (let i = nonces.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[nonces[i], nonces[j]] = [nonces[j], nonces[i]] // Swap elements\n }\n\n return nonces\n}\n\nexport async function createLzPacketFromPacketEncoded(\n encodedPacket: Cell,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('BytesDecoder::decode<PacketV1>', [{ type: 'cell', cell: encodedPacket }])\n ).pop() as TupleItemCell\n ).cell\n}\n\nexport async function createLzPacketFromPacketEncodedOverrideNonce(\n encodedPacket: Cell,\n newNonce: bigint,\n allStorages: SandboxContract<TonContractWrapper>\n): Promise<Cell> {\n return (\n (\n await allStorages.getViewFunction('BytesDecoder::decodeAndOverrideNonce<PacketV1>', [\n { type: 'cell', cell: encodedPacket },\n { type: 'int', value: newNonce },\n ])\n ).pop() as TupleItemCell\n ).cell\n}\n\n// ===============================INTERFACES===============================\n\nexport interface LogData {\n [key: string]: string | bigint\n}\n\nexport interface SendInternalMessageAndExpectArgs {\n sender: Treasury\n contract: SandboxContract<TonContractWrapper>\n expectedTransactions: FlatTransactionComparable[]\n opCode: bigint\n md: Cell\n value: bigint\n balanceRefill?: bigint\n queryId?: bigint\n profile?: Profile\n}\n\ninterface sendMessageViaMultisigAndExpectArgs {\n blockchain: Blockchain\n multiSigContract: SandboxContract<Multisig>\n messageBody: Cell\n signers: SandboxContract<TreasuryContract>[]\n targetContract: SandboxContract<TonContractWrapper | JettonMinter>\n deploy: boolean\n expectedTransactions: FlatTransactionComparable[]\n}\n\nexport interface OutOfOrder {\n actions: Action[]\n}\n\nexport interface Action {\n actionType: string\n fromEid: bigint\n toEid: bigint\n}\n\nexport interface ProtocolFixture {\n multisig: SandboxContract<Multisig>\n eid: bigint\n controller: SandboxContract<TonContractWrapper>\n endpoint: SandboxContract<TonContractWrapper>\n msglibManagerDefault: SandboxContract<TonContractWrapper>\n msglibManagerCustom: SandboxContract<TonContractWrapper>\n}\n\nexport interface OAppFixture extends ProtocolFixture {\n owner: SandboxContract<TreasuryContract>\n oApp: SandboxContract<TonContractWrapper>\n path: Cell\n channel: SandboxContract<TonContractWrapper>\n msglibConnectionDefault: SandboxContract<TonContractWrapper>\n msglibConnectionCustom: SandboxContract<TonContractWrapper>\n}\n\nexport const ActionTypes: { [key: string]: bigint } = {\n increment: BigInt(1),\n aba: BigInt(2),\n}\n\nexport interface PacketsInFlight {\n fromEid: bigint\n toEid: bigint\n nonce: bigint\n lzPacket: Cell\n}\n\nexport interface SendOptions {\n dstEid: bigint\n incrementType: bigint\n extraOptions: Cell\n nativeFee: bigint\n zroFee: bigint\n}\n\n// ==============================INTEGRATION HELPER FUNCTIONS==============================\n\n// subtract percent from value\nexport function getOutOfGasValue(value: string, percent: number): bigint {\n const num = parseFloat(value)\n return toNano(num - num * percent)\n}\n\nexport function readJsonFile(filePath: string): any {\n // Check if the file exists\n if (!fs.existsSync(filePath)) {\n throw new Error(\\`File does not exist: $\\{filePath}\\`)\n }\n\n // Read the file content as a string\n const fileContent = fs.readFileSync(filePath, 'utf8')\n\n try {\n // Parse the string into a JSON object\n return JSON.parse(fileContent)\n } catch (error) {\n throw new Error(\\`Error parsing JSON from file: $\\{filePath}\\`)\n }\n}\n\nexport async function buildNonceMd(nonce: bigint, allStorages: SandboxContract<TonContractWrapper>): Promise<Cell> {\n return allStorages.getObject('md::Nonce::New', [{ type: 'int', value: nonce }])\n}\n\nexport async function buildLzReceivePrepareMd(nonce: bigint, nanotons: bigint, allStorages: SandboxContract<TonContractWrapper>): Promise<Cell> {\n return allStorages.getObject('md::LzReceivePrepare::New', [{ type: 'int', value: nonce }, { type: 'int', value: nanotons }])\n}\n\nexport function buildMessageBody(donationNanos: number, origin: Address, opcode: number, md: Cell): Cell {\n return beginMessage(opcode)\n .storeUint(donationNanos, 64)\n .storeUint(addressToBigInt(origin), 256)\n .storeRef(md)\n .endCell()\n}\n\nexport async function sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody,\n signers,\n targetContract,\n deploy,\n expectedTransactions = [],\n}: sendMessageViaMultisigAndExpectArgs): Promise<SendMessageResult> {\n const curTime = (): number => blockchain.now ?? Math.floor(Date.now() / 1000)\n\n const initialSeqno = (await multiSigContract.getMultisigData()).nextOrderSeqno\n const orderAddress = await multiSigContract.getOrderAddress(initialSeqno)\n\n const rawMessageBuilder = beginCell().storeUint(0x18, 6).storeAddress(targetContract.address).storeCoins(0)\n\n let rawMessageCell: Cell\n\n if (deploy) {\n const targetContractStateInit = beginCell()\n .storeUint(6, 5)\n .storeRef(targetContract.init!.code)\n .storeRef(targetContract.init!.data)\n .endCell()\n\n rawMessageCell = rawMessageBuilder\n .storeUint(7, 108)\n .storeRef(targetContractStateInit)\n .storeRef(messageBody)\n .endCell()\n } else {\n rawMessageCell = rawMessageBuilder.storeUint(1, 107).storeRef(messageBody).endCell()\n }\n\n const orderMsg: TransferRequest = {\n type: 'transfer',\n sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE,\n message: rawMessageCell,\n }\n\n // one of the signers proposes deploying the controller\n let internalMsgResults = await multiSigContract.sendNewOrder(signers[0].getSender(), [orderMsg], curTime() + 100)\n\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: orderAddress,\n deploy: true,\n success: true,\n })\n\n const orderContract = blockchain.openContract(Order.createFromAddress(orderAddress))\n const orderDataBefore = await orderContract.getOrderData()\n\n // proposal by a signer is considered automatically approved\n expect(orderDataBefore.approvals_num).toBe(1)\n expect(orderDataBefore.executed).toBe(false)\n\n // approve it by the other 2 signers\n internalMsgResults = await orderContract.sendApprove(signers[1].getSender(), 1)\n internalMsgResults = await orderContract.sendApprove(signers[2].getSender(), 2)\n\n // the order should send tell the multisig to execute the order\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: orderAddress,\n to: multiSigContract.address,\n op: MultiSigOpCodes.multisig.execute,\n success: true,\n })\n\n // the multisig should deliver the message to the target contract\n expect(internalMsgResults.transactions).toHaveTransaction({\n from: multiSigContract.address,\n to: targetContract.address,\n // deploy,\n success: true,\n })\n\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n\n return internalMsgResults\n}\n\nexport async function sendInternalMessageAndExpect({\n sender,\n contract,\n opCode,\n md,\n expectedTransactions,\n value,\n balanceRefill = BigInt(0),\n queryId = BigInt(1),\n profile,\n}: SendInternalMessageAndExpectArgs): Promise<SendMessageResult> {\n const internalMsgResults = await contract.sendInternalMessage(sender, opCode, md, { value }, balanceRefill, queryId)\n\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n if (profile?.profileGas ?? false) {\n const { stack } = new Error()\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n printTransactionTrace(internalMsgResults.transactions, invertedOpcodes, stack, profile)\n }\n toHaveTransactions(internalMsgResults.transactions, expectedTransactions)\n return internalMsgResults\n}\n\nexport function toHaveTransactions(\n actualTransactions: BlockchainTransaction[],\n expectedTransactions: FlatTransactionComparable[]\n): void {\n expectedTransactions.forEach((tx) => {\n expect(actualTransactions).toHaveTransaction(tx)\n })\n}\n\nasync function checkZroDeploymentStatus(\n toZroWallet: SandboxContract<JettonWallet>\n): Promise<{ deployFlag: boolean; initialZroBalance: bigint }> {\n let deployFlag = false\n let initialZroBalance = 0n\n\n try {\n initialZroBalance = await toZroWallet.getBalance()\n } catch (e) {\n deployFlag = true\n }\n\n return { deployFlag, initialZroBalance }\n}\n\nexport async function mintZro(\n zroOwner: SandboxContract<TreasuryContract>,\n zroMinter: SandboxContract<JettonMinter>,\n toAddress: Address,\n toZroWallet: SandboxContract<JettonWallet>,\n zroAmount: bigint,\n tonAmount: bigint,\n fwdTonAmount: bigint\n): Promise<void> {\n const initialTotalSupply = await zroMinter.getTotalSupply()\n const { deployFlag, initialZroBalance } = await checkZroDeploymentStatus(toZroWallet)\n const mintResult = await zroMinter.sendMint(zroOwner.getSender(), toAddress, zroAmount, tonAmount, fwdTonAmount)\n toHaveTransactions(mintResult.transactions, [\n {\n from: zroOwner.address,\n to: zroMinter.address,\n success: true,\n op: Number(OPCODES.op_mint), // int op::mint() asm \"21 PUSHINT\";\n },\n {\n from: zroMinter.address,\n to: toZroWallet.address,\n op: Number(OPCODES.op_internal_transfer), // op::internal_transfer = 0x178d4519\n success: true,\n deploy: deployFlag,\n },\n {\n from: toZroWallet.address,\n to: toAddress,\n op: Number(OPCODES.op_transfer_notification), // OP_TRANSFER_NOTIFICATION = 0x7362d09c\n success: true,\n },\n {\n from: toZroWallet.address,\n to: zroMinter.address,\n op: Number(OPCODES.op_excesses_copy), // op::excesses = 0xd53276db;\n success: false, // this is suppose to fail because minter contract cant handle excess op code\n },\n ])\n expect(await toZroWallet.getBalance()).toEqual(initialZroBalance + zroAmount)\n expect(await zroMinter.getTotalSupply()).toEqual(initialTotalSupply + zroAmount)\n}\n\nexport async function mintZroViaMultisig(\n blockchain: Blockchain,\n multiSigContract: SandboxContract<Multisig>,\n zroMinter: SandboxContract<JettonMinter>,\n toAddress: Address,\n toZroWallet: SandboxContract<JettonWallet>,\n zroAmount: bigint,\n tonAmount: bigint,\n fwdTonAmount: bigint,\n signers: SandboxContract<TreasuryContract>[]\n): Promise<void> {\n const initialTotalSupply = await zroMinter.getTotalSupply()\n const { deployFlag, initialZroBalance } = await checkZroDeploymentStatus(toZroWallet)\n\n const mintResult = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: JettonMinter.mintMessage(\n zroMinter.address,\n toAddress,\n zroAmount,\n tonAmount + toNano('0.015'),\n fwdTonAmount\n ),\n signers,\n targetContract: zroMinter,\n deploy: deployFlag,\n expectedTransactions: [],\n })\n\n toHaveTransactions(mintResult.transactions, [\n {\n from: multiSigContract.address,\n to: zroMinter.address,\n success: true,\n op: Number(OPCODES.op_mint), // int op::mint() asm \"21 PUSHINT\";\n },\n {\n from: zroMinter.address,\n to: toZroWallet.address,\n op: Number(OPCODES.op_internal_transfer), // op::internal_transfer = 0x178d4519\n success: true,\n deploy: deployFlag,\n },\n {\n from: toZroWallet.address,\n to: toAddress,\n op: Number(OPCODES.op_transfer_notification), // OP_TRANSFER_NOTIFICATION = 0x7362d09c\n success: true,\n },\n {\n from: toZroWallet.address,\n to: zroMinter.address,\n op: Number(OPCODES.op_excesses_copy), // op::excesses = 0xd53276db;\n success: false, // this is suppose to fail because minter contract cant handle excess op code\n },\n ])\n expect(await toZroWallet.getBalance()).toEqual(initialZroBalance + zroAmount)\n expect(await zroMinter.getTotalSupply()).toEqual(initialTotalSupply + zroAmount)\n}\n\nexport async function depositZro(\n from: SandboxContract<TreasuryContract>,\n fromZroWallet: SandboxContract<JettonWallet>,\n multsig: SandboxContract<Multisig>,\n multsigZroWallet: SandboxContract<JettonWallet>,\n controller: SandboxContract<TonContractWrapper>,\n channel: SandboxContract<TonContractWrapper>,\n path: Cell,\n zroAmount: bigint,\n tonAmount: bigint,\n fwdTonAmount: bigint\n): Promise<void> {\n const { deployFlag, initialZroBalance } = await checkZroDeploymentStatus(multsigZroWallet)\n const transferResult = await fromZroWallet.sendTransfer(\n from.getSender(),\n tonAmount,\n zroAmount,\n multsig.address,\n controller.address,\n beginCell().endCell(),\n fwdTonAmount,\n path\n )\n toHaveTransactions(transferResult.transactions, [\n {\n from: from.address,\n to: fromZroWallet.address,\n success: true,\n op: Number(OPCODES.op_transfer), // TRANSFER: 0xf8a7ea5\n },\n {\n from: fromZroWallet.address,\n to: multsigZroWallet.address,\n op: Number(OPCODES.op_internal_transfer), // op::internal_transfer = 0x178d4519\n success: true,\n deploy: deployFlag,\n },\n {\n from: multsigZroWallet.address,\n to: multsig.address,\n op: Number(OPCODES.op_transfer_notification), // OP_TRANSFER_NOTIFICATION = 0x7362d09c\n success: true,\n },\n {\n from: multsigZroWallet.address,\n to: controller.address,\n op: Number(OPCODES.op_excesses_copy), // op::excesses = 0xd53276db;\n success: true,\n },\n {\n from: controller.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_DEPOSIT_ZRO),\n success: true,\n },\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT), // Channel::event::ZRO_DEPOSITED\n success: false, // events are supposed to fail\n },\n ])\n expect(await multsigZroWallet.getBalance()).toEqual(initialZroBalance + zroAmount)\n}\n\nexport async function commitVerificationAndExpect(\n lzPacketCell: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n {\n endpoint,\n channel,\n msglibManagerDefault: smlManager,\n msglibConnectionDefault: smlConnection,\n controller,\n }: OAppFixture,\n profile?: Profile\n): Promise<void> {\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Msglib.COMMIT_PACKET'],\n sender: deployer.getSender(),\n contract: smlManager,\n opCode: OPCODES.SmlManager_OP_SML_MANAGER_COMMIT_PACKET,\n md: await smlManager.getNewMdMdAddress({\n md: lzPacketCell,\n address: addressToBigInt(endpoint.address),\n }),\n expectedTransactions: [\n {\n from: deployer.address,\n to: smlManager.address,\n op: Number(OPCODES.SmlManager_OP_SML_MANAGER_COMMIT_PACKET),\n success: true,\n },\n {\n from: smlManager.address,\n to: smlConnection.address,\n op: Number(OPCODES.SmlConnection_OP_SML_CONNECTION_COMMIT_PACKET),\n success: true,\n },\n {\n from: smlConnection.address,\n to: endpoint.address,\n op: Number(OPCODES.Endpoint_OP_ENDPOINT_COMMIT_PACKET),\n success: true,\n },\n {\n from: endpoint.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_CHANNEL_COMMIT_PACKET),\n success: true,\n },\n // emit event channel::EVENT::MESSAGE_COMMITTED\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n {\n from: channel.address,\n to: smlConnection.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_COMMIT_PACKET_CALLBACK),\n success: true,\n },\n {\n from: smlConnection.address,\n to: smlManager.address,\n op: Number(OPCODES.SmlManager_OP_SML_MANAGER_COMMIT_PACKET_CALLBACK),\n success: true,\n },\n // refund excess ton\n {\n from: smlManager.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, smlManager)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\nexport async function lzReceiveAndExpect(\n nonceMd: Cell,\n deployer: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler,\n { oApp, channel, controller }: OAppFixture,\n profile?: Profile\n): Promise<void> {\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Channel.LZ_RECEIVE_PREPARE'],\n sender: deployer.getSender(),\n contract: channel,\n opCode: OPCODES.Channel_OP_LZ_RECEIVE_PREPARE,\n md: nonceMd,\n expectedTransactions: [\n {\n from: deployer.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_LOCK),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_EXECUTE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_EXECUTE_CALLBACK),\n success: true,\n },\n // emit event channel::EVENT::PACKET_DELIVERED\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n // refund excess ton\n {\n from: channel.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, channel)\n // expect last event to be packet delivered\n expect(eventHandler.allVictories.eventObjects[eventHandler.allVictories.eventObjects.length - 1].topic).toBe(\n 'Channel::event::DELIVERED'\n )\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\nexport async function lzReceiveAbaAndExpect(\n nonceMd: Cell,\n oApp: SandboxContract<TonContractWrapper>,\n deployer: SandboxContract<TreasuryContract>,\n channel: SandboxContract<TonContractWrapper>,\n controller: SandboxContract<TonContractWrapper>,\n endpoint: SandboxContract<TonContractWrapper>,\n smlManager: SandboxContract<TonContractWrapper>,\n smlConnection: SandboxContract<TonContractWrapper>,\n eventHandler: LzEventHandler,\n profile?: Profile\n): Promise<MdPacketSent> {\n const internalMsgResults: SendMessageResult = await sendInternalMessageAndExpect({\n profile,\n value: OAppFlowGas['Channel.LZ_RECEIVE_PREPARE_ABA'],\n sender: deployer.getSender(),\n contract: channel,\n opCode: OPCODES.Channel_OP_LZ_RECEIVE_PREPARE,\n md: nonceMd,\n expectedTransactions: [\n {\n from: deployer.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_PREPARE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_LOCK),\n success: true,\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_LZ_RECEIVE_EXECUTE),\n success: true,\n },\n {\n from: oApp.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_LZ_RECEIVE_EXECUTE_CALLBACK),\n success: true,\n },\n // emit event channel::EVENT::PACKET_DELIVERED\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n // // refund excess ton\n {\n from: oApp.address,\n to: channel.address,\n success: true,\n },\n {\n from: oApp.address,\n to: endpoint.address,\n op: Number(OPCODES.Endpoint_OP_ENDPOINT_SEND),\n success: true,\n },\n {\n from: endpoint.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_CHANNEL_SEND),\n success: true,\n },\n {\n from: channel.address,\n to: smlConnection.address,\n op: Number(OPCODES.MsglibConnection_OP_MSGLIB_CONNECTION_SEND),\n success: true,\n },\n {\n from: smlConnection.address,\n to: smlManager.address,\n op: Number(OPCODES.SmlManager_OP_SML_MANAGER_SEND),\n success: true,\n },\n {\n from: smlManager.address,\n to: channel.address,\n op: Number(OPCODES.Channel_OP_MSGLIB_SEND_CALLBACK),\n success: true,\n },\n // emit event channel::event::SEND_SUCCESS\n {\n from: channel.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n {\n from: channel.address,\n to: oApp.address,\n op: Number(OPCODES.Layerzero_OP_CHANNEL_SEND_CALLBACK),\n success: true,\n },\n // refund excess ton\n {\n from: oApp.address,\n to: deployer.address,\n success: true,\n },\n ],\n })\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, channel)\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n // expect two packet sents (A->B) and (B->A)\n expect(eventHandler.allVictories.packetsSent.length).toBe(2)\n // return the most recent packet sent\n return eventHandler.allVictories.packetsSent[eventHandler.allVictories.packetsSent.length - 1]\n}\n\n// ===============================HELPER ASSERTS===============================\n\nexport async function assertFirstUncommitedNonce(\n channel: SandboxContract<TonContractWrapper>,\n expectedValue: bigint\n): Promise<void> {\n const firstUncommittedNonce = (await channel.getViewFunction('_viewInboundNonce', [])).pop() as TupleItemInt\n expect(firstUncommittedNonce.value).toEqual(expectedValue - BigInt(1)) // _viewInboundNonce subtracts 1 from actual value\n}\n\nexport async function assertZroBalance(\n channel: SandboxContract<TonContractWrapper>,\n expectedValue: bigint\n): Promise<void> {\n const channelTS = await TonObjectUnwrapper.getChannelToTS(channel, await channel.getCurrentStorageCell())\n expect(channelTS.zroBalance).toEqual(expectedValue)\n}\n\nexport async function getFromDict(\n dict: LzDict,\n key: bigint,\n contract: SandboxContract<TonContractWrapper>,\n is_bigint: boolean\n): Promise<number | bigint> {\n let value: bigint | number = -1\n try {\n if (is_bigint) {\n value = (await dict.get(key, contract)).beginParse().loadUintBig(256)\n } else {\n value = (await dict.get(key, contract)).beginParse().loadUint(256)\n }\n } catch (error: any) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n if (error.toString() == 'Error: Not a cell: null') {\n return 0\n } else {\n throw error\n }\n }\n return value\n}\n\nexport async function getZroWallet(\n blockchain: Blockchain,\n ownerAddress: Address,\n toAddress: Address\n): Promise<SandboxContract<JettonWallet>> {\n const zroMinter: SandboxContract<JettonMinter> = blockchain.openContract(\n JettonMinter.createFromConfig(\n {\n admin: ownerAddress,\n content: buildOnchainMetadata(zroOnchainMetaData),\n wallet_code: cellFromArtifact(ZroWalletArtifact),\n },\n cellFromArtifact(ZroMinterArtifact)\n )\n )\n\n return blockchain.openContract(JettonWallet.createFromAddress(await zroMinter.getWalletAddress(toAddress)))\n}\n\nexport function addLibToBlockchain(blockchain: Blockchain, newLib: Cell): void {\n let libsDict: Dictionary<bigint, Cell>\n if (blockchain.libs) {\n libsDict = blockchain.libs.beginParse().loadDictDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n } else {\n libsDict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n }\n libsDict.set(BigInt(\\`0x\\${newLib.hash().toString('hex')}\\`), newLib)\n blockchain.libs = beginCell().storeDictDirect(libsDict).endCell()\n}\n\nexport async function openAndDeployControllerViaMultiSig(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigContract: SandboxContract<Multisig>,\n multiSigners: SandboxContract<TreasuryContract>[],\n eid: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const controller: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ControllerArtifact),\n await allStorages.getNewController({\n owner: addressToBigInt(multiSigContract.address),\n eid,\n endpointCode: cellFromArtifact(EndpointArtifact),\n channelCode: cellFromArtifact(ChannelArtifact),\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: controller.buildRequest(\n OPCODES.BaseInterface_OP_INITIALIZE,\n emptyObject,\n { value: protocolSetupGas['Controller.INITIALIZE'] },\n toNano('1')\n ).body!,\n signers: multiSigners,\n targetContract: controller,\n deploy: true,\n expectedTransactions: [\n {\n from: multiSigContract.address,\n to: controller.address,\n success: true,\n },\n ],\n })\n\n return [controller, internalMsgResults]\n}\n\nexport async function setControllerZroWalletViaMultisig(\n blockchain: Blockchain,\n multiSigContract: SandboxContract<Multisig>,\n controller: SandboxContract<TonContractWrapper>,\n zroMinter: SandboxContract<JettonMinter>,\n multiSigners: SandboxContract<TreasuryContract>[]\n): Promise<SendMessageResult> {\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: controller.buildRequest(\n OPCODES.Controller_OP_SET_ZRO_WALLET,\n await controller.getNewMdSetAddress({\n address: addressToBigInt(await zroMinter.getWalletAddress(multiSigContract.address)),\n }),\n { value: toNano('1') },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: controller,\n deploy: false,\n expectedTransactions: [\n {\n from: multiSigContract.address,\n to: controller.address,\n op: Number(OPCODES.Controller_OP_SET_ZRO_WALLET),\n success: true,\n },\n // emit event Controller::EVENT::ZRO_WALLET_SET\n {\n from: controller.address,\n to: controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ],\n })\n}\n\nexport async function openAndDeployEndpoint(\n blockchain: Blockchain,\n multiSigContract: SandboxContract<Multisig>,\n multiSigners: SandboxContract<TreasuryContract>[],\n controller: SandboxContract<TonContractWrapper>,\n srcEid: bigint,\n dstEid: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const endpoint: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(EndpointArtifact),\n await controller.getNewEndpoint({\n eid: srcEid,\n dstEid: dstEid,\n owner: addressToBigInt(controller.address),\n })\n )\n )\n\n const internalMsgResults = await sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract,\n messageBody: controller.buildRequest(\n OPCODES.Controller_OP_DEPLOY_ENDPOINT,\n await controller.getNewMdDeploy({\n dstEid: dstEid,\n initialDeposit: toNano('1.0'),\n dstOApp: BigInt(0), // the dstOApp is unused inside of the endpoint deploy call\n }),\n { value: protocolSetupGas['Controller.OP_DEPLOY_ENDPOINT'] },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: controller,\n deploy: true,\n expectedTransactions: [\n {\n from: multiSigContract.address,\n to: controller.address,\n op: Number(OPCODES.Controller_OP_DEPLOY_ENDPOINT),\n success: true,\n },\n {\n from: controller.address,\n to: endpoint.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [endpoint, internalMsgResults]\n}\n\nexport async function openAndDeployChannel(\n blockchain: Blockchain,\n deployer: SandboxContract<TreasuryContract>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const channel: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(ChannelArtifact),\n await srcFixture.controller.getNewChannel({\n owner: addressToBigInt(srcFixture.controller.address),\n path: srcFixture.path,\n endpointAddress: addressToBigInt(srcFixture.endpoint.address),\n })\n )\n )\n\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: oAppSetupGas['OApp.DEPLOY_CHANNEL'],\n sender: deployer.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_DeployChannel,\n md: await srcFixture.controller.getNewMdDeploy({\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n initialDeposit: toNano('1'),\n }),\n expectedTransactions: [\n {\n from: deployer.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_DeployChannel),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.Controller_OP_DEPLOY_CHANNEL),\n success: true,\n },\n {\n from: srcFixture.controller.address,\n to: channel.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [channel, internalMsgResults]\n}\n\nexport async function openAndDeploySmlManager(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n fixture: OAppFixture,\n version: bigint\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const smlManager: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(SmlManagerArtifact),\n await allStorages.getNewSmlManager({\n owner: addressToBigInt(fixture.owner.address),\n eid: fixture.eid,\n version,\n controllerAddress: addressToBigInt(fixture.controller.address),\n endpointCode: cellFromArtifact(EndpointArtifact),\n channelCode: cellFromArtifact(ChannelArtifact),\n smlConnectionCode: cellFromArtifact(SmlConnectionArtifact),\n })\n )\n )\n\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: protocolSetupGas['MsgLib.INITIALIZE'],\n sender: fixture.owner.getSender(),\n contract: smlManager,\n expectedTransactions: [\n {\n from: fixture.owner.address,\n to: smlManager.address,\n success: true,\n },\n ],\n opCode: OPCODES.BaseInterface_OP_INITIALIZE,\n md: emptyObject,\n balanceRefill: toNano('1'),\n })\n\n return [smlManager, internalMsgResults]\n}\n\nexport async function openAndDeploySmlConnection(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n smlManager: SandboxContract<TonContractWrapper>\n): Promise<[SandboxContract<TonContractWrapper>, SendMessageResult]> {\n const smlConnection: SandboxContract<TonContractWrapper> = blockchain.openContract(\n TonContractWrapper.create(\n cellFromArtifact(SmlConnectionArtifact),\n await allStorages.getNewSmlConnection({\n owner: addressToBigInt(smlManager.address),\n path: srcFixture.path,\n })\n )\n )\n\n const internalMsgResults = await sendInternalMessageAndExpect({\n value: toNano('10'),\n sender: srcFixture.owner.getSender(),\n contract: srcFixture.oApp,\n opCode: OPCODES.OP_DeployConnection,\n md: await allStorages.getNewMdMdAddress({\n md: await allStorages.getNewMdDeploy({\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n initialDeposit: toNano('1'),\n }),\n address: addressToBigInt(smlManager.address),\n }),\n expectedTransactions: [\n {\n from: srcFixture.owner.address,\n to: srcFixture.oApp.address,\n op: Number(OPCODES.OP_DeployConnection),\n success: true,\n },\n {\n from: srcFixture.oApp.address,\n to: smlManager.address,\n op: Number(OPCODES.MsglibManager_OP_DEPLOY_CONNECTION),\n success: true,\n },\n {\n from: smlManager.address,\n to: smlConnection.address,\n op: Number(OPCODES.BaseInterface_OP_INITIALIZE),\n deploy: true,\n success: true,\n },\n ],\n })\n\n return [smlConnection, internalMsgResults]\n}\n\nexport async function setDefaultEndpointConfig(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n sendMsglibManager: SandboxContract<TonContractWrapper>,\n receiveMsglibManager: SandboxContract<TonContractWrapper>,\n srcFixture: ProtocolFixture,\n dstFixture: ProtocolFixture\n): Promise<SendMessageResult> {\n const set_ep_config_md = await allStorages.getNewMdSetEpConfig({\n useDefaults: BigInt(-1), // true\n sendMsglibManager: addressToBigInt(sendMsglibManager.address),\n receiveMsglibManager: addressToBigInt(receiveMsglibManager.address),\n timeoutReceiveMsglibManager: BigInt(0),\n timeoutReceiveMsglibExpiry: BigInt(0),\n })\n\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.Controller_OP_SET_EP_CONFIG_DEFAULTS,\n await srcFixture.controller.getNewMdMdEid({\n md: set_ep_config_md,\n eid: dstFixture.eid,\n }),\n { value: protocolSetupGas['Controller.SET_EP_CONFIG_DEFAULTS'] },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.controller,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.Controller_OP_SET_EP_CONFIG_DEFAULTS),\n success: true,\n },\n {\n from: srcFixture.controller.address,\n to: srcFixture.endpoint.address,\n op: Number(OPCODES.Endpoint_OP_SET_EP_CONFIG_DEFAULTS),\n success: true,\n },\n // emit event Endpoint::event::EP_CONFIG_DEFAULTS_SET\n {\n from: srcFixture.endpoint.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.BaseInterface_OP_EVENT),\n success: false, // events are supposed to fail\n },\n ],\n })\n}\n\nexport async function addMsgLibToController(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: ProtocolFixture,\n dstFixture: ProtocolFixture,\n msglibManager: SandboxContract<TonContractWrapper>\n): Promise<SendMessageResult> {\n return sendMessageViaMultisigAndExpect({\n blockchain,\n multiSigContract: srcFixture.multisig,\n messageBody: srcFixture.controller.buildRequest(\n OPCODES.Controller_OP_ADD_MSGLIB,\n await srcFixture.controller.getNewMdAddMsglib({\n msglibManagerAddress: addressToBigInt(msglibManager.address),\n dstEid: dstFixture.eid,\n }),\n { value: protocolSetupGas['Controller.OP_ADD_MSGLIB'] },\n toNano('0.1')\n ).body!,\n signers: multiSigners,\n targetContract: srcFixture.controller,\n deploy: false,\n expectedTransactions: [\n {\n from: srcFixture.multisig.address,\n to: srcFixture.controller.address,\n op: Number(OPCODES.Controller_OP_ADD_MSGLIB),\n success: true,\n },\n {\n from: srcFixture.controller.address,\n to: srcFixture.endpoint.address,\n op: Number(OPCODES.Endpoint_OP_ADD_MSGLIB),\n success: true,\n },\n {\n from: srcFixture.endpoint.address,\n to: msglibManager.address,\n op: Number(OPCODES.MsglibManager_OP_GET_MSGLIB_INFO),\n success: true,\n },\n {\n from: msglibManager.address,\n to: srcFixture.endpoint.address,\n op: Number(OPCODES.Endpoint_OP_GET_MSGLIB_INFO_CALLBACK),\n success: true,\n },\n ],\n })\n}\n\n// ===============================SETUP FIXTURE===============================\n\nexport async function setupFixture(\n srcEid: bigint,\n dstEid: bigint,\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigOwner1: SandboxContract<TreasuryContract>,\n multiSigOwner2: SandboxContract<TreasuryContract>,\n multiSigOwner3: SandboxContract<TreasuryContract>,\n eventHandler: LzEventHandler\n): Promise<Partial<ProtocolFixture>> {\n let internalMsgResults: SendMessageResult\n\n // =============================set up 3/3 multi-sig as the controller owner================================\n\n addLibToBlockchain(blockchain, cellFromArtifact(MultiSigOrderArtifact))\n\n const multiSigners = [multiSigOwner1, multiSigOwner2, multiSigOwner3]\n const proposers = await blockchain.createWallets(getRandomInt(10, 20))\n\n const multiSigConfig = {\n threshold: multiSigners.length,\n signers: multiSigners.map((s) => s.address),\n proposers: proposers.map((s) => s.address),\n allowArbitrarySeqno: false,\n }\n\n const multiSigContract = blockchain.openContract(\n Multisig.createFromConfig(multiSigConfig, cellFromArtifact(MultiSigArtifact))\n )\n\n // deploy the multisig contract\n internalMsgResults = await multiSigContract.sendDeploy(multiSigners[0].getSender(), toNano('1'))\n expect(internalMsgResults.transactions).toHaveTransaction({\n to: multiSigContract.address,\n deploy: true,\n success: true,\n })\n\n // ===================================open and deploy local controller=====================================\n\n let controller: SandboxContract<TonContractWrapper>\n // eslint-disable-next-line prefer-const\n ;[controller, internalMsgResults] = await openAndDeployControllerViaMultiSig(\n blockchain,\n allStorages,\n multiSigContract,\n multiSigners,\n srcEid\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controller)\n\n // ===================================open and deploy remote controlle via multisig=====================================\n\n let controllerRemote: SandboxContract<TonContractWrapper>\n // eslint-disable-next-line prefer-const\n ;[controllerRemote, internalMsgResults] = await openAndDeployControllerViaMultiSig(\n blockchain,\n allStorages,\n multiSigContract,\n multiSigners,\n dstEid\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controllerRemote)\n\n // ===================================open and deploy zro minter=====================================\n\n const zroMinter: SandboxContract<JettonMinter> = blockchain.openContract(\n JettonMinter.createFromConfig(\n {\n admin: multiSigOwner1.address,\n content: buildOnchainMetadata(zroOnchainMetaData),\n wallet_code: cellFromArtifact(ZroWalletArtifact),\n },\n cellFromArtifact(ZroMinterArtifact)\n )\n )\n\n await zroMinter.sendDeploy(multiSigOwner1.getSender(), toNano('100'))\n\n // =========================function to get someone's zro wallet=============================\n\n const getZroWalletAddress = async (address: Address): Promise<SandboxContract<JettonWallet>> => {\n return blockchain.openContract(JettonWallet.createFromAddress(await zroMinter.getWalletAddress(address)))\n }\n\n // =============================mint zro to multiSigOwner1================================\n\n const zroAmount = toNano('1000')\n const tonAmount = toNano('0.05')\n const fwdTonAmount = toNano('0.1')\n await mintZro(\n multiSigOwner1,\n zroMinter,\n multiSigOwner1.address,\n await getZroWalletAddress(multiSigOwner1.address),\n zroAmount,\n tonAmount,\n fwdTonAmount\n )\n\n // ===================================set zro wallet on source controller=====================================\n\n internalMsgResults = await setControllerZroWalletViaMultisig(\n blockchain,\n multiSigContract,\n controller,\n zroMinter,\n multiSigners\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controller)\n\n // ===================================set zro wallet on destination controller=====================================\n\n internalMsgResults = await setControllerZroWalletViaMultisig(\n blockchain,\n multiSigContract,\n controllerRemote,\n zroMinter,\n multiSigners\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controllerRemote)\n\n // ===================================open and deploy endpoint via multisig=====================================\n\n let endpoint: SandboxContract<TonContractWrapper>\n // eslint-disable-next-line prefer-const\n ;[endpoint, internalMsgResults] = await openAndDeployEndpoint(\n blockchain,\n multiSigContract,\n multiSigners,\n controller,\n srcEid,\n dstEid\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, controller)\n\n // =============================expect no failures================================\n\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n\n return {\n multisig: multiSigContract,\n eid: srcEid,\n endpoint,\n controller,\n }\n}\n\nexport async function wireChannels(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n eventHandler: LzEventHandler\n): Promise<void> {\n let internalMsgResults: SendMessageResult\n\n // ===================================generate path==================================================\n\n srcFixture.path = await allStorages.getNewLzPath({\n srcEid: srcFixture.eid,\n srcOApp: addressToBigInt(srcFixture.oApp.address),\n dstEid: dstFixture.eid,\n dstOApp: addressToBigInt(dstFixture.oApp.address),\n })\n\n dstFixture.path = await allStorages.getNewLzPath({\n srcEid: dstFixture.eid,\n srcOApp: addressToBigInt(dstFixture.oApp.address),\n dstEid: srcFixture.eid,\n dstOApp: addressToBigInt(srcFixture.oApp.address),\n })\n\n // ===================================open and deploy channel=====================================\n ;[srcFixture.channel, internalMsgResults] = await openAndDeployChannel(\n blockchain,\n srcFixture.owner,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.oApp)\n}\n\nexport async function deployConfigAndRegisterSml(\n blockchain: Blockchain,\n multiSigners: SandboxContract<TreasuryContract>[],\n allStorages: SandboxContract<TonContractWrapper>,\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n version: bigint,\n nativeFee: bigint,\n zroFee: bigint,\n eventHandler: LzEventHandler\n): Promise<[SandboxContract<TonContractWrapper>, SandboxContract<TonContractWrapper>]> {\n // ===================================open and deploy sml manager =====================================\n const [msglibManager, internalMsgResults_1] = await openAndDeploySmlManager(\n blockchain,\n allStorages,\n srcFixture,\n version\n )\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults_1, msglibManager)\n\n // ===================================open and deploy sml connection =====================================\n const [msglibConnection, internalMsgResults_2] = await openAndDeploySmlConnection(\n blockchain,\n allStorages,\n srcFixture,\n dstFixture,\n msglibManager\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults_2, srcFixture.oApp)\n\n // ===================================configure sml =====================================\n\n const set_sml_config_md = await msglibManager.getNewMdSetSmlManagerConfig({\n nativeFee,\n zroFee,\n })\n\n const set_sml_config_extended_md = await msglibManager.getNewMdExtendedMd({\n md: set_sml_config_md,\n obj: emptyObject,\n forwardingAddress: BigInt(0),\n })\n\n let internalMsgResults: SendMessageResult = await msglibManager.sendInternalMessage(\n srcFixture.owner.getSender(),\n OPCODES.SmlManager_OP_SET_MSGLIB_CONFIG,\n set_sml_config_extended_md,\n { value: protocolSetupGas['Msglib.SET_MSGLIB_CONFIG'] }\n )\n\n // emits 1 event\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, msglibManager)\n\n internalMsgResults = await addMsgLibToController(blockchain, multiSigners, srcFixture, dstFixture, msglibManager)\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n return [msglibManager, msglibConnection]\n}\n\nexport async function wireFixtureWithSML(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n customNativeFee: bigint = toNano('0'),\n customZroFee: bigint = toNano('0.000000050'),\n defaultNativeFee: bigint = toNano('0.000000100'),\n defaultZroFee: bigint = toNano('0'),\n eventHandler: LzEventHandler\n): Promise<void> {\n // ===================================wire channels=====================================\n\n await wireChannels(blockchain, allStorages, srcFixture, dstFixture, eventHandler)\n\n // ===================================deploy and configure sml custom=====================================\n ;[srcFixture.msglibManagerCustom, srcFixture.msglibConnectionCustom] = await deployConfigAndRegisterSml(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n SML_MANAGER_CUSTOM_VERSION,\n customNativeFee,\n customZroFee,\n eventHandler\n )\n\n // ===================================deploy and configure sml default=====================================\n ;[srcFixture.msglibManagerDefault, srcFixture.msglibConnectionDefault] = await deployConfigAndRegisterSml(\n blockchain,\n multiSigners,\n allStorages,\n srcFixture,\n dstFixture,\n SML_MANAGER_DEFAULT_VERSION,\n defaultNativeFee,\n defaultZroFee,\n eventHandler\n )\n\n // ===================================set default endpoint config=====================================\n\n const internalMsgResults = await setDefaultEndpointConfig(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture.msglibManagerDefault,\n srcFixture.msglibManagerDefault,\n srcFixture,\n dstFixture\n )\n\n await eventHandler.addCurrentEventsToAllEvents(internalMsgResults, srcFixture.controller)\n\n expect(eventHandler.allFailures.txList).toHaveLength(0)\n}\n\nexport async function wireFixturesTogetherWithSML(\n blockchain: Blockchain,\n allStorages: SandboxContract<TonContractWrapper>,\n multiSigners: SandboxContract<TreasuryContract>[],\n srcFixture: OAppFixture,\n dstFixture: OAppFixture,\n customNativeFee: bigint = toNano('0'),\n customZroFee: bigint = toNano('0.000000050'),\n defaultNativeFee: bigint = toNano('0.000000100'),\n defaultZroFee: bigint = toNano('0'),\n eventHandler: LzEventHandler\n): Promise<void> {\n await wireFixtureWithSML(\n blockchain,\n allStorages,\n multiSigners,\n srcFixture,\n dstFixture,\n customNativeFee,\n customZroFee,\n defaultNativeFee,\n defaultZroFee,\n eventHandler\n )\n await wireFixtureWithSML(\n blockchain,\n allStorages,\n multiSigners,\n dstFixture,\n srcFixture,\n customNativeFee,\n customZroFee,\n defaultNativeFee,\n defaultZroFee,\n eventHandler\n )\n}\n`\n fs.writeFileSync(path.join(directory, filename), savedCode)\n}\n","export abstract class MultiSigOpCodes {\n static readonly multisig = {\n new_order: 0xf718510f,\n execute: 0x75097f5d,\n execute_internal: 0xa32c59bf,\n }\n static readonly order = {\n approve: 0xa762230f,\n expired: 0x6,\n approve_rejected: 0xafaf283e,\n approved: 0x82609bf6,\n init: 0x9c73fba2,\n }\n static readonly actions = {\n send_message: 0xf1381e5b,\n update_multisig_params: 0x1d0cfbd3,\n }\n}\n\nexport abstract class MultiSigErrors {\n static readonly multisig = {\n unauthorized_new_order: 1007,\n invalid_new_order: 1008,\n not_enough_ton: 100,\n unauthorized_execute: 101,\n singers_outdated: 102,\n invalid_dictionary_sequence: 103,\n expired: 111,\n }\n static readonly order = {\n unauthorized_init: 104,\n already_approved: 107,\n already_inited: 105,\n unauthorized_sign: 106,\n expired: 111,\n unknown_op: 0xffff,\n already_executed: 112,\n }\n}\n\nexport abstract class MultiSigParams {\n static readonly bitsize = {\n op: 32,\n queryId: 64,\n orderSeqno: 256,\n signerIndex: 8,\n actionIndex: 8,\n time: 48,\n }\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n Dictionary,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nimport { MultiSigOpCodes, MultiSigParams } from './Multisig-Constants'\n\nexport interface Module {\n address: Address\n module: Cell\n}\n\nexport interface MultisigConfig {\n threshold: number\n signers: Address[]\n proposers: Address[]\n allowArbitrarySeqno: boolean\n}\n\nexport interface MultisigData {\n nextOrderSeqno: bigint\n threshold: bigint\n signers: Address[]\n proposers: Address[]\n}\n\nexport interface TransferRequest {\n type: 'transfer'\n sendMode: SendMode\n message: Cell\n}\nexport interface UpdateRequest {\n type: 'update'\n threshold: number\n signers: Address[]\n proposers: Address[]\n}\n\nexport type Action = TransferRequest | UpdateRequest\n// this should not be exported, it will cause a collision with the Order class\ntype Order = Action[]\n\nfunction arrayToCell(arr: Address[]): Dictionary<number, Address> {\n const dict = Dictionary.empty(Dictionary.Keys.Uint(8), Dictionary.Values.Address())\n for (let i = 0; i < arr.length; i++) {\n dict.set(i, arr[i])\n }\n return dict\n}\n\nfunction cellToArray(addrDict: Cell | null): Address[] {\n let resArr: Address[] = []\n if (addrDict !== null) {\n const dict = Dictionary.loadDirect(Dictionary.Keys.Uint(8), Dictionary.Values.Address(), addrDict)\n resArr = dict.values()\n }\n return resArr\n}\n\nexport function multisigConfigToCell(config: MultisigConfig): Cell {\n return beginCell()\n .storeUint(0, MultiSigParams.bitsize.orderSeqno)\n .storeUint(config.threshold, MultiSigParams.bitsize.signerIndex)\n .storeRef(beginCell().storeDictDirect(arrayToCell(config.signers)))\n .storeUint(config.signers.length, MultiSigParams.bitsize.signerIndex)\n .storeDict(arrayToCell(config.proposers))\n .storeBit(config.allowArbitrarySeqno)\n .endCell()\n}\n\nexport class Multisig implements Contract {\n public orderSeqno: number\n\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell },\n readonly configuration?: MultisigConfig\n ) {\n this.orderSeqno = 0\n }\n\n static createFromAddress(address: Address): Multisig {\n const multisig = new Multisig(address)\n multisig.orderSeqno = 0\n return multisig\n }\n\n static createFromConfig(config: MultisigConfig, code: Cell, workchain = 0): Multisig {\n const data = multisigConfigToCell(config)\n const init = { code, data }\n return new Multisig(contractAddress(workchain, init), init, config)\n }\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell()\n .storeUint(0, MultiSigParams.bitsize.op)\n .storeUint(0, MultiSigParams.bitsize.queryId)\n .endCell(),\n })\n }\n\n static packTransferRequest(transfer: TransferRequest): Cell {\n return beginCell()\n .storeUint(MultiSigOpCodes.actions.send_message, MultiSigParams.bitsize.op)\n .storeUint(transfer.sendMode, 8)\n .storeRef(transfer.message)\n .endCell()\n }\n\n static packUpdateRequest(update: UpdateRequest): Cell {\n return beginCell()\n .storeUint(MultiSigOpCodes.actions.update_multisig_params, MultiSigParams.bitsize.op)\n .storeUint(update.threshold, MultiSigParams.bitsize.signerIndex)\n .storeRef(beginCell().storeDictDirect(arrayToCell(update.signers)))\n .storeDict(arrayToCell(update.proposers))\n .endCell()\n }\n\n static packOrder(actions: Action[]): Cell {\n const order_dict = Dictionary.empty(Dictionary.Keys.Uint(8), Dictionary.Values.Cell())\n if (actions.length > 255) {\n throw new Error('For action chains above 255, use packLarge method')\n } else {\n // pack transfers to the order_body cell\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n const actionCell =\n action.type === 'transfer'\n ? Multisig.packTransferRequest(action)\n : Multisig.packUpdateRequest(action)\n order_dict.set(i, actionCell)\n }\n return beginCell().storeDictDirect(order_dict).endCell()\n }\n }\n\n static newOrderMessage(\n actions: Order | Cell,\n expirationDate: number,\n isSigner: boolean,\n addrIdx: number,\n order_id = 115792089237316195423570985008687907853269984665640564039457584007913129639935n,\n query_id: number | bigint = 0\n ): Cell {\n const msgBody = beginCell()\n .storeUint(MultiSigOpCodes.multisig.new_order, MultiSigParams.bitsize.op)\n .storeUint(query_id, MultiSigParams.bitsize.queryId)\n .storeUint(order_id, MultiSigParams.bitsize.orderSeqno)\n .storeBit(isSigner)\n .storeUint(addrIdx, MultiSigParams.bitsize.signerIndex)\n .storeUint(expirationDate, MultiSigParams.bitsize.time)\n\n if (actions instanceof Cell) {\n return msgBody.storeRef(actions).endCell()\n }\n\n if (actions.length == 0) {\n throw new Error(\"Order list can't be empty!\")\n }\n const order_cell = Multisig.packOrder(actions)\n return msgBody.storeRef(order_cell).endCell()\n }\n\n async sendNewOrder(\n provider: ContractProvider,\n via: Sender,\n actions: Order | Cell,\n expirationDate: number,\n value: bigint = toNano('1'),\n addrIdx?: number,\n isSigner?: boolean,\n seqno?: bigint\n ): Promise<void> {\n if (seqno == undefined) {\n seqno = 115792089237316195423570985008687907853269984665640564039457584007913129639935n\n }\n if (this.configuration === undefined) {\n throw new Error('Configuration is not set: use createFromConfig or loadConfiguration')\n }\n // check that via.address is in signers\n // We can only check in advance when address is known. Otherwise we have to trust isSigner flag\n if (via.address !== undefined) {\n const addrCmp = (x: Address): boolean => x.equals(via.address!)\n addrIdx = this.configuration.signers.findIndex(addrCmp)\n if (addrIdx >= 0) {\n isSigner = true\n } else {\n addrIdx = this.configuration.proposers.findIndex(addrCmp)\n if (addrIdx < 0) {\n throw new Error('Sender is not a signer or proposer')\n }\n isSigner = false\n }\n } else if (isSigner === undefined || addrIdx == undefined) {\n throw new Error('If sender address is not known, addrIdx and isSigner parameres required')\n }\n\n let newActions: Cell | Order\n\n if (actions instanceof Cell) {\n newActions = actions\n } else {\n newActions = Multisig.packOrder(actions)\n }\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n value,\n body: Multisig.newOrderMessage(newActions, expirationDate, isSigner, addrIdx, seqno),\n })\n //console.log(await provider.get(\"get_order_address\", []));\n }\n\n async getOrderAddress(provider: ContractProvider, orderSeqno: bigint): Promise<Address> {\n const { stack } = await provider.get('get_order_address', [{ type: 'int', value: orderSeqno }])\n return stack.readAddress()\n }\n\n async getOrderEstimate(provider: ContractProvider, order: Order, expiration_date: bigint): Promise<bigint> {\n const orderCell = Multisig.packOrder(order)\n const { stack } = await provider.get('get_order_estimate', [\n { type: 'cell', cell: orderCell },\n { type: 'int', value: expiration_date },\n ])\n return stack.readBigNumber()\n }\n\n async getMultisigData(provider: ContractProvider): Promise<MultisigData> {\n const { stack } = await provider.get('get_multisig_data', [])\n const nextOrderSeqno = stack.readBigNumber()\n const threshold = stack.readBigNumber()\n const signers = cellToArray(stack.readCellOpt())\n const proposers = cellToArray(stack.readCellOpt())\n return { nextOrderSeqno, threshold, signers, proposers }\n }\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n Dictionary,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nimport { MultiSigOpCodes, MultiSigParams } from './Multisig-Constants'\n\nexport interface OrderInitConfig {\n multisig: Address\n orderSeqno: number\n}\n\nexport interface OrderFullConfig {\n inited: boolean\n multisig: Address\n order_seqno: bigint\n threshold: number | null\n executed: boolean | null\n signers: Address[]\n approvals: boolean[]\n approvals_num: number | null\n _approvals: bigint | null\n expiration_date: bigint | null\n order: Cell | null\n}\n\nfunction arrayToCell(arr: Address[]): Dictionary<number, Address> {\n const dict = Dictionary.empty(Dictionary.Keys.Uint(8), Dictionary.Values.Address())\n for (let i = 0; i < arr.length; i++) {\n dict.set(i, arr[i])\n }\n return dict\n}\n\nfunction cellToArray(addrDict: Cell | null): Address[] {\n let resArr: Address[] = []\n if (addrDict !== null) {\n const dict = Dictionary.loadDirect(Dictionary.Keys.Uint(8), Dictionary.Values.Address(), addrDict)\n resArr = dict.values()\n }\n return resArr\n}\n\nexport function orderConfigToCell(config: OrderInitConfig): Cell {\n return beginCell()\n .storeAddress(config.multisig)\n .storeUint(config.orderSeqno, MultiSigParams.bitsize.orderSeqno)\n .endCell()\n}\n\nexport class Order implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell },\n readonly configuration?: OrderInitConfig\n ) {}\n\n static createFromAddress(address: Address): Order {\n return new Order(address)\n }\n\n static createFromConfig(config: OrderInitConfig, code: Cell, workchain = 0): Order {\n const data = orderConfigToCell(config)\n const init = { code, data }\n\n return new Order(contractAddress(workchain, init), init, config)\n }\n\n static initMessage(\n signers: Address[],\n expiration_date: number,\n order: Cell,\n threshold = 1,\n approve_on_init = false,\n signer_idx = 0,\n query_id: number | bigint = 0\n ): Cell {\n const msgBody = beginCell()\n .storeUint(MultiSigOpCodes.order.init, MultiSigParams.bitsize.op)\n .storeUint(query_id, MultiSigParams.bitsize.queryId)\n .storeUint(threshold, MultiSigParams.bitsize.signerIndex)\n .storeRef(beginCell().storeDictDirect(arrayToCell(signers)))\n .storeUint(expiration_date, MultiSigParams.bitsize.time)\n .storeRef(order)\n .storeBit(approve_on_init)\n\n if (approve_on_init) {\n msgBody.storeUint(signer_idx, MultiSigParams.bitsize.signerIndex)\n }\n\n return msgBody.endCell()\n }\n\n async sendDeploy(\n provider: ContractProvider,\n via: Sender,\n value: bigint,\n signers: Address[],\n expiration_date: number,\n order: Cell,\n threshold = 1,\n approve_on_init = false,\n signer_idx = 0,\n query_id: number | bigint = 0\n ): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: Order.initMessage(signers, expiration_date, order, threshold, approve_on_init, signer_idx, query_id),\n })\n }\n\n async sendApprove(\n provider: ContractProvider,\n via: Sender,\n signer_idx: number,\n value: bigint = toNano('1'),\n query_id: number | bigint = 0\n ): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell()\n .storeUint(MultiSigOpCodes.order.approve, MultiSigParams.bitsize.op)\n .storeUint(query_id, MultiSigParams.bitsize.queryId)\n .storeUint(signer_idx, MultiSigParams.bitsize.signerIndex)\n .endCell(),\n })\n }\n\n async getOrderData(provider: ContractProvider): Promise<OrderFullConfig> {\n /*\n (slice multisig, int order_seqno, int threshold,\n int sent_for_execution?, cell signers,\n int approvals, int approvals_num, int expiration_date,\n cell order)\n */\n const { stack } = await provider.get('get_order_data', [])\n const multisig = stack.readAddress()\n const order_seqno = stack.readBigNumber()\n const threshold = stack.readNumberOpt()\n const executed = stack.readBooleanOpt()\n const signers = cellToArray(stack.readCellOpt())\n const approvals = stack.readBigNumberOpt()\n const approvals_num = stack.readNumberOpt()\n const expiration_date = stack.readBigNumberOpt()\n const order = stack.readCellOpt()\n let approvalsArray: boolean[]\n if (approvals !== null) {\n approvalsArray = new Array<boolean>(256) // Explicitly type the array as boolean[]\n for (let i = 0; i < 256; i++) {\n approvalsArray[i] = Boolean((1n << BigInt(i)) & approvals)\n }\n } else {\n approvalsArray = []\n }\n\n return {\n inited: threshold !== null,\n multisig,\n order_seqno,\n threshold,\n executed,\n signers,\n approvals: approvalsArray,\n approvals_num: approvals_num,\n _approvals: approvals,\n expiration_date,\n order,\n }\n }\n}\n","import { Address, Cell, Dictionary, Message, Transaction, TransactionComputeVm } from '@ton/core'\nimport { Blockchain, BlockchainTransaction } from '@ton/sandbox'\nimport { extractEvents } from '@ton/sandbox/dist/event/Event'\nimport { FlatTransactionComparable, compareTransaction, flattenTransaction, randomAddress } from '@ton/test-utils'\n\nexport const differentAddress = (oldAddr: Address): Address => {\n let newAddr: Address\n\n do {\n newAddr = randomAddress(oldAddr.workChain)\n } while (newAddr.equals(oldAddr))\n\n return newAddr\n}\n\nexport const getRandom = (min: number, max: number): number => {\n return Math.random() * (max - min) + min\n}\n\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.round(getRandom(min, max))\n}\n\nexport const findTransaction = <T extends Transaction>(txs: T[], match: FlatTransactionComparable): T | undefined => {\n return txs.find((x) => compareTransaction(flattenTransaction(x), match))\n}\n\nexport const getMsgPrices = (\n configRaw: Cell,\n workchain: 0 | -1\n): {\n lumpPrice: bigint\n bitPrice: bigint\n cellPrice: bigint\n ihrPriceFactor: bigint\n firstFrac: bigint\n nextFrac: bigint\n} => {\n const config = configRaw.beginParse().loadDictDirect(Dictionary.Keys.Int(32), Dictionary.Values.Cell())\n\n const prices = config.get(25 + workchain)\n\n if (prices === undefined) {\n throw Error('No prices defined in config')\n }\n\n const sc = prices.beginParse()\n const magic = sc.loadUint(8)\n\n if (magic != 0xea) {\n throw Error('Invalid message prices magic number!')\n }\n return {\n lumpPrice: sc.loadUintBig(64),\n bitPrice: sc.loadUintBig(64),\n cellPrice: sc.loadUintBig(64),\n ihrPriceFactor: sc.loadUintBig(32),\n firstFrac: sc.loadUintBig(16),\n nextFrac: sc.loadUintBig(16),\n }\n}\n\nexport const storageCollected = (trans: Transaction): bigint => {\n if (trans.description.type !== 'generic') throw new Error('Expected generic transaction')\n return trans.description.storagePhase ? trans.description.storagePhase.storageFeesCollected : 0n\n}\nexport const computedGeneric = (trans: Transaction): TransactionComputeVm => {\n if (trans.description.type !== 'generic') throw new Error('Expected generic transaction')\n if (trans.description.computePhase.type !== 'vm') throw new Error('Compute phase expected')\n return trans.description.computePhase\n}\n\ninterface MsgQueued {\n msg: Message\n parent?: BlockchainTransaction\n}\n\nexport class Txiterator implements AsyncIterator<BlockchainTransaction> {\n private msqQueue: MsgQueued[]\n private blockchain: Blockchain\n\n constructor(bc: Blockchain, msg: Message) {\n this.msqQueue = [{ msg }]\n this.blockchain = bc\n }\n\n public async next(): Promise<IteratorResult<BlockchainTransaction>> {\n if (this.msqQueue.length == 0) {\n return { done: true, value: undefined }\n }\n const curMsg: MsgQueued | undefined = this.msqQueue.shift()\n if (curMsg === undefined) {\n throw new Error('MsgQueued is undefined')\n }\n const inMsg = curMsg.msg\n if (inMsg.info.type !== 'internal') throw new Error('Internal only')\n const smc = await this.blockchain.getContract(inMsg.info.dest)\n const res = await smc.receiveMessage(inMsg, { now: this.blockchain.now })\n const bcRes = {\n ...res,\n events: extractEvents(res),\n parent: curMsg.parent,\n children: [],\n externals: [],\n }\n for (let i = 0; i < res.outMessagesCount; i++) {\n const outMsg: Message | undefined = res.outMessages.get(i)\n if (outMsg === undefined) {\n throw new Error('Message is undefined')\n }\n // Only add internal for now\n if (outMsg.info.type === 'internal') {\n this.msqQueue.push({ msg: outMsg, parent: bcRes })\n }\n }\n return { done: false, value: bcRes }\n }\n}\n\nexport const executeTill = async (\n txs: AsyncIterable<BlockchainTransaction> | AsyncIterator<BlockchainTransaction>,\n match: FlatTransactionComparable\n): Promise<BlockchainTransaction[]> => {\n const executed: BlockchainTransaction[] = []\n const txIterable = txs as AsyncIterable<BlockchainTransaction>\n const txIterator = txs as AsyncIterator<BlockchainTransaction>\n if (Symbol.asyncIterator in txIterable) {\n for await (const tx of txIterable) {\n executed.push(tx)\n if (compareTransaction(flattenTransaction(tx), match)) {\n return executed\n }\n }\n } else {\n let iterResult = await txIterator.next()\n while (!(iterResult.done ?? false)) {\n const tx = iterResult.value\n executed.push(tx)\n if (compareTransaction(flattenTransaction(tx), match)) {\n return executed\n }\n iterResult = await txIterator.next()\n }\n }\n // Will fail with common error message format\n // commented this out because we're not going to use jest in our sdk-tools package\n // expect(executed).toHaveTransaction(match)\n return executed\n}\n\nexport const executeFrom = async (txs: AsyncIterator<BlockchainTransaction>): Promise<BlockchainTransaction[]> => {\n const executed: BlockchainTransaction[] = []\n let iterResult = await txs.next()\n while (!(iterResult.done ?? false)) {\n executed.push(iterResult.value)\n iterResult = await txs.next()\n }\n return executed\n}\n","import { Sha256 } from '@aws-crypto/sha256-js'\nimport { Cell, Dictionary, beginCell } from '@ton/core'\n\nconst ONCHAIN_CONTENT_PREFIX = 0x00\nconst SNAKE_PREFIX = 0x00\nconst CELL_MAX_SIZE_BYTES = Math.floor((1023 - 8) / 8)\n\nconst sha256 = (str: string): Buffer => {\n const sha = new Sha256()\n sha.update(str)\n return Buffer.from(sha.digestSync())\n}\n\nconst toKey = (key: string): bigint => {\n return BigInt(`0x${sha256(key).toString('hex')}`)\n}\n\nexport function buildOnchainMetadata(data: { name: string; symbol: string }): Cell {\n const dict = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell())\n\n // Store the on-chain metadata in the dictionary\n Object.entries(data).forEach(([key, value]) => {\n dict.set(toKey(key), makeSnakeCell(Buffer.from(value, 'utf8')))\n })\n\n return beginCell().storeInt(ONCHAIN_CONTENT_PREFIX, 8).storeDict(dict).endCell()\n}\n\nexport function makeSnakeCell(data: Buffer): Cell {\n // Create a cell that package the data\n const chunks = bufferToChunks(data, CELL_MAX_SIZE_BYTES)\n\n const b = chunks.reduceRight((curCell, chunk, index) => {\n if (index === 0) {\n curCell.storeInt(SNAKE_PREFIX, 8)\n }\n curCell.storeBuffer(chunk)\n if (index > 0) {\n const cell = curCell.endCell()\n return beginCell().storeRef(cell)\n } else {\n return curCell\n }\n }, beginCell())\n return b.endCell()\n}\n\nfunction bufferToChunks(buff: Buffer, chunkSize: number): Buffer[] {\n const chunks: Buffer[] = []\n while (buff.byteLength > 0) {\n chunks.push(buff.slice(0, chunkSize))\n buff = buff.slice(chunkSize)\n }\n return chunks\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nexport abstract class Op {\n static transfer = 0xf8a7ea5\n static transfer_notification = 0x7362d09c\n static internal_transfer = 0x178d4519\n static excesses = 0xd53276db\n static burn = 0x595f07bc\n static burn_notification = 0x7bdd97de\n\n static provide_wallet_address = 0x2c76b973\n static take_wallet_address = 0xd1735400\n static mint = 0x642b7d07\n static change_admin = 3\n static change_content = 4\n}\n\nexport abstract class Errors {\n static invalid_op = 709\n static not_admin = 73\n static unouthorized_burn = 74\n static discovery_fee_not_matched = 75\n static wrong_op = 0xffff\n static not_owner = 705\n static not_enough_ton = 709\n static not_enough_gas = 707\n static not_valid_wallet = 707\n static wrong_workchain = 333\n static balance_error = 706\n}\n\nexport interface JettonMinterContent {\n type: 0 | 1\n uri: string\n}\n\nexport interface JettonMinterConfig {\n admin: Address\n content: Cell\n wallet_code: Cell\n}\n\nexport function jettonMinterConfigToCell(config: JettonMinterConfig): Cell {\n return beginCell()\n .storeCoins(0)\n .storeAddress(config.admin)\n .storeRef(config.content)\n .storeRef(config.wallet_code)\n .endCell()\n}\n\nexport function jettonContentToCell(content: JettonMinterContent): Cell {\n return beginCell()\n .storeUint(content.type, 8)\n .storeStringTail(content.uri) //Snake logic under the hood\n .endCell()\n}\n\nexport class JettonMinter implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n static createFromAddress(address: Address): JettonMinter {\n return new JettonMinter(address)\n }\n\n static createFromConfig(config: JettonMinterConfig, code: Cell, workchain = 0): JettonMinter {\n const data = jettonMinterConfigToCell(config)\n const init = { code, data }\n return new JettonMinter(contractAddress(workchain, init), init)\n }\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n protected static jettonInternalTransfer(\n jetton_amount: bigint,\n forward_ton_amount: bigint,\n response_addr?: Address,\n query_id: number | bigint = 0\n ): Cell {\n return beginCell()\n .storeUint(Op.internal_transfer, 32)\n .storeUint(query_id, 64)\n .storeCoins(jetton_amount)\n .storeAddress(null)\n .storeAddress(response_addr)\n .storeCoins(forward_ton_amount)\n .storeBit(false)\n .endCell()\n }\n static mintMessage(\n from: Address,\n to: Address,\n jetton_amount: bigint,\n forward_ton_amount: bigint,\n total_ton_amount: bigint,\n query_id: number | bigint = 0\n ): Cell {\n const mintMsg = beginCell()\n .storeUint(Op.internal_transfer, 32) // opcode\n .storeUint(0, 64) // query id\n .storeCoins(jetton_amount)\n .storeAddress(null)\n .storeAddress(from) // Response addr\n .storeCoins(forward_ton_amount)\n .storeMaybeRef(null)\n .endCell()\n\n return beginCell()\n .storeUint(Op.mint, 32)\n .storeUint(query_id, 64) // op, queryId\n .storeAddress(to)\n .storeCoins(total_ton_amount)\n .storeCoins(jetton_amount)\n .storeRef(mintMsg)\n .endCell()\n }\n async sendMint(\n provider: ContractProvider,\n via: Sender,\n to: Address,\n jetton_amount: bigint,\n forward_ton_amount: bigint,\n total_ton_amount: bigint\n ): Promise<void> {\n if (total_ton_amount <= forward_ton_amount) {\n throw new Error('Total ton amount should be > forward amount')\n }\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.mintMessage(this.address, to, jetton_amount, forward_ton_amount, total_ton_amount),\n value: total_ton_amount + toNano('0.015'),\n })\n }\n\n /* provide_wallet_address#2c76b973 query_id:uint64 owner_address:MsgAddress include_address:Bool = InternalMsgBody;\n */\n static discoveryMessage(owner: Address, include_address: boolean): Cell {\n return beginCell()\n .storeUint(0x2c76b973, 32)\n .storeUint(0, 64) // op, queryId\n .storeAddress(owner)\n .storeBit(include_address)\n .endCell()\n }\n\n async sendDiscovery(\n provider: ContractProvider,\n via: Sender,\n owner: Address,\n include_address: boolean,\n value: bigint = toNano('0.1')\n ): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.discoveryMessage(owner, include_address),\n value: value,\n })\n }\n\n static changeAdminMessage(newOwner: Address): Cell {\n return beginCell()\n .storeUint(Op.change_admin, 32)\n .storeUint(0, 64) // op, queryId\n .storeAddress(newOwner)\n .endCell()\n }\n\n async sendChangeAdmin(provider: ContractProvider, via: Sender, newOwner: Address): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.changeAdminMessage(newOwner),\n value: toNano('0.05'),\n })\n }\n static changeContentMessage(content: Cell): Cell {\n return beginCell()\n .storeUint(Op.change_content, 32)\n .storeUint(0, 64) // op, queryId\n .storeRef(content)\n .endCell()\n }\n\n async sendChangeContent(provider: ContractProvider, via: Sender, content: Cell): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonMinter.changeContentMessage(content),\n value: toNano('0.05'),\n })\n }\n async getWalletAddress(provider: ContractProvider, owner: Address): Promise<Address> {\n const res = await provider.get('get_wallet_address', [\n { type: 'slice', cell: beginCell().storeAddress(owner).endCell() },\n ])\n return res.stack.readAddress()\n }\n\n async getJettonData(\n provider: ContractProvider\n ): Promise<{ totalSupply: bigint; mintable: boolean; adminAddress: Address; content: Cell; walletCode: Cell }> {\n const res = await provider.get('get_jetton_data', [])\n const totalSupply = res.stack.readBigNumber()\n const mintable = res.stack.readBoolean()\n const adminAddress = res.stack.readAddress()\n const content = res.stack.readCell()\n const walletCode = res.stack.readCell()\n return {\n totalSupply,\n mintable,\n adminAddress,\n content,\n walletCode,\n }\n }\n\n async getTotalSupply(provider: ContractProvider): Promise<bigint> {\n const res = await this.getJettonData(provider)\n return res.totalSupply\n }\n async getAdminAddress(provider: ContractProvider): Promise<Address> {\n const res = await this.getJettonData(provider)\n return res.adminAddress\n }\n async getContent(provider: ContractProvider): Promise<Cell> {\n const res = await this.getJettonData(provider)\n return res.content\n }\n}\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n beginCell,\n contractAddress,\n toNano,\n} from '@ton/core'\n\nexport interface JettonWalletConfig {\n owner_address: Address\n jetton_master_address: Address\n jetton_wallet_code: Cell\n}\n\nexport function jettonWalletConfigToCell(config: JettonWalletConfig): Cell {\n return beginCell()\n .storeCoins(0)\n .storeAddress(config.owner_address)\n .storeAddress(config.jetton_master_address)\n .storeRef(config.jetton_wallet_code)\n .endCell()\n}\n\nexport class JettonWallet implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n static createFromAddress(address: Address): JettonWallet {\n return new JettonWallet(address)\n }\n\n static createFromConfig(config: JettonWalletConfig, code: Cell, workchain = 0): JettonWallet {\n const data = jettonWalletConfigToCell(config)\n const init = { code, data }\n return new JettonWallet(contractAddress(workchain, init), init)\n }\n\n async sendDeploy(provider: ContractProvider, via: Sender, value: bigint): Promise<void> {\n await provider.internal(via, {\n value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell().endCell(),\n })\n }\n\n async getJettonBalance(provider: ContractProvider): Promise<bigint> {\n const state = await provider.getState()\n if (state.state.type !== 'active') {\n return 0n\n }\n const res = await provider.get('get_wallet_data', [])\n return res.stack.readBigNumber()\n }\n static transferMessage(\n jetton_amount: bigint,\n to: Address,\n responseAddress: Address,\n customPayload: Cell | null,\n forward_ton_amount: bigint,\n forwardPayload: Cell | null\n ): Cell {\n return beginCell()\n .storeUint(0xf8a7ea5, 32)\n .storeUint(0, 64) // op, queryId\n .storeCoins(jetton_amount)\n .storeAddress(to)\n .storeAddress(responseAddress)\n .storeMaybeRef(customPayload)\n .storeCoins(forward_ton_amount)\n .storeMaybeRef(forwardPayload)\n .endCell()\n }\n async sendTransfer(\n provider: ContractProvider,\n via: Sender,\n value: bigint,\n jetton_amount: bigint,\n to: Address,\n responseAddress: Address,\n customPayload: Cell,\n forward_ton_amount: bigint,\n forwardPayload: Cell\n ): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.transferMessage(\n jetton_amount,\n to,\n responseAddress,\n customPayload,\n forward_ton_amount,\n forwardPayload\n ),\n value: value,\n })\n }\n /*\n burn#595f07bc query_id:uint64 amount:(VarUInteger 16)\n response_destination:MsgAddress custom_payload:(Maybe ^Cell)\n = InternalMsgBody;\n */\n static burnMessage(jetton_amount: bigint, responseAddress: Address, customPayload: Cell | null): Cell {\n return beginCell()\n .storeUint(0x595f07bc, 32)\n .storeUint(0, 64) // op, queryId\n .storeCoins(jetton_amount)\n .storeAddress(responseAddress)\n .storeMaybeRef(customPayload)\n .endCell()\n }\n\n async sendBurn(\n provider: ContractProvider,\n via: Sender,\n value: bigint,\n jetton_amount: bigint,\n responseAddress: Address,\n customPayload: Cell\n ): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.burnMessage(jetton_amount, responseAddress, customPayload),\n value: value,\n })\n }\n /*\n withdraw_tons#107c49ef query_id:uint64 = InternalMsgBody;\n */\n static withdrawTonsMessage(): Cell {\n return beginCell()\n .storeUint(0x6d8e5e3c, 32)\n .storeUint(0, 64) // op, queryId\n .endCell()\n }\n\n async sendWithdrawTons(provider: ContractProvider, via: Sender): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.withdrawTonsMessage(),\n value: toNano('0.1'),\n })\n }\n /*\n withdraw_jettons#10 query_id:uint64 wallet:MsgAddressInt amount:Coins = InternalMsgBody;\n */\n static withdrawJettonsMessage(from: Address, amount: bigint): Cell {\n return beginCell()\n .storeUint(0x768a50b2, 32)\n .storeUint(0, 64) // op, queryId\n .storeAddress(from)\n .storeCoins(amount)\n .storeMaybeRef(null)\n .endCell()\n }\n\n async sendWithdrawJettons(provider: ContractProvider, via: Sender, from: Address, amount: bigint): Promise<void> {\n await provider.internal(via, {\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: JettonWallet.withdrawJettonsMessage(from, amount),\n value: toNano('0.1'),\n })\n }\n\n async getData(\n provider: ContractProvider\n ): Promise<{ balance: bigint; owner_address: Address; jetton_master_address: Address; wallet_code: Cell }> {\n const { stack } = await provider.get('get_wallet_data', [])\n return {\n balance: stack.readBigNumber(),\n owner_address: stack.readAddress(),\n jetton_master_address: stack.readAddress(),\n wallet_code: stack.readCell(),\n }\n }\n\n async getBalance(provider: ContractProvider): Promise<bigint> {\n const res = await this.getData(provider)\n return res.balance\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\nimport * as fs from 'fs'\nimport path from 'path'\n\nimport { Address, Transaction } from '@ton/core'\n\nconst decimalCount = 9\nconst decimal = pow10(decimalCount)\nconst defaultPath = 'gasInfo'\n\nexport interface GasInfo {\n [key: string]: string\n}\n\nexport interface Profile {\n profileGas: boolean\n fileName: string\n filePath?: string\n}\n\nfunction createDirectoryIfNotExist(directoryPath: string): void {\n if (!fs.existsSync(directoryPath)) {\n fs.mkdirSync(directoryPath, { recursive: true })\n }\n}\n\nfunction sortAndSave(filePath: string, gasInfo: GasInfo): void {\n const entries = Object.entries(gasInfo)\n const sortedEntries = entries.sort(([, valueA], [, valueB]) => parseFloat(valueA) - parseFloat(valueB))\n const jsonData = JSON.stringify(Object.fromEntries(sortedEntries), null, 2)\n fs.writeFileSync(filePath, `${jsonData}\\n`, 'utf8')\n}\n\nfunction readOrCreateJsonFile(filePath: string): GasInfo {\n if (fs.existsSync(filePath)) {\n const fileContent: string = fs.readFileSync(filePath, 'utf8')\n return JSON.parse(fileContent) as GasInfo\n } else {\n return {}\n }\n}\n\nfunction pow10(n: number): bigint {\n let v = 1n\n for (let i = 0; i < n; i++) {\n v *= 10n\n }\n return v\n}\n\nexport function formatCoinsPure(value: bigint, precision = 6): string {\n let whole = value / decimal\n\n let frac = value % decimal\n const precisionDecimal = pow10(decimalCount - precision)\n if (frac % precisionDecimal > 0n) {\n // round up\n frac += precisionDecimal\n if (frac >= decimal) {\n frac -= decimal\n whole += 1n\n }\n }\n frac /= precisionDecimal\n\n return `${whole.toString()}${frac !== 0n ? '.' + frac.toString().padStart(precision, '0').replace(/0+$/, '') : ''}`\n}\n\nfunction formatCoins(value: bigint | undefined, precision = 6): string {\n if (value === undefined) return 'N/A'\n\n return formatCoinsPure(value, precision)\n}\n/**\n * Prints transaction fees.\n * Example output:\n * ```\n * ┌─────────┬───────────────────┬──────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────┬────────────────┬──────────┬────────────┐\n * │ (index) │ address │ op │ valueIn │ valueOut │ totalFees │ inForwardFee │ outForwardFee │ outActions │ computeFee │ exitCode │ actionCode │\n * ├─────────┼───────────────────┼──────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────┼────────────────┼──────────┼────────────┤\n * │ 0 │ 'lzDeployer' │ 'N/A' │ 'N/A' │ '1 TON' │ '0.002118 TON' │ 'N/A' │ '0.000818 TON' │ 1 │ '0.000775 TON' │ 0 │ 0 │\n * │ 1 │ 'counter' │ '0x14da9f4f' │ '1 TON' │ '0.994674 TON' │ '0.004814 TON' │ '0.000546 TON' │ '0.00077 TON' │ 1 │ '0.004558 TON' │ 0 │ 0 │\n * │ 2 │ 'endpointChannel' │ '0x24f8afd1' │ '0.994674 TON' │ '0.988235 TON' │ '0.005944 TON' │ '0.000513 TON' │ '0.000744 TON' │ 1 │ '0.005696 TON' │ 0 │ 0 │\n * │ 3 │ 'payload' │ '0x1b8fba43' │ '0.988235 TON' │ '0.983208 TON' │ '0.004437 TON' │ '0.000496 TON' │ '0.000885 TON' │ 1 │ '0.004142 TON' │ 0 │ 0 │\n * │ 4 │ 'counter' │ '0x507674bc' │ '0.983208 TON' │ '1.023606 TON' │ '0.00899 TON' │ '0.00059 TON' │ '0.000919 TON' │ 2 │ '0.008684 TON' │ 0 │ 0 │\n * │ 5 │ 'payload' │ '0x648a33b0' │ '0.049522 TON' │ '1.021254 TON' │ '0.002702 TON' │ '0.00032 TON' │ '0.00044 TON' │ 1 │ '0.002556 TON' │ 0 │ 0 │\n * │ 6 │ 'lzDeployer' │ 'no body' │ '0.974085 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * │ 7 │ 'lzDeployer' │ 'no body' │ '1.021254 TON' │ '0 TON' │ '0.000124 TON' │ '0.000294 TON' │ 'N/A' │ 0 │ '0.000124 TON' │ 0 │ 0 │\n * └─────────┴───────────────────┴──────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────┴────────────────┴──────────┴────────────┘\n * ```\n */\n\nexport function printTransactionTrace(\n transactions: Transaction[],\n opcodeInfo: { [p: string]: string },\n callerStack?: string,\n profile?: Profile\n): void {\n const { stack } = new Error()\n callerStack ??= stack\n console.info(callerStack?.split('\\n')[2].trim())\n let cumulativeFees = 0n\n let gasInfo: GasInfo = {}\n let filePath = profile?.filePath ?? defaultPath\n if (profile?.profileGas) {\n createDirectoryIfNotExist(filePath)\n filePath = path.join(filePath, `${profile.fileName}.json`)\n gasInfo = readOrCreateJsonFile(filePath)\n }\n console.table(\n transactions\n .map((tx) => {\n if (tx.description.type !== 'generic') return undefined\n\n const body = tx.inMessage?.info.type === 'internal' ? tx.inMessage.body.beginParse() : undefined\n const op = body === undefined ? 0n : body.remainingBits >= 32 ? body.preloadUint(32) : 0n\n\n const totalFees = formatCoins(tx.totalFees.coins)\n\n const computeFees = formatCoins(\n tx.description.computePhase.type === 'vm' ? tx.description.computePhase.gasFees : undefined\n )\n\n const totalFwdFees = formatCoins(tx.description.actionPhase?.totalFwdFees ?? undefined)\n\n const valueIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.value.coins : undefined\n )\n\n const valueOut = formatCoins(\n tx.outMessages\n .values()\n .reduce(\n (total, message) =>\n total + (message.info.type === 'internal' ? message.info.value.coins : 0n),\n 0n\n )\n )\n\n const forwardIn = formatCoins(\n tx.inMessage?.info.type === 'internal' ? tx.inMessage.info.forwardFee : undefined\n )\n\n // remove 11 bits from front of tx.address\n const addressString =\n tx.address.toString(16).length != 64 ? 'UNKNOWN' : Address.parseRaw('1:' + tx.address.toString(16))\n const opString = op.toString() in opcodeInfo ? opcodeInfo[op.toString()] : op.toString()\n cumulativeFees += tx.totalFees.coins + (tx.description.actionPhase?.totalFwdFees ?? 0n)\n\n if (profile?.profileGas) gasInfo[opString] = formatCoins(cumulativeFees)\n\n return {\n address: addressString,\n op: opString,\n // valueIn,\n // valueOut,\n totalFees: totalFees,\n inForwardFee: forwardIn,\n outForwardFee: totalFwdFees,\n // outActions: tx.description.actionPhase?.totalActions ?? 'N/A',\n computeFee: computeFees,\n // exitCode: tx.description.computePhase.type === 'vm' ? tx.description.computePhase.exitCode : 'N/A',\n // actionCode: tx.description.actionPhase?.resultCode ?? 'N/A',\n cumulativeFee: formatCoins(cumulativeFees),\n }\n })\n .filter((v) => v !== undefined)\n )\n if (profile?.profileGas) sortAndSave(filePath, gasInfo)\n}\n"]}
|